diff --git a/JGit/pom.xml b/JGit/pom.xml new file mode 100644 index 0000000000..93c49edb92 --- /dev/null +++ b/JGit/pom.xml @@ -0,0 +1,63 @@ + + + 4.0.0 + com.baeldung + JGitSnippets + 1.0-SNAPSHOT + jar + http://maven.apache.org + + UTF-8 + 1.8 + 1.8 + + + + jgit-repository + https://repo.eclipse.org/content/groups/releases/ + + + + + + + org.eclipse.jgit + org.eclipse.jgit + 4.5.0.201609210915-r + + + org.eclipse.jgit + org.eclipse.jgit.archive + 4.5.0.201609210915-r + + + commons-io + commons-io + 2.5 + + + org.slf4j + slf4j-simple + 1.7.21 + + + junit + junit + 4.12 + test + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.2 + + 1.7 + 1.7 + + + + + \ No newline at end of file diff --git a/JGit/src/main/java/com/baeldung/jgit/CreateNewRepository.java b/JGit/src/main/java/com/baeldung/jgit/CreateNewRepository.java new file mode 100644 index 0000000000..1702efc315 --- /dev/null +++ b/JGit/src/main/java/com/baeldung/jgit/CreateNewRepository.java @@ -0,0 +1,30 @@ +package com.baeldung.jgit; + +import java.io.File; +import java.io.IOException; +import org.apache.commons.io.FileUtils; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.GitAPIException; + +/** + * Simple snippet which shows how to create a new repository + * + * + */ +public class CreateNewRepository { + + public static void main(String[] args) throws IOException, IllegalStateException, GitAPIException { + // prepare a new folder + File localPath = File.createTempFile("TestGitRepository", ""); + if(!localPath.delete()) { + throw new IOException("Could not delete temporary file " + localPath); + } + + // create the directory + try (Git git = Git.init().setDirectory(localPath).call()) { + System.out.println("Having repository: " + git.getRepository().getDirectory()); + } + + FileUtils.deleteDirectory(localPath); + } +} diff --git a/JGit/src/main/java/com/baeldung/jgit/OpenRepository.java b/JGit/src/main/java/com/baeldung/jgit/OpenRepository.java new file mode 100644 index 0000000000..671df2a844 --- /dev/null +++ b/JGit/src/main/java/com/baeldung/jgit/OpenRepository.java @@ -0,0 +1,65 @@ +package com.baeldung.jgit; + +import com.baeldung.jgit.helper.Helper; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.storage.file.FileRepositoryBuilder; +import java.io.File; +import java.io.IOException; + +/** + * Simple snippet which shows how to open an existing repository + * + * + */ +public class OpenRepository { + + public static void main(String[] args) throws IOException, GitAPIException { + // first create a test-repository, the return is including the .get directory here! + File repoDir = createSampleGitRepo(); + + // now open the resulting repository with a FileRepositoryBuilder + FileRepositoryBuilder builder = new FileRepositoryBuilder(); + try (Repository repository = builder.setGitDir(repoDir) + .readEnvironment() // scan environment GIT_* variables + .findGitDir() // scan up the file system tree + .build()) { + System.out.println("Having repository: " + repository.getDirectory()); + + // the Ref holds an ObjectId for any type of object (tree, commit, blob, tree) + Ref head = repository.exactRef("refs/heads/master"); + System.out.println("Ref of refs/heads/master: " + head); + } + } + + private static File createSampleGitRepo() throws IOException, GitAPIException { + try (Repository repository = Helper.createNewRepository()) { + System.out.println("Temporary repository at " + repository.getDirectory()); + + // create the file + File myfile = new File(repository.getDirectory().getParent(), "testfile"); + if(!myfile.createNewFile()) { + throw new IOException("Could not create file " + myfile); + } + + // run the add-call + try (Git git = new Git(repository)) { + git.add() + .addFilepattern("testfile") + .call(); + + + // and then commit the changes + git.commit() + .setMessage("Added testfile") + .call(); + } + + System.out.println("Added file " + myfile + " to repository at " + repository.getDirectory()); + + return repository.getDirectory(); + } + } +} diff --git a/JGit/src/main/java/com/baeldung/jgit/helper/Helper.java b/JGit/src/main/java/com/baeldung/jgit/helper/Helper.java new file mode 100644 index 0000000000..39d7b767d2 --- /dev/null +++ b/JGit/src/main/java/com/baeldung/jgit/helper/Helper.java @@ -0,0 +1,33 @@ + +package com.baeldung.jgit.helper; + +import java.io.File; +import java.io.IOException; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.storage.file.FileRepositoryBuilder; + +public class Helper { + + public static Repository openJGitRepository() throws IOException { + FileRepositoryBuilder builder = new FileRepositoryBuilder(); + return builder + .readEnvironment() // scan environment GIT_* variables + .findGitDir() // scan up the file system tree + .build(); + } + + public static Repository createNewRepository() throws IOException { + // prepare a new folder + File localPath = File.createTempFile("TestGitRepository", ""); + if(!localPath.delete()) { + throw new IOException("Could not delete temporary file " + localPath); + } + + // create the directory + Repository repository = FileRepositoryBuilder.create(new File(localPath, ".git")); + repository.create(); + + return repository; + } + +} diff --git a/JGit/src/main/java/com/baeldung/jgit/porcelain/AddFile.java b/JGit/src/main/java/com/baeldung/jgit/porcelain/AddFile.java new file mode 100644 index 0000000000..314366f08c --- /dev/null +++ b/JGit/src/main/java/com/baeldung/jgit/porcelain/AddFile.java @@ -0,0 +1,36 @@ +package com.baeldung.jgit.porcelain; + +import java.io.File; +import java.io.IOException; +import com.baeldung.jgit.helper.Helper; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.lib.Repository; + +/** + * Simple snippet which shows how to add a file to the index + * + * + */ +public class AddFile { + + public static void main(String[] args) throws IOException, GitAPIException { + // prepare a new test-repository + try (Repository repository = Helper.createNewRepository()) { + try (Git git = new Git(repository)) { + // create the file + File myfile = new File(repository.getDirectory().getParent(), "testfile"); + if(!myfile.createNewFile()) { + throw new IOException("Could not create file " + myfile); + } + + // run the add-call + git.add() + .addFilepattern("testfile") + .call(); + + System.out.println("Added file " + myfile + " to repository at " + repository.getDirectory()); + } + } + } +} diff --git a/JGit/src/main/java/com/baeldung/jgit/porcelain/CommitAll.java b/JGit/src/main/java/com/baeldung/jgit/porcelain/CommitAll.java new file mode 100644 index 0000000000..4c0956ebf8 --- /dev/null +++ b/JGit/src/main/java/com/baeldung/jgit/porcelain/CommitAll.java @@ -0,0 +1,51 @@ +package com.baeldung.jgit.porcelain; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import com.baeldung.jgit.helper.Helper; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.lib.Repository; + +/** + * Simple snippet which shows how to commit all files + * + * + */ +public class CommitAll { + + public static void main(String[] args) throws IOException, GitAPIException { + // prepare a new test-repository + try (Repository repository = Helper.createNewRepository()) { + try (Git git = new Git(repository)) { + // create the file + File myfile = new File(repository.getDirectory().getParent(), "testfile"); + if(!myfile.createNewFile()) { + throw new IOException("Could not create file " + myfile); + } + + // Stage all files in the repo including new files + git.add().addFilepattern(".").call(); + + // and then commit the changes. + git.commit() + .setMessage("Commit all changes including additions") + .call(); + + try(PrintWriter writer = new PrintWriter(myfile)) { + writer.append("Hello, world!"); + } + + // Stage all changed files, omitting new files, and commit with one command + git.commit() + .setAll(true) + .setMessage("Commit changes to all files") + .call(); + + + System.out.println("Committed all changes to repository at " + repository.getDirectory()); + } + } + } +} diff --git a/JGit/src/main/java/com/baeldung/jgit/porcelain/CreateAndDeleteTag.java b/JGit/src/main/java/com/baeldung/jgit/porcelain/CreateAndDeleteTag.java new file mode 100644 index 0000000000..0f735daf8c --- /dev/null +++ b/JGit/src/main/java/com/baeldung/jgit/porcelain/CreateAndDeleteTag.java @@ -0,0 +1,56 @@ +package com.baeldung.jgit.porcelain; + +import java.io.IOException; +import com.baeldung.jgit.helper.Helper; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.revwalk.RevWalk; + +/** + * Simple snippet which shows how to create a tag + * + * + */ +public class CreateAndDeleteTag { + + public static void main(String[] args) throws IOException, GitAPIException { + // prepare test-repository + try (Repository repository = Helper.openJGitRepository()) { + try (Git git = new Git(repository)) { + // remove the tag before creating it + git.tagDelete().setTags("tag_for_testing").call(); + + // set it on the current HEAD + Ref tag = git.tag().setName("tag_for_testing").call(); + System.out.println("Created/moved tag " + tag + " to repository at " + repository.getDirectory()); + + // remove the tag again + git.tagDelete().setTags("tag_for_testing").call(); + + // read some other commit and set the tag on it + ObjectId id = repository.resolve("HEAD^"); + try (RevWalk walk = new RevWalk(repository)) { + RevCommit commit = walk.parseCommit(id); + tag = git.tag().setObjectId(commit).setName("tag_for_testing").call(); + System.out.println("Created/moved tag " + tag + " to repository at " + repository.getDirectory()); + + // remove the tag again + git.tagDelete().setTags("tag_for_testing").call(); + + // create an annotated tag + tag = git.tag().setName("tag_for_testing").setAnnotated(true).call(); + System.out.println("Created/moved tag " + tag + " to repository at " + repository.getDirectory()); + + // remove the tag again + git.tagDelete().setTags("tag_for_testing").call(); + + walk.dispose(); + } + } + } + } +} diff --git a/JGit/src/main/java/com/baeldung/jgit/porcelain/Log.java b/JGit/src/main/java/com/baeldung/jgit/porcelain/Log.java new file mode 100644 index 0000000000..cb476b9d9e --- /dev/null +++ b/JGit/src/main/java/com/baeldung/jgit/porcelain/Log.java @@ -0,0 +1,74 @@ +package com.baeldung.jgit.porcelain; + +import java.io.IOException; +import com.baeldung.jgit.helper.Helper; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; + +/** + * Simple snippet which shows how to get the commit-ids for a file to provide log information. + * + * + */ +public class Log { + + @SuppressWarnings("unused") + public static void main(String[] args) throws IOException, GitAPIException { + try (Repository repository = Helper.openJGitRepository()) { + try (Git git = new Git(repository)) { + Iterable logs = git.log() + .call(); + int count = 0; + for (RevCommit rev : logs) { + //System.out.println("Commit: " + rev /* + ", name: " + rev.getName() + ", id: " + rev.getId().getName() */); + count++; + } + System.out.println("Had " + count + " commits overall on current branch"); + + logs = git.log() + .add(repository.resolve("remotes/origin/testbranch")) + .call(); + count = 0; + for (RevCommit rev : logs) { + System.out.println("Commit: " + rev /* + ", name: " + rev.getName() + ", id: " + rev.getId().getName() */); + count++; + } + System.out.println("Had " + count + " commits overall on test-branch"); + + logs = git.log() + .all() + .call(); + count = 0; + for (RevCommit rev : logs) { + //System.out.println("Commit: " + rev /* + ", name: " + rev.getName() + ", id: " + rev.getId().getName() */); + count++; + } + System.out.println("Had " + count + " commits overall in repository"); + + logs = git.log() + // for all log.all() + .addPath("README.md") + .call(); + count = 0; + for (RevCommit rev : logs) { + //System.out.println("Commit: " + rev /* + ", name: " + rev.getName() + ", id: " + rev.getId().getName() */); + count++; + } + System.out.println("Had " + count + " commits on README.md"); + + logs = git.log() + // for all log.all() + .addPath("pom.xml") + .call(); + count = 0; + for (RevCommit rev : logs) { + //System.out.println("Commit: " + rev /* + ", name: " + rev.getName() + ", id: " + rev.getId().getName() */); + count++; + } + System.out.println("Had " + count + " commits on pom.xml"); + } + } + } +} diff --git a/JGit/src/test/java/com/baeldung/jgit/JGitBugTest.java b/JGit/src/test/java/com/baeldung/jgit/JGitBugTest.java new file mode 100644 index 0000000000..acad4e395f --- /dev/null +++ b/JGit/src/test/java/com/baeldung/jgit/JGitBugTest.java @@ -0,0 +1,31 @@ +import com.baeldung.jgit.helper.Helper; +import org.eclipse.jgit.lib.ObjectLoader; +import org.eclipse.jgit.lib.ObjectReader; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevWalk; +import org.junit.Test; +import java.io.IOException; +import static org.junit.Assert.assertNotNull; + +/** + * Tests which show issues with JGit that we reported upstream. + */ +public class JGitBugTest { + @Test + public void testRevWalkDisposeClosesReader() throws IOException { + try (Repository repo = Helper.openJGitRepository()) { + try (ObjectReader reader = repo.newObjectReader()) { + try (RevWalk walk = new RevWalk(reader)) { + walk.dispose(); + + Ref head = repo.exactRef("refs/heads/master"); + System.out.println("Found head: " + head); + + ObjectLoader loader = reader.open(head.getObjectId()); + assertNotNull(loader); + } + } + } + } +} diff --git a/JGit/src/test/java/com/baeldung/jgit/porcelain/PorcelainTest.java b/JGit/src/test/java/com/baeldung/jgit/porcelain/PorcelainTest.java new file mode 100644 index 0000000000..ce3a41e657 --- /dev/null +++ b/JGit/src/test/java/com/baeldung/jgit/porcelain/PorcelainTest.java @@ -0,0 +1,17 @@ +package com.baeldung.jgit.porcelain; + +import org.junit.Test; + +public class PorcelainTest { + @Test + public void runSamples() throws Exception { + // simply call all the samples to see any severe problems with the samples + AddFile.main(null); + + CommitAll.main(null); + + CreateAndDeleteTag.main(null); + + Log.main(null); + } +} diff --git a/annotations/pom.xml b/annotations/pom.xml index f691674cf1..0ddc17f8a7 100644 --- a/annotations/pom.xml +++ b/annotations/pom.xml @@ -1,7 +1,6 @@ - + parent-modules com.baeldung diff --git a/apache-cxf/pom.xml b/apache-cxf/pom.xml index e2cd7d344a..6849452908 100644 --- a/apache-cxf/pom.xml +++ b/apache-cxf/pom.xml @@ -5,20 +5,20 @@ apache-cxf 0.0.1-SNAPSHOT pom - + cxf-introduction cxf-spring cxf-jaxrs-implementation cxf-aegis - + 4.12 3.6.0 1.5.0 - + junit @@ -27,7 +27,7 @@ test - + install diff --git a/apache-fop/pom.xml b/apache-fop/pom.xml index 4dd61d8f4e..6f89497a7d 100644 --- a/apache-fop/pom.xml +++ b/apache-fop/pom.xml @@ -1,154 +1,155 @@ - - 4.0.0 - com.baeldung - apache-fop - 0.1-SNAPSHOT + + 4.0.0 + com.baeldung + apache-fop + 0.1-SNAPSHOT - apache-fop + apache-fop - + - + - - org.slf4j - slf4j-api - ${org.slf4j.version} - - - ch.qos.logback - logback-classic - ${logback.version} - - - - org.slf4j - jcl-over-slf4j - ${org.slf4j.version} - - - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - + + org.slf4j + slf4j-api + ${org.slf4j.version} + + + ch.qos.logback + logback-classic + ${logback.version} + + + + org.slf4j + jcl-over-slf4j + ${org.slf4j.version} + + + + org.slf4j + log4j-over-slf4j + ${org.slf4j.version} + - + - - junit - junit - ${junit.version} - test - + + junit + junit + ${junit.version} + test + - - org.hamcrest - hamcrest-core - ${org.hamcrest.version} - test - - - org.hamcrest - hamcrest-library - ${org.hamcrest.version} - test - + + org.hamcrest + hamcrest-core + ${org.hamcrest.version} + test + + + org.hamcrest + hamcrest-library + ${org.hamcrest.version} + test + - - org.mockito - mockito-core - ${mockito.version} - test - + + org.mockito + mockito-core + ${mockito.version} + test + - + - - org.apache.xmlgraphics - fop - ${fop.version} - - - org.apache.avalon.framework - avalon-framework-api - - - org.apache.avalon.framework - avalon-framework-impl - - - + + org.apache.xmlgraphics + fop + ${fop.version} + + + org.apache.avalon.framework + avalon-framework-api + + + org.apache.avalon.framework + avalon-framework-impl + + + - - avalon-framework - avalon-framework-api - ${avalon-framework.version} - - - avalon-framework - avalon-framework-impl - ${avalon-framework.version} - + + avalon-framework + avalon-framework-api + ${avalon-framework.version} + + + avalon-framework + avalon-framework-impl + ${avalon-framework.version} + - - org.dbdoclet - dbdoclet - ${dbdoclet.version} - + + org.dbdoclet + dbdoclet + ${dbdoclet.version} + - - org.dbdoclet - herold - 6.1.0 - system - ${basedir}/src/test/resources/jars/herold.jar - - - - net.sf.jtidy - jtidy - ${jtidy.version} - + + org.dbdoclet + herold + 6.1.0 + system + ${basedir}/src/test/resources/jars/herold.jar + - + + net.sf.jtidy + jtidy + ${jtidy.version} + - - apache-fop - - - src/main/resources - true - - + - + + apache-fop + + + src/main/resources + true + + - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - 1.7 - 1.7 - - + - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.7 + 1.7 + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + **/*IntegrationTest.java **/*LiveTest.java - - - + + + - + - + @@ -170,7 +171,7 @@ **/*IntegrationTest.java - **/*LiveTest.java + **/*LiveTest.java @@ -185,25 +186,25 @@ - - - 1.1 - 4.3 - 8.0.2 - r938 - - 1.7.21 - 1.1.7 - - 1.3 - 4.12 - 1.10.19 + + 1.1 + 4.3 + 8.0.2 + r938 + + 1.7.21 + 1.1.7 - - 3.6.0 - 2.19.1 + + 1.3 + 4.12 + 1.10.19 - + + 3.6.0 + 2.19.1 + + \ No newline at end of file diff --git a/aspectj/README.md b/aspectj/README.md index 9793b742fa..71724e76b6 100644 --- a/aspectj/README.md +++ b/aspectj/README.md @@ -1,2 +1,3 @@ ### Relevant Articles: - [Intro to AspectJ](http://www.baeldung.com/aspectj) +- [Spring Performance Logging](http://www.baeldung.com/spring-performance-logging) diff --git a/aspectj/pom.xml b/aspectj/pom.xml index 6e7ef1b961..90b527c14f 100644 --- a/aspectj/pom.xml +++ b/aspectj/pom.xml @@ -12,32 +12,32 @@ aspectjrt ${aspectj.version} - + org.aspectj aspectjweaver ${aspectj.version} - + org.slf4j slf4j-api ${org.slf4j.version} - + ch.qos.logback logback-classic ${logback.version} - + ch.qos.logback logback-core ${logback.version} - + junit @@ -46,34 +46,34 @@ - org.springframework - spring-context - 4.3.4.RELEASE + org.springframework + spring-context + 4.3.4.RELEASE - org.springframework - spring-beans - 4.3.4.RELEASE + org.springframework + spring-beans + 4.3.4.RELEASE - org.springframework - spring-core - 4.3.4.RELEASE + org.springframework + spring-core + 4.3.4.RELEASE - cglib - cglib - 3.2.4 + cglib + cglib + 3.2.4 - org.springframework - spring-aop - 4.3.4.RELEASE + org.springframework + spring-aop + 4.3.4.RELEASE - log4j - log4j - 1.2.17 + log4j + log4j + 1.2.17 @@ -95,9 +95,9 @@ ${source.version} ${source.version} - + - + org.codehaus.mojo aspectj-maven-plugin @@ -111,41 +111,22 @@ ignore ${project.build.sourceEncoding} - - + + compile - test-compile + test-compile - - - + + diff --git a/assertj/pom.xml b/assertj/pom.xml index 0b3bcbacdb..032f33c89d 100644 --- a/assertj/pom.xml +++ b/assertj/pom.xml @@ -54,8 +54,8 @@ 3.1.0 4.12 3.6.1 - + 3.6.0 - + \ No newline at end of file diff --git a/autovalue/pom.xml b/autovalue/pom.xml index 57c4662e5c..32616dc8bc 100644 --- a/autovalue/pom.xml +++ b/autovalue/pom.xml @@ -41,5 +41,5 @@ 4.12 3.6.0 - + diff --git a/cdi/pom.xml b/cdi/pom.xml index 231390ea5c..e5aaeb2c7b 100644 --- a/cdi/pom.xml +++ b/cdi/pom.xml @@ -45,7 +45,7 @@ - + @@ -61,7 +61,7 @@ - + integration @@ -101,7 +101,7 @@ 1.8.9 2.4.1.Final 4.12 - 2.19.1 + 2.19.1 \ No newline at end of file diff --git a/core-java-9/pom.xml b/core-java-9/pom.xml index bf9325c935..decba19c53 100644 --- a/core-java-9/pom.xml +++ b/core-java-9/pom.xml @@ -1,91 +1,88 @@ - - 4.0.0 - com.baeldung - core-java9 - 0.2-SNAPSHOT + + 4.0.0 + com.baeldung + core-java9 + 0.2-SNAPSHOT - core-java9 + core-java9 - - - apache.snapshots - http://repository.apache.org/snapshots/ - - + + + apache.snapshots + http://repository.apache.org/snapshots/ + + - + - - org.slf4j - slf4j-api - ${org.slf4j.version} - + + org.slf4j + slf4j-api + ${org.slf4j.version} + + + org.hamcrest + hamcrest-library + ${org.hamcrest.version} + test + + + junit + junit + ${junit.version} + test + - - org.hamcrest - hamcrest-library - ${org.hamcrest.version} - test - + + org.mockito + mockito-core + ${mockito.version} + test + - - junit - junit - ${junit.version} - test - + - - org.mockito - mockito-core - ${mockito.version} - test - + + core-java-9 - + - - core-java-9 + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.9 + 1.9 + true + + - + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - 1.9 - 1.9 - true - - + - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - + - + + + 1.7.21 - + + 3.6-jigsaw-SNAPSHOT + 2.19.1 - - - 1.7.21 - - - 3.6-jigsaw-SNAPSHOT - 2.19.1 - - - 1.3 - 4.12 - 1.10.19 - + + 1.3 + 4.12 + 1.10.19 + diff --git a/core-java/.gitignore b/core-java/.gitignore index 464f7e5e38..251a8755bd 100644 --- a/core-java/.gitignore +++ b/core-java/.gitignore @@ -16,3 +16,7 @@ *.txt /bin/ /temp + +#IntelliJ specific +.idea +*.iml \ No newline at end of file diff --git a/core-java/README.md b/core-java/README.md index 16cac81526..b653cfcfaf 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -53,3 +53,4 @@ - [Calculate the Size of a File in Java](http://www.baeldung.com/java-file-size) - [The Basics of Java Generics](http://www.baeldung.com/java-generics) - [The Traveling Salesman Problem in Java](http://www.baeldung.com/java-simulated-annealing-for-traveling-salesman) +- [How to Create an Executable JAR with Maven](http://www.baeldung.com/executable-jar-with-maven) diff --git a/core-java/pom.xml b/core-java/pom.xml index 6979d980b7..3406bddda9 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -63,6 +63,12 @@ grep4j ${grep4j.version} + + + com.lmax + disruptor + ${disruptor.version} + @@ -352,7 +358,7 @@ 1.1.7 - 19.0 + 21.0 3.5 1.55 1.10 @@ -363,6 +369,7 @@ 0.4 1.8.7 1.16.12 + 3.3.6 1.3 diff --git a/core-java/src/main/java/com/baeldung/chainedexception/LogWithChain.java b/core-java/src/main/java/com/baeldung/chainedexception/LogWithChain.java new file mode 100644 index 0000000000..8542e8c7ac --- /dev/null +++ b/core-java/src/main/java/com/baeldung/chainedexception/LogWithChain.java @@ -0,0 +1,44 @@ +package com.baeldung.chainedexception; + +import com.baeldung.chainedexception.exceptions.GirlFriendOfManagerUpsetException; +import com.baeldung.chainedexception.exceptions.ManagerUpsetException; +import com.baeldung.chainedexception.exceptions.NoLeaveGrantedException; +import com.baeldung.chainedexception.exceptions.TeamLeadUpsetException; + +public class LogWithChain { + + public static void main(String[] args) throws Exception { + getLeave(); + } + + private static void getLeave() throws NoLeaveGrantedException { + try { + howIsTeamLead(); + } catch (TeamLeadUpsetException e) { + throw new NoLeaveGrantedException("Leave not sanctioned.", e); + } + } + + private static void howIsTeamLead() throws TeamLeadUpsetException { + try { + howIsManager(); + } catch (ManagerUpsetException e) { + throw new TeamLeadUpsetException( + "Team lead is not in good mood", e); + } + } + + private static void howIsManager() throws ManagerUpsetException { + try { + howIsGirlFriendOfManager(); + } catch (GirlFriendOfManagerUpsetException e) { + throw new ManagerUpsetException("Manager is in bad mood", e); + } + } + + private static void howIsGirlFriendOfManager() + throws GirlFriendOfManagerUpsetException { + throw new GirlFriendOfManagerUpsetException( + "Girl friend of manager is in bad mood"); + } +} diff --git a/core-java/src/main/java/com/baeldung/chainedexception/LogWithoutChain.java b/core-java/src/main/java/com/baeldung/chainedexception/LogWithoutChain.java new file mode 100644 index 0000000000..a06a324f03 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/chainedexception/LogWithoutChain.java @@ -0,0 +1,47 @@ +package com.baeldung.chainedexception; + +import com.baeldung.chainedexception.exceptions.GirlFriendOfManagerUpsetException; +import com.baeldung.chainedexception.exceptions.ManagerUpsetException; +import com.baeldung.chainedexception.exceptions.NoLeaveGrantedException; +import com.baeldung.chainedexception.exceptions.TeamLeadUpsetException; + +public class LogWithoutChain { + + public static void main(String[] args) throws Exception { + getLeave(); + } + + private static void getLeave() throws NoLeaveGrantedException { + try { + howIsTeamLead(); + } catch (TeamLeadUpsetException e) { + e.printStackTrace(); + throw new NoLeaveGrantedException("Leave not sanctioned."); + } + } + + private static void howIsTeamLead() throws TeamLeadUpsetException { + try { + howIsManager(); + } catch (ManagerUpsetException e) { + e.printStackTrace(); + throw new TeamLeadUpsetException( + "Team lead is not in good mood"); + } + } + + private static void howIsManager() throws ManagerUpsetException { + try { + howIsGirlFriendOfManager(); + } catch (GirlFriendOfManagerUpsetException e) { + e.printStackTrace(); + throw new ManagerUpsetException("Manager is in bad mood"); + } + } + + private static void howIsGirlFriendOfManager() + throws GirlFriendOfManagerUpsetException { + throw new GirlFriendOfManagerUpsetException( + "Girl friend of manager is in bad mood"); + } +} diff --git a/core-java/src/main/java/com/baeldung/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java b/core-java/src/main/java/com/baeldung/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java new file mode 100644 index 0000000000..e20c58ea5b --- /dev/null +++ b/core-java/src/main/java/com/baeldung/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java @@ -0,0 +1,12 @@ +package com.baeldung.chainedexception.exceptions; + +public class GirlFriendOfManagerUpsetException extends Exception { + + public GirlFriendOfManagerUpsetException(String message, Throwable cause) { + super(message, cause); + } + + public GirlFriendOfManagerUpsetException(String message) { + super(message); + } +} diff --git a/core-java/src/main/java/com/baeldung/chainedexception/exceptions/ManagerUpsetException.java b/core-java/src/main/java/com/baeldung/chainedexception/exceptions/ManagerUpsetException.java new file mode 100644 index 0000000000..e95a3921a4 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/chainedexception/exceptions/ManagerUpsetException.java @@ -0,0 +1,12 @@ +package com.baeldung.chainedexception.exceptions; + +public class ManagerUpsetException extends Exception { + + public ManagerUpsetException(String message, Throwable cause) { + super(message, cause); + } + + public ManagerUpsetException(String message) { + super(message); + } +} diff --git a/core-java/src/main/java/com/baeldung/chainedexception/exceptions/NoLeaveGrantedException.java b/core-java/src/main/java/com/baeldung/chainedexception/exceptions/NoLeaveGrantedException.java new file mode 100644 index 0000000000..b9521858b3 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/chainedexception/exceptions/NoLeaveGrantedException.java @@ -0,0 +1,12 @@ +package com.baeldung.chainedexception.exceptions; + +public class NoLeaveGrantedException extends Exception { + + public NoLeaveGrantedException(String message, Throwable cause) { + super(message, cause); + } + + public NoLeaveGrantedException(String message) { + super(message); + } +} \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/chainedexception/exceptions/TeamLeadUpsetException.java b/core-java/src/main/java/com/baeldung/chainedexception/exceptions/TeamLeadUpsetException.java new file mode 100644 index 0000000000..f874620f00 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/chainedexception/exceptions/TeamLeadUpsetException.java @@ -0,0 +1,12 @@ +package com.baeldung.chainedexception.exceptions; + +public class TeamLeadUpsetException extends Exception { + + public TeamLeadUpsetException(String message, Throwable cause) { + super(message, cause); + } + + public TeamLeadUpsetException(String message) { + super(message); + } +} diff --git a/core-java/src/main/java/com/baeldung/disruptor/DelayedMultiEventProducer.java b/core-java/src/main/java/com/baeldung/disruptor/DelayedMultiEventProducer.java new file mode 100644 index 0000000000..bb9f91b99f --- /dev/null +++ b/core-java/src/main/java/com/baeldung/disruptor/DelayedMultiEventProducer.java @@ -0,0 +1,34 @@ +package com.baeldung.disruptor; + +import com.lmax.disruptor.RingBuffer; + +public class DelayedMultiEventProducer implements EventProducer { + + @Override + public void startProducing(final RingBuffer ringBuffer, final int count) { + final Runnable simpleProducer = () -> produce(ringBuffer, count, false); + final Runnable delayedProducer = () -> produce(ringBuffer, count, true); + new Thread(simpleProducer).start(); + new Thread(delayedProducer).start(); + } + + private void produce(final RingBuffer ringBuffer, final int count, final boolean addDelay) { + for (int i = 0; i < count; i++) { + final long seq = ringBuffer.next(); + final ValueEvent valueEvent = ringBuffer.get(seq); + valueEvent.setValue(i); + ringBuffer.publish(seq); + if (addDelay) { + addDelay(); + } + } + } + + private void addDelay() { + try { + Thread.sleep(1000); + } catch (InterruptedException interruptedException) { + // No-Op lets swallow it + } + } +} diff --git a/core-java/src/main/java/com/baeldung/disruptor/EventConsumer.java b/core-java/src/main/java/com/baeldung/disruptor/EventConsumer.java new file mode 100644 index 0000000000..20d72ff9be --- /dev/null +++ b/core-java/src/main/java/com/baeldung/disruptor/EventConsumer.java @@ -0,0 +1,13 @@ +package com.baeldung.disruptor; + +import com.lmax.disruptor.EventHandler; + +/** + * Consumer that consumes event from ring buffer. + */ +public interface EventConsumer { + /** + * One or more event handler to handle event from ring buffer. + */ + public EventHandler[] getEventHandler(); +} diff --git a/core-java/src/main/java/com/baeldung/disruptor/EventProducer.java b/core-java/src/main/java/com/baeldung/disruptor/EventProducer.java new file mode 100644 index 0000000000..ede1aef8bf --- /dev/null +++ b/core-java/src/main/java/com/baeldung/disruptor/EventProducer.java @@ -0,0 +1,15 @@ +package com.baeldung.disruptor; + +import com.lmax.disruptor.RingBuffer; + +/** + * Producer that produces event for ring buffer. + */ +public interface EventProducer { + /** + * Start the producer that would start producing the values. + * @param ringBuffer + * @param count + */ + public void startProducing(final RingBuffer ringBuffer, final int count); +} diff --git a/core-java/src/main/java/com/baeldung/disruptor/MultiEventPrintConsumer.java b/core-java/src/main/java/com/baeldung/disruptor/MultiEventPrintConsumer.java new file mode 100644 index 0000000000..67901db7d5 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/disruptor/MultiEventPrintConsumer.java @@ -0,0 +1,23 @@ +package com.baeldung.disruptor; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.lmax.disruptor.EventHandler; + +public class MultiEventPrintConsumer implements EventConsumer { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Override + @SuppressWarnings("unchecked") + public EventHandler[] getEventHandler() { + final EventHandler eventHandler = (event, sequence, endOfBatch) -> print(event.getValue(), sequence); + final EventHandler otherEventHandler = (event, sequence, endOfBatch) -> print(event.getValue(), sequence); + return new EventHandler[] { eventHandler, otherEventHandler }; + } + + private void print(final int id, final long sequenceId) { + logger.info("Id is " + id + " sequence id that was used is " + sequenceId); + } +} diff --git a/core-java/src/main/java/com/baeldung/disruptor/SingleEventPrintConsumer.java b/core-java/src/main/java/com/baeldung/disruptor/SingleEventPrintConsumer.java new file mode 100644 index 0000000000..766cbcf659 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/disruptor/SingleEventPrintConsumer.java @@ -0,0 +1,22 @@ +package com.baeldung.disruptor; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.lmax.disruptor.EventHandler; + +public class SingleEventPrintConsumer implements EventConsumer { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Override + @SuppressWarnings("unchecked") + public EventHandler[] getEventHandler() { + final EventHandler eventHandler = (event, sequence, endOfBatch) -> print(event.getValue(), sequence); + return new EventHandler[] { eventHandler }; + } + + private void print(final int id, final long sequenceId) { + logger.info("Id is " + id + " sequence id that was used is " + sequenceId); + } +} diff --git a/core-java/src/main/java/com/baeldung/disruptor/SingleEventProducer.java b/core-java/src/main/java/com/baeldung/disruptor/SingleEventProducer.java new file mode 100644 index 0000000000..771d1ab90d --- /dev/null +++ b/core-java/src/main/java/com/baeldung/disruptor/SingleEventProducer.java @@ -0,0 +1,22 @@ +package com.baeldung.disruptor; + +import com.lmax.disruptor.RingBuffer; + +public class SingleEventProducer implements EventProducer { + + @Override + public void startProducing(RingBuffer ringBuffer, int count) { + final Runnable producer = () -> produce(ringBuffer, count); + new Thread(producer).start(); + } + + private void produce(final RingBuffer ringBuffer, final int count) { + for (int i = 0; i < count; i++) { + final long seq = ringBuffer.next(); + final ValueEvent valueEvent = ringBuffer.get(seq); + valueEvent.setValue(i); + ringBuffer.publish(seq); + } + } + +} diff --git a/core-java/src/main/java/com/baeldung/disruptor/ValueEvent.java b/core-java/src/main/java/com/baeldung/disruptor/ValueEvent.java new file mode 100644 index 0000000000..ad466b6a31 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/disruptor/ValueEvent.java @@ -0,0 +1,25 @@ +package com.baeldung.disruptor; + +import org.apache.commons.lang3.builder.ToStringBuilder; + +import com.lmax.disruptor.EventFactory; + +public final class ValueEvent { + + private int value; + + public int getValue() { + return value; + } + + public void setValue(int value) { + this.value = value; + } + + public final static EventFactory EVENT_FACTORY = () -> new ValueEvent(); + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } +} diff --git a/core-java/src/main/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappers.java b/core-java/src/main/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappers.java new file mode 100644 index 0000000000..64532c8b6f --- /dev/null +++ b/core-java/src/main/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappers.java @@ -0,0 +1,57 @@ +package com.baeldung.java8.lambda.exceptions; + +import java.util.function.Consumer; + +public class LambdaExceptionWrappers { + + public static Consumer lambdaWrapper(Consumer consumer) { + return i -> { + try { + consumer.accept(i); + } catch (ArithmeticException e) { + System.err.println("Arithmetic Exception occured : " + e.getMessage()); + } + }; + } + + static Consumer consumerWrapper(Consumer consumer, Class clazz) { + return i -> { + try { + consumer.accept(i); + } catch (Exception ex) { + try { + E exCast = clazz.cast(ex); + System.err.println("Exception occured : " + exCast.getMessage()); + } catch (ClassCastException ccEx) { + throw ex; + } + } + }; + } + + public static Consumer throwingConsumerWrapper(ThrowingConsumer throwingConsumer) { + return i -> { + try { + throwingConsumer.accept(i); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + }; + } + + public static Consumer handlingConsumerWrapper(ThrowingConsumer throwingConsumer, Class exceptionClass) { + return i -> { + try { + throwingConsumer.accept(i); + } catch (Exception ex) { + try { + E exCast = exceptionClass.cast(ex); + System.err.println("Exception occured : " + exCast.getMessage()); + } catch (ClassCastException ccEx) { + throw new RuntimeException(ex); + } + } + }; + } + +} \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/java8/lambda/exceptions/ThrowingConsumer.java b/core-java/src/main/java/com/baeldung/java8/lambda/exceptions/ThrowingConsumer.java new file mode 100644 index 0000000000..c5860e7f6b --- /dev/null +++ b/core-java/src/main/java/com/baeldung/java8/lambda/exceptions/ThrowingConsumer.java @@ -0,0 +1,8 @@ +package com.baeldung.java8.lambda.exceptions; + +@FunctionalInterface +public interface ThrowingConsumer { + + void accept(T t) throws E; + +} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/disruptor/DisruptorTest.java b/core-java/src/test/java/com/baeldung/disruptor/DisruptorTest.java new file mode 100644 index 0000000000..28a5ff72ce --- /dev/null +++ b/core-java/src/test/java/com/baeldung/disruptor/DisruptorTest.java @@ -0,0 +1,83 @@ +package com.baeldung.disruptor; + +import java.util.concurrent.ThreadFactory; +import org.junit.Before; +import org.junit.Test; +import com.lmax.disruptor.BusySpinWaitStrategy; +import com.lmax.disruptor.RingBuffer; +import com.lmax.disruptor.WaitStrategy; +import com.lmax.disruptor.dsl.Disruptor; +import com.lmax.disruptor.dsl.ProducerType; +import com.lmax.disruptor.util.DaemonThreadFactory; + +public class DisruptorTest { + private Disruptor disruptor; + private WaitStrategy waitStrategy; + + @Before + public void setUp() throws Exception { + waitStrategy = new BusySpinWaitStrategy(); + } + + private void createDisruptor(final ProducerType producerType, final EventConsumer eventConsumer) { + final ThreadFactory threadFactory = DaemonThreadFactory.INSTANCE; + disruptor = new Disruptor(ValueEvent.EVENT_FACTORY, 16, threadFactory, producerType, waitStrategy); + disruptor.handleEventsWith(eventConsumer.getEventHandler()); + } + + private void startProducing(final RingBuffer ringBuffer, final int count, final EventProducer eventProducer) { + eventProducer.startProducing(ringBuffer, count); + } + + @Test + public void whenMultipleProducerSingleConsumer_thenOutputInFifoOrder() { + final EventConsumer eventConsumer = new SingleEventPrintConsumer(); + final EventProducer eventProducer = new DelayedMultiEventProducer(); + createDisruptor(ProducerType.MULTI, eventConsumer); + final RingBuffer ringBuffer = disruptor.start(); + + startProducing(ringBuffer, 32, eventProducer); + + disruptor.halt(); + disruptor.shutdown(); + } + + @Test + public void whenSingleProducerSingleConsumer_thenOutputInFifoOrder() { + final EventConsumer eventConsumer = new SingleEventConsumer(); + final EventProducer eventProducer = new SingleEventProducer(); + createDisruptor(ProducerType.SINGLE, eventConsumer); + final RingBuffer ringBuffer = disruptor.start(); + + startProducing(ringBuffer, 32, eventProducer); + + disruptor.halt(); + disruptor.shutdown(); + } + + @Test + public void whenSingleProducerMultipleConsumer_thenOutputInFifoOrder() { + final EventConsumer eventConsumer = new MultiEventConsumer(); + final EventProducer eventProducer = new SingleEventProducer(); + createDisruptor(ProducerType.SINGLE, eventConsumer); + final RingBuffer ringBuffer = disruptor.start(); + + startProducing(ringBuffer, 32, eventProducer); + + disruptor.halt(); + disruptor.shutdown(); + } + + @Test + public void whenMultipleProducerMultipleConsumer_thenOutputInFifoOrder() { + final EventConsumer eventConsumer = new MultiEventPrintConsumer(); + final EventProducer eventProducer = new DelayedMultiEventProducer(); + createDisruptor(ProducerType.MULTI, eventConsumer); + final RingBuffer ringBuffer = disruptor.start(); + + startProducing(ringBuffer, 32, eventProducer); + + disruptor.halt(); + disruptor.shutdown(); + } +} diff --git a/core-java/src/test/java/com/baeldung/disruptor/MultiEventConsumer.java b/core-java/src/test/java/com/baeldung/disruptor/MultiEventConsumer.java new file mode 100644 index 0000000000..304f62c2ee --- /dev/null +++ b/core-java/src/test/java/com/baeldung/disruptor/MultiEventConsumer.java @@ -0,0 +1,27 @@ +package com.baeldung.disruptor; + +import static org.junit.Assert.assertEquals; + +import com.lmax.disruptor.EventHandler; + +public class MultiEventConsumer implements EventConsumer { + + private int expectedValue = -1; + private int otherExpectedValue = -1; + + @Override + @SuppressWarnings("unchecked") + public EventHandler[] getEventHandler() { + final EventHandler eventHandler = (event, sequence, endOfBatch) -> assertExpectedValue(event.getValue()); + final EventHandler otherEventHandler = (event, sequence, endOfBatch) -> assertOtherExpectedValue(event.getValue()); + return new EventHandler[] { eventHandler, otherEventHandler }; + } + + private void assertExpectedValue(final int id) { + assertEquals(++expectedValue, id); + } + + private void assertOtherExpectedValue(final int id) { + assertEquals(++otherExpectedValue, id); + } +} diff --git a/core-java/src/test/java/com/baeldung/disruptor/SingleEventConsumer.java b/core-java/src/test/java/com/baeldung/disruptor/SingleEventConsumer.java new file mode 100644 index 0000000000..efc7432b5a --- /dev/null +++ b/core-java/src/test/java/com/baeldung/disruptor/SingleEventConsumer.java @@ -0,0 +1,21 @@ +package com.baeldung.disruptor; + +import static org.junit.Assert.assertEquals; + +import com.lmax.disruptor.EventHandler; + +public class SingleEventConsumer implements EventConsumer { + + private int expectedValue = -1; + + @Override + @SuppressWarnings("unchecked") + public EventHandler[] getEventHandler() { + final EventHandler eventHandler = (event, sequence, endOfBatch) -> assertExpectedValue(event.getValue()); + return new EventHandler[] { eventHandler }; + } + + private void assertExpectedValue(final int id) { + assertEquals(++expectedValue, id); + } +} diff --git a/core-java/src/test/java/com/baeldung/guava/GuavaBiMapTest.java b/core-java/src/test/java/com/baeldung/guava/GuavaBiMapTest.java new file mode 100644 index 0000000000..0997c93a72 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/guava/GuavaBiMapTest.java @@ -0,0 +1,120 @@ +package com.baeldung.guava; + +import static org.junit.Assert.*; +import java.util.HashMap; +import java.util.Map; +import org.junit.Test; +import com.google.common.collect.BiMap; +import com.google.common.collect.EnumHashBiMap; +import com.google.common.collect.HashBiMap; +import com.google.common.collect.ImmutableBiMap; + +public class GuavaBiMapTest { + @Test + public void whenQueryByValue_returnsKey() { + final BiMap capitalCountryBiMap = HashBiMap.create(); + capitalCountryBiMap.put("New Delhi", "India"); + capitalCountryBiMap.put("Washingon, D.C.", "USA"); + capitalCountryBiMap.put("Moscow", "Russia"); + + final String countryCapitalName = capitalCountryBiMap.inverse().get("India"); + + assertEquals("New Delhi", countryCapitalName); + } + + @Test + public void whenCreateBiMapFromExistingMap_returnsKey() { + final Map capitalCountryMap = new HashMap<>(); + capitalCountryMap.put("New Delhi", "India"); + capitalCountryMap.put("Washingon, D.C.", "USA"); + capitalCountryMap.put("Moscow", "Russia"); + final BiMap capitalCountryBiMap = HashBiMap.create(capitalCountryMap); + + final String countryCapitalName = capitalCountryBiMap.inverse().get("India"); + + assertEquals("New Delhi", countryCapitalName); + } + + @Test + public void whenQueryByKey_returnsValue() { + final BiMap capitalCountryBiMap = HashBiMap.create(); + + capitalCountryBiMap.put("New Delhi", "India"); + capitalCountryBiMap.put("Washingon, D.C.", "USA"); + capitalCountryBiMap.put("Moscow", "Russia"); + + assertEquals("USA", capitalCountryBiMap.get("Washingon, D.C.")); + } + + @Test(expected = IllegalArgumentException.class) + public void whenSameValueIsPresent_throwsException() { + final BiMap capitalCountryBiMap = HashBiMap.create(); + + capitalCountryBiMap.put("New Delhi", "India"); + capitalCountryBiMap.put("Washingon, D.C.", "USA"); + capitalCountryBiMap.put("Moscow", "Russia"); + capitalCountryBiMap.put("Trump", "USA"); + } + + @Test + public void givenSameValueIsPresent_whenForcePut_completesSuccessfully() { + final BiMap capitalCountryBiMap = HashBiMap.create(); + + capitalCountryBiMap.put("New Delhi", "India"); + capitalCountryBiMap.put("Washingon, D.C.", "USA"); + capitalCountryBiMap.put("Moscow", "Russia"); + capitalCountryBiMap.forcePut("Trump", "USA"); + + assertEquals("USA", capitalCountryBiMap.get("Trump")); + assertEquals("Trump", capitalCountryBiMap.inverse().get("USA")); + } + + @Test + public void whenSameKeyIsPresent_replacesAlreadyPresent() { + final BiMap capitalCountryBiMap = HashBiMap.create(); + + capitalCountryBiMap.put("New Delhi", "India"); + capitalCountryBiMap.put("Washingon, D.C.", "USA"); + capitalCountryBiMap.put("Moscow", "Russia"); + capitalCountryBiMap.put("Washingon, D.C.", "HongKong"); + + assertEquals("HongKong", capitalCountryBiMap.get("Washingon, D.C.")); + } + + @Test + public void whenUsingImmutableBiMap_allowsPutSuccessfully() { + final BiMap capitalCountryBiMap = new ImmutableBiMap.Builder().put("New Delhi", "India").put("Washingon, D.C.", "USA").put("Moscow", "Russia").build(); + + assertEquals("USA", capitalCountryBiMap.get("Washingon, D.C.")); + } + + @Test(expected = UnsupportedOperationException.class) + public void whenUsingImmutableBiMap_doesntAllowRemove() { + final BiMap capitalCountryBiMap = new ImmutableBiMap.Builder().put("New Delhi", "India").put("Washingon, D.C.", "USA").put("Moscow", "Russia").build(); + + capitalCountryBiMap.remove("New Delhi"); + } + + @Test(expected = UnsupportedOperationException.class) + public void whenUsingImmutableBiMap_doesntAllowPut() { + final BiMap capitalCountryBiMap = new ImmutableBiMap.Builder().put("New Delhi", "India").put("Washingon, D.C.", "USA").put("Moscow", "Russia").build(); + + capitalCountryBiMap.put("New York", "USA"); + } + + private enum Operation { + ADD, SUBTRACT, MULTIPLY, DIVIDE + } + + @Test + public void whenUsingEnumAsKeyInMap_replacesAlreadyPresent() { + final BiMap operationStringBiMap = EnumHashBiMap.create(Operation.class); + + operationStringBiMap.put(Operation.ADD, "Add"); + operationStringBiMap.put(Operation.SUBTRACT, "Subtract"); + operationStringBiMap.put(Operation.MULTIPLY, "Multiply"); + operationStringBiMap.put(Operation.DIVIDE, "Divide"); + + assertEquals("Divide", operationStringBiMap.get(Operation.DIVIDE)); + } +} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/java/conversion/IterableStreamConversionTest.java b/core-java/src/test/java/com/baeldung/java/conversion/IterableStreamConversionTest.java new file mode 100644 index 0000000000..f52f73558f --- /dev/null +++ b/core-java/src/test/java/com/baeldung/java/conversion/IterableStreamConversionTest.java @@ -0,0 +1,32 @@ +package com.baeldung.java.conversion; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.collection.IsIterableContainingInOrder.contains; + +public class IterableStreamConversionTest { + + @Test + public void givenIterable_whenConvertedToStream_thenNotNull() { + Iterable iterable = Arrays.asList("Testing", "Iterable", "conversion", "to", "Stream"); + + Assert.assertNotNull(StreamSupport.stream(iterable.spliterator(), false)); + } + + @Test + public void whenConvertedToList_thenCorrect() { + Iterable iterable = Arrays.asList("Testing", "Iterable", "conversion", "to", "Stream"); + + List result = StreamSupport.stream(iterable.spliterator(), false) + .map(String::toUpperCase).collect(Collectors.toList()); + + assertThat(result, contains("TESTING", "ITERABLE", "CONVERSION", "TO", "STREAM")); + } +} diff --git a/core-java/src/test/java/com/baeldung/java8/Java8FindAnyFindFirstTest.java b/core-java/src/test/java/com/baeldung/java8/Java8FindAnyFindFirstTest.java new file mode 100644 index 0000000000..c90b7d79c2 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/java8/Java8FindAnyFindFirstTest.java @@ -0,0 +1,38 @@ +package com.baeldung.java8; + + +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; +import java.util.Optional; + +import static org.hamcrest.Matchers.anyOf; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +public class Java8FindAnyFindFirstTest { + + @Test + public void createStream_whenFindAnyResultIsPresent_thenCorrect() { + + List list = Arrays.asList("A","B","C","D"); + + Optional result = list.stream().findAny(); + + assertTrue(result.isPresent()); + assertThat(result.get(), anyOf(is("A"), is("B"), is("C"), is("D"))); + } + + @Test + public void createStream_whenFindFirstResultIsPresent_thenCorrect() { + + List list = Arrays.asList("A","B","C","D"); + + Optional result = list.stream().findFirst(); + + assertTrue(result.isPresent()); + assertThat(result.get(),is("A")); + } +} diff --git a/core-java/src/test/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappersTest.java b/core-java/src/test/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappersTest.java new file mode 100644 index 0000000000..05e84e2dab --- /dev/null +++ b/core-java/src/test/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappersTest.java @@ -0,0 +1,46 @@ +package com.baeldung.java8.lambda.exceptions; + +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +import static com.baeldung.java8.lambda.exceptions.LambdaExceptionWrappers.*; + +public class LambdaExceptionWrappersTest { + + private List integers; + + @Before + public void init() { + integers = Arrays.asList(3, 9, 7, 0, 10, 20); + } + + @Test + public void whenNoExceptionFromLambdaWrapper_thenSuccess() { + integers.forEach(lambdaWrapper(i -> System.out.println(50 / i))); + } + + @Test + public void whenNoExceptionFromConsumerWrapper_thenSuccess() { + integers.forEach(consumerWrapper(i -> System.out.println(50 / i), ArithmeticException.class)); + } + + @Test(expected = RuntimeException.class) + public void whenExceptionFromThrowingConsumerWrapper_thenSuccess() { + integers.forEach(throwingConsumerWrapper(i -> writeToFile(i))); + } + + @Test + public void whenNoExceptionFromHandlingConsumerWrapper_thenSuccess() { + integers.forEach(handlingConsumerWrapper(i -> writeToFile(i), IOException.class)); + } + + private void writeToFile(Integer i) throws IOException { + if (i == 0) { + throw new IOException(); // mock IOException + } + } +} diff --git a/core-java/src/test/java/org/baeldung/java/collections/README.md b/core-java/src/test/java/org/baeldung/java/collections/README.md index 50748cbf81..317d81fae7 100644 --- a/core-java/src/test/java/org/baeldung/java/collections/README.md +++ b/core-java/src/test/java/org/baeldung/java/collections/README.md @@ -1,2 +1,3 @@ ### Relevant Articles: - [Join and Split Arrays and Collections in Java](http://www.baeldung.com/java-join-and-split) +- [Introduction to Java Servlets](http://www.baeldung.com/intro-to-servlets) diff --git a/core-java/src/test/java/org/baeldung/java/io/JavaInputStreamToXUnitTest.java b/core-java/src/test/java/org/baeldung/java/io/JavaInputStreamToXUnitTest.java index 1a6ac5f8ce..6d6d4d9c9b 100644 --- a/core-java/src/test/java/org/baeldung/java/io/JavaInputStreamToXUnitTest.java +++ b/core-java/src/test/java/org/baeldung/java/io/JavaInputStreamToXUnitTest.java @@ -1,38 +1,26 @@ package org.baeldung.java.io; -import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; -import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; - -import java.io.BufferedReader; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.Reader; -import java.io.StringWriter; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import java.nio.file.StandardCopyOption; -import java.util.Scanner; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.google.common.base.Charsets; import com.google.common.io.ByteSource; import com.google.common.io.ByteStreams; import com.google.common.io.CharStreams; import com.google.common.io.Files; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.*; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.StandardCopyOption; +import java.util.Scanner; + +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; +import static org.hamcrest.Matchers.equalTo; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; @SuppressWarnings("unused") public class JavaInputStreamToXUnitTest { @@ -163,7 +151,7 @@ public class JavaInputStreamToXUnitTest { // tests - InputStream to File @Test - public final void givenUsingPlainJava_whenConvertingAnFullInputStreamToAFile_thenCorrect() throws IOException { + public final void whenConvertingToFile_thenCorrect() throws IOException { final InputStream initialStream = new FileInputStream(new File("src/main/resources/sample.txt")); final byte[] buffer = new byte[initialStream.available()]; initialStream.read(buffer); @@ -177,7 +165,7 @@ public class JavaInputStreamToXUnitTest { } @Test - public final void givenUsingPlainJava_whenConvertingAnInProgressInputStreamToAFile_thenCorrect() throws IOException { + public final void whenConvertingInProgressToFile_thenCorrect() throws IOException { final InputStream initialStream = new FileInputStream(new File("src/main/resources/sample.txt")); final File targetFile = new File("src/main/resources/targetFile.tmp"); final OutputStream outStream = new FileOutputStream(targetFile); @@ -193,7 +181,7 @@ public class JavaInputStreamToXUnitTest { } @Test - public final void givenUsingPlainJava8_whenConvertingAnInProgressInputStreamToAFile_thenCorrect() throws IOException { + public final void whenConvertingAnInProgressInputStreamToFile_thenCorrect2() throws IOException { final InputStream initialStream = new FileInputStream(new File("src/main/resources/sample.txt")); final File targetFile = new File("src/main/resources/targetFile.tmp"); @@ -203,7 +191,7 @@ public class JavaInputStreamToXUnitTest { } @Test - public final void givenUsingGuava_whenConvertingAnInputStreamToAFile_thenCorrect() throws IOException { + public final void whenConvertingInputStreamToFile_thenCorrect3() throws IOException { final InputStream initialStream = new FileInputStream(new File("src/main/resources/sample.txt")); final byte[] buffer = new byte[initialStream.available()]; initialStream.read(buffer); @@ -215,7 +203,7 @@ public class JavaInputStreamToXUnitTest { } @Test - public final void givenUsingCommonsIO_whenConvertingAnInputStreamToAFile_thenCorrect() throws IOException { + public final void whenConvertingInputStreamToFile_thenCorrect4() throws IOException { final InputStream initialStream = FileUtils.openInputStream(new File("src/main/resources/sample.txt")); final File targetFile = new File("src/main/resources/targetFile.tmp"); diff --git a/couchbase-sdk/pom.xml b/couchbase-sdk/pom.xml index 6462cfb57a..301fd81c51 100644 --- a/couchbase-sdk/pom.xml +++ b/couchbase-sdk/pom.xml @@ -1,91 +1,91 @@ - 4.0.0 - com.baeldung - couchbase-sdk - 0.1-SNAPSHOT - jar - couchbase-sdk - Couchbase SDK Tutorials + 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 + couchbase-sdk + 0.1-SNAPSHOT + jar + couchbase-sdk + Couchbase SDK Tutorials - - - - com.couchbase.client - java-client - ${couchbase.client.version} - + + + + com.couchbase.client + java-client + ${couchbase.client.version} + - - - org.springframework - spring-context - ${spring-framework.version} - - - org.springframework - spring-context-support - ${spring-framework.version} - + + + org.springframework + spring-context + ${spring-framework.version} + + + org.springframework + spring-context-support + ${spring-framework.version} + - - - org.slf4j - slf4j-api - ${org.slf4j.version} - compile - - - ch.qos.logback - logback-classic - ${logback.version} - - - org.slf4j - jcl-over-slf4j - ${org.slf4j.version} - - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - + + + org.slf4j + slf4j-api + ${org.slf4j.version} + compile + + + ch.qos.logback + logback-classic + ${logback.version} + + + org.slf4j + jcl-over-slf4j + ${org.slf4j.version} + + + org.slf4j + log4j-over-slf4j + ${org.slf4j.version} + - - - org.springframework - spring-test - ${spring-framework.version} - test - - - junit - junit - ${junit.version} - test - - - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - test - - + + + org.springframework + spring-test + ${spring-framework.version} + test + + + junit + junit + ${junit.version} + test + - - - - maven-compiler-plugin - ${maven-compiler-plugin.version} - - ${java.version} - ${java.version} - - - + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + test + + + + + + + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${java.version} + ${java.version} + + + org.apache.maven.plugins maven-surefire-plugin ${maven-surefire-plugin.version} @@ -96,20 +96,20 @@ - - + + - - 1.8 - UTF-8 - 2.3.6 - 4.3.4.RELEASE - 1.1.7 - 1.7.21 - 4.12 - 3.5 - 3.6.0 + + 1.8 + UTF-8 + 2.3.6 + 4.3.4.RELEASE + 1.1.7 + 1.7.21 + 4.12 + 3.5 + 3.6.0 2.19.1 - + diff --git a/deltaspike/pom.xml b/deltaspike/pom.xml index b4a7657e97..141b5b0da6 100644 --- a/deltaspike/pom.xml +++ b/deltaspike/pom.xml @@ -1,6 +1,6 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 com.baeldung deltaspike @@ -19,21 +19,19 @@ - - - UTF-8 + + + + UTF-8 1.7.21 3.7.4 1.7.2 - + 1.0.2.Final - + 8.2.2.Final @@ -50,14 +48,11 @@ - + org.wildfly.bom jboss-javaee-7.0-with-tools @@ -77,43 +72,37 @@ - + - + javax.enterprise cdi-api provided - + org.jboss.spec.javax.annotation jboss-annotations-api_1.2_spec provided - + org.jboss.resteasy jaxrs-api provided - + org.hibernate.javax.persistence hibernate-jpa-2.1-api provided - + org.jboss.spec.javax.ejb jboss-ejb-api_3.2_spec @@ -135,8 +124,7 @@ - + org.jboss.spec.javax.faces jboss-jsf-api_2.2_spec @@ -145,16 +133,14 @@ - + org.hibernate hibernate-jpamodelgen provided - + org.hibernate hibernate-validator-annotation-processor @@ -169,8 +155,7 @@ - + org.jboss.arquillian.junit arquillian-junit-container @@ -225,8 +210,7 @@ - + ${project.artifactId} @@ -265,10 +249,8 @@ - - + + default true @@ -288,10 +270,8 @@ - - + + arq-wildfly-managed diff --git a/dozer/pom.xml b/dozer/pom.xml index 363285f619..56d5e889c3 100644 --- a/dozer/pom.xml +++ b/dozer/pom.xml @@ -1,11 +1,11 @@ 4.0.0 - + com.baeldung dozer 1.0 - + dozer @@ -54,7 +54,7 @@ - + 1.7.21 3.5 @@ -62,5 +62,5 @@ 4.12 3.6.0 - + diff --git a/ejb/pom.xml b/ejb/pom.xml index b00f80a817..bfcc972417 100755 --- a/ejb/pom.xml +++ b/ejb/pom.xml @@ -1,6 +1,6 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung.ejb ejb @@ -75,8 +75,8 @@ - - ejb-remote - ejb-client - + + ejb-remote + ejb-client + \ No newline at end of file diff --git a/enterprise-patterns/pom.xml b/enterprise-patterns/pom.xml index 763227e45b..1c895095dc 100644 --- a/enterprise-patterns/pom.xml +++ b/enterprise-patterns/pom.xml @@ -1,7 +1,6 @@ - + 4.0.0 com.baeldung.enterprise.patterns @@ -32,7 +31,7 @@ - + 3.6.0 diff --git a/feign/pom.xml b/feign/pom.xml index 721fa76682..160f37ec2c 100644 --- a/feign/pom.xml +++ b/feign/pom.xml @@ -1,6 +1,6 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung.feign diff --git a/gradle/build.gradle b/gradle/build.gradle new file mode 100644 index 0000000000..fc561987f7 --- /dev/null +++ b/gradle/build.gradle @@ -0,0 +1,25 @@ +apply plugin: 'java' +apply plugin: 'maven' + +repositories{ + mavenCentral() +} + +dependencies{ + compile 'org.springframework:spring-context:4.3.5.RELEASE' +} + +task hello { + println "this Baeldung's tutorial is ${awesomeness}" +} + +uploadArchives { + repositories { + mavenDeployer { + repository(url: 'http://yourmavenrepo/repository') { + authentication(userName: 'user', password: 'password'); + } + + } + } +} diff --git a/gradle/gradle.properties b/gradle/gradle.properties new file mode 100644 index 0000000000..41701e5a19 --- /dev/null +++ b/gradle/gradle.properties @@ -0,0 +1,3 @@ +awesomeness=awesome +group=com.baeldung.tutorial +version=1.0.1 diff --git a/gradle/gradle/wrapper/gradle-wrapper.jar b/gradle/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000..3391a4cdf6 Binary files /dev/null and b/gradle/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/gradle/wrapper/gradle-wrapper.properties b/gradle/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..b601d97764 --- /dev/null +++ b/gradle/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Sat Dec 31 15:46:08 BRT 2016 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-3.2.1-bin.zip diff --git a/gradle/gradlew b/gradle/gradlew new file mode 100644 index 0000000000..9d82f78915 --- /dev/null +++ b/gradle/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradle/gradlew.bat b/gradle/gradlew.bat new file mode 100644 index 0000000000..8a0b282aa6 --- /dev/null +++ b/gradle/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/gradle/src/main/java/Main.java b/gradle/src/main/java/Main.java new file mode 100644 index 0000000000..10edd1840b --- /dev/null +++ b/gradle/src/main/java/Main.java @@ -0,0 +1,5 @@ +public class Main{ + public static void main(String[] args){ + System.out.println("Baeldung Rocks"); + } +} diff --git a/guava/pom.xml b/guava/pom.xml index a7b4e79e34..0a50fad2c3 100644 --- a/guava/pom.xml +++ b/guava/pom.xml @@ -92,7 +92,7 @@ - 19.0 + 21.0 3.5 4.1 diff --git a/guava/src/test/java/org/baeldung/guava/GuavaMultiMapTest.java b/guava/src/test/java/org/baeldung/guava/GuavaMultiMapTest.java new file mode 100644 index 0000000000..5e80dd2f87 --- /dev/null +++ b/guava/src/test/java/org/baeldung/guava/GuavaMultiMapTest.java @@ -0,0 +1,63 @@ +package org.baeldung.guava; + +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Multimap; +import org.junit.Test; + +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import static org.junit.Assert.assertEquals; + + +public class GuavaMultiMapTest { + + @Test + public void givenMap_whenAddTwoValuesForSameKey_shouldOverridePreviousKey() { + //given + String key = "a-key"; + Map map = new LinkedHashMap<>(); + + //when + map.put(key, "firstValue"); + map.put(key, "secondValue"); + + //then + assertEquals(1, map.size()); + } + + @Test + public void givenMultiMap_whenAddTwoValuesForSameKey_shouldHaveTwoEntriesInMap() { + //given + String key = "a-key"; + Multimap map = ArrayListMultimap.create(); + + //when + map.put(key, "firstValue"); + map.put(key, "secondValue"); + + //then + assertEquals(2, map.size()); + } + + @Test + public void givenMapOfListValues_whenAddTwoValuesForSameKey_shouldHaveTwoElementsInList() { + //given + String key = "a-key"; + Map> map = new LinkedHashMap<>(); + + //when + List values = map.get(key); + if(values == null){ + values = new LinkedList<>(); + values.add("firstValue"); + values.add("secondValue"); + } + map.put(key, values); + + //then + assertEquals(1, map.size()); + } +} \ No newline at end of file diff --git a/guava/src/test/java/org/baeldung/guava/GuavaStringTest.java b/guava/src/test/java/org/baeldung/guava/GuavaStringTest.java index be230a9b0e..cedbe60d91 100644 --- a/guava/src/test/java/org/baeldung/guava/GuavaStringTest.java +++ b/guava/src/test/java/org/baeldung/guava/GuavaStringTest.java @@ -8,10 +8,9 @@ import static org.junit.Assert.assertTrue; import java.nio.charset.Charset; import java.nio.charset.CharsetEncoder; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; +import com.google.common.collect.*; import org.junit.Test; import com.google.common.base.CharMatcher; @@ -19,9 +18,6 @@ import com.google.common.base.Function; import com.google.common.base.Joiner; import com.google.common.base.Predicate; import com.google.common.base.Splitter; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; public class GuavaStringTest { diff --git a/httpclient/src/test/java/org/baeldung/httpclient/HttpClientMultipartLiveTest.java b/httpclient/src/test/java/org/baeldung/httpclient/HttpClientMultipartLiveTest.java index 6fad126537..954236a56f 100644 --- a/httpclient/src/test/java/org/baeldung/httpclient/HttpClientMultipartLiveTest.java +++ b/httpclient/src/test/java/org/baeldung/httpclient/HttpClientMultipartLiveTest.java @@ -28,13 +28,14 @@ import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.junit.After; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; -@Ignore("Server is not available") public class HttpClientMultipartLiveTest { - private static final String SERVER = "http://echo.200please.com"; + // No longer available + // private static final String SERVER = "http://echo.200please.com"; + + private static final String SERVER = "http://posttestserver.com/post.php"; private static final String TEXTFILENAME = "temp.txt"; private static final String IMAGEFILENAME = "image.jpg"; private static final String ZIPFILENAME = "zipFile.zip"; @@ -46,7 +47,8 @@ public class HttpClientMultipartLiveTest { @Before public final void before() { - client = HttpClientBuilder.create().build(); + client = HttpClientBuilder.create() + .build(); post = new HttpPost(SERVER); } @@ -80,7 +82,9 @@ public class HttpClientMultipartLiveTest { @Test public final void givenFileandMultipleTextParts_whenUploadwithAddPart_thenNoExceptions() throws IOException { - final URL url = Thread.currentThread().getContextClassLoader().getResource("uploads/" + TEXTFILENAME); + final URL url = Thread.currentThread() + .getContextClassLoader() + .getResource("uploads/" + TEXTFILENAME); final File file = new File(url.getPath()); final FileBody fileBody = new FileBody(file, ContentType.DEFAULT_BINARY); @@ -97,11 +101,12 @@ public class HttpClientMultipartLiveTest { post.setEntity(entity); response = client.execute(post); - final int statusCode = response.getStatusLine().getStatusCode(); + final int statusCode = response.getStatusLine() + .getStatusCode(); final String responseString = getContent(); final String contentTypeInHeader = getContentTypeHeader(); assertThat(statusCode, equalTo(HttpStatus.SC_OK)); - assertTrue(responseString.contains("Content-Type: multipart/form-data;")); + // assertTrue(responseString.contains("Content-Type: multipart/form-data;")); assertTrue(contentTypeInHeader.contains("Content-Type: multipart/form-data;")); System.out.println(responseString); System.out.println("POST Content Type: " + contentTypeInHeader); @@ -109,7 +114,9 @@ public class HttpClientMultipartLiveTest { @Test public final void givenFileandTextPart_whenUploadwithAddBinaryBodyandAddTextBody_ThenNoExeption() throws ClientProtocolException, IOException { - final URL url = Thread.currentThread().getContextClassLoader().getResource("uploads/" + TEXTFILENAME); + final URL url = Thread.currentThread() + .getContextClassLoader() + .getResource("uploads/" + TEXTFILENAME); final File file = new File(url.getPath()); final String message = "This is a multipart post"; final MultipartEntityBuilder builder = MultipartEntityBuilder.create(); @@ -119,11 +126,12 @@ public class HttpClientMultipartLiveTest { final HttpEntity entity = builder.build(); post.setEntity(entity); response = client.execute(post); - final int statusCode = response.getStatusLine().getStatusCode(); + final int statusCode = response.getStatusLine() + .getStatusCode(); final String responseString = getContent(); final String contentTypeInHeader = getContentTypeHeader(); assertThat(statusCode, equalTo(HttpStatus.SC_OK)); - assertTrue(responseString.contains("Content-Type: multipart/form-data;")); + // assertTrue(responseString.contains("Content-Type: multipart/form-data;")); assertTrue(contentTypeInHeader.contains("Content-Type: multipart/form-data;")); System.out.println(responseString); System.out.println("POST Content Type: " + contentTypeInHeader); @@ -131,8 +139,12 @@ public class HttpClientMultipartLiveTest { @Test public final void givenFileAndInputStreamandText_whenUploadwithAddBinaryBodyandAddTextBody_ThenNoException() throws ClientProtocolException, IOException { - final URL url = Thread.currentThread().getContextClassLoader().getResource("uploads/" + ZIPFILENAME); - final URL url2 = Thread.currentThread().getContextClassLoader().getResource("uploads/" + IMAGEFILENAME); + final URL url = Thread.currentThread() + .getContextClassLoader() + .getResource("uploads/" + ZIPFILENAME); + final URL url2 = Thread.currentThread() + .getContextClassLoader() + .getResource("uploads/" + IMAGEFILENAME); final InputStream inputStream = new FileInputStream(url.getPath()); final File file = new File(url2.getPath()); final String message = "This is a multipart post"; @@ -144,11 +156,12 @@ public class HttpClientMultipartLiveTest { final HttpEntity entity = builder.build(); post.setEntity(entity); response = client.execute(post); - final int statusCode = response.getStatusLine().getStatusCode(); + final int statusCode = response.getStatusLine() + .getStatusCode(); final String responseString = getContent(); final String contentTypeInHeader = getContentTypeHeader(); assertThat(statusCode, equalTo(HttpStatus.SC_OK)); - assertTrue(responseString.contains("Content-Type: multipart/form-data;")); + // assertTrue(responseString.contains("Content-Type: multipart/form-data;")); assertTrue(contentTypeInHeader.contains("Content-Type: multipart/form-data;")); System.out.println(responseString); System.out.println("POST Content Type: " + contentTypeInHeader); @@ -166,11 +179,12 @@ public class HttpClientMultipartLiveTest { final HttpEntity entity = builder.build(); post.setEntity(entity); response = client.execute(post); - final int statusCode = response.getStatusLine().getStatusCode(); + final int statusCode = response.getStatusLine() + .getStatusCode(); final String responseString = getContent(); final String contentTypeInHeader = getContentTypeHeader(); assertThat(statusCode, equalTo(HttpStatus.SC_OK)); - assertTrue(responseString.contains("Content-Type: multipart/form-data;")); + // assertTrue(responseString.contains("Content-Type: multipart/form-data;")); assertTrue(contentTypeInHeader.contains("Content-Type: multipart/form-data;")); System.out.println(responseString); System.out.println("POST Content Type: " + contentTypeInHeader); @@ -179,7 +193,8 @@ public class HttpClientMultipartLiveTest { // UTIL final String getContent() throws IOException { - rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); + rd = new BufferedReader(new InputStreamReader(response.getEntity() + .getContent())); String body = ""; String content = ""; while ((body = rd.readLine()) != null) { @@ -189,7 +204,9 @@ public class HttpClientMultipartLiveTest { } final String getContentTypeHeader() throws IOException { - return post.getEntity().getContentType().toString(); + return post.getEntity() + .getContentType() + .toString(); } } diff --git a/httpclient/src/test/java/org/baeldung/httpclient/HttpsClientSslLiveTest.java b/httpclient/src/test/java/org/baeldung/httpclient/HttpsClientSslLiveTest.java index 278cdb3556..5dfecb85aa 100644 --- a/httpclient/src/test/java/org/baeldung/httpclient/HttpsClientSslLiveTest.java +++ b/httpclient/src/test/java/org/baeldung/httpclient/HttpsClientSslLiveTest.java @@ -1,11 +1,24 @@ package org.baeldung.httpclient; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertThat; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLHandshakeException; + import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.conn.ClientConnectionManager; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.scheme.SchemeRegistry; -import org.apache.http.conn.ssl.*; +import org.apache.http.conn.ssl.NoopHostnameVerifier; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.conn.ssl.SSLSocketFactory; +import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +import org.apache.http.conn.ssl.TrustStrategy; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.client.HttpClientBuilder; @@ -15,14 +28,6 @@ import org.apache.http.ssl.SSLContextBuilder; import org.apache.http.ssl.SSLContexts; import org.junit.Test; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLException; -import java.io.IOException; -import java.security.GeneralSecurityException; - -import static org.hamcrest.CoreMatchers.equalTo; -import static org.junit.Assert.assertThat; - /** * This test requires a localhost server over HTTPS
* It should only be manually run, not part of the automated build @@ -35,13 +40,15 @@ public class HttpsClientSslLiveTest { // tests - @Test(expected = SSLException.class) + @Test(expected = SSLHandshakeException.class) public final void whenHttpsUrlIsConsumed_thenException() throws IOException { - final CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + final CloseableHttpClient httpClient = HttpClientBuilder.create() + .build(); final HttpGet getMethod = new HttpGet(HOST_WITH_SSL); final HttpResponse response = httpClient.execute(getMethod); - assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); + assertThat(response.getStatusLine() + .getStatusCode(), equalTo(200)); } @SuppressWarnings("deprecation") @@ -57,7 +64,8 @@ public class HttpsClientSslLiveTest { final HttpGet getMethod = new HttpGet(HOST_WITH_SSL); final HttpResponse response = httpClient.execute(getMethod); - assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); + assertThat(response.getStatusLine() + .getStatusCode(), equalTo(200)); httpClient.close(); } @@ -65,44 +73,62 @@ public class HttpsClientSslLiveTest { @Test public final void givenHttpClientAfter4_3_whenAcceptingAllCertificates_thenCanConsumeHttpsUriWithSelfSignedCertificate() throws IOException, GeneralSecurityException { final TrustStrategy acceptingTrustStrategy = (certificate, authType) -> true; - final SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build(); + final SSLContext sslContext = SSLContexts.custom() + .loadTrustMaterial(null, acceptingTrustStrategy) + .build(); final SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); - final CloseableHttpClient httpClient = HttpClients.custom().setHostnameVerifier(SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER).setSSLSocketFactory(sslsf).build(); + final CloseableHttpClient httpClient = HttpClients.custom() + .setHostnameVerifier(SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER) + .setSSLSocketFactory(sslsf) + .build(); final HttpGet getMethod = new HttpGet(HOST_WITH_SSL); final HttpResponse response = httpClient.execute(getMethod); - assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); + assertThat(response.getStatusLine() + .getStatusCode(), equalTo(200)); httpClient.close(); } @Test public final void givenHttpClientPost4_3_whenAcceptingAllCertificates_thenCanConsumeHttpsUriWithSelfSignedCertificate() throws IOException, GeneralSecurityException { - final SSLContextBuilder builder = new SSLContextBuilder(); - builder.loadTrustMaterial(null, new TrustSelfSignedStrategy()); - final SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(builder.build()); - final CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build(); + final SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()) + .build(); + final NoopHostnameVerifier hostnameVerifier = new NoopHostnameVerifier(); + + final SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, hostnameVerifier); + final CloseableHttpClient httpClient = HttpClients.custom() + .setSSLHostnameVerifier(hostnameVerifier) + .setSSLSocketFactory(sslsf) + .build(); // new final HttpGet getMethod = new HttpGet(HOST_WITH_SSL); final HttpResponse response = httpClient.execute(getMethod); - assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); + assertThat(response.getStatusLine() + .getStatusCode(), equalTo(200)); + httpClient.close(); + } @Test public final void givenIgnoringCertificates_whenHttpsUrlIsConsumed_thenCorrect() throws Exception { - SSLContext sslContext = new SSLContextBuilder() - .loadTrustMaterial(null, (certificate, authType) -> true).build(); + final SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, (certificate, authType) -> true) + .build(); - final CloseableHttpClient client = HttpClients.custom().setSSLContext(sslContext).setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); + final CloseableHttpClient client = HttpClients.custom() + .setSSLContext(sslContext) + .setSSLHostnameVerifier(new NoopHostnameVerifier()) + .build(); final HttpGet httpGet = new HttpGet(HOST_WITH_SSL); httpGet.setHeader("Accept", "application/xml"); final HttpResponse response = client.execute(httpGet); - assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); + assertThat(response.getStatusLine() + .getStatusCode(), equalTo(200)); } } diff --git a/jackson/src/main/java/com/baeldung/jackson/inheritance/Event.java b/jackson/src/main/java/com/baeldung/jackson/inheritance/Event.java new file mode 100644 index 0000000000..797bde98b2 --- /dev/null +++ b/jackson/src/main/java/com/baeldung/jackson/inheritance/Event.java @@ -0,0 +1,25 @@ +package com.baeldung.jackson.inheritance; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonTypeInfo; + +@JsonTypeInfo(use = JsonTypeInfo.Id.MINIMAL_CLASS, include = JsonTypeInfo.As.PROPERTY, property = "eventType") +abstract public class Event { + private final String id; + private final Long timestamp; + + @JsonCreator + public Event(@JsonProperty("id") String id, @JsonProperty("timestamp") Long timestamp) { + this.id = id; + this.timestamp = timestamp; + } + + public Long getTimestamp() { + return timestamp; + } + + public String getId() { + return id; + } +} \ No newline at end of file diff --git a/jackson/src/main/java/com/baeldung/jackson/inheritance/ItemIdAddedToUser.java b/jackson/src/main/java/com/baeldung/jackson/inheritance/ItemIdAddedToUser.java new file mode 100644 index 0000000000..11aa8ddb1a --- /dev/null +++ b/jackson/src/main/java/com/baeldung/jackson/inheritance/ItemIdAddedToUser.java @@ -0,0 +1,31 @@ +package com.baeldung.jackson.inheritance; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonTypeName; + +@JsonTypeName("itemIdAddedToUser") +@JsonIgnoreProperties("id") +public class ItemIdAddedToUser extends Event { + private final String itemId; + private final Long quantity; + + @JsonCreator + public ItemIdAddedToUser(@JsonProperty("id") String id, + @JsonProperty("timestamp") Long timestamp, + @JsonProperty("itemId") String itemId, + @JsonProperty("quantity") Long quantity) { + super(id, timestamp); + this.itemId = itemId; + this.quantity = quantity; + } + + public String getItemId() { + return itemId; + } + + public Long getQuantity() { + return quantity; + } +} \ No newline at end of file diff --git a/jackson/src/main/java/com/baeldung/jackson/inheritance/ItemIdRemovedFromUser.java b/jackson/src/main/java/com/baeldung/jackson/inheritance/ItemIdRemovedFromUser.java new file mode 100644 index 0000000000..682394ddf3 --- /dev/null +++ b/jackson/src/main/java/com/baeldung/jackson/inheritance/ItemIdRemovedFromUser.java @@ -0,0 +1,29 @@ +package com.baeldung.jackson.inheritance; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonTypeName; + +@JsonTypeName("itemIdRemovedFromUser") +public class ItemIdRemovedFromUser extends Event { + private final String itemId; + private final Long quantity; + + @JsonCreator + public ItemIdRemovedFromUser(@JsonProperty("id") String id, + @JsonProperty("timestamp") Long timestamp, + @JsonProperty("itemId") String itemId, + @JsonProperty("quantity") Long quantity) { + super(id, timestamp); + this.itemId = itemId; + this.quantity = quantity; + } + + public String getItemId() { + return itemId; + } + + public Long getQuantity() { + return quantity; + } +} \ No newline at end of file diff --git a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/DistanceEnumSimple.java b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/DistanceEnumSimple.java new file mode 100644 index 0000000000..1118fb349a --- /dev/null +++ b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/DistanceEnumSimple.java @@ -0,0 +1,26 @@ +package com.baeldung.jackson.dtos.withEnum; + +public enum DistanceEnumSimple { + KILOMETER("km", 1000), MILE("miles", 1609.34), METER("meters", 1), INCH("inches", 0.0254), CENTIMETER("cm", 0.01), MILLIMETER("mm", 0.001); + + private String unit; + private final double meters; + + private DistanceEnumSimple(String unit, double meters) { + this.unit = unit; + this.meters = meters; + } + + public double getMeters() { + return meters; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + +} \ No newline at end of file diff --git a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/DistanceEnumWithJsonFormat.java b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/DistanceEnumWithJsonFormat.java new file mode 100644 index 0000000000..7dc6bb559b --- /dev/null +++ b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/DistanceEnumWithJsonFormat.java @@ -0,0 +1,29 @@ +package com.baeldung.jackson.dtos.withEnum; + +import com.fasterxml.jackson.annotation.JsonFormat; + +@JsonFormat(shape = JsonFormat.Shape.OBJECT) +public enum DistanceEnumWithJsonFormat { + KILOMETER("km", 1000), MILE("miles", 1609.34), METER("meters", 1), INCH("inches", 0.0254), CENTIMETER("cm", 0.01), MILLIMETER("mm", 0.001); + + private String unit; + private final double meters; + + private DistanceEnumWithJsonFormat(String unit, double meters) { + this.unit = unit; + this.meters = meters; + } + + public double getMeters() { + return meters; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + +} \ No newline at end of file diff --git a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/DistanceEnumWithValue.java b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/DistanceEnumWithValue.java new file mode 100644 index 0000000000..69c476d8a5 --- /dev/null +++ b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/DistanceEnumWithValue.java @@ -0,0 +1,29 @@ +package com.baeldung.jackson.dtos.withEnum; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum DistanceEnumWithValue { + KILOMETER("km", 1000), MILE("miles", 1609.34), METER("meters", 1), INCH("inches", 0.0254), CENTIMETER("cm", 0.01), MILLIMETER("mm", 0.001); + + private String unit; + private final double meters; + + private DistanceEnumWithValue(String unit, double meters) { + this.unit = unit; + this.meters = meters; + } + + @JsonValue + public double getMeters() { + return meters; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + +} \ No newline at end of file diff --git a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnumCustom.java b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnumCustom.java new file mode 100644 index 0000000000..bf9b7db395 --- /dev/null +++ b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnumCustom.java @@ -0,0 +1,59 @@ +package com.baeldung.jackson.dtos.withEnum; + +import com.baeldung.jackson.enums.Distance; + +public class MyDtoWithEnumCustom { + + private String stringValue; + private int intValue; + private boolean booleanValue; + private Distance type; + + public MyDtoWithEnumCustom() { + super(); + } + + public MyDtoWithEnumCustom(final String stringValue, final int intValue, final boolean booleanValue, final Distance type) { + super(); + + this.stringValue = stringValue; + this.intValue = intValue; + this.booleanValue = booleanValue; + this.type = type; + } + + // API + + public String getStringValue() { + return stringValue; + } + + public void setStringValue(final String stringValue) { + this.stringValue = stringValue; + } + + public int getIntValue() { + return intValue; + } + + public void setIntValue(final int intValue) { + this.intValue = intValue; + } + + public boolean isBooleanValue() { + return booleanValue; + } + + public void setBooleanValue(final boolean booleanValue) { + this.booleanValue = booleanValue; + } + + public Distance getType() { + return type; + } + + public void setType(final Distance type) { + this.type = type; + } + +} diff --git a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnumJsonFormat.java b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnumJsonFormat.java new file mode 100644 index 0000000000..8e2f1b835f --- /dev/null +++ b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnumJsonFormat.java @@ -0,0 +1,57 @@ +package com.baeldung.jackson.dtos.withEnum; + +public class MyDtoWithEnumJsonFormat { + + private String stringValue; + private int intValue; + private boolean booleanValue; + private DistanceEnumWithJsonFormat distanceType; + + public MyDtoWithEnumJsonFormat() { + super(); + } + + public MyDtoWithEnumJsonFormat(final String stringValue, final int intValue, final boolean booleanValue, final DistanceEnumWithJsonFormat type) { + super(); + + this.stringValue = stringValue; + this.intValue = intValue; + this.booleanValue = booleanValue; + this.distanceType = type; + } + + // API + + public String getStringValue() { + return stringValue; + } + + public void setStringValue(final String stringValue) { + this.stringValue = stringValue; + } + + public int getIntValue() { + return intValue; + } + + public void setIntValue(final int intValue) { + this.intValue = intValue; + } + + public boolean isBooleanValue() { + return booleanValue; + } + + public void setBooleanValue(final boolean booleanValue) { + this.booleanValue = booleanValue; + } + + public DistanceEnumWithJsonFormat getDistanceType() { + return distanceType; + } + + public void setDistanceType(final DistanceEnumWithJsonFormat type) { + this.distanceType = type; + } + +} diff --git a/jackson/src/test/java/com/baeldung/jackson/inheritance/ItemIdRemovedFromUserTest.java b/jackson/src/test/java/com/baeldung/jackson/inheritance/ItemIdRemovedFromUserTest.java new file mode 100644 index 0000000000..5aee03555e --- /dev/null +++ b/jackson/src/test/java/com/baeldung/jackson/inheritance/ItemIdRemovedFromUserTest.java @@ -0,0 +1,41 @@ +package com.baeldung.jackson.inheritance; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class ItemIdRemovedFromUserTest { + @Test + public void givenRemoveItemJson_whenDeserialize_shouldHaveProperClassType() throws IOException { + //given + Event event = new ItemIdRemovedFromUser("1", 12345567L, "item_1", 2L); + ObjectMapper objectMapper = new ObjectMapper(); + String eventJson = objectMapper.writeValueAsString(event); + + //when + Event result = new ObjectMapper().readValue(eventJson, Event.class); + + //then + assertTrue(result instanceof ItemIdRemovedFromUser); + assertEquals("item_1", ((ItemIdRemovedFromUser) result).getItemId()); + } + + @Test + public void givenAdddItemJson_whenSerialize_shouldIgnoreIdPropertyFromSuperclass() throws IOException { + //given + Event event = new ItemIdAddedToUser("1", 12345567L, "item_1", 2L); + ObjectMapper objectMapper = new ObjectMapper(); + + //when + String eventJson = objectMapper.writeValueAsString(event); + + //then + assertFalse(eventJson.contains("id")); + } + +} \ No newline at end of file diff --git a/jackson/src/test/java/com/baeldung/jackson/test/JacksonAnnotationTest.java b/jackson/src/test/java/com/baeldung/jackson/test/JacksonAnnotationTest.java index f2464d4251..9351b929d3 100644 --- a/jackson/src/test/java/com/baeldung/jackson/test/JacksonAnnotationTest.java +++ b/jackson/src/test/java/com/baeldung/jackson/test/JacksonAnnotationTest.java @@ -1,6 +1,32 @@ package com.baeldung.jackson.test; -import com.baeldung.jackson.annotation.*; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.not; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; + +import org.junit.Test; + +import com.baeldung.jackson.annotation.BeanWithCreator; +import com.baeldung.jackson.annotation.BeanWithCustomAnnotation; +import com.baeldung.jackson.annotation.BeanWithFilter; +import com.baeldung.jackson.annotation.BeanWithGetter; +import com.baeldung.jackson.annotation.BeanWithIgnore; +import com.baeldung.jackson.annotation.BeanWithInject; +import com.baeldung.jackson.annotation.ExtendableBean; +import com.baeldung.jackson.annotation.MyBean; +import com.baeldung.jackson.annotation.PrivateBean; +import com.baeldung.jackson.annotation.RawBean; +import com.baeldung.jackson.annotation.UnwrappedUser; +import com.baeldung.jackson.annotation.UserWithIgnoreType; +import com.baeldung.jackson.annotation.Zoo; import com.baeldung.jackson.bidirection.ItemWithIdentity; import com.baeldung.jackson.bidirection.ItemWithRef; import com.baeldung.jackson.bidirection.UserWithIdentity; @@ -8,7 +34,7 @@ import com.baeldung.jackson.bidirection.UserWithRef; import com.baeldung.jackson.date.EventWithFormat; import com.baeldung.jackson.date.EventWithSerializer; import com.baeldung.jackson.dtos.MyMixInForIgnoreType; -import com.baeldung.jackson.dtos.withEnum.TypeEnumWithValue; +import com.baeldung.jackson.dtos.withEnum.DistanceEnumWithValue; import com.baeldung.jackson.exception.UserWithRoot; import com.baeldung.jackson.jsonview.Item; import com.baeldung.jackson.jsonview.Views; @@ -20,17 +46,6 @@ import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.ser.FilterProvider; import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter; import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; -import org.junit.Test; - -import java.io.IOException; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.TimeZone; - -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; public class JacksonAnnotationTest { @@ -85,10 +100,10 @@ public class JacksonAnnotationTest { } @Test - public void whenSerializingUsingJsonValue_thenCorrect() throws JsonProcessingException { - final String enumAsString = new ObjectMapper().writeValueAsString(TypeEnumWithValue.TYPE1); + public void whenSerializingUsingJsonValue_thenCorrect() throws IOException { + final String enumAsString = new ObjectMapper().writeValueAsString(DistanceEnumWithValue.MILE); - assertThat(enumAsString, is("\"Type A\"")); + assertThat(enumAsString, is("1609.34")); } @Test diff --git a/jackson/src/test/java/com/baeldung/jackson/test/JacksonSerializationEnumsUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/test/JacksonSerializationEnumsUnitTest.java index 78c6316aa6..0f57d26d8b 100644 --- a/jackson/src/test/java/com/baeldung/jackson/test/JacksonSerializationEnumsUnitTest.java +++ b/jackson/src/test/java/com/baeldung/jackson/test/JacksonSerializationEnumsUnitTest.java @@ -6,14 +6,14 @@ import static org.junit.Assert.assertThat; import java.io.IOException; -import com.baeldung.jackson.dtos.withEnum.MyDtoWithEnum; -import com.baeldung.jackson.dtos.withEnum.TypeEnum; -import com.baeldung.jackson.dtos.withEnum.TypeEnumSimple; -import com.baeldung.jackson.dtos.withEnum.TypeEnumWithValue; -import com.baeldung.jackson.dtos.withEnum.MyDtoWithEnumCustom; -import com.baeldung.jackson.dtos.withEnum.TypeEnumWithCustomSerializer; import org.junit.Test; +import com.baeldung.jackson.dtos.withEnum.DistanceEnumSimple; +import com.baeldung.jackson.dtos.withEnum.DistanceEnumWithJsonFormat; +import com.baeldung.jackson.dtos.withEnum.DistanceEnumWithValue; +import com.baeldung.jackson.dtos.withEnum.MyDtoWithEnumCustom; +import com.baeldung.jackson.dtos.withEnum.MyDtoWithEnumJsonFormat; +import com.baeldung.jackson.enums.Distance; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -24,10 +24,9 @@ public class JacksonSerializationEnumsUnitTest { @Test public final void whenSerializingASimpleEnum_thenCorrect() throws JsonParseException, IOException { final ObjectMapper mapper = new ObjectMapper(); - final String enumAsString = mapper.writeValueAsString(TypeEnumSimple.TYPE1); - System.out.println(enumAsString); + final String enumAsString = mapper.writeValueAsString(DistanceEnumSimple.MILE); - assertThat(enumAsString, containsString("TYPE1")); + assertThat(enumAsString, containsString("MILE")); } // tests - enum with main value @@ -35,10 +34,9 @@ public class JacksonSerializationEnumsUnitTest { @Test public final void whenSerializingAEnumWithValue_thenCorrect() throws JsonParseException, IOException { final ObjectMapper mapper = new ObjectMapper(); - final String enumAsString = mapper.writeValueAsString(TypeEnumWithValue.TYPE1); - System.out.println(enumAsString); + final String enumAsString = mapper.writeValueAsString(DistanceEnumWithValue.MILE); - assertThat(enumAsString, is("\"Type A\"")); + assertThat(enumAsString, is("1609.34")); } // tests - enum @@ -46,28 +44,25 @@ public class JacksonSerializationEnumsUnitTest { @Test public final void whenSerializingAnEnum_thenCorrect() throws JsonParseException, IOException { final ObjectMapper mapper = new ObjectMapper(); - final String enumAsString = mapper.writeValueAsString(TypeEnum.TYPE1); + final String enumAsString = mapper.writeValueAsString(DistanceEnumWithJsonFormat.MILE); - System.out.println(enumAsString); - assertThat(enumAsString, containsString("\"name\":\"Type A\"")); + assertThat(enumAsString, containsString("\"meters\":1609.34")); } @Test public final void whenSerializingEntityWithEnum_thenCorrect() throws JsonParseException, IOException { final ObjectMapper mapper = new ObjectMapper(); - final String enumAsString = mapper.writeValueAsString(new MyDtoWithEnum("a", 1, true, TypeEnum.TYPE1)); + final String enumAsString = mapper.writeValueAsString(new MyDtoWithEnumJsonFormat("a", 1, true, DistanceEnumWithJsonFormat.MILE)); - System.out.println(enumAsString); - assertThat(enumAsString, containsString("\"name\":\"Type A\"")); + assertThat(enumAsString, containsString("\"meters\":1609.34")); } @Test public final void whenSerializingArrayOfEnums_thenCorrect() throws JsonParseException, IOException { final ObjectMapper mapper = new ObjectMapper(); - final String json = mapper.writeValueAsString(new TypeEnum[] { TypeEnum.TYPE1, TypeEnum.TYPE2 }); + final String json = mapper.writeValueAsString(new DistanceEnumWithJsonFormat[] { DistanceEnumWithJsonFormat.MILE, DistanceEnumWithJsonFormat.KILOMETER }); - System.out.println(json); - assertThat(json, containsString("\"name\":\"Type A\"")); + assertThat(json, containsString("\"meters\":1609.34")); } // tests - enum with custom serializer @@ -75,10 +70,9 @@ public class JacksonSerializationEnumsUnitTest { @Test public final void givenCustomSerializer_whenSerializingEntityWithEnum_thenCorrect() throws JsonParseException, IOException { final ObjectMapper mapper = new ObjectMapper(); - final String enumAsString = mapper.writeValueAsString(new MyDtoWithEnumCustom("a", 1, true, TypeEnumWithCustomSerializer.TYPE1)); + final String enumAsString = mapper.writeValueAsString(new MyDtoWithEnumCustom("a", 1, true, Distance.MILE)); - System.out.println(enumAsString); - assertThat(enumAsString, containsString("\"name\":\"Type A\"")); + assertThat(enumAsString, containsString("\"meters\":1609.34")); } } diff --git a/java-mongodb/.gitignore b/java-mongodb/.gitignore new file mode 100644 index 0000000000..79ba317cb5 --- /dev/null +++ b/java-mongodb/.gitignore @@ -0,0 +1,5 @@ +.classpath +.project +.settings +target +build \ No newline at end of file diff --git a/java-mongodb/pom.xml b/java-mongodb/pom.xml new file mode 100644 index 0000000000..4e5b847a01 --- /dev/null +++ b/java-mongodb/pom.xml @@ -0,0 +1,98 @@ + + + 4.0.0 + + com.baeldung + java-mongodb + 1.0-SNAPSHOT + + + + + junit + junit + ${junit.version} + test + + + + de.flapdoodle.embedmongo + de.flapdoodle.embedmongo + ${flapdoodle.version} + test + + + + + org.mongodb + mongo-java-driver + ${mongo.version} + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + **/*IntegrationTest.java + **/*LongRunningUnitTest.java + **/*ManualTest.java + + true + + + + + + + + integration + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*ManualTest.java + + + **/*IntegrationTest.java + + + + + + + json + + + + + + + + + + 1.8 + 1.8 + 4.12 + 3.4.1 + 1.11 + + 2.19.1 + + + \ No newline at end of file diff --git a/java-mongodb/src/main/java/com/baeldung/MongoExample.java b/java-mongodb/src/main/java/com/baeldung/MongoExample.java new file mode 100644 index 0000000000..9af1e1f6a4 --- /dev/null +++ b/java-mongodb/src/main/java/com/baeldung/MongoExample.java @@ -0,0 +1,53 @@ +package com.baeldung; + +import com.mongodb.BasicDBObject; +import com.mongodb.DB; +import com.mongodb.DBCollection; +import com.mongodb.DBCursor; +import com.mongodb.MongoClient; + +public class MongoExample { + public static void main(String[] args) { + + MongoClient mongoClient = new MongoClient("localhost", 27017); + + DB database = mongoClient.getDB("myMongoDb"); + + // print existing databases + mongoClient.getDatabaseNames().forEach(System.out::println); + + database.createCollection("customers", null); + + // print all collections in customers database + database.getCollectionNames().forEach(System.out::println); + + // create data + DBCollection collection = database.getCollection("customers"); + BasicDBObject document = new BasicDBObject(); + document.put("name", "Shubham"); + document.put("company", "Baeldung"); + collection.insert(document); + + // update data + BasicDBObject query = new BasicDBObject(); + query.put("name", "Shubham"); + BasicDBObject newDocument = new BasicDBObject(); + newDocument.put("name", "John"); + BasicDBObject updateObject = new BasicDBObject(); + updateObject.put("$set", newDocument); + collection.update(query, updateObject); + + // read data + BasicDBObject searchQuery = new BasicDBObject(); + searchQuery.put("name", "John"); + DBCursor cursor = collection.find(searchQuery); + while (cursor.hasNext()) { + System.out.println(cursor.next()); + } + + // delete data + BasicDBObject deleteQuery = new BasicDBObject(); + deleteQuery.put("name", "John"); + collection.remove(deleteQuery); + } +} diff --git a/java-mongodb/src/test/java/com/baeldung/AppIntegrationTest.java b/java-mongodb/src/test/java/com/baeldung/AppIntegrationTest.java new file mode 100644 index 0000000000..94d1a01492 --- /dev/null +++ b/java-mongodb/src/test/java/com/baeldung/AppIntegrationTest.java @@ -0,0 +1,72 @@ +package com.baeldung; + +import static org.junit.Assert.assertEquals; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.mongodb.BasicDBObject; +import com.mongodb.DB; +import com.mongodb.DBCollection; +import com.mongodb.DBCursor; +import com.mongodb.Mongo; + +import de.flapdoodle.embedmongo.MongoDBRuntime; +import de.flapdoodle.embedmongo.MongodExecutable; +import de.flapdoodle.embedmongo.MongodProcess; +import de.flapdoodle.embedmongo.config.MongodConfig; +import de.flapdoodle.embedmongo.distribution.Version; +import de.flapdoodle.embedmongo.runtime.Network; + +public class AppIntegrationTest { + + private static final String DB_NAME = "myMongoDb"; + private MongodExecutable mongodExe; + private MongodProcess mongod; + private Mongo mongo; + private DB db; + private DBCollection collection; + + @Before + public void setup() throws Exception { + // Creating Mongodbruntime instance + MongoDBRuntime runtime = MongoDBRuntime.getDefaultInstance(); + + // Creating MongodbExecutable + mongodExe = runtime.prepare(new MongodConfig(Version.V2_0_1, 12345, Network.localhostIsIPv6())); + + // Starting Mongodb + mongod = mongodExe.start(); + mongo = new Mongo("localhost", 12345); + + // Creating DB + db = mongo.getDB(DB_NAME); + + // Creating collection Object and adding values + collection = db.getCollection("customers"); + } + + @After + public void teardown() throws Exception { + mongod.stop(); + mongodExe.cleanup(); + } + + @Test + public void testAddressPersistance() { + BasicDBObject contact = new BasicDBObject(); + contact.put("name", "John"); + contact.put("company", "Baeldung"); + + // Inserting document + collection.insert(contact); + DBCursor cursorDoc = collection.find(); + BasicDBObject contact1 = new BasicDBObject(); + while (cursorDoc.hasNext()) { + contact1 = (BasicDBObject) cursorDoc.next(); + System.out.println(contact1); + } + assertEquals(contact1.get("name"), "John"); + } +} \ No newline at end of file diff --git a/javax-servlets/README.md b/javax-servlets/README.md new file mode 100644 index 0000000000..d6bc6db8b8 --- /dev/null +++ b/javax-servlets/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Introduction to Java Servlets](http://www.baeldung.com/intro-to-servlets) diff --git a/jee7/pom.xml b/jee7/pom.xml index 66991d03a8..f275f56d58 100644 --- a/jee7/pom.xml +++ b/jee7/pom.xml @@ -10,7 +10,7 @@ war - 1.7 + 1.8 3.0.0 4.12 diff --git a/jee7/src/main/java/com/baeldung/json/Person.java b/jee7/src/main/java/com/baeldung/json/Person.java new file mode 100644 index 0000000000..847597b6f5 --- /dev/null +++ b/jee7/src/main/java/com/baeldung/json/Person.java @@ -0,0 +1,43 @@ +package com.baeldung.json; + +import java.util.Date; +import java.util.List; + +public class Person { + private String firstName; + private String lastName; + private Date birthdate; + private List emails; + + 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 Date getBirthdate() { + return birthdate; + } + + public void setBirthdate(Date birthdate) { + this.birthdate = birthdate; + } + + public List getEmails() { + return emails; + } + + public void setEmails(List emails) { + this.emails = emails; + } +} diff --git a/jee7/src/main/java/com/baeldung/json/PersonBuilder.java b/jee7/src/main/java/com/baeldung/json/PersonBuilder.java new file mode 100644 index 0000000000..a9ac4032ce --- /dev/null +++ b/jee7/src/main/java/com/baeldung/json/PersonBuilder.java @@ -0,0 +1,42 @@ +package com.baeldung.json; + +import javax.json.*; +import java.io.IOException; +import java.io.StringReader; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.List; +import java.util.stream.Collectors; + +public class PersonBuilder { + private String jsonString; + + private SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy"); + + public PersonBuilder(String jsonString) { + this.jsonString = jsonString; + } + + public Person build() throws IOException, ParseException { + JsonReader reader = Json.createReader(new StringReader(jsonString)); + + JsonObject jsonObject = reader.readObject(); + + Person person = new Person(); + + person.setFirstName(jsonObject.getString("firstName")); + person.setLastName(jsonObject.getString("lastName")); + person.setBirthdate(dateFormat.parse(jsonObject.getString("birthdate"))); + + JsonArray emailsJson = jsonObject.getJsonArray("emails"); + + List emails = emailsJson.getValuesAs(JsonString.class).stream() + .map(JsonString::getString) + .collect(Collectors.toList()); + + person.setEmails(emails); + + return person; + } + +} diff --git a/jee7/src/main/java/com/baeldung/json/PersonWriter.java b/jee7/src/main/java/com/baeldung/json/PersonWriter.java new file mode 100644 index 0000000000..7b6f82e23b --- /dev/null +++ b/jee7/src/main/java/com/baeldung/json/PersonWriter.java @@ -0,0 +1,60 @@ +package com.baeldung.json; + +import javax.json.*; +import javax.json.stream.JsonGenerator; +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; +import java.text.SimpleDateFormat; +import java.util.HashMap; +import java.util.Map; + +public class PersonWriter { + private Person person; + + private SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy"); + + public PersonWriter(Person person) { + this.person = person; + } + + public String write() throws IOException { + JsonObjectBuilder objectBuilder = Json + .createObjectBuilder() + .add("firstName", person.getFirstName()) + .add("lastName", person.getLastName()) + .add("birthdate", dateFormat.format(person.getBirthdate())); + + final JsonArrayBuilder arrayBuilder = Json.createArrayBuilder(); + + person.getEmails().forEach(arrayBuilder::add); + + objectBuilder.add("emails", arrayBuilder); + + JsonObject jsonObject = objectBuilder.build(); + + JsonWriterFactory writerFactory = createWriterFactory(); + + return writeToString(jsonObject, writerFactory); + + } + + private String writeToString(JsonObject jsonObject, JsonWriterFactory writerFactory) throws IOException { + String jsonString; + try (Writer writer = new StringWriter()) { + writerFactory + .createWriter(writer) + .write(jsonObject); + jsonString = writer.toString(); + } + return jsonString; + } + + private JsonWriterFactory createWriterFactory() { + Map config = new HashMap<>(); + + config.put(JsonGenerator.PRETTY_PRINTING, true); + + return Json.createWriterFactory(config); + } +} diff --git a/jee7/src/test/java/com/baeldug/json/JsonUnitTest.java b/jee7/src/test/java/com/baeldug/json/JsonUnitTest.java new file mode 100644 index 0000000000..04e9cef766 --- /dev/null +++ b/jee7/src/test/java/com/baeldug/json/JsonUnitTest.java @@ -0,0 +1,135 @@ +package com.baeldug.json; + +import static org.hamcrest.CoreMatchers.hasItems; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; + +import java.io.IOException; +import java.io.StringReader; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Arrays; + +import javax.json.Json; +import javax.json.JsonObject; +import javax.json.JsonReader; +import javax.json.stream.JsonParser; +import javax.json.stream.JsonParser.Event; + +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.json.Person; +import com.baeldung.json.PersonBuilder; +import com.baeldung.json.PersonWriter; + +public class JsonUnitTest { + private Person person; + + private SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy"); + private String personJson; + private String petshopJson; + + @Test + public void whenPersonIsConvertedToString_thenAValidJsonStringIsReturned() throws IOException { + String generatedJsonString = new PersonWriter(person).write(); + + assertEquals( + "Generated String has the expected format and content", + personJson, + generatedJsonString); + } + + @Test + public void whenJsonStringIsConvertedToPerson_thenAValidObjectIsReturned( + ) throws IOException, ParseException { + Person person = new PersonBuilder(personJson).build(); + + assertEquals("First name has expected value", "Michael", person.getFirstName()); + assertEquals("Last name has expected value", "Scott", person.getLastName()); + assertEquals( + "Birthdate has expected value", + dateFormat.parse("06/15/1978"), + person.getBirthdate()); + assertThat( + "Email list has two items", + person.getEmails(), + hasItems("michael.scott@dd.com", "michael.scarn@gmail.com")); + } + + @Test + public void whenUsingObjectModelToQueryForSpecificProperty_thenExpectedValueIsReturned( + ) throws IOException, ParseException { + JsonReader reader = Json.createReader(new StringReader(petshopJson)); + + JsonObject jsonObject = reader.readObject(); + + assertEquals( + "The query should return the 'name' property of the third pet from the list", + "Jake", + jsonObject.getJsonArray("pets").getJsonObject(2).getString("name")); + } + + @Test + public void whenUsingStreamingApiToQueryForSpecificProperty_thenExpectedValueIsReturned( + ) throws IOException, ParseException { + JsonParser jsonParser = Json.createParser(new StringReader(petshopJson)); + + int count = 0; + String result = null; + + while(jsonParser.hasNext()) { + Event e = jsonParser.next(); + + if (e == Event.KEY_NAME) { + if(jsonParser.getString().equals("name")) { + jsonParser.next(); + + if(++count == 3) { + result = jsonParser.getString(); + break; + } + } + } + } + + assertEquals( + "The query should return the 'name' property of the third pet from the list", + "Jake", + result); + } + + @Before + public void init() throws ParseException { + // Creates a Person object + person = new Person(); + + person.setFirstName("Michael"); + person.setLastName("Scott"); + person.setBirthdate(dateFormat.parse("06/15/1978")); + person.setEmails(Arrays.asList("michael.scott@dd.com", "michael.scarn@gmail.com")); + + // Initializes the Person Json + personJson = "\n" + + "{\n" + + " \"firstName\":\"Michael\",\n" + + " \"lastName\":\"Scott\",\n" + + " \"birthdate\":\"06/15/1978\",\n" + + " \"emails\":[\n" + + " \"michael.scott@dd.com\",\n" + + " \"michael.scarn@gmail.com\"\n" + + " ]\n" + + "}"; + + // Initializes the Pet Shop Json + petshopJson = "\n" + + "{\n" + + " \"ownerId\":\"1\", \n" + + " \"pets\":[ \n" + + " {\"name\": \"Kitty\", \"type\": \"cat\"}, \n" + + " {\"name\": \"Rex\", \"type\": \"dog\"}, \n" + + " {\"name\": \"Jake\", \"type\": \"dog\"} \n" + + " ]\n" + + "}"; + } +} diff --git a/jsoup/README.md b/jsoup/README.md new file mode 100644 index 0000000000..8728cc7c4e --- /dev/null +++ b/jsoup/README.md @@ -0,0 +1,10 @@ +========= + +## jsoup Example Project + +### Relevant Articles: +- [Parsing HTML in Java with Jsoup](http://www.baeldung.com/java-with-jsoup) + +### Build the Project + +mvn clean install diff --git a/jsoup/pom.xml b/jsoup/pom.xml index 989f30422c..25551cb3d6 100644 --- a/jsoup/pom.xml +++ b/jsoup/pom.xml @@ -15,15 +15,16 @@ ${jsoup.version} - commons-io - commons-io - ${commons.io.version} + junit + junit + 4.12 + test 1.8 1.8 - 2.5 - 1.10.1 + + 1.10.2
diff --git a/jsoup/src/main/java/com/baeldung/jsoup/JsoupExample.java b/jsoup/src/test/java/com/baeldung/jsoup/JsoupParserTest.java similarity index 59% rename from jsoup/src/main/java/com/baeldung/jsoup/JsoupExample.java rename to jsoup/src/test/java/com/baeldung/jsoup/JsoupParserTest.java index 10431a621d..ba6d7358bc 100644 --- a/jsoup/src/main/java/com/baeldung/jsoup/JsoupExample.java +++ b/jsoup/src/test/java/com/baeldung/jsoup/JsoupParserTest.java @@ -1,47 +1,52 @@ package com.baeldung.jsoup; -import java.io.File; -import java.io.IOException; -import org.apache.commons.io.FileUtils; import org.jsoup.HttpStatusException; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.parser.Tag; import org.jsoup.select.Elements; +import org.junit.Before; +import org.junit.Test; -public class JsoupExample { +import java.io.IOException; - public static void main(String[] args) throws IOException { - scrapeSpringBlog(); +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class JsoupParserTest { + + Document doc; + + @Before + public void setUp() throws IOException { + doc = Jsoup.connect("https://spring.io/blog").get(); } - static void scrapeSpringBlog() throws IOException { - String blogUrl = "https://spring.io/blog"; - Document doc = Jsoup.connect(blogUrl).get(); - + @Test + public void loadDocument404() throws IOException { try { - Document doc404 = Jsoup.connect("https://spring.io/will-not-be-found").get(); + doc = Jsoup.connect("https://spring.io/will-not-be-found").get(); } catch (HttpStatusException ex) { - System.out.println(ex.getMessage()); + assertEquals(404, ex.getStatusCode()); } + } - Document docCustomConn = Jsoup.connect(blogUrl).userAgent("Mozilla").get(); - docCustomConn = Jsoup.connect(blogUrl).timeout(5000).get(); - docCustomConn = Jsoup.connect(blogUrl).cookie("cookiename", "val234").get(); - // docCustomConn = Jsoup.connect(blogUrl).data("datakey", "datavalue").post(); - docCustomConn = Jsoup.connect(blogUrl).header("headersecurity", "xyz123").get(); - - docCustomConn = Jsoup.connect(blogUrl) + @Test + public void loadDocumentCustomized() throws IOException { + doc = Jsoup.connect("https://spring.io/blog") .userAgent("Mozilla") .timeout(5000) .cookie("cookiename", "val234") .cookie("anothercookie", "ilovejsoup") + .referrer("http://google.com") .header("headersecurity", "xyz123") .get(); + } + @Test + public void examplesSelectors() { Elements links = doc.select("a"); - Elements sections = doc.select("section"); Elements logo = doc.select(".spring-logo--container"); Elements pagination = doc.select("#pagination_control"); Elements divsDescendant = doc.select("header div"); @@ -50,6 +55,15 @@ public class JsoupExample { Element pag = doc.getElementById("pagination_control"); Elements desktopOnly = doc.getElementsByClass("desktopOnly"); + Elements sections = doc.select("section"); + Element firstSection = sections.first(); + Elements sectionParagraphs = firstSection.select(".paragraph"); + } + + @Test + public void examplesTraversing() { + Elements sections = doc.select("section"); + Element firstSection = sections.first(); Element lastSection = sections.last(); Element secondSection = sections.get(2); @@ -58,10 +72,11 @@ public class JsoupExample { Elements children = firstSection.children(); Elements siblings = firstSection.siblingElements(); - sections.stream().forEach(el -> System.out.println("section: " + el)); - - Elements sectionParagraphs = firstSection.select(".paragraph"); + sections.forEach(el -> System.out.println("section: " + el)); + } + @Test + public void examplesExtracting() { Element firstArticle = doc.select("article").first(); Element timeElement = firstArticle.select("time").first(); String dateTimeOfFirstArticle = timeElement.attr("datetime"); @@ -69,21 +84,28 @@ public class JsoupExample { String sectionDivText = sectionDiv.text(); String articleHtml = firstArticle.html(); String outerHtml = firstArticle.outerHtml(); + } + @Test + public void examplesModifying() { + Element firstArticle = doc.select("article").first(); + Element timeElement = firstArticle.select("time").first(); + Element sectionDiv = firstArticle.select("section div").first(); + + String dateTimeOfFirstArticle = timeElement.attr("datetime"); timeElement.attr("datetime", "2016-12-16 15:19:54.3"); sectionDiv.text("foo bar"); firstArticle.select("h2").html("
"); Element link = new Element(Tag.valueOf("a"), "") - .text("Checkout this amazing website!") - .attr("href", "http://baeldung.com") - .attr("target", "_blank"); + .text("Checkout this amazing website!") + .attr("href", "http://baeldung.com") + .attr("target", "_blank"); firstArticle.appendChild(link); doc.select("li.navbar-link").remove(); firstArticle.select("img").remove(); - File indexFile = new File("/tmp", "spring_blog_home.html"); - FileUtils.writeStringToFile(indexFile, doc.html(), doc.charset()); + assertTrue(doc.html().contains("http://baeldung.com")); } } diff --git a/kotlin/pom.xml b/kotlin/pom.xml new file mode 100644 index 0000000000..eba248e1b9 --- /dev/null +++ b/kotlin/pom.xml @@ -0,0 +1,65 @@ + + + 4.0.0 + + com.baeldung + kotlin + 1.0-SNAPSHOT + + + + org.jetbrains.kotlin + kotlin-stdlib + ${kotlin-stdlib.version} + + + org.jetbrains.kotlin + kotlin-test-junit + ${kotlin-test-junit.version} + test + + + junit + junit + ${junit.version} + test + + + + + ${project.basedir}/src/main/kotlin + ${project.basedir}/src/test/kotlin + + + kotlin-maven-plugin + org.jetbrains.kotlin + ${kotlin-maven-plugin.version} + + + compile + + compile + + + + + test-compile + + test-compile + + + + + + + + + 4.12 + 1.0.4 + 1.0.4 + 1.0.4 + + + \ No newline at end of file diff --git a/kotlin/src/main/kotlin/com/baeldung/kotlin/Example1.kt b/kotlin/src/main/kotlin/com/baeldung/kotlin/Example1.kt new file mode 100644 index 0000000000..bca1e54a6c --- /dev/null +++ b/kotlin/src/main/kotlin/com/baeldung/kotlin/Example1.kt @@ -0,0 +1,5 @@ +package com.baeldung.kotlin + +fun main(args: Array){ + println("hello word") +} diff --git a/kotlin/src/main/kotlin/com/baeldung/kotlin/Item.kt b/kotlin/src/main/kotlin/com/baeldung/kotlin/Item.kt new file mode 100644 index 0000000000..36994e4994 --- /dev/null +++ b/kotlin/src/main/kotlin/com/baeldung/kotlin/Item.kt @@ -0,0 +1,14 @@ +package com.baeldung.kotlin + +open class Item(val id: String, val name: String = "unknown_name") { + open fun getIdOfItem(): String { + return id + } +} + +class ItemWithCategory(id: String, name: String, val categoryId: String) : Item(id, name) { + override fun getIdOfItem(): String { + return id + name + } +} + diff --git a/kotlin/src/main/kotlin/com/baeldung/kotlin/ItemService.kt b/kotlin/src/main/kotlin/com/baeldung/kotlin/ItemService.kt new file mode 100644 index 0000000000..3c0d2eacb1 --- /dev/null +++ b/kotlin/src/main/kotlin/com/baeldung/kotlin/ItemService.kt @@ -0,0 +1,66 @@ +package com.baeldung.kotlin + +import java.util.* + +class ItemService { + fun findItemNameForId(id: String): Item? { + val itemId = UUID.randomUUID().toString() + return Item(itemId, "name-$itemId") + } +} + +class ItemManager(val categoryId: String, val dbConnection: String) { + var email = "" + + constructor(categoryId: String, dbConnection: String, email: String) + : this(categoryId, dbConnection) { + this.email = email + } + + fun isFromSpecificCategory(catId: String): Boolean { + return categoryId == catId + } + + fun makeAnalyisOfCategory(catId: String): Unit { + val result = if (catId == "100") "Yes" else "No" + println(result) + + } +} + +fun main(args: Array) { + val numbers = arrayOf("first", "second", "third", "fourth") + + var concat = "" + for (n in numbers) { + concat += n + } + + var sum = 0 + for (i in 2..9) { + sum += i + } + + val firstName = "Tom" + val secondName = "Mary" + val concatOfNames = "$firstName + $secondName" + println("Names: $concatOfNames") + + val itemManager = ItemManager("cat_id", "db://connection") + val result = "function result: ${itemManager.isFromSpecificCategory("1")}" + println(result) + + val number = 2 + if (number < 10) { + println("number less that 10") + } else if (number > 10) { + println("number is greater that 10") + } + + val name = "John" + when (name) { + "John" -> println("Hi man") + "Alice" -> println("Hi lady") + } + +} \ No newline at end of file diff --git a/kotlin/src/main/kotlin/com/baeldung/kotlin/ListExtension.kt b/kotlin/src/main/kotlin/com/baeldung/kotlin/ListExtension.kt new file mode 100644 index 0000000000..da1773b7c9 --- /dev/null +++ b/kotlin/src/main/kotlin/com/baeldung/kotlin/ListExtension.kt @@ -0,0 +1,14 @@ +package com.baeldung.kotlin + +import java.util.concurrent.ThreadLocalRandom + +class ListExtension { + fun List.random(): T? { + if (this.isEmpty()) return null + return get(ThreadLocalRandom.current().nextInt(count())) + } + + fun getRandomElementOfList(list: List): T? { + return list.random() + } +} \ No newline at end of file diff --git a/kotlin/src/test/kotlin/com/baeldung/kotlin/ItemServiceTest.kt b/kotlin/src/test/kotlin/com/baeldung/kotlin/ItemServiceTest.kt new file mode 100644 index 0000000000..3d730b1283 --- /dev/null +++ b/kotlin/src/test/kotlin/com/baeldung/kotlin/ItemServiceTest.kt @@ -0,0 +1,20 @@ +package com.baeldung.kotlin + +import org.junit.Test +import kotlin.test.assertNotNull + +class ItemServiceTest { + @Test + fun givenItemId_whenGetForOptionalItem_shouldMakeActionOnNonNullValue() { + //given + val id = "item_id" + val itemService = ItemService() + + //when + val result = itemService.findItemNameForId(id) + + //then + assertNotNull(result?.let { it -> it.id }) + assertNotNull(result!!.id) + } +} \ No newline at end of file diff --git a/kotlin/src/test/kotlin/com/baeldung/kotlin/ListExtensionTest.kt b/kotlin/src/test/kotlin/com/baeldung/kotlin/ListExtensionTest.kt new file mode 100644 index 0000000000..7a496e7437 --- /dev/null +++ b/kotlin/src/test/kotlin/com/baeldung/kotlin/ListExtensionTest.kt @@ -0,0 +1,19 @@ +package com.baeldung.kotlin + +import com.baeldung.kotlin.ListExtension +import org.junit.Test +import kotlin.test.assertTrue + +class ListExtensionTest { + @Test + fun givenList_whenExecuteExtensionFunctionOnList_shouldReturnRandomElementOfList(){ + //given + val elements = listOf("a", "b", "c") + + //when + val result = ListExtension().getRandomElementOfList(elements) + + //then + assertTrue(elements.contains(result)) + } +} \ No newline at end of file diff --git a/metrics/pom.xml b/metrics/pom.xml new file mode 100644 index 0000000000..0f5cb2f135 --- /dev/null +++ b/metrics/pom.xml @@ -0,0 +1,75 @@ + + + 4.0.0 + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + + metrics + + + + 3.1.2 + 3.1.0 + 4.12 + + 3.6.0 + 1.8 + 1.8 + + + + + io.dropwizard.metrics + metrics-core + ${dep.ver.metrics} + + + io.dropwizard.metrics + metrics-healthchecks + ${dep.ver.metrics} + + + io.dropwizard.metrics + metrics-servlets + ${dep.ver.metrics} + + + io.dropwizard.metrics + metrics-servlet + ${dep.ver.metrics} + + + javax.servlet + javax.servlet-api + ${dep.ver.servlet} + + + junit + junit + ${dep.ver.junit} + test + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven.compiler-plugin.version} + + ${maven.compiler.source} + ${maven.compiler.target} + + + + + + diff --git a/metrics/src/main/java/com/baeldung/metrics/core/ActiveUserCountGauge.java b/metrics/src/main/java/com/baeldung/metrics/core/ActiveUserCountGauge.java new file mode 100644 index 0000000000..f14e7b520a --- /dev/null +++ b/metrics/src/main/java/com/baeldung/metrics/core/ActiveUserCountGauge.java @@ -0,0 +1,17 @@ +package com.baeldung.metrics.core; + +import java.util.List; + +import com.codahale.metrics.DerivativeGauge; +import com.codahale.metrics.Gauge; + +public class ActiveUserCountGauge extends DerivativeGauge, Integer> { + public ActiveUserCountGauge(Gauge> base) { + super(base); + } + + @Override + protected Integer transform(List value) { + return value.size(); + } +} diff --git a/metrics/src/main/java/com/baeldung/metrics/core/ActiveUsersGauge.java b/metrics/src/main/java/com/baeldung/metrics/core/ActiveUsersGauge.java new file mode 100644 index 0000000000..79ac132e0b --- /dev/null +++ b/metrics/src/main/java/com/baeldung/metrics/core/ActiveUsersGauge.java @@ -0,0 +1,25 @@ +package com.baeldung.metrics.core; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import com.codahale.metrics.CachedGauge; + +public class ActiveUsersGauge extends CachedGauge> { + public ActiveUsersGauge(long timeout, TimeUnit timeoutUnit) { + super(timeout, timeoutUnit); + } + + @Override + protected List loadValue() { + return getActiveUserCount(); + } + + private List getActiveUserCount() { + // mock reading from database and count the active users, return a fixed value + List result = new ArrayList(); + result.add(12L); + return result; + } +} diff --git a/metrics/src/main/java/com/baeldung/metrics/core/AttendanceRatioGauge.java b/metrics/src/main/java/com/baeldung/metrics/core/AttendanceRatioGauge.java new file mode 100644 index 0000000000..e4cdca6b0a --- /dev/null +++ b/metrics/src/main/java/com/baeldung/metrics/core/AttendanceRatioGauge.java @@ -0,0 +1,18 @@ +package com.baeldung.metrics.core; + +import com.codahale.metrics.RatioGauge; + +public class AttendanceRatioGauge extends RatioGauge { + private int attendanceCount; + private int courseCount; + + public AttendanceRatioGauge(int attendanceCount, int courseCount) { + this.attendanceCount = attendanceCount; + this.courseCount = courseCount; + } + + @Override + protected Ratio getRatio() { + return Ratio.of(attendanceCount, courseCount); + } +} diff --git a/metrics/src/main/java/com/baeldung/metrics/healthchecks/DatabaseHealthCheck.java b/metrics/src/main/java/com/baeldung/metrics/healthchecks/DatabaseHealthCheck.java new file mode 100644 index 0000000000..2ecce4f9f5 --- /dev/null +++ b/metrics/src/main/java/com/baeldung/metrics/healthchecks/DatabaseHealthCheck.java @@ -0,0 +1,10 @@ +package com.baeldung.metrics.healthchecks; + +import com.codahale.metrics.health.HealthCheck; + +public class DatabaseHealthCheck extends HealthCheck { + @Override + protected Result check() throws Exception { + return Result.healthy(); + } +} diff --git a/metrics/src/main/java/com/baeldung/metrics/healthchecks/UserCenterHealthCheck.java b/metrics/src/main/java/com/baeldung/metrics/healthchecks/UserCenterHealthCheck.java new file mode 100644 index 0000000000..481ced142d --- /dev/null +++ b/metrics/src/main/java/com/baeldung/metrics/healthchecks/UserCenterHealthCheck.java @@ -0,0 +1,10 @@ +package com.baeldung.metrics.healthchecks; + +import com.codahale.metrics.health.HealthCheck; + +public class UserCenterHealthCheck extends HealthCheck { + @Override + protected Result check() throws Exception { + return Result.healthy(); + } +} diff --git a/metrics/src/main/java/com/baeldung/metrics/servlet/MyInstrumentedFilterContextListener.java b/metrics/src/main/java/com/baeldung/metrics/servlet/MyInstrumentedFilterContextListener.java new file mode 100644 index 0000000000..3036eeeb23 --- /dev/null +++ b/metrics/src/main/java/com/baeldung/metrics/servlet/MyInstrumentedFilterContextListener.java @@ -0,0 +1,13 @@ +package com.baeldung.metrics.servlet; + +import com.codahale.metrics.MetricRegistry; +import com.codahale.metrics.servlet.InstrumentedFilterContextListener; + +public class MyInstrumentedFilterContextListener extends InstrumentedFilterContextListener { + public static final MetricRegistry REGISTRY = new MetricRegistry(); + + @Override + protected MetricRegistry getMetricRegistry() { + return REGISTRY; + } +} diff --git a/metrics/src/main/java/com/baeldung/metrics/servlets/MyHealthCheckServletContextListener.java b/metrics/src/main/java/com/baeldung/metrics/servlets/MyHealthCheckServletContextListener.java new file mode 100644 index 0000000000..12f12b3e6f --- /dev/null +++ b/metrics/src/main/java/com/baeldung/metrics/servlets/MyHealthCheckServletContextListener.java @@ -0,0 +1,18 @@ +package com.baeldung.metrics.servlets; + +import com.baeldung.metrics.healthchecks.DatabaseHealthCheck; +import com.codahale.metrics.health.HealthCheckRegistry; +import com.codahale.metrics.servlets.HealthCheckServlet; + +public class MyHealthCheckServletContextListener extends HealthCheckServlet.ContextListener { + public static final HealthCheckRegistry HEALTH_CHECK_REGISTRY = new HealthCheckRegistry(); + + static { + HEALTH_CHECK_REGISTRY.register("db", new DatabaseHealthCheck()); + } + + @Override + protected HealthCheckRegistry getHealthCheckRegistry() { + return HEALTH_CHECK_REGISTRY; + } +} diff --git a/metrics/src/main/java/com/baeldung/metrics/servlets/MyMetricsServletContextListener.java b/metrics/src/main/java/com/baeldung/metrics/servlets/MyMetricsServletContextListener.java new file mode 100644 index 0000000000..7b4f33447a --- /dev/null +++ b/metrics/src/main/java/com/baeldung/metrics/servlets/MyMetricsServletContextListener.java @@ -0,0 +1,25 @@ +package com.baeldung.metrics.servlets; + +import com.codahale.metrics.Counter; +import com.codahale.metrics.Histogram; +import com.codahale.metrics.MetricRegistry; +import com.codahale.metrics.servlets.MetricsServlet; + +public class MyMetricsServletContextListener extends MetricsServlet.ContextListener { + private static final MetricRegistry METRIC_REGISTRY = new MetricRegistry(); + + static { + Counter counter = METRIC_REGISTRY.counter("m01-counter"); + counter.inc(); + + Histogram histogram = METRIC_REGISTRY.histogram("m02-histogram"); + histogram.update(5); + histogram.update(20); + histogram.update(100); + } + + @Override + protected MetricRegistry getMetricRegistry() { + return METRIC_REGISTRY; + } +} diff --git a/metrics/src/test/java/com/baeldung/metrics/core/MetricsTest.java b/metrics/src/test/java/com/baeldung/metrics/core/MetricsTest.java new file mode 100644 index 0000000000..f670acfaef --- /dev/null +++ b/metrics/src/test/java/com/baeldung/metrics/core/MetricsTest.java @@ -0,0 +1,152 @@ +package com.baeldung.metrics.core; + +import com.codahale.metrics.*; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; + +public class MetricsTest { + @Test + public void whenMarkMeter_thenCorrectRates() throws InterruptedException { + Meter meter = new Meter(); + long initCount = meter.getCount(); + + assertThat(initCount, equalTo(0L)); + + meter.mark(); + + assertThat(meter.getCount(), equalTo(1L)); + + meter.mark(20); + + assertThat(meter.getCount(), equalTo(21L)); + + // not use assert for these rate values because they change every time when this test is run + double meanRate = meter.getMeanRate(); + double oneMinRate = meter.getOneMinuteRate(); + double fiveMinRate = meter.getFiveMinuteRate(); + double fifteenMinRate = meter.getFifteenMinuteRate(); + System.out.println(meanRate); + System.out.println(oneMinRate); + System.out.println(fiveMinRate); + System.out.println(fifteenMinRate); + } + + @Test + public void whenInitRatioGauge_thenCorrectRatio() { + Gauge ratioGauge = new AttendanceRatioGauge(15, 20); + + assertThat(ratioGauge.getValue(), equalTo(0.75)); + } + + @Test + public void whenUseCacheGauge_thenCorrectGauge() { + Gauge> activeUsersGauge = new ActiveUsersGauge(15, TimeUnit.MINUTES); + List expected = new ArrayList(); + expected.add(12L); + + assertThat(activeUsersGauge.getValue(), equalTo(expected)); + } + + @Test + public void whenUseDerivativeGauge_thenCorrectGaugeFromBase() { + Gauge> activeUsersGauge = new ActiveUsersGauge(15, TimeUnit.MINUTES); + Gauge activeUserCountGauge = new ActiveUserCountGauge(activeUsersGauge); + + assertThat(activeUserCountGauge.getValue(), equalTo(1)); + } + + @Test + public void whenIncDecCounter_thenCorrectCount() { + Counter counter = new Counter(); + long initCount = counter.getCount(); + + assertThat(initCount, equalTo(0L)); + + counter.inc(); + + assertThat(counter.getCount(), equalTo(1L)); + + counter.inc(11); + + assertThat(counter.getCount(), equalTo(12L)); + + counter.dec(); + + assertThat(counter.getCount(), equalTo(11L)); + + counter.dec(6); + + assertThat(counter.getCount(), equalTo(5L)); + } + + @Test + public void whenUpdateHistogram_thenCorrectDistributionData() { + Histogram histogram = new Histogram(new UniformReservoir()); + histogram.update(5); + long count1 = histogram.getCount(); + + assertThat(count1, equalTo(1L)); + + Snapshot snapshot1 = histogram.getSnapshot(); + assertThat(snapshot1.getValues().length, equalTo(1)); + assertThat(snapshot1.getValues()[0], equalTo(5L)); + assertThat(snapshot1.getMax(), equalTo(5L)); + assertThat(snapshot1.getMin(), equalTo(5L)); + assertThat(snapshot1.getMean(), equalTo(5.0)); + assertThat(snapshot1.getMedian(), equalTo(5.0)); + assertThat(snapshot1.getStdDev(), equalTo(0.0)); + assertThat(snapshot1.get75thPercentile(), equalTo(5.0)); + assertThat(snapshot1.get95thPercentile(), equalTo(5.0)); + assertThat(snapshot1.get98thPercentile(), equalTo(5.0)); + assertThat(snapshot1.get99thPercentile(), equalTo(5.0)); + assertThat(snapshot1.get999thPercentile(), equalTo(5.0)); + + histogram.update(20); + long count2 = histogram.getCount(); + + assertThat(count2, equalTo(2L)); + + Snapshot snapshot2 = histogram.getSnapshot(); + + assertThat(snapshot2.getValues().length, equalTo(2)); + assertThat(snapshot2.getValues()[0], equalTo(5L)); + assertThat(snapshot2.getValues()[1], equalTo(20L)); + assertThat(snapshot2.getMax(), equalTo(20L)); + assertThat(snapshot2.getMin(), equalTo(5L)); + assertThat(snapshot2.getMean(), equalTo(12.5)); + assertThat(snapshot2.getMedian(), equalTo(12.5)); + assertEquals(10.6, snapshot2.getStdDev(), 0.1); + assertThat(snapshot2.get75thPercentile(), equalTo(20.0)); + assertThat(snapshot2.get95thPercentile(), equalTo(20.0)); + assertThat(snapshot2.get98thPercentile(), equalTo(20.0)); + assertThat(snapshot2.get99thPercentile(), equalTo(20.0)); + assertThat(snapshot2.get999thPercentile(), equalTo(20.0)); + } + + @Test + public void whenUseTimer_thenCorrectTimerContexts() throws InterruptedException { + Timer timer = new Timer(); + Timer.Context context1 = timer.time(); + TimeUnit.SECONDS.sleep(5); + + long elapsed1 = context1.stop(); + + assertEquals(5000000000L, elapsed1, 10000000); + assertThat(timer.getCount(), equalTo(1L)); + assertEquals(0.2, timer.getMeanRate(), 0.1); + + Timer.Context context2 = timer.time(); + TimeUnit.SECONDS.sleep(2); + context2.close(); + + assertThat(timer.getCount(), equalTo(2L)); + assertEquals(0.3, timer.getMeanRate(), 0.1); + } +} diff --git a/metrics/src/test/java/com/baeldung/metrics/core/ReporterTest.java b/metrics/src/test/java/com/baeldung/metrics/core/ReporterTest.java new file mode 100644 index 0000000000..7f8b1422e6 --- /dev/null +++ b/metrics/src/test/java/com/baeldung/metrics/core/ReporterTest.java @@ -0,0 +1,33 @@ +package com.baeldung.metrics.core; + +import java.util.concurrent.TimeUnit; + +import org.junit.Test; + +import com.codahale.metrics.*; + +public class ReporterTest { + @Test + public void whenConsoleReporter_thenOutputReport() { + MetricRegistry metricRegistry = new MetricRegistry(); + + Meter meter = metricRegistry.meter("meter"); + meter.mark(); + meter.mark(200); + Histogram histogram = metricRegistry.histogram("histogram"); + histogram.update(12); + histogram.update(17); + histogram.update(20); + Counter counter = metricRegistry.counter("counter"); + counter.inc(); + counter.dec(); + counter.inc(); + counter.inc(); + counter.inc(); + counter.inc(); + + ConsoleReporter reporter = ConsoleReporter.forRegistry(metricRegistry).build(); + reporter.start(5, TimeUnit.MICROSECONDS); + reporter.report(); + } +} diff --git a/metrics/src/test/java/com/baeldung/metrics/healthchecks/HealthCheckTest.java b/metrics/src/test/java/com/baeldung/metrics/healthchecks/HealthCheckTest.java new file mode 100644 index 0000000000..b1b2cc2ff9 --- /dev/null +++ b/metrics/src/test/java/com/baeldung/metrics/healthchecks/HealthCheckTest.java @@ -0,0 +1,35 @@ +package com.baeldung.metrics.healthchecks; + +import com.codahale.metrics.health.HealthCheck; +import com.codahale.metrics.health.HealthCheckRegistry; +import org.junit.Test; + +import java.util.Map; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +public class HealthCheckTest { + + @Test + public void whenUseHealthCheck_thenHealthChecked() { + HealthCheckRegistry healthCheckRegistry = new HealthCheckRegistry(); + + healthCheckRegistry.register("db", new DatabaseHealthCheck()); + healthCheckRegistry.register("uc", new UserCenterHealthCheck()); + + assertThat(healthCheckRegistry.getNames().size(), equalTo(2)); + + Map results = healthCheckRegistry.runHealthChecks(); + + assertFalse(results.isEmpty()); + + results.forEach((k, v) -> assertTrue(v.isHealthy())); + + healthCheckRegistry.unregister("uc"); + + assertThat(healthCheckRegistry.getNames().size(), equalTo(1)); + } +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 30503a0a9a..661b80fca5 100644 --- a/pom.xml +++ b/pom.xml @@ -1,6 +1,5 @@ - + 4.0.0 com.baeldung parent-modules @@ -69,12 +68,15 @@ jsoup junit5 + kotlin + log-mdc log4j log4j2 lombok mapstruct + metrics mockito mocks @@ -92,6 +94,7 @@ resteasy selenium-junit-testng + spark-java spring-akka spring-amqp spring-all @@ -118,6 +121,7 @@ spring-hibernate3 spring-hibernate4 spring-integration + spring-jersey spring-jms spring-jooq spring-jpa @@ -161,6 +165,7 @@ spring-security-rest spring-security-x509 spring-session + spring-sleuth spring-social-login spring-spel spring-thymeleaf @@ -175,6 +180,7 @@ xml xmlunit2 xstream - + java-mongodb + - + \ No newline at end of file diff --git a/redis/README.md b/redis/README.md new file mode 100644 index 0000000000..3ce9031b62 --- /dev/null +++ b/redis/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Intro to Jedis – the Java Redis Client Library](http://www.baeldung.com/jedis-java-redis-client-library) diff --git a/selenium-junit-testng/README.md b/selenium-junit-testng/README.md new file mode 100644 index 0000000000..f34081ccea --- /dev/null +++ b/selenium-junit-testng/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Guide to Selenium with JUnit / TestNG](http://www.baeldung.com/java-selenium-with-junit-and-testng) diff --git a/spark-java/pom.xml b/spark-java/pom.xml new file mode 100644 index 0000000000..5b8923322a --- /dev/null +++ b/spark-java/pom.xml @@ -0,0 +1,29 @@ + + + 4.0.0 + com.baeldung + spark-java + 0.1.0-SNAPSHOT + spark-java + http://maven.apache.org + + UTF-8 + 1.8 + 1.8 + + + + com.sparkjava + spark-core + 2.5.4 + + + + com.google.code.gson + gson + 2.8.0 + + + diff --git a/spark-java/src/main/java/com/baeldung/sparkjava/HelloWorldService.java b/spark-java/src/main/java/com/baeldung/sparkjava/HelloWorldService.java new file mode 100644 index 0000000000..55b3fbe3f2 --- /dev/null +++ b/spark-java/src/main/java/com/baeldung/sparkjava/HelloWorldService.java @@ -0,0 +1,12 @@ +package com.baeldung.sparkjava; +import static spark.Spark.*; + +public class HelloWorldService { + public static void main(String[] args) { + get("/hello", (req,res)->"Hello, Baeldung"); + + get("/hello/:name", (req,res)->{ + return "Hello: "+ req.params(":name"); + }); + } +} diff --git a/spark-java/src/main/java/com/baeldung/sparkjava/SparkRestExample.java b/spark-java/src/main/java/com/baeldung/sparkjava/SparkRestExample.java new file mode 100644 index 0000000000..bb610fd7f0 --- /dev/null +++ b/spark-java/src/main/java/com/baeldung/sparkjava/SparkRestExample.java @@ -0,0 +1,76 @@ +package com.baeldung.sparkjava; + +import static spark.Spark.delete; +import static spark.Spark.get; +import static spark.Spark.options; +import static spark.Spark.post; +import static spark.Spark.put; + +import com.google.gson.Gson; + +public class SparkRestExample { + public static void main(String[] args) { + final UserService userService = new UserServiceMapImpl(); + + post("/users", (request, response) -> { + response.type("application/json"); + + User user = new Gson().fromJson(request.body(), User.class); + userService.addUser(user); + + return new Gson().toJson(new StandardResponse(StatusResponse.SUCCESS)); + }); + + get("/users", (request, response) -> { + response.type("application/json"); + + return new Gson().toJson( + new StandardResponse(StatusResponse.SUCCESS,new Gson() + .toJsonTree(userService.getUsers()))); + }); + + get("/users/:id", (request, response) -> { + response.type("application/json"); + + return new Gson().toJson( + new StandardResponse(StatusResponse.SUCCESS,new Gson() + .toJsonTree(userService.getUser(request.params(":id"))))); + }); + + put("/users/:id", (request, response) -> { + response.type("application/json"); + + User toEdit = new Gson().fromJson(request.body(), User.class); + User editedUser = userService.editUser(toEdit); + + if (editedUser != null) { + return new Gson().toJson( + new StandardResponse(StatusResponse.SUCCESS,new Gson() + .toJsonTree(editedUser))); + }else { + return new Gson().toJson( + new StandardResponse(StatusResponse.ERROR,new Gson() + .toJson("User not found or error in edit"))); + } + }); + + delete("/users/:id", (request, response) -> { + response.type("application/json"); + + userService.deleteUser(request.params(":id")); + return new Gson().toJson( + new StandardResponse(StatusResponse.SUCCESS, "user deleted")); + }); + + options("/users/:id", (request, response) -> { + response.type("application/json"); + + return new Gson().toJson( + new StandardResponse(StatusResponse.SUCCESS, + (userService.userExist( + request.params(":id"))) ? "User exists" : "User does not exists" )); + }); + + } + +} diff --git a/spark-java/src/main/java/com/baeldung/sparkjava/StandardResponse.java b/spark-java/src/main/java/com/baeldung/sparkjava/StandardResponse.java new file mode 100644 index 0000000000..51f1954e57 --- /dev/null +++ b/spark-java/src/main/java/com/baeldung/sparkjava/StandardResponse.java @@ -0,0 +1,47 @@ +package com.baeldung.sparkjava; + +import com.google.gson.JsonElement; + +public class StandardResponse { + private StatusResponse status; + private String message; + private JsonElement data; + + public StandardResponse(StatusResponse status) { + this.status = status; + } + + public StandardResponse(StatusResponse status, String message) { + this.status = status; + this.message = message; + } + + public StandardResponse(StatusResponse status, JsonElement data) { + this.status = status; + this.data = data; + } + + public StatusResponse getStatus() { + return status; + } + + public void setStatus(StatusResponse status) { + this.status = status; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public JsonElement getData() { + return data; + } + + public void setData(JsonElement data) { + this.data = data; + } +} diff --git a/spark-java/src/main/java/com/baeldung/sparkjava/StatusResponse.java b/spark-java/src/main/java/com/baeldung/sparkjava/StatusResponse.java new file mode 100644 index 0000000000..0e3137293a --- /dev/null +++ b/spark-java/src/main/java/com/baeldung/sparkjava/StatusResponse.java @@ -0,0 +1,17 @@ +package com.baeldung.sparkjava; + +public enum StatusResponse { + SUCCESS ("Success"), + ERROR ("Error"); + + final private String status; + + StatusResponse(String status) { + this.status = status; + } + + public String getStatus() { + return status; + } + +} diff --git a/spark-java/src/main/java/com/baeldung/sparkjava/User.java b/spark-java/src/main/java/com/baeldung/sparkjava/User.java new file mode 100644 index 0000000000..7447671470 --- /dev/null +++ b/spark-java/src/main/java/com/baeldung/sparkjava/User.java @@ -0,0 +1,59 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.baeldung.sparkjava; + +class User { + + private String id; + private String firstName; + private String lastName; + private String email; + + public User(String id, String firstName, String lastName, String email) { + super(); + this.id = id; + this.firstName = firstName; + this.lastName = lastName; + this.email = email; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + 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; + } + + @Override + public String toString() { + return new StringBuffer().append(getEmail()).toString(); + } +} diff --git a/spark-java/src/main/java/com/baeldung/sparkjava/UserException.java b/spark-java/src/main/java/com/baeldung/sparkjava/UserException.java new file mode 100644 index 0000000000..929c0dfdb7 --- /dev/null +++ b/spark-java/src/main/java/com/baeldung/sparkjava/UserException.java @@ -0,0 +1,13 @@ +package com.baeldung.sparkjava; + +public class UserException extends Exception{ + + public UserException() { + super(); + } + + public UserException(String message) { + super(message); + } + +} diff --git a/spark-java/src/main/java/com/baeldung/sparkjava/UserService.java b/spark-java/src/main/java/com/baeldung/sparkjava/UserService.java new file mode 100644 index 0000000000..9b1fa7be3a --- /dev/null +++ b/spark-java/src/main/java/com/baeldung/sparkjava/UserService.java @@ -0,0 +1,12 @@ +package com.baeldung.sparkjava; + +import java.util.Collection; + +public interface UserService { + public void addUser (User user) ; + public Collection getUsers () ; + public User getUser (String id) ; + public User editUser (User user) throws UserException; + public void deleteUser (String id) ; + public boolean userExist (String id); +} diff --git a/spark-java/src/main/java/com/baeldung/sparkjava/UserServiceMapImpl.java b/spark-java/src/main/java/com/baeldung/sparkjava/UserServiceMapImpl.java new file mode 100644 index 0000000000..0b5072647f --- /dev/null +++ b/spark-java/src/main/java/com/baeldung/sparkjava/UserServiceMapImpl.java @@ -0,0 +1,68 @@ +package com.baeldung.sparkjava; + +import java.util.Collection; +import java.util.HashMap; + +public class UserServiceMapImpl implements UserService{ + private HashMap userMap; + + public UserServiceMapImpl() { + userMap = new HashMap<>(); + } + + @Override + public void addUser (User user) { + userMap.put(user.getId(), user); + } + + @Override + public Collection getUsers () { + return userMap.values(); + } + + @Override + public User getUser (String id) { + return userMap.get(id); + } + + @Override + public User editUser (User forEdit) throws UserException{ + try{ + if (forEdit.getId() == null) + throw new UserException("ID cannot be blank"); + + User toEdit = userMap.get(forEdit.getId()); + + if (toEdit == null ) + throw new UserException("User not found"); + + if (forEdit.getEmail()!=null) { + toEdit.setEmail(forEdit.getEmail()); + } + if (forEdit.getFirstName()!=null) { + toEdit.setFirstName(forEdit.getFirstName()); + } + if (forEdit.getLastName()!=null) { + toEdit.setLastName(forEdit.getLastName()); + } + if (forEdit.getId()!=null) { + toEdit.setId(forEdit.getId()); + } + + return toEdit; + }catch (Exception ex) { + throw new UserException(ex.getMessage()); + } + } + + @Override + public void deleteUser (String id) { + userMap.remove(id); + } + + @Override + public boolean userExist (String id) { + return userMap.containsKey(id); + } + +} diff --git a/spring-all/pom.xml b/spring-all/pom.xml index e77bf0b284..deb6bd6f6a 100644 --- a/spring-all/pom.xml +++ b/spring-all/pom.xml @@ -38,6 +38,11 @@ org.springframework spring-context + + org.springframework.retry + spring-retry + ${springretry.version} + @@ -166,7 +171,6 @@ ehcache ${ehcache.version} - @@ -275,6 +279,7 @@ 4.3.4.RELEASE 4.2.0.RELEASE + 1.1.5.RELEASE 5.2.5.Final diff --git a/spring-all/src/main/java/org/baeldung/springretry/AppConfig.java b/spring-all/src/main/java/org/baeldung/springretry/AppConfig.java new file mode 100644 index 0000000000..63bb2a53f1 --- /dev/null +++ b/spring-all/src/main/java/org/baeldung/springretry/AppConfig.java @@ -0,0 +1,34 @@ +package org.baeldung.springretry; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.retry.annotation.EnableRetry; +import org.springframework.retry.backoff.FixedBackOffPolicy; +import org.springframework.retry.policy.SimpleRetryPolicy; +import org.springframework.retry.support.RetryTemplate; + +@Configuration +@ComponentScan(basePackages = "org.baeldung.springretry") +@EnableRetry +//Uncomment this two lines if we need XML configuration +//@EnableAspectJAutoProxy +//@ImportResource("classpath:/retryadvice.xml") +public class AppConfig { + + @Bean + public RetryTemplate retryTemplate() { + RetryTemplate retryTemplate = new RetryTemplate(); + + FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy(); + fixedBackOffPolicy.setBackOffPeriod(2000l); + retryTemplate.setBackOffPolicy(fixedBackOffPolicy); + + SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy(); + retryPolicy.setMaxAttempts(2); + retryTemplate.setRetryPolicy(retryPolicy); + + retryTemplate.registerListener(new DefaultListenerSupport()); + return retryTemplate; + } +} diff --git a/spring-all/src/main/java/org/baeldung/springretry/DefaultListenerSupport.java b/spring-all/src/main/java/org/baeldung/springretry/DefaultListenerSupport.java new file mode 100644 index 0000000000..bc251b4c2f --- /dev/null +++ b/spring-all/src/main/java/org/baeldung/springretry/DefaultListenerSupport.java @@ -0,0 +1,31 @@ +package org.baeldung.springretry; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.retry.RetryCallback; +import org.springframework.retry.RetryContext; +import org.springframework.retry.listener.RetryListenerSupport; + +public class DefaultListenerSupport extends RetryListenerSupport { + + private static final Logger logger = LoggerFactory.getLogger(DefaultListenerSupport.class); + + @Override + public void close(RetryContext context, RetryCallback callback, Throwable throwable) { + logger.info("onClose"); + super.close(context, callback, throwable); + } + + @Override + public void onError(RetryContext context, RetryCallback callback, Throwable throwable) { + logger.info("onError"); + super.onError(context, callback, throwable); + } + + @Override + public boolean open(RetryContext context, RetryCallback callback) { + logger.info("onOpen"); + return super.open(context, callback); + } + +} diff --git a/spring-all/src/main/java/org/baeldung/springretry/MyService.java b/spring-all/src/main/java/org/baeldung/springretry/MyService.java new file mode 100644 index 0000000000..2b8cc16eb3 --- /dev/null +++ b/spring-all/src/main/java/org/baeldung/springretry/MyService.java @@ -0,0 +1,21 @@ +package org.baeldung.springretry; + +import java.sql.SQLException; + +import org.springframework.retry.annotation.Backoff; +import org.springframework.retry.annotation.Recover; +import org.springframework.retry.annotation.Retryable; + +public interface MyService { + + @Retryable + void retryService(); + + @Retryable(value = { SQLException.class }, maxAttempts = 2, backoff = @Backoff(delay = 5000)) + void retryServiceWithRecovery(String sql) throws SQLException; + + @Recover + void recover(SQLException e, String sql); + + void templateRetryService(); +} diff --git a/spring-all/src/main/java/org/baeldung/springretry/MyServiceImpl.java b/spring-all/src/main/java/org/baeldung/springretry/MyServiceImpl.java new file mode 100644 index 0000000000..1b698f26c9 --- /dev/null +++ b/spring-all/src/main/java/org/baeldung/springretry/MyServiceImpl.java @@ -0,0 +1,39 @@ +package org.baeldung.springretry; + +import java.sql.SQLException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +@Service +public class MyServiceImpl implements MyService { + + private static final Logger logger = LoggerFactory.getLogger(MyServiceImpl.class); + + @Override + public void retryService() { + logger.info("throw RuntimeException in method retryService()"); + throw new RuntimeException(); + } + + @Override + public void retryServiceWithRecovery(String sql) throws SQLException { + if (StringUtils.isEmpty(sql)) { + logger.info("throw SQLException in method retryServiceWithRecovery()"); + throw new SQLException(); + } + } + + @Override + public void recover(SQLException e, String sql) { + logger.info("In recover method"); + } + + @Override + public void templateRetryService() { + logger.info("throw RuntimeException in method templateRetryService()"); + throw new RuntimeException(); + } +} diff --git a/spring-all/src/main/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerConfig.java b/spring-all/src/main/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerConfig.java new file mode 100644 index 0000000000..342a5fe3e6 --- /dev/null +++ b/spring-all/src/main/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerConfig.java @@ -0,0 +1,41 @@ +package org.baeldung.taskscheduler; + +import java.util.concurrent.TimeUnit; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; +import org.springframework.scheduling.support.CronTrigger; +import org.springframework.scheduling.support.PeriodicTrigger; + +@Configuration +@ComponentScan(basePackages = "org.baeldung.taskscheduler", basePackageClasses = { ThreadPoolTaskSchedulerExamples.class }) +public class ThreadPoolTaskSchedulerConfig { + + @Bean + public ThreadPoolTaskScheduler threadPoolTaskScheduler() { + ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); + threadPoolTaskScheduler.setPoolSize(5); + threadPoolTaskScheduler.setThreadNamePrefix("ThreadPoolTaskScheduler"); + return threadPoolTaskScheduler; + } + + @Bean + public CronTrigger cronTrigger() { + return new CronTrigger("10 * * * * ?"); + } + + @Bean + public PeriodicTrigger periodicTrigger() { + return new PeriodicTrigger(2000, TimeUnit.MICROSECONDS); + } + + @Bean + public PeriodicTrigger periodicFixedDelayTrigger() { + PeriodicTrigger periodicTrigger = new PeriodicTrigger(2000, TimeUnit.MICROSECONDS); + periodicTrigger.setFixedRate(true); + periodicTrigger.setInitialDelay(1000); + return periodicTrigger; + } +} \ No newline at end of file diff --git a/spring-all/src/main/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerExamples.java b/spring-all/src/main/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerExamples.java new file mode 100644 index 0000000000..7505b85516 --- /dev/null +++ b/spring-all/src/main/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerExamples.java @@ -0,0 +1,47 @@ +package org.baeldung.taskscheduler; + +import java.util.Date; + +import javax.annotation.PostConstruct; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; +import org.springframework.scheduling.support.CronTrigger; +import org.springframework.scheduling.support.PeriodicTrigger; +import org.springframework.stereotype.Component; + +@Component +public class ThreadPoolTaskSchedulerExamples { + @Autowired + private ThreadPoolTaskScheduler taskScheduler; + + @Autowired + private CronTrigger cronTrigger; + + @Autowired + private PeriodicTrigger periodicTrigger; + + @PostConstruct + public void scheduleRunnableWithCronTrigger(){ + taskScheduler.schedule(new RunnableTask("Current Date"), new Date()); + taskScheduler.scheduleWithFixedDelay(new RunnableTask("Fixed 1 second Delay"), 1000); + taskScheduler.scheduleWithFixedDelay(new RunnableTask("Current Date Fixed 1 second Delay"),new Date() , 1000); + taskScheduler.scheduleAtFixedRate(new RunnableTask("Fixed Rate of 2 seconds"),new Date(), 2000); + taskScheduler.scheduleAtFixedRate(new RunnableTask("Fixed Rate of 2 seconds"), 2000); + taskScheduler.schedule(new RunnableTask("Cron Trigger"), cronTrigger); + taskScheduler.schedule(new RunnableTask("Periodic Trigger"), periodicTrigger); + } + + class RunnableTask implements Runnable{ + + private String message; + + public RunnableTask(String message){ + this.message = message; + } + @Override + public void run() { + System.out.println("Runnable Task with "+message+" on thread "+Thread.currentThread().getName()); + } + } +} \ No newline at end of file diff --git a/spring-all/src/main/resources/retryadvice.xml b/spring-all/src/main/resources/retryadvice.xml new file mode 100644 index 0000000000..8de7801a58 --- /dev/null +++ b/spring-all/src/main/resources/retryadvice.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Initial sleep interval value, default 300 ms + + + + + The maximum value of the backoff period in milliseconds. + + + + + The value to increment the exp seed with for each retry attempt. + + + + + \ No newline at end of file diff --git a/spring-all/src/test/java/org/baeldung/springretry/SpringRetryTest.java b/spring-all/src/test/java/org/baeldung/springretry/SpringRetryTest.java new file mode 100644 index 0000000000..2f3411957e --- /dev/null +++ b/spring-all/src/test/java/org/baeldung/springretry/SpringRetryTest.java @@ -0,0 +1,40 @@ +package org.baeldung.springretry; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.retry.support.RetryTemplate; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.AnnotationConfigContextLoader; + +import java.sql.SQLException; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = AppConfig.class, loader = AnnotationConfigContextLoader.class) +public class SpringRetryTest { + + @Autowired + private MyService myService; + + @Autowired + private RetryTemplate retryTemplate; + + @Test(expected = RuntimeException.class) + public void givenRetryService_whenCallWithException_thenRetry() { + myService.retryService(); + } + + @Test + public void givenRetryServiceWithRecovery_whenCallWithException_thenRetryRecover() throws SQLException { + myService.retryServiceWithRecovery(null); + } + + @Test(expected = RuntimeException.class) + public void givenTemplateRetryService_whenCallWithException_thenRetry() { + retryTemplate.execute(arg0 -> { + myService.templateRetryService(); + return null; + }); + } +} diff --git a/spring-all/src/test/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerTest.java b/spring-all/src/test/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerTest.java new file mode 100644 index 0000000000..cc247cb384 --- /dev/null +++ b/spring-all/src/test/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerTest.java @@ -0,0 +1,16 @@ +package org.baeldung.taskscheduler; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.AnnotationConfigContextLoader; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = { ThreadPoolTaskSchedulerConfig.class }, loader = AnnotationConfigContextLoader.class) +public class ThreadPoolTaskSchedulerTest { + @Test + public void testThreadPoolTaskSchedulerAnnotation() throws InterruptedException { + Thread.sleep(2550); + } +} \ No newline at end of file diff --git a/spring-boot/MyFirstSpringBoot/pom.xml b/spring-boot/MyFirstSpringBoot/pom.xml new file mode 100644 index 0000000000..a5cbb37263 --- /dev/null +++ b/spring-boot/MyFirstSpringBoot/pom.xml @@ -0,0 +1,39 @@ + + 4.0.0 + + com.baeldung + MyFirstSpringBoot + 0.0.1-SNAPSHOT + jar + + + org.springframework.boot + spring-boot-starter-parent + 1.4.3.RELEASE + + + MyFirstSpringBoot + http://maven.apache.org + + + UTF-8 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + test + + + junit + junit + test + + + diff --git a/spring-boot/MyFirstSpringBoot/src/main/java/com/baeldung/App.java b/spring-boot/MyFirstSpringBoot/src/main/java/com/baeldung/App.java new file mode 100644 index 0000000000..d7cc90fcb9 --- /dev/null +++ b/spring-boot/MyFirstSpringBoot/src/main/java/com/baeldung/App.java @@ -0,0 +1,13 @@ +package com.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class App +{ + public static void main( String[] args ) + { + SpringApplication.run(App.class, args); + } +} diff --git a/spring-boot/MyFirstSpringBoot/src/main/java/com/baeldung/controller/HomeController.java b/spring-boot/MyFirstSpringBoot/src/main/java/com/baeldung/controller/HomeController.java new file mode 100644 index 0000000000..757e0a06b1 --- /dev/null +++ b/spring-boot/MyFirstSpringBoot/src/main/java/com/baeldung/controller/HomeController.java @@ -0,0 +1,18 @@ +package com.baeldung.controller; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class HomeController { + + @RequestMapping("/") + public String root(){ + return "Index Page"; + } + + @RequestMapping("/local") + public String local(){ + return "/local"; + } +} diff --git a/spring-boot/MyFirstSpringBoot/src/main/resources/public/error/404.html b/spring-boot/MyFirstSpringBoot/src/main/resources/public/error/404.html new file mode 100644 index 0000000000..02d6092bee --- /dev/null +++ b/spring-boot/MyFirstSpringBoot/src/main/resources/public/error/404.html @@ -0,0 +1,8 @@ + + + RESOURCE NOT FOUND + + +

404 RESOURCE NOT FOUND

+ + \ No newline at end of file diff --git a/spring-boot/MyFirstSpringBoot/src/test/java/com/baeldung/AppTest.java b/spring-boot/MyFirstSpringBoot/src/test/java/com/baeldung/AppTest.java new file mode 100644 index 0000000000..8450740863 --- /dev/null +++ b/spring-boot/MyFirstSpringBoot/src/test/java/com/baeldung/AppTest.java @@ -0,0 +1,39 @@ +package com.baeldung; + +import static org.hamcrest.Matchers.equalTo; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +@RunWith(SpringRunner.class) +@SpringBootTest +@AutoConfigureMockMvc +public class AppTest { + + @Autowired + private MockMvc mvc; + + @Test + public void getIndex() throws Exception { + mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string(equalTo("Index Page"))); + } + + @Test + public void getLocal() throws Exception { + mvc.perform(MockMvcRequestBuilders.get("/local").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string(equalTo("/local"))); + } + +} \ No newline at end of file diff --git a/spring-boot/src/main/java/org/baeldung/controller/GenericEntityController.java b/spring-boot/src/main/java/org/baeldung/controller/GenericEntityController.java index c8649e0d3e..7d6293056a 100644 --- a/spring-boot/src/main/java/org/baeldung/controller/GenericEntityController.java +++ b/spring-boot/src/main/java/org/baeldung/controller/GenericEntityController.java @@ -5,6 +5,7 @@ import org.baeldung.domain.Modes; import org.baeldung.web.resolver.Version; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -41,17 +42,17 @@ public class GenericEntityController { return entityList.stream().filter(entity -> entity.getId().equals(id)).findFirst().get(); } - @RequestMapping("/entity/findbydate/{date}") + @GetMapping("/entity/findbydate/{date}") public GenericEntity findByDate(@PathVariable("date") LocalDateTime date) { return entityList.stream().findFirst().get(); } - @RequestMapping("/entity/findbymode/{mode}") + @GetMapping("/entity/findbymode/{mode}") public GenericEntity findByEnum(@PathVariable("mode") Modes mode) { return entityList.stream().findFirst().get(); } - @RequestMapping("/entity/findbyversion") + @GetMapping("/entity/findbyversion") public ResponseEntity findByVersion(@Version String version) { return version != null ? new ResponseEntity(entityList.stream().findFirst().get(), HttpStatus.OK) diff --git a/spring-boot/src/main/java/org/baeldung/converter/StringToLocalDateTimeConverter.java b/spring-boot/src/main/java/org/baeldung/converter/StringToLocalDateTimeConverter.java index 85c86faae1..cbb9e6ddb4 100644 --- a/spring-boot/src/main/java/org/baeldung/converter/StringToLocalDateTimeConverter.java +++ b/spring-boot/src/main/java/org/baeldung/converter/StringToLocalDateTimeConverter.java @@ -5,17 +5,12 @@ import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeParseException; @Component public class StringToLocalDateTimeConverter implements Converter { @Override public LocalDateTime convert(final String source) { - try { - return LocalDateTime.parse(source, DateTimeFormatter.ISO_LOCAL_DATE_TIME); - } catch (DateTimeParseException e) { - throw new IllegalArgumentException("Couldn't parse value"); - } + return LocalDateTime.parse(source, DateTimeFormatter.ISO_LOCAL_DATE_TIME); } } diff --git a/spring-boot/src/main/java/org/baeldung/domain/Modes.java b/spring-boot/src/main/java/org/baeldung/domain/Modes.java index 41b1fa0d4e..473406ef26 100644 --- a/spring-boot/src/main/java/org/baeldung/domain/Modes.java +++ b/spring-boot/src/main/java/org/baeldung/domain/Modes.java @@ -2,5 +2,5 @@ package org.baeldung.domain; public enum Modes { - Alpha, Beta; + ALPHA, BETA; } diff --git a/spring-boot/src/test/java/org/baeldung/SpringBootApplicationIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/SpringBootApplicationIntegrationTest.java index 94623d3cdd..8cdcdb2216 100644 --- a/spring-boot/src/test/java/org/baeldung/SpringBootApplicationIntegrationTest.java +++ b/spring-boot/src/test/java/org/baeldung/SpringBootApplicationIntegrationTest.java @@ -4,6 +4,7 @@ import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasSize; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import org.baeldung.domain.Modes; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -54,7 +55,7 @@ public class SpringBootApplicationIntegrationTest { public void givenRequestHasBeenMade_whenMeetsFindByModeOfGivenConditions_thenCorrect() throws Exception { MediaType contentType = new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8")); - mockMvc.perform(MockMvcRequestBuilders.get("/entity/findbymode/{mode}", "Alpha")) + mockMvc.perform(MockMvcRequestBuilders.get("/entity/findbymode/{mode}", Modes.ALPHA.name())) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.content().contentType(contentType)) .andExpect(jsonPath("$.id", equalTo(1))); diff --git a/spring-cloud/pom.xml b/spring-cloud/pom.xml index 299115634e..5b5b006d01 100644 --- a/spring-cloud/pom.xml +++ b/spring-cloud/pom.xml @@ -12,6 +12,7 @@ spring-cloud-hystrix spring-cloud-bootstrap spring-cloud-ribbon-client + spring-cloud-rest pom diff --git a/spring-cloud/spring-cloud-rest/.gitignore b/spring-cloud/spring-cloud-rest/.gitignore new file mode 100644 index 0000000000..2af7cefb0a --- /dev/null +++ b/spring-cloud/spring-cloud-rest/.gitignore @@ -0,0 +1,24 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +nbproject/private/ +build/ +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ \ No newline at end of file diff --git a/spring-cloud/spring-cloud-rest/pom.xml b/spring-cloud/spring-cloud-rest/pom.xml new file mode 100644 index 0000000000..fef6d93cfc --- /dev/null +++ b/spring-cloud/spring-cloud-rest/pom.xml @@ -0,0 +1,43 @@ + + + 4.0.0 + + org.baeldung + spring-cloud-rest + 1.0.0-SNAPSHOT + + spring-cloud-rest-server + spring-cloud-rest-client + + pom + + spring-cloud-rest + + + UTF-8 + 3.6.0 + 1.4.2.RELEASE + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot-maven-plugin.version} + + + + + diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/pom.xml b/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/pom.xml new file mode 100644 index 0000000000..824e17e59c --- /dev/null +++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/pom.xml @@ -0,0 +1,78 @@ + + + 4.0.0 + + org.baeldung + spring-cloud-rest-client + 0.0.1-SNAPSHOT + jar + + spring-cloud-rest + Demo project for Spring Boot + + + org.springframework.boot + spring-boot-starter-parent + 1.4.3.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.cloud + spring-cloud-starter-eureka + + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.h2database + h2 + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-data-rest + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.cloud + spring-cloud-dependencies + Camden.SR4 + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/main/java/org/baeldung/SpringCloudRestClientApplication.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/main/java/org/baeldung/SpringCloudRestClientApplication.java new file mode 100644 index 0000000000..a13aaa54bc --- /dev/null +++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/main/java/org/baeldung/SpringCloudRestClientApplication.java @@ -0,0 +1,14 @@ +package org.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.eureka.EnableEurekaClient; + +@SpringBootApplication +@EnableEurekaClient +public class SpringCloudRestClientApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringCloudRestClientApplication.class, args); + } +} diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/main/java/org/baeldung/persistence/dao/BookRepository.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/main/java/org/baeldung/persistence/dao/BookRepository.java new file mode 100644 index 0000000000..419c735d63 --- /dev/null +++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/main/java/org/baeldung/persistence/dao/BookRepository.java @@ -0,0 +1,10 @@ +package org.baeldung.persistence.dao; + +import org.baeldung.persistence.model.Book; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.rest.core.annotation.RepositoryRestResource; + +@RepositoryRestResource(collectionResourceRel = "books", path = "books") +public interface BookRepository extends JpaRepository { + +} diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/main/java/org/baeldung/persistence/model/Book.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/main/java/org/baeldung/persistence/model/Book.java new file mode 100644 index 0000000000..69d217b096 --- /dev/null +++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/main/java/org/baeldung/persistence/model/Book.java @@ -0,0 +1,138 @@ +package org.baeldung.persistence.model; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Book { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long id; + + @Column(nullable = false) + private String title; + + @Column(nullable = false) + private String isbn; + + @Column(nullable = false) + private String author; + + // + + public Book() { + super(); + } + + public Book(String title, String isbn, String author) { + super(); + this.title = title; + this.isbn = isbn; + this.author = author; + } + + // + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getIsbn() { + return isbn; + } + + public void setIsbn(String isbn) { + this.isbn = isbn; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + // + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = (prime * result) + ((author == null) ? 0 : author.hashCode()); + result = (prime * result) + (int) (id ^ (id >>> 32)); + result = (prime * result) + ((isbn == null) ? 0 : isbn.hashCode()); + result = (prime * result) + ((title == null) ? 0 : title.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final Book other = (Book) obj; + if (author == null) { + if (other.author != null) { + return false; + } + } else if (!author.equals(other.author)) { + return false; + } + if (id != other.id) { + return false; + } + if (isbn == null) { + if (other.isbn != null) { + return false; + } + } else if (!isbn.equals(other.isbn)) { + return false; + } + if (title == null) { + if (other.title != null) { + return false; + } + } else if (!title.equals(other.title)) { + return false; + } + return true; + } + + @Override + public String toString() { + final StringBuilder builder = new StringBuilder(); + builder.append("Book [id=") + .append(id) + .append(", title=") + .append(title) + .append(", isbn=") + .append(isbn) + .append(", author=") + .append(author) + .append("]"); + return builder.toString(); + } + +} diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/main/resources/application.properties b/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/main/resources/application.properties new file mode 100644 index 0000000000..45100d4788 --- /dev/null +++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/main/resources/application.properties @@ -0,0 +1,9 @@ +spring.application.name=spring-cloud-eureka-client +server.port=0 +eureka.client.serviceUrl.defaultZone=${EUREKA_URI:http://localhost:8761/eureka} +eureka.instance.preferIpAddress=true + +spring.datasource.driver-class-name=org.h2.Driver +spring.datasource.url=jdbc:h2:mem:cloud_rest;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE +spring.datasource.username=sa +spring.datasource.password= \ No newline at end of file diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/test/java/org/baeldung/SpringCloudRestClientApplicationTests.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/test/java/org/baeldung/SpringCloudRestClientApplicationTests.java new file mode 100644 index 0000000000..c16adfbb34 --- /dev/null +++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/test/java/org/baeldung/SpringCloudRestClientApplicationTests.java @@ -0,0 +1,16 @@ +package org.baeldung; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class SpringCloudRestClientApplicationTests { + + @Test + public void contextLoads() { + } + +} diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/.gitignore b/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/.gitignore new file mode 100644 index 0000000000..2af7cefb0a --- /dev/null +++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/.gitignore @@ -0,0 +1,24 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +nbproject/private/ +build/ +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ \ No newline at end of file diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/.mvn/wrapper/maven-wrapper.properties b/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000000..c954cec91c --- /dev/null +++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1 @@ +distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.3.9/apache-maven-3.3.9-bin.zip diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/pom.xml b/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/pom.xml new file mode 100644 index 0000000000..e513b2d0c4 --- /dev/null +++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/pom.xml @@ -0,0 +1,63 @@ + + + 4.0.0 + + org.baeldung + spring-cloud-rest-server + 0.0.1-SNAPSHOT + jar + + spring-cloud-rest-server + Spring Cloud REST server + + + org.springframework.boot + spring-boot-starter-parent + 1.4.3.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + Camden.SR4 + + + + + org.springframework.cloud + spring-cloud-starter-eureka-server + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/src/main/java/org/baeldung/SpringCloudRestServerApplication.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/src/main/java/org/baeldung/SpringCloudRestServerApplication.java new file mode 100644 index 0000000000..2845ccf961 --- /dev/null +++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/src/main/java/org/baeldung/SpringCloudRestServerApplication.java @@ -0,0 +1,14 @@ +package org.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; + +@SpringBootApplication +@EnableEurekaServer +public class SpringCloudRestServerApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringCloudRestServerApplication.class, args); + } +} diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/src/main/resources/application.properties b/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/src/main/resources/application.properties new file mode 100644 index 0000000000..2c7dfa193e --- /dev/null +++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/src/main/resources/application.properties @@ -0,0 +1,3 @@ +server.port=8761 +eureka.client.registerWithEureka=false +eureka.client.fetchRegistry=false \ No newline at end of file diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/src/test/java/org/baeldung/SpringCloudRestServerApplicationTests.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/src/test/java/org/baeldung/SpringCloudRestServerApplicationTests.java new file mode 100644 index 0000000000..b5636c32d3 --- /dev/null +++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/src/test/java/org/baeldung/SpringCloudRestServerApplicationTests.java @@ -0,0 +1,15 @@ +package org.baeldung; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class SpringCloudRestServerApplicationTests { + @Test + public void contextLoads() { + } + +} diff --git a/spring-core/src/main/java/com/baeldung/factorybean/README.md b/spring-core/src/main/java/com/baeldung/factorybean/README.md new file mode 100644 index 0000000000..13f9f379e0 --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/factorybean/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [How to use the Spring FactoryBean?](http://www.baeldung.com/spring-factorybean) diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index 7d7c9cd590..726fcf5f25 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -1,4 +1,5 @@ - + 4.0.0 com.baeldung @@ -160,10 +161,10 @@
- + UTF-8 - + 4.3.4.RELEASE 1.8.6.RELEASE @@ -177,7 +178,7 @@ 1.7.21 1.1.7 3.6.0 - 2.19.1 + 2.19.1 diff --git a/spring-data-mongodb/src/test/java/org/baeldung/gridfs/GridFSIntegrationTest.java b/spring-data-mongodb/src/test/java/org/baeldung/gridfs/GridFSLiveTest.java similarity index 99% rename from spring-data-mongodb/src/test/java/org/baeldung/gridfs/GridFSIntegrationTest.java rename to spring-data-mongodb/src/test/java/org/baeldung/gridfs/GridFSLiveTest.java index bb4b268ca7..3853a406fb 100644 --- a/spring-data-mongodb/src/test/java/org/baeldung/gridfs/GridFSIntegrationTest.java +++ b/spring-data-mongodb/src/test/java/org/baeldung/gridfs/GridFSLiveTest.java @@ -33,7 +33,7 @@ import com.mongodb.gridfs.GridFSDBFile; @ContextConfiguration("file:src/main/resources/mongoConfig.xml") @RunWith(SpringJUnit4ClassRunner.class) -public class GridFSIntegrationTest { +public class GridFSLiveTest { private final Logger logger = LoggerFactory.getLogger(getClass()); diff --git a/spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/DocumentQueryIntegrationTest.java b/spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/DocumentQueryLiveTest.java similarity index 99% rename from spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/DocumentQueryIntegrationTest.java rename to spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/DocumentQueryLiveTest.java index cf46c6ed6e..df3ebcb2d2 100644 --- a/spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/DocumentQueryIntegrationTest.java +++ b/spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/DocumentQueryLiveTest.java @@ -25,7 +25,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MongoConfig.class) -public class DocumentQueryIntegrationTest { +public class DocumentQueryLiveTest { @Autowired private MongoTemplate mongoTemplate; diff --git a/spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/MongoTemplateQueryIntegrationTest.java b/spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/MongoTemplateQueryLiveTest.java similarity index 99% rename from spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/MongoTemplateQueryIntegrationTest.java rename to spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/MongoTemplateQueryLiveTest.java index 1701b9ac5a..76162c6096 100644 --- a/spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/MongoTemplateQueryIntegrationTest.java +++ b/spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/MongoTemplateQueryLiveTest.java @@ -28,7 +28,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MongoConfig.class) -public class MongoTemplateQueryIntegrationTest { +public class MongoTemplateQueryLiveTest { @Autowired private MongoTemplate mongoTemplate; diff --git a/spring-data-mongodb/src/test/java/org/baeldung/repository/BaseQueryIntegrationTest.java b/spring-data-mongodb/src/test/java/org/baeldung/repository/BaseQueryLiveTest.java similarity index 94% rename from spring-data-mongodb/src/test/java/org/baeldung/repository/BaseQueryIntegrationTest.java rename to spring-data-mongodb/src/test/java/org/baeldung/repository/BaseQueryLiveTest.java index 8572cc858e..afd7259c6c 100644 --- a/spring-data-mongodb/src/test/java/org/baeldung/repository/BaseQueryIntegrationTest.java +++ b/spring-data-mongodb/src/test/java/org/baeldung/repository/BaseQueryLiveTest.java @@ -7,7 +7,7 @@ import org.junit.Before; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoOperations; -public class BaseQueryIntegrationTest { +public class BaseQueryLiveTest { @Autowired protected UserRepository userRepository; diff --git a/spring-data-mongodb/src/test/java/org/baeldung/repository/DSLQueryIntegrationTest.java b/spring-data-mongodb/src/test/java/org/baeldung/repository/DSLQueryLiveTest.java similarity index 97% rename from spring-data-mongodb/src/test/java/org/baeldung/repository/DSLQueryIntegrationTest.java rename to spring-data-mongodb/src/test/java/org/baeldung/repository/DSLQueryLiveTest.java index ca8d46a97a..03fd38c796 100644 --- a/spring-data-mongodb/src/test/java/org/baeldung/repository/DSLQueryIntegrationTest.java +++ b/spring-data-mongodb/src/test/java/org/baeldung/repository/DSLQueryLiveTest.java @@ -17,7 +17,7 @@ import com.mysema.query.types.Predicate; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MongoConfig.class) -public class DSLQueryIntegrationTest extends BaseQueryIntegrationTest { +public class DSLQueryLiveTest extends BaseQueryLiveTest { @Test public void givenUsersExist_whenFindingUsersByName_thenUserAreFound() { diff --git a/spring-data-mongodb/src/test/java/org/baeldung/repository/JSONQueryIntegrationTest.java b/spring-data-mongodb/src/test/java/org/baeldung/repository/JSONQueryLiveTest.java similarity index 97% rename from spring-data-mongodb/src/test/java/org/baeldung/repository/JSONQueryIntegrationTest.java rename to spring-data-mongodb/src/test/java/org/baeldung/repository/JSONQueryLiveTest.java index ed88429792..9464a4eb52 100644 --- a/spring-data-mongodb/src/test/java/org/baeldung/repository/JSONQueryIntegrationTest.java +++ b/spring-data-mongodb/src/test/java/org/baeldung/repository/JSONQueryLiveTest.java @@ -14,7 +14,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MongoConfig.class) -public class JSONQueryIntegrationTest extends BaseQueryIntegrationTest { +public class JSONQueryLiveTest extends BaseQueryLiveTest { @Test public void givenUsersExist_whenFindingUsersByName_thenUsersAreFound() { diff --git a/spring-data-mongodb/src/test/java/org/baeldung/repository/QueryMethodsIntegrationTest.java b/spring-data-mongodb/src/test/java/org/baeldung/repository/QueryMethodsLiveTest.java similarity index 97% rename from spring-data-mongodb/src/test/java/org/baeldung/repository/QueryMethodsIntegrationTest.java rename to spring-data-mongodb/src/test/java/org/baeldung/repository/QueryMethodsLiveTest.java index f7c35c8de2..5705c119b8 100644 --- a/spring-data-mongodb/src/test/java/org/baeldung/repository/QueryMethodsIntegrationTest.java +++ b/spring-data-mongodb/src/test/java/org/baeldung/repository/QueryMethodsLiveTest.java @@ -14,7 +14,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MongoConfig.class) -public class QueryMethodsIntegrationTest extends BaseQueryIntegrationTest { +public class QueryMethodsLiveTest extends BaseQueryLiveTest { @Test public void givenUsersExist_whenFindingUsersByName_thenUsersAreFound() { diff --git a/spring-data-mongodb/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java b/spring-data-mongodb/src/test/java/org/baeldung/repository/UserRepositoryLiveTest.java similarity index 99% rename from spring-data-mongodb/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java rename to spring-data-mongodb/src/test/java/org/baeldung/repository/UserRepositoryLiveTest.java index 53cadc09bc..1543b847ba 100644 --- a/spring-data-mongodb/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java +++ b/spring-data-mongodb/src/test/java/org/baeldung/repository/UserRepositoryLiveTest.java @@ -24,7 +24,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MongoConfig.class) -public class UserRepositoryIntegrationTest { +public class UserRepositoryLiveTest { @Autowired private UserRepository userRepository; diff --git a/spring-jersey/.gitignore b/spring-jersey/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/spring-jersey/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/spring-jersey/README.md b/spring-jersey/README.md new file mode 100644 index 0000000000..2767ceb9a7 --- /dev/null +++ b/spring-jersey/README.md @@ -0,0 +1,3 @@ +========= + +## REST API with Jersey & Spring Example Project diff --git a/spring-jersey/pom.xml b/spring-jersey/pom.xml new file mode 100644 index 0000000000..00d67febec --- /dev/null +++ b/spring-jersey/pom.xml @@ -0,0 +1,210 @@ + + + 4.0.0 + + com.baeldung + jersey-api + 0.1-SNAPSHOT + war + + + 2.25 + 1.7.22 + 1.1.8 + 4.12 + 3.0.0 + 2.19.1 + 1.6.1 + 4.12 + 4.4.5 + 4.5.2 + 3.1.0 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + maven-war-plugin + ${maven-war-plugin.version} + + false + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + **/*IntegrationTest.java + **/*LiveTest.java + + + + + + org.codehaus.cargo + cargo-maven2-plugin + ${cargo-maven2-plugin.version} + + true + + jetty8x + embedded + + + + 8082 + + + + + + + + + + + + + org.glassfish.jersey.core + jersey-server + ${jersey.version} + + + org.glassfish.jersey.containers + jersey-container-servlet + ${jersey.version} + + + org.glassfish.jersey.media + jersey-media-json-jackson + ${jersey.version} + + + + javax.servlet + javax.servlet-api + ${servlet-api-version} + provided + + + + + org.glassfish.jersey.ext + jersey-spring3 + ${jersey.version} + + + commons-logging + commons-logging + + + + + + org.slf4j + jcl-over-slf4j + ${jcl.slf4j.version} + + + + ch.qos.logback + logback-classic + ${logback.version} + + + + + + org.apache.httpcomponents + httpclient + ${httpclient.version} + test + + + + org.apache.httpcomponents + httpcore + ${httpcore.version} + test + + + + + + junit + junit + ${junit.version} + test + + + + + + live + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*IntegrationTest.java + + + **/*LiveTest.java + + + + + + + json + + + + + org.codehaus.cargo + cargo-maven2-plugin + ${cargo-maven2-plugin.version} + + false + + + + start-server + pre-integration-test + + start + + + + stop-server + post-integration-test + + stop + + + + + + + + + \ No newline at end of file diff --git a/spring-jersey/src/main/java/com/baeldung/server/config/ApplicationInitializer.java b/spring-jersey/src/main/java/com/baeldung/server/config/ApplicationInitializer.java new file mode 100644 index 0000000000..d91d4d5f38 --- /dev/null +++ b/spring-jersey/src/main/java/com/baeldung/server/config/ApplicationInitializer.java @@ -0,0 +1,22 @@ +package com.baeldung.server.config; + +import javax.servlet.ServletContext; +import javax.servlet.ServletException; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.web.WebApplicationInitializer; +import org.springframework.web.context.ContextLoaderListener; +import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; + +@Order(Ordered.HIGHEST_PRECEDENCE) +public class ApplicationInitializer implements WebApplicationInitializer { + + @Override + public void onStartup(ServletContext servletContext) throws ServletException { + AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); + servletContext.addListener(new ContextLoaderListener(context)); + servletContext.setInitParameter("contextConfigLocation", "com.baeldung.server"); + } + +} diff --git a/spring-jersey/src/main/java/com/baeldung/server/config/RestConfig.java b/spring-jersey/src/main/java/com/baeldung/server/config/RestConfig.java new file mode 100644 index 0000000000..34d8948f59 --- /dev/null +++ b/spring-jersey/src/main/java/com/baeldung/server/config/RestConfig.java @@ -0,0 +1,19 @@ +package com.baeldung.server.config; + +import javax.ws.rs.ApplicationPath; +import javax.ws.rs.core.Application; + +import com.baeldung.server.exception.AlreadyExistsExceptionHandler; +import com.baeldung.server.exception.NotFoundExceptionHandler; +import com.baeldung.server.rest.EmployeeResource; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +@ApplicationPath("/resources") +public class RestConfig extends Application { + public Set> getClasses() { + return new HashSet>(Arrays.asList(EmployeeResource.class, NotFoundExceptionHandler.class, AlreadyExistsExceptionHandler.class)); + } +} \ No newline at end of file diff --git a/spring-jersey/src/main/java/com/baeldung/server/exception/AlreadyExistsExceptionHandler.java b/spring-jersey/src/main/java/com/baeldung/server/exception/AlreadyExistsExceptionHandler.java new file mode 100644 index 0000000000..4603372807 --- /dev/null +++ b/spring-jersey/src/main/java/com/baeldung/server/exception/AlreadyExistsExceptionHandler.java @@ -0,0 +1,12 @@ +package com.baeldung.server.exception; + +import javax.ws.rs.core.Response; +import javax.ws.rs.ext.ExceptionMapper; +import javax.ws.rs.ext.Provider; + +@Provider +public class AlreadyExistsExceptionHandler implements ExceptionMapper { + public Response toResponse(EmployeeAlreadyExists ex) { + return Response.status(Response.Status.CONFLICT.getStatusCode()).build(); + } +} diff --git a/spring-jersey/src/main/java/com/baeldung/server/exception/EmployeeAlreadyExists.java b/spring-jersey/src/main/java/com/baeldung/server/exception/EmployeeAlreadyExists.java new file mode 100644 index 0000000000..827e4bf1e7 --- /dev/null +++ b/spring-jersey/src/main/java/com/baeldung/server/exception/EmployeeAlreadyExists.java @@ -0,0 +1,5 @@ +package com.baeldung.server.exception; + +public class EmployeeAlreadyExists extends RuntimeException { + +} diff --git a/spring-jersey/src/main/java/com/baeldung/server/exception/EmployeeNotFound.java b/spring-jersey/src/main/java/com/baeldung/server/exception/EmployeeNotFound.java new file mode 100644 index 0000000000..f205b5dfae --- /dev/null +++ b/spring-jersey/src/main/java/com/baeldung/server/exception/EmployeeNotFound.java @@ -0,0 +1,5 @@ +package com.baeldung.server.exception; + +public class EmployeeNotFound extends RuntimeException { + +} diff --git a/spring-jersey/src/main/java/com/baeldung/server/exception/NotFoundExceptionHandler.java b/spring-jersey/src/main/java/com/baeldung/server/exception/NotFoundExceptionHandler.java new file mode 100644 index 0000000000..5de9b53c30 --- /dev/null +++ b/spring-jersey/src/main/java/com/baeldung/server/exception/NotFoundExceptionHandler.java @@ -0,0 +1,12 @@ +package com.baeldung.server.exception; + +import javax.ws.rs.core.Response; +import javax.ws.rs.ext.ExceptionMapper; +import javax.ws.rs.ext.Provider; + +@Provider +public class NotFoundExceptionHandler implements ExceptionMapper { + public Response toResponse(EmployeeNotFound ex) { + return Response.status(Response.Status.NOT_FOUND).build(); + } +} diff --git a/spring-jersey/src/main/java/com/baeldung/server/model/Employee.java b/spring-jersey/src/main/java/com/baeldung/server/model/Employee.java new file mode 100644 index 0000000000..1801134f68 --- /dev/null +++ b/spring-jersey/src/main/java/com/baeldung/server/model/Employee.java @@ -0,0 +1,34 @@ +package com.baeldung.server.model; + +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement +public class Employee { + private int id; + private String firstName; + + public Employee() { + + } + + public Employee(int id, String firstName) { + this.id = id; + this.firstName = firstName; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } +} diff --git a/spring-jersey/src/main/java/com/baeldung/server/repository/EmployeeRepository.java b/spring-jersey/src/main/java/com/baeldung/server/repository/EmployeeRepository.java new file mode 100644 index 0000000000..15132cd618 --- /dev/null +++ b/spring-jersey/src/main/java/com/baeldung/server/repository/EmployeeRepository.java @@ -0,0 +1,18 @@ +package com.baeldung.server.repository; + +import java.util.List; + +import com.baeldung.server.model.Employee; + +public interface EmployeeRepository { + + public List getAllEmployees(); + + public Employee getEmployee(int id); + + public void updateEmployee(Employee employee, int id); + + public void deleteEmployee(int id); + + public void addEmployee(Employee employee); +} diff --git a/spring-jersey/src/main/java/com/baeldung/server/repository/EmployeeRepositoryImpl.java b/spring-jersey/src/main/java/com/baeldung/server/repository/EmployeeRepositoryImpl.java new file mode 100644 index 0000000000..8e61e1395b --- /dev/null +++ b/spring-jersey/src/main/java/com/baeldung/server/repository/EmployeeRepositoryImpl.java @@ -0,0 +1,65 @@ +package com.baeldung.server.repository; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.stereotype.Component; + +import com.baeldung.server.exception.EmployeeAlreadyExists; +import com.baeldung.server.exception.EmployeeNotFound; +import com.baeldung.server.model.Employee; + +@Component +public class EmployeeRepositoryImpl implements EmployeeRepository { + private List employeeList; + + public EmployeeRepositoryImpl() { + employeeList = new ArrayList(); + employeeList.add(new Employee(1, "Jane")); + employeeList.add(new Employee(2, "Jack")); + employeeList.add(new Employee(3, "George")); + } + + public List getAllEmployees() { + return employeeList; + } + + public Employee getEmployee(int id) { + for (Employee emp : employeeList) { + if (emp.getId() == id) { + return emp; + } + } + throw new EmployeeNotFound(); + } + + public void updateEmployee(Employee employee, int id) { + for (Employee emp : employeeList) { + if (emp.getId() == id) { + emp.setId(employee.getId()); + emp.setFirstName(employee.getFirstName()); + return; + } + } + throw new EmployeeNotFound(); + } + + public void deleteEmployee(int id) { + for (Employee emp : employeeList) { + if (emp.getId() == id) { + employeeList.remove(emp); + return; + } + } + throw new EmployeeNotFound(); + } + + public void addEmployee(Employee employee) { + for (Employee emp : employeeList) { + if (emp.getId() == employee.getId()) { + throw new EmployeeAlreadyExists(); + } + } + employeeList.add(employee); + } +} diff --git a/spring-jersey/src/main/java/com/baeldung/server/rest/EmployeeResource.java b/spring-jersey/src/main/java/com/baeldung/server/rest/EmployeeResource.java new file mode 100644 index 0000000000..2301f3eaf3 --- /dev/null +++ b/spring-jersey/src/main/java/com/baeldung/server/rest/EmployeeResource.java @@ -0,0 +1,64 @@ +package com.baeldung.server.rest; + +import java.util.List; + +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.UriInfo; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.baeldung.server.model.Employee; +import com.baeldung.server.repository.EmployeeRepository; + +@Path("/employees") +public class EmployeeResource { + + @Autowired + private EmployeeRepository employeeRepository; + + @GET + @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) + public List getAllEmployees() { + return employeeRepository.getAllEmployees(); + } + + @GET + @Path("/{id}") + @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) + public Employee getEmployee(@PathParam("id") int id) { + return employeeRepository.getEmployee(id); + } + + @PUT + @Path("/{id}") + @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) + public Response updateEmployee(Employee employee, @PathParam("id") int id) { + employeeRepository.updateEmployee(employee, id); + return Response.status(Response.Status.OK.getStatusCode()).build(); + } + + @DELETE + @Path("/{id}") + @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) + public Response deleteEmployee(@PathParam("id") int id) { + employeeRepository.deleteEmployee(id); + return Response.status(Response.Status.OK.getStatusCode()).build(); + } + + @POST + @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) + public Response addEmployee(Employee employee, @Context UriInfo uriInfo) { + employeeRepository.addEmployee(new Employee(employee.getId(), employee.getFirstName())); + return Response.status(Response.Status.CREATED.getStatusCode()).header("Location", String.format("%s/%s", uriInfo.getAbsolutePath().toString(), employee.getId())).build(); + } +} diff --git a/spring-jersey/src/main/resources/logback.xml b/spring-jersey/src/main/resources/logback.xml new file mode 100644 index 0000000000..788096686a --- /dev/null +++ b/spring-jersey/src/main/resources/logback.xml @@ -0,0 +1,15 @@ + + + + + web - %date [%thread] %-5level %logger{36} - + %message%n + + + + + + + + + \ No newline at end of file diff --git a/spring-jersey/src/test/java/com/baeldung/server/JerseyApiLiveTest.java b/spring-jersey/src/test/java/com/baeldung/server/JerseyApiLiveTest.java new file mode 100644 index 0000000000..835f9144ab --- /dev/null +++ b/spring-jersey/src/test/java/com/baeldung/server/JerseyApiLiveTest.java @@ -0,0 +1,89 @@ +package com.baeldung.server; + +import com.baeldung.server.model.Employee; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.http.HttpResponse; +import org.apache.http.HttpStatus; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.methods.HttpUriRequest; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.HttpClientBuilder; +import org.junit.Test; + +import java.io.IOException; + +public class JerseyApiLiveTest { + + private static final String SERVICE_URL = "http://localhost:8082/jersey-api/resources/employees"; + + @Test + public void givenGetAllEmployees_whenCorrectRequest_thenResponseCodeSuccess() throws IOException { + final HttpUriRequest request = new HttpGet(SERVICE_URL); + + final HttpResponse httpResponse = HttpClientBuilder.create().build().execute(request); + + assert(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK); + } + + @Test + public void givenGetEmployee_whenEmployeeExists_thenResponseCodeSuccess() throws IOException { + final HttpUriRequest request = new HttpGet(SERVICE_URL + "/1"); + + final HttpResponse httpResponse = HttpClientBuilder.create().build().execute(request); + + assert(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK); + } + + @Test + public void givenGetEmployee_whenEmployeeDoesNotExist_thenResponseCodeNotFound() throws IOException { + final HttpUriRequest request = new HttpGet(SERVICE_URL + "/1000"); + + final HttpResponse httpResponse = HttpClientBuilder.create().build().execute(request); + + assert(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_NOT_FOUND); + } + + @Test + public void givenGetEmployee_whenJsonRequested_thenCorrectDataRetrieved() throws IOException { + final HttpUriRequest request = new HttpGet(SERVICE_URL + "/1"); + + request.setHeader("Accept", "application/json"); + final HttpResponse httpResponse = HttpClientBuilder.create().build().execute(request); + ObjectMapper mapper = new ObjectMapper(); + Employee emp = mapper.readValue(httpResponse.getEntity().getContent(), Employee.class); + + assert(emp.getFirstName().equals("Jane")); + } + + @Test + public void givenAddEmployee_whenJsonRequestSent_thenResponseCodeCreated() throws IOException { + final HttpPost request = new HttpPost(SERVICE_URL); + + Employee emp = new Employee(5, "Johny"); + ObjectMapper mapper = new ObjectMapper(); + String empJson = mapper.writeValueAsString(emp); + StringEntity input = new StringEntity(empJson); + input.setContentType("application/json"); + request.setEntity(input); + final HttpResponse httpResponse = HttpClientBuilder.create().build().execute(request); + + assert(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_CREATED); + } + + @Test + public void givenAddEmployee_whenRequestForExistingObjectSent_thenResponseCodeConflict() throws IOException { + final HttpPost request = new HttpPost(SERVICE_URL); + + Employee emp = new Employee(1, "Johny"); + ObjectMapper mapper = new ObjectMapper(); + String empJson = mapper.writeValueAsString(emp); + StringEntity input = new StringEntity(empJson); + input.setContentType("application/json"); + request.setEntity(input); + final HttpResponse httpResponse = HttpClientBuilder.create().build().execute(request); + + assert(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_CONFLICT); + } + +} \ No newline at end of file diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/CustomerController.java b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/CustomerController.java new file mode 100644 index 0000000000..586c2467fe --- /dev/null +++ b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/CustomerController.java @@ -0,0 +1,42 @@ +package com.baeldung.springmvcforms.controller; + +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.ModelAndView; + +import com.baeldung.springmvcforms.domain.Customer; +import com.baeldung.springmvcforms.validator.CustomerValidator; + +@Controller +public class CustomerController { + + @Autowired + CustomerValidator validator; + + @RequestMapping(value = "/customer", method = RequestMethod.GET) + public ModelAndView showForm() { + return new ModelAndView("customerHome", "customer", new Customer()); + } + + @PostMapping("/addCustomer") + public String submit(@Valid @ModelAttribute("customer") final Customer customer, final BindingResult result, final ModelMap model) { + validator.validate(customer, result); + if (result.hasErrors()) { + return "customerHome"; + } + model.addAttribute("customerId", customer.getCustomerId()); + model.addAttribute("customerName", customer.getCustomerName()); + model.addAttribute("customerContact", customer.getCustomerContact()); + model.addAttribute("customerEmail", customer.getCustomerEmail()); + return "customerView"; + } + +} diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/domain/Customer.java b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/domain/Customer.java new file mode 100644 index 0000000000..8ecb2aa503 --- /dev/null +++ b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/domain/Customer.java @@ -0,0 +1,45 @@ +package com.baeldung.springmvcforms.domain; + +public class Customer { + private String customerId; + private String customerName; + private String customerContact; + private String customerEmail; + + public Customer() { + super(); + } + + public String getCustomerId() { + return customerId; + } + + public void setCustomerId(String customerId) { + this.customerId = customerId; + } + + public String getCustomerName() { + return customerName; + } + + public void setCustomerName(String customerName) { + this.customerName = customerName; + } + + public String getCustomerContact() { + return customerContact; + } + + public void setCustomerContact(String customerContact) { + this.customerContact = customerContact; + } + + public String getCustomerEmail() { + return customerEmail; + } + + public void setCustomerEmail(String customerEmail) { + this.customerEmail = customerEmail; + } + +} diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/validator/CustomerValidator.java b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/validator/CustomerValidator.java new file mode 100644 index 0000000000..94a7bd0ebd --- /dev/null +++ b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/validator/CustomerValidator.java @@ -0,0 +1,28 @@ +package com.baeldung.springmvcforms.validator; + +import org.springframework.stereotype.Component; +import org.springframework.validation.Errors; +import org.springframework.validation.ValidationUtils; +import org.springframework.validation.Validator; + +import com.baeldung.springmvcforms.domain.Customer; + +@Component +public class CustomerValidator implements Validator { + + @Override + public boolean supports(Class clazz) { + return Customer.class.isAssignableFrom(clazz); + } + + @Override + public void validate(Object target, Errors errors) { + + ValidationUtils.rejectIfEmptyOrWhitespace(errors, "customerId", "error.customerId", "Customer Id is required."); + ValidationUtils.rejectIfEmptyOrWhitespace(errors, "customerName", "error.customerName", "Customer Name is required."); + ValidationUtils.rejectIfEmptyOrWhitespace(errors, "customerContact", "error.customerNumber", "Customer Contact is required."); + ValidationUtils.rejectIfEmptyOrWhitespace(errors, "customerEmail", "error.customerEmail", "Customer Email is required."); + + } + +} diff --git a/spring-mvc-forms/src/main/webapp/WEB-INF/views/customerHome.jsp b/spring-mvc-forms/src/main/webapp/WEB-INF/views/customerHome.jsp new file mode 100644 index 0000000000..df34a47cc0 --- /dev/null +++ b/spring-mvc-forms/src/main/webapp/WEB-INF/views/customerHome.jsp @@ -0,0 +1,47 @@ +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> + + + +Form Example - Add Customer + + + +

Welcome, Enter The Customer Details

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Customer Id
Customer Name
Customer Contact
Customer Email
+
+ + + + \ No newline at end of file diff --git a/spring-mvc-forms/src/main/webapp/WEB-INF/views/customerView.jsp b/spring-mvc-forms/src/main/webapp/WEB-INF/views/customerView.jsp new file mode 100644 index 0000000000..ab2631bd02 --- /dev/null +++ b/spring-mvc-forms/src/main/webapp/WEB-INF/views/customerView.jsp @@ -0,0 +1,28 @@ +<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%> + + +Spring MVC Form Handling + + + +

Submitted Customer Information

+ + + + + + + + + + + + + + + + + +
Customer Id :${customerId}
Customer Name :${customerName}
Customer Contact :${customerContact}
Customer Email :${customerEmail}
+ + \ No newline at end of file diff --git a/spring-mvc-java/pom.xml b/spring-mvc-java/pom.xml index 38443f2022..7d0cc24d41 100644 --- a/spring-mvc-java/pom.xml +++ b/spring-mvc-java/pom.xml @@ -323,9 +323,9 @@ - + - + 4.3.4.RELEASE diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingCustomPrioritiesConfig.java b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingCustomPrioritiesConfig.java deleted file mode 100644 index 6545d1ec2d..0000000000 --- a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingCustomPrioritiesConfig.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.baeldung.spring.web.config; - -import com.baeldung.web.controller.handlermapping.BeanNameHandlerMappingController; -import com.baeldung.web.controller.handlermapping.SimpleUrlMappingController; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping; -import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping; - -import java.util.HashMap; -import java.util.Map; - - -@Configuration -public class HandlerMappingCustomPrioritiesConfig { - - @Bean - BeanNameUrlHandlerMapping beanNameUrlHandlerMapping() { - BeanNameUrlHandlerMapping beanNameUrlHandlerMapping = new BeanNameUrlHandlerMapping(); - beanNameUrlHandlerMapping.setOrder(0); - return beanNameUrlHandlerMapping; - } - - @Bean - public SimpleUrlHandlerMapping simpleUrlHandlerMapping() { - SimpleUrlHandlerMapping simpleUrlHandlerMapping = new SimpleUrlHandlerMapping(); - Map urlMap = new HashMap<>(); - urlMap.put("/welcome", simpleUrlMapping()); - simpleUrlHandlerMapping.setUrlMap(urlMap); - simpleUrlHandlerMapping.setOrder(1); - return simpleUrlHandlerMapping; - } - - @Bean - public SimpleUrlMappingController simpleUrlMapping() { - return new SimpleUrlMappingController(); - } - - @Bean("/welcome") - public BeanNameHandlerMappingController beanNameHandlerMapping() { - return new BeanNameHandlerMappingController(); - } -} \ No newline at end of file diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingPrioritiesConfigNoOrder.java b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingPrioritiesConfigNoOrder.java deleted file mode 100644 index d4cc30918e..0000000000 --- a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingPrioritiesConfigNoOrder.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.baeldung.spring.web.config; - -import com.baeldung.web.controller.handlermapping.SimpleUrlMappingController; -import com.baeldung.web.controller.handlermapping.BeanNameHandlerMappingController; -import com.baeldung.web.controller.handlermapping.WelcomeController; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping; -import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping; -import org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping; - -import java.util.HashMap; -import java.util.Map; - - -@Configuration -public class HandlerMappingPrioritiesConfigNoOrder { - - @Bean - public SimpleUrlHandlerMapping simpleUrlHandlerMapping() { - SimpleUrlHandlerMapping simpleUrlHandlerMapping = new SimpleUrlHandlerMapping(); - Map urlMap = new HashMap<>(); - urlMap.put("/welcome", test()); - simpleUrlHandlerMapping.setUrlMap(urlMap); - return simpleUrlHandlerMapping; - } - - @Bean - public ControllerClassNameHandlerMapping controllerClassNameHandlerMapping() { - ControllerClassNameHandlerMapping bean = new ControllerClassNameHandlerMapping(); - return bean; - } - - @Bean - BeanNameUrlHandlerMapping beanNameUrlHandlerMapping() { - BeanNameUrlHandlerMapping beanNameUrlHandlerMapping = new BeanNameUrlHandlerMapping(); - return beanNameUrlHandlerMapping; - } - - @Bean("/welcome") - public SimpleUrlMappingController welcomeBaeldungController() { - return new SimpleUrlMappingController(); - } - - @Bean - public BeanNameHandlerMappingController test() { - return new BeanNameHandlerMappingController(); - } - - @Bean - public WelcomeController welcomeController() { - return new WelcomeController(); - } -} \ No newline at end of file diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/BeanNameUrlHandlerMappingConfig.java b/spring-mvc-java/src/test/java/com/baeldung/config/BeanNameUrlHandlerMappingConfig.java similarity index 94% rename from spring-mvc-java/src/main/java/com/baeldung/spring/web/config/BeanNameUrlHandlerMappingConfig.java rename to spring-mvc-java/src/test/java/com/baeldung/config/BeanNameUrlHandlerMappingConfig.java index 081db6c6c3..e3dcb15de8 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/BeanNameUrlHandlerMappingConfig.java +++ b/spring-mvc-java/src/test/java/com/baeldung/config/BeanNameUrlHandlerMappingConfig.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.web.config; +package com.baeldung.config; import com.baeldung.web.controller.handlermapping.WelcomeController; import org.springframework.context.annotation.Bean; diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/ControllerClassNameHandlerMappingConfig.java b/spring-mvc-java/src/test/java/com/baeldung/config/ControllerClassNameHandlerMappingConfig.java similarity index 93% rename from spring-mvc-java/src/main/java/com/baeldung/spring/web/config/ControllerClassNameHandlerMappingConfig.java rename to spring-mvc-java/src/test/java/com/baeldung/config/ControllerClassNameHandlerMappingConfig.java index 0f67624658..6e9318602f 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/ControllerClassNameHandlerMappingConfig.java +++ b/spring-mvc-java/src/test/java/com/baeldung/config/ControllerClassNameHandlerMappingConfig.java @@ -1,14 +1,14 @@ -package com.baeldung.spring.web.config; +package com.baeldung.config; import com.baeldung.web.controller.handlermapping.WelcomeController; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping; import org.springframework.web.servlet.view.InternalResourceViewResolver; -@EnableWebMvc @Configuration public class ControllerClassNameHandlerMappingConfig { diff --git a/spring-mvc-java/src/test/java/com/baeldung/config/HandlerMappingDefaultConfig.java b/spring-mvc-java/src/test/java/com/baeldung/config/HandlerMappingDefaultConfig.java new file mode 100644 index 0000000000..9190d07d6b --- /dev/null +++ b/spring-mvc-java/src/test/java/com/baeldung/config/HandlerMappingDefaultConfig.java @@ -0,0 +1,28 @@ +package com.baeldung.config; + +import com.baeldung.web.controller.handlermapping.BeanNameHandlerMappingController; +import com.baeldung.web.controller.handlermapping.SimpleUrlMappingController; +import com.baeldung.web.controller.handlermapping.WelcomeController; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping; +import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping; + +import java.util.HashMap; +import java.util.Map; + + +@Configuration +public class HandlerMappingDefaultConfig { + + @Bean("/welcome") + public BeanNameHandlerMappingController beanNameHandlerMapping() { + return new BeanNameHandlerMappingController(); + } + + @Bean + public WelcomeController welcome() { + return new WelcomeController(); + } + +} \ No newline at end of file diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingPrioritiesConfig.java b/spring-mvc-java/src/test/java/com/baeldung/config/HandlerMappingPrioritiesConfig.java similarity index 92% rename from spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingPrioritiesConfig.java rename to spring-mvc-java/src/test/java/com/baeldung/config/HandlerMappingPrioritiesConfig.java index da54e5fc98..2d80dbfeaf 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingPrioritiesConfig.java +++ b/spring-mvc-java/src/test/java/com/baeldung/config/HandlerMappingPrioritiesConfig.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.web.config; +package com.baeldung.config; import java.util.HashMap; import java.util.Map; @@ -18,13 +18,14 @@ public class HandlerMappingPrioritiesConfig { @Bean BeanNameUrlHandlerMapping beanNameUrlHandlerMapping() { BeanNameUrlHandlerMapping beanNameUrlHandlerMapping = new BeanNameUrlHandlerMapping(); - beanNameUrlHandlerMapping.setOrder(0); + beanNameUrlHandlerMapping.setOrder(1); return beanNameUrlHandlerMapping; } @Bean public SimpleUrlHandlerMapping simpleUrlHandlerMapping() { SimpleUrlHandlerMapping simpleUrlHandlerMapping = new SimpleUrlHandlerMapping(); + simpleUrlHandlerMapping.setOrder(0); Map urlMap = new HashMap<>(); urlMap.put("/welcome", simpleUrlMapping()); simpleUrlHandlerMapping.setUrlMap(urlMap); diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/SimpleUrlHandlerMappingConfig.java b/spring-mvc-java/src/test/java/com/baeldung/config/SimpleUrlHandlerMappingConfig.java similarity index 96% rename from spring-mvc-java/src/main/java/com/baeldung/spring/web/config/SimpleUrlHandlerMappingConfig.java rename to spring-mvc-java/src/test/java/com/baeldung/config/SimpleUrlHandlerMappingConfig.java index a81b2fa14e..c7921c2706 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/SimpleUrlHandlerMappingConfig.java +++ b/spring-mvc-java/src/test/java/com/baeldung/config/SimpleUrlHandlerMappingConfig.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.web.config; +package com.baeldung.config; import java.util.HashMap; import java.util.Map; diff --git a/spring-mvc-java/src/test/java/com/baeldung/handlermappings/BeanNameMappingConfigTest.java b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/BeanNameMappingConfigTest.java index 628fd57e8c..f58e5cb0a1 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/handlermappings/BeanNameMappingConfigTest.java +++ b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/BeanNameMappingConfigTest.java @@ -1,6 +1,6 @@ package com.baeldung.handlermappings; -import com.baeldung.spring.web.config.BeanNameUrlHandlerMappingConfig; +import com.baeldung.config.BeanNameUrlHandlerMappingConfig; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-mvc-java/src/test/java/com/baeldung/handlermappings/ControllerClassNameHandlerMappingTest.java b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/ControllerClassNameHandlerMappingTest.java index e81b46f817..6fdd168d0b 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/handlermappings/ControllerClassNameHandlerMappingTest.java +++ b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/ControllerClassNameHandlerMappingTest.java @@ -17,7 +17,7 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; -import com.baeldung.spring.web.config.ControllerClassNameHandlerMappingConfig; +import com.baeldung.config.ControllerClassNameHandlerMappingConfig; @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration diff --git a/spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingDefaultConfigTest.java b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingDefaultConfigTest.java new file mode 100644 index 0000000000..01be65b829 --- /dev/null +++ b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingDefaultConfigTest.java @@ -0,0 +1,41 @@ +package com.baeldung.handlermappings; + +import com.baeldung.config.HandlerMappingDefaultConfig; +import com.baeldung.config.HandlerMappingPrioritiesConfig; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; + +@RunWith(SpringJUnit4ClassRunner.class) +@WebAppConfiguration +@ContextConfiguration(classes = HandlerMappingDefaultConfig.class) +public class HandlerMappingDefaultConfigTest { + + @Autowired + private WebApplicationContext webAppContext; + private MockMvc mockMvc; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + mockMvc = MockMvcBuilders.webAppContextSetup(webAppContext).build(); + } + + @Test + public void whenDefaultConfig_thenMappedOK() throws Exception { + mockMvc.perform(get("/welcome")).andExpect(status().isOk()).andExpect(view().name("bean-name-handler-mapping")).andDo(print()); + } +} \ No newline at end of file diff --git a/spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingPriorityConfigTest.java b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingPriorityConfigTest.java index 3157209a73..d6329ca6c1 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingPriorityConfigTest.java +++ b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingPriorityConfigTest.java @@ -1,7 +1,6 @@ package com.baeldung.handlermappings; -import com.baeldung.spring.web.config.HandlerMappingCustomPrioritiesConfig; -import com.baeldung.spring.web.config.HandlerMappingPrioritiesConfig; +import com.baeldung.config.HandlerMappingPrioritiesConfig; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -36,6 +35,6 @@ public class HandlerMappingPriorityConfigTest { @Test public void whenConfiguringPriorities_thenMappedOK() throws Exception { - mockMvc.perform(get("/welcome")).andExpect(status().isOk()).andExpect(view().name("bean-name-handler-mapping")).andDo(print()); + mockMvc.perform(get("/welcome")).andExpect(status().isOk()).andExpect(view().name("simple-url-handler-mapping")).andDo(print()); } } \ No newline at end of file diff --git a/spring-mvc-java/src/test/java/com/baeldung/handlermappings/SimpleUrlMappingConfigTest.java b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/SimpleUrlMappingConfigTest.java index 29420b155f..636339f152 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/handlermappings/SimpleUrlMappingConfigTest.java +++ b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/SimpleUrlMappingConfigTest.java @@ -1,6 +1,6 @@ package com.baeldung.handlermappings; -import com.baeldung.spring.web.config.SimpleUrlHandlerMappingConfig; +import com.baeldung.config.SimpleUrlHandlerMappingConfig; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-mvc-xml/README.md b/spring-mvc-xml/README.md index 097353c88c..7a5e8c75e9 100644 --- a/spring-mvc-xml/README.md +++ b/spring-mvc-xml/README.md @@ -13,4 +13,5 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Basic Forms with Spring MVC](http://www.baeldung.com/spring-mvc-form-tutorial) - [Returning Image/Media Data with Spring MVC](http://www.baeldung.com/spring-mvc-image-media-data) - [Geolocation by IP in Java](http://www.baeldung.com/geolocation-by-ip-with-maxmind) -- [Guide to JSP](http://www.baeldung.com/guide-to-jsp) \ No newline at end of file +- [Guide to JavaServer Pages (JSP)](http://www.baeldung.com/jsp) +- [Exploring SpringMVC’s Form Tag Library](http://www.baeldung.com/spring-mvc-form-tags) diff --git a/spring-reactor/pom.xml b/spring-reactor/pom.xml index 7b6b1318cf..a04955eada 100644 --- a/spring-reactor/pom.xml +++ b/spring-reactor/pom.xml @@ -39,6 +39,17 @@ org.springframework.boot spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-surefire-plugin + + + **/*IntegrationTest.java + **/*LiveTest.java + + + diff --git a/spring-remoting/pom.xml b/spring-remoting/pom.xml new file mode 100644 index 0000000000..2e3b7e76f8 --- /dev/null +++ b/spring-remoting/pom.xml @@ -0,0 +1,109 @@ + + + 4.0.0 + com.baeldung + spring-remoting + 1.0-SNAPSHOT + pom + + + 3.6.0 + 3.0.0 + + 3.1.0 + 1.1.8 + 4.3.5.RELEASE + + + + + + + + org.springframework + spring-core + ${spring.version} + + + org.springframework + spring-context + ${spring.version} + + + org.springframework + spring-web + ${spring.version} + + + org.springframework + spring-webmvc + ${spring.version} + + + + + ch.qos.logback + logback-core + ${logback.version} + + + ch.qos.logback + logback-classic + ${logback.version} + + + + + javax.servlet + javax.servlet-api + ${servlet.version} + provided + + + + + ${project.groupId} + api + ${project.version} + + + + + + + + + + + + maven-compiler-plugin + ${maven-compiler-plugin.version} + + true + true + 1.8 + 1.8 + UTF-8 + true + true + + + + + maven-war-plugin + 3.0.0 + + false + + + + + + + + remoting-http + + + \ No newline at end of file diff --git a/spring-remoting/remoting-http/api/pom.xml b/spring-remoting/remoting-http/api/pom.xml new file mode 100644 index 0000000000..633217f7de --- /dev/null +++ b/spring-remoting/remoting-http/api/pom.xml @@ -0,0 +1,14 @@ + + + + spring-remoting-http + com.baeldung + 1.0-SNAPSHOT + + 4.0.0 + api + spring-remoting-http-api + API definition shared between client and server. + \ No newline at end of file diff --git a/spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/Address.java b/spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/Address.java new file mode 100644 index 0000000000..f2382fabd9 --- /dev/null +++ b/spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/Address.java @@ -0,0 +1,26 @@ +package com.baeldung.api; + +import java.io.Serializable; + +public class Address implements Serializable{ + + private String address; + private String countryCode; + + public Address(String address, String countryCode) { + this.address = address; + this.countryCode = countryCode; + } + + public String getAddress() { + return address; + } + + public String getCountryCode() { + return countryCode; + } + + @Override public String toString() { + return address + " (" + countryCode + ")"; + } +} diff --git a/spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/Booking.java b/spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/Booking.java new file mode 100644 index 0000000000..7bec4e162d --- /dev/null +++ b/spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/Booking.java @@ -0,0 +1,52 @@ +package com.baeldung.api; + +import java.io.Serializable; +import java.time.LocalDateTime; + +public class Booking implements Serializable { + + private int costInCent; + private int etaInSeconds; + private String bookingCode; + private LocalDateTime pickUptime; + private Address pickUpAddress; + private Address dropOffAddress; + + public Booking(Address pickUpAddress, LocalDateTime pickUptime, Address dropOffAddress, int costInCent, int etaInSeconds, String bookingCode) { + this.costInCent = costInCent; + this.etaInSeconds = etaInSeconds; + this.bookingCode = bookingCode; + this.pickUptime = pickUptime; + this.pickUpAddress = pickUpAddress; + this.dropOffAddress = dropOffAddress; + } + + public int getCostInCent() { + return costInCent; + } + + public int getEtaInSeconds() { + return etaInSeconds; + } + + public String getBookingCode() { + return bookingCode; + } + + public LocalDateTime getPickUptime() { + return pickUptime; + } + + public Address getDropOffAddress() { + return dropOffAddress; + } + + @Override public String toString() { + return String.format("Booking: pick up @ %tr in %s, drop down in %s after %d minutes, %.2f $.", pickUptime, pickUpAddress, dropOffAddress, etaInSeconds / 60, costInCent / 100.0); + } + + public static void main(String[] args) throws InterruptedException { + System.out.println(new Booking(new Address("a", "b"), + LocalDateTime.now(), new Address("c", "d"), 123_00, 600, "abc")); + } +} diff --git a/spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/BookingException.java b/spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/BookingException.java new file mode 100644 index 0000000000..4099db2908 --- /dev/null +++ b/spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/BookingException.java @@ -0,0 +1,7 @@ +package com.baeldung.api; + +public class BookingException extends Exception { + public BookingException(String message) { + super(message); + } +} diff --git a/spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/CabBookingService.java b/spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/CabBookingService.java new file mode 100644 index 0000000000..25b27264e8 --- /dev/null +++ b/spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/CabBookingService.java @@ -0,0 +1,5 @@ +package com.baeldung.api; + +public interface CabBookingService { + Booking bookPickUp(Address pickUpLocation, Address dropOffLocation, int pax) throws BookingException; +} diff --git a/spring-remoting/remoting-http/client/pom.xml b/spring-remoting/remoting-http/client/pom.xml new file mode 100644 index 0000000000..77891c106a --- /dev/null +++ b/spring-remoting/remoting-http/client/pom.xml @@ -0,0 +1,30 @@ + + + 4.0.0 + + + com.baeldung + spring-remoting-http + 1.0-SNAPSHOT + + + spring-remoting-http-client + Shows how to invoke a remote service using Spring Remoting. + + + + + org.springframework + spring-web + + + + + ${project.groupId} + api + + + + \ No newline at end of file diff --git a/spring-remoting/remoting-http/client/src/main/java/com/baeldug/client/CabBookingClient.java b/spring-remoting/remoting-http/client/src/main/java/com/baeldug/client/CabBookingClient.java new file mode 100644 index 0000000000..9669970403 --- /dev/null +++ b/spring-remoting/remoting-http/client/src/main/java/com/baeldug/client/CabBookingClient.java @@ -0,0 +1,21 @@ +package com.baeldug.client; + +import com.baeldung.api.*; + +public class CabBookingClient { + + private CabBookingService cabService; + + public CabBookingClient(CabBookingService cabService) { + this.cabService = cabService; + } + + public void run() throws BookingException { + + Address pickUp = new Address("13 Seagate Blvd, Key Largo, FL 33037", "US"); + Address dropDown = new Address("91831 Overseas Hwy, Tavernier, FL 33070", "US"); + System.out.println( cabService.bookPickUp(pickUp, dropDown, 3) ); + + } + +} diff --git a/spring-remoting/remoting-http/client/src/main/java/com/baeldug/client/Main.java b/spring-remoting/remoting-http/client/src/main/java/com/baeldug/client/Main.java new file mode 100644 index 0000000000..a5e3ccd912 --- /dev/null +++ b/spring-remoting/remoting-http/client/src/main/java/com/baeldug/client/Main.java @@ -0,0 +1,34 @@ +package com.baeldug.client; + +import com.baeldung.api.CabBookingService; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean; + +@Configuration +public class Main { + + @Bean + public HttpInvokerProxyFactoryBean invoker() { + HttpInvokerProxyFactoryBean invoker = new HttpInvokerProxyFactoryBean(); + invoker.setServiceUrl("http://localhost:9090/spring-remoting-http-server/booking"); + invoker.setServiceInterface(CabBookingService.class); + return invoker; + } + + @Bean + public CabBookingClient client(CabBookingService service){ + return new CabBookingClient(service); + } + + public static void main(String[] args) throws Exception { + AnnotationConfigApplicationContext rootContext = + new AnnotationConfigApplicationContext(); + rootContext.scan(Main.class.getPackage().getName()); + rootContext.refresh(); + CabBookingClient bean = rootContext.getBean(CabBookingClient.class); + bean.run(); + } + +} diff --git a/spring-remoting/remoting-http/pom.xml b/spring-remoting/remoting-http/pom.xml new file mode 100644 index 0000000000..0d08779bd7 --- /dev/null +++ b/spring-remoting/remoting-http/pom.xml @@ -0,0 +1,20 @@ + + + 4.0.0 + + com.baeldung + spring-remoting + 1.0-SNAPSHOT + + spring-remoting-http + Parent for all modules related to HTTP Spring Remoting + pom + + + server + client + api + + \ No newline at end of file diff --git a/spring-remoting/remoting-http/server/pom.xml b/spring-remoting/remoting-http/server/pom.xml new file mode 100644 index 0000000000..32a99716a5 --- /dev/null +++ b/spring-remoting/remoting-http/server/pom.xml @@ -0,0 +1,65 @@ + + + 4.0.0 + + com.baeldung + spring-remoting-http + 1.0-SNAPSHOT + + war + + spring-remoting-http-server + Shows how to expose a service using Spring Remoting + + + 2.2 + + + + + + + + + org.springframework + spring-webmvc + + + + + javax.servlet + javax.servlet-api + + + + + ${project.groupId} + api + + + + + + + + maven-compiler-plugin + + + + maven-war-plugin + + + + org.apache.tomcat.maven + tomcat7-maven-plugin + ${tomcat7-maven-plugin.version} + + 9090 + + + + + + \ No newline at end of file diff --git a/spring-remoting/remoting-http/server/readme.md b/spring-remoting/remoting-http/server/readme.md new file mode 100644 index 0000000000..4a2abb5d03 --- /dev/null +++ b/spring-remoting/remoting-http/server/readme.md @@ -0,0 +1,12 @@ +Build and launch with the following command. + + mvn clean package tomcat7:run-war + +Exposed service is available at following URL. + + http://localhost:9090/spring-remoting-http-server/account + +## References + + + diff --git a/spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/CabBookingConfig.java b/spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/CabBookingConfig.java new file mode 100644 index 0000000000..146d2ecadb --- /dev/null +++ b/spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/CabBookingConfig.java @@ -0,0 +1,10 @@ +package com.baeldung.server; + +import org.springframework.context.annotation.Configuration; + +@Configuration +public class CabBookingConfig { + + + +} diff --git a/spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/CabBookingInitializer.java b/spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/CabBookingInitializer.java new file mode 100644 index 0000000000..53b3fd5faf --- /dev/null +++ b/spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/CabBookingInitializer.java @@ -0,0 +1,34 @@ +package com.baeldung.server; + +import org.springframework.web.WebApplicationInitializer; +import org.springframework.web.context.ContextLoaderListener; +import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; +import org.springframework.web.servlet.DispatcherServlet; + +import javax.servlet.ServletContext; +import javax.servlet.ServletRegistration; + +public class CabBookingInitializer implements WebApplicationInitializer { + + @Override + public void onStartup(ServletContext container) { + AnnotationConfigWebApplicationContext rootContext = + new AnnotationConfigWebApplicationContext(); + rootContext.register(CabBookingConfig.class); + + // Manage the lifecycle of the root application context + container.addListener(new ContextLoaderListener(rootContext)); + + // Create the dispatcher servlet's Spring application context + AnnotationConfigWebApplicationContext dispatcherContext = + new AnnotationConfigWebApplicationContext(); + dispatcherContext.register(DispatcherConfig.class); + + // Register and map the dispatcher servlet + ServletRegistration.Dynamic dispatcher = + container.addServlet("dispatcher", new DispatcherServlet(dispatcherContext)); + dispatcher.setLoadOnStartup(1); + dispatcher.addMapping("/*"); + } + +} diff --git a/spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/CabBookingServiceImpl.java b/spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/CabBookingServiceImpl.java new file mode 100644 index 0000000000..8f3c099fe0 --- /dev/null +++ b/spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/CabBookingServiceImpl.java @@ -0,0 +1,27 @@ +package com.baeldung.server; + +import com.baeldung.api.Address; +import com.baeldung.api.Booking; +import com.baeldung.api.BookingException; +import com.baeldung.api.CabBookingService; + +import java.time.LocalDateTime; + +import static java.lang.Math.random; +import static java.time.LocalDateTime.now; +import static java.time.temporal.ChronoUnit.MINUTES; +import static java.util.UUID.randomUUID; + +public class CabBookingServiceImpl implements CabBookingService { + + @Override public Booking bookPickUp(Address pickUpLocation, Address dropOffLocation, int pax) throws BookingException { + if (random() < 0.3) { + throw new BookingException("Cab unavailable"); + } + int tripTimeInMinutes = (int) (5 + random() * 15); + int costInCent = 15_00 + tripTimeInMinutes * 5 * pax; + LocalDateTime pickUpDate = now().plus(15L * (long) (random() * 10), MINUTES); + + return new Booking(pickUpLocation, pickUpDate, dropOffLocation, costInCent, tripTimeInMinutes * 60, randomUUID().toString()); + } +} diff --git a/spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/DispatcherConfig.java b/spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/DispatcherConfig.java new file mode 100644 index 0000000000..8f9391f8ac --- /dev/null +++ b/spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/DispatcherConfig.java @@ -0,0 +1,18 @@ +package com.baeldung.server; + +import com.baeldung.api.CabBookingService; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter; + +@Configuration +public class DispatcherConfig { + + @Bean(name = "/booking") HttpInvokerServiceExporter accountService() { + HttpInvokerServiceExporter exporter = new HttpInvokerServiceExporter(); + exporter.setService( new CabBookingServiceImpl() ); + exporter.setServiceInterface( CabBookingService.class ); + return exporter; + } + +} diff --git a/spring-remoting/remoting-http/server/src/main/resources/logback.xml b/spring-remoting/remoting-http/server/src/main/resources/logback.xml new file mode 100644 index 0000000000..566c44b448 --- /dev/null +++ b/spring-remoting/remoting-http/server/src/main/resources/logback.xml @@ -0,0 +1,16 @@ + + + + + + + ${logPattern} + + + + + + + \ No newline at end of file diff --git a/spring-security-client/spring-security-thymeleaf-authentication/src/main/java/org/baeldung/config/RegistrationController.java b/spring-security-client/spring-security-thymeleaf-authentication/src/main/java/org/baeldung/config/RegistrationController.java index da8f5f0e73..2414ff9cac 100644 --- a/spring-security-client/spring-security-thymeleaf-authentication/src/main/java/org/baeldung/config/RegistrationController.java +++ b/spring-security-client/spring-security-thymeleaf-authentication/src/main/java/org/baeldung/config/RegistrationController.java @@ -1,11 +1,9 @@ package org.baeldung.config; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Profile; import org.springframework.security.authentication.AbstractAuthenticationToken; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.BadCredentialsException; @@ -14,9 +12,10 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.web.authentication.WebAuthenticationDetails; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.context.annotation.Profile; +import org.springframework.web.bind.annotation.GetMapping; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; /** * Manually authenticate a user using Spring Security / Spring Web MVC' (upon successful account registration) @@ -40,7 +39,7 @@ public class RegistrationController { * @return The view. Page confirming either successful registration (and/or * successful authentication) or failed registration. */ - @RequestMapping(value = "/register", method = RequestMethod.GET) + @GetMapping("/register") public String registerAndAuthenticate(HttpServletRequest request, HttpServletResponse response) { logger.debug("registerAndAuthenticate: attempt to register, application should manually authenticate."); diff --git a/spring-sleuth/pom.xml b/spring-sleuth/pom.xml new file mode 100644 index 0000000000..80415dc00d --- /dev/null +++ b/spring-sleuth/pom.xml @@ -0,0 +1,64 @@ + + + 4.0.0 + + com.baeldung + spring-sleuth + 1.0.0-SNAPSHOT + jar + + + org.springframework.boot + spring-boot-starter-parent + 1.4.3.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.cloud + spring-cloud-starter-sleuth + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.cloud + spring-cloud-dependencies + Camden.SR3 + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + \ No newline at end of file diff --git a/spring-sleuth/src/main/java/com/baeldung/spring/session/SchedulingService.java b/spring-sleuth/src/main/java/com/baeldung/spring/session/SchedulingService.java new file mode 100644 index 0000000000..70d4270b41 --- /dev/null +++ b/spring-sleuth/src/main/java/com/baeldung/spring/session/SchedulingService.java @@ -0,0 +1,26 @@ +package com.baeldung.spring.session; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +@Service +public class SchedulingService { + + private Logger logger = LoggerFactory.getLogger(this.getClass()); + private final SleuthService sleuthService; + + @Autowired + public SchedulingService(SleuthService sleuthService) { + this.sleuthService = sleuthService; + } + + @Scheduled(fixedDelay = 30000) + public void scheduledWork() throws InterruptedException { + logger.info("Start some work from the scheduled task"); + sleuthService.asyncMethod(); + logger.info("End work from scheduled task"); + } +} diff --git a/spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthController.java b/spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthController.java new file mode 100644 index 0000000000..ada1152a4e --- /dev/null +++ b/spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthController.java @@ -0,0 +1,68 @@ +package com.baeldung.spring.session; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.concurrent.Executor; + +@RestController +public class SleuthController { + + private Logger logger = LoggerFactory.getLogger(this.getClass()); + private final SleuthService sleuthService; + private final Executor executor; + + @Autowired + public SleuthController(SleuthService sleuthService, Executor executor) { + this.sleuthService = sleuthService; + this.executor = executor; + } + + @GetMapping("/") + public String helloSleuth() { + logger.info("Hello Sleuth"); + return "success"; + } + + @GetMapping("/same-span") + public String helloSleuthSameSpan() throws InterruptedException { + logger.info("Same Span"); + sleuthService.doSomeWorkSameSpan(); + return "success"; + } + + @GetMapping("/new-span") + public String helloSleuthNewSpan() throws InterruptedException { + logger.info("New Span"); + sleuthService.doSomeWorkNewSpan(); + return "success"; + } + + @GetMapping("/new-thread") + public String helloSleuthNewThread() { + logger.info("New Thread"); + Runnable runnable = () -> { + try { + Thread.sleep(1000L); + } catch (InterruptedException e) { + e.printStackTrace(); + } + logger.info("I'm inside the new thread - with a new span"); + }; + executor.execute(runnable); + + logger.info("I'm done - with the original span"); + return "success"; + } + + @GetMapping("/async") + public String helloSleuthAsync() throws InterruptedException { + logger.info("Before Async Method Call"); + sleuthService.asyncMethod(); + logger.info("After Async Method Call"); + return "success"; + } +} diff --git a/spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthService.java b/spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthService.java new file mode 100644 index 0000000000..38480a9b91 --- /dev/null +++ b/spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthService.java @@ -0,0 +1,46 @@ +package com.baeldung.spring.session; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.sleuth.Span; +import org.springframework.cloud.sleuth.Tracer; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +@Service +public class SleuthService { + private Logger logger = LoggerFactory.getLogger(this.getClass()); + private final Tracer tracer; + + @Autowired + public SleuthService(Tracer tracer) { + this.tracer = tracer; + } + + public void doSomeWorkSameSpan() throws InterruptedException { + Thread.sleep(1000L); + logger.info("Doing some work"); + } + + public void doSomeWorkNewSpan() throws InterruptedException { + logger.info("I'm in the original span"); + + Span newSpan = tracer.createSpan("newSpan"); + try { + Thread.sleep(1000L); + logger.info("I'm in the new span doing some cool work that needs its own span"); + } finally { + tracer.close(newSpan); + } + + logger.info("I'm in the original span"); + } + + @Async + public void asyncMethod() throws InterruptedException { + logger.info("Start Async Method"); + Thread.sleep(1000L); + logger.info("End Async Method"); + } +} diff --git a/spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthWebApp.java b/spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthWebApp.java new file mode 100644 index 0000000000..eb57231f53 --- /dev/null +++ b/spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthWebApp.java @@ -0,0 +1,11 @@ +package com.baeldung.spring.session; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SleuthWebApp { + public static void main(String[] args) { + SpringApplication.run(SleuthWebApp.class, args); + } +} diff --git a/spring-sleuth/src/main/java/com/baeldung/spring/session/ThreadConfig.java b/spring-sleuth/src/main/java/com/baeldung/spring/session/ThreadConfig.java new file mode 100644 index 0000000000..650be70f19 --- /dev/null +++ b/spring-sleuth/src/main/java/com/baeldung/spring/session/ThreadConfig.java @@ -0,0 +1,55 @@ +package com.baeldung.spring.session; + +import org.springframework.beans.factory.BeanFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.sleuth.instrument.async.LazyTraceExecutor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.AsyncConfigurerSupport; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; + +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; + +@Configuration +@EnableAsync +@EnableScheduling +public class ThreadConfig extends AsyncConfigurerSupport implements SchedulingConfigurer{ + + @Autowired + private BeanFactory beanFactory; + + @Bean + public Executor executor() { + ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); + threadPoolTaskExecutor.setCorePoolSize(1); + threadPoolTaskExecutor.setMaxPoolSize(1); + threadPoolTaskExecutor.initialize(); + + return new LazyTraceExecutor(beanFactory, threadPoolTaskExecutor); + } + + @Override + public Executor getAsyncExecutor() { + ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); + threadPoolTaskExecutor.setCorePoolSize(1); + threadPoolTaskExecutor.setMaxPoolSize(1); + threadPoolTaskExecutor.initialize(); + + return new LazyTraceExecutor(beanFactory, threadPoolTaskExecutor); + } + + @Override + public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) { + scheduledTaskRegistrar.setScheduler(schedulingExecutor()); + } + + @Bean(destroyMethod = "shutdown") + public Executor schedulingExecutor() { + return Executors.newScheduledThreadPool(1); + } +} diff --git a/spring-sleuth/src/main/resources/application.properties b/spring-sleuth/src/main/resources/application.properties new file mode 100644 index 0000000000..2678b57b0c --- /dev/null +++ b/spring-sleuth/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.application.name=Baeldung Sleuth Tutorial \ No newline at end of file diff --git a/spring-thymeleaf/README.md b/spring-thymeleaf/README.md index 6b12bb676c..3f8f0ab244 100644 --- a/spring-thymeleaf/README.md +++ b/spring-thymeleaf/README.md @@ -8,6 +8,8 @@ - [Thymeleaf: Custom Layout Dialect](http://www.baeldung.com/thymeleaf-spring-layouts) - [Spring and Thymeleaf 3: Expressions](http://www.baeldung.com/spring-thymeleaf-3-expressions) - [Spring MVC + Thymeleaf 3.0: New Features](http://www.baeldung.com/spring-thymeleaf-3) +- [How to Work with Dates in Thymeleaef](http://www.baeldung.com/dates-in-thymeleaf) +- [How to Create an Executable JAR with Maven](http://www.baeldung.com/executable-jar-with-maven) ### Build the Project diff --git a/spring-thymeleaf/pom.xml b/spring-thymeleaf/pom.xml index c43ab4dbb2..f5dfc9931e 100644 --- a/spring-thymeleaf/pom.xml +++ b/spring-thymeleaf/pom.xml @@ -259,4 +259,4 @@ - + \ No newline at end of file diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/config/WebMVCConfig.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/config/WebMVCConfig.java index 3dc84ed6e9..bbc4fa2532 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/config/WebMVCConfig.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/config/WebMVCConfig.java @@ -1,5 +1,7 @@ package com.baeldung.thymeleaf.config; +import java.util.Locale; + import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.Bean; @@ -8,10 +10,14 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Description; import org.springframework.context.support.ResourceBundleMessageSource; import org.springframework.format.FormatterRegistry; +import org.springframework.web.servlet.LocaleResolver; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; +import org.springframework.web.servlet.i18n.SessionLocaleResolver; import org.thymeleaf.TemplateEngine; import org.thymeleaf.extras.java8time.dialect.Java8TimeDialect; import org.thymeleaf.spring4.SpringTemplateEngine; @@ -26,7 +32,6 @@ import com.baeldung.thymeleaf.utils.ArrayUtil; import nz.net.ultraq.thymeleaf.LayoutDialect; import nz.net.ultraq.thymeleaf.decorators.strategies.GroupingStrategy; - @Configuration @EnableWebMvc @ComponentScan({ "com.baeldung.thymeleaf" }) @@ -36,11 +41,11 @@ import nz.net.ultraq.thymeleaf.decorators.strategies.GroupingStrategy; */ public class WebMVCConfig extends WebMvcConfigurerAdapter implements ApplicationContextAware { - private ApplicationContext applicationContext; + private ApplicationContext applicationContext; - public void setApplicationContext(ApplicationContext applicationContext) { - this.applicationContext = applicationContext; - } + public void setApplicationContext(ApplicationContext applicationContext) { + this.applicationContext = applicationContext; + } @Bean public ViewResolver htmlViewResolver() { @@ -51,69 +56,89 @@ public class WebMVCConfig extends WebMvcConfigurerAdapter implements Application resolver.setViewNames(ArrayUtil.array("*.html")); return resolver; } - + @Bean - public ViewResolver javascriptViewResolver() { - ThymeleafViewResolver resolver = new ThymeleafViewResolver(); - resolver.setTemplateEngine(templateEngine(javascriptTemplateResolver())); - resolver.setContentType("application/javascript"); - resolver.setCharacterEncoding("UTF-8"); - resolver.setViewNames(ArrayUtil.array("*.js")); - return resolver; - } - + public ViewResolver javascriptViewResolver() { + ThymeleafViewResolver resolver = new ThymeleafViewResolver(); + resolver.setTemplateEngine(templateEngine(javascriptTemplateResolver())); + resolver.setContentType("application/javascript"); + resolver.setCharacterEncoding("UTF-8"); + resolver.setViewNames(ArrayUtil.array("*.js")); + return resolver; + } + @Bean - public ViewResolver plainViewResolver() { - ThymeleafViewResolver resolver = new ThymeleafViewResolver(); - resolver.setTemplateEngine(templateEngine(plainTemplateResolver())); - resolver.setContentType("text/plain"); - resolver.setCharacterEncoding("UTF-8"); - resolver.setViewNames(ArrayUtil.array("*.txt")); - return resolver; - } + public ViewResolver plainViewResolver() { + ThymeleafViewResolver resolver = new ThymeleafViewResolver(); + resolver.setTemplateEngine(templateEngine(plainTemplateResolver())); + resolver.setContentType("text/plain"); + resolver.setCharacterEncoding("UTF-8"); + resolver.setViewNames(ArrayUtil.array("*.txt")); + return resolver; + } private TemplateEngine templateEngine(ITemplateResolver templateResolver) { - SpringTemplateEngine engine = new SpringTemplateEngine(); - engine.addDialect(new LayoutDialect(new GroupingStrategy())); - engine.addDialect(new Java8TimeDialect()); - engine.setTemplateResolver(templateResolver); - return engine; - } + SpringTemplateEngine engine = new SpringTemplateEngine(); + engine.addDialect(new LayoutDialect(new GroupingStrategy())); + engine.addDialect(new Java8TimeDialect()); + engine.setTemplateResolver(templateResolver); + engine.setTemplateEngineMessageSource(messageSource()); + return engine; + } - private ITemplateResolver htmlTemplateResolver() { - SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver(); - resolver.setApplicationContext(applicationContext); - resolver.setPrefix("/WEB-INF/views/"); - resolver.setCacheable(false); - resolver.setTemplateMode(TemplateMode.HTML); - return resolver; - } - - private ITemplateResolver javascriptTemplateResolver() { - SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver(); - resolver.setApplicationContext(applicationContext); - resolver.setPrefix("/WEB-INF/js/"); - resolver.setCacheable(false); - resolver.setTemplateMode(TemplateMode.JAVASCRIPT); - return resolver; - } - - private ITemplateResolver plainTemplateResolver() { - SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver(); - resolver.setApplicationContext(applicationContext); - resolver.setPrefix("/WEB-INF/txt/"); - resolver.setCacheable(false); - resolver.setTemplateMode(TemplateMode.TEXT); - return resolver; + private ITemplateResolver htmlTemplateResolver() { + SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver(); + resolver.setApplicationContext(applicationContext); + resolver.setPrefix("/WEB-INF/views/"); + resolver.setCacheable(false); + resolver.setTemplateMode(TemplateMode.HTML); + return resolver; + } + + private ITemplateResolver javascriptTemplateResolver() { + SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver(); + resolver.setApplicationContext(applicationContext); + resolver.setPrefix("/WEB-INF/js/"); + resolver.setCacheable(false); + resolver.setTemplateMode(TemplateMode.JAVASCRIPT); + return resolver; + } + + private ITemplateResolver plainTemplateResolver() { + SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver(); + resolver.setApplicationContext(applicationContext); + resolver.setPrefix("/WEB-INF/txt/"); + resolver.setCacheable(false); + resolver.setTemplateMode(TemplateMode.TEXT); + return resolver; + } + + @Bean + @Description("Spring Message Resolver") + public ResourceBundleMessageSource messageSource() { + ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); + messageSource.setBasename("messages"); + return messageSource; } @Bean - @Description("Spring Message Resolver") - public ResourceBundleMessageSource messageSource() { - ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); - messageSource.setBasename("messages"); - return messageSource; - } + public LocaleResolver localeResolver() { + SessionLocaleResolver localeResolver = new SessionLocaleResolver(); + localeResolver.setDefaultLocale(new Locale("en")); + return localeResolver; + } + + @Bean + public LocaleChangeInterceptor localeChangeInterceptor() { + LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor(); + localeChangeInterceptor.setParamName("lang"); + return localeChangeInterceptor; + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(localeChangeInterceptor()); + } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { @@ -121,8 +146,8 @@ public class WebMVCConfig extends WebMvcConfigurerAdapter implements Application } @Override - @Description("Custom Conversion Service") - public void addFormatters(FormatterRegistry registry) { - registry.addFormatter(new NameFormatter()); - } + @Description("Custom Conversion Service") + public void addFormatters(FormatterRegistry registry) { + registry.addFormatter(new NameFormatter()); + } } diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/config/WebMVCSecurity.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/config/WebMVCSecurity.java index 37844a2976..46bff38a3f 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/config/WebMVCSecurity.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/config/WebMVCSecurity.java @@ -37,13 +37,7 @@ public class WebMVCSecurity extends WebSecurityConfigurerAdapter { @Override protected void configure(final HttpSecurity http) throws Exception { - http - .authorizeRequests() - .anyRequest() - .authenticated() - .and() - .httpBasic() - ; + http.authorizeRequests().anyRequest().authenticated().and().httpBasic(); } } diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/ExpressionUtilityObjectsController.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/ExpressionUtilityObjectsController.java index f30b9b2078..61c3e8de8f 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/ExpressionUtilityObjectsController.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/ExpressionUtilityObjectsController.java @@ -17,17 +17,17 @@ import org.springframework.web.bind.annotation.RequestMethod; @Controller public class ExpressionUtilityObjectsController { - @RequestMapping(value = "/objects", method = RequestMethod.GET) - public String getDates(Model model) { - model.addAttribute("date", new Date()); - model.addAttribute("calendar", Calendar.getInstance()); - model.addAttribute("num", Math.random() * 10); - model.addAttribute("string", "new text"); - model.addAttribute("emptyString", ""); - model.addAttribute("nullString", null); - model.addAttribute("array", new int[] { 1, 3, 4, 5 }); - model.addAttribute("set", new HashSet(Arrays.asList(1, 3, 8))); - return "objects.html"; - } + @RequestMapping(value = "/objects", method = RequestMethod.GET) + public String getDates(Model model) { + model.addAttribute("date", new Date()); + model.addAttribute("calendar", Calendar.getInstance()); + model.addAttribute("num", Math.random() * 10); + model.addAttribute("string", "new text"); + model.addAttribute("emptyString", ""); + model.addAttribute("nullString", null); + model.addAttribute("array", new int[] { 1, 3, 4, 5 }); + model.addAttribute("set", new HashSet(Arrays.asList(1, 3, 8))); + return "objects.html"; + } } diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/HomeController.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/HomeController.java index f1a394cac4..21f230c84c 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/HomeController.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/HomeController.java @@ -18,7 +18,6 @@ public class HomeController { @RequestMapping(value = "/", method = RequestMethod.GET) public String getHome(Model model) { - DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, Locale.getDefault()); model.addAttribute("serverTime", dateFormat.format(new Date())); return "home.html"; diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/InliningController.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/InliningController.java index 9e3f14ac8e..e8e6339663 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/InliningController.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/InliningController.java @@ -11,23 +11,23 @@ import com.baeldung.thymeleaf.utils.StudentUtils; @Controller public class InliningController { - @RequestMapping(value = "/html", method = RequestMethod.GET) + @RequestMapping(value = "/html", method = RequestMethod.GET) public String getExampleHTML(Model model) { - model.addAttribute("title", "Baeldung"); - model.addAttribute("description", "Thymeleaf tutorial"); + model.addAttribute("title", "Baeldung"); + model.addAttribute("description", "Thymeleaf tutorial"); return "inliningExample.html"; } - - @RequestMapping(value = "/js", method = RequestMethod.GET) + + @RequestMapping(value = "/js", method = RequestMethod.GET) public String getExampleJS(Model model) { - model.addAttribute("students", StudentUtils.buildStudents()); + model.addAttribute("students", StudentUtils.buildStudents()); return "studentCheck.js"; } - - @RequestMapping(value = "/plain", method = RequestMethod.GET) + + @RequestMapping(value = "/plain", method = RequestMethod.GET) public String getExamplePlain(Model model) { - model.addAttribute("username", SecurityContextHolder.getContext().getAuthentication().getName()); - model.addAttribute("students", StudentUtils.buildStudents()); + model.addAttribute("username", SecurityContextHolder.getContext().getAuthentication().getName()); + model.addAttribute("students", StudentUtils.buildStudents()); return "studentsList.txt"; } } diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/LayoutDialectController.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/LayoutDialectController.java index 28a38ce30b..af999233bf 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/LayoutDialectController.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/LayoutDialectController.java @@ -7,8 +7,8 @@ import org.springframework.web.bind.annotation.RequestMethod; @Controller public class LayoutDialectController { - - @RequestMapping(value = "/layout", method = RequestMethod.GET) + + @RequestMapping(value = "/layout", method = RequestMethod.GET) public String getNewPage(Model model) { return "content.html"; } diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/StudentController.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/StudentController.java index 1f40046caa..77cf02c902 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/StudentController.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/StudentController.java @@ -21,30 +21,30 @@ import com.baeldung.thymeleaf.utils.StudentUtils; @Controller public class StudentController { - @RequestMapping(value = "/saveStudent", method = RequestMethod.POST) - public String saveStudent(@Valid @ModelAttribute Student student, BindingResult errors, Model model) { - if (!errors.hasErrors()) { - // get mock objects - List students = StudentUtils.buildStudents(); - // add current student - students.add(student); - model.addAttribute("students", students); - } - return ((errors.hasErrors()) ? "addStudent.html" : "listStudents.html"); - } + @RequestMapping(value = "/saveStudent", method = RequestMethod.POST) + public String saveStudent(@Valid @ModelAttribute Student student, BindingResult errors, Model model) { + if (!errors.hasErrors()) { + // get mock objects + List students = StudentUtils.buildStudents(); + // add current student + students.add(student); + model.addAttribute("students", students); + } + return ((errors.hasErrors()) ? "addStudent.html" : "listStudents.html"); + } - @RequestMapping(value = "/addStudent", method = RequestMethod.GET) - public String addStudent(Model model) { - model.addAttribute("student", new Student()); - return "addStudent.html"; - } + @RequestMapping(value = "/addStudent", method = RequestMethod.GET) + public String addStudent(Model model) { + model.addAttribute("student", new Student()); + return "addStudent.html"; + } - @RequestMapping(value = "/listStudents", method = RequestMethod.GET) - public String listStudent(Model model) { + @RequestMapping(value = "/listStudents", method = RequestMethod.GET) + public String listStudent(Model model) { - model.addAttribute("students", StudentUtils.buildStudents()); + model.addAttribute("students", StudentUtils.buildStudents()); - return "listStudents.html"; - } + return "listStudents.html"; + } } diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/utils/ArrayUtil.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/utils/ArrayUtil.java index d85c70c1b7..5c07476c9b 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/utils/ArrayUtil.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/utils/ArrayUtil.java @@ -2,7 +2,7 @@ package com.baeldung.thymeleaf.utils; public class ArrayUtil { - public static String[] array(String... args) { - return args; - } + public static String[] array(String... args) { + return args; + } } \ No newline at end of file diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/utils/StudentUtils.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/utils/StudentUtils.java index f7ed254641..5ee2b7eb85 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/utils/StudentUtils.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/utils/StudentUtils.java @@ -7,28 +7,28 @@ import com.baeldung.thymeleaf.model.Student; public class StudentUtils { - private static List students = new ArrayList(); + private static List students = new ArrayList(); - public static List buildStudents() { - if (students.isEmpty()){ - Student student1 = new Student(); - student1.setId(1001); - student1.setName("John Smith"); - student1.setGender('M'); - student1.setPercentage(Float.valueOf("80.45")); + public static List buildStudents() { + if (students.isEmpty()) { + Student student1 = new Student(); + student1.setId(1001); + student1.setName("John Smith"); + student1.setGender('M'); + student1.setPercentage(Float.valueOf("80.45")); - students.add(student1); + students.add(student1); - Student student2 = new Student(); - student2.setId(1002); - student2.setName("Jane Williams"); - student2.setGender('F'); - student2.setPercentage(Float.valueOf("60.25")); + Student student2 = new Student(); + student2.setId(1002); + student2.setName("Jane Williams"); + student2.setGender('F'); + student2.setPercentage(Float.valueOf("60.25")); - students.add(student2); - } - - return students; - } + students.add(student2); + } + + return students; + } } diff --git a/spring-thymeleaf/src/main/resources/messages_en_US.properties b/spring-thymeleaf/src/main/resources/messages_en.properties similarity index 100% rename from spring-thymeleaf/src/main/resources/messages_en_US.properties rename to spring-thymeleaf/src/main/resources/messages_en.properties diff --git a/spring-thymeleaf/src/main/webapp/WEB-INF/views/home.html b/spring-thymeleaf/src/main/webapp/WEB-INF/views/home.html index 8adecc49f1..aa4047641c 100644 --- a/spring-thymeleaf/src/main/webapp/WEB-INF/views/home.html +++ b/spring-thymeleaf/src/main/webapp/WEB-INF/views/home.html @@ -1,6 +1,6 @@ - + Home diff --git a/spring-thymeleaf/src/test/java/com/baeldung/thymeleaf/controller/ExpressionUtilityObjectsControllerIntegrationTest.java b/spring-thymeleaf/src/test/java/com/baeldung/thymeleaf/controller/ExpressionUtilityObjectsControllerIntegrationTest.java index 923d98324b..597583eee0 100644 --- a/spring-thymeleaf/src/test/java/com/baeldung/thymeleaf/controller/ExpressionUtilityObjectsControllerIntegrationTest.java +++ b/spring-thymeleaf/src/test/java/com/baeldung/thymeleaf/controller/ExpressionUtilityObjectsControllerIntegrationTest.java @@ -50,16 +50,14 @@ public class ExpressionUtilityObjectsControllerIntegrationTest { mockMvc = MockMvcBuilders.webAppContextSetup(wac).addFilters(springSecurityFilterChain).build(); } - @Test - public void testGetObjects() throws Exception { - mockMvc.perform(get("/objects").with(testUser()).with(csrf())).andExpect(status().isOk()) - .andExpect(view().name("objects.html")); - } + @Test + public void testGetObjects() throws Exception { + mockMvc.perform(get("/objects").with(testUser()).with(csrf())).andExpect(status().isOk()).andExpect(view().name("objects.html")); + } - @Test - public void testDates() throws Exception { - mockMvc.perform(get("/dates").with(testUser()).with(csrf())).andExpect(status().isOk()) - .andExpect(view().name("dates.html")); - } + @Test + public void testDates() throws Exception { + mockMvc.perform(get("/dates").with(testUser()).with(csrf())).andExpect(status().isOk()).andExpect(view().name("dates.html")); + } } diff --git a/spring-thymeleaf/src/test/java/com/baeldung/thymeleaf/controller/LayoutDialectControllerIntegrationTest.java b/spring-thymeleaf/src/test/java/com/baeldung/thymeleaf/controller/LayoutDialectControllerIntegrationTest.java index 23113dc229..62c364f864 100644 --- a/spring-thymeleaf/src/test/java/com/baeldung/thymeleaf/controller/LayoutDialectControllerIntegrationTest.java +++ b/spring-thymeleaf/src/test/java/com/baeldung/thymeleaf/controller/LayoutDialectControllerIntegrationTest.java @@ -31,7 +31,7 @@ import com.baeldung.thymeleaf.config.WebMVCSecurity; @ContextConfiguration(classes = { WebApp.class, WebMVCConfig.class, WebMVCSecurity.class, InitSecurity.class }) public class LayoutDialectControllerIntegrationTest { - @Autowired + @Autowired WebApplicationContext wac; @Autowired MockHttpSession session; @@ -50,9 +50,9 @@ public class LayoutDialectControllerIntegrationTest { mockMvc = MockMvcBuilders.webAppContextSetup(wac).addFilters(springSecurityFilterChain).build(); } - @Test - public void testGetDates() throws Exception{ - mockMvc.perform(get("/layout").with(testUser()).with(csrf())).andExpect(status().isOk()).andExpect(view().name("content.html")); - } + @Test + public void testGetDates() throws Exception { + mockMvc.perform(get("/layout").with(testUser()).with(csrf())).andExpect(status().isOk()).andExpect(view().name("content.html")); + } } diff --git a/spring-thymeleaf/src/test/java/org/baeldung/security/csrf/CsrfEnabledIntegrationTest.java b/spring-thymeleaf/src/test/java/org/baeldung/security/csrf/CsrfEnabledIntegrationTest.java index 3542571bbc..3d8ddfdd5c 100644 --- a/spring-thymeleaf/src/test/java/org/baeldung/security/csrf/CsrfEnabledIntegrationTest.java +++ b/spring-thymeleaf/src/test/java/org/baeldung/security/csrf/CsrfEnabledIntegrationTest.java @@ -59,17 +59,17 @@ public class CsrfEnabledIntegrationTest { public void addStudentWithCSRF() throws Exception { mockMvc.perform(post("/saveStudent").contentType(MediaType.APPLICATION_JSON).param("id", "1234567").param("name", "Joe").param("gender", "M").with(testUser()).with(csrf())).andExpect(status().isOk()); } - + @Test public void htmlInliningTest() throws Exception { mockMvc.perform(get("/html").with(testUser()).with(csrf())).andExpect(status().isOk()).andExpect(view().name("inliningExample.html")); } - + @Test public void jsInliningTest() throws Exception { mockMvc.perform(get("/js").with(testUser()).with(csrf())).andExpect(status().isOk()).andExpect(view().name("studentCheck.js")); } - + @Test public void plainInliningTest() throws Exception { mockMvc.perform(get("/plain").with(testUser()).with(csrf())).andExpect(status().isOk()).andExpect(view().name("studentsList.txt"));