diff --git a/.gitignore b/.gitignore
index 30f0f0cbc2..210807d09e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,3 +21,5 @@
# Maven
log/
target/
+
+spring-openid/src/main/resources/application.properties
diff --git a/.project b/.project
index 2d04570bfe..594b00d611 100644
--- a/.project
+++ b/.project
@@ -1,11 +1,17 @@
- parent
-
-
-
-
-
-
-
+ parent-modules
+
+
+
+
+
+ org.eclipse.m2e.core.maven2Builder
+
+
+
+
+
+ org.eclipse.m2e.core.maven2Nature
+
diff --git a/apache-fop/pom.xml b/apache-fop/pom.xml
index 95505f9374..658d567a90 100644
--- a/apache-fop/pom.xml
+++ b/apache-fop/pom.xml
@@ -1,6 +1,6 @@
4.0.0
- org.baeldung
+ com.baeldung
apache-fop
0.1-SNAPSHOT
@@ -142,16 +142,12 @@
-
- 4.1.5.RELEASE
- 3.2.5.RELEASE
-
- 4.3.8.Final
- 5.1.34
+ 4.3.11.Final
+ 5.1.38
- 2.5.5
+ 2.7.2
1.7.9
@@ -161,7 +157,7 @@
5.1.3.Final
- 17.0
+ 19.0
3.3.2
@@ -172,14 +168,14 @@
4.4
4.4
- 2.4.0
+ 2.9.0
- 3.2
+ 3.5.1
2.6
- 2.18.1
+ 2.19.1
2.7
- 1.4.12
+ 1.4.18
diff --git a/core-java-8/.project b/core-java-8/.project
index 235c555abb..a23ff42ae0 100644
--- a/core-java-8/.project
+++ b/core-java-8/.project
@@ -1,15 +1,10 @@
- core-java-8
+ core-java8
-
- org.eclipse.jdt.core.javabuilder
-
-
-
org.eclipse.m2e.core.maven2Builder
@@ -17,8 +12,6 @@
- org.eclipse.jem.workbench.JavaEMFNature
- org.eclipse.jdt.core.javanature
org.eclipse.m2e.core.maven2Nature
diff --git a/core-java-8/.settings/.jsdtscope b/core-java-8/.settings/.jsdtscope
deleted file mode 100644
index 7b3f0c8b9f..0000000000
--- a/core-java-8/.settings/.jsdtscope
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/core-java-8/.settings/org.eclipse.jdt.core.prefs b/core-java-8/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index c38ccc1294..0000000000
--- a/core-java-8/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,101 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
-org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
-org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
-org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
-org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
-org.eclipse.jdt.core.compiler.problem.deadCode=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
-org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
-org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=error
-org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
diff --git a/core-java-8/.settings/org.eclipse.jdt.ui.prefs b/core-java-8/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index d84d2a7f8c..0000000000
--- a/core-java-8/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,57 +0,0 @@
-eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_missing_override_annotations_interface_methods=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=true
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.convert_functional_interfaces=false
-sp_cleanup.convert_to_enhanced_for_loop=true
-sp_cleanup.correct_indentation=true
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=true
-sp_cleanup.make_local_variable_final=true
-sp_cleanup.make_parameters_final=true
-sp_cleanup.make_private_fields_final=false
-sp_cleanup.make_type_abstract_if_missing_method=false
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=false
-sp_cleanup.on_save_use_additional_actions=true
-sp_cleanup.organize_imports=true
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_trailing_whitespaces=true
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=true
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.use_anonymous_class_creation=false
-sp_cleanup.use_blocks=true
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_lambda=false
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_this_for_non_static_field_access=true
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=true
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/core-java-8/.settings/org.eclipse.m2e.core.prefs b/core-java-8/.settings/org.eclipse.m2e.core.prefs
deleted file mode 100644
index f897a7f1cb..0000000000
--- a/core-java-8/.settings/org.eclipse.m2e.core.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-activeProfiles=
-eclipse.preferences.version=1
-resolveWorkspaceProjects=true
-version=1
diff --git a/core-java-8/.springBeans b/core-java-8/.springBeans
deleted file mode 100644
index a79097f40d..0000000000
--- a/core-java-8/.springBeans
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
- 1
-
-
-
-
-
-
- src/main/webapp/WEB-INF/api-servlet.xml
-
-
-
-
diff --git a/core-java-8/README.md b/core-java-8/README.md
index 8bef3a1be0..b03d24c34e 100644
--- a/core-java-8/README.md
+++ b/core-java-8/README.md
@@ -8,3 +8,4 @@
- [Java – Try with Resources](http://www.baeldung.com/java-try-with-resources)
- [Lambda Expressions and Functional Interfaces: Tips and Best Practices](http://www.baeldung.com/java-8-lambda-expressions-tips)
- [The Double Colon Operator in Java 8](http://www.baeldung.com/java-8-double-colon-operator)
+- [A Guide to the Java ExecutorService](http://www.baeldung.com/java-executor-service-tutorial)
diff --git a/core-java-8/pom.xml b/core-java-8/pom.xml
index 07d3bcd146..0e589ebf47 100644
--- a/core-java-8/pom.xml
+++ b/core-java-8/pom.xml
@@ -1,10 +1,11 @@
-
+
4.0.0
- org.baeldung
- spring-rest
+ com.baeldung
+ core-java8
0.1-SNAPSHOT
- spring-rest
+ core-java8
@@ -114,9 +115,9 @@
1.10.19
- 3.3
+ 3.5.1
2.6
- 2.18.1
+ 2.19.1
2.7
diff --git a/core-java-8/src/main/java/com/baeldung/forkjoin/CustomRecursiveAction.java b/core-java-8/src/main/java/com/baeldung/forkjoin/CustomRecursiveAction.java
new file mode 100644
index 0000000000..f1ab2d8d09
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/forkjoin/CustomRecursiveAction.java
@@ -0,0 +1,49 @@
+package com.baeldung.forkjoin;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.ForkJoinTask;
+import java.util.concurrent.RecursiveAction;
+import java.util.logging.Logger;
+
+public class CustomRecursiveAction extends RecursiveAction {
+
+ private String workLoad = "";
+ private static final int THRESHOLD = 4;
+
+ private static Logger logger = Logger.getAnonymousLogger();
+
+ public CustomRecursiveAction(String workLoad) {
+ this.workLoad = workLoad;
+ }
+
+ @Override
+ protected void compute() {
+
+ if (workLoad.length() > THRESHOLD) {
+ ForkJoinTask.invokeAll(createSubtasks());
+ } else {
+ processing(workLoad);
+ }
+ }
+
+ private Collection createSubtasks() {
+
+ List subtasks =
+ new ArrayList<>();
+
+ String partOne = workLoad.substring(0, workLoad.length() / 2);
+ String partTwo = workLoad.substring(workLoad.length() / 2, workLoad.length());
+
+ subtasks.add(new CustomRecursiveAction(partOne));
+ subtasks.add(new CustomRecursiveAction(partTwo));
+
+ return subtasks;
+ }
+
+ private void processing(String work) {
+ String result = work.toUpperCase();
+ logger.info("This result - (" + result + ") - was processed by " + Thread.currentThread().getName());
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/forkjoin/CustomRecursiveTask.java b/core-java-8/src/main/java/com/baeldung/forkjoin/CustomRecursiveTask.java
new file mode 100644
index 0000000000..5d4d97b805
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/forkjoin/CustomRecursiveTask.java
@@ -0,0 +1,51 @@
+package com.baeldung.forkjoin;
+
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.ForkJoinTask;
+import java.util.concurrent.RecursiveTask;
+
+public class CustomRecursiveTask extends RecursiveTask {
+
+ private int[] arr;
+
+ private static final int THRESHOLD = 20;
+
+ public CustomRecursiveTask(int[] arr) {
+ this.arr = arr;
+ }
+
+ @Override
+ protected Integer compute() {
+
+ if (arr.length > THRESHOLD) {
+
+ return ForkJoinTask.invokeAll(createSubtasks())
+ .stream()
+ .mapToInt(ForkJoinTask::join)
+ .sum();
+
+ } else {
+ return processing(arr);
+ }
+ }
+
+ private Collection createSubtasks() {
+ List dividedTasks = new ArrayList<>();
+ dividedTasks.add(new CustomRecursiveTask(
+ Arrays.copyOfRange(arr, 0, arr.length / 2)));
+ dividedTasks.add(new CustomRecursiveTask(
+ Arrays.copyOfRange(arr, arr.length / 2, arr.length)));
+ return dividedTasks;
+ }
+
+ private Integer processing(int[] arr) {
+ return Arrays.stream(arr)
+ .filter(a -> a > 10 && a < 27)
+ .map(a -> a * 10)
+ .sum();
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/forkjoin/util/PoolUtil.java b/core-java-8/src/main/java/com/baeldung/forkjoin/util/PoolUtil.java
new file mode 100644
index 0000000000..521616600f
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/forkjoin/util/PoolUtil.java
@@ -0,0 +1,10 @@
+package com.baeldung.forkjoin.util;
+
+
+import java.util.concurrent.ForkJoinPool;
+
+public class PoolUtil {
+
+ public static ForkJoinPool forkJoinPool = new ForkJoinPool(2);
+
+}
diff --git a/core-java-8/src/main/java/com/baeldung/unzip/UnzipFile.java b/core-java-8/src/main/java/com/baeldung/unzip/UnzipFile.java
new file mode 100644
index 0000000000..6648d5f926
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/unzip/UnzipFile.java
@@ -0,0 +1,30 @@
+package com.baeldung.unzip;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+public class UnzipFile {
+ public static void main(final String[] args) throws IOException {
+ final String fileZip = "src/main/resources/compressed.zip";
+ final byte[] buffer = new byte[1024];
+ final ZipInputStream zis = new ZipInputStream(new FileInputStream(fileZip));
+ ZipEntry zipEntry = zis.getNextEntry();
+ while (zipEntry != null) {
+ final String fileName = zipEntry.getName();
+ final File newFile = new File("src/main/resources/unzipTest/" + fileName);
+ final FileOutputStream fos = new FileOutputStream(newFile);
+ int len;
+ while ((len = zis.read(buffer)) > 0) {
+ fos.write(buffer, 0, len);
+ }
+ fos.close();
+ zipEntry = zis.getNextEntry();
+ }
+ zis.closeEntry();
+ zis.close();
+ }
+}
\ No newline at end of file
diff --git a/core-java-8/src/main/java/com/baeldung/zip/ZipDirectory.java b/core-java-8/src/main/java/com/baeldung/zip/ZipDirectory.java
new file mode 100644
index 0000000000..7da71a093d
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/zip/ZipDirectory.java
@@ -0,0 +1,43 @@
+package com.baeldung.zip;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+public class ZipDirectory {
+ public static void main(final String[] args) throws IOException {
+ final String sourceFile = "src/main/resources/zipTest";
+ final FileOutputStream fos = new FileOutputStream("src/main/resources/dirCompressed.zip");
+ final ZipOutputStream zipOut = new ZipOutputStream(fos);
+ final File fileToZip = new File(sourceFile);
+
+ zipFile(fileToZip, fileToZip.getName(), zipOut);
+ zipOut.close();
+ fos.close();
+ }
+
+ private static void zipFile(final File fileToZip, final String fileName, final ZipOutputStream zipOut) throws IOException {
+ if (fileToZip.isHidden()) {
+ return;
+ }
+ if (fileToZip.isDirectory()) {
+ final File[] children = fileToZip.listFiles();
+ for (final File childFile : children) {
+ zipFile(childFile, fileName + "/" + childFile.getName(), zipOut);
+ }
+ return;
+ }
+ final FileInputStream fis = new FileInputStream(fileToZip);
+ final ZipEntry zipEntry = new ZipEntry(fileName);
+ zipOut.putNextEntry(zipEntry);
+ final byte[] bytes = new byte[1024];
+ int length;
+ while ((length = fis.read(bytes)) >= 0) {
+ zipOut.write(bytes, 0, length);
+ }
+ fis.close();
+ }
+}
\ No newline at end of file
diff --git a/core-java-8/src/main/java/com/baeldung/zip/ZipFile.java b/core-java-8/src/main/java/com/baeldung/zip/ZipFile.java
new file mode 100644
index 0000000000..f9ccac9713
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/zip/ZipFile.java
@@ -0,0 +1,28 @@
+package com.baeldung.zip;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+public class ZipFile {
+ public static void main(final String[] args) throws IOException {
+ final String sourceFile = "src/main/resources/zipTest/test1.txt";
+ final FileOutputStream fos = new FileOutputStream("src/main/resources/compressed.zip");
+ final ZipOutputStream zipOut = new ZipOutputStream(fos);
+ final File fileToZip = new File(sourceFile);
+ final FileInputStream fis = new FileInputStream(fileToZip);
+ final ZipEntry zipEntry = new ZipEntry(fileToZip.getName());
+ zipOut.putNextEntry(zipEntry);
+ final byte[] bytes = new byte[1024];
+ int length;
+ while ((length = fis.read(bytes)) >= 0) {
+ zipOut.write(bytes, 0, length);
+ }
+ zipOut.close();
+ fis.close();
+ fos.close();
+ }
+}
\ No newline at end of file
diff --git a/core-java-8/src/main/java/com/baeldung/zip/ZipMultipleFiles.java b/core-java-8/src/main/java/com/baeldung/zip/ZipMultipleFiles.java
new file mode 100644
index 0000000000..fc86147e43
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/zip/ZipMultipleFiles.java
@@ -0,0 +1,33 @@
+package com.baeldung.zip;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+public class ZipMultipleFiles {
+ public static void main(final String[] args) throws IOException {
+ final List srcFiles = Arrays.asList("src/main/resources/zipTest/test1.txt", "src/main/resources/zipTest/test2.txt");
+ final FileOutputStream fos = new FileOutputStream("src/main/resources/multiCompressed.zip");
+ final ZipOutputStream zipOut = new ZipOutputStream(fos);
+ for (final String srcFile : srcFiles) {
+ final File fileToZip = new File(srcFile);
+ final FileInputStream fis = new FileInputStream(fileToZip);
+ final ZipEntry zipEntry = new ZipEntry(fileToZip.getName());
+ zipOut.putNextEntry(zipEntry);
+
+ final byte[] bytes = new byte[1024];
+ int length;
+ while ((length = fis.read(bytes)) >= 0) {
+ zipOut.write(bytes, 0, length);
+ }
+ fis.close();
+ }
+ zipOut.close();
+ fos.close();
+ }
+}
\ No newline at end of file
diff --git a/core-java-8/src/main/resources/compressed.zip b/core-java-8/src/main/resources/compressed.zip
new file mode 100644
index 0000000000..03f840ae2b
Binary files /dev/null and b/core-java-8/src/main/resources/compressed.zip differ
diff --git a/core-java-8/src/main/resources/dirCompressed.zip b/core-java-8/src/main/resources/dirCompressed.zip
new file mode 100644
index 0000000000..f42d3aa5c6
Binary files /dev/null and b/core-java-8/src/main/resources/dirCompressed.zip differ
diff --git a/core-java-8/src/main/resources/logback.xml b/core-java-8/src/main/resources/logback.xml
index 62d0ea5037..eefdc7a337 100644
--- a/core-java-8/src/main/resources/logback.xml
+++ b/core-java-8/src/main/resources/logback.xml
@@ -10,7 +10,7 @@
-
+
\ No newline at end of file
diff --git a/core-java-8/src/main/resources/multiCompressed.zip b/core-java-8/src/main/resources/multiCompressed.zip
new file mode 100644
index 0000000000..002e70ef81
Binary files /dev/null and b/core-java-8/src/main/resources/multiCompressed.zip differ
diff --git a/core-java-8/src/main/resources/unzipTest/test1.txt b/core-java-8/src/main/resources/unzipTest/test1.txt
new file mode 100644
index 0000000000..c57eff55eb
--- /dev/null
+++ b/core-java-8/src/main/resources/unzipTest/test1.txt
@@ -0,0 +1 @@
+Hello World!
\ No newline at end of file
diff --git a/core-java-8/src/main/resources/zipTest/test1.txt b/core-java-8/src/main/resources/zipTest/test1.txt
new file mode 100644
index 0000000000..c57eff55eb
--- /dev/null
+++ b/core-java-8/src/main/resources/zipTest/test1.txt
@@ -0,0 +1 @@
+Hello World!
\ No newline at end of file
diff --git a/core-java-8/src/main/resources/zipTest/test2.txt b/core-java-8/src/main/resources/zipTest/test2.txt
new file mode 100644
index 0000000000..f0fb0f14d1
--- /dev/null
+++ b/core-java-8/src/main/resources/zipTest/test2.txt
@@ -0,0 +1 @@
+My Name is John
\ No newline at end of file
diff --git a/core-java-8/src/main/resources/zipTest/testFolder/test3.txt b/core-java-8/src/main/resources/zipTest/testFolder/test3.txt
new file mode 100644
index 0000000000..882edb168e
--- /dev/null
+++ b/core-java-8/src/main/resources/zipTest/testFolder/test3.txt
@@ -0,0 +1 @@
+My Name is Tom
\ No newline at end of file
diff --git a/core-java-8/src/main/resources/zipTest/testFolder/test4.txt b/core-java-8/src/main/resources/zipTest/testFolder/test4.txt
new file mode 100644
index 0000000000..a78c3fadc8
--- /dev/null
+++ b/core-java-8/src/main/resources/zipTest/testFolder/test4.txt
@@ -0,0 +1 @@
+My Name is Jane
\ No newline at end of file
diff --git a/core-java-8/src/test/java/com/baeldung/doublecolon/TestComputerUtils.java b/core-java-8/src/test/java/com/baeldung/doublecolon/TestComputerUtils.java
index 5ae6f02a56..85194f5aa6 100644
--- a/core-java-8/src/test/java/com/baeldung/doublecolon/TestComputerUtils.java
+++ b/core-java-8/src/test/java/com/baeldung/doublecolon/TestComputerUtils.java
@@ -6,7 +6,9 @@ import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
-import java.util.*;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
import java.util.function.BiFunction;
import static com.baeldung.doublecolon.ComputerUtils.*;
diff --git a/core-java-8/src/test/java/com/baeldung/java8/Java8CollectionCleanupUnitTest.java b/core-java-8/src/test/java/com/baeldung/java8/Java8CollectionCleanupUnitTest.java
index 9c248ad8ce..ef4b80c6e8 100644
--- a/core-java-8/src/test/java/com/baeldung/java8/Java8CollectionCleanupUnitTest.java
+++ b/core-java-8/src/test/java/com/baeldung/java8/Java8CollectionCleanupUnitTest.java
@@ -1,14 +1,13 @@
package com.baeldung.java8;
-import static org.hamcrest.Matchers.hasSize;
-import static org.junit.Assert.assertThat;
+import com.google.common.collect.Lists;
+import org.junit.Test;
import java.util.List;
import java.util.stream.Collectors;
-import org.junit.Test;
-
-import com.google.common.collect.Lists;
+import static org.hamcrest.Matchers.hasSize;
+import static org.junit.Assert.assertThat;
public class Java8CollectionCleanupUnitTest {
diff --git a/core-java-8/src/test/java/com/baeldung/java8/Java8ExecutorServiceTest.java b/core-java-8/src/test/java/com/baeldung/java8/Java8ExecutorServiceTest.java
new file mode 100644
index 0000000000..581ccec182
--- /dev/null
+++ b/core-java-8/src/test/java/com/baeldung/java8/Java8ExecutorServiceTest.java
@@ -0,0 +1,156 @@
+package com.baeldung.java8;
+
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.*;
+
+import static org.junit.Assert.*;
+
+
+public class Java8ExecutorServiceTest {
+
+ private Runnable runnableTask;
+ private Callable callableTask;
+ private List> callableTasks;
+
+ @Before
+ public void init() {
+
+ runnableTask = () -> {
+ try {
+ TimeUnit.MILLISECONDS.sleep(300);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ };
+
+ callableTask = () -> {
+ TimeUnit.MILLISECONDS.sleep(300);
+ return "Task's execution";
+ };
+
+ callableTasks = new ArrayList<>();
+ callableTasks.add(callableTask);
+ callableTasks.add(callableTask);
+ callableTasks.add(callableTask);
+ }
+
+ @Test
+ public void creationSubmittingTaskShuttingDown_whenShutDown_thenCorrect() {
+
+ ExecutorService executorService = Executors.newFixedThreadPool(10);
+ executorService.submit(runnableTask);
+ executorService.submit(callableTask);
+ executorService.shutdown();
+
+ assertTrue(executorService.isShutdown());
+ }
+
+ @Test
+ public void creationSubmittingTasksShuttingDownNow_whenShutDownAfterAwating_thenCorrect() {
+
+ ExecutorService threadPoolExecutor =
+ new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,
+ new LinkedBlockingQueue<>());
+
+ for (int i = 0; i < 100; i++) {
+ threadPoolExecutor.submit(callableTask);
+ }
+
+ List notExecutedTasks = smartShutdown(threadPoolExecutor);
+
+ assertTrue(threadPoolExecutor.isShutdown());
+ assertFalse(notExecutedTasks.isEmpty());
+ assertTrue(notExecutedTasks.size() > 0 && notExecutedTasks.size() < 98);
+ }
+
+ private List smartShutdown(ExecutorService executorService) {
+
+ List notExecutedTasks = new ArrayList<>();
+ executorService.shutdown();
+ try {
+ if (!executorService.awaitTermination(800, TimeUnit.MILLISECONDS)) {
+ notExecutedTasks = executorService.shutdownNow();
+ }
+ } catch (InterruptedException e) {
+ notExecutedTasks = executorService.shutdownNow();
+ }
+ return notExecutedTasks;
+ }
+
+ @Test
+ public void submittingTasks_whenExecutedOneAndAll_thenCorrect() {
+
+ ExecutorService executorService = Executors.newFixedThreadPool(10);
+
+ String result = null;
+ List> futures = new ArrayList<>();
+ try {
+ result = executorService.invokeAny(callableTasks);
+ futures = executorService.invokeAll(callableTasks);
+ } catch (InterruptedException | ExecutionException e) {
+ e.printStackTrace();
+ }
+
+ assertEquals("Task's execution", result);
+ assertTrue(futures.size() == 3);
+ }
+
+ @Test
+ public void submittingTaskShuttingDown_whenGetExpectedResult_thenCorrect() {
+
+ ExecutorService executorService = Executors.newFixedThreadPool(10);
+
+ Future future = executorService.submit(callableTask);
+ String result = null;
+ try {
+ result = future.get();
+ result = future.get(200, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException | ExecutionException | TimeoutException e) {
+ e.printStackTrace();
+ }
+
+ executorService.shutdown();
+
+ assertEquals("Task's execution", result);
+ }
+
+ @Test
+ public void submittingTask_whenCanceled_thenCorrect() {
+
+ ExecutorService executorService = Executors.newFixedThreadPool(10);
+
+ Future future = executorService.submit(callableTask);
+
+ boolean canceled = future.cancel(true);
+ boolean isCancelled = future.isCancelled();
+
+ executorService.shutdown();
+
+ assertTrue(canceled);
+ assertTrue(isCancelled);
+ }
+
+ @Test
+ public void submittingTaskScheduling_whenExecuted_thenCorrect() {
+
+ ScheduledExecutorService executorService = Executors
+ .newSingleThreadScheduledExecutor();
+
+ Future resultFuture = executorService.schedule(callableTask, 1, TimeUnit.SECONDS);
+ String result = null;
+ try {
+ result = resultFuture.get();
+ } catch (InterruptedException | ExecutionException e) {
+ e.printStackTrace();
+ }
+
+ executorService.shutdown();
+
+ assertEquals("Task's execution", result);
+ }
+}
diff --git a/core-java-8/src/test/java/com/baeldung/java8/Java8ForkJoinTest.java b/core-java-8/src/test/java/com/baeldung/java8/Java8ForkJoinTest.java
new file mode 100644
index 0000000000..273b2d78db
--- /dev/null
+++ b/core-java-8/src/test/java/com/baeldung/java8/Java8ForkJoinTest.java
@@ -0,0 +1,100 @@
+package com.baeldung.java8;
+
+
+import com.baeldung.forkjoin.CustomRecursiveAction;
+import com.baeldung.forkjoin.CustomRecursiveTask;
+import com.baeldung.forkjoin.util.PoolUtil;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Random;
+import java.util.concurrent.ForkJoinPool;
+
+import static org.junit.Assert.*;
+
+public class Java8ForkJoinTest {
+
+ private int[] arr;
+ private CustomRecursiveTask customRecursiveTask;
+
+ @Before
+ public void init() {
+ Random random = new Random();
+ arr = new int[50];
+ for (int i = 0; i < arr.length; i++) {
+ arr[i] = random.nextInt(35);
+ }
+ customRecursiveTask = new CustomRecursiveTask(arr);
+ }
+
+
+ @Test
+ public void callPoolUtil_whenExistsAndExpectedType_thenCorrect() {
+
+ ForkJoinPool forkJoinPool = PoolUtil.forkJoinPool;
+ ForkJoinPool forkJoinPoolTwo = PoolUtil.forkJoinPool;
+
+ assertNotNull(forkJoinPool);
+ assertEquals(2, forkJoinPool.getParallelism());
+ assertEquals(forkJoinPool, forkJoinPoolTwo);
+
+ }
+
+ @Test
+ public void callCommonPool_whenExistsAndExpectedType_thenCorrect() {
+
+ ForkJoinPool commonPool = ForkJoinPool.commonPool();
+ ForkJoinPool commonPoolTwo = ForkJoinPool.commonPool();
+
+ assertNotNull(commonPool);
+ assertEquals(commonPool, commonPoolTwo);
+
+ }
+
+ @Test
+ public void executeRecursiveAction_whenExecuted_thenCorrect() {
+
+ CustomRecursiveAction myRecursiveAction = new CustomRecursiveAction("ddddffffgggghhhh");
+ ForkJoinPool.commonPool().invoke(myRecursiveAction);
+
+ assertTrue(myRecursiveAction.isDone());
+
+ }
+
+ @Test
+ public void executeRecursiveTask_whenExecuted_thenCorrect() {
+
+ ForkJoinPool forkJoinPool = ForkJoinPool.commonPool();
+
+ forkJoinPool.execute(customRecursiveTask);
+ int result = customRecursiveTask.join();
+ assertTrue(customRecursiveTask.isDone());
+
+ forkJoinPool.submit(customRecursiveTask);
+ int resultTwo = customRecursiveTask.join();
+ assertTrue(customRecursiveTask.isDone());
+
+ }
+
+ @Test
+ public void executeRecursiveTaskWithFJ_whenExecuted_thenCorrect() {
+
+ CustomRecursiveTask customRecursiveTaskFirst = new CustomRecursiveTask(arr);
+ CustomRecursiveTask customRecursiveTaskSecond = new CustomRecursiveTask(arr);
+ CustomRecursiveTask customRecursiveTaskLast = new CustomRecursiveTask(arr);
+
+ customRecursiveTaskFirst.fork();
+ customRecursiveTaskSecond.fork();
+ customRecursiveTaskLast.fork();
+ int result = 0;
+ result += customRecursiveTaskLast.join();
+ result += customRecursiveTaskSecond.join();
+ result += customRecursiveTaskFirst.join();
+
+ assertTrue(customRecursiveTaskFirst.isDone());
+ assertTrue(customRecursiveTaskSecond.isDone());
+ assertTrue(customRecursiveTaskLast.isDone());
+ assertTrue(result != 0);
+
+ }
+}
diff --git a/core-java-8/src/test/java/com/baeldung/java8/Java8FunctionalInteracesLambdasTest.java b/core-java-8/src/test/java/com/baeldung/java8/Java8FunctionalInteracesLambdasTest.java
index 94448fcc83..faaf3ae407 100644
--- a/core-java-8/src/test/java/com/baeldung/java8/Java8FunctionalInteracesLambdasTest.java
+++ b/core-java-8/src/test/java/com/baeldung/java8/Java8FunctionalInteracesLambdasTest.java
@@ -1,16 +1,15 @@
package com.baeldung.java8;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-
-import java.util.function.Function;
-
-import org.junit.Before;
-import org.junit.Test;
-
import com.baeldung.Foo;
import com.baeldung.FooExtended;
import com.baeldung.UseFoo;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.function.Function;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
public class Java8FunctionalInteracesLambdasTest {
diff --git a/core-java-8/src/test/java/com/baeldung/java8/Java8SortUnitTest.java b/core-java-8/src/test/java/com/baeldung/java8/Java8SortUnitTest.java
index 2ba9e417d6..f371c0d7da 100644
--- a/core-java-8/src/test/java/com/baeldung/java8/Java8SortUnitTest.java
+++ b/core-java-8/src/test/java/com/baeldung/java8/Java8SortUnitTest.java
@@ -1,17 +1,16 @@
package com.baeldung.java8;
-import static org.hamcrest.Matchers.equalTo;
+import com.baeldung.java8.entity.Human;
+import com.google.common.collect.Lists;
+import com.google.common.primitives.Ints;
+import org.junit.Assert;
+import org.junit.Test;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
-import org.junit.Assert;
-import org.junit.Test;
-
-import com.baeldung.java8.entity.Human;
-import com.google.common.collect.Lists;
-import com.google.common.primitives.Ints;
+import static org.hamcrest.Matchers.equalTo;
public class Java8SortUnitTest {
diff --git a/core-java-8/src/test/java/com/baeldung/java8/JavaFolderSizeTest.java b/core-java-8/src/test/java/com/baeldung/java8/JavaFolderSizeTest.java
index 2ac16b5d1d..efd548a4b1 100644
--- a/core-java-8/src/test/java/com/baeldung/java8/JavaFolderSizeTest.java
+++ b/core-java-8/src/test/java/com/baeldung/java8/JavaFolderSizeTest.java
@@ -1,22 +1,18 @@
package com.baeldung.java8;
-import static org.junit.Assert.assertEquals;
+import org.apache.commons.io.FileUtils;
+import org.junit.Before;
+import org.junit.Test;
import java.io.File;
import java.io.IOException;
-import java.nio.file.FileVisitResult;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.SimpleFileVisitor;
+import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.text.DecimalFormat;
import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.StreamSupport;
-import org.apache.commons.io.FileUtils;
-import org.junit.Before;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
public class JavaFolderSizeTest {
@@ -93,7 +89,7 @@ public class JavaFolderSizeTest {
final File folder = new File(path);
final long size = getFolderSize(folder);
- final String[] units = new String[] { "B", "KB", "MB", "GB", "TB" };
+ final String[] units = new String[]{"B", "KB", "MB", "GB", "TB"};
final int unitIndex = (int) (Math.log10(size) / 3);
final double unitValue = 1 << (unitIndex * 10);
diff --git a/core-java-8/src/test/java/com/baeldung/java8/JavaTryWithResourcesTest.java b/core-java-8/src/test/java/com/baeldung/java8/JavaTryWithResourcesTest.java
index 18110b181d..224c4e9d6a 100644
--- a/core-java-8/src/test/java/com/baeldung/java8/JavaTryWithResourcesTest.java
+++ b/core-java-8/src/test/java/com/baeldung/java8/JavaTryWithResourcesTest.java
@@ -1,13 +1,13 @@
package com.baeldung.java8;
+import org.junit.Assert;
+import org.junit.Test;
+
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Date;
import java.util.Scanner;
-import org.junit.Assert;
-import org.junit.Test;
-
public class JavaTryWithResourcesTest {
private static final String TEST_STRING_HELLO_WORLD = "Hello World";
diff --git a/core-java-8/src/test/java/com/baeldung/java8/base64/ApacheCommonsEncodeDecodeTest.java b/core-java-8/src/test/java/com/baeldung/java8/base64/ApacheCommonsEncodeDecodeTest.java
index 07380cdd01..164a571817 100644
--- a/core-java-8/src/test/java/com/baeldung/java8/base64/ApacheCommonsEncodeDecodeTest.java
+++ b/core-java-8/src/test/java/com/baeldung/java8/base64/ApacheCommonsEncodeDecodeTest.java
@@ -1,14 +1,12 @@
package com.baeldung.java8.base64;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertNotNull;
-
-import java.io.UnsupportedEncodingException;
-
import org.apache.commons.codec.binary.Base64;
import org.junit.Test;
+import java.io.UnsupportedEncodingException;
+
+import static org.junit.Assert.*;
+
public class ApacheCommonsEncodeDecodeTest {
// tests
diff --git a/core-java-8/src/test/java/com/baeldung/java8/base64/Java8EncodeDecodeTest.java b/core-java-8/src/test/java/com/baeldung/java8/base64/Java8EncodeDecodeTest.java
index 3c504edbf3..18dccf71ba 100644
--- a/core-java-8/src/test/java/com/baeldung/java8/base64/Java8EncodeDecodeTest.java
+++ b/core-java-8/src/test/java/com/baeldung/java8/base64/Java8EncodeDecodeTest.java
@@ -1,14 +1,12 @@
package com.baeldung.java8.base64;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertNotNull;
+import org.junit.Test;
import java.io.UnsupportedEncodingException;
import java.util.Base64;
import java.util.UUID;
-import org.junit.Test;
+import static org.junit.Assert.*;
public class Java8EncodeDecodeTest {
diff --git a/core-java/pom.xml b/core-java/pom.xml
index b439b41f22..e3a9043b09 100644
--- a/core-java/pom.xml
+++ b/core-java/pom.xml
@@ -1,8 +1,8 @@
4.0.0
- org.baeldung
+ com.baeldung
core-java
- 0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
core-java
@@ -143,16 +143,12 @@
-
- 4.1.5.RELEASE
- 3.2.5.RELEASE
-
- 4.3.10.Final
- 5.1.35
+ 4.3.11.Final
+ 5.1.38
- 2.5.5
+ 2.7.2
1.7.13
@@ -173,14 +169,14 @@
4.4.1
4.5
- 2.4.1
+ 2.9.0
- 3.3
+ 3.5.1
2.6
- 2.18.1
+ 2.19.1
2.7
- 1.4.14
+ 1.4.18
diff --git a/core-java/src/main/webapp/WEB-INF/api-servlet.xml b/core-java/src/main/webapp/WEB-INF/api-servlet.xml
deleted file mode 100644
index 4c74be8912..0000000000
--- a/core-java/src/main/webapp/WEB-INF/api-servlet.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/core-java/src/main/webapp/WEB-INF/web.xml b/core-java/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index 935beae648..0000000000
--- a/core-java/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-
- Spring MVC Application
-
-
-
- contextClass
-
- org.springframework.web.context.support.AnnotationConfigWebApplicationContext
-
-
-
- contextConfigLocation
- org.baeldung.config
-
-
-
- org.springframework.web.context.ContextLoaderListener
-
-
-
-
- api
- org.springframework.web.servlet.DispatcherServlet
- 1
-
-
- api
- /
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/core-java/src/test/java/org/baeldung/java/io/JavaFileIntegrationTest.java b/core-java/src/test/java/org/baeldung/java/io/JavaFileIntegrationTest.java
index c139e34afb..24213ba869 100644
--- a/core-java/src/test/java/org/baeldung/java/io/JavaFileIntegrationTest.java
+++ b/core-java/src/test/java/org/baeldung/java/io/JavaFileIntegrationTest.java
@@ -1,5 +1,6 @@
package org.baeldung.java.io;
+import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
import static org.junit.Assert.assertTrue;
import java.io.File;
@@ -57,9 +58,8 @@ public class JavaFileIntegrationTest {
@Test
public final void givenUsingJDK7Nio2_whenMovingFile_thenCorrect() throws IOException {
- final Path fileToMovePath = Files.createFile(Paths.get("src/test/resources/fileToMove.txt"));
- final Path dirPath = Paths.get("src/test/resources/");
- final Path targetPath = Files.createDirectory(dirPath);
+ final Path fileToMovePath = Files.createFile(Paths.get("src/test/resources/" + randomAlphabetic(5) + ".txt"));
+ final Path targetPath = Paths.get("src/main/resources/");
Files.move(fileToMovePath, targetPath.resolve(fileToMovePath.getFileName()));
}
diff --git a/core-java/src/test/java/org/baeldung/java/io/JavaXToWriterUnitTest.java b/core-java/src/test/java/org/baeldung/java/io/JavaXToWriterUnitTest.java
index 35ec15df16..eb393668bd 100644
--- a/core-java/src/test/java/org/baeldung/java/io/JavaXToWriterUnitTest.java
+++ b/core-java/src/test/java/org/baeldung/java/io/JavaXToWriterUnitTest.java
@@ -1,5 +1,7 @@
package org.baeldung.java.io;
+import static org.junit.Assert.assertEquals;
+
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
@@ -23,6 +25,8 @@ public class JavaXToWriterUnitTest {
final Writer targetWriter = new StringWriter().append(new String(initialArray));
targetWriter.close();
+
+ assertEquals("With Java", targetWriter.toString());
}
@Test
@@ -40,6 +44,8 @@ public class JavaXToWriterUnitTest {
charSink.write(buffer);
stringWriter.close();
+
+ assertEquals("With Guava", stringWriter.toString());
}
@Test
@@ -48,6 +54,8 @@ public class JavaXToWriterUnitTest {
final Writer targetWriter = new StringBuilderWriter(new StringBuilder(new String(initialArray)));
targetWriter.close();
+
+ assertEquals("With Commons IO", targetWriter.toString());
}
}
diff --git a/gson-jackson-performance/.classpath b/gson-jackson-performance/.classpath
new file mode 100644
index 0000000000..19b2ff18be
--- /dev/null
+++ b/gson-jackson-performance/.classpath
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/gson-jackson-performance/.project b/gson-jackson-performance/.project
new file mode 100644
index 0000000000..b3b5ccad87
--- /dev/null
+++ b/gson-jackson-performance/.project
@@ -0,0 +1,14 @@
+
+
+ gson-jackson-performance
+ NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse.
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+ org.eclipse.jdt.core.javanature
+
+
\ No newline at end of file
diff --git a/gson-jackson-performance/README.md b/gson-jackson-performance/README.md
new file mode 100644
index 0000000000..5b08f6cdec
--- /dev/null
+++ b/gson-jackson-performance/README.md
@@ -0,0 +1,3 @@
+## Performance of Gson and Jackson
+
+Standalone java programs to measure the performance of both JSON APIs based on file size and object graph complexity.
diff --git a/gson-jackson-performance/pom.xml b/gson-jackson-performance/pom.xml
new file mode 100644
index 0000000000..1ea43bd7fa
--- /dev/null
+++ b/gson-jackson-performance/pom.xml
@@ -0,0 +1,72 @@
+
+ 4.0.0
+
+ com.baeldung
+ gson-jackson-performance
+ 0.0.1-SNAPSHOT
+ jar
+
+ gson-jackson-performance
+ http://maven.apache.org
+
+
+ UTF-8
+
+
+
+ gson-jackson-performance
+
+
+ src/main/resources
+ true
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 1.8
+ 1.8
+
+
+
+
+
+
+
+
+
+
+ com.google.code.gson
+ gson
+ 2.5
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.7.1-1
+
+
+
+ junit
+ junit
+ 3.8.1
+ test
+
+
+
+ log4j
+ log4j
+ 1.2.17
+
+
+
+
+
+
+
diff --git a/gson-jackson-performance/src/main/java/com/baeldung/data/complex/ComplexDataGeneration.java b/gson-jackson-performance/src/main/java/com/baeldung/data/complex/ComplexDataGeneration.java
new file mode 100644
index 0000000000..b69d306edf
--- /dev/null
+++ b/gson-jackson-performance/src/main/java/com/baeldung/data/complex/ComplexDataGeneration.java
@@ -0,0 +1,63 @@
+package com.baeldung.data.complex;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.baeldung.data.utility.Utility;
+import com.baeldung.pojo.complex.AddressDetails;
+import com.baeldung.pojo.complex.ContactDetails;
+import com.baeldung.pojo.complex.CustomerAddressDetails;
+import com.baeldung.pojo.complex.CustomerPortfolioComplex;
+
+/**
+ *
+ * This class is responsible for generating data for complex type object
+ */
+
+public class ComplexDataGeneration {
+
+ public static CustomerPortfolioComplex generateData() {
+ List customerAddressDetailsList = new ArrayList();
+ for (int i = 0; i < 600000; i++) {
+ CustomerAddressDetails customerAddressDetails = new CustomerAddressDetails();
+ customerAddressDetails.setAge(20);
+ customerAddressDetails.setFirstName(Utility.generateRandomName());
+ customerAddressDetails.setLastName(Utility.generateRandomName());
+
+ List addressDetailsList = new ArrayList();
+ customerAddressDetails.setAddressDetails(addressDetailsList);
+
+ for (int j = 0; j < 2; j++) {
+ AddressDetails addressDetails = new AddressDetails();
+ addressDetails.setZipcode(Utility.generateRandomZip());
+ addressDetails.setAddress(Utility.generateRandomAddress());
+
+ List contactDetailsList = new ArrayList();
+ addressDetails.setContactDetails(contactDetailsList);
+
+ for (int k = 0; k < 2; k++) {
+ ContactDetails contactDetails = new ContactDetails();
+ contactDetails.setLandline(Utility.generateRandomPhone());
+ contactDetails.setMobile(Utility.generateRandomPhone());
+ contactDetailsList.add(contactDetails);
+ contactDetails = null;
+ }
+
+ addressDetailsList.add(addressDetails);
+ addressDetails = null;
+ contactDetailsList = null;
+ }
+ customerAddressDetailsList.add(customerAddressDetails);
+ customerAddressDetails = null;
+
+ if (i % 6000 == 0) {
+ Runtime.getRuntime().gc();
+ }
+ }
+
+ CustomerPortfolioComplex customerPortfolioComplex = new CustomerPortfolioComplex();
+ customerPortfolioComplex.setCustomerAddressDetailsList(customerAddressDetailsList);
+ customerAddressDetailsList = null;
+ return customerPortfolioComplex;
+ }
+}
diff --git a/gson-jackson-performance/src/main/java/com/baeldung/data/complex/ComplexDataGson.java b/gson-jackson-performance/src/main/java/com/baeldung/data/complex/ComplexDataGson.java
new file mode 100644
index 0000000000..b97893e8f1
--- /dev/null
+++ b/gson-jackson-performance/src/main/java/com/baeldung/data/complex/ComplexDataGson.java
@@ -0,0 +1,91 @@
+package com.baeldung.data.complex;
+
+import java.util.Map;
+
+import org.apache.log4j.Logger;
+import com.baeldung.data.utility.Utility;
+import com.baeldung.pojo.complex.CustomerPortfolioComplex;
+
+import com.google.gson.Gson;
+
+/**
+ *
+ * This class is responsible for performing functions for Complex type
+ * GSON like
+ * Java to Json
+ * Json to Map
+ * Json to Java Object
+ */
+
+public class ComplexDataGson {
+
+ private static final Logger logger = Logger.getLogger(ComplexDataGson.class);
+
+ static Gson gson = new Gson();
+
+ static long generateJsonAvgTime = 0L;
+
+ static long parseJsonToMapAvgTime = 0L;
+
+ static long parseJsonToActualObjectAvgTime = 0L;
+
+ public static void main(String[] args) {
+ CustomerPortfolioComplex customerPortfolioComplex = ComplexDataGeneration.generateData();
+ int j = 50;
+ for (int i = 0; i < j; i++) {
+ logger.info("-------Round " + (i + 1));
+ String jsonStr = generateJson(customerPortfolioComplex);
+ logger.info("Size of Complex content Jackson :: " + Utility.bytesIntoMB(jsonStr.getBytes().length));
+ logger.info("--------------------------------------------------------------------------");
+ parseJsonToMap(jsonStr);
+ parseJsonToActualObject(jsonStr);
+ jsonStr = null;
+ }
+
+ generateJsonAvgTime = generateJsonAvgTime / j;
+ parseJsonToMapAvgTime = parseJsonToMapAvgTime / j;
+ parseJsonToActualObjectAvgTime = parseJsonToActualObjectAvgTime / j;
+
+ logger.info("--------------------------------------------------------------------------");
+ logger.info("Average Time to Generate JSON : " + generateJsonAvgTime);
+ logger.info("Average Time to Parse JSON To Map : " + parseJsonToMapAvgTime);
+ logger.info("Average Time to Parse JSON To Actual Object : " + parseJsonToActualObjectAvgTime);
+ logger.info("--------------------------------------------------------------------------");
+ }
+
+ private static String generateJson(CustomerPortfolioComplex customerPortfolioComplex) {
+ Runtime.getRuntime().gc();
+ long startParsTime = System.nanoTime();
+ String json = gson.toJson(customerPortfolioComplex);
+ long endParsTime = System.nanoTime();
+ long elapsedTime = endParsTime - startParsTime;
+ generateJsonAvgTime = generateJsonAvgTime + elapsedTime;
+ logger.info("Json Generation Time(ms):: " + elapsedTime);
+ return json;
+ }
+
+ private static void parseJsonToMap(String jsonStr) {
+ long startParsTime = System.nanoTime();
+ Map parsedMap = gson.fromJson(jsonStr , Map.class);
+ long endParsTime = System.nanoTime();
+ long elapsedTime = endParsTime - startParsTime;
+ parseJsonToMapAvgTime = parseJsonToMapAvgTime + elapsedTime;
+ logger.info("Generating Map from json Time(ms):: " + elapsedTime);
+ logger.info("--------------------------------------------------------------------------");
+ parsedMap = null;
+ Runtime.getRuntime().gc();
+ }
+
+ private static void parseJsonToActualObject(String jsonStr) {
+ long startParsTime = System.nanoTime();
+ CustomerPortfolioComplex customerPortfolioComplex = gson.fromJson(jsonStr , CustomerPortfolioComplex.class);
+ long endParsTime = System.nanoTime();
+ long elapsedTime = endParsTime - startParsTime;
+ parseJsonToActualObjectAvgTime = parseJsonToActualObjectAvgTime + elapsedTime;
+ logger.info("Generating Actual Object from json Time(ms):: " + elapsedTime);
+ logger.info("--------------------------------------------------------------------------");
+ customerPortfolioComplex = null;
+ Runtime.getRuntime().gc();
+
+ }
+}
diff --git a/gson-jackson-performance/src/main/java/com/baeldung/data/complex/ComplexDataJackson.java b/gson-jackson-performance/src/main/java/com/baeldung/data/complex/ComplexDataJackson.java
new file mode 100644
index 0000000000..07a210fb37
--- /dev/null
+++ b/gson-jackson-performance/src/main/java/com/baeldung/data/complex/ComplexDataJackson.java
@@ -0,0 +1,95 @@
+package com.baeldung.data.complex;
+
+import java.io.IOException;
+import java.util.Map;
+
+import com.baeldung.data.utility.Utility;
+import org.apache.log4j.Logger;
+import com.baeldung.pojo.complex.CustomerPortfolioComplex;
+
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ *
+ * This class is responsible for performing functions for Complex type
+ * Jackson like
+ * Java to Json
+ * Json to Map
+ * Json to Java Object
+ */
+
+public class ComplexDataJackson {
+
+ private static final Logger logger = Logger.getLogger(ComplexDataJackson.class);
+
+ static ObjectMapper mapper = new ObjectMapper();
+
+ static long generateJsonAvgTime = 0L;
+
+ static long parseJsonToMapAvgTime = 0L;
+
+ static long parseJsonToActualObjectAvgTime = 0L;
+
+ public static void main(String[] args) throws IOException {
+ CustomerPortfolioComplex customerPortfolioComplex = ComplexDataGeneration.generateData();
+ int j = 50;
+ for (int i = 0; i < j; i++) {
+ logger.info("-------Round " + (i + 1));
+ String jsonStr = generateJson(customerPortfolioComplex);
+ logger.info("Size of Complex content Jackson :: " + Utility.bytesIntoMB(jsonStr.getBytes().length));
+ logger.info("--------------------------------------------------------------------------");
+ parseJsonToMap(jsonStr);
+ parseJsonToActualObject(jsonStr);
+ jsonStr = null;
+ }
+
+ generateJsonAvgTime = generateJsonAvgTime / j;
+ parseJsonToMapAvgTime = parseJsonToMapAvgTime / j;
+ parseJsonToActualObjectAvgTime = parseJsonToActualObjectAvgTime / j;
+
+ logger.info("--------------------------------------------------------------------------");
+ logger.info("Average Time to Generate JSON : " + generateJsonAvgTime);
+ logger.info("Average Time to Parse JSON To Map : " + parseJsonToMapAvgTime);
+ logger.info("Average Time to Parse JSON To Actual Object : " + parseJsonToActualObjectAvgTime);
+ logger.info("--------------------------------------------------------------------------");
+ }
+
+ private static String generateJson(CustomerPortfolioComplex customerPortfolioComplex)
+ throws JsonProcessingException {
+ Runtime.getRuntime().gc();
+ long startParsTime = System.nanoTime();
+ String json = mapper.writeValueAsString(customerPortfolioComplex);
+ long endParsTime = System.nanoTime();
+ long elapsedTime = endParsTime - startParsTime;
+ generateJsonAvgTime = generateJsonAvgTime + elapsedTime;
+ logger.info("Json Generation Time(ms):: " + elapsedTime);
+ return json;
+ }
+
+ private static void parseJsonToMap(String jsonStr) throws JsonParseException , JsonMappingException , IOException {
+ long startParsTime = System.nanoTime();
+ Map parsedMap = mapper.readValue(jsonStr , Map.class);
+ long endParsTime = System.nanoTime();
+ long elapsedTime = endParsTime - startParsTime;
+ parseJsonToMapAvgTime = parseJsonToMapAvgTime + elapsedTime;
+ logger.info("Generating Map from json Time(ms):: " + elapsedTime);
+ parsedMap = null;
+ Runtime.getRuntime().gc();
+
+ }
+
+ private static void parseJsonToActualObject(String jsonStr) throws JsonParseException , JsonMappingException ,
+ IOException {
+ long startParsTime = System.nanoTime();
+ CustomerPortfolioComplex customerPortfolioComplex = mapper.readValue(jsonStr , CustomerPortfolioComplex.class);
+ long endParsTime = System.nanoTime();
+ long elapsedTime = endParsTime - startParsTime;
+ parseJsonToActualObjectAvgTime = parseJsonToActualObjectAvgTime + elapsedTime;
+ logger.info("Generating Actual Object from json Time(ms):: " + elapsedTime);
+ customerPortfolioComplex = null;
+ Runtime.getRuntime().gc();
+ }
+}
diff --git a/gson-jackson-performance/src/main/java/com/baeldung/data/simple/SimpleDataGeneration.java b/gson-jackson-performance/src/main/java/com/baeldung/data/simple/SimpleDataGeneration.java
new file mode 100644
index 0000000000..1e186adc72
--- /dev/null
+++ b/gson-jackson-performance/src/main/java/com/baeldung/data/simple/SimpleDataGeneration.java
@@ -0,0 +1,35 @@
+package com.baeldung.data.simple;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.baeldung.data.utility.Utility;
+import com.baeldung.pojo.simple.Customer;
+import com.baeldung.pojo.simple.CustomerPortfolioSimple;
+
+/**
+ *
+ * This class is responsible for generating data for simple type object
+ */
+
+public class SimpleDataGeneration {
+
+ public static CustomerPortfolioSimple generateData() {
+ List customerList = new ArrayList();
+ for (int i = 0; i < 1; i++) {
+ Customer customer = new Customer();
+ customer.setAge(20);
+ customer.setFirstName(Utility.generateRandomName());
+ customer.setLastName(Utility.generateRandomName());
+
+ customerList.add(customer);
+ customer = null;
+
+ }
+
+ CustomerPortfolioSimple customerPortfolioSimple = new CustomerPortfolioSimple();
+ customerPortfolioSimple.setCustomerLists(customerList);
+ customerList = null;
+ return customerPortfolioSimple;
+ }
+}
diff --git a/gson-jackson-performance/src/main/java/com/baeldung/data/simple/SimpleDataGson.java b/gson-jackson-performance/src/main/java/com/baeldung/data/simple/SimpleDataGson.java
new file mode 100644
index 0000000000..b190313462
--- /dev/null
+++ b/gson-jackson-performance/src/main/java/com/baeldung/data/simple/SimpleDataGson.java
@@ -0,0 +1,91 @@
+package com.baeldung.data.simple;
+
+import java.util.Map;
+
+import org.apache.log4j.Logger;
+import com.baeldung.data.utility.Utility;
+import com.baeldung.pojo.simple.CustomerPortfolioSimple;
+
+import com.google.gson.Gson;
+
+/**
+ *
+ * This class is responsible for performing functions for Simple type
+ * GSON like
+ * Java to Json
+ * Json to Map
+ * Json to Java Object
+ */
+
+public class SimpleDataGson {
+
+ private static final Logger logger = Logger.getLogger(SimpleDataGson.class);
+
+ static Gson gson = new Gson();
+
+ static long generateJsonAvgTime = 0L;
+
+ static long parseJsonToMapAvgTime = 0L;
+
+ static long parseJsonToActualObjectAvgTime = 0L;
+
+ public static void main(String[] args) {
+ CustomerPortfolioSimple customerPortfolioSimple = SimpleDataGeneration.generateData();
+ String jsonStr = null;
+ int j = 5;
+ for (int i = 0; i < j; i++) {
+ logger.info("-------Round " + (i + 1));
+ jsonStr = generateJson(customerPortfolioSimple);
+ logger.info("Size of Simple content Gson :: " + Utility.bytesIntoMB(jsonStr.getBytes().length));
+ logger.info("--------------------------------------------------------------------------");
+ parseJsonToMap(jsonStr);
+ parseJsonToActualObject(jsonStr);
+ jsonStr = null;
+ }
+ generateJsonAvgTime = generateJsonAvgTime / j;
+ parseJsonToMapAvgTime = parseJsonToMapAvgTime / j;
+ parseJsonToActualObjectAvgTime = parseJsonToActualObjectAvgTime / j;
+
+ logger.info("--------------------------------------------------------------------------");
+ logger.info("Average Time to Generate JSON : " + generateJsonAvgTime);
+ logger.info("Average Time to Parse JSON To Map : " + parseJsonToMapAvgTime);
+ logger.info("Average Time to Parse JSON To Actual Object : " + parseJsonToActualObjectAvgTime);
+ logger.info("--------------------------------------------------------------------------");
+ }
+
+ private static String generateJson(CustomerPortfolioSimple customerPortfolioSimple) {
+ Runtime.getRuntime().gc();
+ long startParsTime = System.nanoTime();
+ String json = gson.toJson(customerPortfolioSimple);
+ long endParsTime = System.nanoTime();
+ long elapsedTime = endParsTime - startParsTime;
+ generateJsonAvgTime = generateJsonAvgTime + elapsedTime;
+ logger.info("Json Generation Time(ms):: " + elapsedTime);
+ return json;
+ }
+
+ private static void parseJsonToMap(String jsonStr) {
+ long startParsTime = System.nanoTime();
+ Map parsedMap = gson.fromJson(jsonStr , Map.class);
+ long endParsTime = System.nanoTime();
+ long elapsedTime = endParsTime - startParsTime;
+ parseJsonToMapAvgTime = parseJsonToMapAvgTime + elapsedTime;
+ logger.info("Generating Map from json Time(ms):: " + elapsedTime);
+ logger.info("--------------------------------------------------------------------------");
+ parsedMap = null;
+ Runtime.getRuntime().gc();
+
+ }
+
+ private static void parseJsonToActualObject(String jsonStr) {
+ long startParsTime = System.nanoTime();
+ CustomerPortfolioSimple customerPortfolioSimple = gson.fromJson(jsonStr , CustomerPortfolioSimple.class);
+ long endParsTime = System.nanoTime();
+ long elapsedTime = endParsTime - startParsTime;
+ parseJsonToActualObjectAvgTime = parseJsonToActualObjectAvgTime + elapsedTime;
+ logger.info("Generating Actual Object from json Time(ms):: " + elapsedTime);
+ logger.info("--------------------------------------------------------------------------");
+ customerPortfolioSimple = null;
+ Runtime.getRuntime().gc();
+ }
+}
diff --git a/gson-jackson-performance/src/main/java/com/baeldung/data/simple/SimpleDataJackson.java b/gson-jackson-performance/src/main/java/com/baeldung/data/simple/SimpleDataJackson.java
new file mode 100644
index 0000000000..9330333604
--- /dev/null
+++ b/gson-jackson-performance/src/main/java/com/baeldung/data/simple/SimpleDataJackson.java
@@ -0,0 +1,95 @@
+package com.baeldung.data.simple;
+
+import java.io.IOException;
+import java.util.Map;
+
+import com.baeldung.data.utility.Utility;
+import org.apache.log4j.Logger;
+import com.baeldung.pojo.simple.CustomerPortfolioSimple;
+
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ *
+ * This class is responsible for performing functions for Simple type
+ * Jackson like
+ * Java to Json
+ * Json to Map
+ * Json to Java Object
+ */
+
+public class SimpleDataJackson {
+
+ private static final Logger logger = Logger.getLogger(SimpleDataJackson.class);
+
+ static ObjectMapper mapper = new ObjectMapper();
+
+ static long generateJsonAvgTime = 0L;
+
+ static long parseJsonToMapAvgTime = 0L;
+
+ static long parseJsonToActualObjectAvgTime = 0L;
+
+ public static void main(String[] args) throws IOException {
+ CustomerPortfolioSimple customerPortfolioSimple = SimpleDataGeneration.generateData();
+ int j = 50;
+ for (int i = 0; i < j; i++) {
+ logger.info("-------Round " + (i + 1));
+ String jsonStr = generateJson(customerPortfolioSimple);
+ logger.info("Size of Simple content Jackson :: " + Utility.bytesIntoMB(jsonStr.getBytes().length));
+ logger.info("--------------------------------------------------------------------------");
+
+ parseJsonToMap(jsonStr);
+ parseJsonToActualObject(jsonStr);
+ jsonStr = null;
+ }
+
+ generateJsonAvgTime = generateJsonAvgTime / j;
+ parseJsonToMapAvgTime = parseJsonToMapAvgTime / j;
+ parseJsonToActualObjectAvgTime = parseJsonToActualObjectAvgTime / j;
+
+ logger.info("--------------------------------------------------------------------------");
+ logger.info("Average Time to Generate JSON : " + generateJsonAvgTime);
+ logger.info("Average Time to Parse JSON To Map : " + parseJsonToMapAvgTime);
+ logger.info("Average Time to Parse JSON To Actual Object : " + parseJsonToActualObjectAvgTime);
+ logger.info("--------------------------------------------------------------------------");
+ }
+
+ private static String generateJson(CustomerPortfolioSimple customerPortfolioSimple) throws JsonProcessingException {
+ Runtime.getRuntime().gc();
+ long startParsTime = System.nanoTime();
+ String json = mapper.writeValueAsString(customerPortfolioSimple);
+ long endParsTime = System.nanoTime();
+ long elapsedTime = endParsTime - startParsTime;
+ generateJsonAvgTime = generateJsonAvgTime + elapsedTime;
+ logger.info("Json Generation Time(ms):: " + elapsedTime);
+ return json;
+ }
+
+ private static void parseJsonToMap(String jsonStr) throws JsonParseException , JsonMappingException , IOException {
+ long startParsTime = System.nanoTime();
+ Map parsedMap = mapper.readValue(jsonStr , Map.class);
+ long endParsTime = System.nanoTime();
+ long elapsedTime = endParsTime - startParsTime;
+ parseJsonToMapAvgTime = parseJsonToMapAvgTime + elapsedTime;
+ logger.info("Generating Map from json Time(ms):: " + elapsedTime);
+ logger.info("--------------------------------------------------------------------------");
+ parsedMap = null;
+ Runtime.getRuntime().gc();
+ }
+
+ private static void parseJsonToActualObject(String jsonStr) throws JsonParseException , JsonMappingException ,
+ IOException {
+ long startParsTime = System.nanoTime();
+ CustomerPortfolioSimple customerPortfolioSimple = mapper.readValue(jsonStr , CustomerPortfolioSimple.class);
+ long endParsTime = System.nanoTime();
+ long elapsedTime = endParsTime - startParsTime;
+ parseJsonToActualObjectAvgTime = parseJsonToActualObjectAvgTime + elapsedTime;
+ logger.info("Generating Actual Object from json Time(ms):: " + elapsedTime);
+ customerPortfolioSimple = null;
+ Runtime.getRuntime().gc();
+ }
+}
diff --git a/gson-jackson-performance/src/main/java/com/baeldung/data/utility/Utility.java b/gson-jackson-performance/src/main/java/com/baeldung/data/utility/Utility.java
new file mode 100644
index 0000000000..8b0c402e47
--- /dev/null
+++ b/gson-jackson-performance/src/main/java/com/baeldung/data/utility/Utility.java
@@ -0,0 +1,90 @@
+package com.baeldung.data.utility;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.Random;
+
+public class Utility {
+
+ public static String generateRandomName() {
+ char[] chars = "abcdefghijklmnopqrstuvwxyz ".toCharArray();
+ StringBuilder sb = new StringBuilder();
+ Random random = new Random();
+ for (int i = 0; i < 8; i++) {
+ char c = chars[random.nextInt(chars.length)];
+ sb.append(c);
+ }
+ return sb.toString();
+ }
+
+ public static String generateRandomAddress() {
+ char[] chars = "abcdefghijklmnopqrstuvwxyz ".toCharArray();
+ StringBuilder sb = new StringBuilder();
+ Random random = new Random();
+ for (int i = 0; i < 30; i++) {
+ char c = chars[random.nextInt(chars.length)];
+ sb.append(c);
+ }
+ return sb.toString();
+ }
+
+ public static String generateRandomZip() {
+ char[] chars = "1234567890".toCharArray();
+ StringBuilder sb = new StringBuilder();
+ Random random = new Random();
+ for (int i = 0; i < 8; i++) {
+ char c = chars[random.nextInt(chars.length)];
+ sb.append(c);
+ }
+ return sb.toString();
+ }
+
+ public static String generateRandomPhone() {
+ char[] chars = "1234567890".toCharArray();
+ StringBuilder sb = new StringBuilder();
+ Random random = new Random();
+ for (int i = 0; i < 10; i++) {
+ char c = chars[random.nextInt(chars.length)];
+ sb.append(c);
+ }
+ return sb.toString();
+ }
+
+ public static String readFile(String fileName , Class clazz) throws IOException {
+ String dir = clazz.getResource("/").getFile();
+ dir = dir + "/" + fileName;
+
+ BufferedReader br = new BufferedReader(new FileReader(dir));
+ try {
+ StringBuilder sb = new StringBuilder();
+ String line = br.readLine();
+
+ while (line != null) {
+ sb.append(line);
+ sb.append(System.lineSeparator());
+ line = br.readLine();
+ }
+ return sb.toString();
+ } finally {
+ br.close();
+ }
+ }
+
+ public static String bytesIntoMB(long bytes) {
+ long kilobyte = 1024;
+ long megabyte = kilobyte * 1024;
+
+ if ((bytes >= 0) && (bytes < kilobyte)) {
+ return bytes + " B";
+
+ } else if ((bytes >= kilobyte) && (bytes < megabyte)) {
+ return (bytes / kilobyte) + " KB";
+
+ } else if ((bytes >= megabyte)) {
+ return (bytes / megabyte) + " MB";
+ }
+
+ return null;
+ }
+}
diff --git a/gson-jackson-performance/src/main/java/com/baeldung/pojo/complex/AddressDetails.java b/gson-jackson-performance/src/main/java/com/baeldung/pojo/complex/AddressDetails.java
new file mode 100644
index 0000000000..79725a97bd
--- /dev/null
+++ b/gson-jackson-performance/src/main/java/com/baeldung/pojo/complex/AddressDetails.java
@@ -0,0 +1,37 @@
+package com.baeldung.pojo.complex;
+
+import java.util.List;
+
+public class AddressDetails {
+
+ private String address;
+
+ private String zipcode;
+
+ private List contactDetails;
+
+ public String getZipcode() {
+ return zipcode;
+ }
+
+ public void setZipcode(String zipcode) {
+ this.zipcode = zipcode;
+ }
+
+ public List getContactDetails() {
+ return contactDetails;
+ }
+
+ public void setContactDetails(List contactDetails) {
+ this.contactDetails = contactDetails;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+}
diff --git a/gson-jackson-performance/src/main/java/com/baeldung/pojo/complex/ContactDetails.java b/gson-jackson-performance/src/main/java/com/baeldung/pojo/complex/ContactDetails.java
new file mode 100644
index 0000000000..164fe3f470
--- /dev/null
+++ b/gson-jackson-performance/src/main/java/com/baeldung/pojo/complex/ContactDetails.java
@@ -0,0 +1,25 @@
+package com.baeldung.pojo.complex;
+
+public class ContactDetails {
+
+ private String mobile;
+
+ private String landline;
+
+ public String getMobile() {
+ return mobile;
+ }
+
+ public void setMobile(String mobile) {
+ this.mobile = mobile;
+ }
+
+ public String getLandline() {
+ return landline;
+ }
+
+ public void setLandline(String landline) {
+ this.landline = landline;
+ }
+
+}
diff --git a/gson-jackson-performance/src/main/java/com/baeldung/pojo/complex/CustomerAddressDetails.java b/gson-jackson-performance/src/main/java/com/baeldung/pojo/complex/CustomerAddressDetails.java
new file mode 100644
index 0000000000..9bc5951716
--- /dev/null
+++ b/gson-jackson-performance/src/main/java/com/baeldung/pojo/complex/CustomerAddressDetails.java
@@ -0,0 +1,18 @@
+package com.baeldung.pojo.complex;
+
+import java.util.List;
+
+import com.baeldung.pojo.simple.Customer;
+
+public class CustomerAddressDetails extends Customer {
+
+ private List addressDetails;
+
+ public List getAddressDetails() {
+ return addressDetails;
+ }
+
+ public void setAddressDetails(List addressDetails) {
+ this.addressDetails = addressDetails;
+ }
+}
diff --git a/gson-jackson-performance/src/main/java/com/baeldung/pojo/complex/CustomerPortfolioComplex.java b/gson-jackson-performance/src/main/java/com/baeldung/pojo/complex/CustomerPortfolioComplex.java
new file mode 100644
index 0000000000..13f9d240b8
--- /dev/null
+++ b/gson-jackson-performance/src/main/java/com/baeldung/pojo/complex/CustomerPortfolioComplex.java
@@ -0,0 +1,17 @@
+package com.baeldung.pojo.complex;
+
+import java.util.List;
+
+public class CustomerPortfolioComplex {
+
+ private List customerAddressDetailsList;
+
+ public List getCustomerAddressDetailsList() {
+ return customerAddressDetailsList;
+ }
+
+ public void setCustomerAddressDetailsList(List customerAddressDetailsList) {
+ this.customerAddressDetailsList = customerAddressDetailsList;
+ }
+
+}
diff --git a/gson-jackson-performance/src/main/java/com/baeldung/pojo/simple/Customer.java b/gson-jackson-performance/src/main/java/com/baeldung/pojo/simple/Customer.java
new file mode 100644
index 0000000000..3d5668f85a
--- /dev/null
+++ b/gson-jackson-performance/src/main/java/com/baeldung/pojo/simple/Customer.java
@@ -0,0 +1,36 @@
+package com.baeldung.pojo.simple;
+
+
+public class Customer {
+
+ private String firstName;
+
+ private String lastName;
+
+ private int age;
+
+ 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 int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+}
diff --git a/gson-jackson-performance/src/main/java/com/baeldung/pojo/simple/CustomerPortfolioSimple.java b/gson-jackson-performance/src/main/java/com/baeldung/pojo/simple/CustomerPortfolioSimple.java
new file mode 100644
index 0000000000..7cb684813c
--- /dev/null
+++ b/gson-jackson-performance/src/main/java/com/baeldung/pojo/simple/CustomerPortfolioSimple.java
@@ -0,0 +1,16 @@
+package com.baeldung.pojo.simple;
+
+import java.util.List;
+
+public class CustomerPortfolioSimple {
+
+ private List customerLists;
+
+ public List getCustomerLists() {
+ return customerLists;
+ }
+
+ public void setCustomerLists(List customerLists) {
+ this.customerLists = customerLists;
+ }
+}
diff --git a/gson-jackson-performance/src/main/resources/log4j.properties b/gson-jackson-performance/src/main/resources/log4j.properties
new file mode 100644
index 0000000000..371cbc9048
--- /dev/null
+++ b/gson-jackson-performance/src/main/resources/log4j.properties
@@ -0,0 +1,16 @@
+# Root logger option
+log4j.rootLogger=DEBUG, file
+
+# Redirect log messages to console
+# log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+# log4j.appender.stdout.Target=System.out
+# log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+# log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
+
+# Redirect log messages to a log file, support file rolling.
+log4j.appender.file=org.apache.log4j.RollingFileAppender
+log4j.appender.file.File=log4j-application.log
+log4j.appender.file.MaxFileSize=5MB
+log4j.appender.file.MaxBackupIndex=10
+log4j.appender.file.layout=org.apache.log4j.PatternLayout
+log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
\ No newline at end of file
diff --git a/gson/pom.xml b/gson/pom.xml
index c0640abcbf..4f331f6fd9 100644
--- a/gson/pom.xml
+++ b/gson/pom.xml
@@ -1,6 +1,6 @@
4.0.0
- org.baeldung
+ com.baeldung
gson
0.1-SNAPSHOT
@@ -112,13 +112,9 @@
-
- 4.1.5.RELEASE
- 3.2.5.RELEASE
-
- 4.3.10.Final
- 5.1.35
+ 4.3.11.Final
+ 5.1.38
2.3
@@ -142,14 +138,14 @@
4.4.1
4.5
- 2.4.1
+ 2.9.0
- 3.3
+ 3.5.1
2.6
- 2.18.1
+ 2.19.1
2.7
- 1.4.14
+ 1.4.18
diff --git a/gson/src/main/webapp/WEB-INF/api-servlet.xml b/gson/src/main/webapp/WEB-INF/api-servlet.xml
deleted file mode 100644
index 4c74be8912..0000000000
--- a/gson/src/main/webapp/WEB-INF/api-servlet.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/gson/src/main/webapp/WEB-INF/web.xml b/gson/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index 935beae648..0000000000
--- a/gson/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-
- Spring MVC Application
-
-
-
- contextClass
-
- org.springframework.web.context.support.AnnotationConfigWebApplicationContext
-
-
-
- contextConfigLocation
- org.baeldung.config
-
-
-
- org.springframework.web.context.ContextLoaderListener
-
-
-
-
- api
- org.springframework.web.servlet.DispatcherServlet
- 1
-
-
- api
- /
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/guava/pom.xml b/guava/pom.xml
index 2b07be71bf..59ca3aa1bb 100644
--- a/guava/pom.xml
+++ b/guava/pom.xml
@@ -1,8 +1,8 @@
4.0.0
- org.baeldung
+ com.baeldung
guava
- 0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
guava
@@ -93,13 +93,9 @@
-
- 4.1.5.RELEASE
- 3.2.5.RELEASE
-
- 4.3.10.Final
- 5.1.35
+ 4.3.11.Final
+ 5.1.38
1.7.13
@@ -120,14 +116,14 @@
4.4.1
4.5
- 2.4.1
+ 2.9.0
- 3.3
+ 3.5.1
2.6
- 2.18.1
+ 2.19.1
2.7
- 1.4.14
+ 1.4.18
diff --git a/guava/src/main/webapp/WEB-INF/api-servlet.xml b/guava/src/main/webapp/WEB-INF/api-servlet.xml
deleted file mode 100644
index 4c74be8912..0000000000
--- a/guava/src/main/webapp/WEB-INF/api-servlet.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/guava/src/main/webapp/WEB-INF/web.xml b/guava/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index 935beae648..0000000000
--- a/guava/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-
- Spring MVC Application
-
-
-
- contextClass
-
- org.springframework.web.context.support.AnnotationConfigWebApplicationContext
-
-
-
- contextConfigLocation
- org.baeldung.config
-
-
-
- org.springframework.web.context.ContextLoaderListener
-
-
-
-
- api
- org.springframework.web.servlet.DispatcherServlet
- 1
-
-
- api
- /
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/spring-security-oauth/.project b/guava18/.project
similarity index 90%
rename from spring-security-oauth/.project
rename to guava18/.project
index fe6e295165..11dff52392 100644
--- a/spring-security-oauth/.project
+++ b/guava18/.project
@@ -1,6 +1,6 @@
- spring-security-oauth
+ guava18
diff --git a/guava18/pom.xml b/guava18/pom.xml
index 21f4697a73..6002b37d74 100644
--- a/guava18/pom.xml
+++ b/guava18/pom.xml
@@ -5,8 +5,8 @@
4.0.0
com.baeldung
- guava
- 1.0-SNAPSHOT
+ guava18
+ 0.1.0-SNAPSHOT
diff --git a/guava19/.project b/guava19/.project
new file mode 100644
index 0000000000..b4c292ad2c
--- /dev/null
+++ b/guava19/.project
@@ -0,0 +1,17 @@
+
+
+ guava19
+
+
+
+
+
+ org.eclipse.m2e.core.maven2Builder
+
+
+
+
+
+ org.eclipse.m2e.core.maven2Nature
+
+
diff --git a/guava19/README.md b/guava19/README.md
new file mode 100644
index 0000000000..be9f2d72a4
--- /dev/null
+++ b/guava19/README.md
@@ -0,0 +1,7 @@
+=========
+
+## Guava 19
+
+
+### Relevant Articles:
+- [Guava 19: What’s New?](http://www.baeldung.com/whats-new-in-guava-19)
diff --git a/guava19/pom.xml b/guava19/pom.xml
index 97c1b0ea4e..13f3b471f1 100644
--- a/guava19/pom.xml
+++ b/guava19/pom.xml
@@ -1,12 +1,10 @@
-
+
4.0.0
com.baeldung
- guava
- 1.0-SNAPSHOT
+ guava19
+ 0.1.0-SNAPSHOT
@@ -25,6 +23,7 @@
1.3
+
diff --git a/handling-spring-static-resources/.classpath b/handling-spring-static-resources/.classpath
index 71a1c1e0b5..613195248b 100644
--- a/handling-spring-static-resources/.classpath
+++ b/handling-spring-static-resources/.classpath
@@ -6,7 +6,11 @@
-
+
+
+
+
+
diff --git a/handling-spring-static-resources/.project b/handling-spring-static-resources/.project
index a16def8042..ae47dfac0e 100644
--- a/handling-spring-static-resources/.project
+++ b/handling-spring-static-resources/.project
@@ -1,6 +1,6 @@
- handling-spring-static-resources
+ spring-static-resources
diff --git a/handling-spring-static-resources/pom.xml b/handling-spring-static-resources/pom.xml
index 8efacc4b28..f47d8a5592 100644
--- a/handling-spring-static-resources/pom.xml
+++ b/handling-spring-static-resources/pom.xml
@@ -1,12 +1,14 @@
4.0.0
- org.baeldung
- handling-spring-static-resources
- handling-spring-static-resources
- 0.1-SNAPSHOT
+
+ com.baeldung
+ spring-static-resources
+ 0.1.0-SNAPSHOT
war
+ spring-static-resources
+
@@ -161,7 +163,7 @@
- handling-spring-static-resources
+ spring-static-resources
src/main/resources
@@ -172,21 +174,22 @@
1.8
+
- 4.2.4.RELEASE
- 4.0.3.RELEASE
+ 4.2.5.RELEASE
+ 4.0.4.RELEASE
1.8.1
2.3.2-b01
4.3.11.Final
- 5.1.37
+ 5.1.38
1.9.2.RELEASE
- 2.6.4
+ 2.7.2
1.7.13
@@ -207,13 +210,13 @@
4.4.1
4.5
- 2.4.1
+ 2.9.0
- 3.3
+ 3.5.1
2.6
- 2.18.1
- 1.4.14
+ 2.19.1
+ 1.4.18
\ No newline at end of file
diff --git a/httpclient/pom.xml b/httpclient/pom.xml
index 0098c40d52..66b2076852 100644
--- a/httpclient/pom.xml
+++ b/httpclient/pom.xml
@@ -1,6 +1,6 @@
4.0.0
- org.baeldung
+ com.baeldung
httpclient
0.1-SNAPSHOT
@@ -148,13 +148,9 @@
-
- 4.1.5.RELEASE
- 3.2.5.RELEASE
-
- 4.3.10.Final
- 5.1.35
+ 4.3.11.Final
+ 5.1.38
1.7.13
@@ -175,14 +171,14 @@
4.4.1
4.5
- 2.4.1
+ 2.9.0
- 3.3
+ 3.5.1
2.6
- 2.18.1
+ 2.19.1
2.7
- 1.4.14
+ 1.4.18
diff --git a/httpclient/src/test/java/org/baeldung/httpclient/HttpClientMultipartTest.java b/httpclient/src/test/java/org/baeldung/httpclient/HttpClientMultipartTest.java
index 687a248490..371657af62 100644
--- a/httpclient/src/test/java/org/baeldung/httpclient/HttpClientMultipartTest.java
+++ b/httpclient/src/test/java/org/baeldung/httpclient/HttpClientMultipartTest.java
@@ -79,18 +79,22 @@ public class HttpClientMultipartTest {
@Test
public final void givenFileandMultipleTextParts_whenUploadwithAddPart_thenNoExceptions() throws IOException {
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);
final StringBody stringBody1 = new StringBody("This is message 1", ContentType.MULTIPART_FORM_DATA);
final StringBody stringBody2 = new StringBody("This is message 2", ContentType.MULTIPART_FORM_DATA);
+ //
final MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.addPart("upfile", fileBody);
builder.addPart("text1", stringBody1);
builder.addPart("text2", stringBody2);
final HttpEntity entity = builder.build();
+ //
post.setEntity(entity);
response = client.execute(post);
+
final int statusCode = response.getStatusLine().getStatusCode();
final String responseString = getContent();
final String contentTypeInHeader = getContentTypeHeader();
@@ -124,7 +128,7 @@ public class HttpClientMultipartTest {
}
@Test
- public final void givenFileandInputStreamandText_whenUploadwithAddBinaryBodyandAddTextBody_ThenNoException() throws ClientProtocolException, IOException {
+ 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 InputStream inputStream = new FileInputStream(url.getPath());
diff --git a/jackson/pom.xml b/jackson/pom.xml
index ed7a5944a5..f63ec08b48 100644
--- a/jackson/pom.xml
+++ b/jackson/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
- org.baeldung
+ com.baeldung
jackson
0.1-SNAPSHOT
@@ -47,25 +48,31 @@
com.fasterxml.jackson.datatype
jackson-datatype-jsr310
- 2.4.0
+ ${jackson.version}
com.fasterxml.jackson.datatype
jackson-datatype-joda
- 2.4.0
+ ${jackson.version}
+
+
+
+ com.fasterxml.jackson.module
+ jackson-module-jsonSchema
+ 2.7.2
joda-time
joda-time
- 2.6
+ 2.9.2
com.google.code.gson
gson
- 2.3.1
+ 2.6.2
@@ -131,16 +138,12 @@
-
- 4.1.5.RELEASE
- 3.2.5.RELEASE
-
- 4.3.10.Final
- 5.1.35
+ 4.3.11.Final
+ 5.1.38
- 2.7.1-1
+ 2.7.2
1.7.13
@@ -161,15 +164,15 @@
4.4.1
4.5
- 2.4.1
+ 2.9.0
- 3.3
+ 3.5.1
2.6
- 2.18.1
+ 2.19.1
2.7
- 1.4.14
+ 1.4.18
-
\ No newline at end of file
+
diff --git a/jackson/src/test/java/org/baeldung/jackson/annotation/BeanWithCreator.java b/jackson/src/test/java/com/baeldung/jackson/annotation/BeanWithCreator.java
similarity index 89%
rename from jackson/src/test/java/org/baeldung/jackson/annotation/BeanWithCreator.java
rename to jackson/src/test/java/com/baeldung/jackson/annotation/BeanWithCreator.java
index 01507ab4d6..90a45efc96 100644
--- a/jackson/src/test/java/org/baeldung/jackson/annotation/BeanWithCreator.java
+++ b/jackson/src/test/java/com/baeldung/jackson/annotation/BeanWithCreator.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.annotation;
+package com.baeldung.jackson.annotation;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
diff --git a/jackson/src/test/java/org/baeldung/jackson/annotation/BeanWithCustomAnnotation.java b/jackson/src/test/java/com/baeldung/jackson/annotation/BeanWithCustomAnnotation.java
similarity index 90%
rename from jackson/src/test/java/org/baeldung/jackson/annotation/BeanWithCustomAnnotation.java
rename to jackson/src/test/java/com/baeldung/jackson/annotation/BeanWithCustomAnnotation.java
index 3b468f474f..65d64059c9 100644
--- a/jackson/src/test/java/org/baeldung/jackson/annotation/BeanWithCustomAnnotation.java
+++ b/jackson/src/test/java/com/baeldung/jackson/annotation/BeanWithCustomAnnotation.java
@@ -1,10 +1,10 @@
-package org.baeldung.jackson.annotation;
+package com.baeldung.jackson.annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Date;
-import org.baeldung.jackson.annotation.BeanWithCustomAnnotation.CustomAnnotation;
+import com.baeldung.jackson.annotation.BeanWithCustomAnnotation.CustomAnnotation;
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.annotation.JsonInclude;
diff --git a/jackson/src/test/java/org/baeldung/jackson/annotation/BeanWithFilter.java b/jackson/src/test/java/com/baeldung/jackson/annotation/BeanWithFilter.java
similarity index 88%
rename from jackson/src/test/java/org/baeldung/jackson/annotation/BeanWithFilter.java
rename to jackson/src/test/java/com/baeldung/jackson/annotation/BeanWithFilter.java
index a0627757b6..48fecf8c13 100644
--- a/jackson/src/test/java/org/baeldung/jackson/annotation/BeanWithFilter.java
+++ b/jackson/src/test/java/com/baeldung/jackson/annotation/BeanWithFilter.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.annotation;
+package com.baeldung.jackson.annotation;
import com.fasterxml.jackson.annotation.JsonFilter;
diff --git a/jackson/src/test/java/org/baeldung/jackson/annotation/BeanWithGetter.java b/jackson/src/test/java/com/baeldung/jackson/annotation/BeanWithGetter.java
similarity index 93%
rename from jackson/src/test/java/org/baeldung/jackson/annotation/BeanWithGetter.java
rename to jackson/src/test/java/com/baeldung/jackson/annotation/BeanWithGetter.java
index 6585018564..39db9f06b9 100644
--- a/jackson/src/test/java/org/baeldung/jackson/annotation/BeanWithGetter.java
+++ b/jackson/src/test/java/com/baeldung/jackson/annotation/BeanWithGetter.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.annotation;
+package com.baeldung.jackson.annotation;
import com.fasterxml.jackson.annotation.JsonGetter;
import com.fasterxml.jackson.annotation.JsonProperty;
diff --git a/jackson/src/test/java/org/baeldung/jackson/annotation/BeanWithIgnore.java b/jackson/src/test/java/com/baeldung/jackson/annotation/BeanWithIgnore.java
similarity index 90%
rename from jackson/src/test/java/org/baeldung/jackson/annotation/BeanWithIgnore.java
rename to jackson/src/test/java/com/baeldung/jackson/annotation/BeanWithIgnore.java
index 4f0866bdc0..aa4e6b495d 100644
--- a/jackson/src/test/java/org/baeldung/jackson/annotation/BeanWithIgnore.java
+++ b/jackson/src/test/java/com/baeldung/jackson/annotation/BeanWithIgnore.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.annotation;
+package com.baeldung.jackson.annotation;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
diff --git a/jackson/src/test/java/org/baeldung/jackson/annotation/BeanWithInject.java b/jackson/src/test/java/com/baeldung/jackson/annotation/BeanWithInject.java
similarity index 88%
rename from jackson/src/test/java/org/baeldung/jackson/annotation/BeanWithInject.java
rename to jackson/src/test/java/com/baeldung/jackson/annotation/BeanWithInject.java
index aa8da1da4f..473058fd1c 100644
--- a/jackson/src/test/java/org/baeldung/jackson/annotation/BeanWithInject.java
+++ b/jackson/src/test/java/com/baeldung/jackson/annotation/BeanWithInject.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.annotation;
+package com.baeldung.jackson.annotation;
import com.fasterxml.jackson.annotation.JacksonInject;
diff --git a/jackson/src/test/java/org/baeldung/jackson/annotation/ExtendableBean.java b/jackson/src/test/java/com/baeldung/jackson/annotation/ExtendableBean.java
similarity index 94%
rename from jackson/src/test/java/org/baeldung/jackson/annotation/ExtendableBean.java
rename to jackson/src/test/java/com/baeldung/jackson/annotation/ExtendableBean.java
index c8e5f453ec..e03ffed613 100644
--- a/jackson/src/test/java/org/baeldung/jackson/annotation/ExtendableBean.java
+++ b/jackson/src/test/java/com/baeldung/jackson/annotation/ExtendableBean.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.annotation;
+package com.baeldung.jackson.annotation;
import java.util.HashMap;
import java.util.Map;
diff --git a/jackson/src/test/java/org/baeldung/jackson/annotation/MyBean.java b/jackson/src/test/java/com/baeldung/jackson/annotation/MyBean.java
similarity index 91%
rename from jackson/src/test/java/org/baeldung/jackson/annotation/MyBean.java
rename to jackson/src/test/java/com/baeldung/jackson/annotation/MyBean.java
index 651d7c2da0..5d4ce4202c 100644
--- a/jackson/src/test/java/org/baeldung/jackson/annotation/MyBean.java
+++ b/jackson/src/test/java/com/baeldung/jackson/annotation/MyBean.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.annotation;
+package com.baeldung.jackson.annotation;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
diff --git a/jackson/src/test/java/org/baeldung/jackson/annotation/PrivateBean.java b/jackson/src/test/java/com/baeldung/jackson/annotation/PrivateBean.java
similarity index 90%
rename from jackson/src/test/java/org/baeldung/jackson/annotation/PrivateBean.java
rename to jackson/src/test/java/com/baeldung/jackson/annotation/PrivateBean.java
index 472fa84a26..a49ce2e6d5 100644
--- a/jackson/src/test/java/org/baeldung/jackson/annotation/PrivateBean.java
+++ b/jackson/src/test/java/com/baeldung/jackson/annotation/PrivateBean.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.annotation;
+package com.baeldung.jackson.annotation;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
diff --git a/jackson/src/test/java/org/baeldung/jackson/annotation/RawBean.java b/jackson/src/test/java/com/baeldung/jackson/annotation/RawBean.java
similarity index 87%
rename from jackson/src/test/java/org/baeldung/jackson/annotation/RawBean.java
rename to jackson/src/test/java/com/baeldung/jackson/annotation/RawBean.java
index a481fbf02e..a0482ef5c1 100644
--- a/jackson/src/test/java/org/baeldung/jackson/annotation/RawBean.java
+++ b/jackson/src/test/java/com/baeldung/jackson/annotation/RawBean.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.annotation;
+package com.baeldung.jackson.annotation;
import com.fasterxml.jackson.annotation.JsonRawValue;
diff --git a/jackson/src/test/java/org/baeldung/jackson/annotation/UnwrappedUser.java b/jackson/src/test/java/com/baeldung/jackson/annotation/UnwrappedUser.java
similarity index 93%
rename from jackson/src/test/java/org/baeldung/jackson/annotation/UnwrappedUser.java
rename to jackson/src/test/java/com/baeldung/jackson/annotation/UnwrappedUser.java
index 4c761a57e0..d2b7522221 100644
--- a/jackson/src/test/java/org/baeldung/jackson/annotation/UnwrappedUser.java
+++ b/jackson/src/test/java/com/baeldung/jackson/annotation/UnwrappedUser.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.annotation;
+package com.baeldung.jackson.annotation;
import com.fasterxml.jackson.annotation.JsonUnwrapped;
diff --git a/jackson/src/test/java/org/baeldung/jackson/annotation/UserWithIgnoreType.java b/jackson/src/test/java/com/baeldung/jackson/annotation/UserWithIgnoreType.java
similarity index 93%
rename from jackson/src/test/java/org/baeldung/jackson/annotation/UserWithIgnoreType.java
rename to jackson/src/test/java/com/baeldung/jackson/annotation/UserWithIgnoreType.java
index eaf4cb7b74..36f383cf65 100644
--- a/jackson/src/test/java/org/baeldung/jackson/annotation/UserWithIgnoreType.java
+++ b/jackson/src/test/java/com/baeldung/jackson/annotation/UserWithIgnoreType.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.annotation;
+package com.baeldung.jackson.annotation;
import com.fasterxml.jackson.annotation.JsonIgnoreType;
diff --git a/jackson/src/test/java/org/baeldung/jackson/annotation/Zoo.java b/jackson/src/test/java/com/baeldung/jackson/annotation/Zoo.java
similarity index 96%
rename from jackson/src/test/java/org/baeldung/jackson/annotation/Zoo.java
rename to jackson/src/test/java/com/baeldung/jackson/annotation/Zoo.java
index d59be09f12..9c11ec0e36 100644
--- a/jackson/src/test/java/org/baeldung/jackson/annotation/Zoo.java
+++ b/jackson/src/test/java/com/baeldung/jackson/annotation/Zoo.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.annotation;
+package com.baeldung.jackson.annotation;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
diff --git a/jackson/src/test/java/com/baeldung/jackson/annotation/extra/AppendBeans.java b/jackson/src/test/java/com/baeldung/jackson/annotation/extra/AppendBeans.java
new file mode 100644
index 0000000000..7b75c205c9
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/annotation/extra/AppendBeans.java
@@ -0,0 +1,58 @@
+package com.baeldung.jackson.annotation.extra;
+
+import com.fasterxml.jackson.databind.annotation.JsonAppend;
+
+public class AppendBeans {
+ public static class BeanWithoutAppend {
+ private int id;
+ private String name;
+
+ public BeanWithoutAppend(int id, String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+ }
+
+ @JsonAppend(attrs = { @JsonAppend.Attr(value = "version") })
+ public static class BeanWithAppend {
+ private int id;
+ private String name;
+
+ public BeanWithAppend(int id, String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+ }
+}
\ No newline at end of file
diff --git a/jackson/src/test/java/com/baeldung/jackson/annotation/extra/ExtraAnnotationTest.java b/jackson/src/test/java/com/baeldung/jackson/annotation/extra/ExtraAnnotationTest.java
new file mode 100644
index 0000000000..79aae1dd04
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/annotation/extra/ExtraAnnotationTest.java
@@ -0,0 +1,131 @@
+package com.baeldung.jackson.annotation.extra;
+
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.hamcrest.CoreMatchers.not;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.baeldung.jackson.annotation.extra.AppendBeans.BeanWithAppend;
+import com.baeldung.jackson.annotation.extra.AppendBeans.BeanWithoutAppend;
+import com.baeldung.jackson.annotation.extra.IdentityReferenceBeans.BeanWithIdentityReference;
+import com.baeldung.jackson.annotation.extra.IdentityReferenceBeans.BeanWithoutIdentityReference;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping;
+import com.fasterxml.jackson.databind.ObjectWriter;
+import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
+import com.fasterxml.jackson.module.jsonSchema.factories.SchemaFactoryWrapper;
+
+public class ExtraAnnotationTest {
+ @Test
+ public void whenNotUsingJsonIdentityReferenceAnnotation_thenCorrect() throws JsonProcessingException {
+ ObjectMapper mapper = new ObjectMapper();
+ BeanWithoutIdentityReference bean = new BeanWithoutIdentityReference(1, "Bean Without Identity Reference Annotation");
+ String jsonString = mapper.writeValueAsString(bean);
+
+ assertThat(jsonString, containsString("Bean Without Identity Reference Annotation"));
+ }
+
+ @Test
+ public void whenUsingJsonIdentityReferenceAnnotation_thenCorrect() throws JsonProcessingException {
+ ObjectMapper mapper = new ObjectMapper();
+ BeanWithIdentityReference bean = new BeanWithIdentityReference(1, "Bean With Identity Reference Annotation");
+ String jsonString = mapper.writeValueAsString(bean);
+
+ assertEquals("1", jsonString);
+ }
+
+ @Test
+ public void whenNotUsingJsonAppendAnnotation_thenCorrect() throws JsonProcessingException {
+ ObjectMapper mapper = new ObjectMapper();
+
+ BeanWithoutAppend bean = new BeanWithoutAppend(2, "Bean Without Append Annotation");
+ ObjectWriter writer = mapper.writerFor(BeanWithoutAppend.class).withAttribute("version", "1.0");
+ String jsonString = writer.writeValueAsString(bean);
+
+ assertThat(jsonString, not(containsString("version")));
+ assertThat(jsonString, not(containsString("1.0")));
+ }
+
+ @Test
+ public void whenUsingJsonAppendAnnotation_thenCorrect() throws JsonProcessingException {
+ ObjectMapper mapper = new ObjectMapper();
+
+ BeanWithAppend bean = new BeanWithAppend(2, "Bean With Append Annotation");
+ ObjectWriter writer = mapper.writerFor(BeanWithAppend.class).withAttribute("version", "1.0");
+ String jsonString = writer.writeValueAsString(bean);
+
+ assertThat(jsonString, containsString("version"));
+ assertThat(jsonString, containsString("1.0"));
+ }
+
+ @Test
+ public void whenUsingJsonNamingAnnotation_thenCorrect() throws JsonProcessingException {
+ ObjectMapper mapper = new ObjectMapper();
+ NamingBean bean = new NamingBean(3, "Naming Bean");
+ String jsonString = mapper.writeValueAsString(bean);
+
+ assertThat(jsonString, containsString("bean_name"));
+ }
+
+ @Test
+ public void whenUsingJsonPropertyDescriptionAnnotation_thenCorrect() throws JsonProcessingException {
+ ObjectMapper mapper = new ObjectMapper();
+ SchemaFactoryWrapper wrapper = new SchemaFactoryWrapper();
+ mapper.acceptJsonFormatVisitor(PropertyDescriptionBean.class, wrapper);
+ JsonSchema jsonSchema = wrapper.finalSchema();
+ String jsonString = mapper.writeValueAsString(jsonSchema);
+ System.out.println(jsonString);
+ assertThat(jsonString, containsString("This is a description of the name property"));
+ }
+
+ @Test
+ public void whenUsingJsonPOJOBuilderAnnotation_thenCorrect() throws IOException {
+ ObjectMapper mapper = new ObjectMapper();
+ String jsonString = "{\"id\":5,\"name\":\"POJO Builder Bean\"}";
+ POJOBuilderBean bean = mapper.readValue(jsonString, POJOBuilderBean.class);
+
+ assertEquals(5, bean.getIdentity());
+ assertEquals("POJO Builder Bean", bean.getBeanName());
+ }
+
+ @Test
+ public void whenUsingJsonTypeIdAnnotation_thenCorrect() throws JsonProcessingException {
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.enableDefaultTyping(DefaultTyping.NON_FINAL);
+ TypeIdBean bean = new TypeIdBean(6, "Type Id Bean");
+ String jsonString = mapper.writeValueAsString(bean);
+
+ assertThat(jsonString, containsString("Type Id Bean"));
+ }
+
+ @Test
+ public void whenUsingJsonTypeIdResolverAnnotation_thenCorrect() throws IOException {
+ TypeIdResolverStructure.FirstBean bean1 = new TypeIdResolverStructure.FirstBean(1, "Bean 1");
+ TypeIdResolverStructure.LastBean bean2 = new TypeIdResolverStructure.LastBean(2, "Bean 2");
+
+ List beans = new ArrayList<>();
+ beans.add(bean1);
+ beans.add(bean2);
+
+ TypeIdResolverStructure.BeanContainer serializedContainer = new TypeIdResolverStructure.BeanContainer();
+ serializedContainer.setBeans(beans);
+
+ ObjectMapper mapper = new ObjectMapper();
+ String jsonString = mapper.writeValueAsString(serializedContainer);
+ assertThat(jsonString, containsString("bean1"));
+ assertThat(jsonString, containsString("bean2"));
+
+ TypeIdResolverStructure.BeanContainer deserializedContainer = mapper.readValue(jsonString, TypeIdResolverStructure.BeanContainer.class);
+ List beanList = deserializedContainer.getBeans();
+ assertThat(beanList.get(0), instanceOf(TypeIdResolverStructure.FirstBean.class));
+ assertThat(beanList.get(1), instanceOf(TypeIdResolverStructure.LastBean.class));
+ }
+}
\ No newline at end of file
diff --git a/jackson/src/test/java/com/baeldung/jackson/annotation/extra/IdentityReferenceBeans.java b/jackson/src/test/java/com/baeldung/jackson/annotation/extra/IdentityReferenceBeans.java
new file mode 100644
index 0000000000..495bb7de43
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/annotation/extra/IdentityReferenceBeans.java
@@ -0,0 +1,63 @@
+package com.baeldung.jackson.annotation.extra;
+
+import com.fasterxml.jackson.annotation.JsonIdentityInfo;
+import com.fasterxml.jackson.annotation.JsonIdentityReference;
+import com.fasterxml.jackson.annotation.ObjectIdGenerators;
+
+
+public class IdentityReferenceBeans {
+ @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
+ public static class BeanWithoutIdentityReference {
+ private int id;
+ private String name;
+
+ public BeanWithoutIdentityReference(int id, String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+ }
+
+ @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
+ @JsonIdentityReference(alwaysAsId = true)
+ public static class BeanWithIdentityReference {
+ private int id;
+ private String name;
+
+ public BeanWithIdentityReference(int id, String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+ }
+}
\ No newline at end of file
diff --git a/jackson/src/test/java/com/baeldung/jackson/annotation/extra/NamingBean.java b/jackson/src/test/java/com/baeldung/jackson/annotation/extra/NamingBean.java
new file mode 100644
index 0000000000..efd26ab9ae
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/annotation/extra/NamingBean.java
@@ -0,0 +1,31 @@
+package com.baeldung.jackson.annotation.extra;
+
+import com.fasterxml.jackson.databind.PropertyNamingStrategy;
+import com.fasterxml.jackson.databind.annotation.JsonNaming;
+
+@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
+public class NamingBean {
+ private int id;
+ private String beanName;
+
+ public NamingBean(int id, String beanName) {
+ this.id = id;
+ this.beanName = beanName;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getBeanName() {
+ return beanName;
+ }
+
+ public void setBeanName(String beanName) {
+ this.beanName = beanName;
+ }
+}
\ No newline at end of file
diff --git a/jackson/src/test/java/com/baeldung/jackson/annotation/extra/POJOBuilderBean.java b/jackson/src/test/java/com/baeldung/jackson/annotation/extra/POJOBuilderBean.java
new file mode 100644
index 0000000000..e0a89c6903
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/annotation/extra/POJOBuilderBean.java
@@ -0,0 +1,51 @@
+package com.baeldung.jackson.annotation.extra;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
+
+@JsonDeserialize(builder = POJOBuilderBean.BeanBuilder.class)
+public class POJOBuilderBean {
+ private int identity;
+ private String beanName;
+
+ @JsonPOJOBuilder(buildMethodName = "createBean", withPrefix = "construct")
+ public static class BeanBuilder {
+ private int idValue;
+ private String nameValue;
+
+ public BeanBuilder constructId(int id) {
+ idValue = id;
+ return this;
+ }
+
+ public BeanBuilder constructName(String name) {
+ nameValue = name;
+ return this;
+ }
+
+ public POJOBuilderBean createBean() {
+ return new POJOBuilderBean(idValue, nameValue);
+ }
+ }
+
+ public POJOBuilderBean(int identity, String beanName) {
+ this.identity = identity;
+ this.beanName = beanName;
+ }
+
+ public int getIdentity() {
+ return identity;
+ }
+
+ public void setIdentity(int identity) {
+ this.identity = identity;
+ }
+
+ public String getBeanName() {
+ return beanName;
+ }
+
+ public void setBeanName(String beanName) {
+ this.beanName = beanName;
+ }
+}
\ No newline at end of file
diff --git a/jackson/src/test/java/com/baeldung/jackson/annotation/extra/PropertyDescriptionBean.java b/jackson/src/test/java/com/baeldung/jackson/annotation/extra/PropertyDescriptionBean.java
new file mode 100644
index 0000000000..1563cddb83
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/annotation/extra/PropertyDescriptionBean.java
@@ -0,0 +1,25 @@
+package com.baeldung.jackson.annotation.extra;
+
+import com.fasterxml.jackson.annotation.JsonPropertyDescription;
+
+public class PropertyDescriptionBean {
+ private int id;
+ @JsonPropertyDescription("This is a description of the name property")
+ private String name;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
\ No newline at end of file
diff --git a/jackson/src/test/java/com/baeldung/jackson/annotation/extra/TypeIdBean.java b/jackson/src/test/java/com/baeldung/jackson/annotation/extra/TypeIdBean.java
new file mode 100644
index 0000000000..32a6d5a1d5
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/annotation/extra/TypeIdBean.java
@@ -0,0 +1,30 @@
+package com.baeldung.jackson.annotation.extra;
+
+import com.fasterxml.jackson.annotation.JsonTypeId;
+
+public class TypeIdBean {
+ private int id;
+ @JsonTypeId
+ private String name;
+
+ public TypeIdBean(int id, String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
\ No newline at end of file
diff --git a/jackson/src/test/java/com/baeldung/jackson/annotation/extra/TypeIdResolverStructure.java b/jackson/src/test/java/com/baeldung/jackson/annotation/extra/TypeIdResolverStructure.java
new file mode 100644
index 0000000000..9056023c69
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/annotation/extra/TypeIdResolverStructure.java
@@ -0,0 +1,130 @@
+package com.baeldung.jackson.annotation.extra;
+
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
+import com.fasterxml.jackson.databind.DatabindContext;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver;
+import com.fasterxml.jackson.databind.jsontype.impl.TypeIdResolverBase;
+
+public class TypeIdResolverStructure {
+ public static class BeanContainer {
+ private List beans;
+
+ public List getBeans() {
+ return beans;
+ }
+
+ public void setBeans(List beans) {
+ this.beans = beans;
+ }
+ }
+
+ @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "@type")
+ @JsonTypeIdResolver(BeanIdResolver.class)
+ public static class AbstractBean {
+ private int id;
+
+ protected AbstractBean() {
+ }
+
+ protected AbstractBean(int id) {
+ this.id = id;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+ }
+
+ public static class FirstBean extends AbstractBean {
+ String firstName;
+
+ public FirstBean() {
+ }
+
+ public FirstBean(int id, String name) {
+ super(id);
+ setFirstName(name);
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String name) {
+ firstName = name;
+ }
+ }
+
+ public static class LastBean extends AbstractBean {
+ String lastName;
+
+ public LastBean() {
+ }
+
+ public LastBean(int id, String name) {
+ super(id);
+ setLastName(name);
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String name) {
+ lastName = name;
+ }
+ }
+
+ public static class BeanIdResolver extends TypeIdResolverBase {
+ private JavaType superType;
+
+ @Override
+ public void init(JavaType baseType) {
+ superType = baseType;
+ }
+
+ @Override
+ public Id getMechanism() {
+ return Id.NAME;
+ }
+
+ @Override
+ public String idFromValue(Object obj) {
+ return idFromValueAndType(obj, obj.getClass());
+ }
+
+ @Override
+ public String idFromValueAndType(Object obj, Class> subType) {
+ String typeId = null;
+ switch (subType.getSimpleName()) {
+ case "FirstBean":
+ typeId = "bean1";
+ break;
+ case "LastBean":
+ typeId = "bean2";
+ }
+ return typeId;
+ }
+
+ @Override
+ public JavaType typeFromId(DatabindContext context, String id) {
+ Class> subType = null;
+ switch (id) {
+ case "bean1":
+ subType = FirstBean.class;
+ break;
+ case "bean2":
+ subType = LastBean.class;
+ }
+ return context.constructSpecializedType(superType, subType);
+ }
+ }
+}
\ No newline at end of file
diff --git a/jackson/src/test/java/org/baeldung/jackson/bidirection/CustomListDeserializer.java b/jackson/src/test/java/com/baeldung/jackson/bidirection/CustomListDeserializer.java
similarity index 93%
rename from jackson/src/test/java/org/baeldung/jackson/bidirection/CustomListDeserializer.java
rename to jackson/src/test/java/com/baeldung/jackson/bidirection/CustomListDeserializer.java
index cc4e1d5589..5f1f1edf2b 100644
--- a/jackson/src/test/java/org/baeldung/jackson/bidirection/CustomListDeserializer.java
+++ b/jackson/src/test/java/com/baeldung/jackson/bidirection/CustomListDeserializer.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.bidirection;
+package com.baeldung.jackson.bidirection;
import java.io.IOException;
import java.util.ArrayList;
diff --git a/jackson/src/test/java/org/baeldung/jackson/bidirection/CustomListSerializer.java b/jackson/src/test/java/com/baeldung/jackson/bidirection/CustomListSerializer.java
similarity index 94%
rename from jackson/src/test/java/org/baeldung/jackson/bidirection/CustomListSerializer.java
rename to jackson/src/test/java/com/baeldung/jackson/bidirection/CustomListSerializer.java
index 545f7e18c1..1d8ca011ea 100644
--- a/jackson/src/test/java/org/baeldung/jackson/bidirection/CustomListSerializer.java
+++ b/jackson/src/test/java/com/baeldung/jackson/bidirection/CustomListSerializer.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.bidirection;
+package com.baeldung.jackson.bidirection;
import java.io.IOException;
import java.util.ArrayList;
diff --git a/jackson/src/test/java/org/baeldung/jackson/bidirection/Item.java b/jackson/src/test/java/com/baeldung/jackson/bidirection/Item.java
similarity index 87%
rename from jackson/src/test/java/org/baeldung/jackson/bidirection/Item.java
rename to jackson/src/test/java/com/baeldung/jackson/bidirection/Item.java
index 223721dc62..55b8632e42 100644
--- a/jackson/src/test/java/org/baeldung/jackson/bidirection/Item.java
+++ b/jackson/src/test/java/com/baeldung/jackson/bidirection/Item.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.bidirection;
+package com.baeldung.jackson.bidirection;
public class Item {
public int id;
diff --git a/jackson/src/test/java/org/baeldung/jackson/bidirection/ItemWithIdentity.java b/jackson/src/test/java/com/baeldung/jackson/bidirection/ItemWithIdentity.java
similarity index 93%
rename from jackson/src/test/java/org/baeldung/jackson/bidirection/ItemWithIdentity.java
rename to jackson/src/test/java/com/baeldung/jackson/bidirection/ItemWithIdentity.java
index 2091ec6e40..25de4a8f7a 100644
--- a/jackson/src/test/java/org/baeldung/jackson/bidirection/ItemWithIdentity.java
+++ b/jackson/src/test/java/com/baeldung/jackson/bidirection/ItemWithIdentity.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.bidirection;
+package com.baeldung.jackson.bidirection;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
diff --git a/jackson/src/test/java/org/baeldung/jackson/bidirection/ItemWithIgnore.java b/jackson/src/test/java/com/baeldung/jackson/bidirection/ItemWithIgnore.java
similarity index 89%
rename from jackson/src/test/java/org/baeldung/jackson/bidirection/ItemWithIgnore.java
rename to jackson/src/test/java/com/baeldung/jackson/bidirection/ItemWithIgnore.java
index 8b6d623f18..910ccec174 100644
--- a/jackson/src/test/java/org/baeldung/jackson/bidirection/ItemWithIgnore.java
+++ b/jackson/src/test/java/com/baeldung/jackson/bidirection/ItemWithIgnore.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.bidirection;
+package com.baeldung.jackson.bidirection;
public class ItemWithIgnore {
public int id;
diff --git a/jackson/src/test/java/org/baeldung/jackson/bidirection/ItemWithRef.java b/jackson/src/test/java/com/baeldung/jackson/bidirection/ItemWithRef.java
similarity index 91%
rename from jackson/src/test/java/org/baeldung/jackson/bidirection/ItemWithRef.java
rename to jackson/src/test/java/com/baeldung/jackson/bidirection/ItemWithRef.java
index 295ec9580d..0ca8d721e8 100644
--- a/jackson/src/test/java/org/baeldung/jackson/bidirection/ItemWithRef.java
+++ b/jackson/src/test/java/com/baeldung/jackson/bidirection/ItemWithRef.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.bidirection;
+package com.baeldung.jackson.bidirection;
import com.fasterxml.jackson.annotation.JsonManagedReference;
diff --git a/jackson/src/test/java/org/baeldung/jackson/bidirection/ItemWithSerializer.java b/jackson/src/test/java/com/baeldung/jackson/bidirection/ItemWithSerializer.java
similarity index 89%
rename from jackson/src/test/java/org/baeldung/jackson/bidirection/ItemWithSerializer.java
rename to jackson/src/test/java/com/baeldung/jackson/bidirection/ItemWithSerializer.java
index d9d9612677..a57ca89d2c 100644
--- a/jackson/src/test/java/org/baeldung/jackson/bidirection/ItemWithSerializer.java
+++ b/jackson/src/test/java/com/baeldung/jackson/bidirection/ItemWithSerializer.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.bidirection;
+package com.baeldung.jackson.bidirection;
public class ItemWithSerializer {
public int id;
diff --git a/jackson/src/test/java/org/baeldung/jackson/bidirection/ItemWithView.java b/jackson/src/test/java/com/baeldung/jackson/bidirection/ItemWithView.java
similarity index 85%
rename from jackson/src/test/java/org/baeldung/jackson/bidirection/ItemWithView.java
rename to jackson/src/test/java/com/baeldung/jackson/bidirection/ItemWithView.java
index 65e0d08b4e..ffa19fbad2 100644
--- a/jackson/src/test/java/org/baeldung/jackson/bidirection/ItemWithView.java
+++ b/jackson/src/test/java/com/baeldung/jackson/bidirection/ItemWithView.java
@@ -1,6 +1,6 @@
-package org.baeldung.jackson.bidirection;
+package com.baeldung.jackson.bidirection;
-import org.baeldung.jackson.jsonview.Views;
+import com.baeldung.jackson.jsonview.Views;
import com.fasterxml.jackson.annotation.JsonView;
diff --git a/jackson/src/test/java/org/baeldung/jackson/bidirection/User.java b/jackson/src/test/java/com/baeldung/jackson/bidirection/User.java
similarity index 90%
rename from jackson/src/test/java/org/baeldung/jackson/bidirection/User.java
rename to jackson/src/test/java/com/baeldung/jackson/bidirection/User.java
index a92dff4052..71c9ec6a68 100644
--- a/jackson/src/test/java/org/baeldung/jackson/bidirection/User.java
+++ b/jackson/src/test/java/com/baeldung/jackson/bidirection/User.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.bidirection;
+package com.baeldung.jackson.bidirection;
import java.util.ArrayList;
import java.util.List;
diff --git a/jackson/src/test/java/org/baeldung/jackson/bidirection/UserWithIdentity.java b/jackson/src/test/java/com/baeldung/jackson/bidirection/UserWithIdentity.java
similarity index 94%
rename from jackson/src/test/java/org/baeldung/jackson/bidirection/UserWithIdentity.java
rename to jackson/src/test/java/com/baeldung/jackson/bidirection/UserWithIdentity.java
index 52fa22c32d..db83a09389 100644
--- a/jackson/src/test/java/org/baeldung/jackson/bidirection/UserWithIdentity.java
+++ b/jackson/src/test/java/com/baeldung/jackson/bidirection/UserWithIdentity.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.bidirection;
+package com.baeldung.jackson.bidirection;
import java.util.ArrayList;
import java.util.List;
diff --git a/jackson/src/test/java/org/baeldung/jackson/bidirection/UserWithIgnore.java b/jackson/src/test/java/com/baeldung/jackson/bidirection/UserWithIgnore.java
similarity index 92%
rename from jackson/src/test/java/org/baeldung/jackson/bidirection/UserWithIgnore.java
rename to jackson/src/test/java/com/baeldung/jackson/bidirection/UserWithIgnore.java
index 7714487f76..857a373cc5 100644
--- a/jackson/src/test/java/org/baeldung/jackson/bidirection/UserWithIgnore.java
+++ b/jackson/src/test/java/com/baeldung/jackson/bidirection/UserWithIgnore.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.bidirection;
+package com.baeldung.jackson.bidirection;
import java.util.ArrayList;
import java.util.List;
diff --git a/jackson/src/test/java/org/baeldung/jackson/bidirection/UserWithRef.java b/jackson/src/test/java/com/baeldung/jackson/bidirection/UserWithRef.java
similarity index 92%
rename from jackson/src/test/java/org/baeldung/jackson/bidirection/UserWithRef.java
rename to jackson/src/test/java/com/baeldung/jackson/bidirection/UserWithRef.java
index 406b87f78c..3de03fc651 100644
--- a/jackson/src/test/java/org/baeldung/jackson/bidirection/UserWithRef.java
+++ b/jackson/src/test/java/com/baeldung/jackson/bidirection/UserWithRef.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.bidirection;
+package com.baeldung.jackson.bidirection;
import java.util.ArrayList;
import java.util.List;
diff --git a/jackson/src/test/java/org/baeldung/jackson/bidirection/UserWithSerializer.java b/jackson/src/test/java/com/baeldung/jackson/bidirection/UserWithSerializer.java
similarity index 94%
rename from jackson/src/test/java/org/baeldung/jackson/bidirection/UserWithSerializer.java
rename to jackson/src/test/java/com/baeldung/jackson/bidirection/UserWithSerializer.java
index 25c202a9d3..9fda969e41 100644
--- a/jackson/src/test/java/org/baeldung/jackson/bidirection/UserWithSerializer.java
+++ b/jackson/src/test/java/com/baeldung/jackson/bidirection/UserWithSerializer.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.bidirection;
+package com.baeldung.jackson.bidirection;
import java.util.ArrayList;
import java.util.List;
diff --git a/jackson/src/test/java/org/baeldung/jackson/bidirection/UserWithView.java b/jackson/src/test/java/com/baeldung/jackson/bidirection/UserWithView.java
similarity index 87%
rename from jackson/src/test/java/org/baeldung/jackson/bidirection/UserWithView.java
rename to jackson/src/test/java/com/baeldung/jackson/bidirection/UserWithView.java
index e7043292a0..d92d67b3a1 100644
--- a/jackson/src/test/java/org/baeldung/jackson/bidirection/UserWithView.java
+++ b/jackson/src/test/java/com/baeldung/jackson/bidirection/UserWithView.java
@@ -1,9 +1,9 @@
-package org.baeldung.jackson.bidirection;
+package com.baeldung.jackson.bidirection;
import java.util.ArrayList;
import java.util.List;
-import org.baeldung.jackson.jsonview.Views;
+import com.baeldung.jackson.jsonview.Views;
import com.fasterxml.jackson.annotation.JsonView;
diff --git a/jackson/src/test/java/org/baeldung/jackson/date/CustomDateDeserializer.java b/jackson/src/test/java/com/baeldung/jackson/date/CustomDateDeserializer.java
similarity index 96%
rename from jackson/src/test/java/org/baeldung/jackson/date/CustomDateDeserializer.java
rename to jackson/src/test/java/com/baeldung/jackson/date/CustomDateDeserializer.java
index eb1866026f..a63190c8f5 100644
--- a/jackson/src/test/java/org/baeldung/jackson/date/CustomDateDeserializer.java
+++ b/jackson/src/test/java/com/baeldung/jackson/date/CustomDateDeserializer.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.date;
+package com.baeldung.jackson.date;
import java.io.IOException;
import java.text.ParseException;
diff --git a/jackson/src/test/java/org/baeldung/jackson/date/CustomDateSerializer.java b/jackson/src/test/java/com/baeldung/jackson/date/CustomDateSerializer.java
similarity index 95%
rename from jackson/src/test/java/org/baeldung/jackson/date/CustomDateSerializer.java
rename to jackson/src/test/java/com/baeldung/jackson/date/CustomDateSerializer.java
index 40aad21482..8d435b7b69 100644
--- a/jackson/src/test/java/org/baeldung/jackson/date/CustomDateSerializer.java
+++ b/jackson/src/test/java/com/baeldung/jackson/date/CustomDateSerializer.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.date;
+package com.baeldung.jackson.date;
import java.io.IOException;
import java.text.SimpleDateFormat;
diff --git a/jackson/src/test/java/org/baeldung/jackson/date/CustomDateTimeSerializer.java b/jackson/src/test/java/com/baeldung/jackson/date/CustomDateTimeSerializer.java
similarity index 95%
rename from jackson/src/test/java/org/baeldung/jackson/date/CustomDateTimeSerializer.java
rename to jackson/src/test/java/com/baeldung/jackson/date/CustomDateTimeSerializer.java
index 9f2a290bc4..88c069419b 100644
--- a/jackson/src/test/java/org/baeldung/jackson/date/CustomDateTimeSerializer.java
+++ b/jackson/src/test/java/com/baeldung/jackson/date/CustomDateTimeSerializer.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.date;
+package com.baeldung.jackson.date;
import java.io.IOException;
diff --git a/jackson/src/test/java/org/baeldung/jackson/date/CustomLocalDateTimeSerializer.java b/jackson/src/test/java/com/baeldung/jackson/date/CustomLocalDateTimeSerializer.java
similarity index 95%
rename from jackson/src/test/java/org/baeldung/jackson/date/CustomLocalDateTimeSerializer.java
rename to jackson/src/test/java/com/baeldung/jackson/date/CustomLocalDateTimeSerializer.java
index b1e6a8ba86..3f8f5e098e 100644
--- a/jackson/src/test/java/org/baeldung/jackson/date/CustomLocalDateTimeSerializer.java
+++ b/jackson/src/test/java/com/baeldung/jackson/date/CustomLocalDateTimeSerializer.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.date;
+package com.baeldung.jackson.date;
import java.io.IOException;
import java.time.LocalDateTime;
diff --git a/jackson/src/test/java/org/baeldung/jackson/date/Event.java b/jackson/src/test/java/com/baeldung/jackson/date/Event.java
similarity index 91%
rename from jackson/src/test/java/org/baeldung/jackson/date/Event.java
rename to jackson/src/test/java/com/baeldung/jackson/date/Event.java
index 783eee6af8..e20882abc1 100644
--- a/jackson/src/test/java/org/baeldung/jackson/date/Event.java
+++ b/jackson/src/test/java/com/baeldung/jackson/date/Event.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.date;
+package com.baeldung.jackson.date;
import java.util.Date;
diff --git a/jackson/src/test/java/org/baeldung/jackson/date/EventWithFormat.java b/jackson/src/test/java/com/baeldung/jackson/date/EventWithFormat.java
similarity index 94%
rename from jackson/src/test/java/org/baeldung/jackson/date/EventWithFormat.java
rename to jackson/src/test/java/com/baeldung/jackson/date/EventWithFormat.java
index 4b2053eb4b..607e694cef 100644
--- a/jackson/src/test/java/org/baeldung/jackson/date/EventWithFormat.java
+++ b/jackson/src/test/java/com/baeldung/jackson/date/EventWithFormat.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.date;
+package com.baeldung.jackson.date;
import java.util.Date;
diff --git a/jackson/src/test/java/org/baeldung/jackson/date/EventWithJodaTime.java b/jackson/src/test/java/com/baeldung/jackson/date/EventWithJodaTime.java
similarity index 94%
rename from jackson/src/test/java/org/baeldung/jackson/date/EventWithJodaTime.java
rename to jackson/src/test/java/com/baeldung/jackson/date/EventWithJodaTime.java
index 0c72030650..6abee344ef 100644
--- a/jackson/src/test/java/org/baeldung/jackson/date/EventWithJodaTime.java
+++ b/jackson/src/test/java/com/baeldung/jackson/date/EventWithJodaTime.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.date;
+package com.baeldung.jackson.date;
import org.joda.time.DateTime;
diff --git a/jackson/src/test/java/org/baeldung/jackson/date/EventWithLocalDateTime.java b/jackson/src/test/java/com/baeldung/jackson/date/EventWithLocalDateTime.java
similarity index 94%
rename from jackson/src/test/java/org/baeldung/jackson/date/EventWithLocalDateTime.java
rename to jackson/src/test/java/com/baeldung/jackson/date/EventWithLocalDateTime.java
index 6c48cf3f0e..16104222d4 100644
--- a/jackson/src/test/java/org/baeldung/jackson/date/EventWithLocalDateTime.java
+++ b/jackson/src/test/java/com/baeldung/jackson/date/EventWithLocalDateTime.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.date;
+package com.baeldung.jackson.date;
import java.time.LocalDateTime;
diff --git a/jackson/src/test/java/org/baeldung/jackson/date/EventWithSerializer.java b/jackson/src/test/java/com/baeldung/jackson/date/EventWithSerializer.java
similarity index 95%
rename from jackson/src/test/java/org/baeldung/jackson/date/EventWithSerializer.java
rename to jackson/src/test/java/com/baeldung/jackson/date/EventWithSerializer.java
index 9cdd6a0fab..c359b5c846 100644
--- a/jackson/src/test/java/org/baeldung/jackson/date/EventWithSerializer.java
+++ b/jackson/src/test/java/com/baeldung/jackson/date/EventWithSerializer.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.date;
+package com.baeldung.jackson.date;
import java.util.Date;
diff --git a/jackson/src/test/java/org/baeldung/jackson/deserialization/ItemDeserializer.java b/jackson/src/test/java/com/baeldung/jackson/deserialization/ItemDeserializer.java
similarity index 88%
rename from jackson/src/test/java/org/baeldung/jackson/deserialization/ItemDeserializer.java
rename to jackson/src/test/java/com/baeldung/jackson/deserialization/ItemDeserializer.java
index baf5b945e7..3be6685103 100644
--- a/jackson/src/test/java/org/baeldung/jackson/deserialization/ItemDeserializer.java
+++ b/jackson/src/test/java/com/baeldung/jackson/deserialization/ItemDeserializer.java
@@ -1,9 +1,9 @@
-package org.baeldung.jackson.deserialization;
+package com.baeldung.jackson.deserialization;
import java.io.IOException;
-import org.baeldung.jackson.dtos.Item;
-import org.baeldung.jackson.dtos.User;
+import com.baeldung.jackson.dtos.User;
+import com.baeldung.jackson.dtos.Item;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
diff --git a/jackson/src/test/java/org/baeldung/jackson/deserialization/ItemDeserializerOnClass.java b/jackson/src/test/java/com/baeldung/jackson/deserialization/ItemDeserializerOnClass.java
similarity index 88%
rename from jackson/src/test/java/org/baeldung/jackson/deserialization/ItemDeserializerOnClass.java
rename to jackson/src/test/java/com/baeldung/jackson/deserialization/ItemDeserializerOnClass.java
index 346f75db07..169a5c1c50 100644
--- a/jackson/src/test/java/org/baeldung/jackson/deserialization/ItemDeserializerOnClass.java
+++ b/jackson/src/test/java/com/baeldung/jackson/deserialization/ItemDeserializerOnClass.java
@@ -1,9 +1,9 @@
-package org.baeldung.jackson.deserialization;
+package com.baeldung.jackson.deserialization;
import java.io.IOException;
-import org.baeldung.jackson.dtos.ItemWithSerializer;
-import org.baeldung.jackson.dtos.User;
+import com.baeldung.jackson.dtos.ItemWithSerializer;
+import com.baeldung.jackson.dtos.User;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
diff --git a/jackson/src/test/java/org/baeldung/jackson/dtos/Item.java b/jackson/src/test/java/com/baeldung/jackson/dtos/Item.java
similarity index 93%
rename from jackson/src/test/java/org/baeldung/jackson/dtos/Item.java
rename to jackson/src/test/java/com/baeldung/jackson/dtos/Item.java
index 1dd840372a..6fce2bc88e 100644
--- a/jackson/src/test/java/org/baeldung/jackson/dtos/Item.java
+++ b/jackson/src/test/java/com/baeldung/jackson/dtos/Item.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.dtos;
+package com.baeldung.jackson.dtos;
public class Item {
public int id;
diff --git a/jackson/src/test/java/org/baeldung/jackson/dtos/ItemWithSerializer.java b/jackson/src/test/java/com/baeldung/jackson/dtos/ItemWithSerializer.java
similarity index 81%
rename from jackson/src/test/java/org/baeldung/jackson/dtos/ItemWithSerializer.java
rename to jackson/src/test/java/com/baeldung/jackson/dtos/ItemWithSerializer.java
index 6dadfa4908..aea9aa770d 100644
--- a/jackson/src/test/java/org/baeldung/jackson/dtos/ItemWithSerializer.java
+++ b/jackson/src/test/java/com/baeldung/jackson/dtos/ItemWithSerializer.java
@@ -1,7 +1,7 @@
-package org.baeldung.jackson.dtos;
+package com.baeldung.jackson.dtos;
-import org.baeldung.jackson.deserialization.ItemDeserializerOnClass;
-import org.baeldung.jackson.serialization.ItemSerializerOnClass;
+import com.baeldung.jackson.deserialization.ItemDeserializerOnClass;
+import com.baeldung.jackson.serialization.ItemSerializerOnClass;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
diff --git a/jackson/src/test/java/org/baeldung/jackson/dtos/MyDto.java b/jackson/src/test/java/com/baeldung/jackson/dtos/MyDto.java
similarity index 96%
rename from jackson/src/test/java/org/baeldung/jackson/dtos/MyDto.java
rename to jackson/src/test/java/com/baeldung/jackson/dtos/MyDto.java
index 668eea3fcc..49cf07baea 100644
--- a/jackson/src/test/java/org/baeldung/jackson/dtos/MyDto.java
+++ b/jackson/src/test/java/com/baeldung/jackson/dtos/MyDto.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.dtos;
+package com.baeldung.jackson.dtos;
public class MyDto {
diff --git a/jackson/src/test/java/org/baeldung/jackson/dtos/MyDtoFieldNameChanged.java b/jackson/src/test/java/com/baeldung/jackson/dtos/MyDtoFieldNameChanged.java
similarity index 96%
rename from jackson/src/test/java/org/baeldung/jackson/dtos/MyDtoFieldNameChanged.java
rename to jackson/src/test/java/com/baeldung/jackson/dtos/MyDtoFieldNameChanged.java
index 9c4086a965..ce7086f1fe 100644
--- a/jackson/src/test/java/org/baeldung/jackson/dtos/MyDtoFieldNameChanged.java
+++ b/jackson/src/test/java/com/baeldung/jackson/dtos/MyDtoFieldNameChanged.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.dtos;
+package com.baeldung.jackson.dtos;
import com.fasterxml.jackson.annotation.JsonProperty;
diff --git a/jackson/src/test/java/org/baeldung/jackson/dtos/MyDtoIncludeNonDefault.java b/jackson/src/test/java/com/baeldung/jackson/dtos/MyDtoIncludeNonDefault.java
similarity index 96%
rename from jackson/src/test/java/org/baeldung/jackson/dtos/MyDtoIncludeNonDefault.java
rename to jackson/src/test/java/com/baeldung/jackson/dtos/MyDtoIncludeNonDefault.java
index b99d793363..ca03a8be62 100644
--- a/jackson/src/test/java/org/baeldung/jackson/dtos/MyDtoIncludeNonDefault.java
+++ b/jackson/src/test/java/com/baeldung/jackson/dtos/MyDtoIncludeNonDefault.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.dtos;
+package com.baeldung.jackson.dtos;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
diff --git a/jackson/src/test/java/org/baeldung/jackson/dtos/MyDtoNoAccessors.java b/jackson/src/test/java/com/baeldung/jackson/dtos/MyDtoNoAccessors.java
similarity index 92%
rename from jackson/src/test/java/org/baeldung/jackson/dtos/MyDtoNoAccessors.java
rename to jackson/src/test/java/com/baeldung/jackson/dtos/MyDtoNoAccessors.java
index 6e88f5a2db..6e9abc90ae 100644
--- a/jackson/src/test/java/org/baeldung/jackson/dtos/MyDtoNoAccessors.java
+++ b/jackson/src/test/java/com/baeldung/jackson/dtos/MyDtoNoAccessors.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.dtos;
+package com.baeldung.jackson.dtos;
public class MyDtoNoAccessors {
diff --git a/jackson/src/test/java/org/baeldung/jackson/dtos/MyDtoNoAccessorsAndFieldVisibility.java b/jackson/src/test/java/com/baeldung/jackson/dtos/MyDtoNoAccessorsAndFieldVisibility.java
similarity index 94%
rename from jackson/src/test/java/org/baeldung/jackson/dtos/MyDtoNoAccessorsAndFieldVisibility.java
rename to jackson/src/test/java/com/baeldung/jackson/dtos/MyDtoNoAccessorsAndFieldVisibility.java
index 1723a71230..149969f769 100644
--- a/jackson/src/test/java/org/baeldung/jackson/dtos/MyDtoNoAccessorsAndFieldVisibility.java
+++ b/jackson/src/test/java/com/baeldung/jackson/dtos/MyDtoNoAccessorsAndFieldVisibility.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.dtos;
+package com.baeldung.jackson.dtos;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
diff --git a/jackson/src/test/java/org/baeldung/jackson/dtos/MyDtoWithFilter.java b/jackson/src/test/java/com/baeldung/jackson/dtos/MyDtoWithFilter.java
similarity index 96%
rename from jackson/src/test/java/org/baeldung/jackson/dtos/MyDtoWithFilter.java
rename to jackson/src/test/java/com/baeldung/jackson/dtos/MyDtoWithFilter.java
index 03d7edf985..91f5e148b2 100644
--- a/jackson/src/test/java/org/baeldung/jackson/dtos/MyDtoWithFilter.java
+++ b/jackson/src/test/java/com/baeldung/jackson/dtos/MyDtoWithFilter.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.dtos;
+package com.baeldung.jackson.dtos;
import com.fasterxml.jackson.annotation.JsonFilter;
diff --git a/jackson/src/test/java/org/baeldung/jackson/dtos/MyMixInForString.java b/jackson/src/test/java/com/baeldung/jackson/dtos/MyMixInForString.java
similarity index 76%
rename from jackson/src/test/java/org/baeldung/jackson/dtos/MyMixInForString.java
rename to jackson/src/test/java/com/baeldung/jackson/dtos/MyMixInForString.java
index 3d5228139e..b386541df6 100644
--- a/jackson/src/test/java/org/baeldung/jackson/dtos/MyMixInForString.java
+++ b/jackson/src/test/java/com/baeldung/jackson/dtos/MyMixInForString.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.dtos;
+package com.baeldung.jackson.dtos;
import com.fasterxml.jackson.annotation.JsonIgnoreType;
diff --git a/jackson/src/test/java/org/baeldung/jackson/dtos/User.java b/jackson/src/test/java/com/baeldung/jackson/dtos/User.java
similarity index 90%
rename from jackson/src/test/java/org/baeldung/jackson/dtos/User.java
rename to jackson/src/test/java/com/baeldung/jackson/dtos/User.java
index cef29f11b4..2418e8070d 100644
--- a/jackson/src/test/java/org/baeldung/jackson/dtos/User.java
+++ b/jackson/src/test/java/com/baeldung/jackson/dtos/User.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.dtos;
+package com.baeldung.jackson.dtos;
public class User {
public int id;
diff --git a/jackson/src/test/java/org/baeldung/jackson/dtos/ignore/MyDtoIgnoreField.java b/jackson/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreField.java
similarity index 94%
rename from jackson/src/test/java/org/baeldung/jackson/dtos/ignore/MyDtoIgnoreField.java
rename to jackson/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreField.java
index 4e3aecd0d2..f573501e85 100644
--- a/jackson/src/test/java/org/baeldung/jackson/dtos/ignore/MyDtoIgnoreField.java
+++ b/jackson/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreField.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.dtos.ignore;
+package com.baeldung.jackson.dtos.ignore;
import com.fasterxml.jackson.annotation.JsonIgnore;
diff --git a/jackson/src/test/java/org/baeldung/jackson/dtos/ignore/MyDtoIgnoreFieldByName.java b/jackson/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreFieldByName.java
similarity index 95%
rename from jackson/src/test/java/org/baeldung/jackson/dtos/ignore/MyDtoIgnoreFieldByName.java
rename to jackson/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreFieldByName.java
index d752e0576d..e7b8ea2a8e 100644
--- a/jackson/src/test/java/org/baeldung/jackson/dtos/ignore/MyDtoIgnoreFieldByName.java
+++ b/jackson/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreFieldByName.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.dtos.ignore;
+package com.baeldung.jackson.dtos.ignore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
diff --git a/jackson/src/test/java/org/baeldung/jackson/dtos/ignore/MyDtoIgnoreNull.java b/jackson/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreNull.java
similarity index 96%
rename from jackson/src/test/java/org/baeldung/jackson/dtos/ignore/MyDtoIgnoreNull.java
rename to jackson/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreNull.java
index 0e28e43024..bc443500a1 100644
--- a/jackson/src/test/java/org/baeldung/jackson/dtos/ignore/MyDtoIgnoreNull.java
+++ b/jackson/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreNull.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.dtos.ignore;
+package com.baeldung.jackson.dtos.ignore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
diff --git a/jackson/src/test/java/org/baeldung/jackson/dtos/ignore/MyDtoIgnoreType.java b/jackson/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreType.java
similarity index 96%
rename from jackson/src/test/java/org/baeldung/jackson/dtos/ignore/MyDtoIgnoreType.java
rename to jackson/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreType.java
index 58876aec79..3c813145f6 100644
--- a/jackson/src/test/java/org/baeldung/jackson/dtos/ignore/MyDtoIgnoreType.java
+++ b/jackson/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreType.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.dtos.ignore;
+package com.baeldung.jackson.dtos.ignore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
diff --git a/jackson/src/test/java/org/baeldung/jackson/dtos/ignore/MyDtoIgnoreUnknown.java b/jackson/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreUnknown.java
similarity index 96%
rename from jackson/src/test/java/org/baeldung/jackson/dtos/ignore/MyDtoIgnoreUnknown.java
rename to jackson/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreUnknown.java
index ca702343eb..c1174a12f5 100644
--- a/jackson/src/test/java/org/baeldung/jackson/dtos/ignore/MyDtoIgnoreUnknown.java
+++ b/jackson/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreUnknown.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.dtos.ignore;
+package com.baeldung.jackson.dtos.ignore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
diff --git a/jackson/src/test/java/org/baeldung/jackson/dtos/withEnum/MyDtoWithEnum.java b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnum.java
similarity index 96%
rename from jackson/src/test/java/org/baeldung/jackson/dtos/withEnum/MyDtoWithEnum.java
rename to jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnum.java
index aa05539b89..258eb6febd 100644
--- a/jackson/src/test/java/org/baeldung/jackson/dtos/withEnum/MyDtoWithEnum.java
+++ b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnum.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.dtos.withEnum;
+package com.baeldung.jackson.dtos.withEnum;
public class MyDtoWithEnum {
diff --git a/jackson/src/test/java/org/baeldung/jackson/dtos/withEnum/MyDtoWithEnumCustom.java b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnumCustom.java
similarity index 96%
rename from jackson/src/test/java/org/baeldung/jackson/dtos/withEnum/MyDtoWithEnumCustom.java
rename to jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnumCustom.java
index b58ea4bd15..676e22686e 100644
--- a/jackson/src/test/java/org/baeldung/jackson/dtos/withEnum/MyDtoWithEnumCustom.java
+++ b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnumCustom.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.dtos.withEnum;
+package com.baeldung.jackson.dtos.withEnum;
public class MyDtoWithEnumCustom {
diff --git a/jackson/src/test/java/org/baeldung/jackson/dtos/withEnum/TypeEnum.java b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnum.java
similarity index 93%
rename from jackson/src/test/java/org/baeldung/jackson/dtos/withEnum/TypeEnum.java
rename to jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnum.java
index 316fdb12e7..e0c9718330 100644
--- a/jackson/src/test/java/org/baeldung/jackson/dtos/withEnum/TypeEnum.java
+++ b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnum.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.dtos.withEnum;
+package com.baeldung.jackson.dtos.withEnum;
import com.fasterxml.jackson.annotation.JsonFormat;
diff --git a/jackson/src/test/java/org/baeldung/jackson/dtos/withEnum/TypeEnumSimple.java b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumSimple.java
similarity index 92%
rename from jackson/src/test/java/org/baeldung/jackson/dtos/withEnum/TypeEnumSimple.java
rename to jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumSimple.java
index b76a5740ec..477db67069 100644
--- a/jackson/src/test/java/org/baeldung/jackson/dtos/withEnum/TypeEnumSimple.java
+++ b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumSimple.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.dtos.withEnum;
+package com.baeldung.jackson.dtos.withEnum;
public enum TypeEnumSimple {
TYPE1(1, "Type A"), TYPE2(2, "Type 2");
diff --git a/jackson/src/test/java/org/baeldung/jackson/dtos/withEnum/TypeEnumWithCustomSerializer.java b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumWithCustomSerializer.java
similarity index 93%
rename from jackson/src/test/java/org/baeldung/jackson/dtos/withEnum/TypeEnumWithCustomSerializer.java
rename to jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumWithCustomSerializer.java
index 7e004d2d7d..e7c2859dd1 100644
--- a/jackson/src/test/java/org/baeldung/jackson/dtos/withEnum/TypeEnumWithCustomSerializer.java
+++ b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumWithCustomSerializer.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.dtos.withEnum;
+package com.baeldung.jackson.dtos.withEnum;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
diff --git a/jackson/src/test/java/org/baeldung/jackson/dtos/withEnum/TypeEnumWithValue.java b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumWithValue.java
similarity index 93%
rename from jackson/src/test/java/org/baeldung/jackson/dtos/withEnum/TypeEnumWithValue.java
rename to jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumWithValue.java
index cf104df473..c5ddf222ff 100644
--- a/jackson/src/test/java/org/baeldung/jackson/dtos/withEnum/TypeEnumWithValue.java
+++ b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumWithValue.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.dtos.withEnum;
+package com.baeldung.jackson.dtos.withEnum;
import com.fasterxml.jackson.annotation.JsonValue;
diff --git a/jackson/src/test/java/org/baeldung/jackson/dtos/withEnum/TypeSerializer.java b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeSerializer.java
similarity index 94%
rename from jackson/src/test/java/org/baeldung/jackson/dtos/withEnum/TypeSerializer.java
rename to jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeSerializer.java
index 8aa7e5c551..c5d5d7e0a8 100644
--- a/jackson/src/test/java/org/baeldung/jackson/dtos/withEnum/TypeSerializer.java
+++ b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeSerializer.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.dtos.withEnum;
+package com.baeldung.jackson.dtos.withEnum;
import java.io.IOException;
diff --git a/jackson/src/test/java/org/baeldung/jackson/dynamicIgnore/Address.java b/jackson/src/test/java/com/baeldung/jackson/dynamicIgnore/Address.java
similarity index 94%
rename from jackson/src/test/java/org/baeldung/jackson/dynamicIgnore/Address.java
rename to jackson/src/test/java/com/baeldung/jackson/dynamicIgnore/Address.java
index 41ea8e7be3..c2d2e84d45 100644
--- a/jackson/src/test/java/org/baeldung/jackson/dynamicIgnore/Address.java
+++ b/jackson/src/test/java/com/baeldung/jackson/dynamicIgnore/Address.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.dynamicIgnore;
+package com.baeldung.jackson.dynamicIgnore;
public class Address implements Hidable {
diff --git a/jackson/src/test/java/org/baeldung/jackson/dynamicIgnore/Hidable.java b/jackson/src/test/java/com/baeldung/jackson/dynamicIgnore/Hidable.java
similarity index 77%
rename from jackson/src/test/java/org/baeldung/jackson/dynamicIgnore/Hidable.java
rename to jackson/src/test/java/com/baeldung/jackson/dynamicIgnore/Hidable.java
index 9eaa0c9619..edca786432 100644
--- a/jackson/src/test/java/org/baeldung/jackson/dynamicIgnore/Hidable.java
+++ b/jackson/src/test/java/com/baeldung/jackson/dynamicIgnore/Hidable.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.dynamicIgnore;
+package com.baeldung.jackson.dynamicIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
diff --git a/jackson/src/test/java/org/baeldung/jackson/dynamicIgnore/HidableSerializer.java b/jackson/src/test/java/com/baeldung/jackson/dynamicIgnore/HidableSerializer.java
similarity index 95%
rename from jackson/src/test/java/org/baeldung/jackson/dynamicIgnore/HidableSerializer.java
rename to jackson/src/test/java/com/baeldung/jackson/dynamicIgnore/HidableSerializer.java
index 35bd8fd7f6..46396dae2a 100644
--- a/jackson/src/test/java/org/baeldung/jackson/dynamicIgnore/HidableSerializer.java
+++ b/jackson/src/test/java/com/baeldung/jackson/dynamicIgnore/HidableSerializer.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.dynamicIgnore;
+package com.baeldung.jackson.dynamicIgnore;
import java.io.IOException;
diff --git a/jackson/src/test/java/org/baeldung/jackson/dynamicIgnore/Person.java b/jackson/src/test/java/com/baeldung/jackson/dynamicIgnore/Person.java
similarity index 94%
rename from jackson/src/test/java/org/baeldung/jackson/dynamicIgnore/Person.java
rename to jackson/src/test/java/com/baeldung/jackson/dynamicIgnore/Person.java
index 5fe294a5e1..366f611edf 100644
--- a/jackson/src/test/java/org/baeldung/jackson/dynamicIgnore/Person.java
+++ b/jackson/src/test/java/com/baeldung/jackson/dynamicIgnore/Person.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.dynamicIgnore;
+package com.baeldung.jackson.dynamicIgnore;
public class Person implements Hidable {
diff --git a/jackson/src/test/java/org/baeldung/jackson/exception/User.java b/jackson/src/test/java/com/baeldung/jackson/exception/User.java
similarity index 81%
rename from jackson/src/test/java/org/baeldung/jackson/exception/User.java
rename to jackson/src/test/java/com/baeldung/jackson/exception/User.java
index 764d5872ad..1d78e82bec 100644
--- a/jackson/src/test/java/org/baeldung/jackson/exception/User.java
+++ b/jackson/src/test/java/com/baeldung/jackson/exception/User.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.exception;
+package com.baeldung.jackson.exception;
public class User {
public int id;
diff --git a/jackson/src/test/java/org/baeldung/jackson/exception/UserWithConflict.java b/jackson/src/test/java/com/baeldung/jackson/exception/UserWithConflict.java
similarity index 91%
rename from jackson/src/test/java/org/baeldung/jackson/exception/UserWithConflict.java
rename to jackson/src/test/java/com/baeldung/jackson/exception/UserWithConflict.java
index 79d4199e91..01ff695475 100644
--- a/jackson/src/test/java/org/baeldung/jackson/exception/UserWithConflict.java
+++ b/jackson/src/test/java/com/baeldung/jackson/exception/UserWithConflict.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.exception;
+package com.baeldung.jackson.exception;
public class UserWithConflict {
public int id;
diff --git a/jackson/src/test/java/org/baeldung/jackson/exception/UserWithPrivateFields.java b/jackson/src/test/java/com/baeldung/jackson/exception/UserWithPrivateFields.java
similarity index 86%
rename from jackson/src/test/java/org/baeldung/jackson/exception/UserWithPrivateFields.java
rename to jackson/src/test/java/com/baeldung/jackson/exception/UserWithPrivateFields.java
index 707623bbb2..f627975184 100644
--- a/jackson/src/test/java/org/baeldung/jackson/exception/UserWithPrivateFields.java
+++ b/jackson/src/test/java/com/baeldung/jackson/exception/UserWithPrivateFields.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.exception;
+package com.baeldung.jackson.exception;
public class UserWithPrivateFields {
int id;
diff --git a/jackson/src/test/java/org/baeldung/jackson/exception/UserWithRoot.java b/jackson/src/test/java/com/baeldung/jackson/exception/UserWithRoot.java
similarity index 89%
rename from jackson/src/test/java/org/baeldung/jackson/exception/UserWithRoot.java
rename to jackson/src/test/java/com/baeldung/jackson/exception/UserWithRoot.java
index 2cf78e0365..d879c16e6a 100644
--- a/jackson/src/test/java/org/baeldung/jackson/exception/UserWithRoot.java
+++ b/jackson/src/test/java/com/baeldung/jackson/exception/UserWithRoot.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.exception;
+package com.baeldung.jackson.exception;
import com.fasterxml.jackson.annotation.JsonRootName;
diff --git a/jackson/src/test/java/org/baeldung/jackson/exception/Zoo.java b/jackson/src/test/java/com/baeldung/jackson/exception/Zoo.java
similarity index 84%
rename from jackson/src/test/java/org/baeldung/jackson/exception/Zoo.java
rename to jackson/src/test/java/com/baeldung/jackson/exception/Zoo.java
index 79c24569f2..647b5955c0 100644
--- a/jackson/src/test/java/org/baeldung/jackson/exception/Zoo.java
+++ b/jackson/src/test/java/com/baeldung/jackson/exception/Zoo.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.exception;
+package com.baeldung.jackson.exception;
public class Zoo {
public Animal animal;
diff --git a/jackson/src/test/java/org/baeldung/jackson/exception/ZooConfigured.java b/jackson/src/test/java/com/baeldung/jackson/exception/ZooConfigured.java
similarity index 91%
rename from jackson/src/test/java/org/baeldung/jackson/exception/ZooConfigured.java
rename to jackson/src/test/java/com/baeldung/jackson/exception/ZooConfigured.java
index 776b702acb..f51b1e150a 100644
--- a/jackson/src/test/java/org/baeldung/jackson/exception/ZooConfigured.java
+++ b/jackson/src/test/java/com/baeldung/jackson/exception/ZooConfigured.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.exception;
+package com.baeldung.jackson.exception;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
diff --git a/jackson/src/test/java/org/baeldung/jackson/field/MyDto.java b/jackson/src/test/java/com/baeldung/jackson/field/MyDto.java
similarity index 96%
rename from jackson/src/test/java/org/baeldung/jackson/field/MyDto.java
rename to jackson/src/test/java/com/baeldung/jackson/field/MyDto.java
index edfc9d2f91..f19371937d 100644
--- a/jackson/src/test/java/org/baeldung/jackson/field/MyDto.java
+++ b/jackson/src/test/java/com/baeldung/jackson/field/MyDto.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.field;
+package com.baeldung.jackson.field;
public class MyDto {
diff --git a/jackson/src/test/java/org/baeldung/jackson/field/MyDtoAccessLevel.java b/jackson/src/test/java/com/baeldung/jackson/field/MyDtoAccessLevel.java
similarity index 93%
rename from jackson/src/test/java/org/baeldung/jackson/field/MyDtoAccessLevel.java
rename to jackson/src/test/java/com/baeldung/jackson/field/MyDtoAccessLevel.java
index c164b00e4a..df16720038 100644
--- a/jackson/src/test/java/org/baeldung/jackson/field/MyDtoAccessLevel.java
+++ b/jackson/src/test/java/com/baeldung/jackson/field/MyDtoAccessLevel.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.field;
+package com.baeldung.jackson.field;
public class MyDtoAccessLevel {
diff --git a/jackson/src/test/java/org/baeldung/jackson/field/MyDtoWithGetter.java b/jackson/src/test/java/com/baeldung/jackson/field/MyDtoWithGetter.java
similarity index 91%
rename from jackson/src/test/java/org/baeldung/jackson/field/MyDtoWithGetter.java
rename to jackson/src/test/java/com/baeldung/jackson/field/MyDtoWithGetter.java
index 0f15b2fcc3..4ea20b93c1 100644
--- a/jackson/src/test/java/org/baeldung/jackson/field/MyDtoWithGetter.java
+++ b/jackson/src/test/java/com/baeldung/jackson/field/MyDtoWithGetter.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.field;
+package com.baeldung.jackson.field;
public class MyDtoWithGetter {
diff --git a/jackson/src/test/java/org/baeldung/jackson/field/MyDtoWithSetter.java b/jackson/src/test/java/com/baeldung/jackson/field/MyDtoWithSetter.java
similarity index 93%
rename from jackson/src/test/java/org/baeldung/jackson/field/MyDtoWithSetter.java
rename to jackson/src/test/java/com/baeldung/jackson/field/MyDtoWithSetter.java
index e37793492e..fd3f6790a3 100644
--- a/jackson/src/test/java/org/baeldung/jackson/field/MyDtoWithSetter.java
+++ b/jackson/src/test/java/com/baeldung/jackson/field/MyDtoWithSetter.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.field;
+package com.baeldung.jackson.field;
public class MyDtoWithSetter {
diff --git a/jackson/src/test/java/com/baeldung/jackson/inheritance/IgnoranceAnnotationStructure.java b/jackson/src/test/java/com/baeldung/jackson/inheritance/IgnoranceAnnotationStructure.java
new file mode 100644
index 0000000000..520929463c
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/inheritance/IgnoranceAnnotationStructure.java
@@ -0,0 +1,96 @@
+package com.baeldung.jackson.inheritance;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+
+public class IgnoranceAnnotationStructure {
+ public static abstract class Vehicle {
+ private String make;
+ private String model;
+
+ protected Vehicle() {
+ }
+
+ protected Vehicle(String make, String model) {
+ this.make = make;
+ this.model = model;
+ }
+
+ public String getMake() {
+ return make;
+ }
+
+ public void setMake(String make) {
+ this.make = make;
+ }
+
+ public String getModel() {
+ return model;
+ }
+
+ public void setModel(String model) {
+ this.model = model;
+ }
+ }
+
+ @JsonIgnoreProperties({ "model", "seatingCapacity" })
+ public static abstract class Car extends Vehicle {
+ private int seatingCapacity;
+ @JsonIgnore
+ private double topSpeed;
+
+ protected Car() {
+ }
+
+ protected Car(String make, String model, int seatingCapacity, double topSpeed) {
+ super(make, model);
+ this.seatingCapacity = seatingCapacity;
+ this.topSpeed = topSpeed;
+ }
+
+ public int getSeatingCapacity() {
+ return seatingCapacity;
+ }
+
+ public void setSeatingCapacity(int seatingCapacity) {
+ this.seatingCapacity = seatingCapacity;
+ }
+
+ public double getTopSpeed() {
+ return topSpeed;
+ }
+
+ public void setTopSpeed(double topSpeed) {
+ this.topSpeed = topSpeed;
+ }
+ }
+
+ public static class Sedan extends Car {
+ public Sedan() {
+ }
+
+ public Sedan(String make, String model, int seatingCapacity, double topSpeed) {
+ super(make, model, seatingCapacity, topSpeed);
+ }
+ }
+
+ public static class Crossover extends Car {
+ private double towingCapacity;
+
+ public Crossover() {
+ }
+
+ public Crossover(String make, String model, int seatingCapacity, double topSpeed, double towingCapacity) {
+ super(make, model, seatingCapacity, topSpeed);
+ this.towingCapacity = towingCapacity;
+ }
+
+ public double getTowingCapacity() {
+ return towingCapacity;
+ }
+
+ public void setTowingCapacity(double towingCapacity) {
+ this.towingCapacity = towingCapacity;
+ }
+ }
+}
\ No newline at end of file
diff --git a/jackson/src/test/java/com/baeldung/jackson/inheritance/IgnoranceMixinOrIntrospection.java b/jackson/src/test/java/com/baeldung/jackson/inheritance/IgnoranceMixinOrIntrospection.java
new file mode 100644
index 0000000000..52c0bbea5e
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/inheritance/IgnoranceMixinOrIntrospection.java
@@ -0,0 +1,91 @@
+package com.baeldung.jackson.inheritance;
+
+public class IgnoranceMixinOrIntrospection {
+ public static abstract class Vehicle {
+ private String make;
+ private String model;
+
+ protected Vehicle() {
+ }
+
+ protected Vehicle(String make, String model) {
+ this.make = make;
+ this.model = model;
+ }
+
+ public String getMake() {
+ return make;
+ }
+
+ public void setMake(String make) {
+ this.make = make;
+ }
+
+ public String getModel() {
+ return model;
+ }
+
+ public void setModel(String model) {
+ this.model = model;
+ }
+ }
+
+ public static abstract class Car extends Vehicle {
+ private int seatingCapacity;
+ private double topSpeed;
+
+ protected Car() {
+ }
+
+ protected Car(String make, String model, int seatingCapacity, double topSpeed) {
+ super(make, model);
+ this.seatingCapacity = seatingCapacity;
+ this.topSpeed = topSpeed;
+ }
+
+ public int getSeatingCapacity() {
+ return seatingCapacity;
+ }
+
+ public void setSeatingCapacity(int seatingCapacity) {
+ this.seatingCapacity = seatingCapacity;
+ }
+
+ public double getTopSpeed() {
+ return topSpeed;
+ }
+
+ public void setTopSpeed(double topSpeed) {
+ this.topSpeed = topSpeed;
+ }
+ }
+
+ public static class Sedan extends Car {
+ public Sedan() {
+ }
+
+ public Sedan(String make, String model, int seatingCapacity, double topSpeed) {
+ super(make, model, seatingCapacity, topSpeed);
+ }
+ }
+
+ public static class Crossover extends Car {
+ private double towingCapacity;
+
+ public Crossover() {
+ }
+
+ public Crossover(String make, String model, int seatingCapacity, double topSpeed, double towingCapacity) {
+ super(make, model, seatingCapacity, topSpeed);
+ this.towingCapacity = towingCapacity;
+ }
+
+ public double getTowingCapacity() {
+ return towingCapacity;
+ }
+
+ public void setTowingCapacity(double towingCapacity) {
+ this.towingCapacity = towingCapacity;
+ }
+ }
+}
\ No newline at end of file
diff --git a/jackson/src/test/java/com/baeldung/jackson/inheritance/IgnoranceTest.java b/jackson/src/test/java/com/baeldung/jackson/inheritance/IgnoranceTest.java
new file mode 100644
index 0000000000..8d22f471a6
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/inheritance/IgnoranceTest.java
@@ -0,0 +1,92 @@
+package com.baeldung.jackson.inheritance;
+
+import static org.junit.Assert.assertThat;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.CoreMatchers.not;
+
+import org.junit.Test;
+
+import java.util.List;
+import java.util.ArrayList;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.introspect.AnnotatedMember;
+import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
+
+public class IgnoranceTest {
+ private static abstract class CarMixIn {
+ @JsonIgnore
+ public String make;
+ @JsonIgnore
+ public String topSpeed;
+ }
+
+ private static class IgnoranceIntrospector extends JacksonAnnotationIntrospector {
+ private static final long serialVersionUID = 1422295680188892323L;
+
+ public boolean hasIgnoreMarker(AnnotatedMember m) {
+ return m.getDeclaringClass() == IgnoranceMixinOrIntrospection.Vehicle.class && m.getName() == "model" || m.getDeclaringClass() == IgnoranceMixinOrIntrospection.Car.class || m.getName() == "towingCapacity" || super.hasIgnoreMarker(m);
+ }
+ }
+
+ @Test
+ public void givenAnnotations_whenIgnoringProperties_thenCorrect() throws JsonProcessingException {
+ ObjectMapper mapper = new ObjectMapper();
+
+ IgnoranceAnnotationStructure.Sedan sedan = new IgnoranceAnnotationStructure.Sedan("Mercedes-Benz", "S500", 5, 250.0);
+ IgnoranceAnnotationStructure.Crossover crossover = new IgnoranceAnnotationStructure.Crossover("BMW", "X6", 5, 250.0, 6000.0);
+
+ List vehicles = new ArrayList<>();
+ vehicles.add(sedan);
+ vehicles.add(crossover);
+
+ String jsonDataString = mapper.writeValueAsString(vehicles);
+
+ assertThat(jsonDataString, containsString("make"));
+ assertThat(jsonDataString, not(containsString("model")));
+ assertThat(jsonDataString, not(containsString("seatingCapacity")));
+ assertThat(jsonDataString, not(containsString("topSpeed")));
+ assertThat(jsonDataString, containsString("towingCapacity"));
+ }
+
+ @Test
+ public void givenMixIns_whenIgnoringProperties_thenCorrect() throws JsonProcessingException {
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.addMixIn(IgnoranceMixinOrIntrospection.Car.class, CarMixIn.class);
+
+ String jsonDataString = instantiateAndSerializeObjects(mapper);
+
+ assertThat(jsonDataString, not(containsString("make")));
+ assertThat(jsonDataString, containsString("model"));
+ assertThat(jsonDataString, containsString("seatingCapacity"));
+ assertThat(jsonDataString, not(containsString("topSpeed")));
+ assertThat(jsonDataString, containsString("towingCapacity"));
+ }
+
+ @Test
+ public void givenIntrospection_whenIgnoringProperties_thenCorrect() throws JsonProcessingException {
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.setAnnotationIntrospector(new IgnoranceIntrospector());
+
+ String jsonDataString = instantiateAndSerializeObjects(mapper);
+
+ assertThat(jsonDataString, containsString("make"));
+ assertThat(jsonDataString, not(containsString("model")));
+ assertThat(jsonDataString, not(containsString("seatingCapacity")));
+ assertThat(jsonDataString, not(containsString("topSpeed")));
+ assertThat(jsonDataString, not(containsString("towingCapacity")));
+ }
+
+ private String instantiateAndSerializeObjects(ObjectMapper mapper) throws JsonProcessingException {
+ IgnoranceMixinOrIntrospection.Sedan sedan = new IgnoranceMixinOrIntrospection.Sedan("Mercedes-Benz", "S500", 5, 250.0);
+ IgnoranceMixinOrIntrospection.Crossover crossover = new IgnoranceMixinOrIntrospection.Crossover("BMW", "X6", 5, 250.0, 6000.0);
+
+ List vehicles = new ArrayList<>();
+ vehicles.add(sedan);
+ vehicles.add(crossover);
+
+ return mapper.writeValueAsString(vehicles);
+ }
+}
\ No newline at end of file
diff --git a/jackson/src/test/java/com/baeldung/jackson/inheritance/SubTypeConstructorStructure.java b/jackson/src/test/java/com/baeldung/jackson/inheritance/SubTypeConstructorStructure.java
new file mode 100644
index 0000000000..8a8db8ae47
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/inheritance/SubTypeConstructorStructure.java
@@ -0,0 +1,92 @@
+package com.baeldung.jackson.inheritance;
+
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class SubTypeConstructorStructure {
+ public static class Fleet {
+ private List vehicles;
+
+ public List getVehicles() {
+ return vehicles;
+ }
+
+ public void setVehicles(List vehicles) {
+ this.vehicles = vehicles;
+ }
+ }
+
+ public static abstract class Vehicle {
+ private String make;
+ private String model;
+
+ protected Vehicle(String make, String model) {
+ this.make = make;
+ this.model = model;
+ }
+
+ public String getMake() {
+ return make;
+ }
+
+ public void setMake(String make) {
+ this.make = make;
+ }
+
+ public String getModel() {
+ return model;
+ }
+
+ public void setModel(String model) {
+ this.model = model;
+ }
+ }
+
+ public static class Car extends Vehicle {
+ private int seatingCapacity;
+ private double topSpeed;
+
+ @JsonCreator
+ public Car(@JsonProperty("make") String make, @JsonProperty("model") String model, @JsonProperty("seating") int seatingCapacity, @JsonProperty("topSpeed") double topSpeed) {
+ super(make, model);
+ this.seatingCapacity = seatingCapacity;
+ this.topSpeed = topSpeed;
+ }
+
+ public int getSeatingCapacity() {
+ return seatingCapacity;
+ }
+
+ public void setSeatingCapacity(int seatingCapacity) {
+ this.seatingCapacity = seatingCapacity;
+ }
+
+ public double getTopSpeed() {
+ return topSpeed;
+ }
+
+ public void setTopSpeed(double topSpeed) {
+ this.topSpeed = topSpeed;
+ }
+ }
+
+ public static class Truck extends Vehicle {
+ private double payloadCapacity;
+
+ @JsonCreator
+ public Truck(@JsonProperty("make") String make, @JsonProperty("model") String model, @JsonProperty("payload") double payloadCapacity) {
+ super(make, model);
+ this.payloadCapacity = payloadCapacity;
+ }
+
+ public double getPayloadCapacity() {
+ return payloadCapacity;
+ }
+
+ public void setPayloadCapacity(double payloadCapacity) {
+ this.payloadCapacity = payloadCapacity;
+ }
+ }
+}
\ No newline at end of file
diff --git a/jackson/src/test/java/com/baeldung/jackson/inheritance/SubTypeConversionStructure.java b/jackson/src/test/java/com/baeldung/jackson/inheritance/SubTypeConversionStructure.java
new file mode 100644
index 0000000000..346fd65eef
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/inheritance/SubTypeConversionStructure.java
@@ -0,0 +1,87 @@
+package com.baeldung.jackson.inheritance;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+public class SubTypeConversionStructure {
+ public static abstract class Vehicle {
+ private String make;
+ private String model;
+
+ protected Vehicle() {
+ }
+
+ protected Vehicle(String make, String model) {
+ this.make = make;
+ this.model = model;
+ }
+
+ public String getMake() {
+ return make;
+ }
+
+ public void setMake(String make) {
+ this.make = make;
+ }
+
+ public String getModel() {
+ return model;
+ }
+
+ public void setModel(String model) {
+ this.model = model;
+ }
+ }
+
+ public static class Car extends Vehicle {
+ @JsonIgnore
+ private int seatingCapacity;
+ @JsonIgnore
+ private double topSpeed;
+
+ public Car() {
+ }
+
+ public Car(String make, String model, int seatingCapacity, double topSpeed) {
+ super(make, model);
+ this.seatingCapacity = seatingCapacity;
+ this.topSpeed = topSpeed;
+ }
+
+ public int getSeatingCapacity() {
+ return seatingCapacity;
+ }
+
+ public void setSeatingCapacity(int seatingCapacity) {
+ this.seatingCapacity = seatingCapacity;
+ }
+
+ public double getTopSpeed() {
+ return topSpeed;
+ }
+
+ public void setTopSpeed(double topSpeed) {
+ this.topSpeed = topSpeed;
+ }
+ }
+
+ public static class Truck extends Vehicle {
+ @JsonIgnore
+ private double payloadCapacity;
+
+ public Truck() {
+ }
+
+ public Truck(String make, String model, double payloadCapacity) {
+ super(make, model);
+ this.payloadCapacity = payloadCapacity;
+ }
+
+ public double getPayloadCapacity() {
+ return payloadCapacity;
+ }
+
+ public void setPayloadCapacity(double payloadCapacity) {
+ this.payloadCapacity = payloadCapacity;
+ }
+ }
+}
\ No newline at end of file
diff --git a/jackson/src/test/java/com/baeldung/jackson/inheritance/SubTypeHandlingTest.java b/jackson/src/test/java/com/baeldung/jackson/inheritance/SubTypeHandlingTest.java
new file mode 100644
index 0000000000..2d4c8fe698
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/inheritance/SubTypeHandlingTest.java
@@ -0,0 +1,43 @@
+package com.baeldung.jackson.inheritance;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.io.IOException;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class SubTypeHandlingTest {
+ @Test
+ public void givenSubTypes_whenConvertingObjects_thenDataValuesArePreserved() {
+ ObjectMapper mapper = new ObjectMapper();
+
+ SubTypeConversionStructure.Car car = new SubTypeConversionStructure.Car("Mercedes-Benz", "S500", 5, 250.0);
+ SubTypeConversionStructure.Truck truck = mapper.convertValue(car, SubTypeConversionStructure.Truck.class);
+
+ assertEquals("Mercedes-Benz", truck.getMake());
+ assertEquals("S500", truck.getModel());
+ }
+
+ @Test
+ public void givenSubType_whenNotUsingNoArgsConstructors_thenSucceed() throws IOException{
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.enableDefaultTyping();
+
+ SubTypeConstructorStructure.Car car = new SubTypeConstructorStructure.Car("Mercedes-Benz", "S500", 5, 250.0);
+ SubTypeConstructorStructure.Truck truck = new SubTypeConstructorStructure.Truck("Isuzu", "NQR", 7500.0);
+
+ List vehicles = new ArrayList<>();
+ vehicles.add(car);
+ vehicles.add(truck);
+
+ SubTypeConstructorStructure.Fleet serializedFleet = new SubTypeConstructorStructure.Fleet();
+ serializedFleet.setVehicles(vehicles);
+
+ String jsonDataString = mapper.writeValueAsString(serializedFleet);
+ mapper.readValue(jsonDataString, SubTypeConstructorStructure.Fleet.class);
+ }
+}
\ No newline at end of file
diff --git a/jackson/src/test/java/com/baeldung/jackson/inheritance/TypeInfoAnnotatedStructure.java b/jackson/src/test/java/com/baeldung/jackson/inheritance/TypeInfoAnnotatedStructure.java
new file mode 100644
index 0000000000..cb552a7b80
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/inheritance/TypeInfoAnnotatedStructure.java
@@ -0,0 +1,102 @@
+package com.baeldung.jackson.inheritance;
+
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
+
+public class TypeInfoAnnotatedStructure {
+ public static class Fleet {
+ private List vehicles;
+
+ public List getVehicles() {
+ return vehicles;
+ }
+
+ public void setVehicles(List vehicles) {
+ this.vehicles = vehicles;
+ }
+ }
+
+ @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
+ @JsonSubTypes({ @Type(value = Car.class, name = "car"), @Type(value = Truck.class, name = "truck") })
+ public static abstract class Vehicle {
+ private String make;
+ private String model;
+
+ protected Vehicle() {
+ }
+
+ protected Vehicle(String make, String model) {
+ this.make = make;
+ this.model = model;
+ }
+
+ public String getMake() {
+ return make;
+ }
+
+ public void setMake(String make) {
+ this.make = make;
+ }
+
+ public String getModel() {
+ return model;
+ }
+
+ public void setModel(String model) {
+ this.model = model;
+ }
+ }
+
+ public static class Car extends Vehicle {
+ private int seatingCapacity;
+ private double topSpeed;
+
+ public Car() {
+ }
+
+ public Car(String make, String model, int seatingCapacity, double topSpeed) {
+ super(make, model);
+ this.seatingCapacity = seatingCapacity;
+ this.topSpeed = topSpeed;
+ }
+
+ public int getSeatingCapacity() {
+ return seatingCapacity;
+ }
+
+ public void setSeatingCapacity(int seatingCapacity) {
+ this.seatingCapacity = seatingCapacity;
+ }
+
+ public double getTopSpeed() {
+ return topSpeed;
+ }
+
+ public void setTopSpeed(double topSpeed) {
+ this.topSpeed = topSpeed;
+ }
+ }
+
+ public static class Truck extends Vehicle {
+ private double payloadCapacity;
+
+ public Truck() {
+ }
+
+ public Truck(String make, String model, double payloadCapacity) {
+ super(make, model);
+ this.payloadCapacity = payloadCapacity;
+ }
+
+ public double getPayloadCapacity() {
+ return payloadCapacity;
+ }
+
+ public void setPayloadCapacity(double payloadCapacity) {
+ this.payloadCapacity = payloadCapacity;
+ }
+ }
+}
\ No newline at end of file
diff --git a/jackson/src/test/java/com/baeldung/jackson/inheritance/TypeInfoInclusionTest.java b/jackson/src/test/java/com/baeldung/jackson/inheritance/TypeInfoInclusionTest.java
new file mode 100644
index 0000000000..aefbc172d0
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/inheritance/TypeInfoInclusionTest.java
@@ -0,0 +1,57 @@
+package com.baeldung.jackson.inheritance;
+
+import static org.junit.Assert.assertThat;
+import static org.hamcrest.CoreMatchers.instanceOf;
+
+import org.junit.Test;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.io.IOException;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class TypeInfoInclusionTest {
+ @Test
+ public void givenTypeInfo_whenAnnotatingGlobally_thenTypesAreCorrectlyRecovered() throws IOException {
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.enableDefaultTyping();
+
+ TypeInfoStructure.Car car = new TypeInfoStructure.Car("Mercedes-Benz", "S500", 5, 250.0);
+ TypeInfoStructure.Truck truck = new TypeInfoStructure.Truck("Isuzu", "NQR", 7500.0);
+
+ List vehicles = new ArrayList<>();
+ vehicles.add(car);
+ vehicles.add(truck);
+
+ TypeInfoStructure.Fleet serializedFleet = new TypeInfoStructure.Fleet();
+ serializedFleet.setVehicles(vehicles);
+
+ String jsonDataString = mapper.writeValueAsString(serializedFleet);
+ TypeInfoStructure.Fleet deserializedFleet = mapper.readValue(jsonDataString, TypeInfoStructure.Fleet.class);
+
+ assertThat(deserializedFleet.getVehicles().get(0), instanceOf(TypeInfoStructure.Car.class));
+ assertThat(deserializedFleet.getVehicles().get(1), instanceOf(TypeInfoStructure.Truck.class));
+ }
+
+ @Test
+ public void givenTypeInfo_whenAnnotatingPerClass_thenTypesAreCorrectlyRecovered() throws IOException {
+ ObjectMapper mapper = new ObjectMapper();
+
+ TypeInfoAnnotatedStructure.Car car = new TypeInfoAnnotatedStructure.Car("Mercedes-Benz", "S500", 5, 250.0);
+ TypeInfoAnnotatedStructure.Truck truck = new TypeInfoAnnotatedStructure.Truck("Isuzu", "NQR", 7500.0);
+
+ List vehicles = new ArrayList<>();
+ vehicles.add(car);
+ vehicles.add(truck);
+
+ TypeInfoAnnotatedStructure.Fleet serializedFleet = new TypeInfoAnnotatedStructure.Fleet();
+ serializedFleet.setVehicles(vehicles);
+
+ String jsonDataString = mapper.writeValueAsString(serializedFleet);
+ TypeInfoAnnotatedStructure.Fleet deserializedFleet = mapper.readValue(jsonDataString, TypeInfoAnnotatedStructure.Fleet.class);
+
+ assertThat(deserializedFleet.getVehicles().get(0), instanceOf(TypeInfoAnnotatedStructure.Car.class));
+ assertThat(deserializedFleet.getVehicles().get(1), instanceOf(TypeInfoAnnotatedStructure.Truck.class));
+ }
+}
\ No newline at end of file
diff --git a/jackson/src/test/java/com/baeldung/jackson/inheritance/TypeInfoStructure.java b/jackson/src/test/java/com/baeldung/jackson/inheritance/TypeInfoStructure.java
new file mode 100644
index 0000000000..5c5186dfcc
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/inheritance/TypeInfoStructure.java
@@ -0,0 +1,96 @@
+package com.baeldung.jackson.inheritance;
+
+import java.util.List;
+
+public class TypeInfoStructure {
+ public static class Fleet {
+ private List vehicles;
+
+ public List getVehicles() {
+ return vehicles;
+ }
+
+ public void setVehicles(List vehicles) {
+ this.vehicles = vehicles;
+ }
+ }
+
+ public static abstract class Vehicle {
+ private String make;
+ private String model;
+
+ protected Vehicle() {
+ }
+
+ protected Vehicle(String make, String model) {
+ this.make = make;
+ this.model = model;
+ }
+
+ public String getMake() {
+ return make;
+ }
+
+ public void setMake(String make) {
+ this.make = make;
+ }
+
+ public String getModel() {
+ return model;
+ }
+
+ public void setModel(String model) {
+ this.model = model;
+ }
+ }
+
+ public static class Car extends Vehicle {
+ private int seatingCapacity;
+ private double topSpeed;
+
+ public Car() {
+ }
+
+ public Car(String make, String model, int seatingCapacity, double topSpeed) {
+ super(make, model);
+ this.seatingCapacity = seatingCapacity;
+ this.topSpeed = topSpeed;
+ }
+
+ public int getSeatingCapacity() {
+ return seatingCapacity;
+ }
+
+ public void setSeatingCapacity(int seatingCapacity) {
+ this.seatingCapacity = seatingCapacity;
+ }
+
+ public double getTopSpeed() {
+ return topSpeed;
+ }
+
+ public void setTopSpeed(double topSpeed) {
+ this.topSpeed = topSpeed;
+ }
+ }
+
+ public static class Truck extends Vehicle {
+ private double payloadCapacity;
+
+ public Truck() {
+ }
+
+ public Truck(String make, String model, double payloadCapacity) {
+ super(make, model);
+ this.payloadCapacity = payloadCapacity;
+ }
+
+ public double getPayloadCapacity() {
+ return payloadCapacity;
+ }
+
+ public void setPayloadCapacity(double payloadCapacity) {
+ this.payloadCapacity = payloadCapacity;
+ }
+ }
+}
\ No newline at end of file
diff --git a/jackson/src/test/java/org/baeldung/jackson/jsonview/Item.java b/jackson/src/test/java/com/baeldung/jackson/jsonview/Item.java
similarity index 94%
rename from jackson/src/test/java/org/baeldung/jackson/jsonview/Item.java
rename to jackson/src/test/java/com/baeldung/jackson/jsonview/Item.java
index 5705f810af..26d20d4847 100644
--- a/jackson/src/test/java/org/baeldung/jackson/jsonview/Item.java
+++ b/jackson/src/test/java/com/baeldung/jackson/jsonview/Item.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.jsonview;
+package com.baeldung.jackson.jsonview;
import com.fasterxml.jackson.annotation.JsonView;
diff --git a/jackson/src/test/java/org/baeldung/jackson/jsonview/MyBeanSerializerModifier.java b/jackson/src/test/java/com/baeldung/jackson/jsonview/MyBeanSerializerModifier.java
similarity index 95%
rename from jackson/src/test/java/org/baeldung/jackson/jsonview/MyBeanSerializerModifier.java
rename to jackson/src/test/java/com/baeldung/jackson/jsonview/MyBeanSerializerModifier.java
index 0986e5ea76..3b94c13d8b 100644
--- a/jackson/src/test/java/org/baeldung/jackson/jsonview/MyBeanSerializerModifier.java
+++ b/jackson/src/test/java/com/baeldung/jackson/jsonview/MyBeanSerializerModifier.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.jsonview;
+package com.baeldung.jackson.jsonview;
import java.util.List;
diff --git a/jackson/src/test/java/org/baeldung/jackson/jsonview/UpperCasingWriter.java b/jackson/src/test/java/com/baeldung/jackson/jsonview/UpperCasingWriter.java
similarity index 94%
rename from jackson/src/test/java/org/baeldung/jackson/jsonview/UpperCasingWriter.java
rename to jackson/src/test/java/com/baeldung/jackson/jsonview/UpperCasingWriter.java
index 948fb36cda..3a69d66a05 100644
--- a/jackson/src/test/java/org/baeldung/jackson/jsonview/UpperCasingWriter.java
+++ b/jackson/src/test/java/com/baeldung/jackson/jsonview/UpperCasingWriter.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.jsonview;
+package com.baeldung.jackson.jsonview;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
diff --git a/jackson/src/test/java/org/baeldung/jackson/jsonview/User.java b/jackson/src/test/java/com/baeldung/jackson/jsonview/User.java
similarity index 91%
rename from jackson/src/test/java/org/baeldung/jackson/jsonview/User.java
rename to jackson/src/test/java/com/baeldung/jackson/jsonview/User.java
index 5850dcbe84..48353fe4e4 100644
--- a/jackson/src/test/java/org/baeldung/jackson/jsonview/User.java
+++ b/jackson/src/test/java/com/baeldung/jackson/jsonview/User.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.jsonview;
+package com.baeldung.jackson.jsonview;
import com.fasterxml.jackson.annotation.JsonView;
diff --git a/jackson/src/test/java/org/baeldung/jackson/jsonview/Views.java b/jackson/src/test/java/com/baeldung/jackson/jsonview/Views.java
similarity index 75%
rename from jackson/src/test/java/org/baeldung/jackson/jsonview/Views.java
rename to jackson/src/test/java/com/baeldung/jackson/jsonview/Views.java
index 0a430ad123..65950b7f9f 100644
--- a/jackson/src/test/java/org/baeldung/jackson/jsonview/Views.java
+++ b/jackson/src/test/java/com/baeldung/jackson/jsonview/Views.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.jsonview;
+package com.baeldung.jackson.jsonview;
public class Views {
public static class Public {
diff --git a/jackson/src/test/java/org/baeldung/jackson/node/ExampleStructure.java b/jackson/src/test/java/com/baeldung/jackson/node/ExampleStructure.java
similarity index 93%
rename from jackson/src/test/java/org/baeldung/jackson/node/ExampleStructure.java
rename to jackson/src/test/java/com/baeldung/jackson/node/ExampleStructure.java
index 0eb15f3bb8..14f9024d0b 100644
--- a/jackson/src/test/java/org/baeldung/jackson/node/ExampleStructure.java
+++ b/jackson/src/test/java/com/baeldung/jackson/node/ExampleStructure.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.node;
+package com.baeldung.jackson.node;
import java.io.IOException;
import java.io.InputStream;
diff --git a/jackson/src/test/java/org/baeldung/jackson/node/NodeBean.java b/jackson/src/test/java/com/baeldung/jackson/node/NodeBean.java
similarity index 92%
rename from jackson/src/test/java/org/baeldung/jackson/node/NodeBean.java
rename to jackson/src/test/java/com/baeldung/jackson/node/NodeBean.java
index 7d54a6140e..da5ffece51 100644
--- a/jackson/src/test/java/org/baeldung/jackson/node/NodeBean.java
+++ b/jackson/src/test/java/com/baeldung/jackson/node/NodeBean.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.node;
+package com.baeldung.jackson.node;
public class NodeBean {
private int id;
diff --git a/jackson/src/test/java/org/baeldung/jackson/node/NodeOperationTest.java b/jackson/src/test/java/com/baeldung/jackson/node/NodeOperationTest.java
similarity index 99%
rename from jackson/src/test/java/org/baeldung/jackson/node/NodeOperationTest.java
rename to jackson/src/test/java/com/baeldung/jackson/node/NodeOperationTest.java
index c1398b2165..2fcb828613 100644
--- a/jackson/src/test/java/org/baeldung/jackson/node/NodeOperationTest.java
+++ b/jackson/src/test/java/com/baeldung/jackson/node/NodeOperationTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.node;
+package com.baeldung.jackson.node;
import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertEquals;
diff --git a/jackson/src/test/java/org/baeldung/jackson/sandbox/JacksonPrettyPrintUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/sandbox/JacksonPrettyPrintUnitTest.java
similarity index 97%
rename from jackson/src/test/java/org/baeldung/jackson/sandbox/JacksonPrettyPrintUnitTest.java
rename to jackson/src/test/java/com/baeldung/jackson/sandbox/JacksonPrettyPrintUnitTest.java
index 58dcec51f6..a68af20f15 100644
--- a/jackson/src/test/java/org/baeldung/jackson/sandbox/JacksonPrettyPrintUnitTest.java
+++ b/jackson/src/test/java/com/baeldung/jackson/sandbox/JacksonPrettyPrintUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.sandbox;
+package com.baeldung.jackson.sandbox;
import java.io.File;
import java.io.IOException;
diff --git a/jackson/src/test/java/org/baeldung/jackson/sandbox/SandboxTest.java b/jackson/src/test/java/com/baeldung/jackson/sandbox/SandboxTest.java
similarity index 96%
rename from jackson/src/test/java/org/baeldung/jackson/sandbox/SandboxTest.java
rename to jackson/src/test/java/com/baeldung/jackson/sandbox/SandboxTest.java
index 19491377e8..958a7eec98 100644
--- a/jackson/src/test/java/org/baeldung/jackson/sandbox/SandboxTest.java
+++ b/jackson/src/test/java/com/baeldung/jackson/sandbox/SandboxTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.sandbox;
+package com.baeldung.jackson.sandbox;
import java.io.IOException;
diff --git a/jackson/src/test/java/org/baeldung/jackson/sandbox/TestElement.java b/jackson/src/test/java/com/baeldung/jackson/sandbox/TestElement.java
similarity index 88%
rename from jackson/src/test/java/org/baeldung/jackson/sandbox/TestElement.java
rename to jackson/src/test/java/com/baeldung/jackson/sandbox/TestElement.java
index 3b6a852b6b..82f53fcf4a 100644
--- a/jackson/src/test/java/org/baeldung/jackson/sandbox/TestElement.java
+++ b/jackson/src/test/java/com/baeldung/jackson/sandbox/TestElement.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.sandbox;
+package com.baeldung.jackson.sandbox;
public class TestElement {
diff --git a/jackson/src/test/java/org/baeldung/jackson/serialization/ItemSerializer.java b/jackson/src/test/java/com/baeldung/jackson/serialization/ItemSerializer.java
similarity index 89%
rename from jackson/src/test/java/org/baeldung/jackson/serialization/ItemSerializer.java
rename to jackson/src/test/java/com/baeldung/jackson/serialization/ItemSerializer.java
index 7a1362a416..cb93f9cb03 100644
--- a/jackson/src/test/java/org/baeldung/jackson/serialization/ItemSerializer.java
+++ b/jackson/src/test/java/com/baeldung/jackson/serialization/ItemSerializer.java
@@ -1,8 +1,8 @@
-package org.baeldung.jackson.serialization;
+package com.baeldung.jackson.serialization;
import java.io.IOException;
-import org.baeldung.jackson.dtos.Item;
+import com.baeldung.jackson.dtos.Item;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
diff --git a/jackson/src/test/java/org/baeldung/jackson/serialization/ItemSerializerOnClass.java b/jackson/src/test/java/com/baeldung/jackson/serialization/ItemSerializerOnClass.java
similarity index 88%
rename from jackson/src/test/java/org/baeldung/jackson/serialization/ItemSerializerOnClass.java
rename to jackson/src/test/java/com/baeldung/jackson/serialization/ItemSerializerOnClass.java
index 44060cabb9..79b450d7f1 100644
--- a/jackson/src/test/java/org/baeldung/jackson/serialization/ItemSerializerOnClass.java
+++ b/jackson/src/test/java/com/baeldung/jackson/serialization/ItemSerializerOnClass.java
@@ -1,8 +1,8 @@
-package org.baeldung.jackson.serialization;
+package com.baeldung.jackson.serialization;
import java.io.IOException;
-import org.baeldung.jackson.dtos.ItemWithSerializer;
+import com.baeldung.jackson.dtos.ItemWithSerializer;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
diff --git a/jackson/src/test/java/org/baeldung/jackson/serialization/MyDtoNullKeySerializer.java b/jackson/src/test/java/com/baeldung/jackson/serialization/MyDtoNullKeySerializer.java
similarity index 89%
rename from jackson/src/test/java/org/baeldung/jackson/serialization/MyDtoNullKeySerializer.java
rename to jackson/src/test/java/com/baeldung/jackson/serialization/MyDtoNullKeySerializer.java
index 8219abaddf..e915378498 100644
--- a/jackson/src/test/java/org/baeldung/jackson/serialization/MyDtoNullKeySerializer.java
+++ b/jackson/src/test/java/com/baeldung/jackson/serialization/MyDtoNullKeySerializer.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.serialization;
+package com.baeldung.jackson.serialization;
import java.io.IOException;
diff --git a/jackson/src/test/java/org/baeldung/jackson/test/JacksonAnnotationTest.java b/jackson/src/test/java/com/baeldung/jackson/test/JacksonAnnotationTest.java
similarity index 90%
rename from jackson/src/test/java/org/baeldung/jackson/test/JacksonAnnotationTest.java
rename to jackson/src/test/java/com/baeldung/jackson/test/JacksonAnnotationTest.java
index c188e9bce1..74fbd021a0 100644
--- a/jackson/src/test/java/org/baeldung/jackson/test/JacksonAnnotationTest.java
+++ b/jackson/src/test/java/com/baeldung/jackson/test/JacksonAnnotationTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.test;
+package com.baeldung.jackson.test;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
@@ -12,31 +12,32 @@ import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
-import org.baeldung.jackson.annotation.BeanWithCreator;
-import org.baeldung.jackson.annotation.BeanWithCustomAnnotation;
-import org.baeldung.jackson.annotation.BeanWithFilter;
-import org.baeldung.jackson.annotation.BeanWithGetter;
-import org.baeldung.jackson.annotation.BeanWithIgnore;
-import org.baeldung.jackson.annotation.BeanWithInject;
-import org.baeldung.jackson.annotation.ExtendableBean;
-import org.baeldung.jackson.annotation.MyBean;
-import org.baeldung.jackson.annotation.PrivateBean;
-import org.baeldung.jackson.annotation.RawBean;
-import org.baeldung.jackson.annotation.UnwrappedUser;
-import org.baeldung.jackson.annotation.UserWithIgnoreType;
-import org.baeldung.jackson.annotation.Zoo;
-import org.baeldung.jackson.bidirection.ItemWithIdentity;
-import org.baeldung.jackson.bidirection.ItemWithRef;
-import org.baeldung.jackson.bidirection.UserWithIdentity;
-import org.baeldung.jackson.bidirection.UserWithRef;
-import org.baeldung.jackson.date.EventWithFormat;
-import org.baeldung.jackson.date.EventWithSerializer;
-import org.baeldung.jackson.dtos.MyMixInForString;
-import org.baeldung.jackson.dtos.User;
-import org.baeldung.jackson.dtos.withEnum.TypeEnumWithValue;
-import org.baeldung.jackson.exception.UserWithRoot;
-import org.baeldung.jackson.jsonview.Item;
-import org.baeldung.jackson.jsonview.Views;
+import com.baeldung.jackson.bidirection.ItemWithIdentity;
+import com.baeldung.jackson.bidirection.ItemWithRef;
+import com.baeldung.jackson.bidirection.UserWithRef;
+import com.baeldung.jackson.dtos.User;
+import com.baeldung.jackson.dtos.withEnum.TypeEnumWithValue;
+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.UserWithIdentity;
+import com.baeldung.jackson.date.EventWithFormat;
+import com.baeldung.jackson.date.EventWithSerializer;
+import com.baeldung.jackson.dtos.MyMixInForString;
+import com.baeldung.jackson.exception.UserWithRoot;
+import com.baeldung.jackson.jsonview.Item;
+import com.baeldung.jackson.jsonview.Views;
+import org.junit.Ignore;
import org.junit.Test;
import com.fasterxml.jackson.core.JsonParseException;
@@ -337,6 +338,7 @@ public class JacksonAnnotationTest {
assertThat(result, not(containsString("dateCreated")));
}
+ @Ignore("Jackson 2.7.1-1 seems to have changed the API regarding mixins")
@Test
public void whenSerializingUsingMixInAnnotation_thenCorrect() throws JsonProcessingException {
final User user = new User(1, "John");
@@ -345,7 +347,7 @@ public class JacksonAnnotationTest {
assertThat(result, containsString("John"));
final ObjectMapper mapper = new ObjectMapper();
- mapper.addMixInAnnotations(String.class, MyMixInForString.class);
+ mapper.addMixIn(String.class, MyMixInForString.class);
result = mapper.writeValueAsString(user);
assertThat(result, not(containsString("John")));
diff --git a/jackson/src/test/java/org/baeldung/jackson/test/JacksonBidirectionRelationTest.java b/jackson/src/test/java/com/baeldung/jackson/test/JacksonBidirectionRelationTest.java
similarity index 87%
rename from jackson/src/test/java/org/baeldung/jackson/test/JacksonBidirectionRelationTest.java
rename to jackson/src/test/java/com/baeldung/jackson/test/JacksonBidirectionRelationTest.java
index f7f687da96..971b40406a 100644
--- a/jackson/src/test/java/org/baeldung/jackson/test/JacksonBidirectionRelationTest.java
+++ b/jackson/src/test/java/com/baeldung/jackson/test/JacksonBidirectionRelationTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.test;
+package com.baeldung.jackson.test;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.not;
@@ -7,19 +7,19 @@ import static org.junit.Assert.assertThat;
import java.io.IOException;
-import org.baeldung.jackson.bidirection.Item;
-import org.baeldung.jackson.bidirection.ItemWithIdentity;
-import org.baeldung.jackson.bidirection.ItemWithIgnore;
-import org.baeldung.jackson.bidirection.ItemWithRef;
-import org.baeldung.jackson.bidirection.ItemWithSerializer;
-import org.baeldung.jackson.bidirection.ItemWithView;
-import org.baeldung.jackson.bidirection.User;
-import org.baeldung.jackson.bidirection.UserWithIdentity;
-import org.baeldung.jackson.bidirection.UserWithIgnore;
-import org.baeldung.jackson.bidirection.UserWithRef;
-import org.baeldung.jackson.bidirection.UserWithSerializer;
-import org.baeldung.jackson.bidirection.UserWithView;
-import org.baeldung.jackson.jsonview.Views;
+import com.baeldung.jackson.bidirection.Item;
+import com.baeldung.jackson.bidirection.ItemWithIdentity;
+import com.baeldung.jackson.bidirection.ItemWithIgnore;
+import com.baeldung.jackson.bidirection.ItemWithRef;
+import com.baeldung.jackson.bidirection.ItemWithSerializer;
+import com.baeldung.jackson.bidirection.ItemWithView;
+import com.baeldung.jackson.bidirection.User;
+import com.baeldung.jackson.bidirection.UserWithIdentity;
+import com.baeldung.jackson.bidirection.UserWithIgnore;
+import com.baeldung.jackson.bidirection.UserWithRef;
+import com.baeldung.jackson.bidirection.UserWithSerializer;
+import com.baeldung.jackson.bidirection.UserWithView;
+import com.baeldung.jackson.jsonview.Views;
import org.junit.Test;
import com.fasterxml.jackson.core.JsonProcessingException;
diff --git a/jackson/src/test/java/org/baeldung/jackson/test/JacksonCollectionDeserializationUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/test/JacksonCollectionDeserializationUnitTest.java
similarity index 97%
rename from jackson/src/test/java/org/baeldung/jackson/test/JacksonCollectionDeserializationUnitTest.java
rename to jackson/src/test/java/com/baeldung/jackson/test/JacksonCollectionDeserializationUnitTest.java
index c3d8153546..cd166386e6 100644
--- a/jackson/src/test/java/org/baeldung/jackson/test/JacksonCollectionDeserializationUnitTest.java
+++ b/jackson/src/test/java/com/baeldung/jackson/test/JacksonCollectionDeserializationUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.test;
+package com.baeldung.jackson.test;
import static org.hamcrest.Matchers.instanceOf;
import static org.junit.Assert.assertThat;
@@ -7,7 +7,7 @@ import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.List;
-import org.baeldung.jackson.dtos.MyDto;
+import com.baeldung.jackson.dtos.MyDto;
import org.junit.Test;
import com.fasterxml.jackson.core.JsonParseException;
diff --git a/jackson/src/test/java/org/baeldung/jackson/test/JacksonDateTest.java b/jackson/src/test/java/com/baeldung/jackson/test/JacksonDateTest.java
similarity index 95%
rename from jackson/src/test/java/org/baeldung/jackson/test/JacksonDateTest.java
rename to jackson/src/test/java/com/baeldung/jackson/test/JacksonDateTest.java
index fc7f7730b8..50ec50b668 100644
--- a/jackson/src/test/java/org/baeldung/jackson/test/JacksonDateTest.java
+++ b/jackson/src/test/java/com/baeldung/jackson/test/JacksonDateTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.test;
+package com.baeldung.jackson.test;
import static org.hamcrest.Matchers.containsString;
import static org.junit.Assert.assertEquals;
@@ -11,11 +11,11 @@ import java.time.LocalDateTime;
import java.util.Date;
import java.util.TimeZone;
-import org.baeldung.jackson.date.Event;
-import org.baeldung.jackson.date.EventWithFormat;
-import org.baeldung.jackson.date.EventWithJodaTime;
-import org.baeldung.jackson.date.EventWithLocalDateTime;
-import org.baeldung.jackson.date.EventWithSerializer;
+import com.baeldung.jackson.date.EventWithLocalDateTime;
+import com.baeldung.jackson.date.Event;
+import com.baeldung.jackson.date.EventWithFormat;
+import com.baeldung.jackson.date.EventWithJodaTime;
+import com.baeldung.jackson.date.EventWithSerializer;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.junit.Test;
diff --git a/jackson/src/test/java/org/baeldung/jackson/test/JacksonDeserializationUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/test/JacksonDeserializationUnitTest.java
similarity index 96%
rename from jackson/src/test/java/org/baeldung/jackson/test/JacksonDeserializationUnitTest.java
rename to jackson/src/test/java/com/baeldung/jackson/test/JacksonDeserializationUnitTest.java
index 2ecca664a4..45d957b90b 100644
--- a/jackson/src/test/java/org/baeldung/jackson/test/JacksonDeserializationUnitTest.java
+++ b/jackson/src/test/java/com/baeldung/jackson/test/JacksonDeserializationUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.test;
+package com.baeldung.jackson.test;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.notNullValue;
@@ -7,11 +7,11 @@ import static org.junit.Assert.assertThat;
import java.io.IOException;
-import org.baeldung.jackson.deserialization.ItemDeserializer;
-import org.baeldung.jackson.dtos.Item;
-import org.baeldung.jackson.dtos.ItemWithSerializer;
-import org.baeldung.jackson.dtos.MyDto;
-import org.baeldung.jackson.dtos.ignore.MyDtoIgnoreUnknown;
+import com.baeldung.jackson.deserialization.ItemDeserializer;
+import com.baeldung.jackson.dtos.Item;
+import com.baeldung.jackson.dtos.ItemWithSerializer;
+import com.baeldung.jackson.dtos.MyDto;
+import com.baeldung.jackson.dtos.ignore.MyDtoIgnoreUnknown;
import org.junit.Test;
import com.fasterxml.jackson.core.JsonFactory;
diff --git a/jackson/src/test/java/org/baeldung/jackson/test/JacksonDynamicIgnoreTest.java b/jackson/src/test/java/com/baeldung/jackson/test/JacksonDynamicIgnoreTest.java
similarity index 93%
rename from jackson/src/test/java/org/baeldung/jackson/test/JacksonDynamicIgnoreTest.java
rename to jackson/src/test/java/com/baeldung/jackson/test/JacksonDynamicIgnoreTest.java
index d98f948dec..16a55f442a 100644
--- a/jackson/src/test/java/org/baeldung/jackson/test/JacksonDynamicIgnoreTest.java
+++ b/jackson/src/test/java/com/baeldung/jackson/test/JacksonDynamicIgnoreTest.java
@@ -1,14 +1,14 @@
-package org.baeldung.jackson.test;
+package com.baeldung.jackson.test;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
-import org.baeldung.jackson.dynamicIgnore.Address;
-import org.baeldung.jackson.dynamicIgnore.Hidable;
-import org.baeldung.jackson.dynamicIgnore.HidableSerializer;
-import org.baeldung.jackson.dynamicIgnore.Person;
+import com.baeldung.jackson.dynamicIgnore.Address;
+import com.baeldung.jackson.dynamicIgnore.HidableSerializer;
+import com.baeldung.jackson.dynamicIgnore.Person;
+import com.baeldung.jackson.dynamicIgnore.Hidable;
import org.junit.Before;
import org.junit.Test;
diff --git a/jackson/src/test/java/org/baeldung/jackson/test/JacksonExceptionsTest.java b/jackson/src/test/java/com/baeldung/jackson/test/JacksonExceptionsTest.java
similarity index 86%
rename from jackson/src/test/java/org/baeldung/jackson/test/JacksonExceptionsTest.java
rename to jackson/src/test/java/com/baeldung/jackson/test/JacksonExceptionsTest.java
index aab7f9409d..90317848ce 100644
--- a/jackson/src/test/java/org/baeldung/jackson/test/JacksonExceptionsTest.java
+++ b/jackson/src/test/java/com/baeldung/jackson/test/JacksonExceptionsTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.test;
+package com.baeldung.jackson.test;
import static org.hamcrest.Matchers.containsString;
import static org.junit.Assert.assertEquals;
@@ -7,11 +7,7 @@ import static org.junit.Assert.assertThat;
import java.io.IOException;
import java.util.List;
-import org.baeldung.jackson.dtos.User;
-import org.baeldung.jackson.exception.UserWithPrivateFields;
-import org.baeldung.jackson.exception.UserWithRoot;
-import org.baeldung.jackson.exception.Zoo;
-import org.baeldung.jackson.exception.ZooConfigured;
+import com.baeldung.jackson.exception.*;
import org.junit.Test;
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
@@ -71,7 +67,7 @@ public class JacksonExceptionsTest {
final String json = "{\"id\":1,\"name\":\"John\"}";
final ObjectMapper mapper = new ObjectMapper();
- mapper.reader().withType(org.baeldung.jackson.exception.User.class).readValue(json);
+ mapper.reader().withType(User.class).readValue(json);
}
@Test
@@ -79,7 +75,7 @@ public class JacksonExceptionsTest {
final String json = "{\"id\":1,\"name\":\"John\"}";
final ObjectMapper mapper = new ObjectMapper();
- final User user = mapper.reader().withType(User.class).readValue(json);
+ final com.baeldung.jackson.dtos.User user = mapper.reader().withType(com.baeldung.jackson.dtos.User.class).readValue(json);
assertEquals("John", user.name);
}
@@ -91,7 +87,7 @@ public class JacksonExceptionsTest {
final ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
- mapper.reader().withType(User.class).readValue(json);
+ mapper.reader().withType(com.baeldung.jackson.dtos.User.class).readValue(json);
}
@Test
@@ -111,7 +107,7 @@ public class JacksonExceptionsTest {
final String json = "[{\"id\":1,\"name\":\"John\"},{\"id\":2,\"name\":\"Adam\"}]";
final ObjectMapper mapper = new ObjectMapper();
- mapper.reader().withType(User.class).readValue(json);
+ mapper.reader().withType(com.baeldung.jackson.dtos.User.class).readValue(json);
}
@Test
@@ -119,7 +115,7 @@ public class JacksonExceptionsTest {
final String json = "[{\"id\":1,\"name\":\"John\"},{\"id\":2,\"name\":\"Adam\"}]";
final ObjectMapper mapper = new ObjectMapper();
- final List users = mapper.reader().withType(new TypeReference>() {
+ final List users = mapper.reader().withType(new TypeReference>() {
}).readValue(json);
assertEquals(2, users.size());
@@ -131,7 +127,7 @@ public class JacksonExceptionsTest {
final String json = "{\"id\":1,\"name\":\"John\", \"checked\":true}";
final ObjectMapper mapper = new ObjectMapper();
- mapper.reader().withType(User.class).readValue(json);
+ mapper.reader().withType(com.baeldung.jackson.dtos.User.class).readValue(json);
}
@Test
@@ -141,7 +137,7 @@ public class JacksonExceptionsTest {
final ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
- final User user = mapper.reader().withType(User.class).readValue(json);
+ final com.baeldung.jackson.dtos.User user = mapper.reader().withType(com.baeldung.jackson.dtos.User.class).readValue(json);
assertEquals("John", user.name);
}
@@ -151,7 +147,7 @@ public class JacksonExceptionsTest {
final String json = "{'id':1,'name':'John'}";
final ObjectMapper mapper = new ObjectMapper();
- mapper.reader().withType(User.class).readValue(json);
+ mapper.reader().withType(com.baeldung.jackson.dtos.User.class).readValue(json);
}
@Test
@@ -162,7 +158,7 @@ public class JacksonExceptionsTest {
factory.enable(JsonParser.Feature.ALLOW_SINGLE_QUOTES);
final ObjectMapper mapper = new ObjectMapper(factory);
- final User user = mapper.reader().withType(User.class).readValue(json);
+ final com.baeldung.jackson.dtos.User user = mapper.reader().withType(com.baeldung.jackson.dtos.User.class).readValue(json);
assertEquals("John", user.name);
}
diff --git a/jackson/src/test/java/org/baeldung/jackson/test/JacksonFieldUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/test/JacksonFieldUnitTest.java
similarity index 95%
rename from jackson/src/test/java/org/baeldung/jackson/test/JacksonFieldUnitTest.java
rename to jackson/src/test/java/com/baeldung/jackson/test/JacksonFieldUnitTest.java
index 53933215f5..ccc5905e88 100644
--- a/jackson/src/test/java/org/baeldung/jackson/test/JacksonFieldUnitTest.java
+++ b/jackson/src/test/java/com/baeldung/jackson/test/JacksonFieldUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.test;
+package com.baeldung.jackson.test;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.equalTo;
@@ -8,9 +8,9 @@ import static org.junit.Assert.assertThat;
import java.io.IOException;
-import org.baeldung.jackson.field.MyDtoAccessLevel;
-import org.baeldung.jackson.field.MyDtoWithSetter;
-import org.baeldung.jackson.field.MyDtoWithGetter;
+import com.baeldung.jackson.field.MyDtoAccessLevel;
+import com.baeldung.jackson.field.MyDtoWithSetter;
+import com.baeldung.jackson.field.MyDtoWithGetter;
import org.junit.Test;
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
diff --git a/jackson/src/test/java/org/baeldung/jackson/test/JacksonJsonViewTest.java b/jackson/src/test/java/com/baeldung/jackson/test/JacksonJsonViewTest.java
similarity index 92%
rename from jackson/src/test/java/org/baeldung/jackson/test/JacksonJsonViewTest.java
rename to jackson/src/test/java/com/baeldung/jackson/test/JacksonJsonViewTest.java
index 276db9261c..61fa2919ac 100644
--- a/jackson/src/test/java/org/baeldung/jackson/test/JacksonJsonViewTest.java
+++ b/jackson/src/test/java/com/baeldung/jackson/test/JacksonJsonViewTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.test;
+package com.baeldung.jackson.test;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.not;
@@ -7,10 +7,10 @@ import static org.junit.Assert.assertThat;
import java.io.IOException;
-import org.baeldung.jackson.jsonview.Item;
-import org.baeldung.jackson.jsonview.MyBeanSerializerModifier;
-import org.baeldung.jackson.jsonview.User;
-import org.baeldung.jackson.jsonview.Views;
+import com.baeldung.jackson.jsonview.Item;
+import com.baeldung.jackson.jsonview.User;
+import com.baeldung.jackson.jsonview.MyBeanSerializerModifier;
+import com.baeldung.jackson.jsonview.Views;
import org.junit.Test;
import com.fasterxml.jackson.core.JsonProcessingException;
diff --git a/jackson/src/test/java/org/baeldung/jackson/test/JacksonSerializationEnumsUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/test/JacksonSerializationEnumsUnitTest.java
similarity index 87%
rename from jackson/src/test/java/org/baeldung/jackson/test/JacksonSerializationEnumsUnitTest.java
rename to jackson/src/test/java/com/baeldung/jackson/test/JacksonSerializationEnumsUnitTest.java
index d64834078a..78c6316aa6 100644
--- a/jackson/src/test/java/org/baeldung/jackson/test/JacksonSerializationEnumsUnitTest.java
+++ b/jackson/src/test/java/com/baeldung/jackson/test/JacksonSerializationEnumsUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.test;
+package com.baeldung.jackson.test;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
@@ -6,12 +6,12 @@ import static org.junit.Assert.assertThat;
import java.io.IOException;
-import org.baeldung.jackson.dtos.withEnum.MyDtoWithEnum;
-import org.baeldung.jackson.dtos.withEnum.MyDtoWithEnumCustom;
-import org.baeldung.jackson.dtos.withEnum.TypeEnum;
-import org.baeldung.jackson.dtos.withEnum.TypeEnumSimple;
-import org.baeldung.jackson.dtos.withEnum.TypeEnumWithCustomSerializer;
-import org.baeldung.jackson.dtos.withEnum.TypeEnumWithValue;
+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.fasterxml.jackson.core.JsonParseException;
diff --git a/jackson/src/test/java/org/baeldung/jackson/test/JacksonSerializationIgnoreUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/test/JacksonSerializationIgnoreUnitTest.java
similarity index 94%
rename from jackson/src/test/java/org/baeldung/jackson/test/JacksonSerializationIgnoreUnitTest.java
rename to jackson/src/test/java/com/baeldung/jackson/test/JacksonSerializationIgnoreUnitTest.java
index 64614fb854..4c01ec9333 100644
--- a/jackson/src/test/java/org/baeldung/jackson/test/JacksonSerializationIgnoreUnitTest.java
+++ b/jackson/src/test/java/com/baeldung/jackson/test/JacksonSerializationIgnoreUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.test;
+package com.baeldung.jackson.test;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.not;
@@ -8,14 +8,15 @@ import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
-import org.baeldung.jackson.dtos.MyDto;
-import org.baeldung.jackson.dtos.MyDtoIncludeNonDefault;
-import org.baeldung.jackson.dtos.MyDtoWithFilter;
-import org.baeldung.jackson.dtos.MyMixInForString;
-import org.baeldung.jackson.dtos.ignore.MyDtoIgnoreField;
-import org.baeldung.jackson.dtos.ignore.MyDtoIgnoreFieldByName;
-import org.baeldung.jackson.dtos.ignore.MyDtoIgnoreNull;
-import org.baeldung.jackson.serialization.MyDtoNullKeySerializer;
+import com.baeldung.jackson.dtos.MyDtoIncludeNonDefault;
+import com.baeldung.jackson.dtos.MyDtoWithFilter;
+import com.baeldung.jackson.dtos.ignore.MyDtoIgnoreNull;
+import com.baeldung.jackson.dtos.MyDto;
+import com.baeldung.jackson.dtos.MyMixInForString;
+import com.baeldung.jackson.dtos.ignore.MyDtoIgnoreField;
+import com.baeldung.jackson.dtos.ignore.MyDtoIgnoreFieldByName;
+import com.baeldung.jackson.serialization.MyDtoNullKeySerializer;
+import org.junit.Ignore;
import org.junit.Test;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
@@ -84,10 +85,11 @@ public class JacksonSerializationIgnoreUnitTest {
System.out.println(dtoAsString);
}
+ @Ignore("Jackson 2.7.1-1 seems to have changed the API for this case")
@Test
public final void givenFieldTypeIsIgnored_whenDtoIsSerialized_thenCorrect() throws JsonParseException, IOException {
final ObjectMapper mapper = new ObjectMapper();
- mapper.addMixInAnnotations(String.class, MyMixInForString.class);
+ mapper.addMixIn(String.class, MyMixInForString.class);
final MyDto dtoObject = new MyDto();
dtoObject.setBooleanValue(true);
diff --git a/jackson/src/test/java/org/baeldung/jackson/test/JacksonSerializationUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/test/JacksonSerializationUnitTest.java
similarity index 92%
rename from jackson/src/test/java/org/baeldung/jackson/test/JacksonSerializationUnitTest.java
rename to jackson/src/test/java/com/baeldung/jackson/test/JacksonSerializationUnitTest.java
index 4a34f168c7..563dda9eb6 100644
--- a/jackson/src/test/java/org/baeldung/jackson/test/JacksonSerializationUnitTest.java
+++ b/jackson/src/test/java/com/baeldung/jackson/test/JacksonSerializationUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.test;
+package com.baeldung.jackson.test;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.not;
@@ -8,14 +8,14 @@ import static org.junit.Assert.assertThat;
import java.io.IOException;
import java.util.List;
-import org.baeldung.jackson.dtos.Item;
-import org.baeldung.jackson.dtos.ItemWithSerializer;
-import org.baeldung.jackson.dtos.MyDto;
-import org.baeldung.jackson.dtos.MyDtoFieldNameChanged;
-import org.baeldung.jackson.dtos.MyDtoNoAccessors;
-import org.baeldung.jackson.dtos.MyDtoNoAccessorsAndFieldVisibility;
-import org.baeldung.jackson.dtos.User;
-import org.baeldung.jackson.serialization.ItemSerializer;
+import com.baeldung.jackson.dtos.MyDtoFieldNameChanged;
+import com.baeldung.jackson.dtos.User;
+import com.baeldung.jackson.dtos.Item;
+import com.baeldung.jackson.dtos.ItemWithSerializer;
+import com.baeldung.jackson.dtos.MyDto;
+import com.baeldung.jackson.dtos.MyDtoNoAccessors;
+import com.baeldung.jackson.dtos.MyDtoNoAccessorsAndFieldVisibility;
+import com.baeldung.jackson.serialization.ItemSerializer;
import org.junit.Test;
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
diff --git a/jackson/src/test/java/org/baeldung/jackson/test/UnitTestSuite.java b/jackson/src/test/java/com/baeldung/jackson/test/UnitTestSuite.java
similarity index 78%
rename from jackson/src/test/java/org/baeldung/jackson/test/UnitTestSuite.java
rename to jackson/src/test/java/com/baeldung/jackson/test/UnitTestSuite.java
index 3bc5715e2a..d47b6e217a 100644
--- a/jackson/src/test/java/org/baeldung/jackson/test/UnitTestSuite.java
+++ b/jackson/src/test/java/com/baeldung/jackson/test/UnitTestSuite.java
@@ -1,7 +1,7 @@
-package org.baeldung.jackson.test;
+package com.baeldung.jackson.test;
-import org.baeldung.jackson.sandbox.JacksonPrettyPrintUnitTest;
-import org.baeldung.jackson.sandbox.SandboxTest;
+import com.baeldung.jackson.sandbox.JacksonPrettyPrintUnitTest;
+import com.baeldung.jackson.sandbox.SandboxTest;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
diff --git a/jackson/src/test/java/org/baeldung/jackson/try1/IEntity.java b/jackson/src/test/java/com/baeldung/jackson/try1/IEntity.java
similarity index 59%
rename from jackson/src/test/java/org/baeldung/jackson/try1/IEntity.java
rename to jackson/src/test/java/com/baeldung/jackson/try1/IEntity.java
index ce4c83729a..27e0a71c9d 100644
--- a/jackson/src/test/java/org/baeldung/jackson/try1/IEntity.java
+++ b/jackson/src/test/java/com/baeldung/jackson/try1/IEntity.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.try1;
+package com.baeldung.jackson.try1;
public interface IEntity {
public int getId();
diff --git a/jackson/src/test/java/org/baeldung/jackson/try1/JacksonDeserializationUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/try1/JacksonDeserializationUnitTest.java
similarity index 89%
rename from jackson/src/test/java/org/baeldung/jackson/try1/JacksonDeserializationUnitTest.java
rename to jackson/src/test/java/com/baeldung/jackson/try1/JacksonDeserializationUnitTest.java
index 673577cf6f..9fc195a8aa 100644
--- a/jackson/src/test/java/org/baeldung/jackson/try1/JacksonDeserializationUnitTest.java
+++ b/jackson/src/test/java/com/baeldung/jackson/try1/JacksonDeserializationUnitTest.java
@@ -1,11 +1,11 @@
-package org.baeldung.jackson.try1;
+package com.baeldung.jackson.try1;
import static org.hamcrest.Matchers.notNullValue;
import static org.junit.Assert.assertThat;
import java.io.IOException;
-import org.baeldung.jackson.dtos.ItemWithSerializer;
+import com.baeldung.jackson.dtos.ItemWithSerializer;
import org.junit.Test;
import com.fasterxml.jackson.core.JsonParseException;
diff --git a/jackson/src/test/java/org/baeldung/jackson/try1/RestLoaderRequest.java b/jackson/src/test/java/com/baeldung/jackson/try1/RestLoaderRequest.java
similarity index 96%
rename from jackson/src/test/java/org/baeldung/jackson/try1/RestLoaderRequest.java
rename to jackson/src/test/java/com/baeldung/jackson/try1/RestLoaderRequest.java
index 171f4c1e14..7ef8864a63 100644
--- a/jackson/src/test/java/org/baeldung/jackson/try1/RestLoaderRequest.java
+++ b/jackson/src/test/java/com/baeldung/jackson/try1/RestLoaderRequest.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.try1;
+package com.baeldung.jackson.try1;
import java.io.Serializable;
diff --git a/jackson/src/test/java/org/baeldung/jackson/try1/RestLoaderRequestDeserializer.java b/jackson/src/test/java/com/baeldung/jackson/try1/RestLoaderRequestDeserializer.java
similarity index 97%
rename from jackson/src/test/java/org/baeldung/jackson/try1/RestLoaderRequestDeserializer.java
rename to jackson/src/test/java/com/baeldung/jackson/try1/RestLoaderRequestDeserializer.java
index 6110e8b0e0..849607586d 100644
--- a/jackson/src/test/java/org/baeldung/jackson/try1/RestLoaderRequestDeserializer.java
+++ b/jackson/src/test/java/com/baeldung/jackson/try1/RestLoaderRequestDeserializer.java
@@ -1,4 +1,4 @@
-package org.baeldung.jackson.try1;
+package com.baeldung.jackson.try1;
import java.io.IOException;
diff --git a/javaxval/bin/pom.xml b/javaxval/bin/pom.xml
index 592f3c3431..7606f0d072 100644
--- a/javaxval/bin/pom.xml
+++ b/javaxval/bin/pom.xml
@@ -1,7 +1,7 @@
4.0.0
- org.baeldung
+ com.baeldung
javaxval
0.1-SNAPSHOT
diff --git a/javaxval/pom.xml b/javaxval/pom.xml
index 592f3c3431..493119d92e 100644
--- a/javaxval/pom.xml
+++ b/javaxval/pom.xml
@@ -1,51 +1,47 @@
-
- 4.0.0
- org.baeldung
- javaxval
- 0.1-SNAPSHOT
+
+ 4.0.0
+ com.baeldung
+ javaxval
+ 0.1-SNAPSHOT
+
-
+
+ junit
+ junit
+ 4.12
+
+
+ javax.validation
+ validation-api
+ 1.1.0.Final
+
-
- junit
- junit
- 4.12
-
+
+ org.hibernate
+ hibernate-validator
+ 5.2.1.Final
+
-
- javax.validation
- validation-api
- 1.1.0.Final
-
+
+ org.hibernate
+ hibernate-validator-annotation-processor
+ 5.2.1.Final
+
-
- org.hibernate
- hibernate-validator
- 5.2.1.Final
-
+
+ javax.el
+ javax.el-api
+ 2.2.4
+
-
- org.hibernate
- hibernate-validator-annotation-processor
- 5.2.1.Final
-
-
-
- javax.el
- javax.el-api
- 2.2.4
-
-
-
- org.glassfish.web
- javax.el
- 2.2.4
-
-
-
+
+ org.glassfish.web
+ javax.el
+ 2.2.4
+
+
\ No newline at end of file
diff --git a/jooq-spring/.classpath b/jooq-spring/.classpath
new file mode 100644
index 0000000000..9ae7bca0fc
--- /dev/null
+++ b/jooq-spring/.classpath
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/spring-data-elasticsearch/.project b/jooq-spring/.project
similarity index 94%
rename from spring-data-elasticsearch/.project
rename to jooq-spring/.project
index 09b9a781ed..a291146b79 100644
--- a/spring-data-elasticsearch/.project
+++ b/jooq-spring/.project
@@ -1,6 +1,6 @@
- spring-data-elasticsearch
+ jooq-spring
@@ -11,12 +11,12 @@
- org.eclipse.m2e.core.maven2Builder
+ org.springframework.ide.eclipse.core.springbuilder
- org.springframework.ide.eclipse.core.springbuilder
+ org.eclipse.m2e.core.maven2Builder
diff --git a/jooq-spring/pom.xml b/jooq-spring/pom.xml
new file mode 100644
index 0000000000..76198c4993
--- /dev/null
+++ b/jooq-spring/pom.xml
@@ -0,0 +1,153 @@
+
+ 4.0.0
+ com.baeldung
+ jooq-spring
+ 0.0.1-SNAPSHOT
+
+
+ 3.7.3
+ 1.4.191
+ 4.2.5.RELEASE
+ 1.7.18
+ 1.1.3
+ 4.12
+
+
+
+
+
+ org.jooq
+ jooq
+ ${org.jooq.version}
+
+
+
+
+ com.h2database
+ h2
+ ${com.h2database.version}
+
+
+
+
+ org.springframework
+ spring-context
+ ${org.springframework.version}
+
+
+ org.springframework
+ spring-jdbc
+ ${org.springframework.version}
+
+
+
+
+ org.slf4j
+ slf4j-api
+ ${org.slf4j.version}
+ runtime
+
+
+ ch.qos.logback
+ logback-classic
+ ${ch.qos.logback.version}
+ runtime
+
+
+
+
+ junit
+ junit
+ ${junit.version}
+ test
+
+
+ org.springframework
+ spring-test
+ ${org.springframework.version}
+ test
+
+
+
+
+
+
+ org.codehaus.mojo
+ properties-maven-plugin
+ 1.0.0
+
+
+ initialize
+
+ read-project-properties
+
+
+
+ src/main/resources/intro_config.properties
+
+
+
+
+
+
+
+ org.codehaus.mojo
+ sql-maven-plugin
+ 1.5
+
+
+ initialize
+
+ execute
+
+
+ ${db.driver}
+ ${db.url}
+ ${db.username}
+ ${db.password}
+
+ src/main/resources/intro_schema.sql
+
+
+
+
+
+
+ com.h2database
+ h2
+ ${com.h2database.version}
+
+
+
+
+
+ org.jooq
+ jooq-codegen-maven
+ ${org.jooq.version}
+
+
+ generate-sources
+
+ generate
+
+
+
+ ${db.driver}
+ ${db.url}
+ ${db.username}
+ ${db.password}
+
+
+
+ com.baeldung.jooq.introduction.db
+ src/main/java
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/jooq-spring/src/main/resources/intro_config.properties b/jooq-spring/src/main/resources/intro_config.properties
new file mode 100644
index 0000000000..3275089585
--- /dev/null
+++ b/jooq-spring/src/main/resources/intro_config.properties
@@ -0,0 +1,8 @@
+#Database Configuration
+db.driver=org.h2.Driver
+db.url=jdbc:h2:~/jooq
+db.username=sa
+db.password=
+
+#SQL Dialect
+jooq.sql.dialect=H2
\ No newline at end of file
diff --git a/jooq-spring/src/main/resources/intro_schema.sql b/jooq-spring/src/main/resources/intro_schema.sql
new file mode 100644
index 0000000000..0d4bd26235
--- /dev/null
+++ b/jooq-spring/src/main/resources/intro_schema.sql
@@ -0,0 +1,34 @@
+DROP TABLE IF EXISTS author_book, author, book;
+
+CREATE TABLE author (
+ id INT NOT NULL PRIMARY KEY,
+ first_name VARCHAR(50),
+ last_name VARCHAR(50) NOT NULL
+);
+
+CREATE TABLE book (
+ id INT NOT NULL PRIMARY KEY,
+ title VARCHAR(100) NOT NULL
+);
+
+CREATE TABLE author_book (
+ author_id INT NOT NULL,
+ book_id INT NOT NULL,
+
+ PRIMARY KEY (author_id, book_id),
+ CONSTRAINT fk_ab_author FOREIGN KEY (author_id) REFERENCES author (id)
+ ON UPDATE CASCADE ON DELETE CASCADE,
+ CONSTRAINT fk_ab_book FOREIGN KEY (book_id) REFERENCES book (id)
+);
+
+INSERT INTO author VALUES
+ (1, 'Kathy', 'Sierra'),
+ (2, 'Bert', 'Bates'),
+ (3, 'Bryan', 'Basham');
+
+INSERT INTO book VALUES
+ (1, 'Head First Java'),
+ (2, 'Head First Servlets and JSP'),
+ (3, 'OCA/OCP Java SE 7 Programmer');
+
+INSERT INTO author_book VALUES (1, 1), (1, 3), (2, 1);
\ No newline at end of file
diff --git a/jooq-spring/src/test/java/com/baeldung/jooq/introduction/ExceptionTranslator.java b/jooq-spring/src/test/java/com/baeldung/jooq/introduction/ExceptionTranslator.java
new file mode 100644
index 0000000000..7bee21f077
--- /dev/null
+++ b/jooq-spring/src/test/java/com/baeldung/jooq/introduction/ExceptionTranslator.java
@@ -0,0 +1,19 @@
+package com.baeldung.jooq.introduction;
+
+import org.jooq.ExecuteContext;
+import org.jooq.SQLDialect;
+import org.jooq.impl.DefaultExecuteListener;
+
+import org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator;
+import org.springframework.jdbc.support.SQLExceptionTranslator;
+
+public class ExceptionTranslator extends DefaultExecuteListener {
+ private static final long serialVersionUID = 649359748808106775L;
+
+ @Override
+ public void exception(ExecuteContext context) {
+ SQLDialect dialect = context.configuration().dialect();
+ SQLExceptionTranslator translator = new SQLErrorCodeSQLExceptionTranslator(dialect.name());
+ context.exception(translator.translate("Access database using jOOQ", context.sql(), context.sqlException()));
+ }
+}
\ No newline at end of file
diff --git a/jooq-spring/src/test/java/com/baeldung/jooq/introduction/PersistenceContext.java b/jooq-spring/src/test/java/com/baeldung/jooq/introduction/PersistenceContext.java
new file mode 100644
index 0000000000..ee34c00679
--- /dev/null
+++ b/jooq-spring/src/test/java/com/baeldung/jooq/introduction/PersistenceContext.java
@@ -0,0 +1,76 @@
+package com.baeldung.jooq.introduction;
+
+import javax.sql.DataSource;
+import org.h2.jdbcx.JdbcDataSource;
+import org.jooq.SQLDialect;
+import org.jooq.impl.DataSourceConnectionProvider;
+import org.jooq.impl.DefaultConfiguration;
+import org.jooq.impl.DefaultDSLContext;
+import org.jooq.impl.DefaultExecuteListenerProvider;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.core.env.Environment;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+@Configuration
+@ComponentScan({ "com.baeldung.jooq.introduction.db.public_.tables" })
+@EnableTransactionManagement
+@PropertySource("classpath:intro_config.properties")
+public class PersistenceContext {
+ @Autowired
+ private Environment environment;
+
+ @Bean
+ public DataSource dataSource() {
+ JdbcDataSource dataSource = new JdbcDataSource();
+
+ dataSource.setUrl(environment.getRequiredProperty("db.url"));
+ dataSource.setUser(environment.getRequiredProperty("db.username"));
+ dataSource.setPassword(environment.getRequiredProperty("db.password"));
+
+ return dataSource;
+ }
+
+ @Bean
+ public TransactionAwareDataSourceProxy transactionAwareDataSource() {
+ return new TransactionAwareDataSourceProxy(dataSource());
+ }
+
+ @Bean
+ public DataSourceTransactionManager transactionManager() {
+ return new DataSourceTransactionManager(dataSource());
+ }
+
+ @Bean
+ public DataSourceConnectionProvider connectionProvider() {
+ return new DataSourceConnectionProvider(transactionAwareDataSource());
+ }
+
+ @Bean
+ public ExceptionTranslator exceptionTransformer() {
+ return new ExceptionTranslator();
+ }
+
+ @Bean
+ public DefaultDSLContext dsl() {
+ return new DefaultDSLContext(configuration());
+ }
+
+ @Bean
+ public DefaultConfiguration configuration() {
+ DefaultConfiguration jooqConfiguration = new DefaultConfiguration();
+ jooqConfiguration.set(connectionProvider());
+ jooqConfiguration.set(new DefaultExecuteListenerProvider(exceptionTransformer()));
+
+ String sqlDialectName = environment.getRequiredProperty("jooq.sql.dialect");
+ SQLDialect dialect = SQLDialect.valueOf(sqlDialectName);
+ jooqConfiguration.set(dialect);
+
+ return jooqConfiguration;
+ }
+}
\ No newline at end of file
diff --git a/jooq-spring/src/test/java/com/baeldung/jooq/introduction/QueryTest.java b/jooq-spring/src/test/java/com/baeldung/jooq/introduction/QueryTest.java
new file mode 100644
index 0000000000..bc12dff5a0
--- /dev/null
+++ b/jooq-spring/src/test/java/com/baeldung/jooq/introduction/QueryTest.java
@@ -0,0 +1,85 @@
+package com.baeldung.jooq.introduction;
+
+import com.baeldung.jooq.introduction.db.public_.tables.Author;
+import com.baeldung.jooq.introduction.db.public_.tables.AuthorBook;
+import com.baeldung.jooq.introduction.db.public_.tables.Book;
+import org.jooq.DSLContext;
+import org.jooq.Record3;
+import org.jooq.Result;
+import org.jooq.impl.DSL;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.DataAccessException;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.transaction.annotation.Transactional;
+
+import static org.junit.Assert.assertEquals;
+
+@ContextConfiguration(classes = PersistenceContext.class)
+@Transactional(transactionManager = "transactionManager")
+@RunWith(SpringJUnit4ClassRunner.class)
+public class QueryTest {
+
+ @Autowired
+ private DSLContext dsl;
+
+ Author author = Author.AUTHOR;
+ Book book = Book.BOOK;
+ AuthorBook authorBook = AuthorBook.AUTHOR_BOOK;
+
+ @Test
+ public void givenValidData_whenInserting_thenSucceed() {
+ dsl.insertInto(author).set(author.ID, 4).set(author.FIRST_NAME, "Herbert").set(author.LAST_NAME, "Schildt").execute();
+ dsl.insertInto(book).set(book.ID, 4).set(book.TITLE, "A Beginner's Guide").execute();
+ dsl.insertInto(authorBook).set(authorBook.AUTHOR_ID, 4).set(authorBook.BOOK_ID, 4).execute();
+ Result> result = dsl.select(author.ID, author.LAST_NAME, DSL.count()).from(author).join(authorBook).on(author.ID.equal(authorBook.AUTHOR_ID)).join(book).on(authorBook.BOOK_ID.equal(book.ID))
+ .groupBy(author.LAST_NAME).fetch();
+
+ assertEquals(3, result.size());
+ assertEquals("Sierra", result.getValue(0, author.LAST_NAME));
+ assertEquals(Integer.valueOf(2), result.getValue(0, DSL.count()));
+ assertEquals("Schildt", result.getValue(2, author.LAST_NAME));
+ assertEquals(Integer.valueOf(1), result.getValue(2, DSL.count()));
+ }
+
+ @Test(expected = DataAccessException.class)
+ public void givenInvalidData_whenInserting_thenFail() {
+ dsl.insertInto(authorBook).set(authorBook.AUTHOR_ID, 4).set(authorBook.BOOK_ID, 5).execute();
+ }
+
+ @Test
+ public void givenValidData_whenUpdating_thenSucceed() {
+ dsl.update(author).set(author.LAST_NAME, "Baeldung").where(author.ID.equal(3)).execute();
+ dsl.update(book).set(book.TITLE, "Building your REST API with Spring").where(book.ID.equal(3)).execute();
+ dsl.insertInto(authorBook).set(authorBook.AUTHOR_ID, 3).set(authorBook.BOOK_ID, 3).execute();
+ Result> result = dsl.select(author.ID, author.LAST_NAME, book.TITLE).from(author).join(authorBook).on(author.ID.equal(authorBook.AUTHOR_ID)).join(book).on(authorBook.BOOK_ID.equal(book.ID)).where(author.ID.equal(3))
+ .fetch();
+
+ assertEquals(1, result.size());
+ assertEquals(Integer.valueOf(3), result.getValue(0, author.ID));
+ assertEquals("Baeldung", result.getValue(0, author.LAST_NAME));
+ assertEquals("Building your REST API with Spring", result.getValue(0, book.TITLE));
+ }
+
+ @Test(expected = DataAccessException.class)
+ public void givenInvalidData_whenUpdating_thenFail() {
+ dsl.update(authorBook).set(authorBook.AUTHOR_ID, 4).set(authorBook.BOOK_ID, 5).execute();
+ }
+
+ @Test
+ public void givenValidData_whenDeleting_thenSucceed() {
+ dsl.delete(author).where(author.ID.lt(3)).execute();
+ Result> result = dsl.select(author.ID, author.FIRST_NAME, author.LAST_NAME).from(author).fetch();
+
+ assertEquals(1, result.size());
+ assertEquals("Bryan", result.getValue(0, author.FIRST_NAME));
+ assertEquals("Basham", result.getValue(0, author.LAST_NAME));
+ }
+
+ @Test(expected = DataAccessException.class)
+ public void givenInvalidData_whenDeleting_thenFail() {
+ dsl.delete(book).where(book.ID.equal(1)).execute();
+ }
+}
\ No newline at end of file
diff --git a/core-java-8/.classpath b/jpa-storedprocedure/.classpath
similarity index 100%
rename from core-java-8/.classpath
rename to jpa-storedprocedure/.classpath
index 5efa587d72..fae1a2b37d 100644
--- a/core-java-8/.classpath
+++ b/jpa-storedprocedure/.classpath
@@ -6,23 +6,18 @@
-
-
-
-
-
-
-
+
+
-
+
@@ -32,5 +27,10 @@
+
+
+
+
+
diff --git a/mockito/.project b/jpa-storedprocedure/.project
similarity index 84%
rename from mockito/.project
rename to jpa-storedprocedure/.project
index 1c6c0deddc..b5ac58ebd1 100644
--- a/mockito/.project
+++ b/jpa-storedprocedure/.project
@@ -1,22 +1,17 @@
- mockito
+ jpa-storedprocedure
-
- org.eclipse.jdt.core.javabuilder
-
-
-
org.eclipse.wst.common.project.facet.core.builder
- org.eclipse.wst.validation.validationbuilder
+ org.eclipse.jdt.core.javabuilder
@@ -25,10 +20,13 @@
+
+ org.eclipse.wst.validation.validationbuilder
+
+
+
- org.eclipse.jem.workbench.JavaEMFNature
- org.eclipse.wst.common.modulecore.ModuleCoreNature
org.eclipse.jdt.core.javanature
org.eclipse.m2e.core.maven2Nature
org.eclipse.wst.common.project.facet.core.nature
diff --git a/jpa-storedprocedure/pom.xml b/jpa-storedprocedure/pom.xml
new file mode 100644
index 0000000000..b2ebaa32e2
--- /dev/null
+++ b/jpa-storedprocedure/pom.xml
@@ -0,0 +1,80 @@
+
+
+ 4.0.0
+
+ com.baeldung
+ jpa-storedprocedure
+ 1.0
+ jar
+
+
+ 7.0
+ 5.1.0.Final
+ 5.1.38
+
+
+
+ JpaStoredProcedure
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 1.8
+ 1.8
+
+
+
+ maven-assembly-plugin
+
+
+
+ jar-with-dependencies
+
+
+
+
+
+
+
+
+
+
+
+ javax
+ javaee-api
+ ${jee.version}
+ provided
+
+
+
+ org.hibernate
+ hibernate-entitymanager
+ ${hibernate.version}
+
+
+
+
+
+ mysql
+ mysql-connector-java
+ 5.1.38
+
+
+
+
+
+ junit
+ junit
+ 4.4
+
+
+
+ commons-io
+ commons-io
+ 2.4
+
+
+
+
+
\ No newline at end of file
diff --git a/jpa-storedprocedure/src/main/java/com/baeldung/jpa/model/Car.java b/jpa-storedprocedure/src/main/java/com/baeldung/jpa/model/Car.java
new file mode 100644
index 0000000000..676d76307e
--- /dev/null
+++ b/jpa-storedprocedure/src/main/java/com/baeldung/jpa/model/Car.java
@@ -0,0 +1,60 @@
+package com.baeldung.jpa.model;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.NamedStoredProcedureQueries;
+import javax.persistence.NamedStoredProcedureQuery;
+import javax.persistence.ParameterMode;
+import javax.persistence.StoredProcedureParameter;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "CAR")
+@NamedStoredProcedureQueries({
+ @NamedStoredProcedureQuery(name = "findByYearProcedure", procedureName = "FIND_CAR_BY_YEAR", resultClasses = { Car.class }, parameters = { @StoredProcedureParameter(name = "p_year", type = Integer.class, mode = ParameterMode.IN) }) })
+public class Car {
+
+ private long id;
+ private String model;
+ private Integer year;
+
+ public Car(final String model, final Integer year) {
+ this.model = model;
+ this.year = year;
+ }
+
+ public Car() {
+ }
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @Column(name = "ID", unique = true, nullable = false, scale = 0)
+ public long getId() {
+ return id;
+ }
+
+ public void setId(final long id) {
+ this.id = id;
+ }
+
+ @Column(name = "MODEL")
+ public String getModel() {
+ return model;
+ }
+
+ public void setModel(final String model) {
+ this.model = model;
+ }
+
+ @Column(name = "YEAR")
+ public Integer getYear() {
+ return year;
+ }
+
+ public void setYear(final Integer year) {
+ this.year = year;
+ }
+}
diff --git a/jpa-storedprocedure/src/main/java/com/baeldung/jpa/model/QueryParameter.java b/jpa-storedprocedure/src/main/java/com/baeldung/jpa/model/QueryParameter.java
new file mode 100644
index 0000000000..0a15213f62
--- /dev/null
+++ b/jpa-storedprocedure/src/main/java/com/baeldung/jpa/model/QueryParameter.java
@@ -0,0 +1,28 @@
+package com.baeldung.jpa.model;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class QueryParameter {
+
+ private Map parameters = null;
+
+ private QueryParameter(final String name, final Object value) {
+ this.parameters = new HashMap<>();
+ this.parameters.put(name, value);
+ }
+
+ public static QueryParameter with(final String name, final Object value) {
+ return new QueryParameter(name, value);
+ }
+
+ public QueryParameter and(final String name, final Object value) {
+ this.parameters.put(name, value);
+ return this;
+ }
+
+ public Map parameters() {
+ return this.parameters;
+ }
+
+}
\ No newline at end of file
diff --git a/jpa-storedprocedure/src/main/resources/META-INF/persistence.xml b/jpa-storedprocedure/src/main/resources/META-INF/persistence.xml
new file mode 100644
index 0000000000..4c443cb7cf
--- /dev/null
+++ b/jpa-storedprocedure/src/main/resources/META-INF/persistence.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ org.hibernate.jpa.HibernatePersistenceProvider
+ com.baeldung.jpa.model.Car
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/jpa-storedprocedure/src/main/resources/config/database/FindCarByYearProcedureMySQL.sql b/jpa-storedprocedure/src/main/resources/config/database/FindCarByYearProcedureMySQL.sql
new file mode 100644
index 0000000000..0ef84fb7eb
--- /dev/null
+++ b/jpa-storedprocedure/src/main/resources/config/database/FindCarByYearProcedureMySQL.sql
@@ -0,0 +1,8 @@
+DELIMITER $$
+CREATE DEFINER=`root`@`localhost` PROCEDURE `FIND_CAR_BY_YEAR`(in p_year int)
+begin
+SELECT ID, MODEL, YEAR
+ FROM CAR
+ WHERE YEAR = p_year;
+end$$
+DELIMITER ;
diff --git a/jpa-storedprocedure/src/main/resources/config/database/create_table_mysql.sql b/jpa-storedprocedure/src/main/resources/config/database/create_table_mysql.sql
new file mode 100644
index 0000000000..4a4feebdea
--- /dev/null
+++ b/jpa-storedprocedure/src/main/resources/config/database/create_table_mysql.sql
@@ -0,0 +1,6 @@
+CREATE TABLE `car` (
+ `ID` int(10) NOT NULL AUTO_INCREMENT,
+ `MODEL` varchar(50) NOT NULL,
+ `YEAR` int(4) NOT NULL,
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
\ No newline at end of file
diff --git a/jpa-storedprocedure/src/main/resources/config/database/insert_cars.sql b/jpa-storedprocedure/src/main/resources/config/database/insert_cars.sql
new file mode 100644
index 0000000000..89f69ac1ee
--- /dev/null
+++ b/jpa-storedprocedure/src/main/resources/config/database/insert_cars.sql
@@ -0,0 +1,5 @@
+INSERT INTO CAR (ID, MODEL, YEAR) VALUES ('123456', 'Camaro', '2012');
+INSERT INTO CAR (ID, MODEL, YEAR) VALUES ('12112', 'Fiat Panda', '2000');
+INSERT INTO CAR (ID, MODEL, YEAR) VALUES ('111000', 'Fiat Punto', '2007');
+INSERT INTO CAR (ID, MODEL, YEAR) VALUES ('3382', 'Citroen C3', '2009');
+commit;
\ No newline at end of file
diff --git a/jpa-storedprocedure/src/test/java/com/baeldung/jpa/storedprocedure/StoredProcedureTest.java b/jpa-storedprocedure/src/test/java/com/baeldung/jpa/storedprocedure/StoredProcedureTest.java
new file mode 100644
index 0000000000..69351d9683
--- /dev/null
+++ b/jpa-storedprocedure/src/test/java/com/baeldung/jpa/storedprocedure/StoredProcedureTest.java
@@ -0,0 +1,72 @@
+package com.baeldung.jpa.storedprocedure;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.EntityTransaction;
+import javax.persistence.ParameterMode;
+import javax.persistence.Persistence;
+import javax.persistence.StoredProcedureQuery;
+
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.baeldung.jpa.model.Car;
+
+public class StoredProcedureTest {
+
+ private static EntityManagerFactory factory = null;
+ private static EntityManager entityManager = null;
+
+ @BeforeClass
+ public static void init() {
+ factory = Persistence.createEntityManagerFactory("jpa-db");
+ entityManager = factory.createEntityManager();
+ }
+
+ @Before
+ public void setup() {
+ }
+
+ @Test
+ public void createCarTest() {
+ final EntityTransaction transaction = entityManager.getTransaction();
+ try {
+ transaction.begin();
+ final Car car = new Car("Fiat Marea", 2015);
+ entityManager.persist(car);
+ transaction.commit();
+ } catch (final Exception e) {
+ System.out.println(e.getCause());
+ if (transaction.isActive()) {
+ transaction.rollback();
+ }
+ }
+ }
+
+ @Test
+ public void findCarsByYearNamedProcedure() {
+ final StoredProcedureQuery findByYearProcedure = entityManager.createNamedStoredProcedureQuery("findByYearProcedure");
+ final StoredProcedureQuery storedProcedure = findByYearProcedure.setParameter("p_year", 2015);
+ storedProcedure.getResultList().forEach(c -> Assert.assertEquals(new Integer(2015), ((Car) c).getYear()));
+ }
+
+ @Test
+ public void findCarsByYearNoNamed() {
+ final StoredProcedureQuery storedProcedure = entityManager.createStoredProcedureQuery("FIND_CAR_BY_YEAR", Car.class).registerStoredProcedureParameter(1, Integer.class, ParameterMode.IN).setParameter(1, 2015);
+ storedProcedure.getResultList().forEach(c -> Assert.assertEquals(new Integer(2015), ((Car) c).getYear()));
+ }
+
+ @AfterClass
+ public static void destroy() {
+
+ if (entityManager != null) {
+ entityManager.close();
+ }
+ if (factory != null) {
+ factory.close();
+ }
+ }
+}
diff --git a/jpa-storedprocedure/src/test/resources/persistence.xml b/jpa-storedprocedure/src/test/resources/persistence.xml
new file mode 100644
index 0000000000..d94221b54f
--- /dev/null
+++ b/jpa-storedprocedure/src/test/resources/persistence.xml
@@ -0,0 +1,21 @@
+
+
+
+
+ org.hibernate.jpa.HibernatePersistenceProvider
+ com.baeldung.jpa.model.Car
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sandbox/.classpath b/json-path/.classpath
similarity index 91%
rename from sandbox/.classpath
rename to json-path/.classpath
index 8ebf6d9c31..2244ed1e21 100644
--- a/sandbox/.classpath
+++ b/json-path/.classpath
@@ -6,31 +6,27 @@
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
diff --git a/mockito-mocks-spring-beans/.gitignore b/json-path/.gitignore
similarity index 100%
rename from mockito-mocks-spring-beans/.gitignore
rename to json-path/.gitignore
diff --git a/json-path/.project b/json-path/.project
new file mode 100644
index 0000000000..caa2c41711
--- /dev/null
+++ b/json-path/.project
@@ -0,0 +1,23 @@
+
+
+ json-path
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.m2e.core.maven2Builder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+ org.eclipse.m2e.core.maven2Nature
+
+
diff --git a/json-path/pom.xml b/json-path/pom.xml
new file mode 100644
index 0000000000..c03385cf1d
--- /dev/null
+++ b/json-path/pom.xml
@@ -0,0 +1,65 @@
+
+ 4.0.0
+ com.baeldung
+ json-path
+ 0.0.1-SNAPSHOT
+ json-path
+
+
+
+
+ com.jayway.jsonpath
+ json-path
+ ${json-path.version}
+
+
+
+
+ junit
+ junit
+ ${junit.version}
+ test
+
+
+
+
+ org.slf4j
+ slf4j-api
+ ${slf4j.version}
+ runtime
+
+
+ ch.qos.logback
+ logback-classic
+ ${logback.version}
+ runtime
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.8
+ 1.8
+
+
+
+
+
+
+
+ 2.1.0
+
+
+ 4.12
+
+
+ 1.7.14
+ 1.1.3
+
+
\ No newline at end of file
diff --git a/json-path/src/main/resources/intro_api.json b/json-path/src/main/resources/intro_api.json
new file mode 100644
index 0000000000..8a252f2971
--- /dev/null
+++ b/json-path/src/main/resources/intro_api.json
@@ -0,0 +1,57 @@
+{
+ "tool":
+ {
+ "jsonpath":
+ {
+ "creator":
+ {
+ "name": "Jayway Inc.",
+ "location":
+ [
+ "Malmo",
+ "Stockholm",
+ "Copenhagen",
+ "San Francisco",
+ "Karlskrona",
+ "Halmstad",
+ "Helsingborg"
+ ]
+ },
+
+ "current release": "2.1"
+ }
+ },
+
+ "book":
+ [
+ {
+ "title": "Beginning JSON",
+ "author": "Ben Smith",
+ "price": 49.99
+ },
+
+ {
+ "title": "JSON at Work",
+ "author": "Tom Marrs",
+ "price": 29.99
+ },
+
+ {
+ "title": "Learn JSON in a DAY",
+ "author": "Acodemy",
+ "price": 8.99
+ },
+
+ {
+ "title": "JSON: Questions and Answers",
+ "author": "George Duckett",
+ "price": 6.00
+ }
+ ],
+
+ "price range":
+ {
+ "cheap": 10.00,
+ "medium": 20.00
+ }
+}
\ No newline at end of file
diff --git a/json-path/src/main/resources/intro_service.json b/json-path/src/main/resources/intro_service.json
new file mode 100644
index 0000000000..448492463a
--- /dev/null
+++ b/json-path/src/main/resources/intro_service.json
@@ -0,0 +1,61 @@
+[
+ {
+ "id": 1,
+ "title": "Casino Royale",
+ "director": "Martin Campbell",
+ "starring":
+ [
+ "Daniel Craig",
+ "Eva Green"
+ ],
+
+ "desc": "Twenty-first James Bond movie",
+ "release date": 1163466000000,
+ "box office": 594275385
+ },
+
+ {
+ "id": 2,
+ "title": "Quantum of Solace",
+ "director": "Marc Forster",
+ "starring":
+ [
+ "Daniel Craig",
+ "Olga Kurylenko"
+ ],
+
+ "desc": "Twenty-second James Bond movie",
+ "release date": 1225242000000,
+ "box office": 591692078
+ },
+
+ {
+ "id": 3,
+ "title": "Skyfall",
+ "director": "Sam Mendes",
+ "starring":
+ [
+ "Daniel Craig",
+ "Naomie Harris"
+ ],
+
+ "desc": "Twenty-third James Bond movie",
+ "release date": 1350954000000,
+ "box office": 1110526981
+ },
+
+ {
+ "id": 4,
+ "title": "Spectre",
+ "director": "Sam Mendes",
+ "starring":
+ [
+ "Daniel Craig",
+ "Lea Seydoux"
+ ],
+
+ "desc": "Twenty-fourth James Bond movie",
+ "release date": 1445821200000,
+ "box office": 879376275
+ }
+]
\ No newline at end of file
diff --git a/json-path/src/main/resources/intro_user.json b/json-path/src/main/resources/intro_user.json
new file mode 100644
index 0000000000..c35914c6c4
--- /dev/null
+++ b/json-path/src/main/resources/intro_user.json
@@ -0,0 +1,46 @@
+[
+ {
+ "username": "oracle",
+ "password":
+ {
+ "current":
+ {
+ "value": "Java_SE_8",
+ "created": 1397754000000
+ },
+
+ "old":
+ [
+ {
+ "value": "Java_SE_7",
+ "created": 1312650000000
+ }
+ ]
+ }
+ },
+
+ {
+ "username": "sun",
+ "password":
+ {
+ "current":
+ {
+ "value": "Java_SE_6",
+ "created": 1168448400000
+ },
+
+ "old":
+ [
+ {
+ "value": "J2SE_5.0",
+ "created": 1099069200000
+ },
+
+ {
+ "value": "J2SE_1.4",
+ "created": 1025542800000
+ }
+ ]
+ }
+ }
+]
\ No newline at end of file
diff --git a/json-path/src/test/java/com/baeldung/jsonpath/introduction/OperationTest.java b/json-path/src/test/java/com/baeldung/jsonpath/introduction/OperationTest.java
new file mode 100644
index 0000000000..d90fafb7cb
--- /dev/null
+++ b/json-path/src/test/java/com/baeldung/jsonpath/introduction/OperationTest.java
@@ -0,0 +1,71 @@
+package com.baeldung.jsonpath.introduction;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.CoreMatchers.not;
+
+import org.junit.Test;
+
+import java.io.InputStream;
+import java.util.List;
+import java.util.Map;
+import java.util.Scanner;
+
+import com.jayway.jsonpath.Criteria;
+import com.jayway.jsonpath.DocumentContext;
+import com.jayway.jsonpath.Filter;
+import com.jayway.jsonpath.JsonPath;
+import com.jayway.jsonpath.Predicate;
+
+public class OperationTest {
+ InputStream jsonInputStream = this.getClass().getClassLoader().getResourceAsStream("intro_api.json");
+ String jsonDataSourceString = new Scanner(jsonInputStream, "UTF-8").useDelimiter("\\Z").next();
+
+ @Test
+ public void givenJsonPathWithoutPredicates_whenReading_thenCorrect() {
+ String jsonpathCreatorNamePath = "$['tool']['jsonpath']['creator']['name']";
+ String jsonpathCreatorLocationPath = "$['tool']['jsonpath']['creator']['location'][*]";
+
+ DocumentContext jsonContext = JsonPath.parse(jsonDataSourceString);
+ String jsonpathCreatorName = jsonContext.read(jsonpathCreatorNamePath);
+ List jsonpathCreatorLocation = jsonContext.read(jsonpathCreatorLocationPath);
+
+ assertEquals("Jayway Inc.", jsonpathCreatorName);
+ assertThat(jsonpathCreatorLocation.toString(), containsString("Malmo"));
+ assertThat(jsonpathCreatorLocation.toString(), containsString("San Francisco"));
+ assertThat(jsonpathCreatorLocation.toString(), containsString("Helsingborg"));
+ }
+
+ @Test
+ public void givenJsonPathWithFilterPredicate_whenReading_thenCorrect() {
+ Filter expensiveFilter = Filter.filter(Criteria.where("price").gt(20.00));
+ List> expensive = JsonPath.parse(jsonDataSourceString).read("$['book'][?]", expensiveFilter);
+ predicateUsageAssertionHelper(expensive);
+ }
+
+ @Test
+ public void givenJsonPathWithCustomizedPredicate_whenReading_thenCorrect() {
+ Predicate expensivePredicate = new Predicate() {
+ public boolean apply(PredicateContext context) {
+ String value = context.item(Map.class).get("price").toString();
+ return Float.valueOf(value) > 20.00;
+ }
+ };
+ List> expensive = JsonPath.parse(jsonDataSourceString).read("$['book'][?]", expensivePredicate);
+ predicateUsageAssertionHelper(expensive);
+ }
+
+ @Test
+ public void givenJsonPathWithInlinePredicate_whenReading_thenCorrect() {
+ List> expensive = JsonPath.parse(jsonDataSourceString).read("$['book'][?(@['price'] > $['price range']['medium'])]");
+ predicateUsageAssertionHelper(expensive);
+ }
+
+ private void predicateUsageAssertionHelper(List> predicate) {
+ assertThat(predicate.toString(), containsString("Beginning JSON"));
+ assertThat(predicate.toString(), containsString("JSON at Work"));
+ assertThat(predicate.toString(), not(containsString("Learn JSON in a DAY")));
+ assertThat(predicate.toString(), not(containsString("JSON: Questions and Answers")));
+ }
+}
diff --git a/json-path/src/test/java/com/baeldung/jsonpath/introduction/ServiceTest.java b/json-path/src/test/java/com/baeldung/jsonpath/introduction/ServiceTest.java
new file mode 100644
index 0000000000..868acac8d0
--- /dev/null
+++ b/json-path/src/test/java/com/baeldung/jsonpath/introduction/ServiceTest.java
@@ -0,0 +1,91 @@
+package com.baeldung.jsonpath.introduction;
+
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.hamcrest.CoreMatchers.containsString;
+
+import org.junit.Test;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Scanner;
+
+import com.jayway.jsonpath.Configuration;
+import com.jayway.jsonpath.DocumentContext;
+import com.jayway.jsonpath.JsonPath;
+import com.jayway.jsonpath.Option;
+
+public class ServiceTest {
+ InputStream jsonInputStream = this.getClass().getClassLoader().getResourceAsStream("intro_service.json");
+ String jsonString = new Scanner(jsonInputStream, "UTF-8").useDelimiter("\\Z").next();
+
+ @Test
+ public void givenId_whenRequestingRecordData_thenSucceed() {
+ Object dataObject = JsonPath.parse(jsonString).read("$[?(@.id == 2)]");
+ String dataString = dataObject.toString();
+
+ assertThat(dataString, containsString("2"));
+ assertThat(dataString, containsString("Quantum of Solace"));
+ assertThat(dataString, containsString("Twenty-second James Bond movie"));
+ }
+
+ @Test
+ public void givenStarring_whenRequestingMovieTitle_thenSucceed() {
+ List> dataList = JsonPath.parse(jsonString).read("$[?('Eva Green' in @['starring'])]");
+ String title = (String) dataList.get(0).get("title");
+
+ assertEquals("Casino Royale", title);
+ }
+
+ @Test
+ public void givenCompleteStructure_whenCalculatingTotalRevenue_thenSucceed() {
+ DocumentContext context = JsonPath.parse(jsonString);
+ int length = context.read("$.length()");
+ long revenue = 0;
+ for (int i = 0; i < length; i++) {
+ revenue += context.read("$[" + i + "]['box office']", Long.class);
+ }
+
+ assertEquals(594275385L + 591692078L + 1110526981L + 879376275L, revenue);
+ }
+
+ @Test
+ public void givenStructure_whenRequestingHighestRevenueMovieTitle_thenSucceed() {
+ DocumentContext context = JsonPath.parse(jsonString);
+ List revenueList = context.read("$[*]['box office']");
+ Integer[] revenueArray = revenueList.toArray(new Integer[0]);
+ Arrays.sort(revenueArray);
+
+ int highestRevenue = revenueArray[revenueArray.length - 1];
+ Configuration pathConfiguration = Configuration.builder().options(Option.AS_PATH_LIST).build();
+ List pathList = JsonPath.using(pathConfiguration).parse(jsonString).read("$[?(@['box office'] == " + highestRevenue + ")]");
+
+ Map dataRecord = context.read(pathList.get(0));
+ String title = dataRecord.get("title");
+
+ assertEquals("Skyfall", title);
+ }
+
+ @Test
+ public void givenDirector_whenRequestingLatestMovieTitle_thenSucceed() {
+ DocumentContext context = JsonPath.parse(jsonString);
+ List> dataList = context.read("$[?(@.director == 'Sam Mendes')]");
+
+ List dateList = new ArrayList<>();
+ for (Map item : dataList) {
+ Object date = item.get("release date");
+ dateList.add(date);
+ }
+ Long[] dateArray = dateList.toArray(new Long[0]);
+ Arrays.sort(dateArray);
+
+ long latestTime = dateArray[dateArray.length - 1];
+ List> finalDataList = context.read("$[?(@['director'] == 'Sam Mendes' && @['release date'] == " + latestTime + ")]");
+ String title = (String) finalDataList.get(0).get("title");
+
+ assertEquals("Spectre", title);
+ }
+}
\ No newline at end of file
diff --git a/mockito/.externalToolBuilders/org.eclipse.wst.jsdt.core.javascriptValidator.launch b/mockito/.externalToolBuilders/org.eclipse.wst.jsdt.core.javascriptValidator.launch
deleted file mode 100644
index 627021fb96..0000000000
--- a/mockito/.externalToolBuilders/org.eclipse.wst.jsdt.core.javascriptValidator.launch
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/mockito/.settings/.jsdtscope b/mockito/.settings/.jsdtscope
deleted file mode 100644
index 7b3f0c8b9f..0000000000
--- a/mockito/.settings/.jsdtscope
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/mockito/.settings/org.eclipse.jdt.core.prefs b/mockito/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index b126d6476b..0000000000
--- a/mockito/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,95 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
-org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
-org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
-org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
-org.eclipse.jdt.core.compiler.problem.deadCode=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=error
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=error
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
-org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=error
-org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
diff --git a/mockito/.settings/org.eclipse.jdt.ui.prefs b/mockito/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 471e9b0d81..0000000000
--- a/mockito/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,55 +0,0 @@
-#Sat Jan 21 23:04:06 EET 2012
-eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_missing_override_annotations_interface_methods=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=true
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.convert_to_enhanced_for_loop=true
-sp_cleanup.correct_indentation=true
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=true
-sp_cleanup.make_local_variable_final=true
-sp_cleanup.make_parameters_final=true
-sp_cleanup.make_private_fields_final=false
-sp_cleanup.make_type_abstract_if_missing_method=false
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=false
-sp_cleanup.on_save_use_additional_actions=true
-sp_cleanup.organize_imports=true
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_trailing_whitespaces=true
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=true
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.use_blocks=false
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_this_for_non_static_field_access=true
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=true
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/mockito/.settings/org.eclipse.m2e.core.prefs b/mockito/.settings/org.eclipse.m2e.core.prefs
deleted file mode 100644
index f897a7f1cb..0000000000
--- a/mockito/.settings/org.eclipse.m2e.core.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-activeProfiles=
-eclipse.preferences.version=1
-resolveWorkspaceProjects=true
-version=1
diff --git a/mockito/.settings/org.eclipse.m2e.wtp.prefs b/mockito/.settings/org.eclipse.m2e.wtp.prefs
deleted file mode 100644
index ef86089622..0000000000
--- a/mockito/.settings/org.eclipse.m2e.wtp.prefs
+++ /dev/null
@@ -1,2 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.m2e.wtp.enabledProjectSpecificPrefs=false
diff --git a/mockito/.settings/org.eclipse.wst.common.component b/mockito/.settings/org.eclipse.wst.common.component
deleted file mode 100644
index e98377cb0f..0000000000
--- a/mockito/.settings/org.eclipse.wst.common.component
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/mockito/.settings/org.eclipse.wst.common.project.facet.core.xml b/mockito/.settings/org.eclipse.wst.common.project.facet.core.xml
deleted file mode 100644
index f4ef8aa0a5..0000000000
--- a/mockito/.settings/org.eclipse.wst.common.project.facet.core.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/mockito/.settings/org.eclipse.wst.jsdt.ui.superType.container b/mockito/.settings/org.eclipse.wst.jsdt.ui.superType.container
deleted file mode 100644
index 3bd5d0a480..0000000000
--- a/mockito/.settings/org.eclipse.wst.jsdt.ui.superType.container
+++ /dev/null
@@ -1 +0,0 @@
-org.eclipse.wst.jsdt.launching.baseBrowserLibrary
\ No newline at end of file
diff --git a/mockito/.settings/org.eclipse.wst.jsdt.ui.superType.name b/mockito/.settings/org.eclipse.wst.jsdt.ui.superType.name
deleted file mode 100644
index 05bd71b6ec..0000000000
--- a/mockito/.settings/org.eclipse.wst.jsdt.ui.superType.name
+++ /dev/null
@@ -1 +0,0 @@
-Window
\ No newline at end of file
diff --git a/mockito/.settings/org.eclipse.wst.validation.prefs b/mockito/.settings/org.eclipse.wst.validation.prefs
deleted file mode 100644
index cacf5451ae..0000000000
--- a/mockito/.settings/org.eclipse.wst.validation.prefs
+++ /dev/null
@@ -1,14 +0,0 @@
-DELEGATES_PREFERENCE=delegateValidatorList
-USER_BUILD_PREFERENCE=enabledBuildValidatorListorg.eclipse.jst.j2ee.internal.classpathdep.ClasspathDependencyValidator;
-USER_MANUAL_PREFERENCE=enabledManualValidatorListorg.eclipse.jst.j2ee.internal.classpathdep.ClasspathDependencyValidator;
-USER_PREFERENCE=overrideGlobalPreferencestruedisableAllValidationfalseversion1.2.303.v201202090300
-eclipse.preferences.version=1
-override=true
-suspend=false
-vals/org.eclipse.jst.jsf.ui.JSFAppConfigValidator/global=FF01
-vals/org.eclipse.jst.jsp.core.JSPBatchValidator/global=FF01
-vals/org.eclipse.jst.jsp.core.JSPContentValidator/global=FF01
-vals/org.eclipse.jst.jsp.core.TLDValidator/global=FF01
-vals/org.eclipse.wst.dtd.core.dtdDTDValidator/global=FF01
-vals/org.eclipse.wst.jsdt.web.core.JsBatchValidator/global=TF02
-vf.version=3
diff --git a/mockito/.settings/org.eclipse.wst.ws.service.policy.prefs b/mockito/.settings/org.eclipse.wst.ws.service.policy.prefs
deleted file mode 100644
index 9cfcabe16f..0000000000
--- a/mockito/.settings/org.eclipse.wst.ws.service.policy.prefs
+++ /dev/null
@@ -1,2 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.wst.ws.service.policy.projectEnabled=false
diff --git a/mockito/.springBeans b/mockito/.springBeans
deleted file mode 100644
index a79097f40d..0000000000
--- a/mockito/.springBeans
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
- 1
-
-
-
-
-
-
- src/main/webapp/WEB-INF/api-servlet.xml
-
-
-
-
diff --git a/mockito/pom.xml b/mockito/pom.xml
index a73eea7647..16c7cb0dd8 100644
--- a/mockito/pom.xml
+++ b/mockito/pom.xml
@@ -1,128 +1,143 @@
-
- 4.0.0
- org.baeldung
- mockito
- 0.1-SNAPSHOT
+
+ 4.0.0
+ org.baeldung
+ mockito
+ 0.1-SNAPSHOT
- mockito
+ mockito
-
+
-
+
-
- com.google.guava
- guava
- ${guava.version}
-
+
+ com.google.guava
+ guava
+ ${guava.version}
+
-
- org.apache.commons
- commons-lang3
- ${commons-lang3.version}
-
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.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.powermock
+ powermock-module-junit4
+ ${powermock.version}
+ test
+
+
+ org.powermock
+ powermock-api-mockito
+ ${powermock.version}
+ test
+
-
- mockito
-
-
- src/main/resources
- true
-
-
+
-
+
+ mockito
+
+
+ src/main/resources
+ true
+
+
-
- org.apache.maven.plugins
- maven-compiler-plugin
- ${maven-compiler-plugin.version}
-
- 1.8
- 1.8
-
-
+
-
- org.apache.maven.plugins
- maven-surefire-plugin
- ${maven-surefire-plugin.version}
-
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ 1.8
+ 1.8
+
+
-
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${maven-surefire-plugin.version}
+
-
+
-
-
- 4.1.5.RELEASE
- 3.2.5.RELEASE
+
-
- 4.3.10.Final
- 5.1.35
+
+
+ 4.1.5.RELEASE
+ 3.2.5.RELEASE
-
- 1.7.13
- 1.1.3
+
+ 4.3.10.Final
+ 5.1.35
-
- 5.1.3.Final
+
+ 1.7.13
+ 1.1.3
-
- 19.0
- 3.4
+
+ 5.1.3.Final
-
- 1.3
- 4.12
- 1.10.19
+
+ 19.0
+ 3.4
- 4.4.1
- 4.5
+
+ 1.3
+ 4.12
+ 1.10.19
+ 1.6.4
- 2.4.1
+ 4.4.1
+ 4.5
-
- 3.3
- 2.6
- 2.18.1
- 2.7
- 1.4.14
+ 2.4.1
-
+
+ 3.3
+ 2.6
+ 2.18.1
+ 2.7
+ 1.4.14
+
+
\ No newline at end of file
diff --git a/mockito/src/main/webapp/WEB-INF/api-servlet.xml b/mockito/src/main/webapp/WEB-INF/api-servlet.xml
deleted file mode 100644
index 4c74be8912..0000000000
--- a/mockito/src/main/webapp/WEB-INF/api-servlet.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/mockito/src/main/webapp/WEB-INF/web.xml b/mockito/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index 935beae648..0000000000
--- a/mockito/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-
- Spring MVC Application
-
-
-
- contextClass
-
- org.springframework.web.context.support.AnnotationConfigWebApplicationContext
-
-
-
- contextConfigLocation
- org.baeldung.config
-
-
-
- org.springframework.web.context.ContextLoaderListener
-
-
-
-
- api
- org.springframework.web.servlet.DispatcherServlet
- 1
-
-
- api
- /
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorForPartialMocking.java b/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorForPartialMocking.java
new file mode 100644
index 0000000000..771444f13d
--- /dev/null
+++ b/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorForPartialMocking.java
@@ -0,0 +1,20 @@
+package com.baeldung.powermockito.introduction;
+
+public class CollaboratorForPartialMocking {
+
+ public static String staticMethod() {
+ return "Hello Baeldung!";
+ }
+
+ public final String finalMethod() {
+ return "Hello Baeldung!";
+ }
+
+ private String privateMethod() {
+ return "Hello Baeldung!";
+ }
+
+ public String privateMethodCaller() {
+ return privateMethod() + " Welcome to the Java world.";
+ }
+}
\ No newline at end of file
diff --git a/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithFinalMethods.java b/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithFinalMethods.java
new file mode 100644
index 0000000000..8287454782
--- /dev/null
+++ b/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithFinalMethods.java
@@ -0,0 +1,9 @@
+package com.baeldung.powermockito.introduction;
+
+public class CollaboratorWithFinalMethods {
+
+ public final String helloMethod() {
+ return "Hello World!";
+ }
+
+}
diff --git a/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithStaticMethods.java b/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithStaticMethods.java
new file mode 100644
index 0000000000..2795ae97f1
--- /dev/null
+++ b/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithStaticMethods.java
@@ -0,0 +1,16 @@
+package com.baeldung.powermockito.introduction;
+
+public class CollaboratorWithStaticMethods {
+
+ public static String firstMethod(String name) {
+ return "Hello " + name + " !";
+ }
+
+ public static String secondMethod() {
+ return "Hello no one!";
+ }
+
+ public static String thirdMethod() {
+ return "Hello no one again!";
+ }
+}
\ No newline at end of file
diff --git a/mockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoTest.java b/mockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoTest.java
new file mode 100644
index 0000000000..6f12f3e459
--- /dev/null
+++ b/mockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoTest.java
@@ -0,0 +1,78 @@
+package com.baeldung.powermockito.introduction;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import static org.junit.Assert.assertEquals;
+import static org.powermock.api.mockito.PowerMockito.*;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest(fullyQualifiedNames = "com.baeldung.powermockito.introduction.*")
+public class PowerMockitoTest {
+
+ @Test
+ public void givenFinalMethods_whenUsingPowerMockito_thenCorrect() throws Exception {
+ CollaboratorWithFinalMethods mock = mock(CollaboratorWithFinalMethods.class);
+ whenNew(CollaboratorWithFinalMethods.class).withNoArguments().thenReturn(mock);
+
+ CollaboratorWithFinalMethods collaborator = new CollaboratorWithFinalMethods();
+ verifyNew(CollaboratorWithFinalMethods.class).withNoArguments();
+
+ when(collaborator.helloMethod()).thenReturn("Hello Baeldung!");
+ String welcome = collaborator.helloMethod();
+ Mockito.verify(collaborator).helloMethod();
+ assertEquals("Hello Baeldung!", welcome);
+ }
+
+ @Test(expected = RuntimeException.class)
+ public void givenStaticMethods_whenUsingPowerMockito_thenCorrect() {
+ mockStatic(CollaboratorWithStaticMethods.class);
+
+ when(CollaboratorWithStaticMethods.firstMethod(Mockito.anyString())).thenReturn("Hello Baeldung!");
+ when(CollaboratorWithStaticMethods.secondMethod()).thenReturn("Nothing special");
+ doThrow(new RuntimeException()).when(CollaboratorWithStaticMethods.class);
+ CollaboratorWithStaticMethods.thirdMethod();
+
+ String firstWelcome = CollaboratorWithStaticMethods.firstMethod("Whoever");
+ String secondWelcome = CollaboratorWithStaticMethods.firstMethod("Whatever");
+
+ assertEquals("Hello Baeldung!", firstWelcome);
+ assertEquals("Hello Baeldung!", secondWelcome);
+
+ verifyStatic(Mockito.times(2));
+ CollaboratorWithStaticMethods.firstMethod(Mockito.anyString());
+
+ verifyStatic(Mockito.never());
+ CollaboratorWithStaticMethods.secondMethod();
+
+ CollaboratorWithStaticMethods.thirdMethod();
+ }
+
+ @Test
+ public void givenPartialMocking_whenUsingPowerMockito_thenCorrect() throws Exception {
+ String returnValue;
+
+ spy(CollaboratorForPartialMocking.class);
+ when(CollaboratorForPartialMocking.staticMethod()).thenReturn("I am a static mock method.");
+ returnValue = CollaboratorForPartialMocking.staticMethod();
+ verifyStatic();
+ CollaboratorForPartialMocking.staticMethod();
+ assertEquals("I am a static mock method.", returnValue);
+
+ CollaboratorForPartialMocking collaborator = new CollaboratorForPartialMocking();
+ CollaboratorForPartialMocking mock = spy(collaborator);
+
+ when(mock.finalMethod()).thenReturn("I am a final mock method.");
+ returnValue = mock.finalMethod();
+ Mockito.verify(mock).finalMethod();
+ assertEquals("I am a final mock method.", returnValue);
+
+ when(mock, "privateMethod").thenReturn("I am a private mock method.");
+ returnValue = mock.privateMethodCaller();
+ verifyPrivate(mock).invoke("privateMethod");
+ assertEquals("I am a private mock method. Welcome to the Java world.", returnValue);
+ }
+}
\ No newline at end of file
diff --git a/mockito/src/test/java/org/baeldung/mockito/MockitoAnnotationTest.java b/mockito/src/test/java/org/baeldung/mockito/MockitoAnnotationTest.java
index 3acc2c937b..ec68c38f70 100644
--- a/mockito/src/test/java/org/baeldung/mockito/MockitoAnnotationTest.java
+++ b/mockito/src/test/java/org/baeldung/mockito/MockitoAnnotationTest.java
@@ -1,20 +1,14 @@
package org.baeldung.mockito;
-import static org.junit.Assert.assertEquals;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.mockito.MockitoAnnotations;
-import org.mockito.Spy;
+import static org.junit.Assert.assertEquals;
//@RunWith(MockitoJUnitRunner.class)
public class MockitoAnnotationTest {
diff --git a/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesTest.java b/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesTest.java
index 399c511d4e..de6e7fca72 100644
--- a/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesTest.java
+++ b/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesTest.java
@@ -1,20 +1,17 @@
package org.baeldung.mockito;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.when;
-
-import org.junit.Test;
-import org.mockito.Mockito;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
+import static org.mockito.Mockito.*;
public class MockitoConfigExamplesTest {
diff --git a/mockito/src/test/java/org/baeldung/mockito/MockitoMockTest.java b/mockito/src/test/java/org/baeldung/mockito/MockitoMockTest.java
new file mode 100644
index 0000000000..5a1996fa97
--- /dev/null
+++ b/mockito/src/test/java/org/baeldung/mockito/MockitoMockTest.java
@@ -0,0 +1,69 @@
+package org.baeldung.mockito;
+
+import static org.mockito.Mockito.*;
+import static org.junit.Assert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.containsString;
+import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
+
+import org.junit.Test;
+import org.junit.Rule;
+import org.junit.rules.ExpectedException;
+import org.mockito.MockSettings;
+import org.mockito.exceptions.verification.TooLittleActualInvocations;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+public class MockitoMockTest {
+
+ private static class CustomAnswer implements Answer {
+ @Override
+ public Boolean answer(InvocationOnMock invocation) throws Throwable {
+ return false;
+ }
+ }
+
+ @Rule
+ public ExpectedException thrown = ExpectedException.none();
+
+ @Test
+ public void whenUsingSimpleMock_thenCorrect() {
+ MyList listMock = mock(MyList.class);
+ when(listMock.add(anyString())).thenReturn(false);
+ boolean added = listMock.add(randomAlphabetic(6));
+
+ verify(listMock).add(anyString());
+ assertThat(added, is(false));
+ }
+
+ @Test
+ public void whenUsingMockWithName_thenCorrect() {
+ MyList listMock = mock(MyList.class, "myMock");
+ when(listMock.add(anyString())).thenReturn(false);
+ listMock.add(randomAlphabetic(6));
+
+ thrown.expect(TooLittleActualInvocations.class);
+ thrown.expectMessage(containsString("myMock.add"));
+
+ verify(listMock, times(2)).add(anyString());
+ }
+
+ @Test
+ public void whenUsingMockWithAnswer_thenCorrect() {
+ MyList listMock = mock(MyList.class, new CustomAnswer());
+ boolean added = listMock.add(randomAlphabetic(6));
+
+ verify(listMock).add(anyString());
+ assertThat(added, is(false));
+ }
+
+ @Test
+ public void whenUsingMockWithSettings_thenCorrect() {
+ MockSettings customSettings = withSettings().defaultAnswer(new CustomAnswer());
+ MyList listMock = mock(MyList.class, customSettings);
+ boolean added = listMock.add(randomAlphabetic(6));
+
+ verify(listMock).add(anyString());
+ assertThat(added, is(false));
+ }
+}
\ No newline at end of file
diff --git a/mockito/src/test/java/org/baeldung/mockito/MockitoSpyTest.java b/mockito/src/test/java/org/baeldung/mockito/MockitoSpyTest.java
index adfd3ed1ae..8682e16e5d 100644
--- a/mockito/src/test/java/org/baeldung/mockito/MockitoSpyTest.java
+++ b/mockito/src/test/java/org/baeldung/mockito/MockitoSpyTest.java
@@ -1,16 +1,16 @@
package org.baeldung.mockito;
-import static org.junit.Assert.assertEquals;
-
-import java.util.ArrayList;
-import java.util.List;
-
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.mockito.Spy;
import org.mockito.runners.MockitoJUnitRunner;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
@RunWith(MockitoJUnitRunner.class)
public class MockitoSpyTest {
diff --git a/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesTest.java b/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesTest.java
index 6875a9f819..6beae34138 100644
--- a/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesTest.java
+++ b/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesTest.java
@@ -1,26 +1,18 @@
package org.baeldung.mockito;
-import static org.hamcrest.Matchers.hasItem;
-import static org.junit.Assert.assertThat;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.atLeast;
-import static org.mockito.Mockito.atMost;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.verifyZeroInteractions;
-
-import java.util.List;
-
+import com.google.common.collect.Lists;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.InOrder;
import org.mockito.Mockito;
import org.mockito.exceptions.verification.NoInteractionsWanted;
-import com.google.common.collect.Lists;
+import java.util.List;
+
+import static org.hamcrest.Matchers.hasItem;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.*;
public class MockitoVerifyExamplesTest {
@@ -115,10 +107,10 @@ public class MockitoVerifyExamplesTest {
@Test
public final void whenVerifyingAnInteractionWithArgumentCapture_thenCorrect() {
final List mockedList = mock(MyList.class);
- mockedList.addAll(Lists. newArrayList("someElement"));
+ mockedList.addAll(Lists.newArrayList("someElement"));
final ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(List.class);
verify(mockedList).addAll(argumentCaptor.capture());
- final List capturedArgument = argumentCaptor.> getValue();
+ final List capturedArgument = argumentCaptor.>getValue();
assertThat(capturedArgument, hasItem("someElement"));
}
diff --git a/mockito/src/test/java/org/baeldung/mockito/MyDictionary.java b/mockito/src/test/java/org/baeldung/mockito/MyDictionary.java
index 3fb2c30646..a613b28f59 100644
--- a/mockito/src/test/java/org/baeldung/mockito/MyDictionary.java
+++ b/mockito/src/test/java/org/baeldung/mockito/MyDictionary.java
@@ -4,6 +4,7 @@ import java.util.HashMap;
import java.util.Map;
public class MyDictionary {
+
Map wordMap;
public MyDictionary() {
diff --git a/pom.xml b/pom.xml
index 5dad868501..6f63269248 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,116 +1,70 @@
-
-
- 4.0.0
- org.baeldung
- spring-security-login-and-registration
- spring-security-login-and-registration
- war
- 1.0.0-BUILD-SNAPSHOT
+
+ 4.0.0
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
-
- org.springframework.boot
- spring-boot-starter-parent
- 1.1.4.RELEASE
-
+ parent-modules
+ pom
-
-
-
- org.springframework.boot
- spring-boot-starter-web
-
-
- org.springframework.security
- spring-security-config
- runtime
-
-
-
-
-
-
- org.slf4j
- slf4j-api
-
-
- ch.qos.logback
- logback-classic
-
-
+
+ apache-fop
+ core-java
+ core-java-8
+ gson
+
+ guava
+ guava18
+ guava19
+ handling-spring-static-resources
+ httpclient
+ jackson
+ javaxval
+ json-path
+ mockito
+
+ querydsl
+
+ rest-testing
+ resteasy
-
- org.slf4j
- jcl-over-slf4j
-
-
+ spring-all
+ spring-apache-camel
+ spring-batch
+ spring-boot
+ spring-data-cassandra
+ spring-data-elasticsearch
+ spring-data-mongodb
+ spring-data-redis
+ spring-exceptions
+ spring-freemarker
+ spring-hibernate3
+ spring-hibernate4
+ spring-jpa
+ spring-katharsis
+ spring-mockito
+ spring-mvc-java
+ spring-mvc-no-xml
+ spring-mvc-xml
+ spring-openid
+ spring-quartz
+ spring-rest
-
- org.slf4j
- log4j-over-slf4j
-
+ spring-security-basic-auth
+ spring-security-mvc-custom
+ spring-security-mvc-digest-auth
+ spring-security-mvc-ldap
+ spring-security-mvc-login
+ spring-security-mvc-persisted-remember-me
+ spring-security-mvc-session
+ spring-security-rest
+ spring-security-rest-basic-auth
+ spring-security-rest-custom
+ spring-security-rest-digest-auth
+ spring-security-rest-full
+ spring-thymeleaf
+ spring-zuul
-
-
- javax.inject
- javax.inject
- ${javax.inject.version}
-
-
-
-
- javax.servlet
- javax.servlet-api
-
-
-
- javax.servlet.jsp
- javax.servlet.jsp-api
- ${javax.servlet.jsp-api.version}
-
-
-
- javax.servlet
- jstl
-
-
-
-
- org.springframework.security
- spring-security-taglibs
-
-
-
-
- junit
- junit
- test
-
-
-
- spring-security-login-and-registration
-
-
- src/main/resources
- true
-
-
-
-
- 1.7
- 3.1.1.RELEASE
- 3.2.4.RELEASE
- 1.6.10
-
-
- 1.7.6
- 1.1.1
-
-
- 2.3.2-b01
-
-
- 1
-
+
diff --git a/mockito/.classpath b/querydsl/.classpath
similarity index 91%
rename from mockito/.classpath
rename to querydsl/.classpath
index 8ebf6d9c31..264bb653bb 100644
--- a/mockito/.classpath
+++ b/querydsl/.classpath
@@ -6,18 +6,24 @@
+
+
+
+
+
+
-
+
-
+
@@ -27,10 +33,5 @@
-
-
-
-
-
diff --git a/sandbox/.project b/querydsl/.project
similarity index 84%
rename from sandbox/.project
rename to querydsl/.project
index f039cd270e..729f89c323 100644
--- a/sandbox/.project
+++ b/querydsl/.project
@@ -1,17 +1,17 @@
- sandbox
+ querydsl
- org.eclipse.jdt.core.javabuilder
+ org.eclipse.wst.common.project.facet.core.builder
- org.eclipse.wst.common.project.facet.core.builder
+ org.eclipse.jdt.core.javabuilder
@@ -27,8 +27,6 @@
- org.eclipse.jem.workbench.JavaEMFNature
- org.eclipse.wst.common.modulecore.ModuleCoreNature
org.eclipse.jdt.core.javanature
org.eclipse.m2e.core.maven2Nature
org.eclipse.wst.common.project.facet.core.nature
diff --git a/querydsl/pom.xml b/querydsl/pom.xml
new file mode 100644
index 0000000000..cf50144d3f
--- /dev/null
+++ b/querydsl/pom.xml
@@ -0,0 +1,188 @@
+
+
+ 4.0.0
+
+ com.baeldung
+ querydsl
+ 0.1-SNAPSHOT
+ jar
+
+ querydsl
+ http://maven.apache.org
+
+
+ UTF-8
+ 1.6
+ 4.10
+ 3.1.0.RELEASE
+ 4.3.11.Final
+ 2.5.0
+ 1.5.10
+
+
+
+
+
+ com.mysema.querydsl
+ querydsl-core
+ ${querydsl.version}
+
+
+
+ com.mysema.querydsl
+ querydsl-jpa
+ ${querydsl.version}
+
+
+
+ com.mysema.querydsl
+ querydsl-apt
+ ${querydsl.version}
+ provided
+
+
+
+
+ org.hibernate
+ hibernate-entitymanager
+ ${hibernate.version}
+ compile
+
+
+
+ org.hibernate.javax.persistence
+ hibernate-jpa-2.0-api
+ 1.0.0.Final
+ compile
+
+
+
+ commons-dbcp
+ commons-dbcp
+ 1.4
+ jar
+ compile
+
+
+
+ commons-pool
+ commons-pool
+ 1.5.5
+ jar
+ compile
+
+
+
+
+ org.hsqldb
+ hsqldb-j5
+ 2.2.4
+
+
+
+
+ org.springframework
+ spring-context
+ ${spring.version}
+
+
+
+ org.springframework
+ spring-webmvc
+ ${spring.version}
+
+
+
+ org.springframework
+ spring-orm
+ ${spring.version}
+ jar
+ compile
+
+
+
+ org.springframework
+ spring-aop
+ ${spring.version}
+
+
+
+ org.springframework
+ spring-test
+ ${spring.version}
+ jar
+ test
+
+
+
+
+ org.slf4j
+ slf4j-api
+ ${slf4j.version}
+
+
+ org.slf4j
+ jcl-over-slf4j
+ ${slf4j.version}
+ runtime
+
+
+ org.slf4j
+ slf4j-log4j12
+ ${slf4j.version}
+ runtime
+
+
+ log4j
+ log4j
+ 1.2.16
+
+
+
+
+ junit
+ junit
+ ${junit.version}
+ test
+
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 2.3.2
+
+ ${java.version}
+ ${java.version}
+ -proc:none
+
+
+
+
+
+ com.mysema.maven
+ maven-apt-plugin
+ 1.0.3
+
+
+
+ process
+
+
+ target/metamodel
+ com.mysema.query.apt.jpa.JPAAnnotationProcessor
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/querydsl/src/main/java/org/baeldung/dao/PersonDao.java b/querydsl/src/main/java/org/baeldung/dao/PersonDao.java
new file mode 100644
index 0000000000..7df4ebb22d
--- /dev/null
+++ b/querydsl/src/main/java/org/baeldung/dao/PersonDao.java
@@ -0,0 +1,22 @@
+package org.baeldung.dao;
+
+import java.util.List;
+import java.util.Map;
+
+import org.baeldung.entity.Person;
+
+public interface PersonDao {
+
+ public Person save(Person person);
+
+ public List findPersonsByFirstnameQueryDSL(String firstname);
+
+ public List findPersonsByFirstnameAndSurnameQueryDSL(String firstname, String surname);
+
+ public List findPersonsByFirstnameInDescendingOrderQueryDSL(String firstname);
+
+ public int findMaxAge();
+
+ public Map findMaxAgeByName();
+
+}
\ No newline at end of file
diff --git a/querydsl/src/main/java/org/baeldung/dao/PersonDaoImpl.java b/querydsl/src/main/java/org/baeldung/dao/PersonDaoImpl.java
new file mode 100644
index 0000000000..555ec226ce
--- /dev/null
+++ b/querydsl/src/main/java/org/baeldung/dao/PersonDaoImpl.java
@@ -0,0 +1,68 @@
+package org.baeldung.dao;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+import org.baeldung.entity.Person;
+import org.baeldung.entity.QPerson;
+import org.springframework.stereotype.Repository;
+
+import com.mysema.query.group.GroupBy;
+import com.mysema.query.jpa.impl.JPAQuery;
+
+@Repository
+public class PersonDaoImpl implements PersonDao {
+
+ @PersistenceContext
+ private EntityManager em;
+
+ @Override
+ public Person save(final Person person) {
+ em.persist(person);
+ return person;
+ }
+
+ @Override
+ public List findPersonsByFirstnameQueryDSL(final String firstname) {
+ final JPAQuery query = new JPAQuery(em);
+ final QPerson person = QPerson.person;
+
+ return query.from(person).where(person.firstname.eq(firstname)).list(person);
+ }
+
+ @Override
+ public List findPersonsByFirstnameAndSurnameQueryDSL(final String firstname, final String surname) {
+ final JPAQuery query = new JPAQuery(em);
+ final QPerson person = QPerson.person;
+
+ return query.from(person).where(person.firstname.eq(firstname).and(person.surname.eq(surname))).list(person);
+ }
+
+ @Override
+ public List findPersonsByFirstnameInDescendingOrderQueryDSL(final String firstname) {
+ final JPAQuery query = new JPAQuery(em);
+ final QPerson person = QPerson.person;
+
+ return query.from(person).where(person.firstname.eq(firstname)).orderBy(person.surname.desc()).list(person);
+ }
+
+ @Override
+ public int findMaxAge() {
+ final JPAQuery query = new JPAQuery(em);
+ final QPerson person = QPerson.person;
+
+ return query.from(person).list(person.age.max()).get(0);
+ }
+
+ @Override
+ public Map findMaxAgeByName() {
+ final JPAQuery query = new JPAQuery(em);
+ final QPerson person = QPerson.person;
+
+ return query.from(person).transform(GroupBy.groupBy(person.firstname).as(GroupBy.max(person.age)));
+ }
+
+}
\ No newline at end of file
diff --git a/querydsl/src/main/java/org/baeldung/entity/Person.java b/querydsl/src/main/java/org/baeldung/entity/Person.java
new file mode 100644
index 0000000000..6f04210d90
--- /dev/null
+++ b/querydsl/src/main/java/org/baeldung/entity/Person.java
@@ -0,0 +1,69 @@
+package org.baeldung.entity;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+@Entity
+public class Person {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ @Column
+ private String firstname;
+
+ @Column
+ private String surname;
+
+ @Column
+ private int age;
+
+ Person() {
+ }
+
+ public Person(final String firstname, final String surname) {
+ this.firstname = firstname;
+ this.surname = surname;
+ }
+
+ public Person(final String firstname, final String surname, final int age) {
+ this(firstname, surname);
+ this.age = age;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(final Long id) {
+ this.id = id;
+ }
+
+ public String getFirstname() {
+ return firstname;
+ }
+
+ public void setFirstname(final String firstname) {
+ this.firstname = firstname;
+ }
+
+ public String getSurname() {
+ return surname;
+ }
+
+ public void setSurname(final String surname) {
+ this.surname = surname;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(final int age) {
+ this.age = age;
+ }
+}
\ No newline at end of file
diff --git a/querydsl/src/main/resources/META-INF/persistence.xml b/querydsl/src/main/resources/META-INF/persistence.xml
new file mode 100644
index 0000000000..111d7933c3
--- /dev/null
+++ b/querydsl/src/main/resources/META-INF/persistence.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/querydsl/src/main/resources/log4j.xml b/querydsl/src/main/resources/log4j.xml
new file mode 100644
index 0000000000..a7f96b38a4
--- /dev/null
+++ b/querydsl/src/main/resources/log4j.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/querydsl/src/test/java/org/baeldung/dao/PersonDaoTest.java b/querydsl/src/test/java/org/baeldung/dao/PersonDaoTest.java
new file mode 100644
index 0000000000..0e5996a8c8
--- /dev/null
+++ b/querydsl/src/test/java/org/baeldung/dao/PersonDaoTest.java
@@ -0,0 +1,81 @@
+package org.baeldung.dao;
+
+import java.util.Map;
+
+import org.baeldung.entity.Person;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.transaction.TransactionConfiguration;
+import org.springframework.transaction.annotation.Transactional;
+
+import junit.framework.Assert;
+
+@ContextConfiguration("/test-context.xml")
+@RunWith(SpringJUnit4ClassRunner.class)
+@Transactional
+@TransactionConfiguration(defaultRollback = true)
+public class PersonDaoTest {
+
+ @Autowired
+ private PersonDao personDao;
+
+ //
+
+ @Test
+ public void testCreation() {
+ personDao.save(new Person("Erich", "Gamma"));
+ final Person person = new Person("Kent", "Beck");
+ personDao.save(person);
+ personDao.save(new Person("Ralph", "Johnson"));
+
+ final Person personFromDb = personDao.findPersonsByFirstnameQueryDSL("Kent").get(0);
+ Assert.assertEquals(person.getId(), personFromDb.getId());
+ }
+
+ @Test
+ public void testMultipleFilter() {
+ personDao.save(new Person("Erich", "Gamma"));
+ final Person person = personDao.save(new Person("Ralph", "Beck"));
+ final Person person2 = personDao.save(new Person("Ralph", "Johnson"));
+
+ final Person personFromDb = personDao.findPersonsByFirstnameAndSurnameQueryDSL("Ralph", "Johnson").get(0);
+ Assert.assertNotSame(person.getId(), personFromDb.getId());
+ Assert.assertEquals(person2.getId(), personFromDb.getId());
+ }
+
+ @Test
+ public void testOrdering() {
+ final Person person = personDao.save(new Person("Kent", "Gamma"));
+ personDao.save(new Person("Ralph", "Johnson"));
+ final Person person2 = personDao.save(new Person("Kent", "Zivago"));
+
+ final Person personFromDb = personDao.findPersonsByFirstnameInDescendingOrderQueryDSL("Kent").get(0);
+ Assert.assertNotSame(person.getId(), personFromDb.getId());
+ Assert.assertEquals(person2.getId(), personFromDb.getId());
+ }
+
+ @Test
+ public void testMaxAge() {
+ personDao.save(new Person("Kent", "Gamma", 20));
+ personDao.save(new Person("Ralph", "Johnson", 35));
+ personDao.save(new Person("Kent", "Zivago", 30));
+
+ final int maxAge = personDao.findMaxAge();
+ Assert.assertTrue(maxAge == 35);
+ }
+
+ @Test
+ public void testMaxAgeByName() {
+ personDao.save(new Person("Kent", "Gamma", 20));
+ personDao.save(new Person("Ralph", "Johnson", 35));
+ personDao.save(new Person("Kent", "Zivago", 30));
+
+ final Map maxAge = personDao.findMaxAgeByName();
+ Assert.assertTrue(maxAge.size() == 2);
+ Assert.assertSame(35, maxAge.get("Ralph"));
+ Assert.assertSame(30, maxAge.get("Kent"));
+ }
+}
\ No newline at end of file
diff --git a/querydsl/src/test/resources/db.properties b/querydsl/src/test/resources/db.properties
new file mode 100644
index 0000000000..efee3669ce
--- /dev/null
+++ b/querydsl/src/test/resources/db.properties
@@ -0,0 +1,6 @@
+#In memory db
+db.username=sa
+db.password=
+db.driver=org.hsqldb.jdbcDriver
+db.url=jdbc:hsqldb:mem:app-db
+db.dialect=org.hibernate.dialect.HSQLDialect
\ No newline at end of file
diff --git a/querydsl/src/test/resources/test-context.xml b/querydsl/src/test/resources/test-context.xml
new file mode 100644
index 0000000000..13d823a857
--- /dev/null
+++ b/querydsl/src/test/resources/test-context.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/querydsl/src/test/resources/test-db.xml b/querydsl/src/test/resources/test-db.xml
new file mode 100644
index 0000000000..7f85630b6b
--- /dev/null
+++ b/querydsl/src/test/resources/test-db.xml
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+ classpath:db.properties
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/raml/annotations/README.md b/raml/annotations/README.md
new file mode 100644
index 0000000000..4142b33353
--- /dev/null
+++ b/raml/annotations/README.md
@@ -0,0 +1,7 @@
+=========
+
+## Define Custom RAML
+
+
+### Relevant Articles:
+- [Define Custom RAML Properties Using Annotations](http://www.baeldung.com/raml-custom-properties-with-annotations)
diff --git a/raml/annotations/api.raml b/raml/annotations/api.raml
new file mode 100644
index 0000000000..e0123536eb
--- /dev/null
+++ b/raml/annotations/api.raml
@@ -0,0 +1,126 @@
+#%RAML 1.0
+title: API for REST Services used in the RAML tutorials on Baeldung.com
+documentation:
+ - title: Overview
+ content: |
+ This document defines the interface for the REST services
+ used in the popular RAML Tutorial series at Baeldung.com.
+ - title: Disclaimer
+ content: |
+ All names used in this definition are purely fictional.
+ Any similarities between the names used in this tutorial and those of real persons, whether living or dead, are merely coincidental.
+ - title: Copyright
+ content: Copyright 2016 by Baeldung.com. All rights reserved.
+uses:
+ mySecuritySchemes: !include libraries/securitySchemes.raml
+ myDataTypes: !include libraries/dataTypes.raml
+ myTraits: !include libraries/traits.raml
+ myResourceTypes: !include libraries/resourceTypes.raml
+version: v1
+protocols: [ HTTPS ]
+baseUri: http://rest-api.baeldung.com/api/{version}
+mediaType: application/json
+securedBy: [ mySecuritySchemes.basicAuth ]
+annotationTypes:
+ testCase:
+ allowedTargets: [ Method ]
+ allowMultiple: true
+ usage: |
+ Use this annotation to declare a test case
+ within a testSuite declaration.
+ You may apply this annotation multiple times
+ within the target testSuite.
+ properties:
+ scenario: string
+ setupScript?: string[]
+ testScript: string[]
+ expectedOutput?: string
+ cleanupScript?: string[]
+/foos:
+ type: myResourceTypes.collection
+ get:
+ queryParameters:
+ name?: string
+ ownerName?: string
+ responses:
+ 200:
+ body:
+ example: !include examples/Foos.json
+ (testCase):
+ scenario: No Foos
+ setupScript: deleteAllFoosIfAny
+ testScript: getAllFoos
+ expectedOutput: ""
+ (testCase):
+ scenario: One Foo
+ setupScript: [ deleteAllFoosIfAny, addInputFoos ]
+ testScript: getAllFoos
+ expectedOutput: '[ { "id": 999, "name": Joe } ]'
+ cleanupScript: deleteInputFoos
+ (testCase):
+ scenario: Multiple Foos
+ setupScript: [ deleteAllFoosIfAny, addInputFoos ]
+ testScript: getAllFoos
+ expectedOutput: '[ { "id": 998, "name": "Bob" }, { "id": 999, "name": "Joe", "ownerName": "Bob" } ]'
+ cleanupScript: deleteInputFoos
+ post:
+ responses:
+ 200:
+ body:
+ example: !include examples/Foo.json
+ /{fooId}:
+ type: myResourceTypes.item
+ get:
+ responses:
+ 200:
+ body:
+ example: !include examples/Foo.json
+ put:
+ responses:
+ 200:
+ body:
+ example: !include examples/Foo.json
+/foos/name/{name}:
+ get:
+ description: Get all Foos with the name {name}
+ responses:
+ 200:
+ body:
+ type: myDataTypes.Foo
+ 404:
+ body:
+ type: myDataTypes.Error
+/foos/bar/{barId}:
+ get:
+ description: Get the Foo for the Bar with barId = {barId}
+ responses:
+ 200:
+ body:
+ example: !include examples/Foo.json
+/bars:
+ type: myResourceTypes.collection
+ get:
+ queryParameters:
+ name?: string
+ ownerName?: string
+ responses:
+ 200:
+ body:
+ example: !include examples/Bars.json
+ post:
+ responses:
+ 200:
+ body:
+ example: !include examples/Bar.json
+ /{barId}:
+ type: myResourceTypes.item
+ get:
+ responses:
+ 200:
+ body:
+ example: !include examples/Bar.json
+ put:
+ responses:
+ 200:
+ body:
+ example: !include examples/Bars.json
diff --git a/raml/annotations/examples/Bar.json b/raml/annotations/examples/Bar.json
new file mode 100644
index 0000000000..0ee1b34edb
--- /dev/null
+++ b/raml/annotations/examples/Bar.json
@@ -0,0 +1,6 @@
+{
+ "id" : 1,
+ "name" : "First Bar",
+ "city" : "Austin",
+ "fooId" : 2
+}
\ No newline at end of file
diff --git a/raml/annotations/examples/Bars.json b/raml/annotations/examples/Bars.json
new file mode 100644
index 0000000000..89ea875432
--- /dev/null
+++ b/raml/annotations/examples/Bars.json
@@ -0,0 +1,19 @@
+[
+ {
+ "id" : 1,
+ "name" : "First Bar",
+ "city" : "Austin",
+ "fooId" : 2
+ },
+ {
+ "id" : 2,
+ "name" : "Second Bar",
+ "city" : "Dallas",
+ "fooId" : 1
+ },
+ {
+ "id" : 3,
+ "name" : "Third Bar",
+ "fooId" : 2
+ }
+]
\ No newline at end of file
diff --git a/raml/annotations/examples/Error.json b/raml/annotations/examples/Error.json
new file mode 100644
index 0000000000..dca56da7c2
--- /dev/null
+++ b/raml/annotations/examples/Error.json
@@ -0,0 +1,4 @@
+{
+ "message" : "Not found",
+ "code" : 1001
+}
\ No newline at end of file
diff --git a/raml/annotations/examples/Foo.json b/raml/annotations/examples/Foo.json
new file mode 100644
index 0000000000..1b1b8c891e
--- /dev/null
+++ b/raml/annotations/examples/Foo.json
@@ -0,0 +1,4 @@
+{
+ "id" : 1,
+ "name" : "First Foo"
+}
\ No newline at end of file
diff --git a/raml/annotations/examples/Foos.json b/raml/annotations/examples/Foos.json
new file mode 100644
index 0000000000..74f64689f0
--- /dev/null
+++ b/raml/annotations/examples/Foos.json
@@ -0,0 +1,16 @@
+[
+ {
+ "id" : 1,
+ "name" : "First Foo",
+ "ownerName" : "Jack Robinson"
+ },
+ {
+ "id" : 2,
+ "name" : "Second Foo"
+ },
+ {
+ "id" : 3,
+ "name" : "Third Foo",
+ "ownerName" : "Chuck Norris"
+ }
+]
\ No newline at end of file
diff --git a/raml/annotations/extensions/en_US/additionalResources.raml b/raml/annotations/extensions/en_US/additionalResources.raml
new file mode 100644
index 0000000000..9ab0d0a243
--- /dev/null
+++ b/raml/annotations/extensions/en_US/additionalResources.raml
@@ -0,0 +1,13 @@
+#%RAML 1.0 Extension
+# File located at:
+# /extensions/en_US/additionalResources.raml
+masterRef: ../../api.raml
+usage: This extension defines additional resources for version 2 of the API.
+version: v2
+/foos:
+ /bar/{barId}:
+ get:
+ description: |
+ Get the foo that is related to the bar having barId = {barId}
+ queryParameters:
+ barId?: integer
diff --git a/raml/annotations/libraries/dataTypes.raml b/raml/annotations/libraries/dataTypes.raml
new file mode 100644
index 0000000000..8a240e62dc
--- /dev/null
+++ b/raml/annotations/libraries/dataTypes.raml
@@ -0,0 +1,19 @@
+#%RAML 1.0 Library
+# This is the file /libraries/dataTypes.raml
+usage: This library defines the data types for the API
+types:
+ Foo:
+ properties:
+ id: integer
+ name: string
+ ownerName?: string
+ Bar:
+ properties:
+ id: integer
+ name: string
+ city?: string
+ fooId: integer
+ Error:
+ properties:
+ code: integer
+ message: string
diff --git a/raml/annotations/libraries/resourceTypes.raml b/raml/annotations/libraries/resourceTypes.raml
new file mode 100644
index 0000000000..fb054f1a36
--- /dev/null
+++ b/raml/annotations/libraries/resourceTypes.raml
@@ -0,0 +1,38 @@
+#%RAML 1.0 Library
+# This is the file /libraries/resourceTypes.raml
+usage: This library defines the resource types for the API
+uses:
+ myTraits: !include traits.raml
+resourceTypes:
+ collection:
+ usage: Use this resourceType to represent a collection of items
+ description: A collection of <>
+ get:
+ description: |
+ Get all <>,
+ optionally filtered
+ is: [ myTraits.hasResponseCollection ]
+ post:
+ description: |
+ Create a new <>
+ is: [ myTraits.hasRequestItem ]
+ item:
+ usage: Use this resourceType to represent any single item
+ description: A single <>
+ get:
+ description: |
+ Get a <>
+ by <>Id
+ is: [ myTraits.hasResponseItem, myTraits.hasNotFound ]
+ put:
+ description: |
+ Update a <>
+ by <>Id
+ is: [ myTraits.hasRequestItem, myTraits.hasResponseItem, myTraits.hasNotFound ]
+ delete:
+ description: |
+ Delete a <>
+ by <>Id
+ is: [ myTraits.hasNotFound ]
+ responses:
+ 204:
diff --git a/raml/annotations/libraries/securitySchemes.raml b/raml/annotations/libraries/securitySchemes.raml
new file mode 100644
index 0000000000..621c6ac975
--- /dev/null
+++ b/raml/annotations/libraries/securitySchemes.raml
@@ -0,0 +1,20 @@
+#%RAML 1.0 Library
+# This is the file /libraries/securitySchemes.raml
+securitySchemes:
+ - basicAuth:
+ description: Each request must contain the headers necessary for
+ basic authentication
+ type: Basic Authentication
+ describedBy:
+ headers:
+ Authorization:
+ description: |
+ Used to send the Base64 encoded "username:password"
+ credentials
+ type: string
+ responses:
+ 401:
+ description: |
+ Unauthorized. Either the provided username and password
+ combination is invalid, or the user is not allowed to
+ access the content provided by the requested URL.
diff --git a/raml/annotations/libraries/traits.raml b/raml/annotations/libraries/traits.raml
new file mode 100644
index 0000000000..610747e79f
--- /dev/null
+++ b/raml/annotations/libraries/traits.raml
@@ -0,0 +1,32 @@
+#%RAML 1.0 Library
+# This is the file /libraries/traits.raml
+usage: This library defines some basic traits
+uses:
+ myDataTypes: !include dataTypes.raml
+traits:
+ hasRequestItem:
+ usage: Use this trait for resources whose request body is a single item
+ body:
+ application/json:
+ type: <>
+ hasResponseItem:
+ usage: Use this trait for resources whose response body is a single item
+ responses:
+ 200:
+ body:
+ application/json:
+ type: <>
+ hasResponseCollection:
+ usage: Use this trait for resources whose response body is a collection of items
+ responses:
+ 200:
+ body:
+ application/json:
+ type: <>[]
+ hasNotFound:
+ usage: Use this trait for resources that could respond with a 404 status
+ responses:
+ 404:
+ body:
+ application/json:
+ type: myDataTypes.Error
diff --git a/raml/annotations/overlays/es_ES/additionalResources.raml b/raml/annotations/overlays/es_ES/additionalResources.raml
new file mode 100644
index 0000000000..0edd6a9231
--- /dev/null
+++ b/raml/annotations/overlays/es_ES/additionalResources.raml
@@ -0,0 +1,11 @@
+#%RAML 1.0 Overlay
+# Archivo situado en:
+# /overlays/es_ES/additionalResources.raml
+masterRef: ../../api.raml
+usage: |
+ Se trata de un español demasiado que describe los recursos adicionales
+ para la versión 1 del API.
+/foos/bar/{barId}:
+ get:
+ description: |
+ Obtener el foo que se relaciona con el bar tomando barId = {barId}
diff --git a/raml/annotations/overlays/es_ES/documentationItems.raml b/raml/annotations/overlays/es_ES/documentationItems.raml
new file mode 100644
index 0000000000..49dd46fb59
--- /dev/null
+++ b/raml/annotations/overlays/es_ES/documentationItems.raml
@@ -0,0 +1,22 @@
+#%RAML 1.0 Overlay
+# File located at (archivo situado en):
+# /overlays/es_ES/documentationItems.raml
+masterRef: ../../api.raml
+usage: |
+ To provide user documentation and other descriptive text in Spanish
+ (Para proporcionar la documentación del usuario y otro texto descriptivo en español)
+title: API para servicios REST utilizados en los tutoriales RAML en Baeldung.com
+documentation:
+ - title: Descripción general
+ content: |
+ Este documento define la interfaz para los servicios REST
+ utilizados en la popular serie de RAML Tutorial en Baeldung.com
+ - title: Renuncia
+ content: |
+ Todos los nombres usados ​​en esta definición son pura ficción.
+ Cualquier similitud entre los nombres utilizados en este tutorial
+ y los de las personas reales, ya sea vivo o muerto,
+ no son más que coincidenta.
+ - title: Derechos de autor
+ content: |
+ Derechos de autor 2016 por Baeldung.com. Todos los derechos reservados.
diff --git a/raml/modularization/README.md b/raml/modularization/README.md
new file mode 100644
index 0000000000..de0e047ea6
--- /dev/null
+++ b/raml/modularization/README.md
@@ -0,0 +1,6 @@
+=========
+
+## Modular RESTful API Modeling Language
+
+### Relevant Articles:
+- [Modular RAML Using Includes, Libraries, Overlays and Extensions](http://www.baeldung.com/modular-raml-includes-overlays-libraries-extensions)
diff --git a/rest-testing/pom.xml b/rest-testing/pom.xml
index b8fdc50a01..e159af0b77 100644
--- a/rest-testing/pom.xml
+++ b/rest-testing/pom.xml
@@ -1,6 +1,6 @@
4.0.0
- org.baeldung
+ com.baeldung
rest-testing
0.1-SNAPSHOT
@@ -66,7 +66,7 @@
org.slf4j
jcl-over-slf4j
${org.slf4j.version}
-
+ runtime
org.slf4j
@@ -137,11 +137,8 @@
-
- 4.1.5.RELEASE
-
- 2.5.5
+ 2.7.2
1.7.13
@@ -162,14 +159,14 @@
4.4.1
4.5
- 2.4.1
+ 2.9.0
- 3.3
+ 3.5.1
2.6
- 2.18.1
+ 2.19.1
2.7
- 1.4.14
+ 1.4.18
diff --git a/rest-testing/src/main/webapp/WEB-INF/api-servlet.xml b/rest-testing/src/main/webapp/WEB-INF/api-servlet.xml
deleted file mode 100644
index 4c74be8912..0000000000
--- a/rest-testing/src/main/webapp/WEB-INF/api-servlet.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/rest-testing/src/main/webapp/WEB-INF/web.xml b/rest-testing/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index 935beae648..0000000000
--- a/rest-testing/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-
- Spring MVC Application
-
-
-
- contextClass
-
- org.springframework.web.context.support.AnnotationConfigWebApplicationContext
-
-
-
- contextConfigLocation
- org.baeldung.config
-
-
-
- org.springframework.web.context.ContextLoaderListener
-
-
-
-
- api
- org.springframework.web.servlet.DispatcherServlet
- 1
-
-
- api
- /
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/resteasy/.classpath b/resteasy/.classpath
new file mode 100644
index 0000000000..3c88c332e3
--- /dev/null
+++ b/resteasy/.classpath
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resteasy/.project b/resteasy/.project
new file mode 100644
index 0000000000..7303d59739
--- /dev/null
+++ b/resteasy/.project
@@ -0,0 +1,42 @@
+
+
+ resteasy-tutorial
+
+
+
+
+
+ org.eclipse.wst.jsdt.core.javascriptValidator
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.wst.common.project.facet.core.builder
+
+
+
+
+ org.eclipse.wst.validation.validationbuilder
+
+
+
+
+ org.eclipse.m2e.core.maven2Builder
+
+
+
+
+
+ org.eclipse.jem.workbench.JavaEMFNature
+ org.eclipse.wst.common.modulecore.ModuleCoreNature
+ org.eclipse.jdt.core.javanature
+ org.eclipse.m2e.core.maven2Nature
+ org.eclipse.wst.common.project.facet.core.nature
+ org.eclipse.wst.jsdt.core.jsNature
+
+
diff --git a/resteasy/README.md b/resteasy/README.md
new file mode 100644
index 0000000000..722f1dfe93
--- /dev/null
+++ b/resteasy/README.md
@@ -0,0 +1,8 @@
+=========
+
+## A Guide to RESTEasy
+
+
+### Relevant Articles:
+- [A Guide to RESTEasy](http://www.baeldung.com/resteasy-tutorial)
+- [RESTEasy Client API](http://www.baeldung.com/resteasy-client-tutorial)
diff --git a/RestEasy Example/pom.xml b/resteasy/pom.xml
similarity index 100%
rename from RestEasy Example/pom.xml
rename to resteasy/pom.xml
diff --git a/RestEasy Example/src/main/java/com/baeldung/client/ServicesInterface.java b/resteasy/src/main/java/com/baeldung/client/ServicesInterface.java
similarity index 92%
rename from RestEasy Example/src/main/java/com/baeldung/client/ServicesInterface.java
rename to resteasy/src/main/java/com/baeldung/client/ServicesInterface.java
index 3d03c16faf..19ad0c1ec3 100644
--- a/RestEasy Example/src/main/java/com/baeldung/client/ServicesInterface.java
+++ b/resteasy/src/main/java/com/baeldung/client/ServicesInterface.java
@@ -31,6 +31,6 @@ public interface ServicesInterface {
@DELETE
@Path("/deletemovie")
- Response deleteMovie(@QueryParam("imdbId") String imdbID);
+ Response deleteMovie(@QueryParam("imdbId") String imdbId);
}
diff --git a/RestEasy Example/src/main/java/com/baeldung/model/Movie.java b/resteasy/src/main/java/com/baeldung/model/Movie.java
similarity index 100%
rename from RestEasy Example/src/main/java/com/baeldung/model/Movie.java
rename to resteasy/src/main/java/com/baeldung/model/Movie.java
diff --git a/RestEasy Example/src/main/java/com/baeldung/server/MovieCrudService.java b/resteasy/src/main/java/com/baeldung/server/MovieCrudService.java
similarity index 100%
rename from RestEasy Example/src/main/java/com/baeldung/server/MovieCrudService.java
rename to resteasy/src/main/java/com/baeldung/server/MovieCrudService.java
diff --git a/RestEasy Example/src/main/java/com/baeldung/server/RestEasyServices.java b/resteasy/src/main/java/com/baeldung/server/RestEasyServices.java
similarity index 100%
rename from RestEasy Example/src/main/java/com/baeldung/server/RestEasyServices.java
rename to resteasy/src/main/java/com/baeldung/server/RestEasyServices.java
diff --git a/RestEasy Example/src/main/webapp/WEB-INF/classes/logback.xml b/resteasy/src/main/webapp/WEB-INF/classes/logback.xml
similarity index 100%
rename from RestEasy Example/src/main/webapp/WEB-INF/classes/logback.xml
rename to resteasy/src/main/webapp/WEB-INF/classes/logback.xml
diff --git a/RestEasy Example/src/main/webapp/WEB-INF/jboss-deployment-structure.xml b/resteasy/src/main/webapp/WEB-INF/jboss-deployment-structure.xml
similarity index 100%
rename from RestEasy Example/src/main/webapp/WEB-INF/jboss-deployment-structure.xml
rename to resteasy/src/main/webapp/WEB-INF/jboss-deployment-structure.xml
diff --git a/RestEasy Example/src/main/webapp/WEB-INF/jboss-web.xml b/resteasy/src/main/webapp/WEB-INF/jboss-web.xml
similarity index 100%
rename from RestEasy Example/src/main/webapp/WEB-INF/jboss-web.xml
rename to resteasy/src/main/webapp/WEB-INF/jboss-web.xml
diff --git a/RestEasy Example/src/main/webapp/WEB-INF/web.xml b/resteasy/src/main/webapp/WEB-INF/web.xml
similarity index 100%
rename from RestEasy Example/src/main/webapp/WEB-INF/web.xml
rename to resteasy/src/main/webapp/WEB-INF/web.xml
diff --git a/resteasy/src/test/java/com/baeldung/server/RestEasyClientTest.java b/resteasy/src/test/java/com/baeldung/server/RestEasyClientTest.java
new file mode 100644
index 0000000000..ef18b0f23f
--- /dev/null
+++ b/resteasy/src/test/java/com/baeldung/server/RestEasyClientTest.java
@@ -0,0 +1,179 @@
+package com.baeldung.server;
+
+import com.baeldung.client.ServicesInterface;
+import com.baeldung.model.Movie;
+import org.apache.commons.io.IOUtils;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.codehaus.jackson.map.DeserializationConfig;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.jboss.resteasy.client.jaxrs.ResteasyClient;
+import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
+import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget;
+import org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine;
+import org.junit.Before;
+import org.junit.Test;
+import javax.naming.NamingException;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriBuilder;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.text.SimpleDateFormat;
+import java.util.List;
+import java.util.Locale;
+
+public class RestEasyClientTest {
+
+ public static final UriBuilder FULL_PATH = UriBuilder.fromPath("http://127.0.0.1:8080/RestEasyTutorial/rest");
+ Movie transformerMovie = null;
+ Movie batmanMovie = null;
+ ObjectMapper jsonMapper = null;
+
+ @Before
+ public void setup() throws ClassNotFoundException, IllegalAccessException, InstantiationException, NamingException {
+
+ jsonMapper = new ObjectMapper().configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+ jsonMapper.configure(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
+ SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.ENGLISH);
+ jsonMapper.setDateFormat(sdf);
+
+ try (InputStream inputStream = new RestEasyClientTest().getClass().getResourceAsStream("./movies/transformer.json")) {
+ String transformerMovieAsString = String.format(IOUtils.toString(inputStream, StandardCharsets.UTF_8));
+ transformerMovie = jsonMapper.readValue(transformerMovieAsString, Movie.class);
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new RuntimeException("Test is going to die ...", e);
+ }
+
+ try (InputStream inputStream = new RestEasyClientTest().getClass().getResourceAsStream("./movies/batman.json")) {
+ String batmanMovieAsString = String.format(IOUtils.toString(inputStream, StandardCharsets.UTF_8));
+ batmanMovie = jsonMapper.readValue(batmanMovieAsString, Movie.class);
+
+ } catch (Exception e) {
+ throw new RuntimeException("Test is going to die ...", e);
+ }
+ }
+
+ @Test
+ public void testListAllMovies() {
+
+ ResteasyClient client = new ResteasyClientBuilder().build();
+ ResteasyWebTarget target = client.target(FULL_PATH);
+ ServicesInterface proxy = target.proxy(ServicesInterface.class);
+
+ Response moviesResponse = proxy.addMovie(transformerMovie);
+ moviesResponse.close();
+ moviesResponse = proxy.addMovie(batmanMovie);
+ moviesResponse.close();
+
+ List movies = proxy.listMovies();
+ System.out.println(movies);
+ }
+
+ @Test
+ public void testMovieByImdbId() {
+
+ String transformerImdbId = "tt0418279";
+
+ ResteasyClient client = new ResteasyClientBuilder().build();
+ ResteasyWebTarget target = client.target(FULL_PATH);
+ ServicesInterface proxy = target.proxy(ServicesInterface.class);
+
+ Response moviesResponse = proxy.addMovie(transformerMovie);
+ moviesResponse.close();
+
+ Movie movies = proxy.movieByImdbId(transformerImdbId);
+ System.out.println(movies);
+ }
+
+ @Test
+ public void testAddMovie() {
+
+ ResteasyClient client = new ResteasyClientBuilder().build();
+ ResteasyWebTarget target = client.target(FULL_PATH);
+ ServicesInterface proxy = target.proxy(ServicesInterface.class);
+
+ Response moviesResponse = proxy.addMovie(batmanMovie);
+ moviesResponse.close();
+ moviesResponse = proxy.addMovie(transformerMovie);
+
+ if (moviesResponse.getStatus() != Response.Status.CREATED.getStatusCode()) {
+ System.out.println("Failed : HTTP error code : " + moviesResponse.getStatus());
+ }
+
+ moviesResponse.close();
+ System.out.println("Response Code: " + moviesResponse.getStatus());
+ }
+
+ @Test
+ public void testAddMovieMultiConnection() {
+
+ PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
+ CloseableHttpClient httpClient = HttpClients.custom()
+ .setConnectionManager(cm)
+ .build();
+ ApacheHttpClient4Engine engine = new ApacheHttpClient4Engine(httpClient);
+ ResteasyClient client = new ResteasyClientBuilder().httpEngine(engine).build();
+ ResteasyWebTarget target = client.target(FULL_PATH);
+ ServicesInterface proxy = target.proxy(ServicesInterface.class);
+
+ Response batmanResponse = proxy.addMovie(batmanMovie);
+ Response transformerResponse = proxy.addMovie(transformerMovie);
+
+ if (batmanResponse.getStatus() != Response.Status.CREATED.getStatusCode()) {
+ System.out.println("Batman Movie creation Failed : HTTP error code : " + batmanResponse.getStatus());
+ }
+ if (batmanResponse.getStatus() != Response.Status.CREATED.getStatusCode()) {
+ System.out.println("Batman Movie creation Failed : HTTP error code : " + batmanResponse.getStatus());
+ }
+
+ batmanResponse.close();
+ transformerResponse.close();
+ cm.close();
+
+
+
+ }
+
+ @Test
+ public void testDeleteMovie() {
+
+ ResteasyClient client = new ResteasyClientBuilder().build();
+ ResteasyWebTarget target = client.target(FULL_PATH);
+ ServicesInterface proxy = target.proxy(ServicesInterface.class);
+
+ Response moviesResponse = proxy.addMovie(batmanMovie);
+ moviesResponse.close();
+ moviesResponse = proxy.deleteMovie(batmanMovie.getImdbId());
+
+ if (moviesResponse.getStatus() != Response.Status.OK.getStatusCode()) {
+ System.out.println(moviesResponse.readEntity(String.class));
+ throw new RuntimeException("Failed : HTTP error code : " + moviesResponse.getStatus());
+ }
+
+ moviesResponse.close();
+ System.out.println("Response Code: " + moviesResponse.getStatus());
+ }
+
+ @Test
+ public void testUpdateMovie() {
+
+ ResteasyClient client = new ResteasyClientBuilder().build();
+ ResteasyWebTarget target = client.target(FULL_PATH);
+ ServicesInterface proxy = target.proxy(ServicesInterface.class);
+
+ Response moviesResponse = proxy.addMovie(batmanMovie);
+ moviesResponse.close();
+ batmanMovie.setTitle("Batman Begins");
+ moviesResponse = proxy.updateMovie(batmanMovie);
+
+ if (moviesResponse.getStatus() != Response.Status.OK.getStatusCode()) {
+ System.out.println("Failed : HTTP error code : " + moviesResponse.getStatus());
+ }
+
+ moviesResponse.close();
+ System.out.println("Response Code: " + moviesResponse.getStatus());
+ }
+
+}
\ No newline at end of file
diff --git a/resteasy/src/test/resources/com/baeldung/server/movies/batman.json b/resteasy/src/test/resources/com/baeldung/server/movies/batman.json
new file mode 100644
index 0000000000..82aaaa8f40
--- /dev/null
+++ b/resteasy/src/test/resources/com/baeldung/server/movies/batman.json
@@ -0,0 +1,4 @@
+{
+ "title": "Batman",
+ "imdbId": "tt0096895"
+}
\ No newline at end of file
diff --git a/resteasy/src/test/resources/com/baeldung/server/movies/transformer.json b/resteasy/src/test/resources/com/baeldung/server/movies/transformer.json
new file mode 100644
index 0000000000..634cefc73c
--- /dev/null
+++ b/resteasy/src/test/resources/com/baeldung/server/movies/transformer.json
@@ -0,0 +1,4 @@
+{
+ "title": "Transformers",
+ "imdbId": "tt0418279"
+}
\ No newline at end of file
diff --git a/sandbox/.externalToolBuilders/org.eclipse.wst.jsdt.core.javascriptValidator.launch b/sandbox/.externalToolBuilders/org.eclipse.wst.jsdt.core.javascriptValidator.launch
deleted file mode 100644
index 627021fb96..0000000000
--- a/sandbox/.externalToolBuilders/org.eclipse.wst.jsdt.core.javascriptValidator.launch
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/sandbox/.gitignore b/sandbox/.gitignore
deleted file mode 100644
index 83c05e60c8..0000000000
--- a/sandbox/.gitignore
+++ /dev/null
@@ -1,13 +0,0 @@
-*.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/sandbox/.settings/.jsdtscope b/sandbox/.settings/.jsdtscope
deleted file mode 100644
index 7b3f0c8b9f..0000000000
--- a/sandbox/.settings/.jsdtscope
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/sandbox/.settings/org.eclipse.jdt.core.prefs b/sandbox/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index b126d6476b..0000000000
--- a/sandbox/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,95 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
-org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
-org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
-org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
-org.eclipse.jdt.core.compiler.problem.deadCode=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=error
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=error
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
-org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=error
-org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
diff --git a/sandbox/.settings/org.eclipse.jdt.ui.prefs b/sandbox/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 471e9b0d81..0000000000
--- a/sandbox/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,55 +0,0 @@
-#Sat Jan 21 23:04:06 EET 2012
-eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_missing_override_annotations_interface_methods=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=true
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.convert_to_enhanced_for_loop=true
-sp_cleanup.correct_indentation=true
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=true
-sp_cleanup.make_local_variable_final=true
-sp_cleanup.make_parameters_final=true
-sp_cleanup.make_private_fields_final=false
-sp_cleanup.make_type_abstract_if_missing_method=false
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=false
-sp_cleanup.on_save_use_additional_actions=true
-sp_cleanup.organize_imports=true
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_trailing_whitespaces=true
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=true
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.use_blocks=false
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_this_for_non_static_field_access=true
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=true
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/sandbox/.settings/org.eclipse.m2e.core.prefs b/sandbox/.settings/org.eclipse.m2e.core.prefs
deleted file mode 100644
index f897a7f1cb..0000000000
--- a/sandbox/.settings/org.eclipse.m2e.core.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-activeProfiles=
-eclipse.preferences.version=1
-resolveWorkspaceProjects=true
-version=1
diff --git a/sandbox/.settings/org.eclipse.m2e.wtp.prefs b/sandbox/.settings/org.eclipse.m2e.wtp.prefs
deleted file mode 100644
index ef86089622..0000000000
--- a/sandbox/.settings/org.eclipse.m2e.wtp.prefs
+++ /dev/null
@@ -1,2 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.m2e.wtp.enabledProjectSpecificPrefs=false
diff --git a/sandbox/.settings/org.eclipse.wst.common.component b/sandbox/.settings/org.eclipse.wst.common.component
deleted file mode 100644
index e98377cb0f..0000000000
--- a/sandbox/.settings/org.eclipse.wst.common.component
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/sandbox/.settings/org.eclipse.wst.common.project.facet.core.xml b/sandbox/.settings/org.eclipse.wst.common.project.facet.core.xml
deleted file mode 100644
index f4ef8aa0a5..0000000000
--- a/sandbox/.settings/org.eclipse.wst.common.project.facet.core.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/sandbox/.settings/org.eclipse.wst.jsdt.ui.superType.container b/sandbox/.settings/org.eclipse.wst.jsdt.ui.superType.container
deleted file mode 100644
index 3bd5d0a480..0000000000
--- a/sandbox/.settings/org.eclipse.wst.jsdt.ui.superType.container
+++ /dev/null
@@ -1 +0,0 @@
-org.eclipse.wst.jsdt.launching.baseBrowserLibrary
\ No newline at end of file
diff --git a/sandbox/.settings/org.eclipse.wst.jsdt.ui.superType.name b/sandbox/.settings/org.eclipse.wst.jsdt.ui.superType.name
deleted file mode 100644
index 05bd71b6ec..0000000000
--- a/sandbox/.settings/org.eclipse.wst.jsdt.ui.superType.name
+++ /dev/null
@@ -1 +0,0 @@
-Window
\ No newline at end of file
diff --git a/sandbox/.settings/org.eclipse.wst.validation.prefs b/sandbox/.settings/org.eclipse.wst.validation.prefs
deleted file mode 100644
index cacf5451ae..0000000000
--- a/sandbox/.settings/org.eclipse.wst.validation.prefs
+++ /dev/null
@@ -1,14 +0,0 @@
-DELEGATES_PREFERENCE=delegateValidatorList
-USER_BUILD_PREFERENCE=enabledBuildValidatorListorg.eclipse.jst.j2ee.internal.classpathdep.ClasspathDependencyValidator;
-USER_MANUAL_PREFERENCE=enabledManualValidatorListorg.eclipse.jst.j2ee.internal.classpathdep.ClasspathDependencyValidator;
-USER_PREFERENCE=overrideGlobalPreferencestruedisableAllValidationfalseversion1.2.303.v201202090300
-eclipse.preferences.version=1
-override=true
-suspend=false
-vals/org.eclipse.jst.jsf.ui.JSFAppConfigValidator/global=FF01
-vals/org.eclipse.jst.jsp.core.JSPBatchValidator/global=FF01
-vals/org.eclipse.jst.jsp.core.JSPContentValidator/global=FF01
-vals/org.eclipse.jst.jsp.core.TLDValidator/global=FF01
-vals/org.eclipse.wst.dtd.core.dtdDTDValidator/global=FF01
-vals/org.eclipse.wst.jsdt.web.core.JsBatchValidator/global=TF02
-vf.version=3
diff --git a/sandbox/.settings/org.eclipse.wst.ws.service.policy.prefs b/sandbox/.settings/org.eclipse.wst.ws.service.policy.prefs
deleted file mode 100644
index 9cfcabe16f..0000000000
--- a/sandbox/.settings/org.eclipse.wst.ws.service.policy.prefs
+++ /dev/null
@@ -1,2 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.wst.ws.service.policy.projectEnabled=false
diff --git a/sandbox/.springBeans b/sandbox/.springBeans
deleted file mode 100644
index a79097f40d..0000000000
--- a/sandbox/.springBeans
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
- 1
-
-
-
-
-
-
- src/main/webapp/WEB-INF/api-servlet.xml
-
-
-
-
diff --git a/sandbox/README.md b/sandbox/README.md
deleted file mode 100644
index 772681ad57..0000000000
--- a/sandbox/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
-=========
-
-## Core Java Cookbooks and Examples
-
-### Relevant Articles:
-- [Immutable ArrayList in Java](http://www.baeldung.com/java-immutable-list)
-- [Java - Reading a Large File Efficiently](http://www.baeldung.com/java-read-lines-large-file)
-- [Java InputStream to String](http://www.baeldung.com/convert-input-stream-to-string)
-
diff --git a/sandbox/pom.xml b/sandbox/pom.xml
deleted file mode 100644
index 95b2df2cb3..0000000000
--- a/sandbox/pom.xml
+++ /dev/null
@@ -1,176 +0,0 @@
-
- 4.0.0
- org.baeldung
- sandbox
- 0.1-SNAPSHOT
-
- sandbox
-
-
-
-
-
-
- com.google.guava
- guava
- ${guava.version}
-
-
-
- org.apache.commons
- commons-collections4
- 4.0
-
-
-
- commons-io
- commons-io
- 2.4
-
-
-
- org.apache.commons
- commons-lang3
- ${commons-lang3.version}
-
-
-
-
-
-
-
- com.fasterxml.jackson.core
- jackson-databind
- ${jackson.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
-
-
-
- org.hamcrest
- hamcrest-core
- ${org.hamcrest.version}
- test
-
-
- org.hamcrest
- hamcrest-library
- ${org.hamcrest.version}
- test
-
-
-
- org.mockito
- mockito-core
- ${mockito.version}
- test
-
-
-
-
-
- core-java
-
-
- src/main/resources
- true
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- ${maven-compiler-plugin.version}
-
- 1.8
- 1.8
-
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- ${maven-surefire-plugin.version}
-
-
-
-
-
-
-
-
- 4.0.3.RELEASE
- 3.2.5.RELEASE
-
-
- 4.3.10.Final
- 5.1.35
-
-
- 2.5.5
-
-
- 1.7.13
- 1.1.3
-
-
- 5.1.3.Final
-
-
- 16.0.1
- 3.4
-
-
- 1.3
- 4.12
- 1.10.19
-
- 4.4.1
- 4.5
-
- 2.4.1
-
-
- 3.3
- 2.6
- 2.18.1
- 2.7
- 1.4.14
-
-
-
-
\ No newline at end of file
diff --git a/sandbox/src/main/webapp/WEB-INF/api-servlet.xml b/sandbox/src/main/webapp/WEB-INF/api-servlet.xml
deleted file mode 100644
index a675fc6d95..0000000000
--- a/sandbox/src/main/webapp/WEB-INF/api-servlet.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/sandbox/src/main/webapp/WEB-INF/web.xml b/sandbox/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index 935beae648..0000000000
--- a/sandbox/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-
- Spring MVC Application
-
-
-
- contextClass
-
- org.springframework.web.context.support.AnnotationConfigWebApplicationContext
-
-
-
- contextConfigLocation
- org.baeldung.config
-
-
-
- org.springframework.web.context.ContextLoaderListener
-
-
-
-
- api
- org.springframework.web.servlet.DispatcherServlet
- 1
-
-
- api
- /
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/sandbox/src/test/java/org/baeldung/codility/CodilityTest1.java b/sandbox/src/test/java/org/baeldung/codility/CodilityTest1.java
deleted file mode 100644
index 8bd957c51a..0000000000
--- a/sandbox/src/test/java/org/baeldung/codility/CodilityTest1.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package org.baeldung.codility;
-
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Random;
-
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-public class CodilityTest1 {
-
- @Before
- public final void before() {
- //
- }
-
- // tests
-
- @Test
- public final void whenSolutionIsCalculated1_thenCorrect() {
- final int[] A = new int[] { 1, 4, 3, 3, 1, 2 };
- final int solution = solution(A);
- Assert.assertEquals(4, solution);
- }
-
- @Test
- public final void whenSolutionIsCalculated2_thenCorrect() {
- final int[] A = new int[] { 6, 4, 4, 6 };
- final int solution = solution(A);
- Assert.assertEquals(-1, solution);
- }
-
- @Test
- public final void whenSolutionIsCalculated3_thenCorrect() {
- final int[] A = new int[100000];
- final Random random = new Random();
- for (final int index : A) {
- A[index] = random.nextInt();
- }
-
- final long start = System.currentTimeMillis();
- final int solution = solution(A);
- final long end = System.currentTimeMillis();
- System.out.println("Time: " + (end - start));
- System.out.println(solution);
- }
-
- //
-
- final int solution(final int elements[]) {
- final Map collector = new LinkedHashMap();
- Integer currentValue = null;
- for (final int element : elements) {
- currentValue = collector.get(element);
- if (currentValue == null) {
- collector.put(element, 1);
- } else if (currentValue >= 1) {
- collector.put(element, ++currentValue);
- }
- }
-
- for (final Map.Entry entry : collector.entrySet()) {
- if (entry.getValue() == 1) {
- return entry.getKey();
- }
- }
-
- return -1;
- }
-
-}
diff --git a/sandbox/src/test/java/org/baeldung/codility/CodilityTest2.java b/sandbox/src/test/java/org/baeldung/codility/CodilityTest2.java
deleted file mode 100644
index d92e9001f9..0000000000
--- a/sandbox/src/test/java/org/baeldung/codility/CodilityTest2.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package org.baeldung.codility;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-public class CodilityTest2 {
-
- // tests
-
- @Test
- public final void whenSolutionIsCalculated1_thenCorrect() {
- final int solution = solution(955);
- Assert.assertEquals(4, solution);
- }
-
- @Test
- public final void whenSolutionIsCalculated2_thenCorrect() {
- final int solution = solution(102);
- Assert.assertEquals(-1, solution);
- }
-
- @Test
- public final void whenSolutionIsCalculated3_thenCorrect() {
- final int solution = solution(2);
- Assert.assertEquals(-1, solution);
- }
-
- @Test
- public final void whenSolutionIsCalculated4_thenCorrect() {
- final int solution = solution2("codilitycodilityco");
- Assert.assertEquals(8, solution);
- }
-
- //
-
- public final int solution(final int decimal) {
- final String binaryString = Integer.toBinaryString(decimal);
- int lastPeriod = -1;
- for (int period = 1; period < (binaryString.length() / 2 + 1); period++) {
- final Matcher m = Pattern.compile("(\\S{" + period + ",})(?=.*?\\1)").matcher(binaryString);
- final boolean found = m.find();
- if (found && m.groupCount() > 0) {
- lastPeriod = period;
- }
- if (!found) {
- break;
- }
- }
-
- return lastPeriod;
- }
-
- public final int solution2(final String binaryString) {
- int lastPeriod = -1;
- for (int period = 1; period < (binaryString.length() / 2 + 1); period++) {
- final Matcher m = Pattern.compile("(\\S{" + period + ",})(?=.*?\\1)").matcher(binaryString);
- final boolean found = m.find();
- if (found && m.groupCount() > 0) {
- lastPeriod = period;
- }
- if (!found) {
- break;
- }
- }
-
- return lastPeriod;
- }
-
-}
diff --git a/sandbox/src/test/java/org/baeldung/codility/CodilityTest3.java b/sandbox/src/test/java/org/baeldung/codility/CodilityTest3.java
deleted file mode 100644
index a7067be7b0..0000000000
--- a/sandbox/src/test/java/org/baeldung/codility/CodilityTest3.java
+++ /dev/null
@@ -1,207 +0,0 @@
-package org.baeldung.codility;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-public class CodilityTest3 {
-
- // tests
-
- @Test
- public final void whenSolutionIsCalculated1_thenCorrect() {
- final int[] moves = new int[] { 1, 3, 2, 5, 4, 4, 6, 3, 2 };
- final int solution = solution(moves);
- Assert.assertEquals(7, solution);
- }
-
- //
-
- public int solution(final int[] moves) {
- final World world = new World();
- int nextMove = 0;
- for (final int move : moves) {
- switch (nextMove) {
- case 0:
- if (world.moveNorth(move)) {
- nextMove = 1;
- break;
- } else {
- return world.movesCount;
- }
- case 1:
- if (world.moveEast(move)) {
- nextMove = 2;
- break;
- } else {
- return world.movesCount;
- }
- case 2:
- if (world.moveSouth(move)) {
- nextMove = 3;
- break;
- } else {
- return world.movesCount;
- }
- case 3:
- if (world.moveWest(move)) {
- nextMove = 0;
- break;
- } else {
- return world.movesCount;
- }
- default:
- throw new IllegalStateException();
- }
- }
-
- return world.movesCount;
- }
-
-}
-
-class World {
- int movesCount = 1;
- int currentX = 0;
- int currentY = 0;
- Map minXAtY;
- Map maxXAtY;
- Map minYAtX;
- Map maxYAtX;
-
- public World() {
- minXAtY = new HashMap<>();
- maxXAtY = new HashMap<>();
- minYAtX = new HashMap<>();
- maxYAtX = new HashMap<>();
- }
-
- final boolean moveNorth(final int steps) {
- if (isMoveNorthValid(steps)) {
- storeMoveNorth(steps);
- movesCount++;
- return true;
- }
- return false;
- }
-
- final boolean moveEast(final int steps) {
- if (isMoveEastValid(steps)) {
- storeMoveEast(steps);
- movesCount++;
- return true;
- }
- return false;
- }
-
- final boolean moveSouth(final int steps) {
- if (isMoveSouthValid(steps)) {
- storeMoveSouth(steps);
- movesCount++;
- return true;
- }
- return false;
- }
-
- final boolean moveWest(final int steps) {
- if (isMoveWestValid(steps)) {
- storeMoveWest(steps);
- movesCount++;
- return true;
- }
- return false;
- }
-
- //
-
- private boolean isMoveNorthValid(final int steps) {
- int currentPosition = currentY;
- for (int i = 1; i <= steps; i++) {
- currentPosition += 1;
- if (minXAtY.get(currentPosition) != null && minXAtY.get(currentPosition) > currentX) {
- return false;
- }
- if (maxXAtY.get(currentPosition) != null && maxXAtY.get(currentPosition) < currentX) {
- return false;
- }
- }
- return true;
- }
-
- private boolean isMoveEastValid(final int steps) { //
- int currentPosition = currentX;
- for (int i = 1; i <= steps; i++) {
- currentPosition += 1;
- if (minYAtX.get(currentPosition) != null && minYAtX.get(currentPosition) < currentY) {
- return false;
- }
- if (maxYAtX.get(currentPosition) != null && maxYAtX.get(currentPosition) > currentY) {
- return false;
- }
- }
- return true;
- }
-
- private boolean isMoveSouthValid(final int steps) {
- int currentPosition = currentY;
- for (int i = 1; i <= steps; i++) {
- currentPosition -= 1;
- if (minXAtY.get(currentPosition) != null && minXAtY.get(currentPosition) < currentX) {
- return false;
- }
- if (maxXAtY.get(currentPosition) != null && maxXAtY.get(currentPosition) > currentX) {
- return false;
- }
- }
- return true;
- }
-
- private boolean isMoveWestValid(final int steps) {
- int currentPosition = currentX;
- for (int i = 1; i <= steps; i++) {
- currentPosition -= 1;
- if (minYAtX.get(currentPosition) != null && minYAtX.get(currentPosition) > currentY) {
- return false;
- }
- if (maxYAtX.get(currentPosition) != null && maxYAtX.get(currentPosition) < currentY) {
- return false;
- }
- }
- return true;
- }
-
- private void storeMoveNorth(final int steps) {
- currentY = currentY + steps;
- final Integer currentMaxYAtThisLevel = maxYAtX.get(currentX);
- if (currentMaxYAtThisLevel == null || currentMaxYAtThisLevel == null && currentMaxYAtThisLevel < currentY) {
- maxYAtX.put(currentX, currentY);
- }
- }
-
- private void storeMoveEast(final int steps) {
- currentX = currentX + steps;
- final Integer currentMaxXAtThisLevel = maxXAtY.get(currentY);
- if (currentMaxXAtThisLevel == null || currentMaxXAtThisLevel == null && currentMaxXAtThisLevel < currentX) {
- maxXAtY.put(currentY, currentX);
- }
- }
-
- private void storeMoveSouth(final int steps) {
- currentY = currentY - steps;
- final Integer currentMinYAtThisLevel = minYAtX.get(currentX);
- if (currentMinYAtThisLevel == null || currentMinYAtThisLevel == null && currentMinYAtThisLevel > currentY) {
- minYAtX.put(currentX, currentY);
- }
- }
-
- private void storeMoveWest(final int steps) {
- currentX = currentX - steps;
- final Integer currentMinXAtThisLevel = minXAtY.get(currentY);
- if (currentMinXAtThisLevel == null || currentMinXAtThisLevel == null && currentMinXAtThisLevel > currentX) {
- minXAtY.put(currentY, currentX);
- }
- }
-
-}
diff --git a/sandbox/src/test/resources/.gitignore b/sandbox/src/test/resources/.gitignore
deleted file mode 100644
index 83c05e60c8..0000000000
--- a/sandbox/src/test/resources/.gitignore
+++ /dev/null
@@ -1,13 +0,0 @@
-*.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-all/pom.xml b/spring-all/pom.xml
index 6ce8ad7196..8ff09e5e17 100644
--- a/spring-all/pom.xml
+++ b/spring-all/pom.xml
@@ -1,6 +1,6 @@
4.0.0
- org.baeldung
+ com.baeldung
spring-all
0.1-SNAPSHOT
@@ -217,14 +217,14 @@
- 4.2.4.RELEASE
- 4.0.3.RELEASE
+ 4.2.5.RELEASE
+ 4.0.4.RELEASE
3.20.0-GA
1.2
4.3.11.Final
- 5.1.37
+ 5.1.38
1.7.13
@@ -245,14 +245,14 @@
4.4.1
4.5
- 2.4.1
+ 2.9.0
- 3.3
+ 3.5.1
2.6
- 2.18.1
+ 2.19.1
2.7
- 1.4.15
+ 1.4.18
diff --git a/spring-all/src/main/java/org/baeldung/caching/config/CachingConfig.java b/spring-all/src/main/java/org/baeldung/caching/config/CachingConfig.java
index 4153ec9636..c995bca68d 100644
--- a/spring-all/src/main/java/org/baeldung/caching/config/CachingConfig.java
+++ b/spring-all/src/main/java/org/baeldung/caching/config/CachingConfig.java
@@ -2,23 +2,19 @@ package org.baeldung.caching.config;
import java.util.Arrays;
-import org.baeldung.caching.example.CustomerDataService;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.concurrent.ConcurrentMapCache;
import org.springframework.cache.support.SimpleCacheManager;
import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableCaching
+@ComponentScan("org.baeldung.caching.example")
public class CachingConfig {
- @Bean
- public CustomerDataService customerDataService() {
- return new CustomerDataService();
- }
-
@Bean
public CacheManager cacheManager() {
final SimpleCacheManager cacheManager = new SimpleCacheManager();
diff --git a/spring-all/src/main/java/org/baeldung/caching/example/AbstractService.java b/spring-all/src/main/java/org/baeldung/caching/example/AbstractService.java
new file mode 100644
index 0000000000..38b5a5a3ec
--- /dev/null
+++ b/spring-all/src/main/java/org/baeldung/caching/example/AbstractService.java
@@ -0,0 +1,76 @@
+package org.baeldung.caching.example;
+
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.CachePut;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.cache.annotation.Caching;
+
+public abstract class AbstractService {
+
+ // this method configuration is equivalent to xml configuration
+ @Cacheable(value = "addresses", key = "#customer.name")
+ public String getAddress(final Customer customer) {
+ return customer.getAddress();
+ }
+
+ /**
+ * The method returns the customer's address,
+ only it doesn't find it the cache- addresses and directory.
+ *
+ * @param customer the customer
+ * @return the address
+ */
+ @Cacheable({ "addresses", "directory" })
+ public String getAddress1(final Customer customer) {
+ return customer.getAddress();
+ }
+
+ /**
+ * The method returns the customer's address,
+ but refreshes all the entries in the cache to load new ones.
+ *
+ * @param customer the customer
+ * @return the address
+ */
+ @CacheEvict(value = "addresses", allEntries = true)
+ public String getAddress2(final Customer customer) {
+ return customer.getAddress();
+ }
+
+ /**
+ * The method returns the customer's address,
+ but not before selectively evicting the cache as per specified paramters.
+ *
+ * @param customer the customer
+ * @return the address
+ */
+ @Caching(evict = { @CacheEvict("addresses"), @CacheEvict(value = "directory", key = "#customer.name") })
+ public String getAddress3(final Customer customer) {
+ return customer.getAddress();
+ }
+
+ /**
+ * The method uses the class level cache to look up for entries.
+ *
+ * @param customer the customer
+ * @return the address
+ */
+ @Cacheable
+ // parameter not required as we have declared it using @CacheConfig
+ public String getAddress4(final Customer customer) {
+ return customer.getAddress();
+ }
+
+ /**
+ * The method selectively caches the results that meet the predefined criteria.
+ *
+ * @param customer the customer
+ * @return the address
+ */
+ @CachePut(value = "addresses", condition = "#customer.name=='Tom'")
+ // @CachePut(value = "addresses", unless = "#result.length>64")
+ public String getAddress5(final Customer customer) {
+ return customer.getAddress();
+ }
+
+}
diff --git a/spring-all/src/main/java/org/baeldung/caching/example/CustomerDataService.java b/spring-all/src/main/java/org/baeldung/caching/example/CustomerDataService.java
index fe4de5d282..1c595057a8 100644
--- a/spring-all/src/main/java/org/baeldung/caching/example/CustomerDataService.java
+++ b/spring-all/src/main/java/org/baeldung/caching/example/CustomerDataService.java
@@ -1,7 +1,5 @@
package org.baeldung.caching.example;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
@@ -13,9 +11,6 @@ import org.springframework.stereotype.Component;
@CacheConfig(cacheNames = { "addresses" })
public class CustomerDataService {
- @Autowired
- CacheManager cacheManager;
-
// this method configuration is equivalent to xml configuration
@Cacheable(value = "addresses", key = "#customer.name")
public String getAddress(final Customer customer) {
diff --git a/spring-all/src/main/java/org/baeldung/caching/example/CustomerServiceWithParent.java b/spring-all/src/main/java/org/baeldung/caching/example/CustomerServiceWithParent.java
new file mode 100644
index 0000000000..a5ded7daf9
--- /dev/null
+++ b/spring-all/src/main/java/org/baeldung/caching/example/CustomerServiceWithParent.java
@@ -0,0 +1,10 @@
+package org.baeldung.caching.example;
+
+import org.springframework.cache.annotation.CacheConfig;
+import org.springframework.stereotype.Component;
+
+@Component
+@CacheConfig(cacheNames = { "addresses" })
+public class CustomerServiceWithParent extends AbstractService {
+ //
+}
diff --git a/spring-all/src/test/java/org/baeldung/caching/test/SpringCachingBehaviorTest.java b/spring-all/src/test/java/org/baeldung/caching/test/SpringCachingBehaviorTest.java
deleted file mode 100644
index a4a3733dd8..0000000000
--- a/spring-all/src/test/java/org/baeldung/caching/test/SpringCachingBehaviorTest.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.baeldung.caching.test;
-
-import org.baeldung.caching.config.CachingConfig;
-import org.baeldung.caching.example.Customer;
-import org.baeldung.caching.example.CustomerDataService;
-import org.junit.Test;
-import org.springframework.stereotype.Component;
-import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
-
-@Component
-public class SpringCachingBehaviorTest {
-
- @Test
- public void testCaching() {
- @SuppressWarnings("resource")
- final
- // final ApplicationContext context = new ClassPathXmlApplicationContext("config.xml");
- AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
- context.register(CachingConfig.class);
- context.refresh();
- final CustomerDataService service = context.getBean(CustomerDataService.class);
-
- final Customer cust = new Customer("Tom", "67-2, Downing Street, NY");
- service.getAddress(cust);
- service.getAddress(cust);
-
- // fail("Unable to instantiate the CustomerDataService");
- }
-
-}
diff --git a/spring-all/src/test/java/org/baeldung/caching/test/SpringCachingIntegrationTest.java b/spring-all/src/test/java/org/baeldung/caching/test/SpringCachingIntegrationTest.java
new file mode 100644
index 0000000000..8c4ebaa7ec
--- /dev/null
+++ b/spring-all/src/test/java/org/baeldung/caching/test/SpringCachingIntegrationTest.java
@@ -0,0 +1,71 @@
+package org.baeldung.caching.test;
+
+import org.baeldung.caching.config.CachingConfig;
+import org.baeldung.caching.example.Customer;
+import org.baeldung.caching.example.CustomerDataService;
+import org.baeldung.caching.example.CustomerServiceWithParent;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.support.AnnotationConfigContextLoader;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = { CachingConfig.class }, loader = AnnotationConfigContextLoader.class)
+public class SpringCachingIntegrationTest {
+
+ @Autowired
+ private CustomerDataService service;
+
+ @Autowired
+ private CustomerServiceWithParent serviceWithParent;
+
+ //
+
+ @Test
+ public void whenGettingAddress_thenCorrect() {
+ final Customer cust = new Customer("Tom", "67-2, Downing Street, NY");
+ service.getAddress(cust);
+ service.getAddress(cust);
+
+ service.getAddress1(cust);
+ service.getAddress1(cust);
+
+ service.getAddress2(cust);
+ service.getAddress2(cust);
+
+ service.getAddress3(cust);
+ service.getAddress3(cust);
+
+ service.getAddress4(cust);
+ service.getAddress4(cust);
+
+ service.getAddress5(cust);
+ service.getAddress5(cust);
+ }
+
+ @Test
+ public void givenUsingServiceWithParent_whenGettingAddress_thenCorrect() {
+ final Customer cust = new Customer("Tom", "67-2, Downing Street, NY");
+
+ serviceWithParent.getAddress(cust);
+ serviceWithParent.getAddress(cust);
+
+ serviceWithParent.getAddress1(cust);
+ serviceWithParent.getAddress1(cust);
+
+ serviceWithParent.getAddress2(cust);
+ serviceWithParent.getAddress2(cust);
+
+ serviceWithParent.getAddress3(cust);
+ serviceWithParent.getAddress3(cust);
+
+ // serviceWithParent.getAddress4(cust);
+ // serviceWithParent.getAddress4(cust);
+
+ serviceWithParent.getAddress5(cust);
+ serviceWithParent.getAddress5(cust);
+ }
+
+}
diff --git a/spring-data-elasticsearch/.classpath b/spring-apache-camel/.classpath
similarity index 100%
rename from spring-data-elasticsearch/.classpath
rename to spring-apache-camel/.classpath
diff --git a/spring-apache-camel/.project b/spring-apache-camel/.project
new file mode 100644
index 0000000000..7725877f6a
--- /dev/null
+++ b/spring-apache-camel/.project
@@ -0,0 +1,29 @@
+
+
+ spring-apache-camel
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.m2e.core.maven2Builder
+
+
+
+
+ org.springframework.ide.eclipse.core.springbuilder
+
+
+
+
+
+ org.springframework.ide.eclipse.core.springnature
+ org.eclipse.jdt.core.javanature
+ org.eclipse.m2e.core.maven2Nature
+
+
diff --git a/spring-apache-camel/README.md b/spring-apache-camel/README.md
new file mode 100644
index 0000000000..4015760f7d
--- /dev/null
+++ b/spring-apache-camel/README.md
@@ -0,0 +1,33 @@
+
+Configure and Use Apache Camel with Spring
+
+This article will demonstrate how to configure and use Apache Camel with Spring Framework.
+
+Relevant Articles
+
+
+
+Framework Versions:
+
+
+ Spring 4.2.4
+ Apache Camel 2.16.1
+
+
+Build and Run Application
+
+To build this application execute following maven command in ApacheCamelFileProcessor directory.
+
+mvn clean install
+
+To run this application you can either run our main class App from your IDE or you can execute following maven command:
+
+mvn exec:java -Dexec.mainClass="App"
+
+Relevant Articles on Baeldung
+
diff --git a/spring-apache-camel/pom.xml b/spring-apache-camel/pom.xml
new file mode 100644
index 0000000000..fbea9b779d
--- /dev/null
+++ b/spring-apache-camel/pom.xml
@@ -0,0 +1,67 @@
+
+ 4.0.0
+ org.apache.camel
+ spring-apache-camel
+ jar
+ 1.0-SNAPSHOT
+ spring-apache-camel
+ http://maven.apache.org
+
+
+ 2.16.1
+ 4.2.4.RELEASE
+ 1.7
+ 4.1
+
+
+
+
+
+ junit
+ junit
+ ${junit.version}
+ test
+
+
+
+ org.apache.camel
+ camel-core
+ ${env.camel.version}
+
+
+
+ org.apache.camel
+ camel-spring
+ ${env.camel.version}
+
+
+
+ org.apache.camel
+ camel-stream
+ ${env.camel.version}
+
+
+
+ org.springframework
+ spring-context
+ ${env.spring.version}
+
+
+
+
+
+
+
+ maven-compiler-plugin
+
+ true
+ true
+ ${java.version}
+ ${java.version}
+ ${java.version}
+
+
+
+
+
diff --git a/spring-apache-camel/src/main/java/com/baeldung/camel/main/App.java b/spring-apache-camel/src/main/java/com/baeldung/camel/main/App.java
new file mode 100644
index 0000000000..ac0605a215
--- /dev/null
+++ b/spring-apache-camel/src/main/java/com/baeldung/camel/main/App.java
@@ -0,0 +1,12 @@
+package com.baeldung.camel.main;
+
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+public class App {
+ public static void main(final String[] args) throws Exception {
+ ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("camel-context.xml");
+ // Keep main thread alive for some time to let application finish processing the input files.
+ Thread.sleep(5000);
+ applicationContext.close();
+ }
+}
\ No newline at end of file
diff --git a/spring-apache-camel/src/main/java/com/baeldung/camel/processor/FileProcessor.java b/spring-apache-camel/src/main/java/com/baeldung/camel/processor/FileProcessor.java
new file mode 100644
index 0000000000..971dd206cd
--- /dev/null
+++ b/spring-apache-camel/src/main/java/com/baeldung/camel/processor/FileProcessor.java
@@ -0,0 +1,14 @@
+package com.baeldung.camel.processor;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+
+public class FileProcessor implements Processor {
+
+ public void process(Exchange exchange) throws Exception {
+ String originalFileContent = exchange.getIn().getBody(String.class);
+ String upperCaseFileContent = originalFileContent.toUpperCase();
+ exchange.getIn().setBody(upperCaseFileContent);
+ }
+
+}
diff --git a/spring-apache-camel/src/main/resources/camel-context.xml b/spring-apache-camel/src/main/resources/camel-context.xml
new file mode 100644
index 0000000000..0c10e0ecef
--- /dev/null
+++ b/spring-apache-camel/src/main/resources/camel-context.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${body.toLowerCase()}
+
+
+
+
+
+
+
+ .......... File content conversion completed ..........
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-apache-camel/src/test/data/sampleInputFile/file.txt b/spring-apache-camel/src/test/data/sampleInputFile/file.txt
new file mode 100644
index 0000000000..e057427864
--- /dev/null
+++ b/spring-apache-camel/src/test/data/sampleInputFile/file.txt
@@ -0,0 +1 @@
+This is data that will be processed by a Camel route!
\ No newline at end of file
diff --git a/spring-apache-camel/src/test/java/org/apache/camel/main/AppTest.java b/spring-apache-camel/src/test/java/org/apache/camel/main/AppTest.java
new file mode 100644
index 0000000000..87b20369f3
--- /dev/null
+++ b/spring-apache-camel/src/test/java/org/apache/camel/main/AppTest.java
@@ -0,0 +1,117 @@
+package org.apache.camel.main;
+
+import com.baeldung.camel.main.App;
+import junit.framework.TestCase;
+import org.apache.camel.util.FileUtil;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.channels.FileChannel;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+public class AppTest extends TestCase {
+
+ private static final String FILE_NAME = "file.txt";
+ private static final String SAMPLE_INPUT_DIR = "src/test/data/sampleInputFile/";
+ private static final String TEST_INPUT_DIR = "src/test/data/input/";
+ private static final String UPPERCASE_OUTPUT_DIR = "src/test/data/outputUpperCase/";
+ private static final String LOWERCASE_OUTPUT_DIR = "src/test/data/outputLowerCase/";
+
+ @Before
+ public void setUp() throws Exception {
+ // Prepare input file for test
+ copySampleFileToInputDirectory();
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ System.out.println("Deleting the test input and output files...");
+ deleteFile(TEST_INPUT_DIR);
+ deleteFile(LOWERCASE_OUTPUT_DIR);
+ deleteFile(UPPERCASE_OUTPUT_DIR);
+ }
+
+ @Test
+ public final void testMain() throws Exception {
+ App.main(null);
+
+ String inputFileContent = readFileContent(SAMPLE_INPUT_DIR + FILE_NAME);
+ String outputUpperCase = readFileContent(UPPERCASE_OUTPUT_DIR + FILE_NAME);
+ String outputLowerCase = readFileContent(LOWERCASE_OUTPUT_DIR + FILE_NAME);
+
+ System.out.println("Input File content = [" + inputFileContent + "]");
+ System.out.println("UpperCaseOutput file content = [" + outputUpperCase + "]");
+ System.out.println("LowerCaseOtput file content = [" + outputLowerCase + "]");
+
+ assertEquals(inputFileContent.toUpperCase(), outputUpperCase);
+ assertEquals(inputFileContent.toLowerCase(), outputLowerCase);
+ }
+
+ private String readFileContent(String path) throws IOException {
+ byte[] encoded = Files.readAllBytes(Paths.get(path));
+ return new String(encoded);
+ }
+
+ private void deleteFile(String path) {
+ try {
+ FileUtil.removeDir(new File(path));
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * Copy sample input file to input directory.
+ */
+ private void copySampleFileToInputDirectory() {
+ File sourceFile = new File(SAMPLE_INPUT_DIR + FILE_NAME);
+ File destFile = new File(TEST_INPUT_DIR + FILE_NAME);
+
+ if (!sourceFile.exists()) {
+ System.out.println("Sample input file not found at location = [" + SAMPLE_INPUT_DIR + FILE_NAME + "]. Please provide this file.");
+ }
+
+ if (!destFile.exists()) {
+ try {
+ System.out.println("Creating input file = [" + TEST_INPUT_DIR + FILE_NAME + "]");
+
+ File destDir = new File(TEST_INPUT_DIR);
+ if (!destDir.exists()) {
+ destDir.mkdir();
+ }
+ destFile.createNewFile();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ FileChannel source = null;
+ FileChannel destination = null;
+
+ try {
+ source = new FileInputStream(sourceFile).getChannel();
+ destination = new FileOutputStream(destFile).getChannel();
+ if (destination != null && source != null) {
+ destination.transferFrom(source, 0, source.size());
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ source.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ try {
+ destination.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+}
diff --git a/spring-batch/pom.xml b/spring-batch/pom.xml
index c85aeff6f3..5538dd912f 100644
--- a/spring-batch/pom.xml
+++ b/spring-batch/pom.xml
@@ -1,7 +1,7 @@
4.0.0
- org.baeldung
+ com.baeldung
spring-batch
0.1-SNAPSHOT
jar
diff --git a/spring-boot/pom.xml b/spring-boot/pom.xml
index 3a116a2974..d0a66197bf 100644
--- a/spring-boot/pom.xml
+++ b/spring-boot/pom.xml
@@ -1,6 +1,6 @@
4.0.0
- org.baeldung
+ com.baeldung
spring-boot
0.0.1-SNAPSHOT
war
@@ -11,7 +11,7 @@
org.springframework.boot
spring-boot-starter-parent
- 1.2.6.RELEASE
+ 1.3.3.RELEASE
diff --git a/spring-data-cassandra/pom.xml b/spring-data-cassandra/pom.xml
index 7e21859b5d..e5f8779942 100644
--- a/spring-data-cassandra/pom.xml
+++ b/spring-data-cassandra/pom.xml
@@ -2,7 +2,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- org.baeldung
+ com.baeldung
spring-data-cassandra
0.0.1-SNAPSHOT
jar
@@ -12,7 +12,7 @@
UTF-8
- 4.2.3.RELEASE
+ 4.2.5.RELEASE
1.3.2.RELEASE
diff --git a/spring-data-couchbase-2/.classpath b/spring-data-couchbase-2/.classpath
new file mode 100644
index 0000000000..f4c34adf1f
--- /dev/null
+++ b/spring-data-couchbase-2/.classpath
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/spring-data-couchbase-2/.project b/spring-data-couchbase-2/.project
new file mode 100644
index 0000000000..1690ad8ce2
--- /dev/null
+++ b/spring-data-couchbase-2/.project
@@ -0,0 +1,30 @@
+
+
+ spring-data-couchbase-2
+ This project is a simple template for a jar utility using Spring.
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.springframework.ide.eclipse.core.springbuilder
+
+
+
+
+ org.eclipse.m2e.core.maven2Builder
+
+
+
+
+
+ org.springframework.ide.eclipse.core.springnature
+ org.eclipse.jdt.core.javanature
+ org.eclipse.m2e.core.maven2Nature
+
+
diff --git a/spring-security-login-and-registration/.springBeans b/spring-data-couchbase-2/.springBeans
similarity index 52%
rename from spring-security-login-and-registration/.springBeans
rename to spring-data-couchbase-2/.springBeans
index 8096aa036b..0c014a97b6 100644
--- a/spring-security-login-and-registration/.springBeans
+++ b/spring-data-couchbase-2/.springBeans
@@ -1,15 +1,20 @@
1
-
+
-
-
+
+
+ true
+ false
+
+
+
diff --git a/spring-data-couchbase-2/README.md b/spring-data-couchbase-2/README.md
new file mode 100644
index 0000000000..e58e37e090
--- /dev/null
+++ b/spring-data-couchbase-2/README.md
@@ -0,0 +1,35 @@
+## Spring Data Couchbase Tutorial Project
+
+### Relevant Articles:
+- [Spring Data Couchbase](http://www.baeldung.com/spring-data-couchbase)
+
+### Overview
+This Maven project contains the Java code for Spring Data Couchbase
+entities, repositories, and template-based services
+as described in the tutorial, as well as a unit test
+for each service implementation.
+
+### Working with the Code
+The project was developed and tested using Java 7 nad 8 in the Eclipse-based
+Spring Source Toolkit (STS) and therefore should run fine in any
+recent version of Eclipse or another IDE of your choice
+that supports Java 7 or later.
+
+### Building the Project
+You can also build the project using Maven outside of any IDE:
+```
+mvn clean install
+```
+
+### Running the tests
+There are three test classes in src/test/java in the package
+org.baeldung.spring.data.couchbase.service:
+- PersonServiceTest (abstract)
+- PersonRepositoryTest (concrete)
+- PersonTemplateServiceTest (concrete)
+
+The latter two may be run as JUnit tests from your IDE
+or using the Maven command line:
+```
+mvn test
+```
diff --git a/spring-data-couchbase-2/pom.xml b/spring-data-couchbase-2/pom.xml
new file mode 100644
index 0000000000..93b3dbddb4
--- /dev/null
+++ b/spring-data-couchbase-2/pom.xml
@@ -0,0 +1,105 @@
+
+ 4.0.0
+ org.baeldung
+ spring-data-couchbase-2
+ 0.1-SNAPSHOT
+ spring-data-couchbase-2
+ jar
+
+
+
+
+
+ org.springframework
+ spring-context
+ ${spring-framework.version}
+
+
+ org.springframework
+ spring-context-support
+ ${spring-framework.version}
+
+
+ org.springframework.data
+ spring-data-couchbase
+ ${spring-data-couchbase.version}
+
+
+
+
+ org.hibernate
+ hibernate-validator
+ ${hibernate-validator.version}
+
+
+
+ joda-time
+ joda-time
+ ${joda-time.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
+
+
+
+
+
+
+ maven-compiler-plugin
+ 2.3.2
+
+ 1.7
+ 1.7
+
+
+
+
+
+
+ 1.7
+ UTF-8
+ 4.2.4.RELEASE
+ 2.0.0.RELEASE
+ 5.2.4.Final
+ 2.9.2
+ 1.1.3
+ 1.7.12
+ 4.11
+
+
+
+
diff --git a/spring-data-couchbase-2/src/main/java/org/baeldung/spring/data/couchbase/MyCouchbaseConfig.java b/spring-data-couchbase-2/src/main/java/org/baeldung/spring/data/couchbase/MyCouchbaseConfig.java
new file mode 100644
index 0000000000..5c0b1a93ca
--- /dev/null
+++ b/spring-data-couchbase-2/src/main/java/org/baeldung/spring/data/couchbase/MyCouchbaseConfig.java
@@ -0,0 +1,32 @@
+package org.baeldung.spring.data.couchbase;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.couchbase.config.AbstractCouchbaseConfiguration;
+import org.springframework.data.couchbase.repository.config.EnableCouchbaseRepositories;
+
+@Configuration
+@EnableCouchbaseRepositories(basePackages={"org.baeldung.spring.data.couchbase"})
+public class MyCouchbaseConfig extends AbstractCouchbaseConfiguration {
+
+ public static final List NODE_LIST = Arrays.asList("localhost");
+ public static final String BUCKET_NAME = "baeldung";
+ public static final String BUCKET_PASSWORD = "";
+
+ @Override
+ protected List getBootstrapHosts() {
+ return NODE_LIST;
+ }
+
+ @Override
+ protected String getBucketName() {
+ return BUCKET_NAME;
+ }
+
+ @Override
+ protected String getBucketPassword() {
+ return BUCKET_PASSWORD;
+ }
+}
diff --git a/spring-data-couchbase-2/src/main/java/org/baeldung/spring/data/couchbase/model/Person.java b/spring-data-couchbase-2/src/main/java/org/baeldung/spring/data/couchbase/model/Person.java
new file mode 100644
index 0000000000..9220e157ed
--- /dev/null
+++ b/spring-data-couchbase-2/src/main/java/org/baeldung/spring/data/couchbase/model/Person.java
@@ -0,0 +1,87 @@
+package org.baeldung.spring.data.couchbase.model;
+
+import javax.validation.constraints.NotNull;
+
+import org.joda.time.DateTime;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.couchbase.core.mapping.Document;
+
+import com.couchbase.client.java.repository.annotation.Field;
+
+@Document
+public class Person {
+
+ @Id
+ private String id;
+ @Field
+ @NotNull
+ private String firstName;
+ @Field
+ @NotNull
+ private String lastName;
+ @Field
+ @NotNull
+ private DateTime created;
+ @Field
+ private DateTime updated;
+
+ public Person(String id, String firstName, String lastName) {
+ this.id = id;
+ this.firstName = firstName;
+ this.lastName = lastName;
+ }
+
+ 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 DateTime getCreated() {
+ return created;
+ }
+ public void setCreated(DateTime created) {
+ this.created = created;
+ }
+ public DateTime getUpdated() {
+ return updated;
+ }
+ public void setUpdated(DateTime updated) {
+ this.updated = updated;
+ }
+
+ @Override
+ public int hashCode() {
+ int hash = 1;
+ if(id != null) {
+ hash = hash * 31 + id.hashCode();
+ }
+ if(firstName != null) {
+ hash = hash * 31 + firstName.hashCode();
+ }
+ if(lastName != null) {
+ hash = hash * 31 + lastName.hashCode();
+ }
+ return hash;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if((obj == null) || (obj.getClass() != this.getClass())) return false;
+ if(obj == this) return true;
+ Person other = (Person) obj;
+ return this.hashCode() == other.hashCode();
+ }
+}
diff --git a/spring-data-couchbase-2/src/main/java/org/baeldung/spring/data/couchbase/repos/PersonRepository.java b/spring-data-couchbase-2/src/main/java/org/baeldung/spring/data/couchbase/repos/PersonRepository.java
new file mode 100644
index 0000000000..14b77759e3
--- /dev/null
+++ b/spring-data-couchbase-2/src/main/java/org/baeldung/spring/data/couchbase/repos/PersonRepository.java
@@ -0,0 +1,11 @@
+package org.baeldung.spring.data.couchbase.repos;
+
+import java.util.List;
+
+import org.baeldung.spring.data.couchbase.model.Person;
+import org.springframework.data.repository.CrudRepository;
+
+public interface PersonRepository extends CrudRepository {
+ List findByFirstName(String firstName);
+ List findByLastName(String lastName);
+}
diff --git a/spring-data-couchbase-2/src/main/java/org/baeldung/spring/data/couchbase/service/PersonRepositoryService.java b/spring-data-couchbase-2/src/main/java/org/baeldung/spring/data/couchbase/service/PersonRepositoryService.java
new file mode 100644
index 0000000000..90cc36780a
--- /dev/null
+++ b/spring-data-couchbase-2/src/main/java/org/baeldung/spring/data/couchbase/service/PersonRepositoryService.java
@@ -0,0 +1,58 @@
+package org.baeldung.spring.data.couchbase.service;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.baeldung.spring.data.couchbase.model.Person;
+import org.baeldung.spring.data.couchbase.repos.PersonRepository;
+import org.joda.time.DateTime;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Service;
+
+@Service
+@Qualifier("PersonRepositoryService")
+public class PersonRepositoryService implements PersonService {
+
+ private PersonRepository repo;
+ @Autowired
+ public void setPersonRepository(PersonRepository repo) {
+ this.repo = repo;
+ }
+
+ public Person findOne(String id) {
+ return repo.findOne(id);
+ }
+
+ public List findAll() {
+ List people = new ArrayList();
+ Iterator it = repo.findAll().iterator();
+ while(it.hasNext()) {
+ people.add(it.next());
+ }
+ return people;
+ }
+
+ public List findByFirstName(String firstName) {
+ return repo.findByFirstName(firstName);
+ }
+
+ public List findByLastName(String lastName) {
+ return repo.findByLastName(lastName);
+ }
+
+ public void create(Person person) {
+ person.setCreated(DateTime.now());
+ repo.save(person);
+ }
+
+ public void update(Person person) {
+ person.setUpdated(DateTime.now());
+ repo.save(person);
+ }
+
+ public void delete(Person person) {
+ repo.delete(person);
+ }
+}
diff --git a/spring-data-couchbase-2/src/main/java/org/baeldung/spring/data/couchbase/service/PersonService.java b/spring-data-couchbase-2/src/main/java/org/baeldung/spring/data/couchbase/service/PersonService.java
new file mode 100644
index 0000000000..a823908b01
--- /dev/null
+++ b/spring-data-couchbase-2/src/main/java/org/baeldung/spring/data/couchbase/service/PersonService.java
@@ -0,0 +1,22 @@
+package org.baeldung.spring.data.couchbase.service;
+
+import java.util.List;
+
+import org.baeldung.spring.data.couchbase.model.Person;
+
+public interface PersonService {
+
+ Person findOne(String id);
+
+ List findAll();
+
+ List findByFirstName(String firstName);
+
+ List findByLastName(String lastName);
+
+ void create(Person person);
+
+ void update(Person person);
+
+ void delete(Person person);
+}
diff --git a/spring-data-couchbase-2/src/main/java/org/baeldung/spring/data/couchbase/service/PersonTemplateService.java b/spring-data-couchbase-2/src/main/java/org/baeldung/spring/data/couchbase/service/PersonTemplateService.java
new file mode 100644
index 0000000000..45e9b90a19
--- /dev/null
+++ b/spring-data-couchbase-2/src/main/java/org/baeldung/spring/data/couchbase/service/PersonTemplateService.java
@@ -0,0 +1,55 @@
+package org.baeldung.spring.data.couchbase.service;
+
+import java.util.List;
+
+import org.baeldung.spring.data.couchbase.model.Person;
+import org.joda.time.DateTime;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.couchbase.core.CouchbaseTemplate;
+import org.springframework.stereotype.Service;
+
+import com.couchbase.client.java.view.ViewQuery;
+
+@Service
+@Qualifier("PersonTemplateService")
+public class PersonTemplateService implements PersonService {
+
+ private static final String DESIGN_DOC = "person";
+
+ private CouchbaseTemplate template;
+ @Autowired
+ public void setCouchbaseTemplate(CouchbaseTemplate template) {
+ this.template = template;
+ }
+
+ public Person findOne(String id) {
+ return template.findById(id, Person.class);
+ }
+
+ public List findAll() {
+ return template.findByView(ViewQuery.from(DESIGN_DOC, "all"), Person.class);
+ }
+
+ public List findByFirstName(String firstName) {
+ return template.findByView(ViewQuery.from(DESIGN_DOC, "byFirstName"), Person.class);
+ }
+
+ public List findByLastName(String lastName) {
+ return template.findByView(ViewQuery.from(DESIGN_DOC, "byLastName"), Person.class);
+ }
+
+ public void create(Person person) {
+ person.setCreated(DateTime.now());
+ template.insert(person);
+ }
+
+ public void update(Person person) {
+ person.setUpdated(DateTime.now());
+ template.update(person);
+ }
+
+ public void delete(Person person) {
+ template.remove(person);
+ }
+}
diff --git a/sandbox/src/main/resources/logback.xml b/spring-data-couchbase-2/src/main/resources/logback.xml
similarity index 72%
rename from sandbox/src/main/resources/logback.xml
rename to spring-data-couchbase-2/src/main/resources/logback.xml
index 62d0ea5037..d9067fd1da 100644
--- a/sandbox/src/main/resources/logback.xml
+++ b/spring-data-couchbase-2/src/main/resources/logback.xml
@@ -7,7 +7,8 @@
-
+
+
diff --git a/spring-data-couchbase-2/src/site/site.xml b/spring-data-couchbase-2/src/site/site.xml
new file mode 100644
index 0000000000..dda96feecd
--- /dev/null
+++ b/spring-data-couchbase-2/src/site/site.xml
@@ -0,0 +1,25 @@
+
+
+
+
+ Spring Sample: ${project.name}
+ index.html
+
+
+
+ org.springframework.maven.skins
+ maven-spring-skin
+ 1.0.5
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/IntegrationTest.java b/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/IntegrationTest.java
new file mode 100644
index 0000000000..ce2daa92cd
--- /dev/null
+++ b/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/IntegrationTest.java
@@ -0,0 +1,13 @@
+package org.baeldung.spring.data.couchbase;
+
+import org.junit.runner.RunWith;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.TestExecutionListeners;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = { MyCouchbaseConfig.class, IntegrationTestConfig.class })
+@TestExecutionListeners(listeners = { DependencyInjectionTestExecutionListener.class })
+public abstract class IntegrationTest {
+}
diff --git a/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/IntegrationTestConfig.java b/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/IntegrationTestConfig.java
new file mode 100644
index 0000000000..6f040c34db
--- /dev/null
+++ b/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/IntegrationTestConfig.java
@@ -0,0 +1,9 @@
+package org.baeldung.spring.data.couchbase;
+
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ComponentScan(basePackages = "org.baeldung.spring.data.couchbase")
+public class IntegrationTestConfig {
+}
diff --git a/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/TestCouchbaseConfig.java b/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/TestCouchbaseConfig.java
new file mode 100644
index 0000000000..4edfb165bf
--- /dev/null
+++ b/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/TestCouchbaseConfig.java
@@ -0,0 +1,11 @@
+package org.baeldung.spring.data.couchbase;
+
+import org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter;
+
+public class TestCouchbaseConfig extends MyCouchbaseConfig {
+
+ @Override
+ public String typeKey() {
+ return MappingCouchbaseConverter.TYPEKEY_SYNCGATEWAY_COMPATIBLE;
+ }
+}
diff --git a/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/PersonRepositoryServiceTest.java b/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/PersonRepositoryServiceTest.java
new file mode 100644
index 0000000000..ce5cf7667d
--- /dev/null
+++ b/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/PersonRepositoryServiceTest.java
@@ -0,0 +1,13 @@
+package org.baeldung.spring.data.couchbase.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+
+public class PersonRepositoryServiceTest extends PersonServiceTest {
+
+ @Autowired
+ @Qualifier("PersonRepositoryService")
+ public void setPersonService(PersonService service) {
+ this.personService = service;
+ }
+}
diff --git a/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/PersonServiceTest.java b/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/PersonServiceTest.java
new file mode 100644
index 0000000000..bedae26e00
--- /dev/null
+++ b/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/PersonServiceTest.java
@@ -0,0 +1,126 @@
+package org.baeldung.spring.data.couchbase.service;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
+
+import org.baeldung.spring.data.couchbase.IntegrationTest;
+import org.baeldung.spring.data.couchbase.MyCouchbaseConfig;
+import org.baeldung.spring.data.couchbase.model.Person;
+import org.joda.time.DateTime;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.couchbase.client.java.Bucket;
+import com.couchbase.client.java.Cluster;
+import com.couchbase.client.java.CouchbaseCluster;
+import com.couchbase.client.java.document.JsonDocument;
+import com.couchbase.client.java.document.json.JsonObject;
+
+public abstract class PersonServiceTest extends IntegrationTest {
+
+ static final String typeField = "_class";
+ static final String john = "John";
+ static final String smith = "Smith";
+ static final String johnSmithId = "person:" + john + ":" + smith;
+ static final Person johnSmith = new Person(johnSmithId, john, smith);
+ static final JsonObject jsonJohnSmith = JsonObject.empty()
+ .put(typeField, Person.class.getName())
+ .put("firstName", john)
+ .put("lastName", smith)
+ .put("created", DateTime.now().getMillis());
+
+ static final String foo = "Foo";
+ static final String bar = "Bar";
+ static final String foobarId = "person:" + foo + ":" + bar;
+ static final Person foobar = new Person(foobarId, foo, bar);
+ static final JsonObject jsonFooBar = JsonObject.empty()
+ .put(typeField, Person.class.getName())
+ .put("firstName", foo)
+ .put("lastName", bar)
+ .put("created", DateTime.now().getMillis());
+
+ PersonService personService;
+
+ @BeforeClass
+ public static void setupBeforeClass() {
+ Cluster cluster = CouchbaseCluster.create(MyCouchbaseConfig.NODE_LIST);
+ Bucket bucket = cluster.openBucket(MyCouchbaseConfig.BUCKET_NAME, MyCouchbaseConfig.BUCKET_PASSWORD);
+ bucket.upsert(JsonDocument.create(johnSmithId, jsonJohnSmith));
+ bucket.upsert(JsonDocument.create(foobarId, jsonFooBar));
+ bucket.close();
+ cluster.disconnect();
+ }
+
+ @Test
+ public void whenFindingPersonByJohnSmithId_thenReturnsJohnSmith() {
+ Person actualPerson = personService.findOne(johnSmithId);
+ assertNotNull(actualPerson);
+ assertNotNull(actualPerson.getCreated());
+ assertEquals(johnSmith, actualPerson);
+ }
+
+ @Test
+ public void whenFindingAllPersons_thenReturnsTwoOrMorePersonsIncludingJohnSmithAndFooBar() {
+ List resultList = personService.findAll();
+ assertNotNull(resultList);
+ assertFalse(resultList.isEmpty());
+ assertTrue(resultContains(resultList, johnSmith));
+ assertTrue(resultContains(resultList, foobar));
+ assertTrue(resultList.size() >= 2);
+ }
+
+ @Test
+ public void whenFindingByFirstNameJohn_thenReturnsOnlyPersonsNamedJohn() {
+ String expectedFirstName = john;
+ List resultList = personService.findByFirstName(expectedFirstName);
+ assertNotNull(resultList);
+ assertFalse(resultList.isEmpty());
+ assertTrue(allResultsContainExpectedFirstName(resultList, expectedFirstName));
+ }
+
+ @Test
+ public void whenFindingByLastNameSmith_thenReturnsOnlyPersonsNamedSmith() {
+ String expectedLastName = smith;
+ List resultList = personService.findByLastName(expectedLastName);
+ assertNotNull(resultList);
+ assertFalse(resultList.isEmpty());
+ assertTrue(allResultsContainExpectedLastName(resultList, expectedLastName));
+ }
+
+ private boolean resultContains(List resultList, Person person) {
+ boolean found = false;
+ for(Person p : resultList) {
+ if(p.equals(person)) {
+ found = true;
+ break;
+ }
+ }
+ return found;
+ }
+
+ private boolean allResultsContainExpectedFirstName(List resultList, String firstName) {
+ boolean found = false;
+ for(Person p : resultList) {
+ if(p.getFirstName().equals(firstName)) {
+ found = true;
+ break;
+ }
+ }
+ return found;
+ }
+
+ private boolean allResultsContainExpectedLastName(List resultList, String lastName) {
+ boolean found = false;
+ for(Person p : resultList) {
+ if(p.getLastName().equals(lastName)) {
+ found = true;
+ break;
+ }
+ }
+ return found;
+ }
+}
diff --git a/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/PersonTemplateServiceTest.java b/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/PersonTemplateServiceTest.java
new file mode 100644
index 0000000000..0238fa21fb
--- /dev/null
+++ b/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/PersonTemplateServiceTest.java
@@ -0,0 +1,13 @@
+package org.baeldung.spring.data.couchbase.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+
+public class PersonTemplateServiceTest extends PersonServiceTest {
+
+ @Autowired
+ @Qualifier("PersonTemplateService")
+ public void setPersonService(PersonService service) {
+ this.personService = service;
+ }
+}
diff --git a/spring-data-couchbase-2/src/test/resources/logback.xml b/spring-data-couchbase-2/src/test/resources/logback.xml
new file mode 100644
index 0000000000..d9067fd1da
--- /dev/null
+++ b/spring-data-couchbase-2/src/test/resources/logback.xml
@@ -0,0 +1,17 @@
+
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-data-elasticsearch/README.md b/spring-data-elasticsearch/README.md
index 0dae92e0e7..74d9e4f642 100644
--- a/spring-data-elasticsearch/README.md
+++ b/spring-data-elasticsearch/README.md
@@ -1,4 +1,5 @@
## Spring Data Elasticsearch
+- [Introduction to Spring Data Elasticsearch](http://www.baeldung.com/spring-data-elasticsearch-tutorial)
### Build the Project with Tests Running
```
diff --git a/spring-data-elasticsearch/pom.xml b/spring-data-elasticsearch/pom.xml
index 7ac6dd0fcf..27fb521dbc 100644
--- a/spring-data-elasticsearch/pom.xml
+++ b/spring-data-elasticsearch/pom.xml
@@ -2,7 +2,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- org.baeldung
+ com.baeldung
spring-data-elasticsearch
0.0.1-SNAPSHOT
jar
@@ -11,8 +11,10 @@
UTF-8
- 1.3.2.RELEASE
- 4.2.2.RELEASE
+
+ 1.3.2.RELEASE
+ 4.2.5.RELEASE
+
4.11
1.7.12
1.1.3
diff --git a/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/config/Config.java b/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/config/Config.java
index 78e4083a28..3857056b70 100644
--- a/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/config/Config.java
+++ b/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/config/Config.java
@@ -1,5 +1,6 @@
package com.baeldung.spring.data.es.config;
+import org.elasticsearch.client.Client;
import org.elasticsearch.common.settings.ImmutableSettings;
import org.elasticsearch.node.NodeBuilder;
import org.slf4j.Logger;
@@ -17,20 +18,14 @@ import java.nio.file.Path;
import java.nio.file.Paths;
@Configuration
-@EnableElasticsearchRepositories(basePackages = "com.baeldung.repository")
+@EnableElasticsearchRepositories(basePackages = "com.baeldung.spring.data.es.repository")
@ComponentScan(basePackages = {"com.baeldung.spring.data.es.service"})
public class Config {
private static Logger logger = LoggerFactory.getLogger(Config.class);
@Bean
- public NodeBuilder nodeBuilder() {
- return new NodeBuilder();
- }
-
- @Bean
- public ElasticsearchOperations elasticsearchTemplate() {
-
+ public Client client() {
try {
Path tmpDir = Files.createTempDirectory(Paths.get(System.getProperty("java.io.tmpdir")), "elasticsearch_data");
@@ -40,14 +35,19 @@ public class Config {
logger.debug(tmpDir.toAbsolutePath().toString());
- return new ElasticsearchTemplate(nodeBuilder()
+ return new NodeBuilder()
.local(true)
.settings(elasticsearchSettings.build())
.node()
- .client());
+ .client();
} catch (IOException ioex) {
logger.error("Cannot create temp dir", ioex);
throw new RuntimeException();
}
}
+
+ @Bean
+ public ElasticsearchOperations elasticsearchTemplate() {
+ return new ElasticsearchTemplate(client());
+ }
}
diff --git a/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/dao/ArticleRepository.java b/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/dao/ArticleRepository.java
deleted file mode 100644
index 313eba5b36..0000000000
--- a/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/dao/ArticleRepository.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.baeldung.spring.data.es.dao;
-
-import com.baeldung.spring.data.es.model.Article;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.Pageable;
-import org.springframework.data.elasticsearch.annotations.Query;
-import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
-
-public interface ArticleRepository extends ElasticsearchRepository {
-
- Page findByAuthorsName(String name, Pageable pageable);
-
- @Query("{\"bool\": {\"must\": [{\"match\": {\"authors.name\": \"?0\"}}]}}")
- Page findByAuthorsNameUsingCustomQuery(String name, Pageable pageable);
-}
diff --git a/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/model/Article.java b/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/model/Article.java
index dd472982ce..40db51ac13 100644
--- a/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/model/Article.java
+++ b/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/model/Article.java
@@ -1,23 +1,35 @@
package com.baeldung.spring.data.es.model;
import org.springframework.data.annotation.Id;
-import org.springframework.data.elasticsearch.annotations.Document;
-import org.springframework.data.elasticsearch.annotations.Field;
-import org.springframework.data.elasticsearch.annotations.FieldIndex;
-import org.springframework.data.elasticsearch.annotations.FieldType;
+import org.springframework.data.elasticsearch.annotations.*;
+import java.util.Arrays;
import java.util.List;
+import static org.springframework.data.elasticsearch.annotations.FieldIndex.not_analyzed;
+import static org.springframework.data.elasticsearch.annotations.FieldType.Nested;
+import static org.springframework.data.elasticsearch.annotations.FieldType.String;
+
@Document(indexName = "blog", type = "article")
public class Article {
@Id
private String id;
- @Field(type = FieldType.String, index = FieldIndex.not_analyzed)
+
+ @MultiField(
+ mainField = @Field(type = String),
+ otherFields = {
+ @NestedField(index = not_analyzed, dotSuffix = "verbatim", type = String)
+ }
+ )
private String title;
- @Field(type = FieldType.Nested)
+
+ @Field(type = Nested)
private List authors;
+ @Field(type = String, index = not_analyzed)
+ private String[] tags;
+
public Article() {
}
@@ -49,12 +61,21 @@ public class Article {
this.authors = authors;
}
+ public String[] getTags() {
+ return tags;
+ }
+
+ public void setTags(String... tags) {
+ this.tags = tags;
+ }
+
@Override
public String toString() {
return "Article{" +
"id='" + id + '\'' +
", title='" + title + '\'' +
", authors=" + authors +
+ ", tags=" + Arrays.toString(tags) +
'}';
}
}
diff --git a/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/repository/ArticleRepository.java b/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/repository/ArticleRepository.java
index 27628950d7..8aef865401 100644
--- a/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/repository/ArticleRepository.java
+++ b/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/repository/ArticleRepository.java
@@ -5,7 +5,9 @@ import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
+import org.springframework.stereotype.Repository;
+@Repository
public interface ArticleRepository extends ElasticsearchRepository {
Page findByAuthorsName(String name, Pageable pageable);
diff --git a/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchQueryTest.java b/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchQueryTest.java
new file mode 100644
index 0000000000..fbc18cbb4c
--- /dev/null
+++ b/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchQueryTest.java
@@ -0,0 +1,211 @@
+package com.baeldung.spring.data.es;
+
+import com.baeldung.spring.data.es.config.Config;
+import com.baeldung.spring.data.es.model.Article;
+import com.baeldung.spring.data.es.model.Author;
+import com.baeldung.spring.data.es.service.ArticleService;
+import org.elasticsearch.action.ActionFuture;
+import org.elasticsearch.action.index.IndexRequest;
+import org.elasticsearch.action.index.IndexResponse;
+import org.elasticsearch.action.search.SearchResponse;
+import org.elasticsearch.client.Client;
+import org.elasticsearch.common.unit.Fuzziness;
+import org.elasticsearch.index.query.MultiMatchQueryBuilder;
+import org.elasticsearch.index.query.QueryBuilder;
+import org.elasticsearch.search.aggregations.Aggregation;
+import org.elasticsearch.search.aggregations.AggregationBuilders;
+import org.elasticsearch.search.aggregations.bucket.terms.StringTerms;
+import org.elasticsearch.search.aggregations.bucket.terms.Terms;
+import org.elasticsearch.search.aggregations.bucket.terms.TermsBuilder;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
+import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
+import org.springframework.data.elasticsearch.core.query.SearchQuery;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.support.AnnotationConfigContextLoader;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+import static java.util.Arrays.asList;
+import static java.util.stream.Collectors.toList;
+import static org.elasticsearch.index.query.MatchQueryBuilder.Operator.AND;
+import static org.elasticsearch.index.query.QueryBuilders.*;
+import static org.junit.Assert.assertEquals;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = {Config.class}, loader = AnnotationConfigContextLoader.class)
+public class ElasticSearchQueryTest {
+
+ @Autowired
+ private ElasticsearchTemplate elasticsearchTemplate;
+
+ @Autowired
+ private ArticleService articleService;
+
+ @Autowired
+ private Client client;
+
+ private final Author johnSmith = new Author("John Smith");
+ private final Author johnDoe = new Author("John Doe");
+
+ @Before
+ public void before() {
+ elasticsearchTemplate.deleteIndex(Article.class);
+ elasticsearchTemplate.createIndex(Article.class);
+ elasticsearchTemplate.putMapping(Article.class);
+ elasticsearchTemplate.refresh(Article.class, true);
+
+ Article article = new Article("Spring Data Elasticsearch");
+ article.setAuthors(asList(johnSmith, johnDoe));
+ article.setTags("elasticsearch", "spring data");
+ articleService.save(article);
+
+ article = new Article("Search engines");
+ article.setAuthors(asList(johnDoe));
+ article.setTags("search engines", "tutorial");
+ articleService.save(article);
+
+ article = new Article("Second Article About Elasticsearch");
+ article.setAuthors(asList(johnSmith));
+ article.setTags("elasticsearch", "spring data");
+ articleService.save(article);
+
+ article = new Article("Elasticsearch Tutorial");
+ article.setAuthors(asList(johnDoe));
+ article.setTags("elasticsearch");
+ articleService.save(article);
+ }
+
+ @Test
+ public void givenFullTitle_whenRunMatchQuery_thenDocIsFound() {
+ SearchQuery searchQuery = new NativeSearchQueryBuilder()
+ .withQuery(matchQuery("title", "Search engines").operator(AND))
+ .build();
+ List articles = elasticsearchTemplate
+ .queryForList(searchQuery, Article.class);
+ assertEquals(1, articles.size());
+ }
+
+ @Test
+ public void givenOneTermFromTitle_whenRunMatchQuery_thenDocIsFound() {
+ SearchQuery searchQuery = new NativeSearchQueryBuilder()
+ .withQuery(matchQuery("title", "Engines Solutions"))
+ .build();
+ List articles = elasticsearchTemplate
+ .queryForList(searchQuery, Article.class);
+ assertEquals(1, articles.size());
+ assertEquals("Search engines", articles.get(0).getTitle());
+ }
+
+ @Test
+ public void givenPartTitle_whenRunMatchQuery_thenDocIsFound() {
+ SearchQuery searchQuery = new NativeSearchQueryBuilder()
+ .withQuery(matchQuery("title", "elasticsearch data"))
+ .build();
+ List articles = elasticsearchTemplate
+ .queryForList(searchQuery, Article.class);
+ assertEquals(3, articles.size());
+ }
+
+ @Test
+ public void givenFullTitle_whenRunMatchQueryOnVerbatimField_thenDocIsFound() {
+ SearchQuery searchQuery = new NativeSearchQueryBuilder()
+ .withQuery(matchQuery("title.verbatim", "Second Article About Elasticsearch"))
+ .build();
+ List articles = elasticsearchTemplate
+ .queryForList(searchQuery, Article.class);
+ assertEquals(1, articles.size());
+
+ searchQuery = new NativeSearchQueryBuilder()
+ .withQuery(matchQuery("title.verbatim", "Second Article About"))
+ .build();
+ articles = elasticsearchTemplate
+ .queryForList(searchQuery, Article.class);
+ assertEquals(0, articles.size());
+ }
+
+ @Test
+ public void givenNestedObject_whenQueryByAuthorsName_thenFoundArticlesByThatAuthor() {
+ QueryBuilder builder = nestedQuery("authors",
+ boolQuery().must(termQuery("authors.name", "smith")));
+
+ SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(builder).build();
+ List articles = elasticsearchTemplate.queryForList(searchQuery, Article.class);
+
+ assertEquals(2, articles.size());
+ }
+
+ @Test
+ public void givenAnalyzedQuery_whenMakeAggregationOnTermCount_thenEachTokenCountsSeparately() {
+ TermsBuilder aggregation = AggregationBuilders.terms("top_tags").field("title");
+ SearchResponse response = client.prepareSearch("blog").setTypes("article")
+ .addAggregation(aggregation).execute().actionGet();
+
+ Map results = response.getAggregations().asMap();
+ StringTerms topTags = (StringTerms) results.get("top_tags");
+
+ List keys = topTags.getBuckets().stream().map(b -> b.getKey()).collect(toList());
+ Collections.sort(keys);
+ assertEquals(asList("about", "article", "data", "elasticsearch",
+ "engines", "search", "second", "spring", "tutorial"), keys);
+ }
+
+ @Test
+ public void givenNotAnalyzedQuery_whenMakeAggregationOnTermCount_thenEachTermCountsIndividually() {
+ TermsBuilder aggregation = AggregationBuilders.terms("top_tags").field("tags")
+ .order(Terms.Order.aggregation("_count", false));
+ SearchResponse response = client.prepareSearch("blog").setTypes("article")
+ .addAggregation(aggregation).execute().actionGet();
+
+ Map results = response.getAggregations().asMap();
+ StringTerms topTags = (StringTerms) results.get("top_tags");
+
+ List keys = topTags.getBuckets().stream().map(b -> b.getKey()).collect(toList());
+ assertEquals(asList("elasticsearch", "spring data", "search engines", "tutorial"), keys);
+ }
+
+ @Test
+ public void givenNotExactPhrase_whenUseSlop_thenQueryMatches() {
+ SearchQuery searchQuery = new NativeSearchQueryBuilder()
+ .withQuery(matchPhraseQuery("title", "spring elasticsearch").slop(1))
+ .build();
+ List articles = elasticsearchTemplate
+ .queryForList(searchQuery, Article.class);
+ assertEquals(1, articles.size());
+ }
+
+ @Test
+ public void givenPhraseWithType_whenUseFuzziness_thenQueryMatches() {
+ SearchQuery searchQuery = new NativeSearchQueryBuilder()
+ .withQuery(matchQuery("title", "spring date elasticserch")
+ .operator(AND)
+ .fuzziness(Fuzziness.ONE)
+ .prefixLength(3))
+ .build();
+
+ List articles = elasticsearchTemplate
+ .queryForList(searchQuery, Article.class);
+ assertEquals(1, articles.size());
+ }
+
+ @Test
+ public void givenMultimatchQuery_whenDoSearch_thenAllProvidedFieldsMatch() {
+ SearchQuery searchQuery = new NativeSearchQueryBuilder()
+ .withQuery(multiMatchQuery("tutorial")
+ .field("title")
+ .field("tags")
+ .type(MultiMatchQueryBuilder.Type.BEST_FIELDS))
+ .build();
+
+ List articles = elasticsearchTemplate
+ .queryForList(searchQuery, Article.class);
+ assertEquals(2, articles.size());
+ }
+}
diff --git a/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchTest.java b/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchTest.java
index 34ccfd788e..7b48772d3f 100644
--- a/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchTest.java
+++ b/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchTest.java
@@ -21,6 +21,7 @@ import java.util.List;
import static java.util.Arrays.asList;
import static org.elasticsearch.index.query.FilterBuilders.regexpFilter;
+import static org.elasticsearch.index.query.MatchQueryBuilder.Operator.AND;
import static org.elasticsearch.index.query.QueryBuilders.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
@@ -31,6 +32,7 @@ public class ElasticSearchTest {
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
+
@Autowired
private ArticleService articleService;
@@ -126,4 +128,13 @@ public class ElasticSearchTest {
assertEquals(count - 1, articleService.count());
}
+
+ @Test
+ public void givenSavedDoc_whenOneTermMatches_thenFindByTitle() {
+ SearchQuery searchQuery = new NativeSearchQueryBuilder()
+ .withQuery(matchQuery("title", "Search engines").operator(AND))
+ .build();
+ List articles = elasticsearchTemplate.queryForList(searchQuery, Article.class);
+ assertEquals(1, articles.size());
+ }
}
diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml
index 558af930b3..102344a3fa 100644
--- a/spring-data-mongodb/pom.xml
+++ b/spring-data-mongodb/pom.xml
@@ -1,7 +1,7 @@
4.0.0
- org.baeldung
+ com.baeldung
spring-data-mongodb
0.0.1-SNAPSHOT
@@ -118,13 +118,13 @@
UTF-8
- 4.2.4.RELEASE
+ 4.2.5.RELEASE
1.7.1.RELEASE
1.3
4.11
- 2.4.1
+ 2.9.0
3.6.6
1.1.3
diff --git a/spring-data-redis/.classpath b/spring-data-redis/.classpath
new file mode 100644
index 0000000000..9ae7bca0fc
--- /dev/null
+++ b/spring-data-redis/.classpath
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/spring-data-redis/.project b/spring-data-redis/.project
new file mode 100644
index 0000000000..244dfe15fb
--- /dev/null
+++ b/spring-data-redis/.project
@@ -0,0 +1,29 @@
+
+
+ spring-data-redis
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.m2e.core.maven2Builder
+
+
+
+
+ org.springframework.ide.eclipse.core.springbuilder
+
+
+
+
+
+ org.springframework.ide.eclipse.core.springnature
+ org.eclipse.jdt.core.javanature
+ org.eclipse.m2e.core.maven2Nature
+
+
diff --git a/spring-data-redis/README.md b/spring-data-redis/README.md
index b9b2e5d93d..89eae99f05 100644
--- a/spring-data-redis/README.md
+++ b/spring-data-redis/README.md
@@ -1,7 +1,7 @@
## Spring Data Redis
### Relevant Articles:
-- [Introduction to Spring Data Redis]
+- [Introduction to Spring Data Redis](http://www.baeldung.com/spring-data-redis-tutorial)
### Build the Project with Tests Running
```
diff --git a/spring-data-redis/pom.xml b/spring-data-redis/pom.xml
index 3f9eb705f4..25686fca16 100644
--- a/spring-data-redis/pom.xml
+++ b/spring-data-redis/pom.xml
@@ -1,15 +1,15 @@
+
4.0.0
-
- org.baeldung
- sprint-data-redis
- 0.0.1-SNAPSHOT
+ com.baeldung
+ spring-data-redis
+ 1.0
jar
UTF-8
- 4.2.2.RELEASE
+ 4.2.5.RELEASE
1.6.2.RELEASE
0.8.0
@@ -71,6 +71,6 @@
nosqlunit-redis
${nosqlunit.version}
-
+
diff --git a/spring-data-redis/src/main/java/org/baeldung/spring/data/redis/config/RedisConfig.java b/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/config/RedisConfig.java
similarity index 78%
rename from spring-data-redis/src/main/java/org/baeldung/spring/data/redis/config/RedisConfig.java
rename to spring-data-redis/src/main/java/com/baeldung/spring/data/redis/config/RedisConfig.java
index 0b64afe56c..4fd83a2bb6 100644
--- a/spring-data-redis/src/main/java/org/baeldung/spring/data/redis/config/RedisConfig.java
+++ b/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/config/RedisConfig.java
@@ -1,8 +1,8 @@
-package org.baeldung.spring.data.redis.config;
+package com.baeldung.spring.data.redis.config;
-import org.baeldung.spring.data.redis.queue.RedisMessageSubscriber;
-import org.baeldung.spring.data.redis.queue.RedisMessagePublisher;
-import org.baeldung.spring.data.redis.queue.MessagePublisher;
+import com.baeldung.spring.data.redis.queue.MessagePublisher;
+import com.baeldung.spring.data.redis.queue.RedisMessagePublisher;
+import com.baeldung.spring.data.redis.queue.RedisMessageSubscriber;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@@ -11,9 +11,10 @@ import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
+import org.springframework.data.redis.serializer.GenericToStringSerializer;
@Configuration
-@ComponentScan("org.baeldung.spring.data.redis")
+@ComponentScan("com.baeldung.spring.data.redis")
public class RedisConfig {
@Bean
@@ -25,6 +26,7 @@ public class RedisConfig {
public RedisTemplate redisTemplate() {
final RedisTemplate template = new RedisTemplate();
template.setConnectionFactory(jedisConnectionFactory());
+ template.setValueSerializer(new GenericToStringSerializer(Object.class));
return template;
}
diff --git a/spring-data-redis/src/main/java/org/baeldung/spring/data/redis/model/Student.java b/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/model/Student.java
similarity index 95%
rename from spring-data-redis/src/main/java/org/baeldung/spring/data/redis/model/Student.java
rename to spring-data-redis/src/main/java/com/baeldung/spring/data/redis/model/Student.java
index acc96899ce..10ba0f5ef4 100644
--- a/spring-data-redis/src/main/java/org/baeldung/spring/data/redis/model/Student.java
+++ b/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/model/Student.java
@@ -1,4 +1,4 @@
-package org.baeldung.spring.data.redis.model;
+package com.baeldung.spring.data.redis.model;
import java.io.Serializable;
diff --git a/spring-data-redis/src/main/java/org/baeldung/spring/data/redis/queue/MessagePublisher.java b/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/queue/MessagePublisher.java
similarity index 63%
rename from spring-data-redis/src/main/java/org/baeldung/spring/data/redis/queue/MessagePublisher.java
rename to spring-data-redis/src/main/java/com/baeldung/spring/data/redis/queue/MessagePublisher.java
index e1f2e3d4b2..9a42545d6c 100644
--- a/spring-data-redis/src/main/java/org/baeldung/spring/data/redis/queue/MessagePublisher.java
+++ b/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/queue/MessagePublisher.java
@@ -1,4 +1,4 @@
-package org.baeldung.spring.data.redis.queue;
+package com.baeldung.spring.data.redis.queue;
public interface MessagePublisher {
diff --git a/spring-data-redis/src/main/java/org/baeldung/spring/data/redis/queue/RedisMessagePublisher.java b/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/queue/RedisMessagePublisher.java
similarity index 94%
rename from spring-data-redis/src/main/java/org/baeldung/spring/data/redis/queue/RedisMessagePublisher.java
rename to spring-data-redis/src/main/java/com/baeldung/spring/data/redis/queue/RedisMessagePublisher.java
index 58e789daab..f4b3180a37 100644
--- a/spring-data-redis/src/main/java/org/baeldung/spring/data/redis/queue/RedisMessagePublisher.java
+++ b/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/queue/RedisMessagePublisher.java
@@ -1,4 +1,4 @@
-package org.baeldung.spring.data.redis.queue;
+package com.baeldung.spring.data.redis.queue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
diff --git a/spring-data-redis/src/main/java/org/baeldung/spring/data/redis/queue/RedisMessageSubscriber.java b/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/queue/RedisMessageSubscriber.java
similarity index 79%
rename from spring-data-redis/src/main/java/org/baeldung/spring/data/redis/queue/RedisMessageSubscriber.java
rename to spring-data-redis/src/main/java/com/baeldung/spring/data/redis/queue/RedisMessageSubscriber.java
index 4bc60849fb..849e1fb59f 100644
--- a/spring-data-redis/src/main/java/org/baeldung/spring/data/redis/queue/RedisMessageSubscriber.java
+++ b/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/queue/RedisMessageSubscriber.java
@@ -1,4 +1,4 @@
-package org.baeldung.spring.data.redis.queue;
+package com.baeldung.spring.data.redis.queue;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
@@ -14,6 +14,6 @@ public class RedisMessageSubscriber implements MessageListener {
public void onMessage(final Message message, final byte[] pattern) {
messageList.add(message.toString());
- System.out.println("Message received: " + message.toString());
+ System.out.println("Message received: " + new String(message.getBody()));
}
}
\ No newline at end of file
diff --git a/spring-data-redis/src/main/java/org/baeldung/spring/data/redis/repo/StudentRepository.java b/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/repo/StudentRepository.java
similarity index 72%
rename from spring-data-redis/src/main/java/org/baeldung/spring/data/redis/repo/StudentRepository.java
rename to spring-data-redis/src/main/java/com/baeldung/spring/data/redis/repo/StudentRepository.java
index 2a1f6afcce..250c227f00 100644
--- a/spring-data-redis/src/main/java/org/baeldung/spring/data/redis/repo/StudentRepository.java
+++ b/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/repo/StudentRepository.java
@@ -1,6 +1,6 @@
-package org.baeldung.spring.data.redis.repo;
+package com.baeldung.spring.data.redis.repo;
-import org.baeldung.spring.data.redis.model.Student;
+import com.baeldung.spring.data.redis.model.Student;
import java.util.Map;
diff --git a/spring-data-redis/src/main/java/org/baeldung/spring/data/redis/repo/StudentRepositoryImpl.java b/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/repo/StudentRepositoryImpl.java
similarity index 93%
rename from spring-data-redis/src/main/java/org/baeldung/spring/data/redis/repo/StudentRepositoryImpl.java
rename to spring-data-redis/src/main/java/com/baeldung/spring/data/redis/repo/StudentRepositoryImpl.java
index 43294cae58..f13bef0f54 100644
--- a/spring-data-redis/src/main/java/org/baeldung/spring/data/redis/repo/StudentRepositoryImpl.java
+++ b/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/repo/StudentRepositoryImpl.java
@@ -1,6 +1,6 @@
-package org.baeldung.spring.data.redis.repo;
+package com.baeldung.spring.data.redis.repo;
-import org.baeldung.spring.data.redis.model.Student;
+import com.baeldung.spring.data.redis.model.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
diff --git a/spring-data-redis/src/test/java/org/baeldung/spring/data/redis/RedisMessageListenerTest.java b/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/RedisMessageListenerTest.java
similarity index 78%
rename from spring-data-redis/src/test/java/org/baeldung/spring/data/redis/RedisMessageListenerTest.java
rename to spring-data-redis/src/test/java/com/baeldung/spring/data/redis/RedisMessageListenerTest.java
index f355e7f63a..403cf990e0 100644
--- a/spring-data-redis/src/test/java/org/baeldung/spring/data/redis/RedisMessageListenerTest.java
+++ b/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/RedisMessageListenerTest.java
@@ -1,8 +1,8 @@
-package org.baeldung.spring.data.redis;
+package com.baeldung.spring.data.redis;
-import org.baeldung.spring.data.redis.config.RedisConfig;
-import org.baeldung.spring.data.redis.queue.RedisMessageSubscriber;
-import org.baeldung.spring.data.redis.queue.RedisMessagePublisher;
+import com.baeldung.spring.data.redis.config.RedisConfig;
+import com.baeldung.spring.data.redis.queue.RedisMessageSubscriber;
+import com.baeldung.spring.data.redis.queue.RedisMessagePublisher;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/spring-data-redis/src/test/java/org/baeldung/spring/data/redis/repo/StudentRepositoryTest.java b/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/repo/StudentRepositoryTest.java
similarity index 93%
rename from spring-data-redis/src/test/java/org/baeldung/spring/data/redis/repo/StudentRepositoryTest.java
rename to spring-data-redis/src/test/java/com/baeldung/spring/data/redis/repo/StudentRepositoryTest.java
index 08540abd36..c32dfc7670 100644
--- a/spring-data-redis/src/test/java/org/baeldung/spring/data/redis/repo/StudentRepositoryTest.java
+++ b/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/repo/StudentRepositoryTest.java
@@ -1,8 +1,7 @@
-package org.baeldung.spring.data.redis.repo;
+package com.baeldung.spring.data.redis.repo;
-import org.baeldung.spring.data.redis.config.RedisConfig;
-import org.baeldung.spring.data.redis.model.Student;
-import org.junit.Before;
+import com.baeldung.spring.data.redis.config.RedisConfig;
+import com.baeldung.spring.data.redis.model.Student;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/spring-data-rest/README.md b/spring-data-rest/README.md
new file mode 100644
index 0000000000..d9be83113b
--- /dev/null
+++ b/spring-data-rest/README.md
@@ -0,0 +1,11 @@
+# About this project
+This project contains examples from the [Introduction to Spring Data REST](http://www.baeldung.com/spring-data-rest-intro) article from Baeldung.
+
+# Running the project
+The application uses [Spring Boot](http://projects.spring.io/spring-boot/), so it is easy to run. You can start it any of a few ways:
+* Run the `main` method from `SpringDataRestApplication`
+* Use the Maven Spring Boot plugin: `mvn spring-boot:run`
+* Package the application as a JAR and run it using `java -jar intro-spring-data-rest.jar`
+
+# Viewing the running application
+To view the running application, visit [http://localhost:8080](http://localhost:8080) in your browser
diff --git a/spring-data-rest/pom.xml b/spring-data-rest/pom.xml
new file mode 100644
index 0000000000..f7f28aa9f1
--- /dev/null
+++ b/spring-data-rest/pom.xml
@@ -0,0 +1,63 @@
+
+
+ 4.0.0
+
+ com.baeldung
+ intro-spring-data-rest
+ 1.0
+ jar
+
+ intro-spring-data-rest
+ Intro to Spring Data REST
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 1.3.3.RELEASE
+
+
+
+
+ UTF-8
+ 1.8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-rest
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ com.h2database
+ h2
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+ ${project.artifactId}
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
+
diff --git a/spring-data-rest/src/main/java/com/baeldung/SpringDataRestApplication.java b/spring-data-rest/src/main/java/com/baeldung/SpringDataRestApplication.java
new file mode 100644
index 0000000000..6e8e62f52c
--- /dev/null
+++ b/spring-data-rest/src/main/java/com/baeldung/SpringDataRestApplication.java
@@ -0,0 +1,11 @@
+package com.baeldung;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SpringDataRestApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(SpringDataRestApplication.class, args);
+ }
+}
diff --git a/spring-data-rest/src/main/java/com/baeldung/UserRepository.java b/spring-data-rest/src/main/java/com/baeldung/UserRepository.java
new file mode 100644
index 0000000000..ebbf0d49ab
--- /dev/null
+++ b/spring-data-rest/src/main/java/com/baeldung/UserRepository.java
@@ -0,0 +1,12 @@
+package com.baeldung;
+
+import org.springframework.data.repository.PagingAndSortingRepository;
+import org.springframework.data.repository.query.Param;
+import org.springframework.data.rest.core.annotation.RepositoryRestResource;
+
+import java.util.List;
+
+@RepositoryRestResource(collectionResourceRel = "users", path = "users")
+public interface UserRepository extends PagingAndSortingRepository {
+ List findByName(@Param("name") String name);
+}
diff --git a/spring-data-rest/src/main/java/com/baeldung/WebsiteUser.java b/spring-data-rest/src/main/java/com/baeldung/WebsiteUser.java
new file mode 100644
index 0000000000..a7a35a2573
--- /dev/null
+++ b/spring-data-rest/src/main/java/com/baeldung/WebsiteUser.java
@@ -0,0 +1,41 @@
+package com.baeldung;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+@Entity
+public class WebsiteUser {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private long id;
+
+ private String name;
+ private String email;
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+}
diff --git a/mockito-mocks-spring-beans/src/main/resources/application.properties b/spring-data-rest/src/main/resources/application.properties
similarity index 100%
rename from mockito-mocks-spring-beans/src/main/resources/application.properties
rename to spring-data-rest/src/main/resources/application.properties
diff --git a/spring-exceptions/pom.xml b/spring-exceptions/pom.xml
index 324b7475b3..554bb0c170 100644
--- a/spring-exceptions/pom.xml
+++ b/spring-exceptions/pom.xml
@@ -1,6 +1,6 @@
4.0.0
- org.baeldung
+ com.baeldung
spring-exceptions
0.1-SNAPSHOT
@@ -203,14 +203,14 @@
- 4.2.4.RELEASE
- 4.0.3.RELEASE
+ 4.2.5.RELEASE
+ 4.0.4.RELEASE
3.20.0-GA
1.2
4.3.11.Final
- 5.1.37
+ 5.1.38
7.0.42
@@ -232,15 +232,15 @@
4.4.1
4.5
- 2.4.1
+ 2.9.0
1.8.9
- 3.3
+ 3.5.1
2.6
- 2.18.1
+ 2.19.1
2.7
- 1.4.15
+ 1.4.18
diff --git a/spring-mvc-xml/.classpath b/spring-freemarker/.classpath
similarity index 100%
rename from spring-mvc-xml/.classpath
rename to spring-freemarker/.classpath
index 6b533711d3..5c3ac53820 100644
--- a/spring-mvc-xml/.classpath
+++ b/spring-freemarker/.classpath
@@ -6,32 +6,32 @@
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
diff --git a/spring-security-oauth/spring-security-oauth-server/.project b/spring-freemarker/.project
similarity index 96%
rename from spring-security-oauth/spring-security-oauth-server/.project
rename to spring-freemarker/.project
index a66e7f1009..1d63e30744 100644
--- a/spring-security-oauth/spring-security-oauth-server/.project
+++ b/spring-freemarker/.project
@@ -1,6 +1,6 @@
- spring-security-oauth-server
+ spring4-freemarker-example
@@ -21,12 +21,12 @@
- org.springframework.ide.eclipse.core.springbuilder
+ org.eclipse.wst.validation.validationbuilder
- org.eclipse.wst.validation.validationbuilder
+ org.springframework.ide.eclipse.core.springbuilder
@@ -37,9 +37,9 @@
+ org.springframework.ide.eclipse.core.springnature
org.eclipse.jem.workbench.JavaEMFNature
org.eclipse.wst.common.modulecore.ModuleCoreNature
- org.springframework.ide.eclipse.core.springnature
org.eclipse.jdt.core.javanature
org.eclipse.m2e.core.maven2Nature
org.eclipse.wst.common.project.facet.core.nature
diff --git a/spring-hibernate3/pom.xml b/spring-hibernate3/pom.xml
index d88358168f..59053be596 100644
--- a/spring-hibernate3/pom.xml
+++ b/spring-hibernate3/pom.xml
@@ -1,6 +1,6 @@
4.0.0
- org.baeldung
+ com.baeldung
spring-hibernate3
0.1-SNAPSHOT
@@ -162,13 +162,13 @@
- 4.2.4.RELEASE
- 4.0.3.RELEASE
+ 4.2.5.RELEASE
+ 4.0.4.RELEASE
3.20.0-GA
3.6.10.Final
- 5.1.37
+ 5.1.38
7.0.47
@@ -190,13 +190,13 @@
4.4.1
4.5
- 2.4.1
+ 2.9.0
- 3.3
- 2.18.1
+ 3.5.1
+ 2.19.1
2.7
- 1.4.15
+ 1.4.18
diff --git a/spring-hibernate4/pom.xml b/spring-hibernate4/pom.xml
index 652636b7cc..3652674614 100644
--- a/spring-hibernate4/pom.xml
+++ b/spring-hibernate4/pom.xml
@@ -213,15 +213,15 @@
- 4.2.4.RELEASE
- 4.0.3.RELEASE
+ 4.2.5.RELEASE
+ 4.0.4.RELEASE
1.9.2.RELEASE
3.20.0-GA
4.3.11.Final
${hibernate.version}
- 5.1.37
+ 5.1.38
8.0.30
1.1
2.2.4
@@ -245,13 +245,13 @@
4.4.1
4.5
- 2.4.1
+ 2.9.0
- 3.3
- 2.18.1
+ 3.5.1
+ 2.19.1
2.7
- 1.4.15
+ 1.4.18
diff --git a/spring-hibernate4/src/test/java/com/baeldung/persistence/IntegrationTestSuite.java b/spring-hibernate4/src/test/java/com/baeldung/persistence/IntegrationTestSuite.java
index c107a221d6..f5c45a5d6f 100644
--- a/spring-hibernate4/src/test/java/com/baeldung/persistence/IntegrationTestSuite.java
+++ b/spring-hibernate4/src/test/java/com/baeldung/persistence/IntegrationTestSuite.java
@@ -1,20 +1,24 @@
package com.baeldung.persistence;
-import com.baeldung.persistence.hibernate.FooPaginationPersistenceIntegrationTest;
-import com.baeldung.persistence.hibernate.FooSortingPersistenceServiceTest;
-import com.baeldung.persistence.service.FooServicePersistenceIntegrationTest;
-import com.baeldung.persistence.service.FooServiceBasicPersistenceIntegrationTest;
-import com.baeldung.persistence.service.ParentServicePersistenceIntegrationTest;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
+import com.baeldung.persistence.audit.AuditTestSuite;
+import com.baeldung.persistence.hibernate.FooPaginationPersistenceIntegrationTest;
+import com.baeldung.persistence.hibernate.FooSortingPersistenceIntegrationTest;
+import com.baeldung.persistence.service.FooServiceBasicPersistenceIntegrationTest;
+import com.baeldung.persistence.service.FooServicePersistenceIntegrationTest;
+import com.baeldung.persistence.service.ParentServicePersistenceIntegrationTest;
+
@RunWith(Suite.class)
@Suite.SuiteClasses({ // @formatter:off
- FooServiceBasicPersistenceIntegrationTest.class
+ AuditTestSuite.class
+ ,FooServiceBasicPersistenceIntegrationTest.class
,FooPaginationPersistenceIntegrationTest.class
,FooServicePersistenceIntegrationTest.class
,ParentServicePersistenceIntegrationTest.class
- ,FooSortingPersistenceServiceTest.class
+ ,FooSortingPersistenceIntegrationTest.class
+
}) // @formatter:on
public class IntegrationTestSuite {
//
diff --git a/spring-hibernate4/src/test/java/com/baeldung/persistence/hibernate/FooSortingPersistenceServiceTest.java b/spring-hibernate4/src/test/java/com/baeldung/persistence/hibernate/FooSortingPersistenceIntegrationTest.java
similarity index 99%
rename from spring-hibernate4/src/test/java/com/baeldung/persistence/hibernate/FooSortingPersistenceServiceTest.java
rename to spring-hibernate4/src/test/java/com/baeldung/persistence/hibernate/FooSortingPersistenceIntegrationTest.java
index c890e08d15..0f76526960 100644
--- a/spring-hibernate4/src/test/java/com/baeldung/persistence/hibernate/FooSortingPersistenceServiceTest.java
+++ b/spring-hibernate4/src/test/java/com/baeldung/persistence/hibernate/FooSortingPersistenceIntegrationTest.java
@@ -26,7 +26,7 @@ import org.springframework.test.context.support.AnnotationConfigContextLoader;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class)
@SuppressWarnings("unchecked")
-public class FooSortingPersistenceServiceTest {
+public class FooSortingPersistenceIntegrationTest {
@Autowired
private SessionFactory sessionFactory;
diff --git a/spring-jpa/pom.xml b/spring-jpa/pom.xml
index 2e8f818776..25dd960435 100644
--- a/spring-jpa/pom.xml
+++ b/spring-jpa/pom.xml
@@ -1,7 +1,7 @@
4.0.0
- org.baeldung
+ com.baeldung
spring-jpa
0.1-SNAPSHOT
@@ -179,13 +179,12 @@
- 4.2.4.RELEASE
- 4.0.2.RELEASE
+ 4.2.5.RELEASE
3.20.0-GA
4.3.11.Final
- 5.1.37
+ 5.1.38
1.8.2.RELEASE
@@ -207,13 +206,13 @@
4.4.1
4.5
- 2.4.1
+ 2.9.0
- 3.3
- 2.18.1
+ 3.5.1
+ 2.19.1
2.7
- 1.4.15
+ 1.4.18
diff --git a/spring-jpa/src/test/java/org/baeldung/persistence/service/FooPaginationPersistenceIntegrationTest.java b/spring-jpa/src/test/java/org/baeldung/persistence/service/FooPaginationPersistenceIntegrationTest.java
index 73c36190f9..091bec0ba0 100644
--- a/spring-jpa/src/test/java/org/baeldung/persistence/service/FooPaginationPersistenceIntegrationTest.java
+++ b/spring-jpa/src/test/java/org/baeldung/persistence/service/FooPaginationPersistenceIntegrationTest.java
@@ -88,11 +88,12 @@ public class FooPaginationPersistenceIntegrationTest {
public final void givenEntitiesExist_whenRetrievingPage_thenCorrect() {
final int pageSize = 10;
- final Query queryIds = entityManager.createQuery("Select f.id from Foo f order by f.lastName");
+ final Query queryIds = entityManager.createQuery("Select f.id from Foo f order by f.name");
final List fooIds = queryIds.getResultList();
- final Query query = entityManager.createQuery("Select f from Foo e whet f.id in :ids");
+ final Query query = entityManager.createQuery("Select f from Foo as f where f.id in :ids");
query.setParameter("ids", fooIds.subList(0, pageSize));
+
final List fooList = query.getResultList();
// Then
@@ -129,13 +130,15 @@ public class FooPaginationPersistenceIntegrationTest {
final Root from = criteriaQuery.from(Foo.class);
final CriteriaQuery select = criteriaQuery.select(from);
- final TypedQuery typedQuery = entityManager.createQuery(select);
+ TypedQuery typedQuery;
while (pageNumber < count.intValue()) {
+ typedQuery = entityManager.createQuery(select);
typedQuery.setFirstResult(pageNumber - 1);
typedQuery.setMaxResults(pageSize);
System.out.println("Current page: " + typedQuery.getResultList());
pageNumber += pageSize;
}
+
}
// UTIL
diff --git a/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java b/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java
index 96b3235f64..4c57865f74 100644
--- a/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java
+++ b/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java
@@ -36,7 +36,7 @@ public class FooServicePersistenceIntegrationTest {
@Test(expected = DataIntegrityViolationException.class)
public final void whenInvalidEntityIsCreated_thenDataException() {
- service.create(new Foo());
+ service.create(new Foo(randomAlphabetic(2048)));
}
@Test(expected = DataIntegrityViolationException.class)
@@ -53,7 +53,7 @@ public class FooServicePersistenceIntegrationTest {
@Test(expected = DataAccessException.class)
public final void temp_whenInvalidEntityIsCreated_thenDataException() {
- service.create(new Foo());
+ service.create(new Foo(randomAlphabetic(2048)));
}
@Test
diff --git a/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingTests.java b/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingIntegrationTest.java
similarity index 95%
rename from spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingTests.java
rename to spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingIntegrationTest.java
index 319d36151e..3c9f509da5 100644
--- a/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingTests.java
+++ b/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingIntegrationTest.java
@@ -22,7 +22,7 @@ import org.springframework.test.context.support.AnnotationConfigContextLoader;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { PersistenceJPAConfig.class }, loader = AnnotationConfigContextLoader.class)
@SuppressWarnings("unchecked")
-public class FooServiceSortingTests {
+public class FooServiceSortingIntegrationTest {
@PersistenceContext
private EntityManager entityManager;
@@ -65,7 +65,10 @@ public class FooServiceSortingTests {
final Query barJoinQuery = entityManager.createQuery(jql);
final List fooList = barJoinQuery.getResultList();
for (final Foo foo : fooList) {
- System.out.println("Name:" + foo.getName() + "-------BarId:" + foo.getBar().getId());
+ System.out.println("Name:" + foo.getName());
+ if (foo.getBar() != null) {
+ System.out.print("-------BarId:" + foo.getBar().getId());
+ }
}
}
diff --git a/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingWitNullsManualTest.java b/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingWitNullsManualIntegrationTest.java
similarity index 93%
rename from spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingWitNullsManualTest.java
rename to spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingWitNullsManualIntegrationTest.java
index 986e4e4a7d..040eee1c73 100644
--- a/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingWitNullsManualTest.java
+++ b/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingWitNullsManualIntegrationTest.java
@@ -20,7 +20,7 @@ import org.springframework.test.context.support.AnnotationConfigContextLoader;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { PersistenceJPAConfig.class }, loader = AnnotationConfigContextLoader.class)
-public class FooServiceSortingWitNullsManualTest {
+public class FooServiceSortingWitNullsManualIntegrationTest {
@PersistenceContext
private EntityManager entityManager;
@@ -30,6 +30,7 @@ public class FooServiceSortingWitNullsManualTest {
// tests
+ @SuppressWarnings("unchecked")
@Test
public final void whenSortingByStringNullLast_thenLastNull() {
service.create(new Foo());
@@ -44,6 +45,7 @@ public class FooServiceSortingWitNullsManualTest {
}
}
+ @SuppressWarnings("unchecked")
@Test
public final void whenSortingByStringNullFirst_thenFirstNull() {
service.create(new Foo());
diff --git a/spring-jpa/src/test/java/org/baeldung/persistence/service/JpaMultipleDBTest.java b/spring-jpa/src/test/java/org/baeldung/persistence/service/JpaMultipleDBIntegrationTest.java
similarity index 94%
rename from spring-jpa/src/test/java/org/baeldung/persistence/service/JpaMultipleDBTest.java
rename to spring-jpa/src/test/java/org/baeldung/persistence/service/JpaMultipleDBIntegrationTest.java
index 427e182d9e..e036a4f3c1 100644
--- a/spring-jpa/src/test/java/org/baeldung/persistence/service/JpaMultipleDBTest.java
+++ b/spring-jpa/src/test/java/org/baeldung/persistence/service/JpaMultipleDBIntegrationTest.java
@@ -15,13 +15,11 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.transaction.annotation.Transactional;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { UserConfig.class, ProductConfig.class })
-@TransactionConfiguration
-public class JpaMultipleDBTest {
+public class JpaMultipleDBIntegrationTest {
@Autowired
private UserRepository userRepository;
diff --git a/spring-jpa/src/test/java/org/baeldung/persistence/service/PersistenceTestSuite.java b/spring-jpa/src/test/java/org/baeldung/persistence/service/PersistenceTestSuite.java
index 919171de9f..aa2dfb5293 100644
--- a/spring-jpa/src/test/java/org/baeldung/persistence/service/PersistenceTestSuite.java
+++ b/spring-jpa/src/test/java/org/baeldung/persistence/service/PersistenceTestSuite.java
@@ -7,10 +7,9 @@ import org.junit.runners.Suite;
@Suite.SuiteClasses({ // @formatter:off
FooPaginationPersistenceIntegrationTest.class
,FooServicePersistenceIntegrationTest.class
- ,FooServiceSortingTests.class
- ,JpaMultipleDBTest.class
- // manual only
- // ,FooServiceSortingWitNullsManualTest.class
+ ,FooServiceSortingIntegrationTest.class
+ ,JpaMultipleDBIntegrationTest.class
+ ,FooServiceSortingWitNullsManualIntegrationTest.class
}) // @formatter:on
public class PersistenceTestSuite {
//
diff --git a/spring-mockito/.classpath b/spring-mockito/.classpath
new file mode 100644
index 0000000000..6d7587a819
--- /dev/null
+++ b/spring-mockito/.classpath
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mockito/src/test/resources/.gitignore b/spring-mockito/.gitignore
similarity index 100%
rename from mockito/src/test/resources/.gitignore
rename to spring-mockito/.gitignore
diff --git a/spring-mockito/.project b/spring-mockito/.project
new file mode 100644
index 0000000000..5f0e9cacbc
--- /dev/null
+++ b/spring-mockito/.project
@@ -0,0 +1,35 @@
+
+
+ spring-mockito
+
+
+
+
+
+ org.eclipse.wst.common.project.facet.core.builder
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.m2e.core.maven2Builder
+
+
+
+
+ org.springframework.ide.eclipse.core.springbuilder
+
+
+
+
+
+ org.springframework.ide.eclipse.core.springnature
+ org.eclipse.jdt.core.javanature
+ org.eclipse.m2e.core.maven2Nature
+ org.eclipse.wst.common.project.facet.core.nature
+
+
diff --git a/mockito-mocks-spring-beans/README.md b/spring-mockito/README.md
similarity index 100%
rename from mockito-mocks-spring-beans/README.md
rename to spring-mockito/README.md
diff --git a/mockito-mocks-spring-beans/pom.xml b/spring-mockito/pom.xml
similarity index 80%
rename from mockito-mocks-spring-beans/pom.xml
rename to spring-mockito/pom.xml
index 64dc7d83c9..3dcca7aab7 100644
--- a/mockito-mocks-spring-beans/pom.xml
+++ b/spring-mockito/pom.xml
@@ -1,38 +1,30 @@
-
+
4.0.0
com.baeldung
- mockito-mocks-spring-beans
+ spring-mockito
0.0.1-SNAPSHOT
jar
- mocks
+ spring-mockito
Injecting Mockito Mocks into Spring Beans
org.springframework.boot
spring-boot-starter-parent
- 1.3.1.RELEASE
+ 1.3.3.RELEASE
-
- UTF-8
- 1.8
-
-
org.springframework.boot
spring-boot-starter
- 1.3.1.RELEASE
org.springframework.boot
spring-boot-starter-test
- 1.3.1.RELEASE
test
@@ -51,4 +43,9 @@
+
+ UTF-8
+ 1.8
+
+
diff --git a/mockito-mocks-spring-beans/src/main/java/com/baeldung/MocksApplication.java b/spring-mockito/src/main/java/com/baeldung/MocksApplication.java
similarity index 100%
rename from mockito-mocks-spring-beans/src/main/java/com/baeldung/MocksApplication.java
rename to spring-mockito/src/main/java/com/baeldung/MocksApplication.java
diff --git a/mockito-mocks-spring-beans/src/main/java/com/baeldung/NameService.java b/spring-mockito/src/main/java/com/baeldung/NameService.java
similarity index 100%
rename from mockito-mocks-spring-beans/src/main/java/com/baeldung/NameService.java
rename to spring-mockito/src/main/java/com/baeldung/NameService.java
diff --git a/mockito-mocks-spring-beans/src/main/java/com/baeldung/UserService.java b/spring-mockito/src/main/java/com/baeldung/UserService.java
similarity index 100%
rename from mockito-mocks-spring-beans/src/main/java/com/baeldung/UserService.java
rename to spring-mockito/src/main/java/com/baeldung/UserService.java
diff --git a/core-java/src/main/resources/fileToMove.txt b/spring-mockito/src/main/resources/application.properties
similarity index 100%
rename from core-java/src/main/resources/fileToMove.txt
rename to spring-mockito/src/main/resources/application.properties
diff --git a/mockito-mocks-spring-beans/src/test/java/com/baeldung/NameServiceTestConfiguration.java b/spring-mockito/src/test/java/com/baeldung/NameServiceTestConfiguration.java
similarity index 100%
rename from mockito-mocks-spring-beans/src/test/java/com/baeldung/NameServiceTestConfiguration.java
rename to spring-mockito/src/test/java/com/baeldung/NameServiceTestConfiguration.java
diff --git a/mockito-mocks-spring-beans/src/test/java/com/baeldung/UserServiceTest.java b/spring-mockito/src/test/java/com/baeldung/UserServiceTest.java
similarity index 100%
rename from mockito-mocks-spring-beans/src/test/java/com/baeldung/UserServiceTest.java
rename to spring-mockito/src/test/java/com/baeldung/UserServiceTest.java
diff --git a/spring-mvc-java/.classpath b/spring-mvc-java/.classpath
index 6b533711d3..a642d37ceb 100644
--- a/spring-mvc-java/.classpath
+++ b/spring-mvc-java/.classpath
@@ -1,37 +1,37 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/spring-mvc-java/pom.xml b/spring-mvc-java/pom.xml
index d9a578cb8c..f53a07264d 100644
--- a/spring-mvc-java/pom.xml
+++ b/spring-mvc-java/pom.xml
@@ -1,6 +1,6 @@
4.0.0
- org.baeldung
+ com.baeldung
spring-mvc-java
0.1-SNAPSHOT
spring-mvc-java
@@ -57,6 +57,13 @@
slf4j-log4j12
${org.slf4j.version}
+
+
+ commons-fileupload
+ commons-fileupload
+ 1.3.1
+
+
junit
@@ -99,6 +106,19 @@
thymeleaf
${thymeleaf.version}
+
+
+
+ com.fasterxml.jackson.core
+ jackson-core
+ 2.1.2
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.1.2
+
+
@@ -172,12 +192,12 @@
- 4.2.4.RELEASE
- 4.0.3.RELEASE
+ 4.2.5.RELEASE
+ 4.0.4.RELEASE
2.1.4.RELEASE
4.3.11.Final
- 5.1.37
+ 5.1.38
1.7.13
1.1.3
@@ -192,13 +212,14 @@
1.10.19
4.4.1
4.5
- 2.4.1
+ 2.9.0
- 3.3
+ 3.5.1
2.6
- 2.18.1
+ 2.19.1
2.7
- 1.4.17
+ 1.4.18
+
1.8.7
diff --git a/spring-mvc-java/src/main/java/org/baeldung/aop/LoggingAspect.java b/spring-mvc-java/src/main/java/com/baeldung/aop/LoggingAspect.java
similarity index 90%
rename from spring-mvc-java/src/main/java/org/baeldung/aop/LoggingAspect.java
rename to spring-mvc-java/src/main/java/com/baeldung/aop/LoggingAspect.java
index c59c4f060a..7ae37404be 100644
--- a/spring-mvc-java/src/main/java/org/baeldung/aop/LoggingAspect.java
+++ b/spring-mvc-java/src/main/java/com/baeldung/aop/LoggingAspect.java
@@ -1,4 +1,4 @@
-package org.baeldung.aop;
+package com.baeldung.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
@@ -27,11 +27,11 @@ public class LoggingAspect {
public void repositoryMethods() {
}
- @Pointcut("@annotation(org.baeldung.aop.annotations.Loggable)")
+ @Pointcut("@annotation(com.baeldung.aop.annotations.Loggable)")
public void loggableMethods() {
}
- @Pointcut("@args(org.baeldung.aop.annotations.Entity)")
+ @Pointcut("@args(com.baeldung.aop.annotations.Entity)")
public void methodsAcceptingEntities() {
}
diff --git a/spring-mvc-java/src/main/java/org/baeldung/aop/PerformanceAspect.java b/spring-mvc-java/src/main/java/com/baeldung/aop/PerformanceAspect.java
similarity index 97%
rename from spring-mvc-java/src/main/java/org/baeldung/aop/PerformanceAspect.java
rename to spring-mvc-java/src/main/java/com/baeldung/aop/PerformanceAspect.java
index 2d07e5a5f3..1f2076adff 100644
--- a/spring-mvc-java/src/main/java/org/baeldung/aop/PerformanceAspect.java
+++ b/spring-mvc-java/src/main/java/com/baeldung/aop/PerformanceAspect.java
@@ -1,4 +1,4 @@
-package org.baeldung.aop;
+package com.baeldung.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
diff --git a/spring-mvc-java/src/main/java/org/baeldung/aop/PublishingAspect.java b/spring-mvc-java/src/main/java/com/baeldung/aop/PublishingAspect.java
similarity index 94%
rename from spring-mvc-java/src/main/java/org/baeldung/aop/PublishingAspect.java
rename to spring-mvc-java/src/main/java/com/baeldung/aop/PublishingAspect.java
index 324605dab1..7791c63e7b 100644
--- a/spring-mvc-java/src/main/java/org/baeldung/aop/PublishingAspect.java
+++ b/spring-mvc-java/src/main/java/com/baeldung/aop/PublishingAspect.java
@@ -1,10 +1,10 @@
-package org.baeldung.aop;
+package com.baeldung.aop;
+import com.baeldung.events.FooCreationEvent;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
-import org.baeldung.events.FooCreationEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;
diff --git a/spring-mvc-java/src/main/java/org/baeldung/aop/annotations/Entity.java b/spring-mvc-java/src/main/java/com/baeldung/aop/annotations/Entity.java
similarity index 86%
rename from spring-mvc-java/src/main/java/org/baeldung/aop/annotations/Entity.java
rename to spring-mvc-java/src/main/java/com/baeldung/aop/annotations/Entity.java
index f964c3979e..61d91b0777 100644
--- a/spring-mvc-java/src/main/java/org/baeldung/aop/annotations/Entity.java
+++ b/spring-mvc-java/src/main/java/com/baeldung/aop/annotations/Entity.java
@@ -1,4 +1,4 @@
-package org.baeldung.aop.annotations;
+package com.baeldung.aop.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
diff --git a/spring-mvc-java/src/main/java/org/baeldung/aop/annotations/Loggable.java b/spring-mvc-java/src/main/java/com/baeldung/aop/annotations/Loggable.java
similarity index 87%
rename from spring-mvc-java/src/main/java/org/baeldung/aop/annotations/Loggable.java
rename to spring-mvc-java/src/main/java/com/baeldung/aop/annotations/Loggable.java
index ef2863957f..92aa950e58 100644
--- a/spring-mvc-java/src/main/java/org/baeldung/aop/annotations/Loggable.java
+++ b/spring-mvc-java/src/main/java/com/baeldung/aop/annotations/Loggable.java
@@ -1,4 +1,4 @@
-package org.baeldung.aop.annotations;
+package com.baeldung.aop.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
diff --git a/spring-mvc-java/src/main/java/org/baeldung/dao/FooDao.java b/spring-mvc-java/src/main/java/com/baeldung/dao/FooDao.java
similarity index 75%
rename from spring-mvc-java/src/main/java/org/baeldung/dao/FooDao.java
rename to spring-mvc-java/src/main/java/com/baeldung/dao/FooDao.java
index f204440b2d..1d28b082ec 100644
--- a/spring-mvc-java/src/main/java/org/baeldung/dao/FooDao.java
+++ b/spring-mvc-java/src/main/java/com/baeldung/dao/FooDao.java
@@ -1,7 +1,7 @@
-package org.baeldung.dao;
+package com.baeldung.dao;
-import org.baeldung.aop.annotations.Loggable;
-import org.baeldung.model.Foo;
+import com.baeldung.aop.annotations.Loggable;
+import com.baeldung.model.Foo;
import org.springframework.stereotype.Repository;
@Repository
diff --git a/spring-mvc-java/src/main/java/org/baeldung/dialect/CustomDialect.java b/spring-mvc-java/src/main/java/com/baeldung/dialect/CustomDialect.java
similarity index 86%
rename from spring-mvc-java/src/main/java/org/baeldung/dialect/CustomDialect.java
rename to spring-mvc-java/src/main/java/com/baeldung/dialect/CustomDialect.java
index e6d1ad6b74..0c6a7c3ae0 100644
--- a/spring-mvc-java/src/main/java/org/baeldung/dialect/CustomDialect.java
+++ b/spring-mvc-java/src/main/java/com/baeldung/dialect/CustomDialect.java
@@ -1,9 +1,9 @@
-package org.baeldung.dialect;
+package com.baeldung.dialect;
import java.util.HashSet;
import java.util.Set;
-import org.baeldung.processor.NameProcessor;
+import com.baeldung.processor.NameProcessor;
import org.thymeleaf.dialect.AbstractDialect;
import org.thymeleaf.processor.IProcessor;
diff --git a/spring-mvc-java/src/main/java/org/baeldung/events/FooCreationEvent.java b/spring-mvc-java/src/main/java/com/baeldung/events/FooCreationEvent.java
similarity index 86%
rename from spring-mvc-java/src/main/java/org/baeldung/events/FooCreationEvent.java
rename to spring-mvc-java/src/main/java/com/baeldung/events/FooCreationEvent.java
index af11f3a4be..5ea4b46c04 100644
--- a/spring-mvc-java/src/main/java/org/baeldung/events/FooCreationEvent.java
+++ b/spring-mvc-java/src/main/java/com/baeldung/events/FooCreationEvent.java
@@ -1,4 +1,4 @@
-package org.baeldung.events;
+package com.baeldung.events;
import org.springframework.context.ApplicationEvent;
diff --git a/spring-mvc-java/src/main/java/org/baeldung/events/FooCreationEventListener.java b/spring-mvc-java/src/main/java/com/baeldung/events/FooCreationEventListener.java
similarity index 94%
rename from spring-mvc-java/src/main/java/org/baeldung/events/FooCreationEventListener.java
rename to spring-mvc-java/src/main/java/com/baeldung/events/FooCreationEventListener.java
index 35dcfd2bc3..c0aa744bc1 100644
--- a/spring-mvc-java/src/main/java/org/baeldung/events/FooCreationEventListener.java
+++ b/spring-mvc-java/src/main/java/com/baeldung/events/FooCreationEventListener.java
@@ -1,4 +1,4 @@
-package org.baeldung.events;
+package com.baeldung.events;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
diff --git a/spring-mvc-java/src/main/java/com/baeldung/model/Employee.java b/spring-mvc-java/src/main/java/com/baeldung/model/Employee.java
new file mode 100644
index 0000000000..d0f6b724eb
--- /dev/null
+++ b/spring-mvc-java/src/main/java/com/baeldung/model/Employee.java
@@ -0,0 +1,51 @@
+package com.baeldung.model;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement
+public class Employee {
+
+ private long id;
+ private String name;
+ private String contactNumber;
+
+ public Employee() {
+ super();
+ }
+
+ public Employee(final long id, final String name, final String contactNumber) {
+ this.id = id;
+ this.name = name;
+ this.contactNumber = contactNumber;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(final String name) {
+ this.name = name;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(final long id) {
+ this.id = id;
+ }
+
+ public String getContactNumber() {
+ return contactNumber;
+ }
+
+ public void setContactNumber(final String contactNumber) {
+ this.contactNumber = contactNumber;
+ }
+
+ @Override
+ public String toString() {
+ return "Employee [id=" + id + ", name=" + name + ", contactNumber=" + contactNumber + "]";
+ }
+
+}
diff --git a/spring-mvc-java/src/main/java/org/baeldung/model/Foo.java b/spring-mvc-java/src/main/java/com/baeldung/model/Foo.java
similarity index 80%
rename from spring-mvc-java/src/main/java/org/baeldung/model/Foo.java
rename to spring-mvc-java/src/main/java/com/baeldung/model/Foo.java
index 87bd7132e6..01f5f43f60 100644
--- a/spring-mvc-java/src/main/java/org/baeldung/model/Foo.java
+++ b/spring-mvc-java/src/main/java/com/baeldung/model/Foo.java
@@ -1,6 +1,6 @@
-package org.baeldung.model;
+package com.baeldung.model;
-import org.baeldung.aop.annotations.Entity;
+import com.baeldung.aop.annotations.Entity;
@Entity
public class Foo {
diff --git a/spring-mvc-java/src/main/java/org/baeldung/model/User.java b/spring-mvc-java/src/main/java/com/baeldung/model/User.java
similarity index 90%
rename from spring-mvc-java/src/main/java/org/baeldung/model/User.java
rename to spring-mvc-java/src/main/java/com/baeldung/model/User.java
index df549cd21d..dc4480c986 100644
--- a/spring-mvc-java/src/main/java/org/baeldung/model/User.java
+++ b/spring-mvc-java/src/main/java/com/baeldung/model/User.java
@@ -1,4 +1,4 @@
-package org.baeldung.model;
+package com.baeldung.model;
public class User {
private String firstname;
diff --git a/spring-mvc-java/src/main/java/org/baeldung/processor/NameProcessor.java b/spring-mvc-java/src/main/java/com/baeldung/processor/NameProcessor.java
similarity index 94%
rename from spring-mvc-java/src/main/java/org/baeldung/processor/NameProcessor.java
rename to spring-mvc-java/src/main/java/com/baeldung/processor/NameProcessor.java
index df9a4da7f0..9a7857198c 100644
--- a/spring-mvc-java/src/main/java/org/baeldung/processor/NameProcessor.java
+++ b/spring-mvc-java/src/main/java/com/baeldung/processor/NameProcessor.java
@@ -1,4 +1,4 @@
-package org.baeldung.processor;
+package com.baeldung.processor;
import org.thymeleaf.Arguments;
import org.thymeleaf.dom.Element;
diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/ClientWebConfig.java b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/ClientWebConfig.java
new file mode 100644
index 0000000000..c108a450ae
--- /dev/null
+++ b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/ClientWebConfig.java
@@ -0,0 +1,93 @@
+package com.baeldung.spring.web.config;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import com.baeldung.dialect.CustomDialect;
+import org.springframework.context.MessageSource;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Description;
+import org.springframework.context.support.ResourceBundleMessageSource;
+import org.springframework.web.servlet.ViewResolver;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+import org.springframework.web.servlet.view.InternalResourceViewResolver;
+import org.springframework.web.servlet.view.JstlView;
+import org.thymeleaf.dialect.IDialect;
+import org.thymeleaf.spring4.SpringTemplateEngine;
+import org.thymeleaf.spring4.view.ThymeleafViewResolver;
+import org.thymeleaf.templateresolver.ServletContextTemplateResolver;
+
+@EnableWebMvc
+@Configuration
+public class ClientWebConfig extends WebMvcConfigurerAdapter {
+
+ public ClientWebConfig() {
+ super();
+ }
+
+ // API
+
+ @Override
+ public void addViewControllers(final ViewControllerRegistry registry) {
+ super.addViewControllers(registry);
+
+ registry.addViewController("/sample.html");
+ }
+
+ @Bean
+ public ViewResolver thymeleafViewResolver() {
+ final ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
+ viewResolver.setTemplateEngine(templateEngine());
+ viewResolver.setOrder(1);
+ return viewResolver;
+ }
+
+ @Bean
+ public ViewResolver viewResolver() {
+ final InternalResourceViewResolver bean = new InternalResourceViewResolver();
+ bean.setViewClass(JstlView.class);
+ bean.setPrefix("/WEB-INF/view/");
+ bean.setSuffix(".jsp");
+ bean.setOrder(0);
+ return bean;
+ }
+
+ @Bean
+ @Description("Thymeleaf template resolver serving HTML 5")
+ public ServletContextTemplateResolver templateResolver() {
+ final ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver();
+ templateResolver.setPrefix("/WEB-INF/templates/");
+ templateResolver.setSuffix(".html");
+ templateResolver.setTemplateMode("HTML5");
+ return templateResolver;
+ }
+
+ @Bean
+ @Description("Thymeleaf template engine with Spring integration")
+ public SpringTemplateEngine templateEngine() {
+ final SpringTemplateEngine templateEngine = new SpringTemplateEngine();
+ templateEngine.setTemplateResolver(templateResolver());
+ final Set dialects = new HashSet<>();
+ dialects.add(new CustomDialect());
+ templateEngine.setAdditionalDialects(dialects);
+ return templateEngine;
+ }
+
+ @Bean
+ @Description("Spring message resolver")
+ public MessageSource messageSource() {
+ final ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
+ messageSource.setBasename("messages");
+ return messageSource;
+ }
+
+ @Override
+ public void addResourceHandlers(final ResourceHandlerRegistry registry) {
+ registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
+ }
+
+}
\ No newline at end of file
diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/ContentManagementWebConfig.java b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/ContentManagementWebConfig.java
new file mode 100644
index 0000000000..9780575678
--- /dev/null
+++ b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/ContentManagementWebConfig.java
@@ -0,0 +1,52 @@
+package com.baeldung.spring.web.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.MediaType;
+import org.springframework.web.servlet.ViewResolver;
+import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
+import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+import org.springframework.web.servlet.view.InternalResourceViewResolver;
+import org.springframework.web.servlet.view.JstlView;
+
+@EnableWebMvc
+@Configuration
+public class ContentManagementWebConfig extends WebMvcConfigurerAdapter {
+
+ public ContentManagementWebConfig() {
+ super();
+ }
+
+ // API
+
+ @Override
+ public void configureContentNegotiation(final ContentNegotiationConfigurer configurer) {
+ configurer.favorPathExtension(false).
+ favorParameter(true).
+ parameterName("mediaType").
+ ignoreAcceptHeader(true).
+ useJaf(false).
+ defaultContentType(MediaType.APPLICATION_JSON).
+ mediaType("xml", MediaType.APPLICATION_XML).
+ mediaType("json", MediaType.APPLICATION_JSON);
+ }
+
+ @Override
+ public void addViewControllers(final ViewControllerRegistry registry) {
+ super.addViewControllers(registry);
+ registry.addViewController("/sample.html");
+ }
+
+ @Bean
+ public ViewResolver viewResolver() {
+ final InternalResourceViewResolver bean = new InternalResourceViewResolver();
+ bean.setViewClass(JstlView.class);
+ bean.setPrefix("/WEB-INF/view/");
+ bean.setSuffix(".jsp");
+ bean.setOrder(0);
+ return bean;
+ }
+
+}
diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/MainWebAppInitializer.java b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/MainWebAppInitializer.java
new file mode 100644
index 0000000000..4a11ba986c
--- /dev/null
+++ b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/MainWebAppInitializer.java
@@ -0,0 +1,50 @@
+package com.baeldung.spring.web.config;
+
+import java.util.Set;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRegistration;
+
+import org.springframework.web.WebApplicationInitializer;
+import org.springframework.web.context.ContextLoaderListener;
+import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
+import org.springframework.web.context.support.GenericWebApplicationContext;
+import org.springframework.web.servlet.DispatcherServlet;
+
+public class MainWebAppInitializer implements WebApplicationInitializer {
+
+ private static final String TMP_FOLDER = "C:/Users/ivan/Desktop/tmp";
+ private static final int MAX_UPLOAD_SIZE = 5 * 1024 * 1024; // 5 MB
+
+ /**
+ * Register and configure all Servlet container components necessary to power the web application.
+ */
+ @Override
+ public void onStartup(final ServletContext sc) throws ServletException {
+
+ // Create the 'root' Spring application context
+ final AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext();
+ root.scan("com.baeldung.spring.web.config");
+ // root.getEnvironment().setDefaultProfiles("embedded");
+
+ // Manages the lifecycle of the root application context
+ sc.addListener(new ContextLoaderListener(root));
+
+ // Handles requests into the application
+ final ServletRegistration.Dynamic appServlet = sc.addServlet("mvc", new DispatcherServlet(new GenericWebApplicationContext()));
+ appServlet.setLoadOnStartup(1);
+
+ // final MultipartConfigElement multipartConfigElement = new
+ // MultipartConfigElement(TMP_FOLDER, MAX_UPLOAD_SIZE,
+ // MAX_UPLOAD_SIZE * 2, MAX_UPLOAD_SIZE / 2);
+ //
+ // appServlet.setMultipartConfig(multipartConfigElement);
+
+ final Set mappingConflicts = appServlet.addMapping("/");
+ if (!mappingConflicts.isEmpty()) {
+ throw new IllegalStateException("'appServlet' could not be mapped to '/' due " + "to an existing mapping. This is a known issue under Tomcat versions " + "<= 7.0.14; see https://issues.apache.org/bugzilla/show_bug.cgi?id=51278");
+ }
+ }
+
+}
diff --git a/spring-mvc-java/src/main/java/org/baeldung/spring/web/config/WebConfig.java b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java
similarity index 77%
rename from spring-mvc-java/src/main/java/org/baeldung/spring/web/config/WebConfig.java
rename to spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java
index 09e9cff917..693fd74f74 100644
--- a/spring-mvc-java/src/main/java/org/baeldung/spring/web/config/WebConfig.java
+++ b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java
@@ -1,9 +1,10 @@
-package org.baeldung.spring.web.config;
+package com.baeldung.spring.web.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
+import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
@@ -15,14 +16,26 @@ import org.springframework.web.servlet.view.XmlViewResolver;
@Configuration
@EnableWebMvc
-@ComponentScan("org.baeldung.web")
+@ComponentScan("com.baeldung.web")
public class WebConfig extends WebMvcConfigurerAdapter {
public WebConfig() {
super();
}
- //
+ // @Bean
+ // public StandardServletMultipartResolver multipartResolver() {
+ // return new StandardServletMultipartResolver();
+ // }
+
+ @Bean(name = "multipartResolver")
+ public CommonsMultipartResolver multipartResolver() {
+
+ final CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
+ multipartResolver.setMaxUploadSize(100000);
+
+ return multipartResolver;
+ }
@Override
public void addViewControllers(final ViewControllerRegistry registry) {
@@ -56,4 +69,4 @@ public class WebConfig extends WebMvcConfigurerAdapter {
return bean;
}
-}
\ No newline at end of file
+}
diff --git a/spring-mvc-java/src/main/java/org/baeldung/web/BeanA.java b/spring-mvc-java/src/main/java/com/baeldung/web/BeanA.java
similarity index 89%
rename from spring-mvc-java/src/main/java/org/baeldung/web/BeanA.java
rename to spring-mvc-java/src/main/java/com/baeldung/web/BeanA.java
index b6b6f49c16..79fac724f7 100644
--- a/spring-mvc-java/src/main/java/org/baeldung/web/BeanA.java
+++ b/spring-mvc-java/src/main/java/com/baeldung/web/BeanA.java
@@ -1,4 +1,4 @@
-package org.baeldung.web;
+package com.baeldung.web;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
diff --git a/spring-mvc-java/src/main/java/org/baeldung/web/BeanB.java b/spring-mvc-java/src/main/java/com/baeldung/web/BeanB.java
similarity index 83%
rename from spring-mvc-java/src/main/java/org/baeldung/web/BeanB.java
rename to spring-mvc-java/src/main/java/com/baeldung/web/BeanB.java
index 49e5af4ccb..05c9560a0c 100644
--- a/spring-mvc-java/src/main/java/org/baeldung/web/BeanB.java
+++ b/spring-mvc-java/src/main/java/com/baeldung/web/BeanB.java
@@ -1,4 +1,4 @@
-package org.baeldung.web;
+package com.baeldung.web;
import org.springframework.stereotype.Component;
diff --git a/spring-mvc-xml/src/main/java/org/baeldung/spring/controller/EmployeeController.java b/spring-mvc-java/src/main/java/com/baeldung/web/controller/EmployeeController.java
similarity index 57%
rename from spring-mvc-xml/src/main/java/org/baeldung/spring/controller/EmployeeController.java
rename to spring-mvc-java/src/main/java/com/baeldung/web/controller/EmployeeController.java
index 1dbe230adc..38272b23cb 100644
--- a/spring-mvc-xml/src/main/java/org/baeldung/spring/controller/EmployeeController.java
+++ b/spring-mvc-java/src/main/java/com/baeldung/web/controller/EmployeeController.java
@@ -1,33 +1,45 @@
-package org.baeldung.spring.controller;
+package com.baeldung.web.controller;
-import javax.validation.Valid;
+import java.util.HashMap;
+import java.util.Map;
-import org.baeldung.spring.form.Employee;
+import com.baeldung.model.Employee;
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.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class EmployeeController {
+ Map employeeMap = new HashMap<>();
+
@RequestMapping(value = "/employee", method = RequestMethod.GET)
public ModelAndView showForm() {
return new ModelAndView("employeeHome", "employee", new Employee());
}
+ @RequestMapping(value = "/employee/{Id}", produces = { "application/json", "application/xml" }, method = RequestMethod.GET)
+ public @ResponseBody Employee getEmployeeById(@PathVariable final long Id) {
+ return employeeMap.get(Id);
+ }
+
@RequestMapping(value = "/addEmployee", method = RequestMethod.POST)
- public String submit(@Valid @ModelAttribute("employee") final Employee employee, final BindingResult result, final ModelMap model) {
+ public String submit(@ModelAttribute("employee") final Employee employee, final BindingResult result, final ModelMap model) {
if (result.hasErrors()) {
return "error";
}
-
model.addAttribute("name", employee.getName());
model.addAttribute("contactNumber", employee.getContactNumber());
model.addAttribute("id", employee.getId());
+
+ employeeMap.put(employee.getId(), employee);
+
return "employeeView";
}
diff --git a/spring-mvc-java/src/main/java/com/baeldung/web/controller/FileUploadController.java b/spring-mvc-java/src/main/java/com/baeldung/web/controller/FileUploadController.java
new file mode 100644
index 0000000000..bc9cf13c34
--- /dev/null
+++ b/spring-mvc-java/src/main/java/com/baeldung/web/controller/FileUploadController.java
@@ -0,0 +1,32 @@
+package com.baeldung.web.controller;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+
+@Controller
+public class FileUploadController {
+
+ @RequestMapping(value = "/fileUpload", method = RequestMethod.GET)
+ public String displayForm() {
+
+ return "fileUploadForm";
+ }
+
+ @RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
+ public String submit(@RequestParam("file") final MultipartFile file, final ModelMap modelMap) {
+
+ modelMap.addAttribute("file", file);
+ return "fileUploadView";
+ }
+
+ @RequestMapping(value = "/uploadMultiFile", method = RequestMethod.POST)
+ public String submit(@RequestParam("files") final MultipartFile[] files, final ModelMap modelMap) {
+
+ modelMap.addAttribute("files", files);
+ return "fileUploadView";
+ }
+}
diff --git a/spring-mvc-java/src/main/java/org/baeldung/web/controller/UserController.java b/spring-mvc-java/src/main/java/com/baeldung/web/controller/UserController.java
similarity index 90%
rename from spring-mvc-java/src/main/java/org/baeldung/web/controller/UserController.java
rename to spring-mvc-java/src/main/java/com/baeldung/web/controller/UserController.java
index da39a36adf..fda159f204 100644
--- a/spring-mvc-java/src/main/java/org/baeldung/web/controller/UserController.java
+++ b/spring-mvc-java/src/main/java/com/baeldung/web/controller/UserController.java
@@ -1,6 +1,6 @@
-package org.baeldung.web.controller;
+package com.baeldung.web.controller;
-import org.baeldung.model.User;
+import com.baeldung.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
diff --git a/spring-mvc-java/src/main/java/org/baeldung/spring/web/config/ClientWebConfig.java b/spring-mvc-java/src/main/java/org/baeldung/spring/web/config/ClientWebConfig.java
deleted file mode 100644
index db57b4716b..0000000000
--- a/spring-mvc-java/src/main/java/org/baeldung/spring/web/config/ClientWebConfig.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package org.baeldung.spring.web.config;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.baeldung.dialect.CustomDialect;
-import org.springframework.context.MessageSource;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Description;
-import org.springframework.context.support.ResourceBundleMessageSource;
-import org.springframework.web.servlet.ViewResolver;
-import org.springframework.web.servlet.config.annotation.EnableWebMvc;
-import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
-import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
-import org.springframework.web.servlet.view.InternalResourceViewResolver;
-import org.springframework.web.servlet.view.JstlView;
-import org.thymeleaf.dialect.IDialect;
-import org.thymeleaf.spring4.SpringTemplateEngine;
-import org.thymeleaf.spring4.view.ThymeleafViewResolver;
-import org.thymeleaf.templateresolver.ServletContextTemplateResolver;
-
-@EnableWebMvc
-@Configuration
-public class ClientWebConfig extends WebMvcConfigurerAdapter {
-
- public ClientWebConfig() {
- super();
- }
-
- // API
-
- @Override
- public void addViewControllers(final ViewControllerRegistry registry) {
- super.addViewControllers(registry);
-
- registry.addViewController("/sample.html");
- }
-
- @Bean
- public ViewResolver thymeleafViewResolver() {
- final ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
- viewResolver.setTemplateEngine(templateEngine());
- viewResolver.setOrder(1);
- return viewResolver;
- }
-
- @Bean
- public ViewResolver viewResolver() {
- final InternalResourceViewResolver bean = new InternalResourceViewResolver();
- bean.setViewClass(JstlView.class);
- bean.setPrefix("/WEB-INF/view/");
- bean.setSuffix(".jsp");
- bean.setOrder(0);
- return bean;
- }
-
- @Bean
- @Description("Thymeleaf template resolver serving HTML 5")
- public ServletContextTemplateResolver templateResolver() {
- final ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver();
- templateResolver.setPrefix("/WEB-INF/templates/");
- templateResolver.setSuffix(".html");
- templateResolver.setTemplateMode("HTML5");
- return templateResolver;
- }
-
- @Bean
- @Description("Thymeleaf template engine with Spring integration")
- public SpringTemplateEngine templateEngine() {
- final SpringTemplateEngine templateEngine = new SpringTemplateEngine();
- templateEngine.setTemplateResolver(templateResolver());
- final Set dialects = new HashSet<>();
- dialects.add(new CustomDialect());
- templateEngine.setAdditionalDialects(dialects);
- return templateEngine;
- }
-
- @Bean
- @Description("Spring message resolver")
- public MessageSource messageSource() {
- final ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
- messageSource.setBasename("messages");
- return messageSource;
- }
-
- @Override
- public void addResourceHandlers(final ResourceHandlerRegistry registry) {
- registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
- }
-
-}
\ No newline at end of file
diff --git a/spring-mvc-java/src/main/java/org/baeldung/spring/web/config/MainWebAppInitializer.java b/spring-mvc-java/src/main/java/org/baeldung/spring/web/config/MainWebAppInitializer.java
deleted file mode 100644
index 87502e2088..0000000000
--- a/spring-mvc-java/src/main/java/org/baeldung/spring/web/config/MainWebAppInitializer.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.baeldung.spring.web.config;
-
-import java.util.Set;
-
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRegistration;
-
-import org.springframework.web.WebApplicationInitializer;
-import org.springframework.web.context.ContextLoaderListener;
-import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
-import org.springframework.web.context.support.GenericWebApplicationContext;
-import org.springframework.web.servlet.DispatcherServlet;
-
-public class MainWebAppInitializer implements WebApplicationInitializer {
-
- /**
- * Register and configure all Servlet container components necessary to power the web application.
- */
- @Override
- public void onStartup(final ServletContext sc) throws ServletException {
- System.out.println("MainWebAppInitializer.onStartup()");
-
- // Create the 'root' Spring application context
- final AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext();
- root.scan("org.baeldung.spring.web.config");
- // root.getEnvironment().setDefaultProfiles("embedded");
-
- // Manages the lifecycle of the root application context
- sc.addListener(new ContextLoaderListener(root));
-
- // Handles requests into the application
- final ServletRegistration.Dynamic appServlet = sc.addServlet("mvc", new DispatcherServlet(new GenericWebApplicationContext()));
- appServlet.setLoadOnStartup(1);
- final Set mappingConflicts = appServlet.addMapping("/");
- if (!mappingConflicts.isEmpty()) {
- throw new IllegalStateException("'appServlet' could not be mapped to '/' due " + "to an existing mapping. This is a known issue under Tomcat versions " + "<= 7.0.14; see https://issues.apache.org/bugzilla/show_bug.cgi?id=51278");
- }
- }
-
-}
diff --git a/spring-mvc-java/src/main/resources/org/baeldung/aop/beans.xml b/spring-mvc-java/src/main/resources/com/baeldung/aop/beans.xml
similarity index 86%
rename from spring-mvc-java/src/main/resources/org/baeldung/aop/beans.xml
rename to spring-mvc-java/src/main/resources/com/baeldung/aop/beans.xml
index 17c63e39e4..e6aa9d77c4 100644
--- a/spring-mvc-java/src/main/resources/org/baeldung/aop/beans.xml
+++ b/spring-mvc-java/src/main/resources/com/baeldung/aop/beans.xml
@@ -7,8 +7,8 @@
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">
-
-
+
+
diff --git a/spring-mvc-java/src/main/webapp/WEB-INF/view/employeeHome.jsp b/spring-mvc-java/src/main/webapp/WEB-INF/view/employeeHome.jsp
new file mode 100644
index 0000000000..c000bea39f
--- /dev/null
+++ b/spring-mvc-java/src/main/webapp/WEB-INF/view/employeeHome.jsp
@@ -0,0 +1,33 @@
+<%@ 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 - Register an Employee
+
+
+ Welcome, Enter The Employee Details
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-mvc-java/src/main/webapp/WEB-INF/view/employeeView.jsp b/spring-mvc-java/src/main/webapp/WEB-INF/view/employeeView.jsp
new file mode 100644
index 0000000000..1457bc5fc8
--- /dev/null
+++ b/spring-mvc-java/src/main/webapp/WEB-INF/view/employeeView.jsp
@@ -0,0 +1,24 @@
+<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
+
+
+Spring MVC Form Handling
+
+
+
+ Submitted Employee Information
+
+
+ Name :
+ ${name}
+
+
+ ID :
+ ${id}
+
+
+ Contact Number :
+ ${contactNumber}
+
+
+
+
\ No newline at end of file
diff --git a/spring-mvc-java/src/main/webapp/WEB-INF/view/fileUploadForm.jsp b/spring-mvc-java/src/main/webapp/WEB-INF/view/fileUploadForm.jsp
new file mode 100644
index 0000000000..1414b824ff
--- /dev/null
+++ b/spring-mvc-java/src/main/webapp/WEB-INF/view/fileUploadForm.jsp
@@ -0,0 +1,55 @@
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
+<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
+
+
+
+ File Upload Example
+
+
+
+
+ Enter The File to Upload (Single file)
+
+
+
+
+
+
+
+
+
+ Enter The Files to Upload (Multiple files)
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-mvc-java/src/main/webapp/WEB-INF/view/fileUploadView.jsp b/spring-mvc-java/src/main/webapp/WEB-INF/view/fileUploadView.jsp
new file mode 100644
index 0000000000..d6f748c6af
--- /dev/null
+++ b/spring-mvc-java/src/main/webapp/WEB-INF/view/fileUploadView.jsp
@@ -0,0 +1,36 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+
+
+
+ Spring MVC File Upload
+
+
+
+ Submitted File (Single)
+
+
+ OriginalFileName :
+ ${file.originalFilename}
+
+
+ Type :
+ ${file.contentType}
+
+
+
+
+ Submitted Files (Multiple)
+
+
+
+ OriginalFileName :
+ ${file.originalFilename}
+
+
+ Type :
+ ${file.contentType}
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-mvc-java/src/main/webapp/WEB-INF/web_old.xml b/spring-mvc-java/src/main/webapp/WEB-INF/web_old.xml
index 016369ad27..c8b38fae30 100644
--- a/spring-mvc-java/src/main/webapp/WEB-INF/web_old.xml
+++ b/spring-mvc-java/src/main/webapp/WEB-INF/web_old.xml
@@ -16,7 +16,7 @@
contextConfigLocation
- org.baeldung.spring.web.config
+ com.baeldung.spring.web.config
diff --git a/spring-mvc-java/src/test/java/org/baeldung/aop/AopLoggingTest.java b/spring-mvc-java/src/test/java/com/baeldung/aop/AopLoggingTest.java
similarity index 95%
rename from spring-mvc-java/src/test/java/org/baeldung/aop/AopLoggingTest.java
rename to spring-mvc-java/src/test/java/com/baeldung/aop/AopLoggingTest.java
index b1c9867e41..19bf4d0fac 100644
--- a/spring-mvc-java/src/test/java/org/baeldung/aop/AopLoggingTest.java
+++ b/spring-mvc-java/src/test/java/com/baeldung/aop/AopLoggingTest.java
@@ -1,8 +1,8 @@
-package org.baeldung.aop;
+package com.baeldung.aop;
-import org.baeldung.config.TestConfig;
-import org.baeldung.dao.FooDao;
-import org.baeldung.model.Foo;
+import com.baeldung.config.TestConfig;
+import com.baeldung.dao.FooDao;
+import com.baeldung.model.Foo;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-mvc-java/src/test/java/org/baeldung/aop/AopPerformanceTest.java b/spring-mvc-java/src/test/java/com/baeldung/aop/AopPerformanceTest.java
similarity index 95%
rename from spring-mvc-java/src/test/java/org/baeldung/aop/AopPerformanceTest.java
rename to spring-mvc-java/src/test/java/com/baeldung/aop/AopPerformanceTest.java
index 69083c60a2..4ad5a3e1a6 100644
--- a/spring-mvc-java/src/test/java/org/baeldung/aop/AopPerformanceTest.java
+++ b/spring-mvc-java/src/test/java/com/baeldung/aop/AopPerformanceTest.java
@@ -1,7 +1,7 @@
-package org.baeldung.aop;
+package com.baeldung.aop;
-import org.baeldung.config.TestConfig;
-import org.baeldung.dao.FooDao;
+import com.baeldung.config.TestConfig;
+import com.baeldung.dao.FooDao;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-mvc-java/src/test/java/org/baeldung/aop/AopPublishingTest.java b/spring-mvc-java/src/test/java/com/baeldung/aop/AopPublishingTest.java
similarity index 90%
rename from spring-mvc-java/src/test/java/org/baeldung/aop/AopPublishingTest.java
rename to spring-mvc-java/src/test/java/com/baeldung/aop/AopPublishingTest.java
index e691dbd32e..c075db9fc6 100644
--- a/spring-mvc-java/src/test/java/org/baeldung/aop/AopPublishingTest.java
+++ b/spring-mvc-java/src/test/java/com/baeldung/aop/AopPublishingTest.java
@@ -1,9 +1,9 @@
-package org.baeldung.aop;
+package com.baeldung.aop;
-import org.baeldung.config.TestConfig;
-import org.baeldung.dao.FooDao;
-import org.baeldung.events.FooCreationEventListener;
-import org.baeldung.model.Foo;
+import com.baeldung.config.TestConfig;
+import com.baeldung.dao.FooDao;
+import com.baeldung.events.FooCreationEventListener;
+import com.baeldung.model.Foo;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-mvc-java/src/test/java/org/baeldung/aop/AopXmlConfigPerformanceTest.java b/spring-mvc-java/src/test/java/com/baeldung/aop/AopXmlConfigPerformanceTest.java
similarity index 94%
rename from spring-mvc-java/src/test/java/org/baeldung/aop/AopXmlConfigPerformanceTest.java
rename to spring-mvc-java/src/test/java/com/baeldung/aop/AopXmlConfigPerformanceTest.java
index 7ef25d743c..4d2df50d18 100644
--- a/spring-mvc-java/src/test/java/org/baeldung/aop/AopXmlConfigPerformanceTest.java
+++ b/spring-mvc-java/src/test/java/com/baeldung/aop/AopXmlConfigPerformanceTest.java
@@ -1,6 +1,6 @@
-package org.baeldung.aop;
+package com.baeldung.aop;
-import org.baeldung.dao.FooDao;
+import com.baeldung.dao.FooDao;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -21,7 +21,7 @@ import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration("/org/baeldung/aop/beans.xml")
+@ContextConfiguration("/com/baeldung/aop/beans.xml")
public class AopXmlConfigPerformanceTest {
@Before
diff --git a/spring-mvc-java/src/test/java/org/baeldung/config/TestConfig.java b/spring-mvc-java/src/test/java/com/baeldung/config/TestConfig.java
similarity index 67%
rename from spring-mvc-java/src/test/java/org/baeldung/config/TestConfig.java
rename to spring-mvc-java/src/test/java/com/baeldung/config/TestConfig.java
index f9573b2add..641513a24a 100644
--- a/spring-mvc-java/src/test/java/org/baeldung/config/TestConfig.java
+++ b/spring-mvc-java/src/test/java/com/baeldung/config/TestConfig.java
@@ -1,11 +1,11 @@
-package org.baeldung.config;
+package com.baeldung.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@Configuration
-@ComponentScan(basePackages = { "org.baeldung.dao", "org.baeldung.aop", "org.baeldung.events" })
+@ComponentScan(basePackages = { "com.baeldung.dao", "com.baeldung.aop", "com.baeldung.events" })
@EnableAspectJAutoProxy
public class TestConfig {
}
diff --git a/spring-mvc-no-xml/pom.xml b/spring-mvc-no-xml/pom.xml
index da71a699db..202aee7295 100644
--- a/spring-mvc-no-xml/pom.xml
+++ b/spring-mvc-no-xml/pom.xml
@@ -1,6 +1,6 @@
4.0.0
- org.baeldung
+ com.baeldung
0.1-SNAPSHOT
spring-mvc-no-xml
@@ -144,7 +144,7 @@
- 4.2.4.RELEASE
+ 4.2.5.RELEASE
1.7.13
@@ -158,14 +158,14 @@
4.4.1
4.5
- 2.4.1
+ 2.9.0
- 3.3
+ 3.5.1
2.6
- 2.18.1
+ 2.19.1
2.7
- 1.4.15
+ 1.4.18
diff --git a/spring-mvc-xml/.externalToolBuilders/org.eclipse.wst.jsdt.core.javascriptValidator.launch b/spring-mvc-xml/.externalToolBuilders/org.eclipse.wst.jsdt.core.javascriptValidator.launch
deleted file mode 100644
index 627021fb96..0000000000
--- a/spring-mvc-xml/.externalToolBuilders/org.eclipse.wst.jsdt.core.javascriptValidator.launch
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/spring-mvc-xml/.settings/.jsdtscope b/spring-mvc-xml/.settings/.jsdtscope
deleted file mode 100644
index b46b9207a8..0000000000
--- a/spring-mvc-xml/.settings/.jsdtscope
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/spring-mvc-xml/.settings/org.eclipse.jdt.core.prefs b/spring-mvc-xml/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 5ff04b9f96..0000000000
--- a/spring-mvc-xml/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,91 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
-org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
-org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
-org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
-org.eclipse.jdt.core.compiler.compliance=1.8
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
-org.eclipse.jdt.core.compiler.problem.deadCode=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=error
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=error
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
-org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=error
-org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
diff --git a/spring-mvc-xml/.settings/org.eclipse.jdt.ui.prefs b/spring-mvc-xml/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 471e9b0d81..0000000000
--- a/spring-mvc-xml/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,55 +0,0 @@
-#Sat Jan 21 23:04:06 EET 2012
-eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_missing_override_annotations_interface_methods=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=true
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.convert_to_enhanced_for_loop=true
-sp_cleanup.correct_indentation=true
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=true
-sp_cleanup.make_local_variable_final=true
-sp_cleanup.make_parameters_final=true
-sp_cleanup.make_private_fields_final=false
-sp_cleanup.make_type_abstract_if_missing_method=false
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=false
-sp_cleanup.on_save_use_additional_actions=true
-sp_cleanup.organize_imports=true
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_trailing_whitespaces=true
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=true
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.use_blocks=false
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_this_for_non_static_field_access=true
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=true
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/spring-mvc-xml/.settings/org.eclipse.m2e.core.prefs b/spring-mvc-xml/.settings/org.eclipse.m2e.core.prefs
deleted file mode 100644
index f897a7f1cb..0000000000
--- a/spring-mvc-xml/.settings/org.eclipse.m2e.core.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-activeProfiles=
-eclipse.preferences.version=1
-resolveWorkspaceProjects=true
-version=1
diff --git a/spring-mvc-xml/.settings/org.eclipse.m2e.wtp.prefs b/spring-mvc-xml/.settings/org.eclipse.m2e.wtp.prefs
deleted file mode 100644
index ef86089622..0000000000
--- a/spring-mvc-xml/.settings/org.eclipse.m2e.wtp.prefs
+++ /dev/null
@@ -1,2 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.m2e.wtp.enabledProjectSpecificPrefs=false
diff --git a/spring-mvc-xml/.settings/org.eclipse.wst.common.component b/spring-mvc-xml/.settings/org.eclipse.wst.common.component
deleted file mode 100644
index fc995759ac..0000000000
--- a/spring-mvc-xml/.settings/org.eclipse.wst.common.component
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/spring-mvc-xml/.settings/org.eclipse.wst.common.project.facet.core.xml b/spring-mvc-xml/.settings/org.eclipse.wst.common.project.facet.core.xml
deleted file mode 100644
index 9ca0d1c1b7..0000000000
--- a/spring-mvc-xml/.settings/org.eclipse.wst.common.project.facet.core.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/spring-mvc-xml/.settings/org.eclipse.wst.jsdt.ui.superType.container b/spring-mvc-xml/.settings/org.eclipse.wst.jsdt.ui.superType.container
deleted file mode 100644
index 3bd5d0a480..0000000000
--- a/spring-mvc-xml/.settings/org.eclipse.wst.jsdt.ui.superType.container
+++ /dev/null
@@ -1 +0,0 @@
-org.eclipse.wst.jsdt.launching.baseBrowserLibrary
\ No newline at end of file
diff --git a/spring-mvc-xml/.settings/org.eclipse.wst.jsdt.ui.superType.name b/spring-mvc-xml/.settings/org.eclipse.wst.jsdt.ui.superType.name
deleted file mode 100644
index 05bd71b6ec..0000000000
--- a/spring-mvc-xml/.settings/org.eclipse.wst.jsdt.ui.superType.name
+++ /dev/null
@@ -1 +0,0 @@
-Window
\ No newline at end of file
diff --git a/spring-mvc-xml/.settings/org.eclipse.wst.validation.prefs b/spring-mvc-xml/.settings/org.eclipse.wst.validation.prefs
deleted file mode 100644
index 0d0aee4f72..0000000000
--- a/spring-mvc-xml/.settings/org.eclipse.wst.validation.prefs
+++ /dev/null
@@ -1,15 +0,0 @@
-DELEGATES_PREFERENCE=delegateValidatorList
-USER_BUILD_PREFERENCE=enabledBuildValidatorListorg.eclipse.jst.j2ee.internal.classpathdep.ClasspathDependencyValidator;
-USER_MANUAL_PREFERENCE=enabledManualValidatorListorg.eclipse.jst.j2ee.internal.classpathdep.ClasspathDependencyValidator;
-USER_PREFERENCE=overrideGlobalPreferencestruedisableAllValidationfalseversion1.2.402.v201212031633
-disabled=06target
-eclipse.preferences.version=1
-override=true
-suspend=false
-vals/org.eclipse.jst.jsf.ui.JSFAppConfigValidator/global=FF01
-vals/org.eclipse.jst.jsp.core.JSPBatchValidator/global=FF01
-vals/org.eclipse.jst.jsp.core.JSPContentValidator/global=FF01
-vals/org.eclipse.jst.jsp.core.TLDValidator/global=FF01
-vals/org.eclipse.wst.dtd.core.dtdDTDValidator/global=FF01
-vals/org.eclipse.wst.jsdt.web.core.JsBatchValidator/global=TF02
-vf.version=3
diff --git a/spring-mvc-xml/.settings/org.eclipse.wst.ws.service.policy.prefs b/spring-mvc-xml/.settings/org.eclipse.wst.ws.service.policy.prefs
deleted file mode 100644
index 9cfcabe16f..0000000000
--- a/spring-mvc-xml/.settings/org.eclipse.wst.ws.service.policy.prefs
+++ /dev/null
@@ -1,2 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.wst.ws.service.policy.projectEnabled=false
diff --git a/spring-mvc-xml/.springBeans b/spring-mvc-xml/.springBeans
deleted file mode 100644
index 7623a7e888..0000000000
--- a/spring-mvc-xml/.springBeans
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
- 1
-
-
-
-
-
-
- src/main/webapp/WEB-INF/mvc-servlet.xml
-
-
-
-
diff --git a/spring-mvc-xml/pom.xml b/spring-mvc-xml/pom.xml
index 896d744e99..f77efe501b 100644
--- a/spring-mvc-xml/pom.xml
+++ b/spring-mvc-xml/pom.xml
@@ -1,6 +1,6 @@
4.0.0
- org.baeldung
+ com.baeldung
0.1-SNAPSHOT
spring-mvc-xml
@@ -98,6 +98,18 @@
test
+
+
+ com.fasterxml.jackson.core
+ jackson-core
+ 2.7.2
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.7.2
+
+
@@ -146,7 +158,7 @@
- 4.2.4.RELEASE
+ 4.2.5.RELEASE
1.7.13
@@ -160,14 +172,14 @@
4.4.1
4.5
- 2.4.1
+ 2.9.0
- 3.3
+ 3.5.1
2.6
- 2.18.1
+ 2.19.1
2.7
- 1.4.15
+ 1.4.18
diff --git a/spring-mvc-xml/src/main/java/org/baeldung/spring/ClientWebConfig.java b/spring-mvc-xml/src/main/java/com/baeldung/spring/ClientWebConfig.java
similarity index 77%
rename from spring-mvc-xml/src/main/java/org/baeldung/spring/ClientWebConfig.java
rename to spring-mvc-xml/src/main/java/com/baeldung/spring/ClientWebConfig.java
index c4d819caa5..76351b96f7 100644
--- a/spring-mvc-xml/src/main/java/org/baeldung/spring/ClientWebConfig.java
+++ b/spring-mvc-xml/src/main/java/com/baeldung/spring/ClientWebConfig.java
@@ -1,4 +1,4 @@
-package org.baeldung.spring;
+package com.baeldung.spring;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
@@ -8,10 +8,10 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter
@Configuration
public class ClientWebConfig extends WebMvcConfigurerAdapter {
- public ClientWebConfig() {
- super();
- }
+ public ClientWebConfig() {
+ super();
+ }
- // API
+ // API
}
\ No newline at end of file
diff --git a/spring-mvc-xml/src/main/java/com/baeldung/spring/ClientWebConfigJava.java b/spring-mvc-xml/src/main/java/com/baeldung/spring/ClientWebConfigJava.java
new file mode 100644
index 0000000000..bee09b742a
--- /dev/null
+++ b/spring-mvc-xml/src/main/java/com/baeldung/spring/ClientWebConfigJava.java
@@ -0,0 +1,56 @@
+package com.baeldung.spring;
+
+import java.util.Locale;
+import java.util.ResourceBundle;
+
+import org.springframework.context.MessageSource;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.support.MessageSourceResourceBundle;
+import org.springframework.context.support.ResourceBundleMessageSource;
+import org.springframework.web.servlet.ViewResolver;
+import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+import org.springframework.web.servlet.view.InternalResourceViewResolver;
+import org.springframework.web.servlet.view.JstlView;
+
+//@EnableWebMvc
+//@Configuration
+public class ClientWebConfigJava extends WebMvcConfigurerAdapter {
+
+ public ClientWebConfigJava() {
+ super();
+ }
+
+ @Bean
+ public MessageSource messageSource() {
+
+ final ResourceBundleMessageSource ms = new ResourceBundleMessageSource();
+ ms.setBasenames("messages");
+ return ms;
+ }
+
+ @Bean
+ public ResourceBundle getBeanResourceBundle() {
+
+ final Locale locale = Locale.getDefault();
+ return new MessageSourceResourceBundle(messageSource(), locale);
+ }
+
+ @Override
+ public void addViewControllers(final ViewControllerRegistry registry) {
+ super.addViewControllers(registry);
+
+ registry.addViewController("/sample.html");
+ }
+
+ @Bean
+ public ViewResolver viewResolver() {
+ final InternalResourceViewResolver bean = new InternalResourceViewResolver();
+
+ bean.setViewClass(JstlView.class);
+ bean.setPrefix("/WEB-INF/view/");
+ bean.setSuffix(".jsp");
+
+ return bean;
+ }
+}
\ No newline at end of file
diff --git a/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/EmployeeController.java b/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/EmployeeController.java
new file mode 100644
index 0000000000..aa25f47a2a
--- /dev/null
+++ b/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/EmployeeController.java
@@ -0,0 +1,45 @@
+package com.baeldung.spring.controller;
+
+import java.util.HashMap;
+import java.util.Map;
+
+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.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.baeldung.spring.form.Employee;
+
+@Controller
+public class EmployeeController {
+
+ Map employeeMap = new HashMap<>();
+
+ @RequestMapping(value = "/employee", method = RequestMethod.GET)
+ public ModelAndView showForm() {
+ return new ModelAndView("employeeHome", "employee", new Employee());
+ }
+
+ @RequestMapping(value = "/employee/{Id}", produces = { "application/json", "application/xml" }, method = RequestMethod.GET)
+ public @ResponseBody Employee getEmployeeById(@PathVariable final long Id) {
+ return employeeMap.get(Id);
+ }
+
+ @RequestMapping(value = "/addEmployee", method = RequestMethod.POST)
+ public String submit(@ModelAttribute("employee") final Employee employee, final BindingResult result, final ModelMap model) {
+ if (result.hasErrors()) {
+ return "error";
+ }
+ model.addAttribute("name", employee.getName());
+ model.addAttribute("contactNumber", employee.getContactNumber());
+ model.addAttribute("id", employee.getId());
+ employeeMap.put(employee.getId(), employee);
+ return "employeeView";
+ }
+
+}
diff --git a/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/HelloController.java b/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/HelloController.java
new file mode 100644
index 0000000000..cc9d66d4d4
--- /dev/null
+++ b/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/HelloController.java
@@ -0,0 +1,19 @@
+package com.baeldung.spring.controller;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.mvc.AbstractController;
+
+public class HelloController extends AbstractController {
+
+ @Override
+ protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
+ ModelAndView model = new ModelAndView("helloworld");
+ model.addObject("msg", "Welcome to Baeldung's Spring Handler Mappings Guide. This request was mapped" +
+ " using SimpleUrlHandlerMapping.");
+
+ return model;
+ }
+}
diff --git a/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/HelloGuestController.java b/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/HelloGuestController.java
new file mode 100644
index 0000000000..614888ae42
--- /dev/null
+++ b/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/HelloGuestController.java
@@ -0,0 +1,18 @@
+package com.baeldung.spring.controller;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.mvc.AbstractController;
+
+public class HelloGuestController extends AbstractController {
+ @Override
+ protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
+ ModelAndView model = new ModelAndView("helloworld");
+ model.addObject("msg", "Welcome to Baeldung's Spring Handler Mappings Guide. This request was mapped" +
+ " using ControllerClassNameHandlerMapping.");
+
+ return model;
+ }
+}
diff --git a/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/HelloWorldController.java b/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/HelloWorldController.java
new file mode 100644
index 0000000000..6ed3d06ab7
--- /dev/null
+++ b/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/HelloWorldController.java
@@ -0,0 +1,18 @@
+package com.baeldung.spring.controller;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.mvc.AbstractController;
+
+public class HelloWorldController extends AbstractController {
+ @Override
+ protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
+ ModelAndView model = new ModelAndView("helloworld");
+ model.addObject("msg", "Welcome to Baeldung's Spring Handler Mappings Guide. This request was mapped" +
+ " using BeanNameUrlHandlerMapping.");
+
+ return model;
+ }
+}
diff --git a/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/PersonController.java b/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/PersonController.java
new file mode 100644
index 0000000000..39dabf86ed
--- /dev/null
+++ b/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/PersonController.java
@@ -0,0 +1,84 @@
+package com.baeldung.spring.controller;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.validation.Valid;
+
+import com.baeldung.spring.form.Person;
+import com.baeldung.spring.validator.PersonValidator;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.ui.ModelMap;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.servlet.ModelAndView;
+
+@Controller
+public class PersonController {
+
+ @Autowired
+ PersonValidator validator;
+
+ @RequestMapping(value = "/person", method = RequestMethod.GET)
+ public ModelAndView showForm(final Model model) {
+
+ initData(model);
+ return new ModelAndView("personForm", "person", new Person());
+ }
+
+ @RequestMapping(value = "/addPerson", method = RequestMethod.POST)
+ public String submit(@Valid @ModelAttribute("person") final Person person, final BindingResult result,
+ final ModelMap modelMap, final Model model) {
+
+ validator.validate(person, result);
+
+ if (result.hasErrors()) {
+
+ initData(model);
+ return "personForm";
+ }
+
+ modelMap.addAttribute("person", person);
+
+ return "personView";
+ }
+
+ private void initData(final Model model) {
+
+ final List favouriteLanguageItem = new ArrayList();
+ favouriteLanguageItem.add("Java");
+ favouriteLanguageItem.add("C++");
+ favouriteLanguageItem.add("Perl");
+ model.addAttribute("favouriteLanguageItem", favouriteLanguageItem);
+
+ final List jobItem = new ArrayList();
+ jobItem.add("Full time");
+ jobItem.add("Part time");
+ model.addAttribute("jobItem", jobItem);
+
+ final Map countryItems = new LinkedHashMap();
+ countryItems.put("US", "United Stated");
+ countryItems.put("IT", "Italy");
+ countryItems.put("UK", "United Kingdom");
+ countryItems.put("FR", "Grance");
+ model.addAttribute("countryItems", countryItems);
+
+ final List fruit = new ArrayList();
+ fruit.add("Banana");
+ fruit.add("Mango");
+ fruit.add("Apple");
+ model.addAttribute("fruit", fruit);
+
+ final List books = new ArrayList();
+ books.add("The Great Gatsby");
+ books.add("Nineteen Eighty-Four");
+ books.add("The Lord of the Rings");
+ model.addAttribute("books", books);
+ }
+}
diff --git a/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/WelcomeController.java b/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/WelcomeController.java
new file mode 100644
index 0000000000..5459481674
--- /dev/null
+++ b/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/WelcomeController.java
@@ -0,0 +1,19 @@
+package com.baeldung.spring.controller;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.mvc.AbstractController;
+
+public class WelcomeController extends AbstractController {
+ @Override
+ protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ ModelAndView model = new ModelAndView("welcome");
+ model.addObject("msg", " Baeldung's Spring Handler Mappings Guide. This request was mapped" +
+ " using SimpleUrlHandlerMapping.");
+
+ return model;
+ }
+}
\ No newline at end of file
diff --git a/spring-mvc-xml/src/main/java/org/baeldung/spring/form/Employee.java b/spring-mvc-xml/src/main/java/com/baeldung/spring/form/Employee.java
similarity index 88%
rename from spring-mvc-xml/src/main/java/org/baeldung/spring/form/Employee.java
rename to spring-mvc-xml/src/main/java/com/baeldung/spring/form/Employee.java
index 70132b9665..66b2e9f185 100644
--- a/spring-mvc-xml/src/main/java/org/baeldung/spring/form/Employee.java
+++ b/spring-mvc-xml/src/main/java/com/baeldung/spring/form/Employee.java
@@ -1,8 +1,10 @@
-package org.baeldung.spring.form;
+package com.baeldung.spring.form;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
+import javax.xml.bind.annotation.XmlRootElement;
+@XmlRootElement
public class Employee {
private long id;
diff --git a/spring-mvc-xml/src/main/java/com/baeldung/spring/form/Person.java b/spring-mvc-xml/src/main/java/com/baeldung/spring/form/Person.java
new file mode 100644
index 0000000000..88e4f9ff4c
--- /dev/null
+++ b/spring-mvc-xml/src/main/java/com/baeldung/spring/form/Person.java
@@ -0,0 +1,152 @@
+package com.baeldung.spring.form;
+
+import java.util.List;
+
+import org.hibernate.validator.constraints.NotEmpty;
+import org.springframework.web.multipart.MultipartFile;
+
+public class Person {
+
+ private long id;
+
+ private String name;
+ private String email;
+ private String dateOfBirth;
+
+ @NotEmpty
+ private String password;
+ private String sex;
+ private String country;
+ private String book;
+ private String job;
+ private boolean receiveNewsletter;
+ private String[] hobbies;
+ private List favouriteLanguage;
+ private List fruit;
+ private String notes;
+ private MultipartFile file;
+
+ public Person() {
+ super();
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(final long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(final String name) {
+ this.name = name;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(final String email) {
+ this.email = email;
+ }
+
+ public String getDateOfBirth() {
+ return dateOfBirth;
+ }
+
+ public void setDateOfBirth(final String dateOfBirth) {
+ this.dateOfBirth = dateOfBirth;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(final String password) {
+ this.password = password;
+ }
+
+ public String getSex() {
+ return sex;
+ }
+
+ public void setSex(final String sex) {
+ this.sex = sex;
+ }
+
+ public String getCountry() {
+ return country;
+ }
+
+ public void setCountry(final String country) {
+ this.country = country;
+ }
+
+ public String getJob() {
+ return job;
+ }
+
+ public void setJob(final String job) {
+ this.job = job;
+ }
+
+ public boolean isReceiveNewsletter() {
+ return receiveNewsletter;
+ }
+
+ public void setReceiveNewsletter(final boolean receiveNewsletter) {
+ this.receiveNewsletter = receiveNewsletter;
+ }
+
+ public String[] getHobbies() {
+ return hobbies;
+ }
+
+ public void setHobbies(final String[] hobbies) {
+ this.hobbies = hobbies;
+ }
+
+ public List getFavouriteLanguage() {
+ return favouriteLanguage;
+ }
+
+ public void setFavouriteLanguage(final List favouriteLanguage) {
+ this.favouriteLanguage = favouriteLanguage;
+ }
+
+ public String getNotes() {
+ return notes;
+ }
+
+ public void setNotes(final String notes) {
+ this.notes = notes;
+ }
+
+ public List getFruit() {
+ return fruit;
+ }
+
+ public void setFruit(final List fruit) {
+ this.fruit = fruit;
+ }
+
+ public String getBook() {
+ return book;
+ }
+
+ public void setBook(final String book) {
+ this.book = book;
+ }
+
+ public MultipartFile getFile() {
+ return file;
+ }
+
+ public void setFile(final MultipartFile file) {
+ this.file = file;
+ }
+}
diff --git a/spring-mvc-xml/src/main/java/com/baeldung/spring/validator/PersonValidator.java b/spring-mvc-xml/src/main/java/com/baeldung/spring/validator/PersonValidator.java
new file mode 100644
index 0000000000..3a271f6545
--- /dev/null
+++ b/spring-mvc-xml/src/main/java/com/baeldung/spring/validator/PersonValidator.java
@@ -0,0 +1,22 @@
+package com.baeldung.spring.validator;
+
+import com.baeldung.spring.form.Person;
+import org.springframework.stereotype.Component;
+import org.springframework.validation.Errors;
+import org.springframework.validation.ValidationUtils;
+import org.springframework.validation.Validator;
+
+@Component
+public class PersonValidator implements Validator {
+
+ @Override
+ public boolean supports(final Class calzz) {
+ return Person.class.isAssignableFrom(calzz);
+ }
+
+ @Override
+ public void validate(final Object obj, final Errors errors) {
+
+ ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "required.name");
+ }
+}
\ No newline at end of file
diff --git a/spring-mvc-xml/src/main/java/org/baeldung/spring/ClientWebConfigJava.java b/spring-mvc-xml/src/main/java/org/baeldung/spring/ClientWebConfigJava.java
deleted file mode 100644
index d2b57da818..0000000000
--- a/spring-mvc-xml/src/main/java/org/baeldung/spring/ClientWebConfigJava.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.baeldung.spring;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.web.servlet.ViewResolver;
-import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
-import org.springframework.web.servlet.view.InternalResourceViewResolver;
-import org.springframework.web.servlet.view.JstlView;
-
-//@EnableWebMvc
-//@Configuration
-public class ClientWebConfigJava extends WebMvcConfigurerAdapter {
-
- public ClientWebConfigJava() {
- super();
- }
-
- // API
-
- @Override
- public void addViewControllers(final ViewControllerRegistry registry) {
- super.addViewControllers(registry);
-
- registry.addViewController("/sample.html");
- }
-
- @Bean
- public ViewResolver viewResolver() {
- final InternalResourceViewResolver bean = new InternalResourceViewResolver();
-
- bean.setViewClass(JstlView.class);
- bean.setPrefix("/WEB-INF/view/");
- bean.setSuffix(".jsp");
-
- return bean;
- }
-}
\ No newline at end of file
diff --git a/spring-mvc-xml/src/main/resources/contentManagementWebMvcConfig.xml b/spring-mvc-xml/src/main/resources/contentManagementWebMvcConfig.xml
new file mode 100644
index 0000000000..e68c88d19d
--- /dev/null
+++ b/spring-mvc-xml/src/main/resources/contentManagementWebMvcConfig.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/spring-mvc-xml/src/main/resources/messages.properties b/spring-mvc-xml/src/main/resources/messages.properties
new file mode 100644
index 0000000000..2a3cccf76c
--- /dev/null
+++ b/spring-mvc-xml/src/main/resources/messages.properties
@@ -0,0 +1,2 @@
+required.name = Name is required!
+NotEmpty.person.password = Password is required!
\ No newline at end of file
diff --git a/spring-mvc-xml/src/main/resources/webMvcConfig.xml b/spring-mvc-xml/src/main/resources/webMvcConfig.xml
index a7aa252c08..4f2407d097 100644
--- a/spring-mvc-xml/src/main/resources/webMvcConfig.xml
+++ b/spring-mvc-xml/src/main/resources/webMvcConfig.xml
@@ -11,7 +11,9 @@
>
-
+
+
+
@@ -19,4 +21,8 @@
-
\ No newline at end of file
+
+
+
+
+
diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/mvc-servlet.xml b/spring-mvc-xml/src/main/webapp/WEB-INF/mvc-servlet.xml
index 4ba9642448..6cefb21961 100644
--- a/spring-mvc-xml/src/main/webapp/WEB-INF/mvc-servlet.xml
+++ b/spring-mvc-xml/src/main/webapp/WEB-INF/mvc-servlet.xml
@@ -1,6 +1,57 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ welcomeController
+ welcomeController
+ helloController
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/view/hello.jsp b/spring-mvc-xml/src/main/webapp/WEB-INF/view/hello.jsp
new file mode 100644
index 0000000000..2acdae9b0f
--- /dev/null
+++ b/spring-mvc-xml/src/main/webapp/WEB-INF/view/hello.jsp
@@ -0,0 +1,15 @@
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+ pageEncoding="ISO-8859-1"%>
+
+
+
+
+Hello World
+
+
+ Hello ${msg}
+
+
+ Go to spring handler mappings homepage
+
+
\ No newline at end of file
diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/view/helloworld.jsp b/spring-mvc-xml/src/main/webapp/WEB-INF/view/helloworld.jsp
new file mode 100644
index 0000000000..2eeabbe0ac
--- /dev/null
+++ b/spring-mvc-xml/src/main/webapp/WEB-INF/view/helloworld.jsp
@@ -0,0 +1,15 @@
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+ pageEncoding="ISO-8859-1"%>
+
+
+
+
+Hello World
+
+
+ Hello World ${msg}
+
+
+ Go to spring handler mappings homepage
+
+
\ No newline at end of file
diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/view/personForm.jsp b/spring-mvc-xml/src/main/webapp/WEB-INF/view/personForm.jsp
new file mode 100644
index 0000000000..535348b7d2
--- /dev/null
+++ b/spring-mvc-xml/src/main/webapp/WEB-INF/view/personForm.jsp
@@ -0,0 +1,120 @@
+<%@ 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 - Register a Person
+
+
+
+
+
+
+ Welcome, Enter the Person Details
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/view/personView.jsp b/spring-mvc-xml/src/main/webapp/WEB-INF/view/personView.jsp
new file mode 100644
index 0000000000..1f9ba86c69
--- /dev/null
+++ b/spring-mvc-xml/src/main/webapp/WEB-INF/view/personView.jsp
@@ -0,0 +1,65 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+
+
+
+ Spring MVC Form Handling
+
+
+
+ Submitted Person Information
+
+
+ Id :
+ ${person.id}
+
+
+ Name :
+ ${person.name}
+
+
+ Date of birth :
+ ${person.dateOfBirth}
+
+
+ Password :
+ ${person.password}
+
+
+ Sex :
+ ${person.sex}
+
+
+ Job :
+ ${person.job}
+
+
+ Country :
+ ${person.country}
+
+
+ Fruit :
+ [ ]
+
+
+ Book :
+ ${person.book}
+
+
+ Receive Newsletter :
+ ${person.receiveNewsletter}
+
+
+ Hobbies :
+ [ ]
+
+
+ Favourite Languages :
+ [ ]
+
+
+ Notes :
+ ${person.notes}
+
+
+
+
diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/view/welcome.jsp b/spring-mvc-xml/src/main/webapp/WEB-INF/view/welcome.jsp
new file mode 100644
index 0000000000..348ca652ff
--- /dev/null
+++ b/spring-mvc-xml/src/main/webapp/WEB-INF/view/welcome.jsp
@@ -0,0 +1,15 @@
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+ pageEncoding="ISO-8859-1"%>
+
+
+
+
+Welcome Page
+
+
+ Welcome to ${msg}
+
+
+ Go to spring handler mappings homepage
+
+
\ No newline at end of file
diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/web.xml b/spring-mvc-xml/src/main/webapp/WEB-INF/web.xml
index 5275efdf24..29608a17ef 100644
--- a/spring-mvc-xml/src/main/webapp/WEB-INF/web.xml
+++ b/spring-mvc-xml/src/main/webapp/WEB-INF/web.xml
@@ -16,7 +16,7 @@
contextConfigLocation
- org.baeldung.spring
+ com.baeldung.spring
diff --git a/spring-mvc-xml/src/main/webapp/index.jsp b/spring-mvc-xml/src/main/webapp/index.jsp
index 1ecfcec9d7..ce7b3107d8 100644
--- a/spring-mvc-xml/src/main/webapp/index.jsp
+++ b/spring-mvc-xml/src/main/webapp/index.jsp
@@ -12,6 +12,7 @@
Spring MVC Examples
+Spring Handler Mapping Examples
+Click each link below to see how the request is mapped using the specified mapping:
+
+
+ BeanNameUrlHandlerMapping - Mapping by bean name
+ SimpleUrlHandlerMapping
+ ControllerClassNameHandlerMapping - Mapping by controller name
+
+Home
+
diff --git a/spring-mvc-xml/src/main/webapp/spring-handler-index.jsp b/spring-mvc-xml/src/main/webapp/spring-handler-index.jsp
new file mode 100644
index 0000000000..0fdd51d1ec
--- /dev/null
+++ b/spring-mvc-xml/src/main/webapp/spring-handler-index.jsp
@@ -0,0 +1,18 @@
+
+
+