diff --git a/.gitignore b/.gitignore
index e78c1e7e24..a0a519c8cb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -48,3 +48,12 @@ dependency-reduced-pom.xml
*.so
*.dylib
*.dll
+
+xml/src/test/resources/example_dom4j_new.xml
+xml/src/test/resources/example_dom4j_updated.xml
+xml/src/test/resources/example_jaxb_new.xml
+core-java-io/hard_link.txt
+core-java-io/target_link.txt
+core-java/src/main/java/com/baeldung/manifest/MANIFEST.MF
+ethereum/logs/
+jmeter/src/main/resources/*-JMeter.csv
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
index 4df8a96f6d..5e2d690b4e 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -4,7 +4,7 @@ before_install:
- echo "MAVEN_OPTS='-Xmx2048M -Xss128M -XX:+CMSClassUnloadingEnabled -XX:+UseG1GC -XX:-UseGCOverheadLimit'" > ~/.mavenrc
install: skip
-script: travis_wait 60 mvn -q install
+script: travis_wait 60 mvn -q install -Pdefault
sudo: required
diff --git a/README.md b/README.md
index 1d916c8409..d018783465 100644
--- a/README.md
+++ b/README.md
@@ -19,7 +19,7 @@ In additional to Spring, the following technologies are in focus: `core Java`, `
Building the project
====================
-To do the full build, do: `mvn install -Dgib.enabled=false`
+To do the full build, do: `mvn install -Pdefault -Dgib.enabled=false`
Working with the code in Eclipse
diff --git a/apache-avro/pom.xml b/apache-avro/pom.xml
new file mode 100644
index 0000000000..39da518269
--- /dev/null
+++ b/apache-avro/pom.xml
@@ -0,0 +1,88 @@
+
+
+ 4.0.0
+ com.baeldung
+ apache-avro-tutorial
+ 0.0.1-SNAPSHOT
+
+
+ UTF-8
+ 3.5
+ 1.8.2
+ 1.8
+ 1.7.25
+
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ junit
+ junit
+ 4.10
+ test
+
+
+ org.slf4j
+ slf4j-simple
+ ${slf4j.version}
+ compile
+
+
+ org.apache.avro
+ avro
+ ${avro.version}
+
+
+ org.apache.avro
+ avro-compiler
+ ${avro.version}
+
+
+
+ org.apache.avro
+ avro-maven-plugin
+ ${avro.version}
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${compiler-plugin.version}
+
+ ${java.version}
+ ${java.version}
+
+
+
+ org.apache.avro
+ avro-maven-plugin
+ ${avro.version}
+
+
+ schemas
+ generate-sources
+
+ schema
+ protocol
+ idl-protocol
+
+
+ ${project.basedir}/src/main/resources/
+ ${project.basedir}/src/main/java/
+
+
+
+
+
+
+
diff --git a/apache-avro/src/main/java/com/baeldung/avro/util/AvroClassGenerator.java b/apache-avro/src/main/java/com/baeldung/avro/util/AvroClassGenerator.java
new file mode 100644
index 0000000000..718b62a752
--- /dev/null
+++ b/apache-avro/src/main/java/com/baeldung/avro/util/AvroClassGenerator.java
@@ -0,0 +1,14 @@
+package com.baeldung.avro.util;
+
+import org.apache.avro.Schema;
+import org.apache.avro.compiler.specific.SpecificCompiler;
+
+import java.io.File;
+import java.io.IOException;
+
+public class AvroClassGenerator {
+ public void generateAvroClasses() throws IOException {
+ SpecificCompiler compiler = new SpecificCompiler(new Schema.Parser().parse(new File("src/main/resources/avroHttpRequest-schema.avsc")));
+ compiler.compileToDestination(new File("src/main/resources"), new File("src/main/java"));
+ }
+}
diff --git a/apache-avro/src/main/java/com/baeldung/avro/util/AvroSchemaBuilder.java b/apache-avro/src/main/java/com/baeldung/avro/util/AvroSchemaBuilder.java
new file mode 100644
index 0000000000..4a1314cd00
--- /dev/null
+++ b/apache-avro/src/main/java/com/baeldung/avro/util/AvroSchemaBuilder.java
@@ -0,0 +1,24 @@
+package com.baeldung.avro.util;
+
+
+import org.apache.avro.Schema;
+import org.apache.avro.SchemaBuilder;
+
+public class AvroSchemaBuilder {
+
+ public Schema createAvroHttpRequestSchema(){
+
+ Schema clientIdentifier = SchemaBuilder.record("ClientIdentifier").namespace("com.baeldung.avro.model")
+ .fields().requiredString("hostName").requiredString("ipAddress").endRecord();
+
+ Schema avroHttpRequest = SchemaBuilder.record("AvroHttpRequest").namespace("com.baeldung.avro.model").fields()
+ .requiredLong("requestTime")
+ .name("clientIdentifier").type(clientIdentifier).noDefault()
+ .name("employeeNames").type().array().items().stringType().arrayDefault(null)
+ .name("active").type().enumeration("Active").symbols("YES", "NO").noDefault()
+ .endRecord();
+ return avroHttpRequest;
+ }
+}
+
+
diff --git a/apache-avro/src/main/java/com/baeldung/avro/util/model/Active.java b/apache-avro/src/main/java/com/baeldung/avro/util/model/Active.java
new file mode 100644
index 0000000000..3ae0508394
--- /dev/null
+++ b/apache-avro/src/main/java/com/baeldung/avro/util/model/Active.java
@@ -0,0 +1,13 @@
+/**
+ * Autogenerated by Avro
+ *
+ * DO NOT EDIT DIRECTLY
+ */
+package com.baeldung.avro.util.model;
+@SuppressWarnings("all")
+@org.apache.avro.specific.AvroGenerated
+public enum Active {
+ YES, NO ;
+ public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"enum\",\"name\":\"Active\",\"namespace\":\"com.baeldung.avro.model\",\"symbols\":[\"YES\",\"NO\"]}");
+ public static org.apache.avro.Schema getClassSchema() { return SCHEMA$; }
+}
diff --git a/apache-avro/src/main/java/com/baeldung/avro/util/model/AvroHttpRequest.java b/apache-avro/src/main/java/com/baeldung/avro/util/model/AvroHttpRequest.java
new file mode 100644
index 0000000000..56b36050a5
--- /dev/null
+++ b/apache-avro/src/main/java/com/baeldung/avro/util/model/AvroHttpRequest.java
@@ -0,0 +1,491 @@
+/**
+ * Autogenerated by Avro
+ *
+ * DO NOT EDIT DIRECTLY
+ */
+package com.baeldung.avro.util.model;
+
+import org.apache.avro.specific.SpecificData;
+import org.apache.avro.message.BinaryMessageEncoder;
+import org.apache.avro.message.BinaryMessageDecoder;
+import org.apache.avro.message.SchemaStore;
+
+@SuppressWarnings("all")
+@org.apache.avro.specific.AvroGenerated
+public class AvroHttpRequest extends org.apache.avro.specific.SpecificRecordBase implements org.apache.avro.specific.SpecificRecord {
+ private static final long serialVersionUID = -8649010116827875312L;
+ public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"AvroHttpRequest\",\"namespace\":\"com.baeldung.avro.model\",\"fields\":[{\"name\":\"requestTime\",\"type\":\"long\"},{\"name\":\"clientIdentifier\",\"type\":{\"type\":\"record\",\"name\":\"ClientIdentifier\",\"fields\":[{\"name\":\"hostName\",\"type\":\"string\"},{\"name\":\"ipAddress\",\"type\":\"string\"}]}},{\"name\":\"employeeNames\",\"type\":{\"type\":\"array\",\"items\":\"string\"},\"default\":null},{\"name\":\"active\",\"type\":{\"type\":\"enum\",\"name\":\"Active\",\"symbols\":[\"YES\",\"NO\"]}}]}");
+ public static org.apache.avro.Schema getClassSchema() { return SCHEMA$; }
+
+ private static SpecificData MODEL$ = new SpecificData();
+
+ private static final BinaryMessageEncoder ENCODER =
+ new BinaryMessageEncoder(MODEL$, SCHEMA$);
+
+ private static final BinaryMessageDecoder DECODER =
+ new BinaryMessageDecoder(MODEL$, SCHEMA$);
+
+ /**
+ * Return the BinaryMessageDecoder instance used by this class.
+ */
+ public static BinaryMessageDecoder getDecoder() {
+ return DECODER;
+ }
+
+ /**
+ * Create a new BinaryMessageDecoder instance for this class that uses the specified {@link SchemaStore}.
+ * @param resolver a {@link SchemaStore} used to find schemas by fingerprint
+ */
+ public static BinaryMessageDecoder createDecoder(SchemaStore resolver) {
+ return new BinaryMessageDecoder(MODEL$, SCHEMA$, resolver);
+ }
+
+ /** Serializes this AvroHttpRequest to a ByteBuffer. */
+ public java.nio.ByteBuffer toByteBuffer() throws java.io.IOException {
+ return ENCODER.encode(this);
+ }
+
+ /** Deserializes a AvroHttpRequest from a ByteBuffer. */
+ public static AvroHttpRequest fromByteBuffer(
+ java.nio.ByteBuffer b) throws java.io.IOException {
+ return DECODER.decode(b);
+ }
+
+ @Deprecated public long requestTime;
+ @Deprecated public ClientIdentifier clientIdentifier;
+ @Deprecated public java.util.List employeeNames;
+ @Deprecated public Active active;
+
+ /**
+ * Default constructor. Note that this does not initialize fields
+ * to their default values from the schema. If that is desired then
+ * one should use newBuilder()
.
+ */
+ public AvroHttpRequest() {}
+
+ /**
+ * All-args constructor.
+ * @param requestTime The new value for requestTime
+ * @param clientIdentifier The new value for clientIdentifier
+ * @param employeeNames The new value for employeeNames
+ * @param active The new value for active
+ */
+ public AvroHttpRequest(java.lang.Long requestTime, ClientIdentifier clientIdentifier, java.util.List employeeNames, Active active) {
+ this.requestTime = requestTime;
+ this.clientIdentifier = clientIdentifier;
+ this.employeeNames = employeeNames;
+ this.active = active;
+ }
+
+ public org.apache.avro.Schema getSchema() { return SCHEMA$; }
+ // Used by DatumWriter. Applications should not call.
+ public java.lang.Object get(int field$) {
+ switch (field$) {
+ case 0: return requestTime;
+ case 1: return clientIdentifier;
+ case 2: return employeeNames;
+ case 3: return active;
+ default: throw new org.apache.avro.AvroRuntimeException("Bad index");
+ }
+ }
+
+ // Used by DatumReader. Applications should not call.
+ @SuppressWarnings(value="unchecked")
+ public void put(int field$, java.lang.Object value$) {
+ switch (field$) {
+ case 0: requestTime = (java.lang.Long)value$; break;
+ case 1: clientIdentifier = (ClientIdentifier)value$; break;
+ case 2: employeeNames = (java.util.List)value$; break;
+ case 3: active = (Active)value$; break;
+ default: throw new org.apache.avro.AvroRuntimeException("Bad index");
+ }
+ }
+
+ /**
+ * Gets the value of the 'requestTime' field.
+ * @return The value of the 'requestTime' field.
+ */
+ public java.lang.Long getRequestTime() {
+ return requestTime;
+ }
+
+ /**
+ * Sets the value of the 'requestTime' field.
+ * @param value the value to set.
+ */
+ public void setRequestTime(java.lang.Long value) {
+ this.requestTime = value;
+ }
+
+ /**
+ * Gets the value of the 'clientIdentifier' field.
+ * @return The value of the 'clientIdentifier' field.
+ */
+ public ClientIdentifier getClientIdentifier() {
+ return clientIdentifier;
+ }
+
+ /**
+ * Sets the value of the 'clientIdentifier' field.
+ * @param value the value to set.
+ */
+ public void setClientIdentifier(ClientIdentifier value) {
+ this.clientIdentifier = value;
+ }
+
+ /**
+ * Gets the value of the 'employeeNames' field.
+ * @return The value of the 'employeeNames' field.
+ */
+ public java.util.List getEmployeeNames() {
+ return employeeNames;
+ }
+
+ /**
+ * Sets the value of the 'employeeNames' field.
+ * @param value the value to set.
+ */
+ public void setEmployeeNames(java.util.List value) {
+ this.employeeNames = value;
+ }
+
+ /**
+ * Gets the value of the 'active' field.
+ * @return The value of the 'active' field.
+ */
+ public Active getActive() {
+ return active;
+ }
+
+ /**
+ * Sets the value of the 'active' field.
+ * @param value the value to set.
+ */
+ public void setActive(Active value) {
+ this.active = value;
+ }
+
+ /**
+ * Creates a new AvroHttpRequest RecordBuilder.
+ * @return A new AvroHttpRequest RecordBuilder
+ */
+ public static AvroHttpRequest.Builder newBuilder() {
+ return new AvroHttpRequest.Builder();
+ }
+
+ /**
+ * Creates a new AvroHttpRequest RecordBuilder by copying an existing Builder.
+ * @param other The existing builder to copy.
+ * @return A new AvroHttpRequest RecordBuilder
+ */
+ public static AvroHttpRequest.Builder newBuilder(AvroHttpRequest.Builder other) {
+ return new AvroHttpRequest.Builder(other);
+ }
+
+ /**
+ * Creates a new AvroHttpRequest RecordBuilder by copying an existing AvroHttpRequest instance.
+ * @param other The existing instance to copy.
+ * @return A new AvroHttpRequest RecordBuilder
+ */
+ public static AvroHttpRequest.Builder newBuilder(AvroHttpRequest other) {
+ return new AvroHttpRequest.Builder(other);
+ }
+
+ /**
+ * RecordBuilder for AvroHttpRequest instances.
+ */
+ public static class Builder extends org.apache.avro.specific.SpecificRecordBuilderBase
+ implements org.apache.avro.data.RecordBuilder {
+
+ private long requestTime;
+ private ClientIdentifier clientIdentifier;
+ private ClientIdentifier.Builder clientIdentifierBuilder;
+ private java.util.List employeeNames;
+ private Active active;
+
+ /** Creates a new Builder */
+ private Builder() {
+ super(SCHEMA$);
+ }
+
+ /**
+ * Creates a Builder by copying an existing Builder.
+ * @param other The existing Builder to copy.
+ */
+ private Builder(AvroHttpRequest.Builder other) {
+ super(other);
+ if (isValidValue(fields()[0], other.requestTime)) {
+ this.requestTime = data().deepCopy(fields()[0].schema(), other.requestTime);
+ fieldSetFlags()[0] = true;
+ }
+ if (isValidValue(fields()[1], other.clientIdentifier)) {
+ this.clientIdentifier = data().deepCopy(fields()[1].schema(), other.clientIdentifier);
+ fieldSetFlags()[1] = true;
+ }
+ if (other.hasClientIdentifierBuilder()) {
+ this.clientIdentifierBuilder = ClientIdentifier.newBuilder(other.getClientIdentifierBuilder());
+ }
+ if (isValidValue(fields()[2], other.employeeNames)) {
+ this.employeeNames = data().deepCopy(fields()[2].schema(), other.employeeNames);
+ fieldSetFlags()[2] = true;
+ }
+ if (isValidValue(fields()[3], other.active)) {
+ this.active = data().deepCopy(fields()[3].schema(), other.active);
+ fieldSetFlags()[3] = true;
+ }
+ }
+
+ /**
+ * Creates a Builder by copying an existing AvroHttpRequest instance
+ * @param other The existing instance to copy.
+ */
+ private Builder(AvroHttpRequest other) {
+ super(SCHEMA$);
+ if (isValidValue(fields()[0], other.requestTime)) {
+ this.requestTime = data().deepCopy(fields()[0].schema(), other.requestTime);
+ fieldSetFlags()[0] = true;
+ }
+ if (isValidValue(fields()[1], other.clientIdentifier)) {
+ this.clientIdentifier = data().deepCopy(fields()[1].schema(), other.clientIdentifier);
+ fieldSetFlags()[1] = true;
+ }
+ this.clientIdentifierBuilder = null;
+ if (isValidValue(fields()[2], other.employeeNames)) {
+ this.employeeNames = data().deepCopy(fields()[2].schema(), other.employeeNames);
+ fieldSetFlags()[2] = true;
+ }
+ if (isValidValue(fields()[3], other.active)) {
+ this.active = data().deepCopy(fields()[3].schema(), other.active);
+ fieldSetFlags()[3] = true;
+ }
+ }
+
+ /**
+ * Gets the value of the 'requestTime' field.
+ * @return The value.
+ */
+ public java.lang.Long getRequestTime() {
+ return requestTime;
+ }
+
+ /**
+ * Sets the value of the 'requestTime' field.
+ * @param value The value of 'requestTime'.
+ * @return This builder.
+ */
+ public AvroHttpRequest.Builder setRequestTime(long value) {
+ validate(fields()[0], value);
+ this.requestTime = value;
+ fieldSetFlags()[0] = true;
+ return this;
+ }
+
+ /**
+ * Checks whether the 'requestTime' field has been set.
+ * @return True if the 'requestTime' field has been set, false otherwise.
+ */
+ public boolean hasRequestTime() {
+ return fieldSetFlags()[0];
+ }
+
+
+ /**
+ * Clears the value of the 'requestTime' field.
+ * @return This builder.
+ */
+ public AvroHttpRequest.Builder clearRequestTime() {
+ fieldSetFlags()[0] = false;
+ return this;
+ }
+
+ /**
+ * Gets the value of the 'clientIdentifier' field.
+ * @return The value.
+ */
+ public ClientIdentifier getClientIdentifier() {
+ return clientIdentifier;
+ }
+
+ /**
+ * Sets the value of the 'clientIdentifier' field.
+ * @param value The value of 'clientIdentifier'.
+ * @return This builder.
+ */
+ public AvroHttpRequest.Builder setClientIdentifier(ClientIdentifier value) {
+ validate(fields()[1], value);
+ this.clientIdentifierBuilder = null;
+ this.clientIdentifier = value;
+ fieldSetFlags()[1] = true;
+ return this;
+ }
+
+ /**
+ * Checks whether the 'clientIdentifier' field has been set.
+ * @return True if the 'clientIdentifier' field has been set, false otherwise.
+ */
+ public boolean hasClientIdentifier() {
+ return fieldSetFlags()[1];
+ }
+
+ /**
+ * Gets the Builder instance for the 'clientIdentifier' field and creates one if it doesn't exist yet.
+ * @return This builder.
+ */
+ public ClientIdentifier.Builder getClientIdentifierBuilder() {
+ if (clientIdentifierBuilder == null) {
+ if (hasClientIdentifier()) {
+ setClientIdentifierBuilder(ClientIdentifier.newBuilder(clientIdentifier));
+ } else {
+ setClientIdentifierBuilder(ClientIdentifier.newBuilder());
+ }
+ }
+ return clientIdentifierBuilder;
+ }
+
+ /**
+ * Sets the Builder instance for the 'clientIdentifier' field
+ * @param value The builder instance that must be set.
+ * @return This builder.
+ */
+ public AvroHttpRequest.Builder setClientIdentifierBuilder(ClientIdentifier.Builder value) {
+ clearClientIdentifier();
+ clientIdentifierBuilder = value;
+ return this;
+ }
+
+ /**
+ * Checks whether the 'clientIdentifier' field has an active Builder instance
+ * @return True if the 'clientIdentifier' field has an active Builder instance
+ */
+ public boolean hasClientIdentifierBuilder() {
+ return clientIdentifierBuilder != null;
+ }
+
+ /**
+ * Clears the value of the 'clientIdentifier' field.
+ * @return This builder.
+ */
+ public AvroHttpRequest.Builder clearClientIdentifier() {
+ clientIdentifier = null;
+ clientIdentifierBuilder = null;
+ fieldSetFlags()[1] = false;
+ return this;
+ }
+
+ /**
+ * Gets the value of the 'employeeNames' field.
+ * @return The value.
+ */
+ public java.util.List getEmployeeNames() {
+ return employeeNames;
+ }
+
+ /**
+ * Sets the value of the 'employeeNames' field.
+ * @param value The value of 'employeeNames'.
+ * @return This builder.
+ */
+ public AvroHttpRequest.Builder setEmployeeNames(java.util.List value) {
+ validate(fields()[2], value);
+ this.employeeNames = value;
+ fieldSetFlags()[2] = true;
+ return this;
+ }
+
+ /**
+ * Checks whether the 'employeeNames' field has been set.
+ * @return True if the 'employeeNames' field has been set, false otherwise.
+ */
+ public boolean hasEmployeeNames() {
+ return fieldSetFlags()[2];
+ }
+
+
+ /**
+ * Clears the value of the 'employeeNames' field.
+ * @return This builder.
+ */
+ public AvroHttpRequest.Builder clearEmployeeNames() {
+ employeeNames = null;
+ fieldSetFlags()[2] = false;
+ return this;
+ }
+
+ /**
+ * Gets the value of the 'active' field.
+ * @return The value.
+ */
+ public Active getActive() {
+ return active;
+ }
+
+ /**
+ * Sets the value of the 'active' field.
+ * @param value The value of 'active'.
+ * @return This builder.
+ */
+ public AvroHttpRequest.Builder setActive(Active value) {
+ validate(fields()[3], value);
+ this.active = value;
+ fieldSetFlags()[3] = true;
+ return this;
+ }
+
+ /**
+ * Checks whether the 'active' field has been set.
+ * @return True if the 'active' field has been set, false otherwise.
+ */
+ public boolean hasActive() {
+ return fieldSetFlags()[3];
+ }
+
+
+ /**
+ * Clears the value of the 'active' field.
+ * @return This builder.
+ */
+ public AvroHttpRequest.Builder clearActive() {
+ active = null;
+ fieldSetFlags()[3] = false;
+ return this;
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public AvroHttpRequest build() {
+ try {
+ AvroHttpRequest record = new AvroHttpRequest();
+ record.requestTime = fieldSetFlags()[0] ? this.requestTime : (java.lang.Long) defaultValue(fields()[0]);
+ if (clientIdentifierBuilder != null) {
+ record.clientIdentifier = this.clientIdentifierBuilder.build();
+ } else {
+ record.clientIdentifier = fieldSetFlags()[1] ? this.clientIdentifier : (ClientIdentifier) defaultValue(fields()[1]);
+ }
+ record.employeeNames = fieldSetFlags()[2] ? this.employeeNames : (java.util.List) defaultValue(fields()[2]);
+ record.active = fieldSetFlags()[3] ? this.active : (Active) defaultValue(fields()[3]);
+ return record;
+ } catch (java.lang.Exception e) {
+ throw new org.apache.avro.AvroRuntimeException(e);
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private static final org.apache.avro.io.DatumWriter
+ WRITER$ = (org.apache.avro.io.DatumWriter)MODEL$.createDatumWriter(SCHEMA$);
+
+ @Override public void writeExternal(java.io.ObjectOutput out)
+ throws java.io.IOException {
+ WRITER$.write(this, SpecificData.getEncoder(out));
+ }
+
+ @SuppressWarnings("unchecked")
+ private static final org.apache.avro.io.DatumReader
+ READER$ = (org.apache.avro.io.DatumReader)MODEL$.createDatumReader(SCHEMA$);
+
+ @Override public void readExternal(java.io.ObjectInput in)
+ throws java.io.IOException {
+ READER$.read(this, SpecificData.getDecoder(in));
+ }
+
+}
diff --git a/apache-avro/src/main/java/com/baeldung/avro/util/model/ClientIdentifier.java b/apache-avro/src/main/java/com/baeldung/avro/util/model/ClientIdentifier.java
new file mode 100644
index 0000000000..503dde40df
--- /dev/null
+++ b/apache-avro/src/main/java/com/baeldung/avro/util/model/ClientIdentifier.java
@@ -0,0 +1,308 @@
+/**
+ * Autogenerated by Avro
+ *
+ * DO NOT EDIT DIRECTLY
+ */
+package com.baeldung.avro.util.model;
+
+import org.apache.avro.specific.SpecificData;
+import org.apache.avro.message.BinaryMessageEncoder;
+import org.apache.avro.message.BinaryMessageDecoder;
+import org.apache.avro.message.SchemaStore;
+
+@SuppressWarnings("all")
+@org.apache.avro.specific.AvroGenerated
+public class ClientIdentifier extends org.apache.avro.specific.SpecificRecordBase implements org.apache.avro.specific.SpecificRecord {
+ private static final long serialVersionUID = 8754570983127295424L;
+ public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"ClientIdentifier\",\"namespace\":\"com.baeldung.avro.model\",\"fields\":[{\"name\":\"hostName\",\"type\":\"string\"},{\"name\":\"ipAddress\",\"type\":\"string\"}]}");
+ public static org.apache.avro.Schema getClassSchema() { return SCHEMA$; }
+
+ private static SpecificData MODEL$ = new SpecificData();
+
+ private static final BinaryMessageEncoder ENCODER =
+ new BinaryMessageEncoder(MODEL$, SCHEMA$);
+
+ private static final BinaryMessageDecoder DECODER =
+ new BinaryMessageDecoder(MODEL$, SCHEMA$);
+
+ /**
+ * Return the BinaryMessageDecoder instance used by this class.
+ */
+ public static BinaryMessageDecoder getDecoder() {
+ return DECODER;
+ }
+
+ /**
+ * Create a new BinaryMessageDecoder instance for this class that uses the specified {@link SchemaStore}.
+ * @param resolver a {@link SchemaStore} used to find schemas by fingerprint
+ */
+ public static BinaryMessageDecoder createDecoder(SchemaStore resolver) {
+ return new BinaryMessageDecoder(MODEL$, SCHEMA$, resolver);
+ }
+
+ /** Serializes this ClientIdentifier to a ByteBuffer. */
+ public java.nio.ByteBuffer toByteBuffer() throws java.io.IOException {
+ return ENCODER.encode(this);
+ }
+
+ /** Deserializes a ClientIdentifier from a ByteBuffer. */
+ public static ClientIdentifier fromByteBuffer(
+ java.nio.ByteBuffer b) throws java.io.IOException {
+ return DECODER.decode(b);
+ }
+
+ @Deprecated public java.lang.CharSequence hostName;
+ @Deprecated public java.lang.CharSequence ipAddress;
+
+ /**
+ * Default constructor. Note that this does not initialize fields
+ * to their default values from the schema. If that is desired then
+ * one should use newBuilder()
.
+ */
+ public ClientIdentifier() {}
+
+ /**
+ * All-args constructor.
+ * @param hostName The new value for hostName
+ * @param ipAddress The new value for ipAddress
+ */
+ public ClientIdentifier(java.lang.CharSequence hostName, java.lang.CharSequence ipAddress) {
+ this.hostName = hostName;
+ this.ipAddress = ipAddress;
+ }
+
+ public org.apache.avro.Schema getSchema() { return SCHEMA$; }
+ // Used by DatumWriter. Applications should not call.
+ public java.lang.Object get(int field$) {
+ switch (field$) {
+ case 0: return hostName;
+ case 1: return ipAddress;
+ default: throw new org.apache.avro.AvroRuntimeException("Bad index");
+ }
+ }
+
+ // Used by DatumReader. Applications should not call.
+ @SuppressWarnings(value="unchecked")
+ public void put(int field$, java.lang.Object value$) {
+ switch (field$) {
+ case 0: hostName = (java.lang.CharSequence)value$; break;
+ case 1: ipAddress = (java.lang.CharSequence)value$; break;
+ default: throw new org.apache.avro.AvroRuntimeException("Bad index");
+ }
+ }
+
+ /**
+ * Gets the value of the 'hostName' field.
+ * @return The value of the 'hostName' field.
+ */
+ public java.lang.CharSequence getHostName() {
+ return hostName;
+ }
+
+ /**
+ * Sets the value of the 'hostName' field.
+ * @param value the value to set.
+ */
+ public void setHostName(java.lang.CharSequence value) {
+ this.hostName = value;
+ }
+
+ /**
+ * Gets the value of the 'ipAddress' field.
+ * @return The value of the 'ipAddress' field.
+ */
+ public java.lang.CharSequence getIpAddress() {
+ return ipAddress;
+ }
+
+ /**
+ * Sets the value of the 'ipAddress' field.
+ * @param value the value to set.
+ */
+ public void setIpAddress(java.lang.CharSequence value) {
+ this.ipAddress = value;
+ }
+
+ /**
+ * Creates a new ClientIdentifier RecordBuilder.
+ * @return A new ClientIdentifier RecordBuilder
+ */
+ public static ClientIdentifier.Builder newBuilder() {
+ return new ClientIdentifier.Builder();
+ }
+
+ /**
+ * Creates a new ClientIdentifier RecordBuilder by copying an existing Builder.
+ * @param other The existing builder to copy.
+ * @return A new ClientIdentifier RecordBuilder
+ */
+ public static ClientIdentifier.Builder newBuilder(ClientIdentifier.Builder other) {
+ return new ClientIdentifier.Builder(other);
+ }
+
+ /**
+ * Creates a new ClientIdentifier RecordBuilder by copying an existing ClientIdentifier instance.
+ * @param other The existing instance to copy.
+ * @return A new ClientIdentifier RecordBuilder
+ */
+ public static ClientIdentifier.Builder newBuilder(ClientIdentifier other) {
+ return new ClientIdentifier.Builder(other);
+ }
+
+ /**
+ * RecordBuilder for ClientIdentifier instances.
+ */
+ public static class Builder extends org.apache.avro.specific.SpecificRecordBuilderBase
+ implements org.apache.avro.data.RecordBuilder {
+
+ private java.lang.CharSequence hostName;
+ private java.lang.CharSequence ipAddress;
+
+ /** Creates a new Builder */
+ private Builder() {
+ super(SCHEMA$);
+ }
+
+ /**
+ * Creates a Builder by copying an existing Builder.
+ * @param other The existing Builder to copy.
+ */
+ private Builder(ClientIdentifier.Builder other) {
+ super(other);
+ if (isValidValue(fields()[0], other.hostName)) {
+ this.hostName = data().deepCopy(fields()[0].schema(), other.hostName);
+ fieldSetFlags()[0] = true;
+ }
+ if (isValidValue(fields()[1], other.ipAddress)) {
+ this.ipAddress = data().deepCopy(fields()[1].schema(), other.ipAddress);
+ fieldSetFlags()[1] = true;
+ }
+ }
+
+ /**
+ * Creates a Builder by copying an existing ClientIdentifier instance
+ * @param other The existing instance to copy.
+ */
+ private Builder(ClientIdentifier other) {
+ super(SCHEMA$);
+ if (isValidValue(fields()[0], other.hostName)) {
+ this.hostName = data().deepCopy(fields()[0].schema(), other.hostName);
+ fieldSetFlags()[0] = true;
+ }
+ if (isValidValue(fields()[1], other.ipAddress)) {
+ this.ipAddress = data().deepCopy(fields()[1].schema(), other.ipAddress);
+ fieldSetFlags()[1] = true;
+ }
+ }
+
+ /**
+ * Gets the value of the 'hostName' field.
+ * @return The value.
+ */
+ public java.lang.CharSequence getHostName() {
+ return hostName;
+ }
+
+ /**
+ * Sets the value of the 'hostName' field.
+ * @param value The value of 'hostName'.
+ * @return This builder.
+ */
+ public ClientIdentifier.Builder setHostName(java.lang.CharSequence value) {
+ validate(fields()[0], value);
+ this.hostName = value;
+ fieldSetFlags()[0] = true;
+ return this;
+ }
+
+ /**
+ * Checks whether the 'hostName' field has been set.
+ * @return True if the 'hostName' field has been set, false otherwise.
+ */
+ public boolean hasHostName() {
+ return fieldSetFlags()[0];
+ }
+
+
+ /**
+ * Clears the value of the 'hostName' field.
+ * @return This builder.
+ */
+ public ClientIdentifier.Builder clearHostName() {
+ hostName = null;
+ fieldSetFlags()[0] = false;
+ return this;
+ }
+
+ /**
+ * Gets the value of the 'ipAddress' field.
+ * @return The value.
+ */
+ public java.lang.CharSequence getIpAddress() {
+ return ipAddress;
+ }
+
+ /**
+ * Sets the value of the 'ipAddress' field.
+ * @param value The value of 'ipAddress'.
+ * @return This builder.
+ */
+ public ClientIdentifier.Builder setIpAddress(java.lang.CharSequence value) {
+ validate(fields()[1], value);
+ this.ipAddress = value;
+ fieldSetFlags()[1] = true;
+ return this;
+ }
+
+ /**
+ * Checks whether the 'ipAddress' field has been set.
+ * @return True if the 'ipAddress' field has been set, false otherwise.
+ */
+ public boolean hasIpAddress() {
+ return fieldSetFlags()[1];
+ }
+
+
+ /**
+ * Clears the value of the 'ipAddress' field.
+ * @return This builder.
+ */
+ public ClientIdentifier.Builder clearIpAddress() {
+ ipAddress = null;
+ fieldSetFlags()[1] = false;
+ return this;
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public ClientIdentifier build() {
+ try {
+ ClientIdentifier record = new ClientIdentifier();
+ record.hostName = fieldSetFlags()[0] ? this.hostName : (java.lang.CharSequence) defaultValue(fields()[0]);
+ record.ipAddress = fieldSetFlags()[1] ? this.ipAddress : (java.lang.CharSequence) defaultValue(fields()[1]);
+ return record;
+ } catch (java.lang.Exception e) {
+ throw new org.apache.avro.AvroRuntimeException(e);
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private static final org.apache.avro.io.DatumWriter
+ WRITER$ = (org.apache.avro.io.DatumWriter)MODEL$.createDatumWriter(SCHEMA$);
+
+ @Override public void writeExternal(java.io.ObjectOutput out)
+ throws java.io.IOException {
+ WRITER$.write(this, SpecificData.getEncoder(out));
+ }
+
+ @SuppressWarnings("unchecked")
+ private static final org.apache.avro.io.DatumReader
+ READER$ = (org.apache.avro.io.DatumReader)MODEL$.createDatumReader(SCHEMA$);
+
+ @Override public void readExternal(java.io.ObjectInput in)
+ throws java.io.IOException {
+ READER$.read(this, SpecificData.getDecoder(in));
+ }
+
+}
diff --git a/apache-avro/src/main/java/com/baeldung/avro/util/serealization/AvroDeSerealizer.java b/apache-avro/src/main/java/com/baeldung/avro/util/serealization/AvroDeSerealizer.java
new file mode 100644
index 0000000000..d2219a45f2
--- /dev/null
+++ b/apache-avro/src/main/java/com/baeldung/avro/util/serealization/AvroDeSerealizer.java
@@ -0,0 +1,33 @@
+package com.baeldung.avro.util.serealization;
+
+import com.baeldung.avro.util.model.AvroHttpRequest;
+import org.apache.avro.io.DatumReader;
+import org.apache.avro.io.Decoder;
+import org.apache.avro.io.DecoderFactory;
+import org.apache.avro.specific.SpecificDatumReader;
+
+import java.io.IOException;
+
+public class AvroDeSerealizer {
+
+public AvroHttpRequest deSerealizeAvroHttpRequestJSON(byte[] data){
+ DatumReader reader = new SpecificDatumReader<>(AvroHttpRequest.class);
+ Decoder decoder = null;
+ try {
+ decoder = DecoderFactory.get().jsonDecoder(AvroHttpRequest.getClassSchema(), new String(data));
+ return reader.read(null, decoder);
+ } catch (IOException e) {
+ return null;
+ }
+}
+
+public AvroHttpRequest deSerealizeAvroHttpRequestBinary(byte[] data){
+ DatumReader employeeReader = new SpecificDatumReader<>(AvroHttpRequest.class);
+ Decoder decoder = DecoderFactory.get().binaryDecoder(data, null);
+ try {
+ return employeeReader.read(null, decoder);
+ } catch (IOException e) {
+ return null;
+ }
+}
+}
diff --git a/apache-avro/src/main/java/com/baeldung/avro/util/serealization/AvroSerealizer.java b/apache-avro/src/main/java/com/baeldung/avro/util/serealization/AvroSerealizer.java
new file mode 100644
index 0000000000..f56c89e201
--- /dev/null
+++ b/apache-avro/src/main/java/com/baeldung/avro/util/serealization/AvroSerealizer.java
@@ -0,0 +1,44 @@
+package com.baeldung.avro.util.serealization;
+
+import com.baeldung.avro.util.model.AvroHttpRequest;
+import org.apache.avro.io.*;
+import org.apache.avro.specific.SpecificDatumWriter;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+public class AvroSerealizer {
+
+public byte[] serealizeAvroHttpRequestJSON(AvroHttpRequest request){
+ DatumWriter writer = new SpecificDatumWriter<>(AvroHttpRequest.class);
+ byte[] data = new byte[0];
+ ByteArrayOutputStream stream = new ByteArrayOutputStream();
+ Encoder jsonEncoder = null;
+ try {
+ jsonEncoder = EncoderFactory.get().jsonEncoder(AvroHttpRequest.getClassSchema(), stream);
+ writer.write(request, jsonEncoder);
+ jsonEncoder.flush();
+ data = stream.toByteArray();
+ } catch (IOException e) {
+ data =null;
+ }
+ return data;
+}
+
+public byte[] serealizeAvroHttpRequestBinary(AvroHttpRequest request){
+ DatumWriter writer = new SpecificDatumWriter<>(AvroHttpRequest.class);
+ byte[] data = new byte[0];
+ ByteArrayOutputStream stream = new ByteArrayOutputStream();
+ Encoder jsonEncoder = EncoderFactory.get().binaryEncoder(stream,null);
+ try {
+ writer.write(request, jsonEncoder);
+ jsonEncoder.flush();
+ data = stream.toByteArray();
+ } catch (IOException e) {
+ data = null;
+ }
+
+ return data;
+}
+
+}
diff --git a/apache-avro/src/main/resources/avroHttpRequest-schema.avsc b/apache-avro/src/main/resources/avroHttpRequest-schema.avsc
new file mode 100644
index 0000000000..18179a9cde
--- /dev/null
+++ b/apache-avro/src/main/resources/avroHttpRequest-schema.avsc
@@ -0,0 +1,47 @@
+{
+ "type":"record",
+ "name":"AvroHttpRequest",
+ "namespace":"com.baeldung.avro.model",
+ "fields":[
+ {
+ "name":"requestTime",
+ "type":"long"
+ },
+ {
+ "name":"clientIdentifier",
+ "type":{
+ "type":"record",
+ "name":"ClientIdentifier",
+ "fields":[
+ {
+ "name":"hostName",
+ "type":"string"
+ },
+ {
+ "name":"ipAddress",
+ "type":"string"
+ }
+ ]
+ }
+ },
+ {
+ "name":"employeeNames",
+ "type":{
+ "type":"array",
+ "items":"string"
+ },
+ "default":null
+ },
+ {
+ "name":"active",
+ "type":{
+ "type":"enum",
+ "name":"Active",
+ "symbols":[
+ "YES",
+ "NO"
+ ]
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/apache-avro/src/test/java/com/baeldung/avro/util/serealization/AvroSerealizerDeSerealizerTest.java b/apache-avro/src/test/java/com/baeldung/avro/util/serealization/AvroSerealizerDeSerealizerTest.java
new file mode 100644
index 0000000000..937a4ae650
--- /dev/null
+++ b/apache-avro/src/test/java/com/baeldung/avro/util/serealization/AvroSerealizerDeSerealizerTest.java
@@ -0,0 +1,75 @@
+package com.baeldung.avro.util.serealization;
+
+import com.baeldung.avro.util.model.Active;
+import com.baeldung.avro.util.model.AvroHttpRequest;
+import com.baeldung.avro.util.model.ClientIdentifier;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+import static org.junit.Assert.*;
+
+public class AvroSerealizerDeSerealizerTest {
+
+ AvroSerealizer serealizer;
+ AvroDeSerealizer deSerealizer;
+ AvroHttpRequest request;
+
+ @Before
+ public void setUp() throws Exception {
+ serealizer = new AvroSerealizer();
+ deSerealizer = new AvroDeSerealizer();
+
+ ClientIdentifier clientIdentifier = ClientIdentifier.newBuilder().
+ setHostName("localhost").setIpAddress("255.255.255.0").build();
+
+ List employees = new ArrayList();
+ employees.add("James");
+ employees.add("Alice");
+ employees.add("David");
+ employees.add("Han");
+
+ request = AvroHttpRequest.newBuilder().setRequestTime(01l)
+ .setActive(Active.YES).setClientIdentifier(clientIdentifier)
+ .setEmployeeNames(employees).build();
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ }
+
+@Test
+public void WhenSerialized_UsingJSONEncoder_ObjectGetsSerialized(){
+ byte[] data = serealizer.serealizeAvroHttpRequestJSON(request);
+ assertTrue(Objects.nonNull(data));
+ assertTrue(data.length > 0);
+}
+
+@Test
+public void WhenSerialized_UsingBinaryEncoder_ObjectGetsSerialized(){
+ byte[] data = serealizer.serealizeAvroHttpRequestBinary(request);
+ assertTrue(Objects.nonNull(data));
+ assertTrue(data.length > 0);
+}
+
+@Test
+public void WhenDeserialize_UsingJSONDecoder_ActualAndExpectedObjectsAreEqual(){
+ byte[] data = serealizer.serealizeAvroHttpRequestJSON(request);
+ AvroHttpRequest actualRequest = deSerealizer.deSerealizeAvroHttpRequestJSON(data);
+ assertEquals(actualRequest,request);
+ assertTrue(actualRequest.getRequestTime().equals(request.getRequestTime()));
+}
+
+@Test
+public void WhenDeserialize_UsingBinaryecoder_ActualAndExpectedObjectsAreEqual(){
+ byte[] data = serealizer.serealizeAvroHttpRequestBinary(request);
+ AvroHttpRequest actualRequest = deSerealizer.deSerealizeAvroHttpRequestBinary(data);
+ assertEquals(actualRequest,request);
+ assertTrue(actualRequest.getRequestTime().equals(request.getRequestTime()));
+}
+}
+
diff --git a/core-java-10/src/test/java/com/baeldung/java10/list/CopyListServiceUnitTest.java b/core-java-10/src/test/java/com/baeldung/java10/list/CopyListServiceUnitTest.java
new file mode 100644
index 0000000000..f529e219a6
--- /dev/null
+++ b/core-java-10/src/test/java/com/baeldung/java10/list/CopyListServiceUnitTest.java
@@ -0,0 +1,14 @@
+package com.baeldung.java10.list;
+
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class CopyListServiceUnitTest {
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void whenModifyCopyOfList_thenThrowsException() {
+ List copyList = List.copyOf(Arrays.asList(1, 2, 3, 4));
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/convertlisttomap/Animal.java b/core-java-8/src/main/java/com/baeldung/convertlisttomap/Animal.java
new file mode 100644
index 0000000000..b8eddf71a5
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/convertlisttomap/Animal.java
@@ -0,0 +1,27 @@
+package com.baeldung.convertlisttomap;
+
+public class Animal {
+ private int id;
+ private String name;
+
+ public Animal(int id, String name) {
+ this.id = id;
+ this.setName(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;
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java b/core-java-8/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java
new file mode 100644
index 0000000000..88fc175f38
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java
@@ -0,0 +1,42 @@
+package com.baeldung.convertlisttomap;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.apache.commons.collections4.MapUtils;
+import com.google.common.collect.Maps;
+
+public class ConvertListToMapService {
+
+ public Map convertListBeforeJava8(List list) {
+
+ Map map = new HashMap<>();
+
+ for (Animal animal : list) {
+ map.put(animal.getId(), animal);
+ }
+ return map;
+ }
+
+ public Map convertListAfterJava8(List list) {
+ Map map = list.stream().collect(Collectors.toMap(Animal::getId, animal -> animal));
+ return map;
+ }
+
+ public Map convertListWithGuava(List list) {
+
+ Map map = Maps.uniqueIndex(list, Animal::getId);
+ return map;
+ }
+
+ public Map convertListWithApacheCommons(List list) {
+
+ Map map = new HashMap<>();
+
+ MapUtils.populateMap(map, list, Animal::getId);
+
+ return map;
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/list/CopyListService.java b/core-java-8/src/main/java/com/baeldung/list/CopyListService.java
new file mode 100644
index 0000000000..55d5bb9379
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/list/CopyListService.java
@@ -0,0 +1,73 @@
+package com.baeldung.list;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class CopyListService {
+
+ public List copyListByConstructor(List source) {
+ return new ArrayList(source);
+ }
+
+ public List copyListByConstructorAndEditOneFlowerInTheNewList(List source) {
+ List flowers = new ArrayList<>(source);
+ if(flowers.size() > 0) {
+ flowers.get(0).setPetals(flowers.get(0).getPetals() * 3);
+ }
+
+ return flowers;
+ }
+
+ public List copyListByAddAllMethod(List source) {
+ List flowers = new ArrayList<>();
+ flowers.addAll(source);
+ return flowers;
+ }
+
+ public List copyListByAddAllMethodAndEditOneFlowerInTheNewList(List source) {
+ List flowers = new ArrayList<>();
+ flowers.addAll(source);
+
+ if(flowers.size() > 0) {
+ flowers.get(0).setPetals(flowers.get(0).getPetals() * 3);
+ }
+
+ return flowers;
+ }
+
+ public List copyListByCopyMethod(List source, List dest) {
+ Collections.copy(dest, source);
+ return dest;
+ }
+
+ public List copyListByStream(List source) {
+ return source.stream().collect(Collectors.toList());
+ }
+
+ public List copyListByStreamAndSkipFirstElement(List source) {
+ return source.stream().skip(1).collect(Collectors.toList());
+ }
+
+ public List copyListByStreamWithFilter(List source, Integer moreThanPetals) {
+ return source.stream().filter(f -> f.getPetals() > moreThanPetals).collect(Collectors.toList());
+ }
+
+ public List copyListByStreamWithOptional(List source) {
+ return Optional.ofNullable(source)
+ .map(List::stream)
+ .orElseGet(Stream::empty)
+ .collect(Collectors.toList());
+ }
+
+ public List copyListByStreamWithOptionalAndSkip(List source) {
+ return Optional.ofNullable(source)
+ .map(List::stream)
+ .orElseGet(Stream::empty)
+ .skip(1)
+ .collect(Collectors.toList());
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/list/Flower.java b/core-java-8/src/main/java/com/baeldung/list/Flower.java
new file mode 100644
index 0000000000..29c6a78326
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/list/Flower.java
@@ -0,0 +1,28 @@
+package com.baeldung.list;
+
+public class Flower {
+
+ private String name;
+ private int petals;
+
+ public Flower(String name, int petals) {
+ this.name = name;
+ this.petals = petals;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getPetals() {
+ return petals;
+ }
+
+ public void setPetals(int petals) {
+ this.petals = petals;
+ }
+}
diff --git a/core-java-8/src/test/java/com/baeldung/convertlisttomap/ConvertListToMapServiceUnitTest.java b/core-java-8/src/test/java/com/baeldung/convertlisttomap/ConvertListToMapServiceUnitTest.java
new file mode 100644
index 0000000000..a4234d2af4
--- /dev/null
+++ b/core-java-8/src/test/java/com/baeldung/convertlisttomap/ConvertListToMapServiceUnitTest.java
@@ -0,0 +1,67 @@
+package com.baeldung.convertlisttomap;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class ConvertListToMapServiceUnitTest {
+ List list;
+
+ private ConvertListToMapService convertListService;
+
+ @Before
+ public void init() {
+ this.convertListService = new ConvertListToMapService();
+ this.list = new ArrayList<>();
+
+ Animal cat = new Animal(1, "Cat");
+ list.add(cat);
+ Animal dog = new Animal(2, "Dog");
+ list.add(dog);
+ Animal pig = new Animal(3, "Pig");
+ list.add(pig);
+ Animal cow = new Animal(4, "Cow");
+ list.add(cow);
+ Animal goat = new Animal(5, "Goat");
+ list.add(goat);
+
+ }
+
+ @Test
+ public void givenAList_whenConvertBeforeJava8_thenReturnMapWithTheSameElements() {
+
+ Map map = convertListService.convertListBeforeJava8(list);
+
+ assertThat(map.values(), containsInAnyOrder(list.toArray()));
+ }
+
+ @Test
+ public void givenAList_whenConvertAfterJava8_thenReturnMapWithTheSameElements() {
+
+ Map map = convertListService.convertListAfterJava8(list);
+
+ assertThat(map.values(), containsInAnyOrder(list.toArray()));
+ }
+
+ @Test
+ public void givenAList_whenConvertWithGuava_thenReturnMapWithTheSameElements() {
+
+ Map map = convertListService.convertListWithGuava(list);
+
+ assertThat(map.values(), containsInAnyOrder(list.toArray()));
+ }
+
+ @Test
+ public void givenAList_whenConvertWithApacheCommons_thenReturnMapWithTheSameElements() {
+
+ Map map = convertListService.convertListWithApacheCommons(list);
+
+ assertThat(map.values(), containsInAnyOrder(list.toArray()));
+ }
+
+}
diff --git a/core-java-8/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDiplicatedIdToMapServiceUnitTest.java b/core-java-8/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDiplicatedIdToMapServiceUnitTest.java
new file mode 100644
index 0000000000..6d3ad9e76e
--- /dev/null
+++ b/core-java-8/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDiplicatedIdToMapServiceUnitTest.java
@@ -0,0 +1,68 @@
+package com.baeldung.convertlisttomap;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.hasItem;
+import static org.hamcrest.Matchers.hasSize;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class ConvertListWithDiplicatedIdToMapServiceUnitTest {
+ List duplicatedIdList;
+
+ private ConvertListToMapService convertListService = new ConvertListToMapService();
+
+ @Before
+ public void init() {
+
+ this.duplicatedIdList = new ArrayList<>();
+
+ Animal cat = new Animal(1, "Cat");
+ duplicatedIdList.add(cat);
+ Animal dog = new Animal(2, "Dog");
+ duplicatedIdList.add(dog);
+ Animal pig = new Animal(3, "Pig");
+ duplicatedIdList.add(pig);
+ Animal cow = new Animal(4, "Cow");
+ duplicatedIdList.add(cow);
+ Animal goat = new Animal(4, "Goat");
+ duplicatedIdList.add(goat);
+
+ }
+
+ @Test
+ public void givenADupIdList_whenConvertBeforeJava8_thenReturnMapWithRewrittenElement() {
+
+ Map map = convertListService.convertListBeforeJava8(duplicatedIdList);
+
+ assertThat(map.values(), hasSize(4));
+ assertThat(map.values(), hasItem(duplicatedIdList.get(4)));
+ }
+
+ @Test
+ public void givenADupIdList_whenConvertWithApacheCommons_thenReturnMapWithRewrittenElement() {
+
+ Map map = convertListService.convertListWithApacheCommons(duplicatedIdList);
+
+ assertThat(map.values(), hasSize(4));
+ assertThat(map.values(), hasItem(duplicatedIdList.get(4)));
+ }
+
+ @Test(expected = IllegalStateException.class)
+ public void givenADupIdList_whenConvertAfterJava8_thenException() {
+
+ convertListService.convertListAfterJava8(duplicatedIdList);
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void givenADupIdList_whenConvertWithGuava_thenException() {
+
+ convertListService.convertListWithGuava(duplicatedIdList);
+
+ }
+
+}
diff --git a/core-java-8/src/test/java/com/baeldung/list/CopyListServiceUnitTest.java b/core-java-8/src/test/java/com/baeldung/list/CopyListServiceUnitTest.java
new file mode 100644
index 0000000000..348747111f
--- /dev/null
+++ b/core-java-8/src/test/java/com/baeldung/list/CopyListServiceUnitTest.java
@@ -0,0 +1,129 @@
+package com.baeldung.list;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.junit.Assert.*;
+
+public class CopyListServiceUnitTest {
+
+ List flowers;
+
+ private CopyListService copyListService;
+
+ @Before
+ public void init() {
+ this.copyListService = new CopyListService();
+ this.flowers = new ArrayList<>();
+
+ Flower poppy = new Flower("Poppy", 12);
+ flowers.add(poppy);
+ Flower anemone = new Flower("Anemone", 8);
+ flowers.add(anemone);
+ Flower catmint = new Flower("Catmint", 12);
+ flowers.add(catmint);
+ Flower diascia = new Flower("Diascia", 5);
+ flowers.add(diascia);
+ Flower iris = new Flower("Iris", 3);
+ flowers.add(iris);
+ Flower pansy = new Flower("Pansy", 5);
+ flowers.add(pansy);
+ }
+
+ @Test
+ public void givenAList_whenListDoesNotHaveNullElements_thenReturnAnotherListWithTheSameElementsByConstructor() {
+ List copy = copyListService.copyListByConstructor(flowers);
+ assertEquals(copy.size(), flowers.size());
+ assertTrue(copy.containsAll(flowers));
+ }
+
+ @Test
+ public void givenAList_whenListDoesNotHaveNullElements_thenReturnAnotherListWithOneModifiedElementByConstructor() {
+ List copy = copyListService.copyListByConstructorAndEditOneFlowerInTheNewList(flowers);
+ assertEquals(copy.size(), flowers.size());
+ assertTrue(copy.containsAll(flowers));
+ }
+
+ @Test
+ public void givenAList_whenListDoesNotHaveNullElements_thenReturnAnotherListWithTheSameElementsByAddAllmethod() {
+ List copy = copyListService.copyListByAddAllMethod(flowers);
+ assertEquals(copy.size(), flowers.size());
+ assertTrue(copy.containsAll(flowers));
+ }
+
+ @Test
+ public void givenAList_whenListDoesNotHaveNullElements_thenReturnAnotherListWithOneModifiedElementByAddAllmethod() {
+ List copy = copyListService.copyListByAddAllMethodAndEditOneFlowerInTheNewList(flowers);
+ assertEquals(copy.size(), flowers.size());
+ assertTrue(copy.containsAll(flowers));
+ }
+
+ @Test
+ public void givenAList_whenListsHaveSameSize_thenReturnAnotherListWithTheSameElementsByCopyMethod() {
+ List source = Arrays.asList(1,2,3);
+ List dest = Arrays.asList(4,5,6);
+
+ dest = copyListService.copyListByCopyMethod(source, dest);
+ assertEquals(dest.size(), source.size());
+ assertTrue(dest.containsAll(source));
+ }
+
+ @Test
+ public void givenAList_whenListsHaveDifferentSize_thenReturnAnotherListWithTheSameElementsByCopyMethod() {
+ List source = Arrays.asList(1,2,3);
+ List dest = Arrays.asList(5,6,7,8,9,10);
+
+ dest = copyListService.copyListByCopyMethod(source, dest);
+ assertNotEquals(dest.size(), source.size());
+ assertTrue(dest.containsAll(source));
+ }
+
+ @Test
+ public void givenAList_whenListDoesNotHaveNullElements_thenReturnAnotherListWithTheSameElementsByStreamProcess() {
+ List copy = copyListService.copyListByStream(flowers);
+ assertEquals(copy.size(), flowers.size());
+ assertTrue(copy.containsAll(flowers));
+ }
+
+ @Test
+ public void givenAList_whenListDoesNotHaveNullElements_thenReturnAnotherListWithOneElementLessByStreamProcess() {
+ List copy = copyListService.copyListByStreamAndSkipFirstElement(flowers);
+ assertNotEquals(copy.size(), flowers.size());
+ assertEquals(copy.size() + 1, flowers.size());
+ assertFalse(copy.containsAll(flowers));
+ }
+
+ @Test
+ public void givenAList_whenListDoesNotHaveNullElements_thenReturnAnotherListWithFilterElementsByStreamProcess() {
+ List copy = copyListService.copyListByStreamWithFilter(flowers, 5);
+ assertNotEquals(copy.size(), flowers.size());
+ assertEquals(copy.size() + 3, flowers.size());
+ assertFalse(copy.containsAll(flowers));
+ }
+
+ @Test
+ public void givenAList_whenListIsNull_thenReturnEmptyListByStreamProcess() {
+ List copy = copyListService.copyListByStreamWithOptional(null);
+ assertNotNull(copy);
+ assertEquals(copy.size(), 0);
+ }
+
+ @Test
+ public void givenAList_whenListIsNotNull_thenReturnAnotherListWithTheElementsByStreamProcess() {
+ List copy = copyListService.copyListByStreamWithOptional(flowers);
+ assertEquals(copy.size(), flowers.size());
+ assertTrue(copy.containsAll(flowers));
+ }
+
+ @Test
+ public void givenAList_whenListIsNotNull_thenReturnAnotherListWithOneElementLessByStreamProcess() {
+ List copy = copyListService.copyListByStreamWithOptionalAndSkip(flowers);
+ assertNotEquals(copy.size(), flowers.size());
+ assertEquals(copy.size() + 1, flowers.size());
+ assertFalse(copy.containsAll(flowers));
+ }
+}
diff --git a/core-java-collections/src/test/java/com/baeldung/java/set/HashSetInitalizingUnitTest.java b/core-java-collections/src/test/java/com/baeldung/java/set/HashSetInitalizingUnitTest.java
new file mode 100644
index 0000000000..2e736501cf
--- /dev/null
+++ b/core-java-collections/src/test/java/com/baeldung/java/set/HashSetInitalizingUnitTest.java
@@ -0,0 +1,70 @@
+package com.baeldung.java.set;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+import org.junit.jupiter.api.Test;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static org.junit.Assert.assertEquals;
+
+public class HashSetInitalizingUnitTest {
+ @Test
+ public void whenUsingJava_usingArraysStaticMethod_thenCorrectSize() {
+ Set set = new HashSet<>(Arrays.asList("a", "b", "c"));
+ assertEquals(3, set.size());
+ }
+
+ @Test
+ public void whenUsingJava_usingAnonymousClass_thenCorrectSize() {
+ Set set = new HashSet(){{
+ add("a");
+ add("b");
+ add("c");
+ }};
+ assertEquals(3, set.size());
+ }
+
+ @Test
+ public void whenUsingJava_creatingSingletonSet_thenCorrectSize() {
+ Set set = Collections.singleton("a");
+ assertEquals(1, set.size());
+ }
+
+ public static final Set newHashSet(T... objs) {
+ Set set = new HashSet();
+ Collections.addAll(set, objs);
+ return set;
+ }
+
+ @Test
+ public void whenUsingJava_usingCustomStaticUtilMethod_thenCorrectSize() {
+ Set set = newHashSet("a","b","c");
+ assertEquals(3, set.size());
+ }
+
+ @Test
+ public void whenUsingJava8_usingCollectOnStream_thenCorrectSize() {
+ Set set = Stream.of("a", "b", "c").collect(Collectors.toCollection(HashSet::new));
+ assertEquals(3, set.size());
+ }
+
+ @Test
+ public void whenUsingGoogleGuava_createMutableSet_thenCorrectSize() {
+ Set set = Sets.newHashSet("a", "b", "c");
+ assertEquals(3, set.size());
+ }
+
+ @Test
+ public void whenUsingGoogleGuava_createImmutableSet_thenCorrectSize() {
+ Set set = ImmutableSet.of("a", "b", "c");
+ assertEquals(3, set.size());
+ }
+
+}
+
diff --git a/core-java/pom.xml b/core-java/pom.xml
index 6ead63cfab..42e3219ac3 100644
--- a/core-java/pom.xml
+++ b/core-java/pom.xml
@@ -1,5 +1,5 @@
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.baeldung
core-java
@@ -73,9 +73,10 @@
org.assertj
assertj-core
- ${assertj.version}
+ ${assertj-core.version}
test
+
commons-codec
commons-codec
@@ -146,6 +147,32 @@
icu4j
${icu4j.version}
+
+
+ org.apache.tika
+ tika-core
+ ${tika.version}
+
+
+ net.sf.jmimemagic
+ jmimemagic
+ ${jmime-magic.version}
+
+
+ org.apache.commons
+ commons-dbcp2
+ ${commons-dbcp2.version}
+
+
+ com.zaxxer
+ HikariCP
+ ${HikariCP.version}
+
+
+ com.mchange
+ c3p0
+ ${c3p0.version}
+
@@ -301,7 +328,7 @@
-
+
org.apache.maven.plugins
maven-javadoc-plugin
@@ -348,6 +375,7 @@
org.codehaus.mojo
exec-maven-plugin
+ ${exec-maven-plugin.version}
run-benchmarks
@@ -375,6 +403,7 @@
+
2.8.5
2.8.2
@@ -395,16 +424,23 @@
0.9.0
- 3.6.1
+ 3.10.0
+
+ 2.4.0
+ 3.2.0
+ 0.9.5.2
+
2.19.1
4.3.4.RELEASE
1.5.8.RELEASE
+
1.1
1.4.197
2.1.0.1
1.19
+
1.19
3.0.0-M1
1.5.0-b01
@@ -412,7 +448,11 @@
1.4.4
3.1.1
2.0.3.RELEASE
+ 1.6.0
61.1
+
+ 1.18
+ 0.1.5
-
\ No newline at end of file
+
diff --git a/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/BasicConnectionPool.java b/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/BasicConnectionPool.java
new file mode 100644
index 0000000000..243ec88eb5
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/BasicConnectionPool.java
@@ -0,0 +1,87 @@
+package com.baeldung.connectionpool.connectionpools;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+public class BasicConnectionPool implements ConnectionPool {
+
+ private final String url;
+ private final String user;
+ private final String password;
+ private final List connectionPool;
+ private final List usedConnections = new ArrayList<>();
+ private static final int INITIAL_POOL_SIZE = 10;
+ private final int MAX_POOL_SIZE = 20;
+
+ public static BasicConnectionPool create(String url, String user, String password) throws SQLException {
+ List pool = new ArrayList<>(INITIAL_POOL_SIZE);
+ for (int i = 0; i < INITIAL_POOL_SIZE; i++) {
+ pool.add(createConnection(url, user, password));
+ }
+ return new BasicConnectionPool(url, user, password, pool);
+ }
+
+ private BasicConnectionPool(String url, String user, String password, List connectionPool) {
+ this.url = url;
+ this.user = user;
+ this.password = password;
+ this.connectionPool = connectionPool;
+ }
+
+ @Override
+ public Connection getConnection() throws SQLException {
+ if (connectionPool.size() == 0) {
+ if (usedConnections.size() < MAX_POOL_SIZE) {
+ connectionPool.add(createConnection(url, user, password));
+ } else {
+ throw new RuntimeException("Maximum pool size reached, no available connections!");
+ }
+ }
+
+ Connection connection = connectionPool.remove(connectionPool.size() - 1);
+ usedConnections.add(connection);
+ return connection;
+ }
+
+ @Override
+ public boolean releaseConnection(Connection connection) {
+ connectionPool.add(connection);
+ return usedConnections.remove(connection);
+ }
+
+ private static Connection createConnection(String url, String user, String password) throws SQLException {
+ return DriverManager.getConnection(url, user, password);
+ }
+
+ public int getSize() {
+ return connectionPool.size() + usedConnections.size();
+ }
+
+ @Override
+ public String getUrl() {
+ return url;
+ }
+
+ @Override
+ public String getUser() {
+ return user;
+ }
+
+ @Override
+ public String getPassword() {
+ return password;
+ }
+
+ public void shutdown() throws SQLException {
+ for (Connection c : usedConnections) {
+ this.releaseConnection(c);
+ }
+ for (Connection c : connectionPool) {
+ c.close();
+ }
+ connectionPool.clear();
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/C3poDataSource.java b/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/C3poDataSource.java
new file mode 100644
index 0000000000..5b91f707a9
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/C3poDataSource.java
@@ -0,0 +1,28 @@
+package com.baeldung.connectionpool.connectionpools;
+
+import com.mchange.v2.c3p0.ComboPooledDataSource;
+import java.beans.PropertyVetoException;
+import java.sql.Connection;
+import java.sql.SQLException;
+
+public class C3poDataSource {
+
+ private static final ComboPooledDataSource cpds = new ComboPooledDataSource();
+
+ static {
+ try {
+ cpds.setDriverClass("org.h2.Driver");
+ cpds.setJdbcUrl("jdbc:h2:mem:test");
+ cpds.setUser("user");
+ cpds.setPassword("password");
+ } catch (PropertyVetoException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static Connection getConnection() throws SQLException {
+ return cpds.getConnection();
+ }
+
+ private C3poDataSource(){}
+}
\ No newline at end of file
diff --git a/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/ConnectionPool.java b/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/ConnectionPool.java
new file mode 100644
index 0000000000..3d5ad06c3d
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/ConnectionPool.java
@@ -0,0 +1,18 @@
+package com.baeldung.connectionpool.connectionpools;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.List;
+
+public interface ConnectionPool {
+
+ Connection getConnection() throws SQLException;
+
+ boolean releaseConnection(Connection connection);
+
+ String getUrl();
+
+ String getUser();
+
+ String getPassword();
+}
\ No newline at end of file
diff --git a/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/DBCPDataSource.java b/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/DBCPDataSource.java
new file mode 100644
index 0000000000..2f33cde883
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/DBCPDataSource.java
@@ -0,0 +1,25 @@
+package com.baeldung.connectionpool.connectionpools;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import org.apache.commons.dbcp2.BasicDataSource;
+
+public class DBCPDataSource {
+
+ private static final BasicDataSource ds = new BasicDataSource();
+
+ static {
+ ds.setUrl("jdbc:h2:mem:test");
+ ds.setUsername("user");
+ ds.setPassword("password");
+ ds.setMinIdle(5);
+ ds.setMaxIdle(10);
+ ds.setMaxOpenPreparedStatements(100);
+ }
+
+ public static Connection getConnection() throws SQLException {
+ return ds.getConnection();
+ }
+
+ private DBCPDataSource(){}
+}
diff --git a/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/HikariCPDataSource.java b/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/HikariCPDataSource.java
new file mode 100644
index 0000000000..5ed2de181d
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/HikariCPDataSource.java
@@ -0,0 +1,28 @@
+package com.baeldung.connectionpool.connectionpools;
+
+import com.zaxxer.hikari.HikariConfig;
+import com.zaxxer.hikari.HikariDataSource;
+import java.sql.Connection;
+import java.sql.SQLException;
+
+public class HikariCPDataSource {
+
+ private static final HikariConfig config = new HikariConfig();
+ private static final HikariDataSource ds;
+
+ static {
+ config.setJdbcUrl("jdbc:h2:mem:test");
+ config.setUsername("user");
+ config.setPassword("password");
+ config.addDataSourceProperty("cachePrepStmts", "true");
+ config.addDataSourceProperty("prepStmtCacheSize", "250");
+ config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
+ ds = new HikariDataSource(config);
+ }
+
+ public static Connection getConnection() throws SQLException {
+ return ds.getConnection();
+ }
+
+ private HikariCPDataSource(){}
+}
diff --git a/core-java/src/main/resources/product.png b/core-java/src/main/resources/product.png
new file mode 100644
index 0000000000..4edd01c0a1
Binary files /dev/null and b/core-java/src/main/resources/product.png differ
diff --git a/core-java/src/test/java/com/baeldung/connectionpool/BasicConnectionPoolUnitTest.java b/core-java/src/test/java/com/baeldung/connectionpool/BasicConnectionPoolUnitTest.java
new file mode 100644
index 0000000000..5edc6bba94
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/connectionpool/BasicConnectionPoolUnitTest.java
@@ -0,0 +1,69 @@
+package com.baeldung.connectionpool;
+
+import com.baeldung.connectionpool.connectionpools.BasicConnectionPool;
+import com.baeldung.connectionpool.connectionpools.ConnectionPool;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.List;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class BasicConnectionPoolUnitTest {
+
+ private static ConnectionPool connectionPool;
+
+ @BeforeClass
+ public static void setUpBasicConnectionPoolInstance() throws SQLException {
+ connectionPool = BasicConnectionPool.create("jdbc:h2:mem:test", "user", "password");
+ }
+
+ @Test
+ public void givenBasicConnectionPoolInstance_whenCalledgetConnection_thenCorrect() throws Exception {
+ assertTrue(connectionPool.getConnection().isValid(1));
+ }
+
+ @Test
+ public void givenBasicConnectionPoolInstance_whenCalledreleaseConnection_thenCorrect() throws Exception {
+ Connection connection = connectionPool.getConnection();
+ assertThat(connectionPool.releaseConnection(connection)).isTrue();
+ }
+
+ @Test
+ public void givenBasicConnectionPoolInstance_whenCalledgetUrl_thenCorrect() {
+ assertThat(connectionPool.getUrl()).isEqualTo("jdbc:h2:mem:test");
+ }
+
+ @Test
+ public void givenBasicConnectionPoolInstance_whenCalledgetUser_thenCorrect() {
+ assertThat(connectionPool.getUser()).isEqualTo("user");
+ }
+
+ @Test
+ public void givenBasicConnectionPoolInstance_whenCalledgetPassword_thenCorrect() {
+ assertThat(connectionPool.getPassword()).isEqualTo("password");
+ }
+
+ @Test(expected = RuntimeException.class)
+ public void givenBasicConnectionPoolInstance_whenAskedForMoreThanMax_thenError() throws Exception {
+ // this test needs to be independent so it doesn't share the same connection pool as other tests
+ ConnectionPool cp = BasicConnectionPool.create("jdbc:h2:mem:test", "user", "password");
+ final int MAX_POOL_SIZE = 20;
+ for (int i = 0; i < MAX_POOL_SIZE + 1; i++) {
+ cp.getConnection();
+ }
+ fail();
+ }
+
+ @Test
+ public void givenBasicConnectionPoolInstance_whenSutdown_thenEmpty() throws Exception {
+ ConnectionPool cp = BasicConnectionPool.create("jdbc:h2:mem:test", "user", "password");
+ assertThat(((BasicConnectionPool)cp).getSize()).isEqualTo(10);
+
+ ((BasicConnectionPool) cp).shutdown();
+ assertThat(((BasicConnectionPool)cp).getSize()).isEqualTo(0);
+ }
+}
diff --git a/core-java/src/test/java/com/baeldung/connectionpool/C3poDataSourceUnitTest.java b/core-java/src/test/java/com/baeldung/connectionpool/C3poDataSourceUnitTest.java
new file mode 100644
index 0000000000..a02daa40f6
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/connectionpool/C3poDataSourceUnitTest.java
@@ -0,0 +1,14 @@
+package com.baeldung.connectionpool;
+
+import com.baeldung.connectionpool.connectionpools.C3poDataSource;
+import java.sql.SQLException;
+import static org.junit.Assert.assertTrue;
+import org.junit.Test;
+
+public class C3poDataSourceUnitTest {
+
+ @Test
+ public void givenC3poDataSourceClass_whenCalledgetConnection_thenCorrect() throws SQLException {
+ assertTrue(C3poDataSource.getConnection().isValid(1));
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/connectionpool/DBCPDataSourceUnitTest.java b/core-java/src/test/java/com/baeldung/connectionpool/DBCPDataSourceUnitTest.java
new file mode 100644
index 0000000000..9583eedf4b
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/connectionpool/DBCPDataSourceUnitTest.java
@@ -0,0 +1,14 @@
+package com.baeldung.connectionpool;
+
+import com.baeldung.connectionpool.connectionpools.DBCPDataSource;
+import java.sql.SQLException;
+import static org.junit.Assert.assertTrue;
+import org.junit.Test;
+
+public class DBCPDataSourceUnitTest {
+
+ @Test
+ public void givenDBCPDataSourceClass_whenCalledgetConnection_thenCorrect() throws SQLException {
+ assertTrue(DBCPDataSource.getConnection().isValid(1));
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/connectionpool/HikariCPDataSourceUnitTest.java b/core-java/src/test/java/com/baeldung/connectionpool/HikariCPDataSourceUnitTest.java
new file mode 100644
index 0000000000..6b78815797
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/connectionpool/HikariCPDataSourceUnitTest.java
@@ -0,0 +1,14 @@
+package com.baeldung.connectionpool;
+
+import com.baeldung.connectionpool.connectionpools.HikariCPDataSource;
+import java.sql.SQLException;
+import static org.junit.Assert.assertTrue;
+import org.junit.Test;
+
+public class HikariCPDataSourceUnitTest {
+
+ @Test
+ public void givenHikariDataSourceClass_whenCalledgetConnection_thenCorrect() throws SQLException {
+ assertTrue(HikariCPDataSource.getConnection().isValid(1));
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/java/mimetype/MimeTypeUnitTest.java b/core-java/src/test/java/com/baeldung/java/mimetype/MimeTypeUnitTest.java
new file mode 100644
index 0000000000..c8da2c1339
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/java/mimetype/MimeTypeUnitTest.java
@@ -0,0 +1,131 @@
+package com.baeldung.java.mimetype;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.FileNameMap;
+import java.net.MalformedURLException;
+import java.net.URLConnection;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import javax.activation.MimetypesFileTypeMap;
+
+import org.apache.tika.Tika;
+import org.junit.Test;
+
+import net.sf.jmimemagic.Magic;
+import net.sf.jmimemagic.MagicException;
+import net.sf.jmimemagic.MagicMatch;
+import net.sf.jmimemagic.MagicMatchNotFoundException;
+import net.sf.jmimemagic.MagicParseException;
+
+/**
+ * Test class demonstrating various strategies to resolve MIME type of a file.
+ * @author tritty
+ *
+ */
+public class MimeTypeUnitTest {
+ /**
+ * Expected Ouput.
+ */
+ public static final String PNG_EXT = "image/png";
+
+ /**
+ * The location of the file.
+ */
+ public static final String FILE_LOC = "src/test/resources/product.png";
+
+ /**
+ * Test method, demonstrating usage in Java 7.
+ *
+ * @throws IOException
+ */
+ @Test
+ public void whenUsingJava7_thenSuccess() throws IOException {
+ final Path path = new File(FILE_LOC).toPath();
+ final String mimeType = Files.probeContentType(path);
+ assertEquals(mimeType, PNG_EXT);
+ }
+
+ /**
+ * Test method demonstrating the usage of URLConnection to resolve MIME type.
+ *
+ * @throws MalformedURLException
+ * @throws IOException
+ */
+ @Test
+ public void whenUsingGetContentType_thenSuccess() throws MalformedURLException, IOException {
+ final File file = new File(FILE_LOC);
+ final URLConnection connection = file.toURL()
+ .openConnection();
+ final String mimeType = connection.getContentType();
+ assertEquals(mimeType, PNG_EXT);
+ }
+
+ /**
+ * Test method demonstrating the usage of URLConnection to resolve MIME type.
+ *
+ */
+ @Test
+ public void whenUsingGuessContentTypeFromName_thenSuccess() {
+ final File file = new File(FILE_LOC);
+ final String mimeType = URLConnection.guessContentTypeFromName(file.getName());
+ assertEquals(mimeType, PNG_EXT);
+ }
+
+ /**
+ * Test method demonstrating the usage of FileNameMap from URLConnection
+ * to resolve MIME type of a file.
+ *
+ */
+ @Test
+ public void whenUsingGetFileNameMap_thenSuccess() {
+ final File file = new File(FILE_LOC);
+ final FileNameMap fileNameMap = URLConnection.getFileNameMap();
+ final String mimeType = fileNameMap.getContentTypeFor(file.getName());
+ assertEquals(mimeType, PNG_EXT);
+ }
+
+ /**
+ * Test method demonstrating the usage of MimeTypesFileTypeMap for resolution of
+ * MIME type.
+ *
+ */
+ @Test
+ public void whenUsingMimeTypesFileTypeMap_thenSuccess() {
+ final File file = new File(FILE_LOC);
+ final MimetypesFileTypeMap fileTypeMap = new MimetypesFileTypeMap();
+ final String mimeType = fileTypeMap.getContentType(file.getName());
+ assertEquals(mimeType, PNG_EXT);
+ }
+
+ /**
+ * Test method demonstrating usage of jMimeMagic.
+ *
+ * @throws MagicParseException
+ * @throws MagicMatchNotFoundException
+ * @throws MagicException
+ */
+ @Test
+ public void whenUsingJmimeMagic_thenSuccess() throws MagicParseException, MagicMatchNotFoundException, MagicException {
+ final File file = new File(FILE_LOC);
+ final Magic magic = new Magic();
+ final MagicMatch match = magic.getMagicMatch(file, false);
+ assertEquals(match.getMimeType(), PNG_EXT);
+ }
+
+ /**
+ * Test method demonstrating usage of Apache Tika.
+ *
+ * @throws IOException
+ */
+ @Test
+ public void whenUsingTika_thenSuccess() throws IOException {
+ final File file = new File(FILE_LOC);
+ final Tika tika = new Tika();
+ final String mimeType = tika.detect(file);
+ assertEquals(mimeType, PNG_EXT);
+ }
+}
diff --git a/core-java/src/test/resources/META-INF/mime.types b/core-java/src/test/resources/META-INF/mime.types
new file mode 100644
index 0000000000..5175242626
--- /dev/null
+++ b/core-java/src/test/resources/META-INF/mime.types
@@ -0,0 +1,1588 @@
+# This file maps Internet media types to unique file extension(s).
+# Although created for httpd, this file is used by many software systems
+# and has been placed in the public domain for unlimited redisribution.
+#
+# The table below contains both registered and (common) unregistered types.
+# A type that has no unique extension can be ignored -- they are listed
+# here to guide configurations toward known types and to make it easier to
+# identify "new" types. File extensions are also commonly used to indicate
+# content languages and encodings, so choose them carefully.
+#
+# Internet media types should be registered as described in RFC 4288.
+# The registry is at .
+#
+# MIME type (lowercased) Extensions
+# ============================================ ==========
+# application/1d-interleaved-parityfec
+# application/3gpp-ims+xml
+# application/activemessage
+application/andrew-inset ez
+# application/applefile
+application/applixware aw
+application/atom+xml atom
+application/atomcat+xml atomcat
+# application/atomicmail
+application/atomsvc+xml atomsvc
+# application/auth-policy+xml
+# application/batch-smtp
+# application/beep+xml
+# application/calendar+xml
+# application/cals-1840
+# application/ccmp+xml
+application/ccxml+xml ccxml
+application/cdmi-capability cdmia
+application/cdmi-container cdmic
+application/cdmi-domain cdmid
+application/cdmi-object cdmio
+application/cdmi-queue cdmiq
+# application/cea-2018+xml
+# application/cellml+xml
+# application/cfw
+# application/cnrp+xml
+# application/commonground
+# application/conference-info+xml
+# application/cpl+xml
+# application/csta+xml
+# application/cstadata+xml
+application/cu-seeme cu
+# application/cybercash
+application/davmount+xml davmount
+# application/dca-rft
+# application/dec-dx
+# application/dialog-info+xml
+# application/dicom
+# application/dns
+application/docbook+xml dbk
+# application/dskpp+xml
+application/dssc+der dssc
+application/dssc+xml xdssc
+# application/dvcs
+application/ecmascript ecma
+# application/edi-consent
+# application/edi-x12
+# application/edifact
+application/emma+xml emma
+# application/epp+xml
+application/epub+zip epub
+# application/eshop
+# application/example
+application/exi exi
+# application/fastinfoset
+# application/fastsoap
+# application/fits
+application/font-tdpfr pfr
+# application/framework-attributes+xml
+application/gml+xml gml
+application/gpx+xml gpx
+application/gxf gxf
+# application/h224
+# application/held+xml
+# application/http
+application/hyperstudio stk
+# application/ibe-key-request+xml
+# application/ibe-pkg-reply+xml
+# application/ibe-pp-data
+# application/iges
+# application/im-iscomposing+xml
+# application/index
+# application/index.cmd
+# application/index.obj
+# application/index.response
+# application/index.vnd
+application/inkml+xml ink inkml
+# application/iotp
+application/ipfix ipfix
+# application/ipp
+# application/isup
+application/java-archive jar
+application/java-serialized-object ser
+application/java-vm class
+application/javascript js
+application/json json
+application/jsonml+json jsonml
+# application/kpml-request+xml
+# application/kpml-response+xml
+application/lost+xml lostxml
+application/mac-binhex40 hqx
+application/mac-compactpro cpt
+# application/macwriteii
+application/mads+xml mads
+application/marc mrc
+application/marcxml+xml mrcx
+application/mathematica ma nb mb
+# application/mathml-content+xml
+# application/mathml-presentation+xml
+application/mathml+xml mathml
+# application/mbms-associated-procedure-description+xml
+# application/mbms-deregister+xml
+# application/mbms-envelope+xml
+# application/mbms-msk+xml
+# application/mbms-msk-response+xml
+# application/mbms-protection-description+xml
+# application/mbms-reception-report+xml
+# application/mbms-register+xml
+# application/mbms-register-response+xml
+# application/mbms-user-service-description+xml
+application/mbox mbox
+# application/media_control+xml
+application/mediaservercontrol+xml mscml
+application/metalink+xml metalink
+application/metalink4+xml meta4
+application/mets+xml mets
+# application/mikey
+application/mods+xml mods
+# application/moss-keys
+# application/moss-signature
+# application/mosskey-data
+# application/mosskey-request
+application/mp21 m21 mp21
+application/mp4 mp4s
+# application/mpeg4-generic
+# application/mpeg4-iod
+# application/mpeg4-iod-xmt
+# application/msc-ivr+xml
+# application/msc-mixer+xml
+application/msword doc dot
+application/mxf mxf
+# application/nasdata
+# application/news-checkgroups
+# application/news-groupinfo
+# application/news-transmission
+# application/nss
+# application/ocsp-request
+# application/ocsp-response
+application/octet-stream bin dms lrf mar so dist distz pkg bpk dump elc deploy
+application/oda oda
+application/oebps-package+xml opf
+application/ogg ogx
+application/omdoc+xml omdoc
+application/onenote onetoc onetoc2 onetmp onepkg
+application/oxps oxps
+# application/parityfec
+application/patch-ops-error+xml xer
+application/pdf pdf
+application/pgp-encrypted pgp
+# application/pgp-keys
+application/pgp-signature asc sig
+application/pics-rules prf
+# application/pidf+xml
+# application/pidf-diff+xml
+application/pkcs10 p10
+application/pkcs7-mime p7m p7c
+application/pkcs7-signature p7s
+application/pkcs8 p8
+application/pkix-attr-cert ac
+application/pkix-cert cer
+application/pkix-crl crl
+application/pkix-pkipath pkipath
+application/pkixcmp pki
+application/pls+xml pls
+# application/poc-settings+xml
+application/postscript ai eps ps
+# application/prs.alvestrand.titrax-sheet
+application/prs.cww cww
+# application/prs.nprend
+# application/prs.plucker
+# application/prs.rdf-xml-crypt
+# application/prs.xsf+xml
+application/pskc+xml pskcxml
+# application/qsig
+application/rdf+xml rdf
+application/reginfo+xml rif
+application/relax-ng-compact-syntax rnc
+# application/remote-printing
+application/resource-lists+xml rl
+application/resource-lists-diff+xml rld
+# application/riscos
+# application/rlmi+xml
+application/rls-services+xml rs
+application/rpki-ghostbusters gbr
+application/rpki-manifest mft
+application/rpki-roa roa
+# application/rpki-updown
+application/rsd+xml rsd
+application/rss+xml rss
+application/rtf rtf
+# application/rtx
+# application/samlassertion+xml
+# application/samlmetadata+xml
+application/sbml+xml sbml
+application/scvp-cv-request scq
+application/scvp-cv-response scs
+application/scvp-vp-request spq
+application/scvp-vp-response spp
+application/sdp sdp
+# application/set-payment
+application/set-payment-initiation setpay
+# application/set-registration
+application/set-registration-initiation setreg
+# application/sgml
+# application/sgml-open-catalog
+application/shf+xml shf
+# application/sieve
+# application/simple-filter+xml
+# application/simple-message-summary
+# application/simplesymbolcontainer
+# application/slate
+# application/smil
+application/smil+xml smi smil
+# application/soap+fastinfoset
+# application/soap+xml
+application/sparql-query rq
+application/sparql-results+xml srx
+# application/spirits-event+xml
+application/srgs gram
+application/srgs+xml grxml
+application/sru+xml sru
+application/ssdl+xml ssdl
+application/ssml+xml ssml
+# application/tamp-apex-update
+# application/tamp-apex-update-confirm
+# application/tamp-community-update
+# application/tamp-community-update-confirm
+# application/tamp-error
+# application/tamp-sequence-adjust
+# application/tamp-sequence-adjust-confirm
+# application/tamp-status-query
+# application/tamp-status-response
+# application/tamp-update
+# application/tamp-update-confirm
+application/tei+xml tei teicorpus
+application/thraud+xml tfi
+# application/timestamp-query
+# application/timestamp-reply
+application/timestamped-data tsd
+# application/tve-trigger
+# application/ulpfec
+# application/vcard+xml
+# application/vemmi
+# application/vividence.scriptfile
+# application/vnd.3gpp.bsf+xml
+application/vnd.3gpp.pic-bw-large plb
+application/vnd.3gpp.pic-bw-small psb
+application/vnd.3gpp.pic-bw-var pvb
+# application/vnd.3gpp.sms
+# application/vnd.3gpp2.bcmcsinfo+xml
+# application/vnd.3gpp2.sms
+application/vnd.3gpp2.tcap tcap
+application/vnd.3m.post-it-notes pwn
+application/vnd.accpac.simply.aso aso
+application/vnd.accpac.simply.imp imp
+application/vnd.acucobol acu
+application/vnd.acucorp atc acutc
+application/vnd.adobe.air-application-installer-package+zip air
+application/vnd.adobe.formscentral.fcdt fcdt
+application/vnd.adobe.fxp fxp fxpl
+# application/vnd.adobe.partial-upload
+application/vnd.adobe.xdp+xml xdp
+application/vnd.adobe.xfdf xfdf
+# application/vnd.aether.imp
+# application/vnd.ah-barcode
+application/vnd.ahead.space ahead
+application/vnd.airzip.filesecure.azf azf
+application/vnd.airzip.filesecure.azs azs
+application/vnd.amazon.ebook azw
+application/vnd.americandynamics.acc acc
+application/vnd.amiga.ami ami
+# application/vnd.amundsen.maze+xml
+application/vnd.android.package-archive apk
+application/vnd.anser-web-certificate-issue-initiation cii
+application/vnd.anser-web-funds-transfer-initiation fti
+application/vnd.antix.game-component atx
+application/vnd.apple.installer+xml mpkg
+application/vnd.apple.mpegurl m3u8
+# application/vnd.arastra.swi
+application/vnd.aristanetworks.swi swi
+application/vnd.astraea-software.iota iota
+application/vnd.audiograph aep
+# application/vnd.autopackage
+# application/vnd.avistar+xml
+application/vnd.blueice.multipass mpm
+# application/vnd.bluetooth.ep.oob
+application/vnd.bmi bmi
+application/vnd.businessobjects rep
+# application/vnd.cab-jscript
+# application/vnd.canon-cpdl
+# application/vnd.canon-lips
+# application/vnd.cendio.thinlinc.clientconf
+application/vnd.chemdraw+xml cdxml
+application/vnd.chipnuts.karaoke-mmd mmd
+application/vnd.cinderella cdy
+# application/vnd.cirpack.isdn-ext
+application/vnd.claymore cla
+application/vnd.cloanto.rp9 rp9
+application/vnd.clonk.c4group c4g c4d c4f c4p c4u
+application/vnd.cluetrust.cartomobile-config c11amc
+application/vnd.cluetrust.cartomobile-config-pkg c11amz
+# application/vnd.collection+json
+# application/vnd.commerce-battelle
+application/vnd.commonspace csp
+application/vnd.contact.cmsg cdbcmsg
+application/vnd.cosmocaller cmc
+application/vnd.crick.clicker clkx
+application/vnd.crick.clicker.keyboard clkk
+application/vnd.crick.clicker.palette clkp
+application/vnd.crick.clicker.template clkt
+application/vnd.crick.clicker.wordbank clkw
+application/vnd.criticaltools.wbs+xml wbs
+application/vnd.ctc-posml pml
+# application/vnd.ctct.ws+xml
+# application/vnd.cups-pdf
+# application/vnd.cups-postscript
+application/vnd.cups-ppd ppd
+# application/vnd.cups-raster
+# application/vnd.cups-raw
+# application/vnd.curl
+application/vnd.curl.car car
+application/vnd.curl.pcurl pcurl
+# application/vnd.cybank
+application/vnd.dart dart
+application/vnd.data-vision.rdz rdz
+application/vnd.dece.data uvf uvvf uvd uvvd
+application/vnd.dece.ttml+xml uvt uvvt
+application/vnd.dece.unspecified uvx uvvx
+application/vnd.dece.zip uvz uvvz
+application/vnd.denovo.fcselayout-link fe_launch
+# application/vnd.dir-bi.plate-dl-nosuffix
+application/vnd.dna dna
+application/vnd.dolby.mlp mlp
+# application/vnd.dolby.mobile.1
+# application/vnd.dolby.mobile.2
+application/vnd.dpgraph dpg
+application/vnd.dreamfactory dfac
+application/vnd.ds-keypoint kpxx
+application/vnd.dvb.ait ait
+# application/vnd.dvb.dvbj
+# application/vnd.dvb.esgcontainer
+# application/vnd.dvb.ipdcdftnotifaccess
+# application/vnd.dvb.ipdcesgaccess
+# application/vnd.dvb.ipdcesgaccess2
+# application/vnd.dvb.ipdcesgpdd
+# application/vnd.dvb.ipdcroaming
+# application/vnd.dvb.iptv.alfec-base
+# application/vnd.dvb.iptv.alfec-enhancement
+# application/vnd.dvb.notif-aggregate-root+xml
+# application/vnd.dvb.notif-container+xml
+# application/vnd.dvb.notif-generic+xml
+# application/vnd.dvb.notif-ia-msglist+xml
+# application/vnd.dvb.notif-ia-registration-request+xml
+# application/vnd.dvb.notif-ia-registration-response+xml
+# application/vnd.dvb.notif-init+xml
+# application/vnd.dvb.pfr
+application/vnd.dvb.service svc
+# application/vnd.dxr
+application/vnd.dynageo geo
+# application/vnd.easykaraoke.cdgdownload
+# application/vnd.ecdis-update
+application/vnd.ecowin.chart mag
+# application/vnd.ecowin.filerequest
+# application/vnd.ecowin.fileupdate
+# application/vnd.ecowin.series
+# application/vnd.ecowin.seriesrequest
+# application/vnd.ecowin.seriesupdate
+# application/vnd.emclient.accessrequest+xml
+application/vnd.enliven nml
+# application/vnd.eprints.data+xml
+application/vnd.epson.esf esf
+application/vnd.epson.msf msf
+application/vnd.epson.quickanime qam
+application/vnd.epson.salt slt
+application/vnd.epson.ssf ssf
+# application/vnd.ericsson.quickcall
+application/vnd.eszigno3+xml es3 et3
+# application/vnd.etsi.aoc+xml
+# application/vnd.etsi.cug+xml
+# application/vnd.etsi.iptvcommand+xml
+# application/vnd.etsi.iptvdiscovery+xml
+# application/vnd.etsi.iptvprofile+xml
+# application/vnd.etsi.iptvsad-bc+xml
+# application/vnd.etsi.iptvsad-cod+xml
+# application/vnd.etsi.iptvsad-npvr+xml
+# application/vnd.etsi.iptvservice+xml
+# application/vnd.etsi.iptvsync+xml
+# application/vnd.etsi.iptvueprofile+xml
+# application/vnd.etsi.mcid+xml
+# application/vnd.etsi.overload-control-policy-dataset+xml
+# application/vnd.etsi.sci+xml
+# application/vnd.etsi.simservs+xml
+# application/vnd.etsi.tsl+xml
+# application/vnd.etsi.tsl.der
+# application/vnd.eudora.data
+application/vnd.ezpix-album ez2
+application/vnd.ezpix-package ez3
+# application/vnd.f-secure.mobile
+application/vnd.fdf fdf
+application/vnd.fdsn.mseed mseed
+application/vnd.fdsn.seed seed dataless
+# application/vnd.ffsns
+# application/vnd.fints
+application/vnd.flographit gph
+application/vnd.fluxtime.clip ftc
+# application/vnd.font-fontforge-sfd
+application/vnd.framemaker fm frame maker book
+application/vnd.frogans.fnc fnc
+application/vnd.frogans.ltf ltf
+application/vnd.fsc.weblaunch fsc
+application/vnd.fujitsu.oasys oas
+application/vnd.fujitsu.oasys2 oa2
+application/vnd.fujitsu.oasys3 oa3
+application/vnd.fujitsu.oasysgp fg5
+application/vnd.fujitsu.oasysprs bh2
+# application/vnd.fujixerox.art-ex
+# application/vnd.fujixerox.art4
+# application/vnd.fujixerox.hbpl
+application/vnd.fujixerox.ddd ddd
+application/vnd.fujixerox.docuworks xdw
+application/vnd.fujixerox.docuworks.binder xbd
+# application/vnd.fut-misnet
+application/vnd.fuzzysheet fzs
+application/vnd.genomatix.tuxedo txd
+# application/vnd.geocube+xml
+application/vnd.geogebra.file ggb
+application/vnd.geogebra.tool ggt
+application/vnd.geometry-explorer gex gre
+application/vnd.geonext gxt
+application/vnd.geoplan g2w
+application/vnd.geospace g3w
+# application/vnd.globalplatform.card-content-mgt
+# application/vnd.globalplatform.card-content-mgt-response
+application/vnd.gmx gmx
+application/vnd.google-earth.kml+xml kml
+application/vnd.google-earth.kmz kmz
+application/vnd.grafeq gqf gqs
+# application/vnd.gridmp
+application/vnd.groove-account gac
+application/vnd.groove-help ghf
+application/vnd.groove-identity-message gim
+application/vnd.groove-injector grv
+application/vnd.groove-tool-message gtm
+application/vnd.groove-tool-template tpl
+application/vnd.groove-vcard vcg
+# application/vnd.hal+json
+application/vnd.hal+xml hal
+application/vnd.handheld-entertainment+xml zmm
+application/vnd.hbci hbci
+# application/vnd.hcl-bireports
+application/vnd.hhe.lesson-player les
+application/vnd.hp-hpgl hpgl
+application/vnd.hp-hpid hpid
+application/vnd.hp-hps hps
+application/vnd.hp-jlyt jlt
+application/vnd.hp-pcl pcl
+application/vnd.hp-pclxl pclxl
+# application/vnd.httphone
+application/vnd.hydrostatix.sof-data sfd-hdstx
+# application/vnd.hzn-3d-crossword
+# application/vnd.ibm.afplinedata
+# application/vnd.ibm.electronic-media
+application/vnd.ibm.minipay mpy
+application/vnd.ibm.modcap afp listafp list3820
+application/vnd.ibm.rights-management irm
+application/vnd.ibm.secure-container sc
+application/vnd.iccprofile icc icm
+application/vnd.igloader igl
+application/vnd.immervision-ivp ivp
+application/vnd.immervision-ivu ivu
+# application/vnd.informedcontrol.rms+xml
+# application/vnd.informix-visionary
+# application/vnd.infotech.project
+# application/vnd.infotech.project+xml
+# application/vnd.innopath.wamp.notification
+application/vnd.insors.igm igm
+application/vnd.intercon.formnet xpw xpx
+application/vnd.intergeo i2g
+# application/vnd.intertrust.digibox
+# application/vnd.intertrust.nncp
+application/vnd.intu.qbo qbo
+application/vnd.intu.qfx qfx
+# application/vnd.iptc.g2.conceptitem+xml
+# application/vnd.iptc.g2.knowledgeitem+xml
+# application/vnd.iptc.g2.newsitem+xml
+# application/vnd.iptc.g2.newsmessage+xml
+# application/vnd.iptc.g2.packageitem+xml
+# application/vnd.iptc.g2.planningitem+xml
+application/vnd.ipunplugged.rcprofile rcprofile
+application/vnd.irepository.package+xml irp
+application/vnd.is-xpr xpr
+application/vnd.isac.fcs fcs
+application/vnd.jam jam
+# application/vnd.japannet-directory-service
+# application/vnd.japannet-jpnstore-wakeup
+# application/vnd.japannet-payment-wakeup
+# application/vnd.japannet-registration
+# application/vnd.japannet-registration-wakeup
+# application/vnd.japannet-setstore-wakeup
+# application/vnd.japannet-verification
+# application/vnd.japannet-verification-wakeup
+application/vnd.jcp.javame.midlet-rms rms
+application/vnd.jisp jisp
+application/vnd.joost.joda-archive joda
+application/vnd.kahootz ktz ktr
+application/vnd.kde.karbon karbon
+application/vnd.kde.kchart chrt
+application/vnd.kde.kformula kfo
+application/vnd.kde.kivio flw
+application/vnd.kde.kontour kon
+application/vnd.kde.kpresenter kpr kpt
+application/vnd.kde.kspread ksp
+application/vnd.kde.kword kwd kwt
+application/vnd.kenameaapp htke
+application/vnd.kidspiration kia
+application/vnd.kinar kne knp
+application/vnd.koan skp skd skt skm
+application/vnd.kodak-descriptor sse
+application/vnd.las.las+xml lasxml
+# application/vnd.liberty-request+xml
+application/vnd.llamagraphics.life-balance.desktop lbd
+application/vnd.llamagraphics.life-balance.exchange+xml lbe
+application/vnd.lotus-1-2-3 123
+application/vnd.lotus-approach apr
+application/vnd.lotus-freelance pre
+application/vnd.lotus-notes nsf
+application/vnd.lotus-organizer org
+application/vnd.lotus-screencam scm
+application/vnd.lotus-wordpro lwp
+application/vnd.macports.portpkg portpkg
+# application/vnd.marlin.drm.actiontoken+xml
+# application/vnd.marlin.drm.conftoken+xml
+# application/vnd.marlin.drm.license+xml
+# application/vnd.marlin.drm.mdcf
+application/vnd.mcd mcd
+application/vnd.medcalcdata mc1
+application/vnd.mediastation.cdkey cdkey
+# application/vnd.meridian-slingshot
+application/vnd.mfer mwf
+application/vnd.mfmp mfm
+application/vnd.micrografx.flo flo
+application/vnd.micrografx.igx igx
+application/vnd.mif mif
+# application/vnd.minisoft-hp3000-save
+# application/vnd.mitsubishi.misty-guard.trustweb
+application/vnd.mobius.daf daf
+application/vnd.mobius.dis dis
+application/vnd.mobius.mbk mbk
+application/vnd.mobius.mqy mqy
+application/vnd.mobius.msl msl
+application/vnd.mobius.plc plc
+application/vnd.mobius.txf txf
+application/vnd.mophun.application mpn
+application/vnd.mophun.certificate mpc
+# application/vnd.motorola.flexsuite
+# application/vnd.motorola.flexsuite.adsi
+# application/vnd.motorola.flexsuite.fis
+# application/vnd.motorola.flexsuite.gotap
+# application/vnd.motorola.flexsuite.kmr
+# application/vnd.motorola.flexsuite.ttc
+# application/vnd.motorola.flexsuite.wem
+# application/vnd.motorola.iprm
+application/vnd.mozilla.xul+xml xul
+application/vnd.ms-artgalry cil
+# application/vnd.ms-asf
+application/vnd.ms-cab-compressed cab
+# application/vnd.ms-color.iccprofile
+application/vnd.ms-excel xls xlm xla xlc xlt xlw
+application/vnd.ms-excel.addin.macroenabled.12 xlam
+application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb
+application/vnd.ms-excel.sheet.macroenabled.12 xlsm
+application/vnd.ms-excel.template.macroenabled.12 xltm
+application/vnd.ms-fontobject eot
+application/vnd.ms-htmlhelp chm
+application/vnd.ms-ims ims
+application/vnd.ms-lrm lrm
+# application/vnd.ms-office.activex+xml
+application/vnd.ms-officetheme thmx
+# application/vnd.ms-opentype
+# application/vnd.ms-package.obfuscated-opentype
+application/vnd.ms-pki.seccat cat
+application/vnd.ms-pki.stl stl
+# application/vnd.ms-playready.initiator+xml
+application/vnd.ms-powerpoint ppt pps pot
+application/vnd.ms-powerpoint.addin.macroenabled.12 ppam
+application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm
+application/vnd.ms-powerpoint.slide.macroenabled.12 sldm
+application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm
+application/vnd.ms-powerpoint.template.macroenabled.12 potm
+# application/vnd.ms-printing.printticket+xml
+application/vnd.ms-project mpp mpt
+# application/vnd.ms-tnef
+# application/vnd.ms-wmdrm.lic-chlg-req
+# application/vnd.ms-wmdrm.lic-resp
+# application/vnd.ms-wmdrm.meter-chlg-req
+# application/vnd.ms-wmdrm.meter-resp
+application/vnd.ms-word.document.macroenabled.12 docm
+application/vnd.ms-word.template.macroenabled.12 dotm
+application/vnd.ms-works wps wks wcm wdb
+application/vnd.ms-wpl wpl
+application/vnd.ms-xpsdocument xps
+application/vnd.mseq mseq
+# application/vnd.msign
+# application/vnd.multiad.creator
+# application/vnd.multiad.creator.cif
+# application/vnd.music-niff
+application/vnd.musician mus
+application/vnd.muvee.style msty
+application/vnd.mynfc taglet
+# application/vnd.ncd.control
+# application/vnd.ncd.reference
+# application/vnd.nervana
+# application/vnd.netfpx
+application/vnd.neurolanguage.nlu nlu
+application/vnd.nitf ntf nitf
+application/vnd.noblenet-directory nnd
+application/vnd.noblenet-sealer nns
+application/vnd.noblenet-web nnw
+# application/vnd.nokia.catalogs
+# application/vnd.nokia.conml+wbxml
+# application/vnd.nokia.conml+xml
+# application/vnd.nokia.isds-radio-presets
+# application/vnd.nokia.iptv.config+xml
+# application/vnd.nokia.landmark+wbxml
+# application/vnd.nokia.landmark+xml
+# application/vnd.nokia.landmarkcollection+xml
+# application/vnd.nokia.n-gage.ac+xml
+application/vnd.nokia.n-gage.data ngdat
+application/vnd.nokia.n-gage.symbian.install n-gage
+# application/vnd.nokia.ncd
+# application/vnd.nokia.pcd+wbxml
+# application/vnd.nokia.pcd+xml
+application/vnd.nokia.radio-preset rpst
+application/vnd.nokia.radio-presets rpss
+application/vnd.novadigm.edm edm
+application/vnd.novadigm.edx edx
+application/vnd.novadigm.ext ext
+# application/vnd.ntt-local.file-transfer
+# application/vnd.ntt-local.sip-ta_remote
+# application/vnd.ntt-local.sip-ta_tcp_stream
+application/vnd.oasis.opendocument.chart odc
+application/vnd.oasis.opendocument.chart-template otc
+application/vnd.oasis.opendocument.database odb
+application/vnd.oasis.opendocument.formula odf
+application/vnd.oasis.opendocument.formula-template odft
+application/vnd.oasis.opendocument.graphics odg
+application/vnd.oasis.opendocument.graphics-template otg
+application/vnd.oasis.opendocument.image odi
+application/vnd.oasis.opendocument.image-template oti
+application/vnd.oasis.opendocument.presentation odp
+application/vnd.oasis.opendocument.presentation-template otp
+application/vnd.oasis.opendocument.spreadsheet ods
+application/vnd.oasis.opendocument.spreadsheet-template ots
+application/vnd.oasis.opendocument.text odt
+application/vnd.oasis.opendocument.text-master odm
+application/vnd.oasis.opendocument.text-template ott
+application/vnd.oasis.opendocument.text-web oth
+# application/vnd.obn
+# application/vnd.oftn.l10n+json
+# application/vnd.oipf.contentaccessdownload+xml
+# application/vnd.oipf.contentaccessstreaming+xml
+# application/vnd.oipf.cspg-hexbinary
+# application/vnd.oipf.dae.svg+xml
+# application/vnd.oipf.dae.xhtml+xml
+# application/vnd.oipf.mippvcontrolmessage+xml
+# application/vnd.oipf.pae.gem
+# application/vnd.oipf.spdiscovery+xml
+# application/vnd.oipf.spdlist+xml
+# application/vnd.oipf.ueprofile+xml
+# application/vnd.oipf.userprofile+xml
+application/vnd.olpc-sugar xo
+# application/vnd.oma-scws-config
+# application/vnd.oma-scws-http-request
+# application/vnd.oma-scws-http-response
+# application/vnd.oma.bcast.associated-procedure-parameter+xml
+# application/vnd.oma.bcast.drm-trigger+xml
+# application/vnd.oma.bcast.imd+xml
+# application/vnd.oma.bcast.ltkm
+# application/vnd.oma.bcast.notification+xml
+# application/vnd.oma.bcast.provisioningtrigger
+# application/vnd.oma.bcast.sgboot
+# application/vnd.oma.bcast.sgdd+xml
+# application/vnd.oma.bcast.sgdu
+# application/vnd.oma.bcast.simple-symbol-container
+# application/vnd.oma.bcast.smartcard-trigger+xml
+# application/vnd.oma.bcast.sprov+xml
+# application/vnd.oma.bcast.stkm
+# application/vnd.oma.cab-address-book+xml
+# application/vnd.oma.cab-feature-handler+xml
+# application/vnd.oma.cab-pcc+xml
+# application/vnd.oma.cab-user-prefs+xml
+# application/vnd.oma.dcd
+# application/vnd.oma.dcdc
+application/vnd.oma.dd2+xml dd2
+# application/vnd.oma.drm.risd+xml
+# application/vnd.oma.group-usage-list+xml
+# application/vnd.oma.pal+xml
+# application/vnd.oma.poc.detailed-progress-report+xml
+# application/vnd.oma.poc.final-report+xml
+# application/vnd.oma.poc.groups+xml
+# application/vnd.oma.poc.invocation-descriptor+xml
+# application/vnd.oma.poc.optimized-progress-report+xml
+# application/vnd.oma.push
+# application/vnd.oma.scidm.messages+xml
+# application/vnd.oma.xcap-directory+xml
+# application/vnd.omads-email+xml
+# application/vnd.omads-file+xml
+# application/vnd.omads-folder+xml
+# application/vnd.omaloc-supl-init
+application/vnd.openofficeorg.extension oxt
+# application/vnd.openxmlformats-officedocument.custom-properties+xml
+# application/vnd.openxmlformats-officedocument.customxmlproperties+xml
+# application/vnd.openxmlformats-officedocument.drawing+xml
+# application/vnd.openxmlformats-officedocument.drawingml.chart+xml
+# application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml
+# application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml
+# application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml
+# application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml
+# application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml
+# application/vnd.openxmlformats-officedocument.extended-properties+xml
+# application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml
+# application/vnd.openxmlformats-officedocument.presentationml.comments+xml
+# application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml
+# application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml
+# application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml
+application/vnd.openxmlformats-officedocument.presentationml.presentation pptx
+# application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml
+# application/vnd.openxmlformats-officedocument.presentationml.presprops+xml
+application/vnd.openxmlformats-officedocument.presentationml.slide sldx
+# application/vnd.openxmlformats-officedocument.presentationml.slide+xml
+# application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml
+# application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml
+application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx
+# application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml
+# application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml
+# application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml
+# application/vnd.openxmlformats-officedocument.presentationml.tags+xml
+application/vnd.openxmlformats-officedocument.presentationml.template potx
+# application/vnd.openxmlformats-officedocument.presentationml.template.main+xml
+# application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml
+application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx
+# application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml
+application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx
+# application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml
+# application/vnd.openxmlformats-officedocument.theme+xml
+# application/vnd.openxmlformats-officedocument.themeoverride+xml
+# application/vnd.openxmlformats-officedocument.vmldrawing
+# application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml
+application/vnd.openxmlformats-officedocument.wordprocessingml.document docx
+# application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml
+# application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml
+# application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml
+# application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml
+# application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml
+# application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml
+# application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml
+# application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml
+# application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml
+application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx
+# application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml
+# application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml
+# application/vnd.openxmlformats-package.core-properties+xml
+# application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml
+# application/vnd.openxmlformats-package.relationships+xml
+# application/vnd.quobject-quoxdocument
+# application/vnd.osa.netdeploy
+application/vnd.osgeo.mapguide.package mgp
+# application/vnd.osgi.bundle
+application/vnd.osgi.dp dp
+application/vnd.osgi.subsystem esa
+# application/vnd.otps.ct-kip+xml
+application/vnd.palm pdb pqa oprc
+# application/vnd.paos.xml
+application/vnd.pawaafile paw
+application/vnd.pg.format str
+application/vnd.pg.osasli ei6
+# application/vnd.piaccess.application-licence
+application/vnd.picsel efif
+application/vnd.pmi.widget wg
+# application/vnd.poc.group-advertisement+xml
+application/vnd.pocketlearn plf
+application/vnd.powerbuilder6 pbd
+# application/vnd.powerbuilder6-s
+# application/vnd.powerbuilder7
+# application/vnd.powerbuilder7-s
+# application/vnd.powerbuilder75
+# application/vnd.powerbuilder75-s
+# application/vnd.preminet
+application/vnd.previewsystems.box box
+application/vnd.proteus.magazine mgz
+application/vnd.publishare-delta-tree qps
+application/vnd.pvi.ptid1 ptid
+# application/vnd.pwg-multiplexed
+# application/vnd.pwg-xhtml-print+xml
+# application/vnd.qualcomm.brew-app-res
+application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb
+# application/vnd.radisys.moml+xml
+# application/vnd.radisys.msml+xml
+# application/vnd.radisys.msml-audit+xml
+# application/vnd.radisys.msml-audit-conf+xml
+# application/vnd.radisys.msml-audit-conn+xml
+# application/vnd.radisys.msml-audit-dialog+xml
+# application/vnd.radisys.msml-audit-stream+xml
+# application/vnd.radisys.msml-conf+xml
+# application/vnd.radisys.msml-dialog+xml
+# application/vnd.radisys.msml-dialog-base+xml
+# application/vnd.radisys.msml-dialog-fax-detect+xml
+# application/vnd.radisys.msml-dialog-fax-sendrecv+xml
+# application/vnd.radisys.msml-dialog-group+xml
+# application/vnd.radisys.msml-dialog-speech+xml
+# application/vnd.radisys.msml-dialog-transform+xml
+# application/vnd.rainstor.data
+# application/vnd.rapid
+application/vnd.realvnc.bed bed
+application/vnd.recordare.musicxml mxl
+application/vnd.recordare.musicxml+xml musicxml
+# application/vnd.renlearn.rlprint
+application/vnd.rig.cryptonote cryptonote
+application/vnd.rim.cod cod
+application/vnd.rn-realmedia rm
+application/vnd.rn-realmedia-vbr rmvb
+application/vnd.route66.link66+xml link66
+# application/vnd.rs-274x
+# application/vnd.ruckus.download
+# application/vnd.s3sms
+application/vnd.sailingtracker.track st
+# application/vnd.sbm.cid
+# application/vnd.sbm.mid2
+# application/vnd.scribus
+# application/vnd.sealed.3df
+# application/vnd.sealed.csf
+# application/vnd.sealed.doc
+# application/vnd.sealed.eml
+# application/vnd.sealed.mht
+# application/vnd.sealed.net
+# application/vnd.sealed.ppt
+# application/vnd.sealed.tiff
+# application/vnd.sealed.xls
+# application/vnd.sealedmedia.softseal.html
+# application/vnd.sealedmedia.softseal.pdf
+application/vnd.seemail see
+application/vnd.sema sema
+application/vnd.semd semd
+application/vnd.semf semf
+application/vnd.shana.informed.formdata ifm
+application/vnd.shana.informed.formtemplate itp
+application/vnd.shana.informed.interchange iif
+application/vnd.shana.informed.package ipk
+application/vnd.simtech-mindmapper twd twds
+application/vnd.smaf mmf
+# application/vnd.smart.notebook
+application/vnd.smart.teacher teacher
+# application/vnd.software602.filler.form+xml
+# application/vnd.software602.filler.form-xml-zip
+application/vnd.solent.sdkm+xml sdkm sdkd
+application/vnd.spotfire.dxp dxp
+application/vnd.spotfire.sfs sfs
+# application/vnd.sss-cod
+# application/vnd.sss-dtf
+# application/vnd.sss-ntf
+application/vnd.stardivision.calc sdc
+application/vnd.stardivision.draw sda
+application/vnd.stardivision.impress sdd
+application/vnd.stardivision.math smf
+application/vnd.stardivision.writer sdw vor
+application/vnd.stardivision.writer-global sgl
+application/vnd.stepmania.package smzip
+application/vnd.stepmania.stepchart sm
+# application/vnd.street-stream
+application/vnd.sun.xml.calc sxc
+application/vnd.sun.xml.calc.template stc
+application/vnd.sun.xml.draw sxd
+application/vnd.sun.xml.draw.template std
+application/vnd.sun.xml.impress sxi
+application/vnd.sun.xml.impress.template sti
+application/vnd.sun.xml.math sxm
+application/vnd.sun.xml.writer sxw
+application/vnd.sun.xml.writer.global sxg
+application/vnd.sun.xml.writer.template stw
+# application/vnd.sun.wadl+xml
+application/vnd.sus-calendar sus susp
+application/vnd.svd svd
+# application/vnd.swiftview-ics
+application/vnd.symbian.install sis sisx
+application/vnd.syncml+xml xsm
+application/vnd.syncml.dm+wbxml bdm
+application/vnd.syncml.dm+xml xdm
+# application/vnd.syncml.dm.notification
+# application/vnd.syncml.ds.notification
+application/vnd.tao.intent-module-archive tao
+application/vnd.tcpdump.pcap pcap cap dmp
+application/vnd.tmobile-livetv tmo
+application/vnd.trid.tpt tpt
+application/vnd.triscape.mxs mxs
+application/vnd.trueapp tra
+# application/vnd.truedoc
+# application/vnd.ubisoft.webplayer
+application/vnd.ufdl ufd ufdl
+application/vnd.uiq.theme utz
+application/vnd.umajin umj
+application/vnd.unity unityweb
+application/vnd.uoml+xml uoml
+# application/vnd.uplanet.alert
+# application/vnd.uplanet.alert-wbxml
+# application/vnd.uplanet.bearer-choice
+# application/vnd.uplanet.bearer-choice-wbxml
+# application/vnd.uplanet.cacheop
+# application/vnd.uplanet.cacheop-wbxml
+# application/vnd.uplanet.channel
+# application/vnd.uplanet.channel-wbxml
+# application/vnd.uplanet.list
+# application/vnd.uplanet.list-wbxml
+# application/vnd.uplanet.listcmd
+# application/vnd.uplanet.listcmd-wbxml
+# application/vnd.uplanet.signal
+application/vnd.vcx vcx
+# application/vnd.vd-study
+# application/vnd.vectorworks
+# application/vnd.verimatrix.vcas
+# application/vnd.vidsoft.vidconference
+application/vnd.visio vsd vst vss vsw
+application/vnd.visionary vis
+# application/vnd.vividence.scriptfile
+application/vnd.vsf vsf
+# application/vnd.wap.sic
+# application/vnd.wap.slc
+application/vnd.wap.wbxml wbxml
+application/vnd.wap.wmlc wmlc
+application/vnd.wap.wmlscriptc wmlsc
+application/vnd.webturbo wtb
+# application/vnd.wfa.wsc
+# application/vnd.wmc
+# application/vnd.wmf.bootstrap
+# application/vnd.wolfram.mathematica
+# application/vnd.wolfram.mathematica.package
+application/vnd.wolfram.player nbp
+application/vnd.wordperfect wpd
+application/vnd.wqd wqd
+# application/vnd.wrq-hp3000-labelled
+application/vnd.wt.stf stf
+# application/vnd.wv.csp+wbxml
+# application/vnd.wv.csp+xml
+# application/vnd.wv.ssp+xml
+application/vnd.xara xar
+application/vnd.xfdl xfdl
+# application/vnd.xfdl.webform
+# application/vnd.xmi+xml
+# application/vnd.xmpie.cpkg
+# application/vnd.xmpie.dpkg
+# application/vnd.xmpie.plan
+# application/vnd.xmpie.ppkg
+# application/vnd.xmpie.xlim
+application/vnd.yamaha.hv-dic hvd
+application/vnd.yamaha.hv-script hvs
+application/vnd.yamaha.hv-voice hvp
+application/vnd.yamaha.openscoreformat osf
+application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg
+# application/vnd.yamaha.remote-setup
+application/vnd.yamaha.smaf-audio saf
+application/vnd.yamaha.smaf-phrase spf
+# application/vnd.yamaha.through-ngn
+# application/vnd.yamaha.tunnel-udpencap
+application/vnd.yellowriver-custom-menu cmp
+application/vnd.zul zir zirz
+application/vnd.zzazz.deck+xml zaz
+application/voicexml+xml vxml
+# application/vq-rtcpxr
+# application/watcherinfo+xml
+# application/whoispp-query
+# application/whoispp-response
+application/widget wgt
+application/winhlp hlp
+# application/wita
+# application/wordperfect5.1
+application/wsdl+xml wsdl
+application/wspolicy+xml wspolicy
+application/x-7z-compressed 7z
+application/x-abiword abw
+application/x-ace-compressed ace
+# application/x-amf
+application/x-apple-diskimage dmg
+application/x-authorware-bin aab x32 u32 vox
+application/x-authorware-map aam
+application/x-authorware-seg aas
+application/x-bcpio bcpio
+application/x-bittorrent torrent
+application/x-blorb blb blorb
+application/x-bzip bz
+application/x-bzip2 bz2 boz
+application/x-cbr cbr cba cbt cbz cb7
+application/x-cdlink vcd
+application/x-cfs-compressed cfs
+application/x-chat chat
+application/x-chess-pgn pgn
+application/x-conference nsc
+# application/x-compress
+application/x-cpio cpio
+application/x-csh csh
+application/x-debian-package deb udeb
+application/x-dgc-compressed dgc
+application/x-director dir dcr dxr cst cct cxt w3d fgd swa
+application/x-doom wad
+application/x-dtbncx+xml ncx
+application/x-dtbook+xml dtb
+application/x-dtbresource+xml res
+application/x-dvi dvi
+application/x-envoy evy
+application/x-eva eva
+application/x-font-bdf bdf
+# application/x-font-dos
+# application/x-font-framemaker
+application/x-font-ghostscript gsf
+# application/x-font-libgrx
+application/x-font-linux-psf psf
+application/x-font-otf otf
+application/x-font-pcf pcf
+application/x-font-snf snf
+# application/x-font-speedo
+# application/x-font-sunos-news
+application/x-font-ttf ttf ttc
+application/x-font-type1 pfa pfb pfm afm
+application/x-font-woff woff
+# application/x-font-vfont
+application/x-freearc arc
+application/x-futuresplash spl
+application/x-gca-compressed gca
+application/x-glulx ulx
+application/x-gnumeric gnumeric
+application/x-gramps-xml gramps
+application/x-gtar gtar
+# application/x-gzip
+application/x-hdf hdf
+application/x-install-instructions install
+application/x-iso9660-image iso
+application/x-java-jnlp-file jnlp
+application/x-latex latex
+application/x-lzh-compressed lzh lha
+application/x-mie mie
+application/x-mobipocket-ebook prc mobi
+application/x-ms-application application
+application/x-ms-shortcut lnk
+application/x-ms-wmd wmd
+application/x-ms-wmz wmz
+application/x-ms-xbap xbap
+application/x-msaccess mdb
+application/x-msbinder obd
+application/x-mscardfile crd
+application/x-msclip clp
+application/x-msdownload exe dll com bat msi
+application/x-msmediaview mvb m13 m14
+application/x-msmetafile wmf wmz emf emz
+application/x-msmoney mny
+application/x-mspublisher pub
+application/x-msschedule scd
+application/x-msterminal trm
+application/x-mswrite wri
+application/x-netcdf nc cdf
+application/x-nzb nzb
+application/x-pkcs12 p12 pfx
+application/x-pkcs7-certificates p7b spc
+application/x-pkcs7-certreqresp p7r
+application/x-rar-compressed rar
+application/x-research-info-systems ris
+application/x-sh sh
+application/x-shar shar
+application/x-shockwave-flash swf
+application/x-silverlight-app xap
+application/x-sql sql
+application/x-stuffit sit
+application/x-stuffitx sitx
+application/x-subrip srt
+application/x-sv4cpio sv4cpio
+application/x-sv4crc sv4crc
+application/x-t3vm-image t3
+application/x-tads gam
+application/x-tar tar
+application/x-tcl tcl
+application/x-tex tex
+application/x-tex-tfm tfm
+application/x-texinfo texinfo texi
+application/x-tgif obj
+application/x-ustar ustar
+application/x-wais-source src
+application/x-x509-ca-cert der crt
+application/x-xfig fig
+application/x-xliff+xml xlf
+application/x-xpinstall xpi
+application/x-xz xz
+application/x-zmachine z1 z2 z3 z4 z5 z6 z7 z8
+# application/x400-bp
+application/xaml+xml xaml
+# application/xcap-att+xml
+# application/xcap-caps+xml
+application/xcap-diff+xml xdf
+# application/xcap-el+xml
+# application/xcap-error+xml
+# application/xcap-ns+xml
+# application/xcon-conference-info-diff+xml
+# application/xcon-conference-info+xml
+application/xenc+xml xenc
+application/xhtml+xml xhtml xht
+# application/xhtml-voice+xml
+application/xml xml xsl
+application/xml-dtd dtd
+# application/xml-external-parsed-entity
+# application/xmpp+xml
+application/xop+xml xop
+application/xproc+xml xpl
+application/xslt+xml xslt
+application/xspf+xml xspf
+application/xv+xml mxml xhvml xvml xvm
+application/yang yang
+application/yin+xml yin
+application/zip zip
+# audio/1d-interleaved-parityfec
+# audio/32kadpcm
+# audio/3gpp
+# audio/3gpp2
+# audio/ac3
+audio/adpcm adp
+# audio/amr
+# audio/amr-wb
+# audio/amr-wb+
+# audio/asc
+# audio/atrac-advanced-lossless
+# audio/atrac-x
+# audio/atrac3
+audio/basic au snd
+# audio/bv16
+# audio/bv32
+# audio/clearmode
+# audio/cn
+# audio/dat12
+# audio/dls
+# audio/dsr-es201108
+# audio/dsr-es202050
+# audio/dsr-es202211
+# audio/dsr-es202212
+# audio/dv
+# audio/dvi4
+# audio/eac3
+# audio/evrc
+# audio/evrc-qcp
+# audio/evrc0
+# audio/evrc1
+# audio/evrcb
+# audio/evrcb0
+# audio/evrcb1
+# audio/evrcwb
+# audio/evrcwb0
+# audio/evrcwb1
+# audio/example
+# audio/fwdred
+# audio/g719
+# audio/g722
+# audio/g7221
+# audio/g723
+# audio/g726-16
+# audio/g726-24
+# audio/g726-32
+# audio/g726-40
+# audio/g728
+# audio/g729
+# audio/g7291
+# audio/g729d
+# audio/g729e
+# audio/gsm
+# audio/gsm-efr
+# audio/gsm-hr-08
+# audio/ilbc
+# audio/ip-mr_v2.5
+# audio/isac
+# audio/l16
+# audio/l20
+# audio/l24
+# audio/l8
+# audio/lpc
+audio/midi mid midi kar rmi
+# audio/mobile-xmf
+audio/mp4 m4a mp4a
+# audio/mp4a-latm
+# audio/mpa
+# audio/mpa-robust
+audio/mpeg mpga mp2 mp2a mp3 m2a m3a
+# audio/mpeg4-generic
+# audio/musepack
+audio/ogg oga ogg spx
+# audio/opus
+# audio/parityfec
+# audio/pcma
+# audio/pcma-wb
+# audio/pcmu-wb
+# audio/pcmu
+# audio/prs.sid
+# audio/qcelp
+# audio/red
+# audio/rtp-enc-aescm128
+# audio/rtp-midi
+# audio/rtx
+audio/s3m s3m
+audio/silk sil
+# audio/smv
+# audio/smv0
+# audio/smv-qcp
+# audio/sp-midi
+# audio/speex
+# audio/t140c
+# audio/t38
+# audio/telephone-event
+# audio/tone
+# audio/uemclip
+# audio/ulpfec
+# audio/vdvi
+# audio/vmr-wb
+# audio/vnd.3gpp.iufp
+# audio/vnd.4sb
+# audio/vnd.audiokoz
+# audio/vnd.celp
+# audio/vnd.cisco.nse
+# audio/vnd.cmles.radio-events
+# audio/vnd.cns.anp1
+# audio/vnd.cns.inf1
+audio/vnd.dece.audio uva uvva
+audio/vnd.digital-winds eol
+# audio/vnd.dlna.adts
+# audio/vnd.dolby.heaac.1
+# audio/vnd.dolby.heaac.2
+# audio/vnd.dolby.mlp
+# audio/vnd.dolby.mps
+# audio/vnd.dolby.pl2
+# audio/vnd.dolby.pl2x
+# audio/vnd.dolby.pl2z
+# audio/vnd.dolby.pulse.1
+audio/vnd.dra dra
+audio/vnd.dts dts
+audio/vnd.dts.hd dtshd
+# audio/vnd.dvb.file
+# audio/vnd.everad.plj
+# audio/vnd.hns.audio
+audio/vnd.lucent.voice lvp
+audio/vnd.ms-playready.media.pya pya
+# audio/vnd.nokia.mobile-xmf
+# audio/vnd.nortel.vbk
+audio/vnd.nuera.ecelp4800 ecelp4800
+audio/vnd.nuera.ecelp7470 ecelp7470
+audio/vnd.nuera.ecelp9600 ecelp9600
+# audio/vnd.octel.sbc
+# audio/vnd.qcelp
+# audio/vnd.rhetorex.32kadpcm
+audio/vnd.rip rip
+# audio/vnd.sealedmedia.softseal.mpeg
+# audio/vnd.vmx.cvsd
+# audio/vorbis
+# audio/vorbis-config
+audio/webm weba
+audio/x-aac aac
+audio/x-aiff aif aiff aifc
+audio/x-caf caf
+audio/x-flac flac
+audio/x-matroska mka
+audio/x-mpegurl m3u
+audio/x-ms-wax wax
+audio/x-ms-wma wma
+audio/x-pn-realaudio ram ra
+audio/x-pn-realaudio-plugin rmp
+# audio/x-tta
+audio/x-wav wav
+audio/xm xm
+chemical/x-cdx cdx
+chemical/x-cif cif
+chemical/x-cmdf cmdf
+chemical/x-cml cml
+chemical/x-csml csml
+# chemical/x-pdb
+chemical/x-xyz xyz
+image/bmp bmp
+image/cgm cgm
+# image/example
+# image/fits
+image/g3fax g3
+image/gif gif
+image/ief ief
+# image/jp2
+image/jpeg jpeg jpg jpe
+# image/jpm
+# image/jpx
+image/ktx ktx
+# image/naplps
+image/png png
+image/prs.btif btif
+# image/prs.pti
+image/sgi sgi
+image/svg+xml svg svgz
+# image/t38
+image/tiff tiff tif
+# image/tiff-fx
+image/vnd.adobe.photoshop psd
+# image/vnd.cns.inf2
+image/vnd.dece.graphic uvi uvvi uvg uvvg
+image/vnd.dvb.subtitle sub
+image/vnd.djvu djvu djv
+image/vnd.dwg dwg
+image/vnd.dxf dxf
+image/vnd.fastbidsheet fbs
+image/vnd.fpx fpx
+image/vnd.fst fst
+image/vnd.fujixerox.edmics-mmr mmr
+image/vnd.fujixerox.edmics-rlc rlc
+# image/vnd.globalgraphics.pgb
+# image/vnd.microsoft.icon
+# image/vnd.mix
+image/vnd.ms-modi mdi
+image/vnd.ms-photo wdp
+image/vnd.net-fpx npx
+# image/vnd.radiance
+# image/vnd.sealed.png
+# image/vnd.sealedmedia.softseal.gif
+# image/vnd.sealedmedia.softseal.jpg
+# image/vnd.svf
+image/vnd.wap.wbmp wbmp
+image/vnd.xiff xif
+image/webp webp
+image/x-3ds 3ds
+image/x-cmu-raster ras
+image/x-cmx cmx
+image/x-freehand fh fhc fh4 fh5 fh7
+image/x-icon ico
+image/x-mrsid-image sid
+image/x-pcx pcx
+image/x-pict pic pct
+image/x-portable-anymap pnm
+image/x-portable-bitmap pbm
+image/x-portable-graymap pgm
+image/x-portable-pixmap ppm
+image/x-rgb rgb
+image/x-tga tga
+image/x-xbitmap xbm
+image/x-xpixmap xpm
+image/x-xwindowdump xwd
+# message/cpim
+# message/delivery-status
+# message/disposition-notification
+# message/example
+# message/external-body
+# message/feedback-report
+# message/global
+# message/global-delivery-status
+# message/global-disposition-notification
+# message/global-headers
+# message/http
+# message/imdn+xml
+# message/news
+# message/partial
+message/rfc822 eml mime
+# message/s-http
+# message/sip
+# message/sipfrag
+# message/tracking-status
+# message/vnd.si.simp
+# model/example
+model/iges igs iges
+model/mesh msh mesh silo
+model/vnd.collada+xml dae
+model/vnd.dwf dwf
+# model/vnd.flatland.3dml
+model/vnd.gdl gdl
+# model/vnd.gs-gdl
+# model/vnd.gs.gdl
+model/vnd.gtw gtw
+# model/vnd.moml+xml
+model/vnd.mts mts
+# model/vnd.parasolid.transmit.binary
+# model/vnd.parasolid.transmit.text
+model/vnd.vtu vtu
+model/vrml wrl vrml
+model/x3d+binary x3db x3dbz
+model/x3d+vrml x3dv x3dvz
+model/x3d+xml x3d x3dz
+# multipart/alternative
+# multipart/appledouble
+# multipart/byteranges
+# multipart/digest
+# multipart/encrypted
+# multipart/example
+# multipart/form-data
+# multipart/header-set
+# multipart/mixed
+# multipart/parallel
+# multipart/related
+# multipart/report
+# multipart/signed
+# multipart/voice-message
+# text/1d-interleaved-parityfec
+text/cache-manifest appcache
+text/calendar ics ifb
+text/css css
+text/csv csv
+# text/directory
+# text/dns
+# text/ecmascript
+# text/enriched
+# text/example
+# text/fwdred
+text/html html htm
+# text/javascript
+text/n3 n3
+# text/parityfec
+text/plain txt text conf def list log in
+# text/prs.fallenstein.rst
+text/prs.lines.tag dsc
+# text/vnd.radisys.msml-basic-layout
+# text/red
+# text/rfc822-headers
+text/richtext rtx
+# text/rtf
+# text/rtp-enc-aescm128
+# text/rtx
+text/sgml sgml sgm
+# text/t140
+text/tab-separated-values tsv
+text/troff t tr roff man me ms
+text/turtle ttl
+# text/ulpfec
+text/uri-list uri uris urls
+text/vcard vcard
+# text/vnd.abc
+text/vnd.curl curl
+text/vnd.curl.dcurl dcurl
+text/vnd.curl.scurl scurl
+text/vnd.curl.mcurl mcurl
+# text/vnd.dmclientscript
+text/vnd.dvb.subtitle sub
+# text/vnd.esmertec.theme-descriptor
+text/vnd.fly fly
+text/vnd.fmi.flexstor flx
+text/vnd.graphviz gv
+text/vnd.in3d.3dml 3dml
+text/vnd.in3d.spot spot
+# text/vnd.iptc.newsml
+# text/vnd.iptc.nitf
+# text/vnd.latex-z
+# text/vnd.motorola.reflex
+# text/vnd.ms-mediapackage
+# text/vnd.net2phone.commcenter.command
+# text/vnd.si.uricatalogue
+text/vnd.sun.j2me.app-descriptor jad
+# text/vnd.trolltech.linguist
+# text/vnd.wap.si
+# text/vnd.wap.sl
+text/vnd.wap.wml wml
+text/vnd.wap.wmlscript wmls
+text/x-asm s asm
+text/x-c c cc cxx cpp h hh dic
+text/x-fortran f for f77 f90
+text/x-java-source java
+text/x-opml opml
+text/x-pascal p pas
+text/x-nfo nfo
+text/x-setext etx
+text/x-sfv sfv
+text/x-uuencode uu
+text/x-vcalendar vcs
+text/x-vcard vcf
+# text/xml
+# text/xml-external-parsed-entity
+# video/1d-interleaved-parityfec
+video/3gpp 3gp
+# video/3gpp-tt
+video/3gpp2 3g2
+# video/bmpeg
+# video/bt656
+# video/celb
+# video/dv
+# video/example
+video/h261 h261
+video/h263 h263
+# video/h263-1998
+# video/h263-2000
+video/h264 h264
+# video/h264-rcdo
+# video/h264-svc
+video/jpeg jpgv
+# video/jpeg2000
+video/jpm jpm jpgm
+video/mj2 mj2 mjp2
+# video/mp1s
+# video/mp2p
+# video/mp2t
+video/mp4 mp4 mp4v mpg4
+# video/mp4v-es
+video/mpeg mpeg mpg mpe m1v m2v
+# video/mpeg4-generic
+# video/mpv
+# video/nv
+video/ogg ogv
+# video/parityfec
+# video/pointer
+video/quicktime qt mov
+# video/raw
+# video/rtp-enc-aescm128
+# video/rtx
+# video/smpte292m
+# video/ulpfec
+# video/vc1
+# video/vnd.cctv
+video/vnd.dece.hd uvh uvvh
+video/vnd.dece.mobile uvm uvvm
+# video/vnd.dece.mp4
+video/vnd.dece.pd uvp uvvp
+video/vnd.dece.sd uvs uvvs
+video/vnd.dece.video uvv uvvv
+# video/vnd.directv.mpeg
+# video/vnd.directv.mpeg-tts
+# video/vnd.dlna.mpeg-tts
+video/vnd.dvb.file dvb
+video/vnd.fvt fvt
+# video/vnd.hns.video
+# video/vnd.iptvforum.1dparityfec-1010
+# video/vnd.iptvforum.1dparityfec-2005
+# video/vnd.iptvforum.2dparityfec-1010
+# video/vnd.iptvforum.2dparityfec-2005
+# video/vnd.iptvforum.ttsavc
+# video/vnd.iptvforum.ttsmpeg2
+# video/vnd.motorola.video
+# video/vnd.motorola.videop
+video/vnd.mpegurl mxu m4u
+video/vnd.ms-playready.media.pyv pyv
+# video/vnd.nokia.interleaved-multimedia
+# video/vnd.nokia.videovoip
+# video/vnd.objectvideo
+# video/vnd.sealed.mpeg1
+# video/vnd.sealed.mpeg4
+# video/vnd.sealed.swf
+# video/vnd.sealedmedia.softseal.mov
+video/vnd.uvvu.mp4 uvu uvvu
+video/vnd.vivo viv
+video/webm webm
+video/x-f4v f4v
+video/x-fli fli
+video/x-flv flv
+video/x-m4v m4v
+video/x-matroska mkv mk3d mks
+video/x-mng mng
+video/x-ms-asf asf asx
+video/x-ms-vob vob
+video/x-ms-wm wm
+video/x-ms-wmv wmv
+video/x-ms-wmx wmx
+video/x-ms-wvx wvx
+video/x-msvideo avi
+video/x-sgi-movie movie
+video/x-smv smv
+x-conference/x-cooltalk ice
diff --git a/core-java/src/test/resources/product.png b/core-java/src/test/resources/product.png
new file mode 100644
index 0000000000..4edd01c0a1
Binary files /dev/null and b/core-java/src/test/resources/product.png differ
diff --git a/core-kotlin/pom.xml b/core-kotlin/pom.xml
index fa16dad496..afa7d8a963 100644
--- a/core-kotlin/pom.xml
+++ b/core-kotlin/pom.xml
@@ -60,7 +60,6 @@
org.jetbrains.kotlin
kotlin-reflect
${kotlin-reflect.version}
- test
org.jetbrains.kotlinx
@@ -224,10 +223,11 @@
- 1.2.41
- 1.2.41
- 1.2.41
- 1.2.41
+ UTF-8
+ 1.2.51
+ 1.2.51
+ 1.2.51
+ 1.2.51
0.22.5
0.9.2
1.5.0
diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/LoggerAsExtensionOnAny.kt b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/LoggerAsExtensionOnAny.kt
new file mode 100644
index 0000000000..32d968fff5
--- /dev/null
+++ b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/LoggerAsExtensionOnAny.kt
@@ -0,0 +1,30 @@
+package com.baeldung.kotlin.logging
+
+import org.slf4j.Logger
+
+open class LoggerAsExtensionOnAny {
+ val logger = logger()
+
+ fun log(s: String) {
+ logger().info(s)
+ logger.info(s)
+ }
+}
+
+class ExtensionSubclass : LoggerAsExtensionOnAny()
+
+fun T.logger(): Logger = getLogger(getClassForLogging(javaClass))
+
+fun main(args: Array) {
+ LoggerAsExtensionOnAny().log("test")
+ ExtensionSubclass().log("sub")
+ "foo".logger().info("foo")
+ 1.logger().info("uh-oh!")
+ SomeOtherClass().logger()
+}
+
+class SomeOtherClass {
+ fun logger(): String {
+ return "foo"
+ }
+}
\ No newline at end of file
diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/LoggerAsExtensionOnMarkerInterface.kt b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/LoggerAsExtensionOnMarkerInterface.kt
new file mode 100644
index 0000000000..b33d4c9f93
--- /dev/null
+++ b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/LoggerAsExtensionOnMarkerInterface.kt
@@ -0,0 +1,30 @@
+package com.baeldung.kotlin.logging
+
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+
+interface Logging
+
+inline fun T.logger(): Logger =
+ //Wrong logger name!
+ //LoggerFactory.getLogger(javaClass.name + " w/interface")
+ LoggerFactory.getLogger(getClassForLogging(T::class.java).name + " w/interface")
+
+open class LoggerAsExtensionOnMarkerInterface : Logging {
+ companion object : Logging {
+ val logger = logger()
+ }
+
+ fun log(s: String) {
+ logger().info(s)
+ logger.info(s)
+ }
+}
+
+class MarkerExtensionSubclass : LoggerAsExtensionOnMarkerInterface()
+
+fun main(args: Array) {
+ LoggerAsExtensionOnMarkerInterface().log("test")
+ MarkerExtensionSubclass().log("sub")
+ "foo".logger().info("foo")
+}
\ No newline at end of file
diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/LoggerAsProperty.kt b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/LoggerAsProperty.kt
new file mode 100644
index 0000000000..979b3b3a10
--- /dev/null
+++ b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/LoggerAsProperty.kt
@@ -0,0 +1,17 @@
+package com.baeldung.kotlin.logging
+
+open class LoggerAsProperty {
+ private val logger = getLogger(javaClass)
+
+ fun log(s: String) {
+ logger.info(s)
+ }
+
+}
+
+class PropertySubclass : LoggerAsProperty()
+
+fun main(args: Array) {
+ LoggerAsProperty().log("test")
+ PropertySubclass().log("sub")
+}
\ No newline at end of file
diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/LoggerAsPropertyDelegate.kt b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/LoggerAsPropertyDelegate.kt
new file mode 100644
index 0000000000..23f04722be
--- /dev/null
+++ b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/LoggerAsPropertyDelegate.kt
@@ -0,0 +1,47 @@
+package com.baeldung.kotlin.logging
+
+import org.slf4j.Logger
+import kotlin.properties.ReadOnlyProperty
+import kotlin.reflect.KProperty
+
+open class LoggerAsPropertyDelegate {
+ private val lazyLogger by lazyLogger()
+ protected val logger by LoggerDelegate()
+ private val logger2 = logger
+
+ companion object {
+ private val lazyLoggerComp by lazyLogger()
+ private val loggerComp by LoggerDelegate()
+ }
+
+ open fun log(s: String) {
+ logger.info(s)
+ logger2.info(s)
+ lazyLogger.info(s)
+ loggerComp.info(s)
+ lazyLoggerComp.info(s)
+ }
+
+}
+
+class DelegateSubclass : LoggerAsPropertyDelegate() {
+ override fun log(s: String) {
+ logger.info("-- in sub")
+ super.log(s)
+ }
+}
+
+fun lazyLogger(forClass: Class<*>): Lazy =
+ lazy { getLogger(getClassForLogging(forClass)) }
+
+fun T.lazyLogger(): Lazy = lazyLogger(javaClass)
+
+fun main(args: Array) {
+ LoggerAsPropertyDelegate().log("test")
+ DelegateSubclass().log("sub")
+}
+
+class LoggerDelegate : ReadOnlyProperty {
+ override fun getValue(thisRef: R, property: KProperty<*>) =
+ getLogger(getClassForLogging(thisRef.javaClass))
+}
diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/LoggerInCompanionObject.kt b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/LoggerInCompanionObject.kt
new file mode 100644
index 0000000000..f973606369
--- /dev/null
+++ b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/LoggerInCompanionObject.kt
@@ -0,0 +1,44 @@
+package com.baeldung.kotlin.logging
+
+open class LoggerInCompanionObject {
+ companion object {
+ private val loggerWithExplicitClass = getLogger(LoggerInCompanionObject::class.java)
+ @Suppress("JAVA_CLASS_ON_COMPANION")
+ private val loggerWithWrongClass = getLogger(javaClass)
+ @Suppress("JAVA_CLASS_ON_COMPANION")
+ private val logger = getLogger(javaClass.enclosingClass)
+ }
+
+ fun log(s: String) {
+ loggerWithExplicitClass.info(s)
+ loggerWithWrongClass.info(s)
+ logger.info(s)
+ }
+
+ class Inner {
+ companion object {
+ private val loggerWithExplicitClass = getLogger(Inner::class.java)
+ @Suppress("JAVA_CLASS_ON_COMPANION")
+ @JvmStatic
+ private val loggerWithWrongClass = getLogger(javaClass)
+ @Suppress("JAVA_CLASS_ON_COMPANION")
+ @JvmStatic
+ private val logger = getLogger(javaClass.enclosingClass)
+ }
+
+ fun log(s: String) {
+ loggerWithExplicitClass.info(s)
+ loggerWithWrongClass.info(s)
+ logger.info(s)
+ }
+ }
+
+}
+
+class CompanionSubclass : LoggerInCompanionObject()
+
+fun main(args: Array) {
+ LoggerInCompanionObject().log("test")
+ LoggerInCompanionObject.Inner().log("test")
+ CompanionSubclass().log("sub")
+}
\ No newline at end of file
diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/Util.kt b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/Util.kt
new file mode 100644
index 0000000000..b9c0d9e34c
--- /dev/null
+++ b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/Util.kt
@@ -0,0 +1,13 @@
+package com.baeldung.kotlin.logging
+
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+import kotlin.reflect.full.companionObject
+
+fun getLogger(forClass: Class<*>): Logger = LoggerFactory.getLogger(forClass)
+
+fun getClassForLogging(javaClass: Class): Class<*> {
+ return javaClass.enclosingClass?.takeIf {
+ it.kotlin.companionObject?.java == javaClass
+ } ?: javaClass
+}
\ No newline at end of file
diff --git a/geotools/pom.xml b/geotools/pom.xml
index 273b14b538..3ac8a63564 100644
--- a/geotools/pom.xml
+++ b/geotools/pom.xml
@@ -1,61 +1,62 @@
-
- 4.0.0
- com.baeldung
- geotools
- 0.0.1-SNAPSHOT
- jar
- geotools
- http://maven.apache.org
+
+ 4.0.0
+ geotools
+ 0.0.1-SNAPSHOT
+ jar
+ geotools
+ http://maven.apache.org
-
- com.baeldung
- parent-modules
- 1.0.0-SNAPSHOT
-
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
-
-
- org.geotools
- gt-shapefile
- ${geotools-shapefile.version}
-
-
- org.geotools
- gt-epsg-hsql
- ${geotools.version}
-
-
- org.geotools
- gt-swing
- ${geotools-swing.version}
-
-
+
+
+ org.geotools
+ gt-shapefile
+ ${geotools-shapefile.version}
+
+
+ org.geotools
+ gt-epsg-hsql
+ ${geotools.version}
+
+
+ org.geotools
+ gt-swing
+ ${geotools-swing.version}
+
+
-
-
- maven2-repository.dev.java.net
- Java.net repository
- http://download.java.net/maven/2
-
-
- osgeo
- Open Source Geospatial Foundation Repository
- http://download.osgeo.org/webdav/geotools/
-
-
-
- true
-
- opengeo
- OpenGeo Maven Repository
- http://repo.opengeo.org
-
-
+
+
+ maven2-repository.dev.java.net
+ Java.net repository
+ http://download.java.net/maven/2
+
+
+ osgeo
+ Open Source Geospatial Foundation Repository
+ http://download.osgeo.org/webdav/geotools/
+
+
+
+ true
+
+ opengeo
+ OpenGeo Maven Repository
+ http://repo.opengeo.org
+
+
+
+
+ 15.2
+ 15.2
+ 15.2
+
-
- 15.2
- 15.2
- 15.2
-
diff --git a/google-web-toolkit/pom.xml b/google-web-toolkit/pom.xml
index d96a589e32..e392ce4e8c 100644
--- a/google-web-toolkit/pom.xml
+++ b/google-web-toolkit/pom.xml
@@ -1,116 +1,118 @@
-
+
-
- 4.0.0
- com.baeldung
- google_web_toolkit
- war
- 1.0-SNAPSHOT
- com.baeldung.Google_web_toolkit
+
+ 4.0.0
+ com.baeldung
+ google-web-toolkit
+ war
+ 1.0-SNAPSHOT
-
+
+
+
+
+ com.google.gwt
+ gwt
+ 2.8.2
+ pom
+ import
+
+
+
-
- 1.8
- 1.8
+
+
+ com.google.gwt
+ gwt-servlet
+ runtime
+
+
+ com.google.gwt
+ gwt-user
+ provided
+
+
+ com.google.gwt
+ gwt-dev
+ provided
+
+
+ junit
+ junit
+ 4.11
+ test
+
+
-
- UTF-8
- UTF-8
-
+
+
+ ${project.build.directory}/${project.build.finalName}/WEB-INF/classes
-
-
-
-
- com.google.gwt
- gwt
- 2.8.2
- pom
- import
-
-
-
+
-
-
- com.google.gwt
- gwt-servlet
- runtime
-
-
- com.google.gwt
- gwt-user
- provided
-
-
- com.google.gwt
- gwt-dev
- provided
-
-
- junit
- junit
- 4.11
- test
-
-
+
+
+ net.ltgt.gwt.maven
+ gwt-maven-plugin
+ 1.0-rc-8
+
+
+
+ compile
+ test
+
+
+
+
+ com.baeldung.Google_web_toolkit
+ Google_web_toolkit
+ true
+
+ 1.8
+
+
+
+ -compileReport
+ -XcompilerMetrics
+
+
+ ${project.build.directory}/${project.build.finalName}
+ compile+runtime
+
+
+ Google_web_toolkit.html
+
+
+
-
-
- ${project.build.directory}/${project.build.finalName}/WEB-INF/classes
+
+
+ maven-surefire-plugin
+ 2.17
+
+ true
+
+
-
+
+
+
+
-
-
- net.ltgt.gwt.maven
- gwt-maven-plugin
- 1.0-rc-8
-
-
-
- compile
- test
-
-
-
-
- com.baeldung.Google_web_toolkit
- Google_web_toolkit
- true
-
- 1.8
-
-
-
- -compileReport
- -XcompilerMetrics
-
-
- ${project.build.directory}/${project.build.finalName}
- compile+runtime
-
-
- Google_web_toolkit.html
-
-
-
+
+ 1.8
+ 1.8
-
-
- maven-surefire-plugin
- 2.17
-
- true
-
-
-
-
-
+
+ UTF-8
+ UTF-8
+
+
diff --git a/hibernate5/pom.xml b/hibernate5/pom.xml
index cf7ed90cee..610c893bdc 100644
--- a/hibernate5/pom.xml
+++ b/hibernate5/pom.xml
@@ -5,8 +5,6 @@
com.baeldung
hibernate5
0.0.1-SNAPSHOT
- hibernate5
- http://maven.apache.org
com.baeldung
@@ -59,9 +57,6 @@
- UTF-8
-
- 3.7.0
5.3.2.Final
6.0.6
2.2.3
diff --git a/hibernate5/src/main/resources/logback.xml b/hibernate5/src/main/resources/logback.xml
new file mode 100644
index 0000000000..d87a87bf53
--- /dev/null
+++ b/hibernate5/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %date [%thread] %-5level %logger{36} - %message%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/jhipster/jhipster-monolithic/pom.xml b/jhipster/jhipster-monolithic/pom.xml
index 6ac756c807..8b753f6f93 100644
--- a/jhipster/jhipster-monolithic/pom.xml
+++ b/jhipster/jhipster-monolithic/pom.xml
@@ -6,7 +6,7 @@
jhipster-monolithic
0.0.1-SNAPSHOT
war
- JHipster Monolithic Application
+ JHipster Monolithic Application
parent-boot-1
@@ -347,7 +347,7 @@
-
+
com.spotify
docker-maven-plugin
diff --git a/jhipster/jhipster-monolithic/src/main/resources/logback-spring.xml b/jhipster/jhipster-monolithic/src/main/resources/logback-spring.xml
index 3c62a70c31..2fda7cc968 100644
--- a/jhipster/jhipster-monolithic/src/main/resources/logback-spring.xml
+++ b/jhipster/jhipster-monolithic/src/main/resources/logback-spring.xml
@@ -3,28 +3,9 @@
-
-
-
-
-
-
+
diff --git a/jnosql/jnosql-artemis/pom.xml b/jnosql/jnosql-artemis/pom.xml
new file mode 100644
index 0000000000..6186b3510c
--- /dev/null
+++ b/jnosql/jnosql-artemis/pom.xml
@@ -0,0 +1,88 @@
+
+
+ 4.0.0
+
+
+ com.baeldung.jnosql
+ jnosql
+ 1.0-SNAPSHOT
+
+
+ jnosql-artemis
+ war
+
+
+ 2.4.2
+ false
+
+
+
+ ${artifactId}
+
+
+ net.wasdev.wlp.maven.plugins
+ liberty-maven-plugin
+ ${liberty-maven-plugin.version}
+
+
+ io.openliberty
+ openliberty-webProfile8
+ RELEASE
+ zip
+
+ project
+ true
+ src/main/liberty/config/server.xml
+
+
+
+ install-server
+ prepare-package
+
+ install-server
+ create-server
+ install-feature
+
+
+
+ install-apps
+ package
+
+ install-apps
+
+
+
+
+
+
+
+
+
+
+ javax
+ javaee-web-api
+ 8.0
+ provided
+
+
+
+ org.jnosql.artemis
+ artemis-configuration
+ ${jnosql.version}
+
+
+ org.jnosql.artemis
+ artemis-document
+ ${jnosql.version}
+
+
+ org.jnosql.diana
+ mongodb-driver
+ ${jnosql.version}
+
+
+
+
+
diff --git a/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/AppConfig.java b/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/AppConfig.java
new file mode 100644
index 0000000000..bf445d9d01
--- /dev/null
+++ b/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/AppConfig.java
@@ -0,0 +1,10 @@
+package com.baeldung.jnosql.artemis;
+
+import javax.enterprise.context.Initialized;
+import javax.enterprise.event.Observes;
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+
+@ApplicationPath("")
+public class AppConfig extends Application {
+}
diff --git a/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/EmbeddedMongoDBSetup.java b/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/EmbeddedMongoDBSetup.java
new file mode 100644
index 0000000000..8b3e161f85
--- /dev/null
+++ b/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/EmbeddedMongoDBSetup.java
@@ -0,0 +1,52 @@
+package com.baeldung.jnosql.artemis;
+
+import de.flapdoodle.embed.mongo.MongodExecutable;
+import de.flapdoodle.embed.mongo.MongodProcess;
+import de.flapdoodle.embed.mongo.MongodStarter;
+import de.flapdoodle.embed.mongo.config.MongodConfigBuilder;
+import de.flapdoodle.embed.mongo.config.Net;
+import de.flapdoodle.embed.mongo.distribution.Version;
+import de.flapdoodle.embed.process.runtime.Network;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.context.Destroyed;
+import javax.enterprise.context.Initialized;
+import javax.enterprise.event.Observes;
+import java.io.IOException;
+
+@ApplicationScoped
+public class EmbeddedMongoDBSetup {
+
+ private static final String MONGODB_HOST = "localhost";
+ private static final int MONGODB_PORT = 27019;
+
+ private static final MongodStarter starter = MongodStarter.getDefaultInstance();
+ private static MongodExecutable _mongodExe;
+ private static MongodProcess _mongod;
+
+ public void init(@Observes @Initialized(ApplicationScoped.class) Object init) {
+ try {
+ System.out.println("Starting Embedded MongoDB");
+ initdb();
+ System.out.println("Embedded MongoDB started");
+ } catch (IOException e) {
+ System.out.println("Embedded MongoDB starting error !!");
+ e.printStackTrace();
+ }
+ }
+
+ private void initdb() throws IOException {
+ _mongodExe = starter.prepare(new MongodConfigBuilder()
+ .version(Version.Main.DEVELOPMENT)
+ .net(new Net(MONGODB_HOST, MONGODB_PORT, Network.localhostIsIPv6()))
+ .build());
+ _mongod = _mongodExe.start();
+ }
+
+ public void destroy(@Observes @Destroyed(ApplicationScoped.class) Object init) {
+ System.out.println("Stopping Embedded MongoDB");
+ _mongod.stop();
+ _mongodExe.stop();
+ System.out.println("Embedded MongoDB stopped !");
+ }
+}
diff --git a/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/EntityManagerProducer.java b/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/EntityManagerProducer.java
new file mode 100644
index 0000000000..c51868886b
--- /dev/null
+++ b/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/EntityManagerProducer.java
@@ -0,0 +1,33 @@
+package com.baeldung.jnosql.artemis;
+
+import org.jnosql.artemis.ConfigurationUnit;
+import org.jnosql.diana.api.document.DocumentCollectionManager;
+import org.jnosql.diana.api.document.DocumentCollectionManagerFactory;
+import org.jnosql.diana.mongodb.document.MongoDBDocumentCollectionManager;
+import org.jnosql.diana.mongodb.document.MongoDBDocumentConfiguration;
+
+import javax.annotation.PostConstruct;
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.inject.Disposes;
+import javax.enterprise.inject.Produces;
+import javax.inject.Inject;
+
+@ApplicationScoped
+public class EntityManagerProducer {
+
+ private static final String DATABASE = "todos";
+
+ @Inject
+ @ConfigurationUnit(name = "document")
+ private DocumentCollectionManagerFactory managerFactory;
+
+ @Produces
+ public DocumentCollectionManager getEntityManager() {
+ return managerFactory.get(DATABASE);
+ }
+
+ public void close(@Disposes DocumentCollectionManager entityManager) {
+ entityManager.close();
+ }
+
+}
diff --git a/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/RepositoryTodoManager.java b/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/RepositoryTodoManager.java
new file mode 100644
index 0000000000..2b19858f6d
--- /dev/null
+++ b/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/RepositoryTodoManager.java
@@ -0,0 +1,41 @@
+package com.baeldung.jnosql.artemis;
+
+import com.baeldung.jnosql.artemis.qualifier.Repo;
+import org.jnosql.artemis.Database;
+import org.jnosql.artemis.DatabaseType;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+import java.util.List;
+import java.util.Optional;
+
+@ApplicationScoped
+@Repo
+public class RepositoryTodoManager implements TodoManager {
+
+ @Inject
+ @Database(DatabaseType.DOCUMENT)
+ private TodoRepository repository;
+
+ @Override
+ public Todo add(Todo todo) {
+ return repository.save(todo);
+ }
+
+ @Override
+ public Todo get(String id) {
+ Optional todo = repository.findById(id);
+ return todo.get();
+ }
+
+ @Override
+ public List getAll() {
+ return repository.findAll();
+ }
+
+ @Override
+ public void delete(String id) {
+ repository.deleteById(id);
+ }
+
+}
diff --git a/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/TemplateTodoManager.java b/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/TemplateTodoManager.java
new file mode 100644
index 0000000000..8c9ce745f7
--- /dev/null
+++ b/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/TemplateTodoManager.java
@@ -0,0 +1,43 @@
+package com.baeldung.jnosql.artemis;
+
+import com.baeldung.jnosql.artemis.qualifier.Template;
+import org.jnosql.artemis.document.DocumentTemplate;
+import org.jnosql.diana.api.document.DocumentQuery;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+import java.util.List;
+import java.util.Optional;
+
+import static org.jnosql.diana.api.document.query.DocumentQueryBuilder.select;
+
+@ApplicationScoped
+@Template
+public class TemplateTodoManager implements TodoManager {
+
+ @Inject
+ private DocumentTemplate documentTemplate;
+
+ @Override
+ public Todo add(Todo todo) {
+ return documentTemplate.insert(todo);
+ }
+
+ @Override
+ public Todo get(String id) {
+ Optional todo = documentTemplate.find(Todo.class, id);
+ return todo.get();
+ }
+
+ @Override
+ public List getAll() {
+ DocumentQuery query = select().from("Todo").build();
+ return documentTemplate.select(query);
+ }
+
+ @Override
+ public void delete(String id) {
+ documentTemplate.delete(Todo.class, id);
+ }
+
+}
diff --git a/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/Todo.java b/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/Todo.java
new file mode 100644
index 0000000000..f250ddfa66
--- /dev/null
+++ b/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/Todo.java
@@ -0,0 +1,51 @@
+package com.baeldung.jnosql.artemis;
+
+import org.jnosql.artemis.Column;
+import org.jnosql.artemis.Entity;
+import org.jnosql.artemis.Id;
+
+import java.io.Serializable;
+
+@Entity
+public class Todo implements Serializable {
+
+ @Id("id")
+ public String id;
+ @Column
+ public String name;
+ @Column
+ public String description;
+
+ public Todo() {
+ }
+
+ public Todo(String id, String name, String description) {
+ this.id = id;
+ this.name = name;
+ this.description = description;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+}
diff --git a/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/TodoManager.java b/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/TodoManager.java
new file mode 100644
index 0000000000..cdcfea5b40
--- /dev/null
+++ b/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/TodoManager.java
@@ -0,0 +1,14 @@
+package com.baeldung.jnosql.artemis;
+
+import java.util.List;
+
+public interface TodoManager {
+
+ Todo add(Todo todo);
+
+ Todo get(String id);
+
+ List getAll();
+
+ void delete(String id);
+}
diff --git a/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/TodoRepository.java b/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/TodoRepository.java
new file mode 100644
index 0000000000..52381d1757
--- /dev/null
+++ b/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/TodoRepository.java
@@ -0,0 +1,10 @@
+package com.baeldung.jnosql.artemis;
+
+import org.jnosql.artemis.Repository;
+
+import java.util.List;
+
+public interface TodoRepository extends Repository {
+ List findByName(String name);
+ List findAll();
+}
diff --git a/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/TodoResource.java b/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/TodoResource.java
new file mode 100644
index 0000000000..42149af3cc
--- /dev/null
+++ b/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/TodoResource.java
@@ -0,0 +1,48 @@
+package com.baeldung.jnosql.artemis;
+
+import com.baeldung.jnosql.artemis.qualifier.Repo;
+import com.baeldung.jnosql.artemis.qualifier.Template;
+
+import javax.inject.Inject;
+import javax.ws.rs.*;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriBuilder;
+
+@Path("todos")
+public class TodoResource {
+
+ /*
+ Use eiher @Template or @Repo
+ */
+ @Inject
+ @Template
+ //@Repo
+ private TodoManager todoManager;
+
+ @GET
+ @Path("")
+ @Produces(MediaType.APPLICATION_JSON)
+ public Response all() {
+ return Response.ok(todoManager.getAll()).build();
+ }
+
+ @GET
+ @Path("{id}")
+ @Produces(MediaType.APPLICATION_JSON)
+ public Response get(@PathParam("id") String id) {
+ Todo todo = todoManager.get(id);
+ return Response.ok(todo).build();
+ }
+
+ @POST
+ @Consumes(MediaType.APPLICATION_JSON)
+ public Response add(Todo todo) {
+ Todo savedTodo = todoManager.add(todo);
+ System.out.println(savedTodo.id);
+ return Response.created(
+ UriBuilder.fromResource(this.getClass()).path(String.valueOf(savedTodo.id)).build())
+ .build();
+ }
+
+}
diff --git a/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/qualifier/Repo.java b/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/qualifier/Repo.java
new file mode 100644
index 0000000000..a5883946db
--- /dev/null
+++ b/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/qualifier/Repo.java
@@ -0,0 +1,13 @@
+package com.baeldung.jnosql.artemis.qualifier;
+
+import javax.inject.Qualifier;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD, ElementType.TYPE})
+@Qualifier
+public @interface Repo {
+}
\ No newline at end of file
diff --git a/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/qualifier/Template.java b/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/qualifier/Template.java
new file mode 100644
index 0000000000..81fbbe5271
--- /dev/null
+++ b/jnosql/jnosql-artemis/src/main/java/com/baeldung/jnosql/artemis/qualifier/Template.java
@@ -0,0 +1,13 @@
+package com.baeldung.jnosql.artemis.qualifier;
+
+import javax.inject.Qualifier;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD, ElementType.TYPE})
+@Qualifier
+public @interface Template {
+}
\ No newline at end of file
diff --git a/jnosql/jnosql-artemis/src/main/liberty/config/server.xml b/jnosql/jnosql-artemis/src/main/liberty/config/server.xml
new file mode 100644
index 0000000000..897aca853a
--- /dev/null
+++ b/jnosql/jnosql-artemis/src/main/liberty/config/server.xml
@@ -0,0 +1,6 @@
+
+
+ webProfile-8.0
+
+
+
diff --git a/jnosql/jnosql-artemis/src/main/resources/META-INF/beans.xml b/jnosql/jnosql-artemis/src/main/resources/META-INF/beans.xml
new file mode 100644
index 0000000000..4f0b3cdeeb
--- /dev/null
+++ b/jnosql/jnosql-artemis/src/main/resources/META-INF/beans.xml
@@ -0,0 +1,6 @@
+
+
\ No newline at end of file
diff --git a/jnosql/jnosql-artemis/src/main/resources/META-INF/jnosql.json b/jnosql/jnosql-artemis/src/main/resources/META-INF/jnosql.json
new file mode 100644
index 0000000000..b8e26cf54a
--- /dev/null
+++ b/jnosql/jnosql-artemis/src/main/resources/META-INF/jnosql.json
@@ -0,0 +1,10 @@
+[
+ {
+ "description": "The mongodb document configuration",
+ "name": "document",
+ "provider": "org.jnosql.diana.mongodb.document.MongoDBDocumentConfiguration",
+ "settings": {
+ "mongodb-server-host-1":"localhost:27019"
+ }
+ }
+]
\ No newline at end of file
diff --git a/jnosql/jnosql-artemis/src/main/webapp/WEB-INF/jnosql.json b/jnosql/jnosql-artemis/src/main/webapp/WEB-INF/jnosql.json
new file mode 100644
index 0000000000..b8e26cf54a
--- /dev/null
+++ b/jnosql/jnosql-artemis/src/main/webapp/WEB-INF/jnosql.json
@@ -0,0 +1,10 @@
+[
+ {
+ "description": "The mongodb document configuration",
+ "name": "document",
+ "provider": "org.jnosql.diana.mongodb.document.MongoDBDocumentConfiguration",
+ "settings": {
+ "mongodb-server-host-1":"localhost:27019"
+ }
+ }
+]
\ No newline at end of file
diff --git a/jnosql/jnosql-diana/pom.xml b/jnosql/jnosql-diana/pom.xml
new file mode 100644
index 0000000000..767defb2a8
--- /dev/null
+++ b/jnosql/jnosql-diana/pom.xml
@@ -0,0 +1,93 @@
+
+
+ 4.0.0
+
+
+ com.baeldung.jnosql
+ jnosql
+ 1.0-SNAPSHOT
+
+
+ jnosql-diana
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ 1.6.0
+
+
+ document
+
+ java
+
+
+ com.baeldung.jnosql.diana.document.DocumentApp
+
+
+
+ column
+
+ java
+
+
+ com.baeldung.jnosql.diana.column.ColumnFamilyApp
+
+
+
+ key
+
+ java
+
+
+ com.baeldung.jnosql.diana.key.KeyValueApp
+
+
+
+
+
+
+
+
+
+
+
+ org.jnosql.diana
+ diana-document
+ 0.0.5
+
+
+ org.jnosql.diana
+ mongodb-driver
+ 0.0.5
+
+
+
+
+ org.jnosql.diana
+ diana-column
+ 0.0.5
+
+
+ org.jnosql.diana
+ cassandra-driver
+ 0.0.5
+
+
+
+
+ org.jnosql.diana
+ diana-key-value
+ 0.0.5
+
+
+ org.jnosql.diana
+ hazelcast-driver
+ 0.0.5
+
+
+
+
\ No newline at end of file
diff --git a/jnosql/jnosql-diana/src/main/java/com/baeldung/jnosql/diana/column/ColumnFamilyApp.java b/jnosql/jnosql-diana/src/main/java/com/baeldung/jnosql/diana/column/ColumnFamilyApp.java
new file mode 100644
index 0000000000..5b65f9ad73
--- /dev/null
+++ b/jnosql/jnosql-diana/src/main/java/com/baeldung/jnosql/diana/column/ColumnFamilyApp.java
@@ -0,0 +1,32 @@
+package com.baeldung.jnosql.diana.column;
+
+import org.cassandraunit.utils.EmbeddedCassandraServerHelper;
+import org.jnosql.diana.api.column.*;
+import org.jnosql.diana.cassandra.column.CassandraConfiguration;
+
+public class ColumnFamilyApp {
+
+ private static final String KEY_SPACE = "myKeySpace";
+ private static final String COLUMN_FAMILY = "books";
+
+ public static void main(String... args) throws Exception {
+
+ EmbeddedCassandraServerHelper.startEmbeddedCassandra();
+
+ ColumnConfiguration configuration = new CassandraConfiguration();
+ try(ColumnFamilyManagerFactory entityManagerFactory = configuration.get()) {
+ ColumnFamilyManager entityManager = entityManagerFactory.get(KEY_SPACE);
+ ColumnEntity columnEntity = ColumnEntity.of(COLUMN_FAMILY);
+ Column key = Columns.of("id", 10L);
+ Column name = Columns.of("name", "JNoSQL in Acion");
+ columnEntity.add(key);
+ columnEntity.add(name);
+ ColumnEntity saved = entityManager.insert(columnEntity);
+ System.out.println(saved);
+ }
+
+ EmbeddedCassandraServerHelper.cleanEmbeddedCassandra();
+ EmbeddedCassandraServerHelper.stopEmbeddedCassandra();
+ }
+
+}
diff --git a/jnosql/jnosql-diana/src/main/java/com/baeldung/jnosql/diana/document/DocumentApp.java b/jnosql/jnosql-diana/src/main/java/com/baeldung/jnosql/diana/document/DocumentApp.java
new file mode 100644
index 0000000000..258c812a31
--- /dev/null
+++ b/jnosql/jnosql-diana/src/main/java/com/baeldung/jnosql/diana/document/DocumentApp.java
@@ -0,0 +1,67 @@
+package com.baeldung.jnosql.diana.document;
+
+import org.jnosql.diana.api.Settings;
+import org.jnosql.diana.api.document.*;
+import org.jnosql.diana.mongodb.document.MongoDBDocumentConfiguration;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.jnosql.diana.api.document.query.DocumentQueryBuilder.delete;
+import static org.jnosql.diana.api.document.query.DocumentQueryBuilder.select;
+
+public class DocumentApp {
+
+ private static final String DB_NAME = "my-db";
+ private static final String DOCUMENT_COLLECTION = "books";
+
+ public static final String KEY_NAME = "_id";
+
+ DocumentConfiguration configuration = new MongoDBDocumentConfiguration();
+
+ public static void main(String... args) throws Exception {
+ MongoDbInit.startMongoDb();
+
+ DocumentApp app = new DocumentApp();
+ app.process();
+
+ MongoDbInit.stopMongoDb();
+ }
+
+ public void process() {
+
+ Map map = new HashMap<>();
+ map.put("mongodb-server-host-1", "localhost:27017");
+
+ try (DocumentCollectionManagerFactory managerFactory = configuration.get(Settings.of(map));
+ DocumentCollectionManager manager = managerFactory.get(DB_NAME);) {
+
+ DocumentEntity documentEntity = DocumentEntity.of(DOCUMENT_COLLECTION);
+ documentEntity.add(Document.of(KEY_NAME, "100"));
+ documentEntity.add(Document.of("name", "JNoSQL in Action"));
+ documentEntity.add(Document.of("pages", 620));
+
+ //CREATE
+ DocumentEntity saved = manager.insert(documentEntity);
+
+ //READ
+ DocumentQuery query = select().from(DOCUMENT_COLLECTION).where(KEY_NAME).eq("100").build();
+ List entities = manager.select(query);
+ System.out.println(entities.get(0));
+
+ //UPDATE
+ saved.add(Document.of("author", "baeldung"));
+ DocumentEntity updated = manager.update(saved);
+ System.out.println(updated);
+
+ //DELETE
+ DocumentDeleteQuery deleteQuery = delete().from(DOCUMENT_COLLECTION).where(KEY_NAME).eq("100").build();
+ manager.delete(deleteQuery);
+
+ List documentEntityList = manager.select(select().from(DOCUMENT_COLLECTION).build());
+ System.out.println(documentEntityList);
+ }
+ }
+
+}
diff --git a/jnosql/jnosql-diana/src/main/java/com/baeldung/jnosql/diana/document/MongoDbInit.java b/jnosql/jnosql-diana/src/main/java/com/baeldung/jnosql/diana/document/MongoDbInit.java
new file mode 100644
index 0000000000..19bb347581
--- /dev/null
+++ b/jnosql/jnosql-diana/src/main/java/com/baeldung/jnosql/diana/document/MongoDbInit.java
@@ -0,0 +1,32 @@
+package com.baeldung.jnosql.diana.document;
+
+import de.flapdoodle.embed.mongo.MongodExecutable;
+import de.flapdoodle.embed.mongo.MongodProcess;
+import de.flapdoodle.embed.mongo.MongodStarter;
+import de.flapdoodle.embed.mongo.config.MongodConfigBuilder;
+import de.flapdoodle.embed.mongo.config.Net;
+import de.flapdoodle.embed.mongo.distribution.Version;
+import de.flapdoodle.embed.process.runtime.Network;
+
+import java.io.IOException;
+
+public abstract class MongoDbInit {
+
+ private static final MongodStarter starter = MongodStarter.getDefaultInstance();
+ private static MongodExecutable _mongodExe;
+ private static MongodProcess _mongod;
+
+ public static void startMongoDb() throws IOException {
+ _mongodExe = starter.prepare(new MongodConfigBuilder()
+ .version(Version.Main.DEVELOPMENT)
+ .net(new Net("localhost", 27017, Network.localhostIsIPv6()))
+ .build());
+ _mongod = _mongodExe.start();
+ }
+
+ public static void stopMongoDb(){
+ _mongod.stop();
+ _mongodExe.stop();
+ }
+
+}
\ No newline at end of file
diff --git a/jnosql/jnosql-diana/src/main/java/com/baeldung/jnosql/diana/key/Book.java b/jnosql/jnosql-diana/src/main/java/com/baeldung/jnosql/diana/key/Book.java
new file mode 100644
index 0000000000..afa20e66b1
--- /dev/null
+++ b/jnosql/jnosql-diana/src/main/java/com/baeldung/jnosql/diana/key/Book.java
@@ -0,0 +1,63 @@
+package com.baeldung.jnosql.diana.key;
+
+import java.io.Serializable;
+
+public class Book implements Serializable {
+
+ private String isbn;
+ private String name;
+ private String author;
+ private int pages;
+
+ public Book() {
+ }
+
+ public Book(String isbn, String name, String author, int pages) {
+ this.isbn = isbn;
+ this.name = name;
+ this.author = author;
+ this.pages = pages;
+ }
+
+ public String getIsbn() {
+ return isbn;
+ }
+
+ public void setIsbn(String isbn) {
+ this.isbn = isbn;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+
+ public int getPages() {
+ return pages;
+ }
+
+ public void setPages(int pages) {
+ this.pages = pages;
+ }
+
+ @Override
+ public String toString() {
+ return "Book{" +
+ "isbn='" + isbn + '\'' +
+ ", name='" + name + '\'' +
+ ", author='" + author + '\'' +
+ ", pages=" + pages +
+ '}';
+ }
+}
diff --git a/jnosql/jnosql-diana/src/main/java/com/baeldung/jnosql/diana/key/KeyValueApp.java b/jnosql/jnosql-diana/src/main/java/com/baeldung/jnosql/diana/key/KeyValueApp.java
new file mode 100644
index 0000000000..ab51bfa4fc
--- /dev/null
+++ b/jnosql/jnosql-diana/src/main/java/com/baeldung/jnosql/diana/key/KeyValueApp.java
@@ -0,0 +1,33 @@
+package com.baeldung.jnosql.diana.key;
+
+import com.hazelcast.core.Hazelcast;
+import org.jnosql.diana.api.Value;
+import org.jnosql.diana.api.key.BucketManager;
+import org.jnosql.diana.api.key.BucketManagerFactory;
+import org.jnosql.diana.api.key.KeyValueConfiguration;
+import org.jnosql.diana.api.key.KeyValueEntity;
+import org.jnosql.diana.hazelcast.key.HazelcastKeyValueConfiguration;
+
+import java.util.Optional;
+
+public class KeyValueApp {
+
+ private static final String BUCKET_NAME = "books";
+
+ public static void main(String... args) throws Exception {
+ KeyValueConfiguration configuration = new HazelcastKeyValueConfiguration();
+ try (BucketManagerFactory managerFactory = configuration.get()) {
+ BucketManager manager = managerFactory.getBucketManager(BUCKET_NAME);
+
+ Book book = new Book("12345", "JNoSQL in Action", "baeldung", 420);
+ KeyValueEntity keyValueEntity = KeyValueEntity.of(book.getIsbn(), book);
+ manager.put(keyValueEntity);
+
+ Optional optionalValue = manager.get("12345");
+ Value value = optionalValue.get();
+ Book savedBook = value.get(Book.class);
+ System.out.println(savedBook);
+ }
+ Hazelcast.shutdownAll();
+ }
+}
diff --git a/jnosql/jnosql-diana/src/main/resources/diana-cassandra.properties b/jnosql/jnosql-diana/src/main/resources/diana-cassandra.properties
new file mode 100644
index 0000000000..5d7d840d65
--- /dev/null
+++ b/jnosql/jnosql-diana/src/main/resources/diana-cassandra.properties
@@ -0,0 +1,5 @@
+cassandra-host-1=localhost
+cassandra-port=9142
+#cassandra-threads-number=2
+cassandra-query-1=CREATE KEYSPACE IF NOT EXISTS myKeySpace WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 3};
+cassandra-query-2=CREATE COLUMNFAMILY IF NOT EXISTS myKeySpace.books (id bigint PRIMARY KEY, name text);
diff --git a/jnosql/jnosql-diana/src/main/resources/diana-hazelcast.properties b/jnosql/jnosql-diana/src/main/resources/diana-hazelcast.properties
new file mode 100644
index 0000000000..010b4a6e47
--- /dev/null
+++ b/jnosql/jnosql-diana/src/main/resources/diana-hazelcast.properties
@@ -0,0 +1 @@
+hazelcast-instanceName=hazelcast
\ No newline at end of file
diff --git a/jnosql/jnosql-diana/src/main/resources/diana-mongodb.properties b/jnosql/jnosql-diana/src/main/resources/diana-mongodb.properties
new file mode 100644
index 0000000000..5b425bd7bf
--- /dev/null
+++ b/jnosql/jnosql-diana/src/main/resources/diana-mongodb.properties
@@ -0,0 +1,2 @@
+#Define Host and Port
+mongodb-server-host-1=localhost:27017
diff --git a/jnosql/pom.xml b/jnosql/pom.xml
new file mode 100644
index 0000000000..c87ad3cf4b
--- /dev/null
+++ b/jnosql/pom.xml
@@ -0,0 +1,23 @@
+
+
+ 4.0.0
+
+ com.baeldung.jnosql
+ jnosql
+ 1.0-SNAPSHOT
+ pom
+
+
+ 1.8
+ 1.8
+ 0.0.5
+
+
+
+ jnosql-diana
+ jnosql-artemis
+
+
+
diff --git a/junit5/README.md b/junit5/README.md
deleted file mode 100644
index fb1685fdd5..0000000000
--- a/junit5/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-## Relevant articles:
-- [The Order of Tests in JUnit](http://www.baeldung.com/junit-5-test-order)
diff --git a/libraries-data/pom.xml b/libraries-data/pom.xml
index 3a18ffd2e8..e5e8fd5551 100644
--- a/libraries-data/pom.xml
+++ b/libraries-data/pom.xml
@@ -141,6 +141,13 @@
hazelcast
${hazelcast.version}
+
+
+ com.googlecode.jmapper-framework
+ jmapper-core
+ ${jmapper.version}
+
+
@@ -275,6 +282,7 @@
5.0.2
5.0.0-release
5.0.4
+ 1.6.0.1
diff --git a/libraries-data/src/main/java/com/baeldung/jmapper/User.java b/libraries-data/src/main/java/com/baeldung/jmapper/User.java
new file mode 100644
index 0000000000..9f99157183
--- /dev/null
+++ b/libraries-data/src/main/java/com/baeldung/jmapper/User.java
@@ -0,0 +1,56 @@
+package com.baeldung.jmapper;
+
+import java.time.LocalDate;
+
+
+public class User {
+
+ private long id;
+ private String email;
+ private LocalDate birthDate;
+
+ // constructors
+
+ public User() {
+ super();
+ }
+
+ public User(long id, String email, LocalDate birthDate) {
+ super();
+ this.id = id;
+ this.email = email;
+ this.birthDate = birthDate;
+ }
+
+ // getters and setters
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public LocalDate getBirthDate() {
+ return birthDate;
+ }
+
+ public void setBirthDate(LocalDate birthDate) {
+ this.birthDate = birthDate;
+ }
+
+ @Override
+ public String toString() {
+ return "User [id=" + id + ", email=" + email + ", birthDate=" + birthDate + "]";
+ }
+
+}
diff --git a/libraries-data/src/main/java/com/baeldung/jmapper/UserDto.java b/libraries-data/src/main/java/com/baeldung/jmapper/UserDto.java
new file mode 100644
index 0000000000..326e8f3cd5
--- /dev/null
+++ b/libraries-data/src/main/java/com/baeldung/jmapper/UserDto.java
@@ -0,0 +1,69 @@
+package com.baeldung.jmapper;
+
+import java.time.LocalDate;
+import java.time.Period;
+
+import com.googlecode.jmapper.annotations.JMap;
+import com.googlecode.jmapper.annotations.JMapConversion;
+
+public class UserDto {
+
+ @JMap
+ private long id;
+
+ @JMap("email")
+ private String username;
+
+ @JMap("birthDate")
+ private int age;
+
+ @JMapConversion(from={"birthDate"}, to={"age"})
+ public int conversion(LocalDate birthDate){
+ return Period.between(birthDate, LocalDate.now()).getYears();
+ }
+
+ // constructors
+
+ public UserDto() {
+ super();
+ }
+
+ public UserDto(long id, String username, int age) {
+ super();
+ this.id = id;
+ this.username = username;
+ this.age = age;
+ }
+
+ // getters and setters
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+ @Override
+ public String toString() {
+ return "UserDto [id=" + id + ", username=" + username + ", age=" + age + "]";
+ }
+
+}
diff --git a/libraries-data/src/main/java/com/baeldung/jmapper/UserDto1.java b/libraries-data/src/main/java/com/baeldung/jmapper/UserDto1.java
new file mode 100644
index 0000000000..99247c56f6
--- /dev/null
+++ b/libraries-data/src/main/java/com/baeldung/jmapper/UserDto1.java
@@ -0,0 +1,47 @@
+package com.baeldung.jmapper;
+
+import com.googlecode.jmapper.annotations.JGlobalMap;
+
+@JGlobalMap
+public class UserDto1 {
+
+ private long id;
+ private String email;
+
+
+ // constructors
+
+ public UserDto1() {
+ super();
+ }
+
+ public UserDto1(long id, String email) {
+ super();
+ this.id = id;
+ this.email = email;
+ }
+
+ // getters and setters
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ @Override
+ public String toString() {
+ return "UserDto [id=" + id + ", email=" + email + "]";
+ }
+
+}
diff --git a/libraries-data/src/main/java/com/baeldung/jmapper/relational/User.java b/libraries-data/src/main/java/com/baeldung/jmapper/relational/User.java
new file mode 100644
index 0000000000..1238a82684
--- /dev/null
+++ b/libraries-data/src/main/java/com/baeldung/jmapper/relational/User.java
@@ -0,0 +1,49 @@
+package com.baeldung.jmapper.relational;
+
+import com.googlecode.jmapper.annotations.JMap;
+
+
+public class User {
+
+ @JMap(classes = {UserDto1.class, UserDto2.class})
+ private long id;
+
+ @JMap(attributes = {"username", "email"}, classes = {UserDto1.class, UserDto2.class})
+ private String email;
+
+ // constructors
+
+ public User() {
+ super();
+ }
+
+ public User(long id, String email) {
+ super();
+ this.id = id;
+ this.email = email;
+ }
+
+ // getters and setters
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ @Override
+ public String toString() {
+ return "User [id=" + id + ", email=" + email + "]";
+ }
+
+}
diff --git a/libraries-data/src/main/java/com/baeldung/jmapper/relational/UserDto1.java b/libraries-data/src/main/java/com/baeldung/jmapper/relational/UserDto1.java
new file mode 100644
index 0000000000..375fd267a0
--- /dev/null
+++ b/libraries-data/src/main/java/com/baeldung/jmapper/relational/UserDto1.java
@@ -0,0 +1,44 @@
+package com.baeldung.jmapper.relational;
+
+
+public class UserDto1 {
+
+ private long id;
+ private String username;
+
+ // constructors
+
+ public UserDto1() {
+ super();
+ }
+
+ public UserDto1(long id, String username) {
+ super();
+ this.id = id;
+ this.username = username;
+ }
+
+ // getters and setters
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ @Override
+ public String toString() {
+ return "UserDto [id=" + id + ", username=" + username + "]";
+ }
+
+}
diff --git a/libraries-data/src/main/java/com/baeldung/jmapper/relational/UserDto2.java b/libraries-data/src/main/java/com/baeldung/jmapper/relational/UserDto2.java
new file mode 100644
index 0000000000..d0858c7d8e
--- /dev/null
+++ b/libraries-data/src/main/java/com/baeldung/jmapper/relational/UserDto2.java
@@ -0,0 +1,44 @@
+package com.baeldung.jmapper.relational;
+
+
+public class UserDto2 {
+
+ private long id;
+ private String email;
+
+ // constructors
+
+ public UserDto2() {
+ super();
+ }
+
+ public UserDto2(long id, String email) {
+ super();
+ this.id = id;
+ this.email = email;
+ }
+
+ // getters and setters
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ @Override
+ public String toString() {
+ return "UserDto2 [id=" + id + ", email=" + email + "]";
+ }
+
+}
diff --git a/libraries-data/src/main/resources/user_jmapper.xml b/libraries-data/src/main/resources/user_jmapper.xml
new file mode 100644
index 0000000000..f007de9f0a
--- /dev/null
+++ b/libraries-data/src/main/resources/user_jmapper.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/libraries-data/src/main/resources/user_jmapper1.xml b/libraries-data/src/main/resources/user_jmapper1.xml
new file mode 100644
index 0000000000..abcfd77e1c
--- /dev/null
+++ b/libraries-data/src/main/resources/user_jmapper1.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/libraries-data/src/main/resources/user_jmapper2.xml b/libraries-data/src/main/resources/user_jmapper2.xml
new file mode 100644
index 0000000000..1e708e14bf
--- /dev/null
+++ b/libraries-data/src/main/resources/user_jmapper2.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/libraries-data/src/test/java/com/baeldung/jmapper/JMapperIntegrationTest.java b/libraries-data/src/test/java/com/baeldung/jmapper/JMapperIntegrationTest.java
new file mode 100644
index 0000000000..96ed090482
--- /dev/null
+++ b/libraries-data/src/test/java/com/baeldung/jmapper/JMapperIntegrationTest.java
@@ -0,0 +1,114 @@
+package com.baeldung.jmapper;
+
+import static com.googlecode.jmapper.api.JMapperAPI.attribute;
+import static com.googlecode.jmapper.api.JMapperAPI.global;
+import static com.googlecode.jmapper.api.JMapperAPI.mappedClass;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.time.LocalDate;
+
+import org.junit.Test;
+
+import com.googlecode.jmapper.JMapper;
+import com.googlecode.jmapper.api.JMapperAPI;
+
+public class JMapperIntegrationTest {
+
+
+ @Test
+ public void givenUser_whenUseAnnotation_thenConverted(){
+ JMapper userMapper = new JMapper<>(UserDto.class, User.class);
+
+ User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20));
+ UserDto result = userMapper.getDestination(user);
+
+ System.out.println(result);
+ assertEquals(user.getId(), result.getId());
+ assertEquals(user.getEmail(), result.getUsername());
+ }
+
+ @Test
+ public void givenUser_whenUseGlobalMapAnnotation_thenConverted(){
+ JMapper userMapper= new JMapper<>(UserDto1.class, User.class);
+
+ User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20));
+ UserDto1 result = userMapper.getDestination(user);
+
+ System.out.println(result);
+ assertEquals(user.getId(), result.getId());
+ assertEquals(user.getEmail(), result.getEmail());
+ }
+
+ @Test
+ public void givenUser_whenUseAnnotationExplicitConversion_thenConverted(){
+ JMapper userMapper = new JMapper<>(UserDto.class, User.class);
+
+ User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20));
+ UserDto result = userMapper.getDestination(user);
+
+ System.out.println(result);
+ assertEquals(user.getId(), result.getId());
+ assertEquals(user.getEmail(), result.getUsername());
+ assertTrue(result.getAge() > 0);
+ }
+
+ //======================= XML
+
+ @Test
+ public void givenUser_whenUseXml_thenConverted(){
+ JMapper userMapper = new JMapper<>(UserDto.class, User.class,"user_jmapper.xml");
+
+ User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20));
+ UserDto result = userMapper.getDestination(user);
+
+ System.out.println(result);
+ assertEquals(user.getId(), result.getId());
+ assertEquals(user.getEmail(), result.getUsername());
+ }
+
+ @Test
+ public void givenUser_whenUseXmlGlobal_thenConverted(){
+ JMapper userMapper = new JMapper<>(UserDto1.class, User.class,"user_jmapper1.xml");
+
+ User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20));
+ UserDto1 result = userMapper.getDestination(user);
+
+ System.out.println(result);
+ assertEquals(user.getId(), result.getId());
+ assertEquals(user.getEmail(), result.getEmail());
+ }
+
+ // ===== API
+
+ @Test
+ public void givenUser_whenUseApi_thenConverted(){
+ JMapperAPI jmapperApi = new JMapperAPI() .add(mappedClass(UserDto.class)
+ .add(attribute("id").value("id"))
+ .add(attribute("username").value("email"))
+ ) ;
+ JMapper userMapper = new JMapper<>(UserDto.class, User.class, jmapperApi);
+
+ User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20));
+ UserDto result = userMapper.getDestination(user);
+
+ System.out.println(result);
+ assertEquals(user.getId(), result.getId());
+ assertEquals(user.getEmail(), result.getUsername());
+ }
+
+ @Test
+ public void givenUser_whenUseApiGlobal_thenConverted(){
+ JMapperAPI jmapperApi = new JMapperAPI() .add(mappedClass(UserDto.class)
+ .add(global())
+ ) ;
+ JMapper userMapper1 = new JMapper<>(UserDto1.class, User.class,jmapperApi);
+
+ User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20));
+ UserDto1 result = userMapper1.getDestination(user);
+
+ System.out.println(result);
+ assertEquals(user.getId(), result.getId());
+ assertEquals(user.getEmail(), result.getEmail());
+ }
+}
diff --git a/libraries-data/src/test/java/com/baeldung/jmapper/JMapperRelationalIntegrationTest.java b/libraries-data/src/test/java/com/baeldung/jmapper/JMapperRelationalIntegrationTest.java
new file mode 100644
index 0000000000..6af2865159
--- /dev/null
+++ b/libraries-data/src/test/java/com/baeldung/jmapper/JMapperRelationalIntegrationTest.java
@@ -0,0 +1,76 @@
+package com.baeldung.jmapper;
+
+import static com.googlecode.jmapper.api.JMapperAPI.attribute;
+import static com.googlecode.jmapper.api.JMapperAPI.mappedClass;
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+import com.baeldung.jmapper.relational.User;
+import com.baeldung.jmapper.relational.UserDto1;
+import com.baeldung.jmapper.relational.UserDto2;
+import com.googlecode.jmapper.RelationalJMapper;
+import com.googlecode.jmapper.api.JMapperAPI;
+
+public class JMapperRelationalIntegrationTest {
+
+
+ @Test
+ public void givenUser_whenUseAnnotation_thenConverted(){
+ RelationalJMapper relationalMapper = new RelationalJMapper<>(User.class);
+
+ User user = new User(1L,"john@test.com");
+ UserDto1 result1 = relationalMapper.oneToMany(UserDto1.class, user);
+ UserDto2 result2= relationalMapper.oneToMany(UserDto2.class, user);
+
+ System.out.println(result1);
+ System.out.println(result2);
+ assertEquals(user.getId(), result1.getId());
+ assertEquals(user.getEmail(), result1.getUsername());
+ assertEquals(user.getId(), result2.getId());
+ assertEquals(user.getEmail(), result2.getEmail());
+ }
+
+ //======================= XML
+
+ @Test
+ public void givenUser_whenUseXml_thenConverted(){
+ RelationalJMapper relationalMapper = new RelationalJMapper<>(User.class,"user_jmapper2.xml");
+
+ User user = new User(1L,"john@test.com");
+ UserDto1 result1 = relationalMapper.oneToMany(UserDto1.class, user);
+ UserDto2 result2 = relationalMapper.oneToMany(UserDto2.class, user);
+
+ System.out.println(result1);
+ System.out.println(result2);
+ assertEquals(user.getId(), result1.getId());
+ assertEquals(user.getEmail(), result1.getUsername());
+ assertEquals(user.getId(), result2.getId());
+ assertEquals(user.getEmail(), result2.getEmail());
+ }
+
+
+ // ===== API
+
+ @Test
+ public void givenUser_whenUseApi_thenConverted(){
+ JMapperAPI jmapperApi = new JMapperAPI()
+ .add(mappedClass(User.class)
+ .add(attribute("id").value("id").targetClasses(UserDto1.class,UserDto2.class))
+ .add(attribute("email").targetAttributes("username","email").targetClasses(UserDto1.class,UserDto2.class)) )
+ ;
+ RelationalJMapper relationalMapper = new RelationalJMapper<>(User.class,jmapperApi);
+
+ User user = new User(1L,"john@test.com");
+ UserDto1 result1 = relationalMapper.oneToMany(UserDto1.class, user);
+ UserDto2 result2 = relationalMapper.oneToMany(UserDto2.class, user);
+
+ System.out.println(result1);
+ System.out.println(result2);
+ assertEquals(user.getId(), result1.getId());
+ assertEquals(user.getEmail(), result1.getUsername());
+ assertEquals(user.getId(), result2.getId());
+ assertEquals(user.getEmail(), result2.getEmail());
+ }
+
+}
diff --git a/libraries/src/test/java/com/baeldung/hoverfly/HoverflyApiIntegrationTest.java b/libraries/src/test/java/com/baeldung/hoverfly/HoverflyApiLiveTest.java
similarity index 99%
rename from libraries/src/test/java/com/baeldung/hoverfly/HoverflyApiIntegrationTest.java
rename to libraries/src/test/java/com/baeldung/hoverfly/HoverflyApiLiveTest.java
index 09d31eac21..8d60b40bb0 100644
--- a/libraries/src/test/java/com/baeldung/hoverfly/HoverflyApiIntegrationTest.java
+++ b/libraries/src/test/java/com/baeldung/hoverfly/HoverflyApiLiveTest.java
@@ -31,7 +31,7 @@ import org.springframework.web.client.RestTemplate;
import io.specto.hoverfly.junit.core.SimulationSource;
import io.specto.hoverfly.junit.rule.HoverflyRule;
-public class HoverflyApiIntegrationTest {
+public class HoverflyApiLiveTest {
private static final SimulationSource source = dsl(service("http://www.baeldung.com").get("/api/courses/1").willReturn(success().body(jsonWithSingleQuotes("{'id':'1','name':'HCI'}")))
diff --git a/libraries/src/test/java/com/baeldung/infinispan/service/HelloWorldServiceIntegrationTest.java b/libraries/src/test/java/com/baeldung/infinispan/service/HelloWorldServiceTemporaryLiveTest.java
similarity index 96%
rename from libraries/src/test/java/com/baeldung/infinispan/service/HelloWorldServiceIntegrationTest.java
rename to libraries/src/test/java/com/baeldung/infinispan/service/HelloWorldServiceTemporaryLiveTest.java
index 75dae2b2fa..46cc77cbba 100644
--- a/libraries/src/test/java/com/baeldung/infinispan/service/HelloWorldServiceIntegrationTest.java
+++ b/libraries/src/test/java/com/baeldung/infinispan/service/HelloWorldServiceTemporaryLiveTest.java
@@ -5,7 +5,7 @@ import org.junit.Test;
import static org.assertj.core.api.Java6Assertions.assertThat;
-public class HelloWorldServiceIntegrationTest extends AbstractIntegrationTest {
+public class HelloWorldServiceTemporaryLiveTest extends AbstractIntegrationTest {
@Test
public void whenGetIsCalledTwoTimes_thenTheSecondShouldHitTheCache() {
diff --git a/maven/pom.xml b/maven/pom.xml
index b3f15ba90d..a409432f8b 100644
--- a/maven/pom.xml
+++ b/maven/pom.xml
@@ -48,8 +48,10 @@
DataTest.java
+ TestFail.java
DataCheck.java
+ true
diff --git a/maven/src/test/java/testfail/TestFail.java b/maven/src/test/java/testfail/TestFail.java
new file mode 100644
index 0000000000..16f1619db4
--- /dev/null
+++ b/maven/src/test/java/testfail/TestFail.java
@@ -0,0 +1,15 @@
+package testfail;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertNotNull;
+
+public class TestFail {
+ @Test
+ public void whenMessageAssigned_thenItIsNotNull() {
+ String message = "hello there";
+ message = null;
+ assertNotNull(message);
+ }
+
+}
diff --git a/micronaut/hello-world/.mvn/jvm.config b/micronaut/.mvn/jvm.config
similarity index 100%
rename from micronaut/hello-world/.mvn/jvm.config
rename to micronaut/.mvn/jvm.config
diff --git a/micronaut/hello-world/.mvn/wrapper/MavenWrapperDownloader.java b/micronaut/.mvn/wrapper/MavenWrapperDownloader.java
similarity index 99%
rename from micronaut/hello-world/.mvn/wrapper/MavenWrapperDownloader.java
rename to micronaut/.mvn/wrapper/MavenWrapperDownloader.java
index d475a89ce1..66a3132a52 100644
--- a/micronaut/hello-world/.mvn/wrapper/MavenWrapperDownloader.java
+++ b/micronaut/.mvn/wrapper/MavenWrapperDownloader.java
@@ -106,5 +106,4 @@ public class MavenWrapperDownloader {
fos.close();
rbc.close();
}
-
}
diff --git a/micronaut/hello-world/.mvn/wrapper/maven-wrapper.jar b/micronaut/.mvn/wrapper/maven-wrapper.jar
similarity index 100%
rename from micronaut/hello-world/.mvn/wrapper/maven-wrapper.jar
rename to micronaut/.mvn/wrapper/maven-wrapper.jar
diff --git a/micronaut/hello-world/.mvn/wrapper/maven-wrapper.properties b/micronaut/.mvn/wrapper/maven-wrapper.properties
similarity index 100%
rename from micronaut/hello-world/.mvn/wrapper/maven-wrapper.properties
rename to micronaut/.mvn/wrapper/maven-wrapper.properties
diff --git a/micronaut/hello-world/Dockerfile b/micronaut/Dockerfile
similarity index 100%
rename from micronaut/hello-world/Dockerfile
rename to micronaut/Dockerfile
diff --git a/micronaut/hello-world/micronaut-cli.yml b/micronaut/micronaut-cli.yml
similarity index 100%
rename from micronaut/hello-world/micronaut-cli.yml
rename to micronaut/micronaut-cli.yml
diff --git a/micronaut/hello-world/mvnw b/micronaut/mvnw
similarity index 100%
rename from micronaut/hello-world/mvnw
rename to micronaut/mvnw
diff --git a/micronaut/hello-world/mvnw.cmd b/micronaut/mvnw.cmd
similarity index 100%
rename from micronaut/hello-world/mvnw.cmd
rename to micronaut/mvnw.cmd
diff --git a/micronaut/hello-world/pom.xml b/micronaut/pom.xml
similarity index 100%
rename from micronaut/hello-world/pom.xml
rename to micronaut/pom.xml
diff --git a/micronaut/hello-world/src/main/java/com/baeldung/micronaut/helloworld/client/ConcreteGreetingClient.java b/micronaut/src/main/java/com/baeldung/micronaut/helloworld/client/ConcreteGreetingClient.java
similarity index 100%
rename from micronaut/hello-world/src/main/java/com/baeldung/micronaut/helloworld/client/ConcreteGreetingClient.java
rename to micronaut/src/main/java/com/baeldung/micronaut/helloworld/client/ConcreteGreetingClient.java
diff --git a/micronaut/hello-world/src/main/java/com/baeldung/micronaut/helloworld/client/GreetingClient.java b/micronaut/src/main/java/com/baeldung/micronaut/helloworld/client/GreetingClient.java
similarity index 100%
rename from micronaut/hello-world/src/main/java/com/baeldung/micronaut/helloworld/client/GreetingClient.java
rename to micronaut/src/main/java/com/baeldung/micronaut/helloworld/client/GreetingClient.java
diff --git a/micronaut/hello-world/src/main/java/com/baeldung/micronaut/helloworld/server/ServerApplication.java b/micronaut/src/main/java/com/baeldung/micronaut/helloworld/server/ServerApplication.java
similarity index 100%
rename from micronaut/hello-world/src/main/java/com/baeldung/micronaut/helloworld/server/ServerApplication.java
rename to micronaut/src/main/java/com/baeldung/micronaut/helloworld/server/ServerApplication.java
diff --git a/micronaut/hello-world/src/main/java/com/baeldung/micronaut/helloworld/server/controller/AsyncGreetController.java b/micronaut/src/main/java/com/baeldung/micronaut/helloworld/server/controller/AsyncGreetController.java
similarity index 100%
rename from micronaut/hello-world/src/main/java/com/baeldung/micronaut/helloworld/server/controller/AsyncGreetController.java
rename to micronaut/src/main/java/com/baeldung/micronaut/helloworld/server/controller/AsyncGreetController.java
diff --git a/micronaut/hello-world/src/main/java/com/baeldung/micronaut/helloworld/server/controller/GreetController.java b/micronaut/src/main/java/com/baeldung/micronaut/helloworld/server/controller/GreetController.java
similarity index 100%
rename from micronaut/hello-world/src/main/java/com/baeldung/micronaut/helloworld/server/controller/GreetController.java
rename to micronaut/src/main/java/com/baeldung/micronaut/helloworld/server/controller/GreetController.java
diff --git a/micronaut/hello-world/src/main/java/com/baeldung/micronaut/helloworld/server/service/EnglishGreetingService.java b/micronaut/src/main/java/com/baeldung/micronaut/helloworld/server/service/EnglishGreetingService.java
similarity index 100%
rename from micronaut/hello-world/src/main/java/com/baeldung/micronaut/helloworld/server/service/EnglishGreetingService.java
rename to micronaut/src/main/java/com/baeldung/micronaut/helloworld/server/service/EnglishGreetingService.java
diff --git a/micronaut/hello-world/src/main/java/com/baeldung/micronaut/helloworld/server/service/GreetingService.java b/micronaut/src/main/java/com/baeldung/micronaut/helloworld/server/service/GreetingService.java
similarity index 100%
rename from micronaut/hello-world/src/main/java/com/baeldung/micronaut/helloworld/server/service/GreetingService.java
rename to micronaut/src/main/java/com/baeldung/micronaut/helloworld/server/service/GreetingService.java
diff --git a/micronaut/hello-world/src/main/java/com/baeldung/micronaut/helloworld/server/service/SpanishGreetingService.java b/micronaut/src/main/java/com/baeldung/micronaut/helloworld/server/service/SpanishGreetingService.java
similarity index 100%
rename from micronaut/hello-world/src/main/java/com/baeldung/micronaut/helloworld/server/service/SpanishGreetingService.java
rename to micronaut/src/main/java/com/baeldung/micronaut/helloworld/server/service/SpanishGreetingService.java
diff --git a/micronaut/hello-world/src/main/resources/application.yml b/micronaut/src/main/resources/application.yml
similarity index 100%
rename from micronaut/hello-world/src/main/resources/application.yml
rename to micronaut/src/main/resources/application.yml
diff --git a/micronaut/hello-world/src/main/resources/logback.xml b/micronaut/src/main/resources/logback.xml
similarity index 100%
rename from micronaut/hello-world/src/main/resources/logback.xml
rename to micronaut/src/main/resources/logback.xml
diff --git a/micronaut/hello-world/src/test/java/com/baeldung/micronaut/helloworld/client/ConcreteGreetingClientTest.java b/micronaut/src/test/java/com/baeldung/micronaut/helloworld/client/ConcreteGreetingClientTest.java
similarity index 100%
rename from micronaut/hello-world/src/test/java/com/baeldung/micronaut/helloworld/client/ConcreteGreetingClientTest.java
rename to micronaut/src/test/java/com/baeldung/micronaut/helloworld/client/ConcreteGreetingClientTest.java
diff --git a/micronaut/hello-world/src/test/java/com/baeldung/micronaut/helloworld/client/GreetingClientTest.java b/micronaut/src/test/java/com/baeldung/micronaut/helloworld/client/GreetingClientTest.java
similarity index 100%
rename from micronaut/hello-world/src/test/java/com/baeldung/micronaut/helloworld/client/GreetingClientTest.java
rename to micronaut/src/test/java/com/baeldung/micronaut/helloworld/client/GreetingClientTest.java
diff --git a/msf4j/pom.xml b/msf4j/pom.xml
index f2cfe10f57..cca8281764 100644
--- a/msf4j/pom.xml
+++ b/msf4j/pom.xml
@@ -1,33 +1,33 @@
-
- 4.0.0
- com.baeldung.msf4j
- msf4j
- 0.0.1-SNAPSHOT
- WSO2 MSF4J Microservice
+
+ 4.0.0
+ com.baeldung.msf4j
+ msf4j
+ 0.0.1-SNAPSHOT
-
- org.wso2.msf4j
- msf4j-service
- 2.6.0
-
+
+ org.wso2.msf4j
+ msf4j-service
+ 2.6.0
+
-
-
- org.wso2.msf4j
- msf4j-spring
- ${msf4j.version}
-
-
- org.wso2.msf4j
- msf4j-mustache-template
- ${msf4j.version}
-
-
+
+
+ org.wso2.msf4j
+ msf4j-spring
+ ${msf4j.version}
+
+
+ org.wso2.msf4j
+ msf4j-mustache-template
+ ${msf4j.version}
+
+
-
- com.baeldung.msf4j.msf4jintro.Application
- 2.6.1
-
+
+ com.baeldung.msf4j.msf4jintro.Application
+ 2.6.1
+
\ No newline at end of file
diff --git a/parent-boot-2/pom.xml b/parent-boot-2/pom.xml
index 2d45120f32..ab6162a5a5 100644
--- a/parent-boot-2/pom.xml
+++ b/parent-boot-2/pom.xml
@@ -5,8 +5,7 @@
parent-boot-2
0.0.1-SNAPSHOT
pom
- Parent Boot 2
- Parent for all spring boot 2 modules
+ Parent for all Spring Boot 2 modules
org.springframework.boot
diff --git a/persistence-modules/java-cassandra/pom.xml b/persistence-modules/java-cassandra/pom.xml
index 372cb2b4c3..36ec6b5ac8 100644
--- a/persistence-modules/java-cassandra/pom.xml
+++ b/persistence-modules/java-cassandra/pom.xml
@@ -2,9 +2,8 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.baeldung
- cassandra-java-client
+ java-cassandra
1.0.0-SNAPSHOT
- cassandra-java-client
com.baeldung
diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/manytomany/model/Employee.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/manytomany/model/Employee.java
index f1ad30b090..8157945e2c 100644
--- a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/manytomany/model/Employee.java
+++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/manytomany/model/Employee.java
@@ -3,13 +3,15 @@ package com.baeldung.hibernate.manytomany.model;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
+
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
import javax.persistence.Id;
-import javax.persistence.JoinTable;
import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@@ -18,7 +20,7 @@ import javax.persistence.Table;
public class Employee implements Serializable {
@Id
@Column(name = "employee_id")
- @GeneratedValue
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long employeeId;
@Column(name = "first_name")
diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernatesearch/HibernateSearchConfig.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernatesearch/HibernateSearchConfig.java
index 6bbd2625fc..d6445c3cb0 100644
--- a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernatesearch/HibernateSearchConfig.java
+++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernatesearch/HibernateSearchConfig.java
@@ -50,6 +50,8 @@ public class HibernateSearchConfig {
final BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("jdbc.driverClassName")));
dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("jdbc.url")));
+ dataSource.setUsername(env.getProperty("jdbc.user"));
+ dataSource.setPassword(env.getProperty("jdbc.pass"));
return dataSource;
}
diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/manytomany/spring/PersistenceConfig.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/manytomany/spring/PersistenceConfig.java
index 5dace1f742..44cbfadb25 100644
--- a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/manytomany/spring/PersistenceConfig.java
+++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/manytomany/spring/PersistenceConfig.java
@@ -19,7 +19,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@EnableTransactionManagement
-@PropertySource({ "classpath:persistence-mysql.properties" })
+@PropertySource({ "classpath:persistence-h2.properties" })
@ComponentScan({ "com.baeldung.hibernate.manytomany" })
public class PersistenceConfig {
@@ -61,7 +61,7 @@ public class PersistenceConfig {
private final Properties hibernateProperties() {
final Properties hibernateProperties = new Properties();
- //hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
+ hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect"));
hibernateProperties.setProperty("hibernate.show_sql", "true");
diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/spring/PersistenceConfig.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/spring/PersistenceConfig.java
index e64f0a4efe..74ac0a269e 100644
--- a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/spring/PersistenceConfig.java
+++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/spring/PersistenceConfig.java
@@ -21,7 +21,7 @@ import java.util.Properties;
@Configuration
@EnableTransactionManagement
-@PropertySource({ "classpath:persistence-mysql.properties" })
+@PropertySource({ "classpath:persistence-h2.properties" })
@ComponentScan({ "com.baeldung.persistence" })
public class PersistenceConfig {
diff --git a/persistence-modules/spring-hibernate-5/src/main/resources/persistence-h2.properties b/persistence-modules/spring-hibernate-5/src/main/resources/persistence-h2.properties
index 0325174b67..5a137e2310 100644
--- a/persistence-modules/spring-hibernate-5/src/main/resources/persistence-h2.properties
+++ b/persistence-modules/spring-hibernate-5/src/main/resources/persistence-h2.properties
@@ -3,7 +3,7 @@ jdbc.driverClassName=org.h2.Driver
jdbc.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
jdbc.eventGeneratedId=sa
jdbc.user=sa
-jdbc.pass=sa
+jdbc.pass=
# hibernate.X
hibernate.dialect=org.hibernate.dialect.H2Dialect
diff --git a/persistence-modules/spring-hibernate-5/src/test/resources/manytomany.cfg.xml b/persistence-modules/spring-hibernate-5/src/test/resources/manytomany.cfg.xml
new file mode 100644
index 0000000000..a7a23ec70d
--- /dev/null
+++ b/persistence-modules/spring-hibernate-5/src/test/resources/manytomany.cfg.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ org.h2.Driver
+
+ jdbc:h2:mem:spring_hibernate_many_to_many
+ sa
+ org.hibernate.dialect.H2Dialect
+ thread
+ true
+ create-drop
+
+
diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfig.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfig.java
index 010eb5b8a1..78c4116c67 100644
--- a/persistence-modules/spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfig.java
+++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfig.java
@@ -24,7 +24,7 @@ import com.google.common.base.Preconditions;
@Configuration
@EnableTransactionManagement
-@PropertySource({ "classpath:persistence-mysql.properties" })
+@PropertySource({ "classpath:persistence-h2.properties" })
@ComponentScan({ "org.baeldung.persistence" })
@EnableJpaRepositories(basePackages = "org.baeldung.persistence.dao")
public class PersistenceJPAConfig {
diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/Possession.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/Possession.java
index 97b5803d73..079888155e 100644
--- a/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/Possession.java
+++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/Possession.java
@@ -11,7 +11,7 @@ import javax.persistence.Table;
public class Possession {
@Id
- @GeneratedValue(strategy = GenerationType.AUTO)
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;
diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/User.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/User.java
index 1c6399dc44..61904198f5 100644
--- a/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/User.java
+++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/User.java
@@ -15,7 +15,7 @@ import javax.persistence.Table;
public class User {
@Id
- @GeneratedValue(strategy = GenerationType.AUTO)
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
diff --git a/persistence-modules/spring-jpa/src/main/resources/persistence-h2.properties b/persistence-modules/spring-jpa/src/main/resources/persistence-h2.properties
index 2c3e18b58d..716a96fde3 100644
--- a/persistence-modules/spring-jpa/src/main/resources/persistence-h2.properties
+++ b/persistence-modules/spring-jpa/src/main/resources/persistence-h2.properties
@@ -2,7 +2,7 @@
jdbc.driverClassName=org.h2.Driver
jdbc.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
jdbc.user=sa
-# jdbc.pass=
+jdbc.pass=
# hibernate.X
hibernate.dialect=org.hibernate.dialect.H2Dialect
diff --git a/persistence-modules/spring-jpa/src/main/resources/persistence-multiple-db.properties b/persistence-modules/spring-jpa/src/main/resources/persistence-multiple-db.properties
index 539535528c..ce1b6da9ff 100644
--- a/persistence-modules/spring-jpa/src/main/resources/persistence-multiple-db.properties
+++ b/persistence-modules/spring-jpa/src/main/resources/persistence-multiple-db.properties
@@ -1,12 +1,12 @@
# jdbc.X
-jdbc.driverClassName=com.mysql.cj.jdbc.Driver
-user.jdbc.url=jdbc:mysql://localhost:3306/spring_jpa_user?createDatabaseIfNotExist=true
-product.jdbc.url=jdbc:mysql://localhost:3306/spring_jpa_product?createDatabaseIfNotExist=true
-jdbc.user=tutorialuser
-jdbc.pass=tutorialmy5ql
+jdbc.driverClassName=org.h2.Driver
+user.jdbc.url=jdbc:h2:mem:spring_jpa_user;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS SPRING_JPA_USER
+product.jdbc.url=jdbc:h2:mem:spring_jpa_product;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS SPRING_JPA_PRODUCT
+jdbc.user=sa
+jdbc.pass=
# hibernate.X
-hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
+hibernate.dialect=org.hibernate.dialect.H2Dialect
hibernate.show_sql=false
hibernate.hbm2ddl.auto=create-drop
hibernate.cache.use_second_level_cache=false
diff --git a/persistence-modules/spring-jpa/src/main/resources/persistence-student-h2.properties b/persistence-modules/spring-jpa/src/main/resources/persistence-student-h2.properties
index e1d6bfa45a..405e6ff109 100644
--- a/persistence-modules/spring-jpa/src/main/resources/persistence-student-h2.properties
+++ b/persistence-modules/spring-jpa/src/main/resources/persistence-student-h2.properties
@@ -2,7 +2,7 @@
jdbc.driverClassName=org.h2.Driver
jdbc.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
jdbc.user=sa
-# jdbc.pass=
+jdbc.pass=
# hibernate.X
hibernate.dialect=org.hibernate.dialect.H2Dialect
diff --git a/persistence-modules/spring-jpa/src/main/resources/persistence.xml b/persistence-modules/spring-jpa/src/main/resources/persistence.xml
index 5afc0af94d..65bad29cdc 100644
--- a/persistence-modules/spring-jpa/src/main/resources/persistence.xml
+++ b/persistence-modules/spring-jpa/src/main/resources/persistence.xml
@@ -7,7 +7,7 @@
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"
>
-
+
diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/dsrouting/DataSourceRoutingIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/dsrouting/DataSourceRoutingIntegrationTest.java
index f81247e3cd..47355471b9 100644
--- a/persistence-modules/spring-jpa/src/test/java/org/baeldung/dsrouting/DataSourceRoutingIntegrationTest.java
+++ b/persistence-modules/spring-jpa/src/test/java/org/baeldung/dsrouting/DataSourceRoutingIntegrationTest.java
@@ -9,11 +9,13 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = DataSourceRoutingTestConfiguration.class)
+@DirtiesContext
public class DataSourceRoutingIntegrationTest {
@Autowired
diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/deletion/config/PersistenceJPAConfigDeletion.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/deletion/config/PersistenceJPAConfigDeletion.java
index 09d118fedc..e5fb728a0a 100644
--- a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/deletion/config/PersistenceJPAConfigDeletion.java
+++ b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/deletion/config/PersistenceJPAConfigDeletion.java
@@ -10,6 +10,6 @@ public class PersistenceJPAConfigDeletion extends PersistenceJPAConfigL2Cache {
@Override
protected String[] getPackagesToScan() {
- return new String[] { "org.baeldung.persistence.deletion.model" };
+ return new String[] { "org.baeldung.persistence.deletion.model", "org.baeldung.persistence.model" };
}
}
\ No newline at end of file
diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/AdvancedTaggingIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/AdvancedTaggingIntegrationTest.java
index 9432420878..9a90b857e5 100644
--- a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/AdvancedTaggingIntegrationTest.java
+++ b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/AdvancedTaggingIntegrationTest.java
@@ -11,6 +11,7 @@ import org.baeldung.inmemory.persistence.model.SkillTag;
import org.baeldung.inmemory.persistence.model.Student;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
@@ -26,6 +27,7 @@ import static org.junit.Assert.assertEquals;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { StudentJpaConfig.class }, loader = AnnotationConfigContextLoader.class)
@Transactional
+@DirtiesContext
public class AdvancedTaggingIntegrationTest {
@Resource
private StudentRepository studentRepository;
diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/ExtendedStudentRepositoryIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/ExtendedStudentRepositoryIntegrationTest.java
index 7c6ec9b6da..f3cf921632 100644
--- a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/ExtendedStudentRepositoryIntegrationTest.java
+++ b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/ExtendedStudentRepositoryIntegrationTest.java
@@ -12,11 +12,13 @@ import org.baeldung.inmemory.persistence.model.Student;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { StudentJPAH2Config.class })
+@DirtiesContext
public class ExtendedStudentRepositoryIntegrationTest {
@Resource
private ExtendedStudentRepository extendedStudentRepository;
diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/InMemoryDBIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/InMemoryDBIntegrationTest.java
index 3d9e376e81..9ddc48460a 100644
--- a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/InMemoryDBIntegrationTest.java
+++ b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/InMemoryDBIntegrationTest.java
@@ -5,6 +5,7 @@ import org.baeldung.inmemory.persistence.dao.StudentRepository;
import org.baeldung.inmemory.persistence.model.Student;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
@@ -20,6 +21,7 @@ import static org.junit.Assert.assertEquals;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { StudentJpaConfig.class }, loader = AnnotationConfigContextLoader.class)
@Transactional
+@DirtiesContext
public class InMemoryDBIntegrationTest {
@Resource
diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/UserRepositoryIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/UserRepositoryIntegrationTest.java
index 90db9f4e74..9effd4717f 100644
--- a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/UserRepositoryIntegrationTest.java
+++ b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/UserRepositoryIntegrationTest.java
@@ -11,6 +11,7 @@ import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.JpaSort;
import org.springframework.data.mapping.PropertyReferenceException;
+import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;
@@ -25,6 +26,7 @@ import static org.assertj.core.api.Assertions.assertThat;
*/
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = PersistenceJPAConfigL2Cache.class)
+@DirtiesContext
public class UserRepositoryIntegrationTest {
private final String USER_NAME_ADAM = "Adam";
diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/DeletionIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/DeletionIntegrationTest.java
index f42a4e9be1..0dbb7dbfe8 100644
--- a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/DeletionIntegrationTest.java
+++ b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/DeletionIntegrationTest.java
@@ -8,6 +8,7 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
@@ -23,6 +24,7 @@ import static org.junit.Assert.assertThat;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { PersistenceJPAConfigDeletion.class }, loader = AnnotationConfigContextLoader.class)
+@DirtiesContext
public class DeletionIntegrationTest {
@PersistenceContext
diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooPaginationPersistenceIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooPaginationPersistenceIntegrationTest.java
index 091bec0ba0..bf49a431e1 100644
--- a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooPaginationPersistenceIntegrationTest.java
+++ b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooPaginationPersistenceIntegrationTest.java
@@ -16,17 +16,20 @@ import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import org.baeldung.config.PersistenceJPAConfig;
+import org.baeldung.config.PersistenceJPAConfigL2Cache;
import org.baeldung.persistence.model.Foo;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.annotation.DirtiesContext;
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 = { PersistenceJPAConfig.class }, loader = AnnotationConfigContextLoader.class)
+@ContextConfiguration(classes = { PersistenceJPAConfigL2Cache.class }, loader = AnnotationConfigContextLoader.class)
+@DirtiesContext
public class FooPaginationPersistenceIntegrationTest {
@PersistenceContext
diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java
index 4c57865f74..45316cf06c 100644
--- a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java
+++ b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java
@@ -3,6 +3,7 @@ package org.baeldung.persistence.service;
import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
import org.baeldung.config.PersistenceJPAConfig;
+import org.baeldung.config.PersistenceJPAConfigL2Cache;
import org.baeldung.persistence.model.Foo;
import org.junit.Assert;
import org.junit.Test;
@@ -11,12 +12,14 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.InvalidDataAccessApiUsageException;
+import org.springframework.test.annotation.DirtiesContext;
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 = { PersistenceJPAConfig.class }, loader = AnnotationConfigContextLoader.class)
+@ContextConfiguration(classes = { PersistenceJPAConfigL2Cache.class }, loader = AnnotationConfigContextLoader.class)
+@DirtiesContext
public class FooServicePersistenceIntegrationTest {
@Autowired
diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingIntegrationTest.java
index 3c9f509da5..61a3bfd565 100644
--- a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingIntegrationTest.java
+++ b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingIntegrationTest.java
@@ -10,17 +10,19 @@ import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
-import org.baeldung.config.PersistenceJPAConfig;
+import org.baeldung.config.PersistenceJPAConfigL2Cache;
import org.baeldung.persistence.model.Bar;
import org.baeldung.persistence.model.Foo;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.springframework.test.annotation.DirtiesContext;
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 = { PersistenceJPAConfig.class }, loader = AnnotationConfigContextLoader.class)
+@ContextConfiguration(classes = { PersistenceJPAConfigL2Cache.class }, loader = AnnotationConfigContextLoader.class)
+@DirtiesContext
@SuppressWarnings("unchecked")
public class FooServiceSortingIntegrationTest {
diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingWitNullsManualIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingWitNullsManualIntegrationTest.java
index 040eee1c73..50fdf5f0f3 100644
--- a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingWitNullsManualIntegrationTest.java
+++ b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingWitNullsManualIntegrationTest.java
@@ -10,16 +10,19 @@ import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.baeldung.config.PersistenceJPAConfig;
+import org.baeldung.config.PersistenceJPAConfigL2Cache;
import org.baeldung.persistence.model.Foo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.annotation.DirtiesContext;
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 = { PersistenceJPAConfig.class }, loader = AnnotationConfigContextLoader.class)
+@ContextConfiguration(classes = { PersistenceJPAConfigL2Cache.class }, loader = AnnotationConfigContextLoader.class)
+@DirtiesContext
public class FooServiceSortingWitNullsManualIntegrationTest {
@PersistenceContext
diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/JpaMultipleDBIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/JpaMultipleDBIntegrationTest.java
index f20af34057..6cd187230c 100644
--- a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/JpaMultipleDBIntegrationTest.java
+++ b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/JpaMultipleDBIntegrationTest.java
@@ -18,6 +18,7 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;
+import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@@ -26,6 +27,7 @@ import org.springframework.transaction.annotation.Transactional;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { UserConfig.class, ProductConfig.class })
@EnableTransactionManagement
+@DirtiesContext
public class JpaMultipleDBIntegrationTest {
@Autowired
diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/SecondLevelCacheIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/SecondLevelCacheIntegrationTest.java
index 907043b8ce..4de8d321d5 100644
--- a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/SecondLevelCacheIntegrationTest.java
+++ b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/SecondLevelCacheIntegrationTest.java
@@ -8,6 +8,7 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
@@ -24,6 +25,7 @@ import static org.junit.Assert.assertThat;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { PersistenceJPAConfigL2Cache.class }, loader = AnnotationConfigContextLoader.class)
+@DirtiesContext
public class SecondLevelCacheIntegrationTest {
@PersistenceContext
diff --git a/pom.xml b/pom.xml
index 5ed7f7c33f..38812f09bf 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,471 +1,1110 @@
-
- 4.0.0
+
+ 4.0.0
- com.baeldung
- parent-modules
- 1.0.0-SNAPSHOT
- parent-modules
- pom
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+ parent-modules
+ pom
-
- parent-boot-1
- parent-boot-2
- parent-spring-4
- parent-spring-5
- parent-java
- asm
- atomix
- apache-cayenne
- aws
- aws-lambda
- akka-streams
- algorithms
- annotations
- apache-cxf
- apache-fop
- apache-poi
- apache-tika
- apache-thrift
- apache-curator
- apache-zookeeper
- apache-opennlp
- autovalue
- axon
- azure
- bootique
- cdi
-
- core-java
- core-java-collections
- core-java-io
- core-java-8
- core-kotlin
- core-groovy
- core-java-concurrency
- couchbase
- deltaspike
- dozer
- ethereum
- ejb
- feign
- flips
- testing-modules/gatling
- geotools
- testing-modules/groovy-spock
- google-cloud
- google-web-toolkit
- gson
- guava
- guava-modules/guava-18
- guava-modules/guava-19
- guava-modules/guava-21
- guice
- disruptor
- spring-static-resources
- hazelcast
- hbase
- hibernate5
- httpclient
- hystrix
- image-processing
- immutables
- influxdb
- jackson
- persistence-modules/java-cassandra
- vavr
- java-lite
- java-numbers
- java-rmi
- java-vavr-stream
- javax-servlets
- javaxval
- jaxb
- javafx
- jgroups
- jee-7
- jhipster/jhipster-monolithic
- jjwt
- jpa-storedprocedure
- jsf
- json-path
- json
- jsoup
- testing-modules/junit-5
- jws
- libraries
- libraries-data
- linkrest
- logging-modules/log-mdc
- logging-modules/log4j
- logging-modules/log4j2
- logging-modules/logback
- lombok
- mapstruct
- metrics
- maven
- mesos-marathon
- msf4j
- testing-modules/mockito
- testing-modules/mockito-2
- testing-modules/mocks
- mustache
- mvn-wrapper
- noexception
- orientdb
- osgi
- orika
- patterns
- pdf
- protobuffer
- persistence-modules/querydsl
- reactor-core
- persistence-modules/redis
- testing-modules/rest-assured
- testing-modules/rest-testing
- resteasy
- rxjava
- spring-swagger-codegen
- testing-modules/selenium-junit-testng
- persistence-modules/solr
- spark-java
- spring-4
- spring-5
- spring-5-reactive
- spring-5-mvc
- spring-5-security
- spring-activiti
- spring-akka
- spring-amqp
- spring-all
- spring-amqp-simple
- spring-apache-camel
- spring-batch
- spring-bom
- spring-boot
- spring-boot-keycloak
- spring-boot-bootstrap
- spring-boot-admin
- spring-boot-ops
- spring-boot-persistence
- spring-boot-security
- spring-boot-mvc
- spring-boot-logging-log4j2
- spring-cloud-data-flow
- spring-cloud
- spring-core
- spring-cucumber
- spring-ejb
- spring-aop
- persistence-modules/spring-data-cassandra
- spring-data-couchbase-2
- persistence-modules/spring-data-dynamodb
- spring-data-elasticsearch
- spring-data-keyvalue
- spring-data-mongodb
- persistence-modules/spring-data-neo4j
- persistence-modules/spring-data-redis
- spring-data-rest
- persistence-modules/spring-data-solr
- spring-dispatcher-servlet
- spring-exceptions
- spring-freemarker
- persistence-modules/spring-hibernate-3
- spring-hibernate4
- persistence-modules/spring-hibernate-5
- persistence-modules/spring-data-eclipselink
- spring-integration
- spring-jenkins-pipeline
- spring-jersey
- jmeter
- spring-jms
- spring-jooq
- persistence-modules/spring-jpa
- spring-kafka
- spring-katharsis
- spring-ldap
- spring-mockito
- spring-mvc-forms-jsp
- spring-mvc-forms-thymeleaf
- spring-mvc-java
- spring-mvc-velocity
- spring-mvc-webflow
- spring-mvc-xml
- spring-mvc-kotlin
- spring-protobuf
- spring-quartz
- spring-rest-angular
- spring-rest-full
- spring-rest-query-language
- spring-rest
- spring-rest-simple
- spring-security-acl
- spring-security-cache-control
- spring-security-client/spring-security-jsp-authentication
- spring-security-client/spring-security-jsp-authorize
- spring-security-client/spring-security-jsp-config
- spring-security-client/spring-security-mvc
- spring-security-client/spring-security-thymeleaf-authentication
- spring-security-client/spring-security-thymeleaf-authorize
- spring-security-client/spring-security-thymeleaf-config
- spring-security-core
- spring-security-mvc-boot
- 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-mvc-socket
- spring-security-openid
-
- spring-security-rest-basic-auth
- spring-security-rest-custom
- spring-security-rest
- spring-security-sso
- spring-security-x509
- spring-session
- spring-sleuth
- spring-social-login
- spring-spel
- spring-state-machine
- spring-thymeleaf
- spring-userservice
- spring-zuul
- spring-reactor
- spring-vertx
- spring-jinq
- spring-rest-embedded-tomcat
- testing-modules/testing
- testing-modules/testng
- video-tutorials
- xml
- xmlunit-2
- struts-2
- apache-velocity
- apache-solrj
- rabbitmq
- vertx
- persistence-modules/spring-data-gemfire
- mybatis
- spring-drools
- drools
- persistence-modules/liquibase
- spring-boot-property-exp
- testing-modules/mockserver
- testing-modules/test-containers
- undertow
- vertx-and-rxjava
- saas
- deeplearning4j
- lucene
- vraptor
- persistence-modules/java-cockroachdb
- spring-security-thymeleaf
- persistence-modules/java-jdbi
- jersey
- java-spi
- performance-tests
- twilio
- spring-boot-ctx-fluent
- java-ee-8-security-api
- spring-webflux-amqp
- antlr
- maven-archetype
- apache-meecrowave
-
+
+
+
+ org.slf4j
+ slf4j-api
+ ${org.slf4j.version}
+
+
+ ch.qos.logback
+ logback-classic
+ ${logback.version}
+
+
+ ch.qos.logback
+ logback-core
+ ${logback.version}
+
+
+ org.slf4j
+ jcl-over-slf4j
+ ${org.slf4j.version}
+
-
-
-
- org.slf4j
- slf4j-api
- ${org.slf4j.version}
-
-
- ch.qos.logback
- logback-classic
- ${logback.version}
-
-
- ch.qos.logback
- logback-core
- ${logback.version}
-
-
- org.slf4j
- jcl-over-slf4j
- ${org.slf4j.version}
-
+
+
+ junit
+ junit
+ ${junit.version}
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ ${junit.jupiter.version}
+ test
+
+
+ org.hamcrest
+ hamcrest-core
+ ${org.hamcrest.version}
+ test
+
+
+ org.hamcrest
+ hamcrest-library
+ ${org.hamcrest.version}
+ test
+
+
+ org.hamcrest
+ hamcrest-all
+ ${org.hamcrest.version}
+ test
+
+
+ org.mockito
+ mockito-core
+ ${mockito.version}
+ test
+
+
-
-
- junit
- junit
- ${junit.version}
- test
-
-
- org.junit.jupiter
- junit-jupiter-engine
- ${junit.jupiter.version}
- test
-
-
- org.hamcrest
- hamcrest-core
- ${org.hamcrest.version}
- test
-
-
- org.hamcrest
- hamcrest-library
- ${org.hamcrest.version}
- test
-
-
- org.hamcrest
- hamcrest-all
- ${org.hamcrest.version}
- test
-
-
- org.mockito
- mockito-core
- ${mockito.version}
- test
-
-
-
-
-
-
- org.codehaus.mojo
- exec-maven-plugin
- ${exec-maven-plugin.version}
-
- maven
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- ${maven-surefire-plugin.version}
-
- 3
- true
-
- **/*IntegrationTest.java
- **/*IntTest.java
- **/*LongRunningUnitTest.java
- **/*ManualTest.java
- **/JdbcTest.java
- **/*LiveTest.java
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- ${maven-compiler-plugin.version}
-
- ${java.version}
- ${java.version}
-
-
-
- org.apache.maven.plugins
- maven-pmd-plugin
- ${maven-pmd-plugin.version}
-
-
- org.baeldung.pmd
- custom-pmd
- ${custom-pmd.version}
-
-
-
- 5
- false
- true
- true
- true
- true
- UTF-8
- ${java.version}
-
- ${tutorialsproject.basedir}/baeldung-pmd-rules.xml
-
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ ${exec-maven-plugin.version}
+
+ maven
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${maven-surefire-plugin.version}
+
+ 3
+ true
+
+ **/*IntegrationTest.java
+ **/*IntTest.java
+ **/*LongRunningUnitTest.java
+ **/*ManualTest.java
+ **/JdbcTest.java
+ **/*LiveTest.java
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ ${java.version}
+ ${java.version}
+
+
+
+ org.apache.maven.plugins
+ maven-pmd-plugin
+ ${maven-pmd-plugin.version}
+
+
+ org.baeldung.pmd
+ custom-pmd
+ ${custom-pmd.version}
+
+
+
+ 5
+ false
+ true
+ true
+ true
+ true
+ UTF-8
+ ${java.version}
+
+ ${tutorialsproject.basedir}/baeldung-pmd-rules.xml
+
target/generated-sources
-
-
-
- compile
-
- check
-
-
-
-
-
- org.commonjava.maven.plugins
- directory-maven-plugin
- ${directory-maven-plugin.version}
-
-
- directories
-
- directory-of
-
- validate
-
- tutorialsproject.basedir
-
- com.baeldung
- parent-modules
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-install-plugin
- ${maven-install-plugin.version}
-
- org.baeldung.pmd
- custom-pmd
- ${custom-pmd.version}
- jar
- ${tutorialsproject.basedir}/custom-pmd-${custom-pmd.version}.jar
- true
-
-
-
- install-jar-lib
-
- install-file
-
- validate
-
-
-
-
-
-
- com.vackosar.gitflowincrementalbuilder
- gitflow-incremental-builder
- ${gitflow-incremental-builder.version}
-
-
-
+
+
+
+ compile
+
+ check
+
+
+
+
+
+ org.commonjava.maven.plugins
+ directory-maven-plugin
+ ${directory-maven-plugin.version}
+
+
+ directories
+
+ directory-of
+
+ validate
+
+ tutorialsproject.basedir
+
+ com.baeldung
+ parent-modules
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-install-plugin
+ ${maven-install-plugin.version}
+
+ org.baeldung.pmd
+ custom-pmd
+ ${custom-pmd.version}
+ jar
+ ${tutorialsproject.basedir}/custom-pmd-${custom-pmd.version}.jar
+ true
+
+
+
+ install-jar-lib
+
+ install-file
+
+ validate
+
+
+
+
+
+
+ com.vackosar.gitflowincrementalbuilder
+ gitflow-incremental-builder
+ ${gitflow-incremental-builder.version}
+
+
+
+
+
+
+ org.eclipse.m2e
+ lifecycle-mapping
+ 1.0.0
+
+
+
+
+
+
+ org.commonjava.maven.plugins
+
+
+ directory-maven-plugin
+
+
+ [0.3.1,)
+
+
+ directory-of
+
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+
+
+ maven-install-plugin
+
+
+ [2.5.1,)
+
+
+ install-file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ default
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${maven-surefire-plugin.version}
+
+ 3
+ true
+
+ **/*IntegrationTest.java
+ **/*IntTest.java
+ **/*LongRunningUnitTest.java
+ **/*ManualTest.java
+ **/JdbcTest.java
+ **/*LiveTest.java
+
+
+
+
+
+
+
+
+ parent-boot-1
+ parent-boot-2
+ parent-spring-4
+ parent-spring-5
+ parent-java
+ asm
+ atomix
+ apache-cayenne
+ aws
+ aws-lambda
+ akka-streams
+ algorithms
+ annotations
+ apache-cxf
+ apache-fop
+ apache-poi
+ apache-tika
+ apache-thrift
+ apache-curator
+ apache-zookeeper
+ apache-opennlp
+ autovalue
+ axon
+ azure
+ bootique
+ cdi
+
+ core-java
+ core-java-collections
+ core-java-io
+ core-java-8
+ core-kotlin
+ core-groovy
+ core-java-concurrency
+ couchbase
+ deltaspike
+ dozer
+ ethereum
+ ejb
+ feign
+ flips
+ testing-modules/gatling
+ geotools
+ testing-modules/groovy-spock
+ google-cloud
+ google-web-toolkit
+ gson
+ guava
+ guava-modules/guava-18
+ guava-modules/guava-19
+ guava-modules/guava-21
+ guice
+ disruptor
+ spring-static-resources
+ hazelcast
+ hbase
+ hibernate5
+ httpclient
+ hystrix
+ image-processing
+ immutables
+ influxdb
+ jackson
+ persistence-modules/java-cassandra
+ vavr
+ java-lite
+ java-numbers
+ java-rmi
+ java-vavr-stream
+ javax-servlets
+ javaxval
+ jaxb
+ javafx
+ jgroups
+ jee-7
+ jhipster/jhipster-monolithic
+ jjwt
+ jpa-storedprocedure
+ jsf
+ json-path
+ json
+ jsoup
+ testing-modules/junit-5
+ jws
+ libraries
+ libraries-data
+ linkrest
+ logging-modules/log-mdc
+ logging-modules/log4j
+ logging-modules/log4j2
+ logging-modules/logback
+ lombok
+ mapstruct
+ metrics
+ maven
+ mesos-marathon
+ msf4j
+ testing-modules/mockito
+ testing-modules/mockito-2
+ testing-modules/mocks
+ mustache
+ mvn-wrapper
+ noexception
+ orientdb
+ osgi
+ orika
+ patterns
+ pdf
+ protobuffer
+ persistence-modules/querydsl
+ reactor-core
+ persistence-modules/redis
+ testing-modules/rest-assured
+ testing-modules/rest-testing
+ resteasy
+ rxjava
+ spring-swagger-codegen
+ testing-modules/selenium-junit-testng
+ persistence-modules/solr
+ spark-java
+ spring-4
+ spring-5
+ spring-5-reactive
+ spring-5-mvc
+ spring-5-security
+ spring-activiti
+ spring-akka
+ spring-amqp
+ spring-all
+ spring-amqp-simple
+ spring-apache-camel
+ spring-batch
+ spring-bom
+ spring-boot
+ spring-boot-keycloak
+ spring-boot-bootstrap
+ spring-boot-admin
+ spring-boot-ops
+ spring-boot-persistence
+ spring-boot-security
+ spring-boot-mvc
+ spring-boot-logging-log4j2
+ spring-cloud-data-flow
+ spring-cloud
+ spring-core
+ spring-cucumber
+ spring-ejb
+ spring-aop
+ persistence-modules/spring-data-cassandra
+ spring-data-couchbase-2
+ persistence-modules/spring-data-dynamodb
+ spring-data-elasticsearch
+ spring-data-keyvalue
+ spring-data-mongodb
+ persistence-modules/spring-data-neo4j
+ persistence-modules/spring-data-redis
+ spring-data-rest
+ persistence-modules/spring-data-solr
+ spring-dispatcher-servlet
+ spring-exceptions
+ spring-freemarker
+ persistence-modules/spring-hibernate-3
+ spring-hibernate4
+ persistence-modules/spring-hibernate-5
+ persistence-modules/spring-data-eclipselink
+ spring-integration
+ spring-jenkins-pipeline
+ spring-jersey
+ jmeter
+ spring-jms
+ spring-jooq
+ persistence-modules/spring-jpa
+ spring-kafka
+ spring-katharsis
+ spring-ldap
+ spring-mockito
+ spring-mvc-forms-jsp
+ spring-mvc-forms-thymeleaf
+ spring-mvc-java
+ spring-mvc-velocity
+ spring-mvc-webflow
+ spring-mvc-xml
+ spring-mvc-kotlin
+ spring-protobuf
+ spring-quartz
+ spring-rest-angular
+ spring-rest-full
+ spring-rest-query-language
+ spring-rest
+ spring-rest-simple
+ spring-security-acl
+ spring-security-cache-control
+ spring-security-client/spring-security-jsp-authentication
+ spring-security-client/spring-security-jsp-authorize
+ spring-security-client/spring-security-jsp-config
+ spring-security-client/spring-security-mvc
+ spring-security-client/spring-security-thymeleaf-authentication
+ spring-security-client/spring-security-thymeleaf-authorize
+ spring-security-client/spring-security-thymeleaf-config
+ spring-security-core
+ spring-security-mvc-boot
+ 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-mvc-socket
+ spring-security-openid
+
+ spring-security-rest-basic-auth
+ spring-security-rest-custom
+ spring-security-rest
+ spring-security-sso
+ spring-security-x509
+ spring-session
+ spring-sleuth
+ spring-social-login
+ spring-spel
+ spring-state-machine
+ spring-thymeleaf
+ spring-userservice
+ spring-zuul
+ spring-reactor
+ spring-vertx
+ spring-jinq
+ spring-rest-embedded-tomcat
+ testing-modules/testing
+ testing-modules/testng
+ video-tutorials
+ xml
+ xmlunit-2
+ struts-2
+ apache-velocity
+ apache-solrj
+ rabbitmq
+ vertx
+ persistence-modules/spring-data-gemfire
+ mybatis
+ spring-drools
+ drools
+ persistence-modules/liquibase
+ spring-boot-property-exp
+ testing-modules/mockserver
+ testing-modules/test-containers
+ undertow
+ vertx-and-rxjava
+ saas
+ deeplearning4j
+ lucene
+ vraptor
+ persistence-modules/java-cockroachdb
+ spring-security-thymeleaf
+ persistence-modules/java-jdbi
+ jersey
+ java-spi
+ performance-tests
+ twilio
+ spring-boot-ctx-fluent
+ java-ee-8-security-api
+ spring-webflux-amqp
+ antlr
+ maven-archetype
+ apache-meecrowave
+ spring-reactive-kotlin
+ jnosql
+ testing-modules/junit-abstract
+
+
+
+
+
+ integration
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ integration-test
+
+ test
+
+
+
+ **/*ManualTest.java
+ **/*LiveTest.java
+
+
+ **/*IntegrationTest.java
+ **/*IntTest.java
+
+
+
+
+
+
+ json
+
+
+
+
+
+
+
+
+ parent-boot-1
+ parent-boot-2
+ parent-spring-4
+ parent-spring-5
+ parent-java
+
+
+
+
+
+
+
+
+
+
+ testing-modules/mockito
+ testing-modules/mockito-2
+ testing-modules/mocks
+ mustache
+ mvn-wrapper
+ noexception
+ orientdb
+ osgi
+ orika
+ patterns
+ pdf
+ protobuffer
+ persistence-modules/querydsl
+ reactor-core
+ persistence-modules/redis
+ testing-modules/rest-assured
+ testing-modules/rest-testing
+ resteasy
+ rxjava
+ spring-swagger-codegen
+ testing-modules/selenium-junit-testng
+ persistence-modules/solr
+ spark-java
+ spring-4
+ spring-5
+ spring-5-reactive
+ spring-5-mvc
+ spring-5-security
+ spring-activiti
+ spring-akka
+ spring-amqp
+ spring-all
+ spring-amqp-simple
+ spring-apache-camel
+ spring-batch
+ testing-modules/junit-abstract
+
+
+
+
+
+
+ spring-bom
+ spring-boot
+ spring-boot-keycloak
+ spring-boot-bootstrap
+ spring-boot-admin
+ spring-boot-ops
+ spring-boot-persistence
+ spring-boot-security
+ spring-boot-mvc
+ spring-boot-logging-log4j2
+ spring-cloud-data-flow
+ spring-cloud
+ spring-core
+ spring-cucumber
+ spring-ejb
+ spring-aop
+ persistence-modules/spring-data-cassandra
+ spring-data-couchbase-2
+ persistence-modules/spring-data-dynamodb
+ spring-data-elasticsearch
+ spring-data-keyvalue
+ spring-data-mongodb
+ persistence-modules/spring-data-neo4j
+ persistence-modules/spring-data-redis
+ spring-data-rest
+
+
+
+
+
+
+ persistence-modules/spring-data-solr
+ spring-dispatcher-servlet
+ spring-exceptions
+ spring-freemarker
+ persistence-modules/spring-hibernate-3
+ spring-hibernate4
+ persistence-modules/spring-hibernate-5
+ persistence-modules/spring-data-eclipselink
+ spring-integration
+ spring-jenkins-pipeline
+ spring-jersey
+ spring-jms
+ spring-jooq
+ persistence-modules/spring-jpa
+ spring-kafka
+ spring-katharsis
+ spring-ldap
+ spring-mockito
+ spring-mvc-forms-jsp
+ spring-mvc-forms-thymeleaf
+ spring-mvc-java
+ spring-mvc-velocity
+ spring-mvc-webflow
+ spring-mvc-xml
+ spring-mvc-kotlin
+ spring-protobuf
+ spring-quartz
+ spring-rest-angular
+ spring-rest-full
+ spring-rest-query-language
+ spring-rest
+ spring-rest-simple
+ spring-reactive-kotlin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ integration-lite
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ integration-test
+
+ test
+
+
+
+ **/*ManualTest.java
+ **/*LiveTest.java
+
+
+ **/*IntegrationTest.java
+ **/*IntTest.java
+
+
+
+
+
+
+ json
+
+
+
+
+
+
+
+ parent-boot-1
+ parent-boot-2
+ parent-spring-4
+ parent-spring-5
+ parent-java
+
+ asm
+ atomix
+ apache-cayenne
+ aws
+ aws-lambda
+ akka-streams
+ algorithms
+ annotations
+ apache-cxf
+ apache-fop
+ apache-poi
+ apache-tika
+ apache-thrift
+ apache-curator
+ apache-zookeeper
+ apache-opennlp
+ autovalue
+ axon
+ azure
+ bootique
+ cdi
+
+ core-java-collections
+ core-java-io
+ core-java-8
+ core-groovy
+ core-java-concurrency
+ couchbase
+ deltaspike
+ dozer
+ ethereum
+ feign
+ flips
+ testing-modules/groovy-spock
+ google-cloud
+ gson
+ guava
+ guava-modules/guava-18
+ guava-modules/guava-19
+ guava-modules/guava-21
+ guice
+ disruptor
+ spring-static-resources
+ hazelcast
+ hbase
+ httpclient
+ hystrix
+ image-processing
+ immutables
+ influxdb
+ jackson
+ vavr
+ java-lite
+ java-numbers
+ java-rmi
+ java-vavr-stream
+ javax-servlets
+ javaxval
+ jaxb
+ javafx
+ jgroups
+ jee-7
+ jjwt
+ jpa-storedprocedure
+ jsf
+ json-path
+ json
+ jsoup
+ testing-modules/junit-5
+ jws
+ libraries-data
+ linkrest
+ logging-modules/log-mdc
+ logging-modules/log4j
+ logging-modules/log4j2
+ logging-modules/logback
+ lombok
+ mapstruct
+ metrics
+ maven
+ mesos-marathon
+ msf4j
+ testing-modules/mockito
+ testing-modules/mockito-2
+ testing-modules/mocks
+ mustache
+ mvn-wrapper
+ noexception
+ orientdb
+ osgi
+ orika
+ patterns
+ pdf
+ protobuffer
+ persistence-modules/querydsl
+ reactor-core
+ persistence-modules/redis
+ testing-modules/rest-assured
+ testing-modules/rest-testing
+ resteasy
+ rxjava
+ spring-swagger-codegen
+ testing-modules/selenium-junit-testng
+ persistence-modules/solr
+ spark-java
+ spring-4
+ spring-5-reactive
+ spring-5-mvc
+ spring-5-security
+ spring-activiti
+ spring-akka
+ spring-amqp
+ spring-all
+ spring-amqp-simple
+ spring-apache-camel
+ spring-batch
+ spring-bom
+ spring-boot-keycloak
+ spring-boot-bootstrap
+ spring-boot-admin
+ spring-boot-persistence
+ spring-boot-security
+ spring-boot-mvc
+ spring-boot-logging-log4j2
+ spring-cloud-data-flow
+ spring-cloud
+ spring-core
+ spring-cucumber
+ spring-ejb
+ spring-aop
+ spring-data-couchbase-2
+ persistence-modules/spring-data-dynamodb
+ spring-data-keyvalue
+ spring-data-mongodb
+ persistence-modules/spring-data-neo4j
+ persistence-modules/spring-data-redis
+ spring-data-rest
+ persistence-modules/spring-data-solr
+ spring-dispatcher-servlet
+ spring-exceptions
+ spring-freemarker
+ persistence-modules/spring-hibernate-3
+ spring-hibernate4
+ persistence-modules/spring-hibernate-5
+ persistence-modules/spring-data-eclipselink
+ spring-integration
+ spring-jenkins-pipeline
+ spring-jersey
+ jmeter
+ spring-jms
+ spring-jooq
+ persistence-modules/spring-jpa
+ spring-kafka
+ spring-katharsis
+ spring-ldap
+ spring-mockito
+ spring-mvc-forms-jsp
+ spring-mvc-forms-thymeleaf
+ spring-mvc-java
+ spring-mvc-velocity
+ spring-mvc-webflow
+ spring-mvc-xml
+ spring-mvc-kotlin
+ spring-protobuf
+ spring-quartz
+ spring-rest-angular
+ spring-rest-full
+ spring-rest-query-language
+ spring-rest
+ spring-rest-simple
+ spring-security-acl
+ spring-security-cache-control
+ spring-security-client/spring-security-jsp-authentication
+ spring-security-client/spring-security-jsp-authorize
+ spring-security-client/spring-security-jsp-config
+ spring-security-client/spring-security-mvc
+ spring-security-client/spring-security-thymeleaf-authentication
+ spring-security-client/spring-security-thymeleaf-authorize
+ spring-security-client/spring-security-thymeleaf-config
+ spring-security-core
+ spring-security-mvc-boot
+ 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-mvc-socket
+ spring-security-openid
+
+ spring-security-rest-basic-auth
+ spring-security-rest-custom
+ spring-security-rest
+ spring-security-sso
+ spring-security-x509
+ spring-session
+ spring-sleuth
+ spring-social-login
+ spring-spel
+ spring-state-machine
+ spring-thymeleaf
+ spring-userservice
+ spring-zuul
+ spring-reactor
+ spring-vertx
+ spring-jinq
+ spring-rest-embedded-tomcat
+ testing-modules/testing
+ testing-modules/testng
+ video-tutorials
+ xml
+ xmlunit-2
+ struts-2
+ apache-velocity
+ apache-solrj
+ rabbitmq
+ vertx
+ persistence-modules/spring-data-gemfire
+ mybatis
+ spring-drools
+ drools
+ persistence-modules/liquibase
+ spring-boot-property-exp
+ testing-modules/mockserver
+ testing-modules/test-containers
+ undertow
+ vertx-and-rxjava
+ saas
+ deeplearning4j
+ lucene
+ vraptor
+ persistence-modules/java-cockroachdb
+ spring-security-thymeleaf
+ persistence-modules/java-jdbi
+ jersey
+ java-spi
+ performance-tests
+ twilio
+ spring-boot-ctx-fluent
+ java-ee-8-security-api
+ spring-webflux-amqp
+ antlr
+ maven-archetype
+ apache-meecrowave
+ testing-modules/junit-abstract
+
+
+
+
+
+
+
+
+
+
+
-
- integration
+ integration-heavy
+
@@ -497,64 +1136,90 @@
+
+
+ parent-boot-1
+ parent-boot-2
+ parent-spring-4
+ parent-spring-5
+ parent-java
+
+ libraries
+ geotools
+ jhipster/jhipster-monolithic
+ testing-modules/gatling
+ spring-boot
+ spring-boot-ops
+ spring-5
+ core-kotlin
+ core-java
+ google-web-toolkit
+ spring-security-mvc-custom
+ hibernate5
+ spring-data-elasticsearch
+
+
+
-
-
-
-
- org.apache.maven.plugins
- maven-jxr-plugin
- ${maven-jxr-plugin.version}
-
-
-
-
- UTF-8
- UTF-8
- refs/heads/master
- true
- false
- false
-
- 4.12
- 1.3
- 2.8.9
-
- 1.7.21
- 1.1.7
-
- 2.21.0
- 3.7.0
- 1.6.0
- 1.8
- 1.2.17
- 1.1
- 2.1.0.1
- 1.19
- 1.19
- 1.3
- 1.6.0
- 2.19.1
- 2.5
- 1.4
- 2.6
- 3.1.0
- 1.2
- 2.3.1
- 1.9.13
- 1.2
- 2.5.0
- 1.3
- 5.0.2
- 0.3.1
- 2.5.1
- 0.0.1
- 3.4
- 2.3
-
- 3.8
-
+
-
+
+
+
+ org.apache.maven.plugins
+ maven-jxr-plugin
+ ${maven-jxr-plugin.version}
+
+
+
+
+
+ UTF-8
+ UTF-8
+ refs/heads/master
+ true
+ false
+ false
+
+ 4.12
+ 1.3
+ 2.8.9
+
+ 1.7.21
+ 1.1.7
+
+ 2.21.0
+ 3.7.0
+ 1.6.0
+ 1.8
+ 1.2.17
+ 1.1
+ 2.1.0.1
+ 1.19
+ 1.19
+ 1.3
+ 1.6.0
+ 2.19.1
+ 2.5
+ 1.4
+ 2.6
+ 3.1.0
+ 1.2
+ 2.3.1
+ 1.9.13
+ 1.2
+ 2.5.0
+ 1.3
+ 5.0.2
+ 0.3.1
+ 2.5.1
+ 0.0.1
+ 3.4
+ 2.3
+
+ 3.8
+
+
+
\ No newline at end of file
diff --git a/spring-5-reactive/pom.xml b/spring-5-reactive/pom.xml
index 266399e295..33fcad4e1d 100644
--- a/spring-5-reactive/pom.xml
+++ b/spring-5-reactive/pom.xml
@@ -147,7 +147,15 @@
${project-reactor-test}
test
-
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+ org.springframework.security
+ spring-security-test
+ test
+
diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/annotated/CorsOnAnnotatedElementsApplication.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/annotated/CorsOnAnnotatedElementsApplication.java
new file mode 100644
index 0000000000..87efe72a1b
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/annotated/CorsOnAnnotatedElementsApplication.java
@@ -0,0 +1,25 @@
+package com.baeldung.reactive.cors.annotated;
+
+import java.util.Collections;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration;
+import org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration;
+import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
+import org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration;
+
+@SpringBootApplication(exclude = { MongoAutoConfiguration.class,
+ MongoDataAutoConfiguration.class,
+ MongoReactiveDataAutoConfiguration.class,
+ MongoReactiveAutoConfiguration.class }
+)
+public class CorsOnAnnotatedElementsApplication {
+
+ public static void main(String[] args) {
+ SpringApplication app = new SpringApplication(CorsOnAnnotatedElementsApplication.class);
+ app.setDefaultProperties(Collections.singletonMap("server.port", "8081"));
+ app.run(args);
+ }
+
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/annotated/controllers/CorsOnClassController.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/annotated/controllers/CorsOnClassController.java
new file mode 100644
index 0000000000..00bc93a101
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/annotated/controllers/CorsOnClassController.java
@@ -0,0 +1,49 @@
+package com.baeldung.reactive.cors.annotated.controllers;
+
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import reactor.core.publisher.Mono;
+
+@CrossOrigin(value = { "http://allowed-origin.com" }, allowedHeaders = { "Baeldung-Another-Allowed" }, maxAge = 900)
+@RestController
+@RequestMapping("/cors-on-controller")
+public class CorsOnClassController {
+
+ @PutMapping("/regular-endpoint")
+ public Mono corsDisabledEndpoint() {
+ return Mono.just("Regular endpoint");
+ }
+
+ @CrossOrigin
+ @PutMapping("/cors-enabled-endpoint")
+ public Mono corsEnabledEndpoint() {
+ return Mono.just("CORS enabled endpoint");
+ }
+
+ @CrossOrigin({ "http://another-allowed-origin.com" })
+ @PutMapping("/cors-enabled-origin-restrictive-endpoint")
+ public Mono corsEnabledOriginRestrictiveEndpoint() {
+ return Mono.just("CORS enabled endpoint - Origin Restrictive");
+ }
+
+ @CrossOrigin(allowedHeaders = { "Baeldung-Allowed" })
+ @PutMapping("/cors-enabled-header-restrictive-endpoint")
+ public Mono corsEnabledHeaderRestrictiveEndpoint() {
+ return Mono.just("CORS enabled endpoint - Header Restrictive");
+ }
+
+ @CrossOrigin(exposedHeaders = { "Baeldung-Exposed" })
+ @PutMapping("/cors-enabled-exposed-header-endpoint")
+ public Mono corsEnabledExposedHeadersEndpoint() {
+ return Mono.just("CORS enabled endpoint - Exposed Header");
+ }
+
+ @PutMapping("/cors-enabled-mixed-config-endpoint")
+ @CrossOrigin(allowedHeaders = { "Baeldung-Allowed", "Baeldung-Other-Allowed" }, exposedHeaders = { "Baeldung-Allowed", "Baeldung-Exposed" }, maxAge = 3600)
+ public Mono corsEnabledHeaderExposedEndpoint() {
+ return Mono.just("CORS enabled endpoint - Mixed Config");
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/annotated/controllers/CorsOnMethodsController.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/annotated/controllers/CorsOnMethodsController.java
new file mode 100644
index 0000000000..3c72d25840
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/annotated/controllers/CorsOnMethodsController.java
@@ -0,0 +1,48 @@
+package com.baeldung.reactive.cors.annotated.controllers;
+
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import reactor.core.publisher.Mono;
+
+@RestController
+@RequestMapping("/cors-on-methods")
+public class CorsOnMethodsController {
+
+ @PutMapping("/cors-disabled-endpoint")
+ public Mono corsDisabledEndpoint() {
+ return Mono.just("CORS disabled endpoint");
+ }
+
+ @CrossOrigin
+ @PutMapping("/cors-enabled-endpoint")
+ public Mono corsEnabledEndpoint() {
+ return Mono.just("CORS enabled endpoint");
+ }
+
+ @CrossOrigin({ "http://allowed-origin.com" })
+ @PutMapping("/cors-enabled-origin-restrictive-endpoint")
+ public Mono corsEnabledOriginRestrictiveEndpoint() {
+ return Mono.just("CORS enabled endpoint - Origin Restrictive");
+ }
+
+ @CrossOrigin(allowedHeaders = { "Baeldung-Allowed" })
+ @PutMapping("/cors-enabled-header-restrictive-endpoint")
+ public Mono corsEnabledHeaderRestrictiveEndpoint() {
+ return Mono.just("CORS enabled endpoint - Header Restrictive");
+ }
+
+ @CrossOrigin(exposedHeaders = { "Baeldung-Exposed" })
+ @PutMapping("/cors-enabled-exposed-header-endpoint")
+ public Mono corsEnabledExposedHeadersEndpoint() {
+ return Mono.just("CORS enabled endpoint - Exposed Header");
+ }
+
+ @PutMapping("/cors-enabled-mixed-config-endpoint")
+ @CrossOrigin(allowedHeaders = { "Baeldung-Allowed", "Baeldung-Other-Allowed" }, exposedHeaders = { "Baeldung-Allowed", "Baeldung-Exposed" }, maxAge = 3600)
+ public Mono corsEnabledHeaderExposedEndpoint() {
+ return Mono.just("CORS enabled endpoint - Mixed Config");
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/CorsGlobalConfigApplication.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/CorsGlobalConfigApplication.java
new file mode 100644
index 0000000000..8228944569
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/CorsGlobalConfigApplication.java
@@ -0,0 +1,25 @@
+package com.baeldung.reactive.cors.global;
+
+import java.util.Collections;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration;
+import org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration;
+import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
+import org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration;
+
+@SpringBootApplication(exclude = { MongoAutoConfiguration.class,
+ MongoDataAutoConfiguration.class,
+ MongoReactiveDataAutoConfiguration.class,
+ MongoReactiveAutoConfiguration.class }
+)
+public class CorsGlobalConfigApplication {
+
+ public static void main(String[] args) {
+ SpringApplication app = new SpringApplication(CorsGlobalConfigApplication.class);
+ app.setDefaultProperties(Collections.singletonMap("server.port", "8082"));
+ app.run(args);
+ }
+
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/config/CorsGlobalConfiguration.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/config/CorsGlobalConfiguration.java
new file mode 100644
index 0000000000..92cd6ec50a
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/config/CorsGlobalConfiguration.java
@@ -0,0 +1,22 @@
+package com.baeldung.reactive.cors.global.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.reactive.config.CorsRegistry;
+import org.springframework.web.reactive.config.EnableWebFlux;
+import org.springframework.web.reactive.config.WebFluxConfigurer;
+
+@Configuration
+@EnableWebFlux
+public class CorsGlobalConfiguration implements WebFluxConfigurer {
+
+ @Override
+ public void addCorsMappings(CorsRegistry corsRegistry) {
+ corsRegistry.addMapping("/**")
+ .allowedOrigins("http://allowed-origin.com")
+ .allowedMethods("PUT")
+ .allowedHeaders("Baeldung-Allowed", "Baledung-Another-Allowed")
+ .exposedHeaders("Baeldung-Allowed", "Baeldung-Exposed")
+ .maxAge(3600);
+ }
+
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/controllers/FurtherCorsConfigsController.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/controllers/FurtherCorsConfigsController.java
new file mode 100644
index 0000000000..b6341c9af1
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/controllers/FurtherCorsConfigsController.java
@@ -0,0 +1,24 @@
+package com.baeldung.reactive.cors.global.controllers;
+
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import reactor.core.publisher.Mono;
+
+@RestController
+@RequestMapping("/cors-on-global-config-and-more")
+public class FurtherCorsConfigsController {
+
+ @DeleteMapping("/further-mixed-config-endpoint")
+ @CrossOrigin(methods = { RequestMethod.DELETE },
+ allowedHeaders = { "Baeldung-Other-Allowed" },
+ exposedHeaders = { "Baeldung-Other-Exposed" }
+ )
+ public Mono corsEnabledHeaderExposedEndpoint() {
+ return Mono.just("CORS Global Configured + Request Configs.");
+ }
+
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/controllers/RegularRestController.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/controllers/RegularRestController.java
new file mode 100644
index 0000000000..5945cfc9f2
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/controllers/RegularRestController.java
@@ -0,0 +1,23 @@
+package com.baeldung.reactive.cors.global.controllers;
+
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import reactor.core.publisher.Mono;
+
+@RestController
+@RequestMapping("/cors-on-global-config")
+public class RegularRestController {
+
+ @PutMapping("/regular-put-endpoint")
+ public Mono regularPutEndpoint() {
+ return Mono.just("Regular PUT endpoint");
+ }
+
+ @DeleteMapping("/regular-delete-endpoint")
+ public Mono regularDeleteEndpoint() {
+ return Mono.just("Regular DELETE endpoint");
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/functional/handlers/FunctionalHandler.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/functional/handlers/FunctionalHandler.java
new file mode 100644
index 0000000000..e6e32d7cc8
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/functional/handlers/FunctionalHandler.java
@@ -0,0 +1,18 @@
+package com.baeldung.reactive.cors.global.functional.handlers;
+
+import org.springframework.stereotype.Component;
+import org.springframework.web.reactive.function.server.ServerRequest;
+import org.springframework.web.reactive.function.server.ServerResponse;
+
+import reactor.core.publisher.Mono;
+
+@Component
+public class FunctionalHandler {
+
+ public Mono useHandler(final ServerRequest request) {
+ final String responseMessage = "CORS GLOBAL CONFIG IS NOT EFFECTIVE ON FUNCTIONAL ENDPOINTS!!!";
+
+ return ServerResponse.ok()
+ .body(Mono.just(responseMessage), String.class);
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/functional/routers/CorsRouterFunctions.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/functional/routers/CorsRouterFunctions.java
new file mode 100644
index 0000000000..19621a9e97
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/functional/routers/CorsRouterFunctions.java
@@ -0,0 +1,20 @@
+package com.baeldung.reactive.cors.global.functional.routers;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.reactive.function.server.RequestPredicates;
+import org.springframework.web.reactive.function.server.RouterFunction;
+import org.springframework.web.reactive.function.server.RouterFunctions;
+import org.springframework.web.reactive.function.server.ServerResponse;
+
+import com.baeldung.reactive.cors.global.functional.handlers.FunctionalHandler;
+
+@Configuration
+public class CorsRouterFunctions {
+
+ @Bean
+ public RouterFunction responseHeaderRoute(@Autowired FunctionalHandler handler) {
+ return RouterFunctions.route(RequestPredicates.PUT("/global-config-on-functional/cors-disabled-functional-endpoint"), handler::useHandler);
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/webfilter/CorsWebFilterApplication.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/webfilter/CorsWebFilterApplication.java
new file mode 100644
index 0000000000..38140c0d71
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/webfilter/CorsWebFilterApplication.java
@@ -0,0 +1,25 @@
+package com.baeldung.reactive.cors.webfilter;
+
+import java.util.Collections;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration;
+import org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration;
+import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
+import org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration;
+
+@SpringBootApplication(exclude = { MongoAutoConfiguration.class,
+ MongoDataAutoConfiguration.class,
+ MongoReactiveDataAutoConfiguration.class,
+ MongoReactiveAutoConfiguration.class }
+)
+public class CorsWebFilterApplication {
+
+ public static void main(String[] args) {
+ SpringApplication app = new SpringApplication(CorsWebFilterApplication.class);
+ app.setDefaultProperties(Collections.singletonMap("server.port", "8083"));
+ app.run(args);
+ }
+
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/webfilter/config/CorsWebFilterConfig.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/webfilter/config/CorsWebFilterConfig.java
new file mode 100644
index 0000000000..55fbcc2903
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/webfilter/config/CorsWebFilterConfig.java
@@ -0,0 +1,29 @@
+package com.baeldung.reactive.cors.webfilter.config;
+
+import java.util.Arrays;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.reactive.CorsWebFilter;
+import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
+import org.springframework.web.util.pattern.PathPatternParser;
+
+@Configuration
+public class CorsWebFilterConfig {
+
+ @Bean
+ CorsWebFilter corsWebFilter() {
+ CorsConfiguration corsConfig = new CorsConfiguration();
+ corsConfig.setAllowedOrigins(Arrays.asList("http://allowed-origin.com"));
+ corsConfig.setMaxAge(8000L);
+ corsConfig.addAllowedMethod("PUT");
+ corsConfig.addAllowedHeader("Baeldung-Allowed");
+
+ UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
+ source.registerCorsConfiguration("/**", corsConfig);
+
+ return new CorsWebFilter(source);
+ }
+
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/webfilter/controllers/FurtherCorsConfigsController.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/webfilter/controllers/FurtherCorsConfigsController.java
new file mode 100644
index 0000000000..4f9b9bd037
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/webfilter/controllers/FurtherCorsConfigsController.java
@@ -0,0 +1,26 @@
+package com.baeldung.reactive.cors.webfilter.controllers;
+
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import reactor.core.publisher.Mono;
+
+@RestController
+@RequestMapping("/web-filter-and-more-on-annotated")
+public class FurtherCorsConfigsController {
+
+ @DeleteMapping("/further-mixed-config-endpoint")
+ @CrossOrigin(methods = { RequestMethod.DELETE },
+ allowedHeaders = { "Baeldung-Other-Allowed" },
+ exposedHeaders = { "Baeldung-Other-Exposed" }
+ )
+ public Mono corsEnabledHeaderExposedEndpoint() {
+ final String responseMessage = "CORS @CrossOrigin IS NOT EFFECTIVE with WebFilter!!!";
+
+ return Mono.just(responseMessage);
+ }
+
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/webfilter/controllers/RegularRestController.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/webfilter/controllers/RegularRestController.java
new file mode 100644
index 0000000000..6985810aa5
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/webfilter/controllers/RegularRestController.java
@@ -0,0 +1,23 @@
+package com.baeldung.reactive.cors.webfilter.controllers;
+
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import reactor.core.publisher.Mono;
+
+@RestController
+@RequestMapping("/web-filter-on-annotated")
+public class RegularRestController {
+
+ @PutMapping("/regular-put-endpoint")
+ public Mono regularPutEndpoint() {
+ return Mono.just("Regular PUT endpoint");
+ }
+
+ @DeleteMapping("/regular-delete-endpoint")
+ public Mono regularDeleteEndpoint() {
+ return Mono.just("Regular DELETE endpoint");
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/webfilter/functional/handlers/CorsWithWebFilterHandler.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/webfilter/functional/handlers/CorsWithWebFilterHandler.java
new file mode 100644
index 0000000000..04e4602049
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/webfilter/functional/handlers/CorsWithWebFilterHandler.java
@@ -0,0 +1,16 @@
+package com.baeldung.reactive.cors.webfilter.functional.handlers;
+
+import org.springframework.stereotype.Component;
+import org.springframework.web.reactive.function.server.ServerRequest;
+import org.springframework.web.reactive.function.server.ServerResponse;
+
+import reactor.core.publisher.Mono;
+
+@Component
+public class CorsWithWebFilterHandler {
+
+ public Mono useHandler(final ServerRequest request) {
+ return ServerResponse.ok()
+ .body(Mono.just("Functional Endpoint"), String.class);
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/webfilter/functional/routers/CorsWithWebFilterRouterFunctions.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/webfilter/functional/routers/CorsWithWebFilterRouterFunctions.java
new file mode 100644
index 0000000000..a3905bb79f
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/webfilter/functional/routers/CorsWithWebFilterRouterFunctions.java
@@ -0,0 +1,20 @@
+package com.baeldung.reactive.cors.webfilter.functional.routers;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.reactive.function.server.RequestPredicates;
+import org.springframework.web.reactive.function.server.RouterFunction;
+import org.springframework.web.reactive.function.server.RouterFunctions;
+import org.springframework.web.reactive.function.server.ServerResponse;
+
+import com.baeldung.reactive.cors.webfilter.functional.handlers.CorsWithWebFilterHandler;
+
+@Configuration
+public class CorsWithWebFilterRouterFunctions {
+
+ @Bean
+ public RouterFunction responseHeaderRoute(@Autowired CorsWithWebFilterHandler handler) {
+ return RouterFunctions.route(RequestPredicates.PUT("/web-filter-on-functional/functional-endpoint"), handler::useHandler);
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/webflux/Employee.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/webflux/Employee.java
new file mode 100644
index 0000000000..6a03555654
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/webflux/Employee.java
@@ -0,0 +1,17 @@
+package com.baeldung.reactive.webflux;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class Employee {
+
+ private String id;
+ private String name;
+
+ // standard getters and setters
+
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeConfig.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeConfig.java
new file mode 100644
index 0000000000..082be68698
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeConfig.java
@@ -0,0 +1,33 @@
+package com.baeldung.reactive.webflux;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.reactive.HandlerMapping;
+import org.springframework.web.reactive.config.EnableWebFlux;
+import org.springframework.web.reactive.handler.SimpleUrlHandlerMapping;
+import org.springframework.web.reactive.socket.WebSocketHandler;
+import org.springframework.web.reactive.socket.server.support.WebSocketHandlerAdapter;
+
+@Configuration
+@EnableWebFlux
+public class EmployeeConfig {
+
+ @Bean
+ public HandlerMapping handlerMapping() {
+ Map map = new HashMap<>();
+ map.put("/employee-feed", new EmployeeWebSocketHandler());
+
+ SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
+ mapping.setUrlMap(map);
+ mapping.setOrder(10);
+ return mapping;
+ }
+
+ @Bean
+ public WebSocketHandlerAdapter handlerAdapter() {
+ return new WebSocketHandlerAdapter();
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeController.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeController.java
new file mode 100644
index 0000000000..98b16dafab
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeController.java
@@ -0,0 +1,38 @@
+package com.baeldung.reactive.webflux;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+@RestController
+@RequestMapping("/employees")
+public class EmployeeController {
+
+ private EmployeeRepository employeeRepository;
+
+ public EmployeeController(EmployeeRepository employeeRepository) {
+ this.employeeRepository = employeeRepository;
+ }
+
+ @GetMapping("/{id}")
+ private Mono getEmployeeById(@PathVariable String id) {
+ return employeeRepository.findEmployeeById(id);
+ }
+
+ @GetMapping
+ private Flux getAllEmployees() {
+ return employeeRepository.findAllEmployees();
+ }
+
+ @PostMapping("/update")
+ private Mono updateEmployee(@RequestBody Employee employee) {
+ return employeeRepository.updateEmployee(employee);
+ }
+
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeCreationEvent.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeCreationEvent.java
new file mode 100644
index 0000000000..7be088f073
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeCreationEvent.java
@@ -0,0 +1,11 @@
+package com.baeldung.reactive.webflux;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class EmployeeCreationEvent {
+ private String employeeId;
+ private String creationTime;
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeRepository.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeRepository.java
new file mode 100644
index 0000000000..a407c76fa8
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeRepository.java
@@ -0,0 +1,64 @@
+package com.baeldung.reactive.webflux;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.springframework.stereotype.Repository;
+
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+@Repository
+public class EmployeeRepository {
+
+ static Map employeeData;
+
+ static Map employeeAccessData;
+
+ static
+ {
+ employeeData = new HashMap<>();
+ employeeData.put("1",new Employee("1","Employee 1"));
+ employeeData.put("2",new Employee("2","Employee 2"));
+ employeeData.put("3",new Employee("3","Employee 3"));
+ employeeData.put("4",new Employee("4","Employee 4"));
+ employeeData.put("5",new Employee("5","Employee 5"));
+ employeeData.put("6",new Employee("6","Employee 6"));
+ employeeData.put("7",new Employee("7","Employee 7"));
+ employeeData.put("8",new Employee("8","Employee 8"));
+ employeeData.put("9",new Employee("9","Employee 9"));
+ employeeData.put("10",new Employee("10","Employee 10"));
+
+ employeeAccessData=new HashMap<>();
+ employeeAccessData.put("1", "Employee 1 Access Key");
+ employeeAccessData.put("2", "Employee 2 Access Key");
+ employeeAccessData.put("3", "Employee 3 Access Key");
+ employeeAccessData.put("4", "Employee 4 Access Key");
+ employeeAccessData.put("5", "Employee 5 Access Key");
+ employeeAccessData.put("6", "Employee 6 Access Key");
+ employeeAccessData.put("7", "Employee 7 Access Key");
+ employeeAccessData.put("8", "Employee 8 Access Key");
+ employeeAccessData.put("9", "Employee 9 Access Key");
+ employeeAccessData.put("10", "Employee 10 Access Key");
+ }
+
+ public Mono findEmployeeById(String id)
+ {
+ return Mono.just(employeeData.get(id));
+ }
+
+ public Flux findAllEmployees()
+ {
+ return Flux.fromIterable(employeeData.values());
+ }
+
+ public Mono updateEmployee(Employee employee)
+ {
+ Employee existingEmployee=employeeData.get(employee.getId());
+ if(existingEmployee!=null)
+ {
+ existingEmployee.setName(employee.getName());
+ }
+ return Mono.just(existingEmployee);
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeSpringApplication.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeSpringApplication.java
new file mode 100644
index 0000000000..54b23a18de
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeSpringApplication.java
@@ -0,0 +1,17 @@
+package com.baeldung.reactive.webflux;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class EmployeeSpringApplication {
+
+ public static void main(String[] args) {
+
+ SpringApplication.run(EmployeeSpringApplication.class, args);
+
+ EmployeeWebClient employeeWebClient = new EmployeeWebClient();
+ employeeWebClient.consume();
+ }
+
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeWebClient.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeWebClient.java
new file mode 100644
index 0000000000..45d42ecda9
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeWebClient.java
@@ -0,0 +1,28 @@
+package com.baeldung.reactive.webflux;
+
+import org.springframework.web.reactive.function.client.WebClient;
+
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+public class EmployeeWebClient {
+
+ WebClient client = WebClient.create("http://localhost:8080");
+
+ public void consume() {
+
+ Mono employeeMono = client.get()
+ .uri("/employees/{id}", "1")
+ .retrieve()
+ .bodyToMono(Employee.class);
+
+ employeeMono.subscribe(System.out::println);
+
+ Flux employeeFlux = client.get()
+ .uri("/employees")
+ .retrieve()
+ .bodyToFlux(Employee.class);
+
+ employeeFlux.subscribe(System.out::println);
+ }
+}
\ No newline at end of file
diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeWebSecurityConfig.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeWebSecurityConfig.java
new file mode 100644
index 0000000000..7922e6ba44
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeWebSecurityConfig.java
@@ -0,0 +1,38 @@
+package com.baeldung.reactive.webflux;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.http.HttpMethod;
+import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
+import org.springframework.security.config.web.server.ServerHttpSecurity;
+import org.springframework.security.core.userdetails.MapReactiveUserDetailsService;
+import org.springframework.security.core.userdetails.User;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.web.server.SecurityWebFilterChain;
+
+@EnableWebFluxSecurity
+public class EmployeeWebSecurityConfig {
+
+ @Bean
+ public MapReactiveUserDetailsService userDetailsService() {
+ UserDetails user = User.withDefaultPasswordEncoder()
+ .username("admin")
+ .password("password")
+ .roles("ADMIN")
+ .build();
+ return new MapReactiveUserDetailsService(user);
+ }
+
+ @Bean
+ public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
+ http.csrf()
+ .disable()
+ .authorizeExchange()
+ .pathMatchers(HttpMethod.POST, "/employees/update")
+ .hasRole("ADMIN")
+ .pathMatchers("/**")
+ .permitAll()
+ .and()
+ .httpBasic();
+ return http.build();
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeWebSocketClient.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeWebSocketClient.java
new file mode 100644
index 0000000000..4571cadc47
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeWebSocketClient.java
@@ -0,0 +1,21 @@
+package com.baeldung.reactive.webflux;
+
+import java.net.URI;
+
+import org.springframework.web.reactive.socket.WebSocketMessage;
+import org.springframework.web.reactive.socket.client.ReactorNettyWebSocketClient;
+import org.springframework.web.reactive.socket.client.WebSocketClient;
+
+public class EmployeeWebSocketClient {
+
+ public static void main(String[] args) {
+
+ WebSocketClient client = new ReactorNettyWebSocketClient();
+
+ client.execute(URI.create("ws://localhost:8080/employee-feed"), session -> session.receive()
+ .map(WebSocketMessage::getPayloadAsText)
+ .doOnNext(System.out::println)
+ .then())
+ .block(); // to subscribe and return the value
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeWebSocketHandler.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeWebSocketHandler.java
new file mode 100644
index 0000000000..caa2a38b65
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeWebSocketHandler.java
@@ -0,0 +1,39 @@
+package com.baeldung.reactive.webflux;
+
+import static java.time.LocalDateTime.now;
+import static java.util.UUID.randomUUID;
+
+import java.time.Duration;
+
+import org.springframework.stereotype.Component;
+import org.springframework.web.reactive.socket.WebSocketHandler;
+import org.springframework.web.reactive.socket.WebSocketSession;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+@Component
+public class EmployeeWebSocketHandler implements WebSocketHandler {
+
+ ObjectMapper om = new ObjectMapper();
+
+ @Override
+ public Mono handle(WebSocketSession webSocketSession) {
+
+ Flux employeeCreationEvent = Flux.generate(sink -> {
+ EmployeeCreationEvent event = new EmployeeCreationEvent(randomUUID().toString(), now().toString());
+ try {
+ sink.next(om.writeValueAsString(event));
+ } catch (JsonProcessingException e) {
+ sink.error(e);
+ }
+ });
+
+ return webSocketSession.send(employeeCreationEvent
+ .map(webSocketSession::textMessage)
+ .delayElements(Duration.ofSeconds(1)));
+ }
+}
diff --git a/spring-5-reactive/src/test/java/com/baeldung/reactive/cors/CorsOnAnnotatedElementsLiveTest.java b/spring-5-reactive/src/test/java/com/baeldung/reactive/cors/CorsOnAnnotatedElementsLiveTest.java
new file mode 100644
index 0000000000..0043d62e5a
--- /dev/null
+++ b/spring-5-reactive/src/test/java/com/baeldung/reactive/cors/CorsOnAnnotatedElementsLiveTest.java
@@ -0,0 +1,147 @@
+package com.baeldung.reactive.cors;
+
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.reactive.server.WebTestClient;
+import org.springframework.test.web.reactive.server.WebTestClient.ResponseSpec;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CorsOnAnnotatedElementsLiveTest {
+
+ private static final String BASE_URL = "http://localhost:8081";
+ private static final String BASE_CORS_ON_METHODS_URL = "/cors-on-methods";
+ private static final String BASE_CORS_ON_CONTROLLER_URL = "/cors-on-controller";
+ private static final String CONTROLLER_CORS_ALLOWED_ORIGIN = "http://allowed-origin.com";
+ private static final String CORS_DEFAULT_ORIGIN = "http://default-origin.com";
+
+ private static WebTestClient client;
+
+ @BeforeAll
+ public static void setup() {
+ client = WebTestClient.bindToServer()
+ .baseUrl(BASE_URL)
+ .defaultHeader("Origin", CORS_DEFAULT_ORIGIN)
+ .build();
+ }
+
+ @Test
+ public void whenRequestingMethodCorsEnabledEndpoint_thenObtainResponseWithCorsHeaders() {
+ ResponseSpec response = client.put()
+ .uri(BASE_CORS_ON_METHODS_URL + "/cors-enabled-endpoint")
+ .exchange();
+
+ response.expectHeader()
+ .valueEquals("Access-Control-Allow-Origin", "*");
+ }
+
+ @Test
+ public void whenPreflightMethodCorsEnabled_thenObtainResponseWithCorsHeaders() {
+ ResponseSpec response = client.options()
+ .uri(BASE_CORS_ON_METHODS_URL + "/cors-enabled-endpoint")
+ .header("Access-Control-Request-Method", "PUT")
+ .exchange();
+
+ response.expectHeader()
+ .valueEquals("Access-Control-Allow-Origin", "*");
+ response.expectHeader()
+ .valueEquals("Access-Control-Allow-Methods", "PUT");
+ response.expectHeader()
+ .exists("Access-Control-Max-Age");
+ }
+
+ @Test
+ public void whenRequestingMethodCorsDisabledEndpoint_thenObtainResponseWithoutCorsHeaders() {
+ ResponseSpec response = client.put()
+ .uri(BASE_CORS_ON_METHODS_URL + "/cors-disabled-put-endpoint")
+ .exchange();
+
+ response.expectHeader()
+ .doesNotExist("Access-Control-Allow-Origin");
+ }
+
+ @Test
+ public void whenRequestingMethodCorsRestrictiveOrigin_thenObtainForbiddenResponse() {
+ ResponseSpec response = client.put()
+ .uri(BASE_CORS_ON_METHODS_URL + "/cors-enabled-origin-restrictive-endpoint")
+ .exchange();
+
+ response.expectStatus()
+ .isForbidden();
+ }
+
+ @Test
+ public void whenPreflightMethodCorsRestrictiveOrigin_thenObtainForbiddenResponse() {
+ ResponseSpec response = client.options()
+ .uri(BASE_CORS_ON_METHODS_URL + "/cors-enabled-origin-restrictive-endpoint")
+ .header("Access-Control-Request-Method", "PUT")
+ .exchange();
+
+ response.expectStatus()
+ .isForbidden();
+ }
+
+ @Test
+ public void whenPreflightMethodCorsRestrictiveHeader_thenObtainResponseWithAllowedHeaders() {
+ ResponseSpec response = client.options()
+ .uri(BASE_CORS_ON_METHODS_URL + "/cors-enabled-header-restrictive-endpoint")
+ .header("Access-Control-Request-Method", "PUT")
+ .header("Access-Control-Request-Headers", "Baeldung-Not-Allowed, Baeldung-Allowed")
+ .exchange();
+
+ response.expectHeader()
+ .valueEquals("Access-Control-Allow-Headers", "Baeldung-Allowed");
+ }
+
+ @Test
+ public void whenPreflightControllerCorsRegularEndpoint_thenObtainResponseWithCorsHeaders() {
+ ResponseSpec response = client.options()
+ .uri(BASE_CORS_ON_CONTROLLER_URL + "/regular-endpoint")
+ .header("Origin", CONTROLLER_CORS_ALLOWED_ORIGIN)
+ .header("Access-Control-Request-Method", "PUT")
+ .exchange();
+
+ response.expectHeader()
+ .valueEquals("Access-Control-Allow-Origin", CONTROLLER_CORS_ALLOWED_ORIGIN);
+ }
+
+ @Test
+ public void whenPreflightControllerCorsRestrictiveOrigin_thenObtainResponseWithCorsHeaders() {
+ ResponseSpec response = client.options()
+ .uri(BASE_CORS_ON_CONTROLLER_URL + "/cors-enabled-origin-restrictive-endpoint")
+ .header("Origin", CONTROLLER_CORS_ALLOWED_ORIGIN)
+ .header("Access-Control-Request-Method", "PUT")
+ .exchange();
+
+ response.expectHeader()
+ .valueEquals("Access-Control-Allow-Origin", CONTROLLER_CORS_ALLOWED_ORIGIN);
+ }
+
+ @Test
+ public void whenPreflightControllerCorsRestrictiveOriginWithAnotherAllowedOrigin_thenObtainResponseWithCorsHeaders() {
+ final String anotherAllowedOrigin = "http://another-allowed-origin.com";
+ ResponseSpec response = client.options()
+ .uri(BASE_CORS_ON_CONTROLLER_URL + "/cors-enabled-origin-restrictive-endpoint")
+ .header("Origin", anotherAllowedOrigin)
+ .header("Access-Control-Request-Method", "PUT")
+ .exchange();
+
+ response.expectHeader()
+ .valueEquals("Access-Control-Allow-Origin", anotherAllowedOrigin);
+ }
+
+ @Test
+ public void whenPreflightControllerCorsExposingHeaders_thenObtainResponseWithCorsHeaders() {
+ ResponseSpec response = client.options()
+ .uri(BASE_CORS_ON_CONTROLLER_URL + "/cors-enabled-exposed-header-endpoint")
+ .header("Origin", CONTROLLER_CORS_ALLOWED_ORIGIN)
+ .header("Access-Control-Request-Method", "PUT")
+ .exchange();
+
+ response.expectHeader()
+ .valueEquals("Access-Control-Expose-Headers", "Baeldung-Exposed");
+ }
+}
diff --git a/spring-5-reactive/src/test/java/com/baeldung/reactive/cors/CorsOnGlobalConfigLiveTest.java b/spring-5-reactive/src/test/java/com/baeldung/reactive/cors/CorsOnGlobalConfigLiveTest.java
new file mode 100644
index 0000000000..39927af4c3
--- /dev/null
+++ b/spring-5-reactive/src/test/java/com/baeldung/reactive/cors/CorsOnGlobalConfigLiveTest.java
@@ -0,0 +1,99 @@
+package com.baeldung.reactive.cors;
+
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.reactive.server.WebTestClient;
+import org.springframework.test.web.reactive.server.WebTestClient.ResponseSpec;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CorsOnGlobalConfigLiveTest {
+
+ private static final String BASE_URL = "http://localhost:8082";
+ private static final String BASE_REGULAR_URL = "/cors-on-global-config";
+ private static final String BASE_EXTRA_CORS_CONFIG_URL = "/cors-on-global-config-and-more";
+ private static final String BASE_FUNCTIONALS_URL = "/global-config-on-functional";
+ private static final String CORS_DEFAULT_ORIGIN = "http://allowed-origin.com";
+
+ private static WebTestClient client;
+
+ @BeforeAll
+ public static void setup() {
+ client = WebTestClient.bindToServer()
+ .baseUrl(BASE_URL)
+ .defaultHeader("Origin", CORS_DEFAULT_ORIGIN)
+ .build();
+ }
+
+ @Test
+ public void whenRequestingRegularEndpoint_thenObtainResponseWithCorsHeaders() {
+ ResponseSpec response = client.put()
+ .uri(BASE_REGULAR_URL + "/regular-put-endpoint")
+ .exchange();
+
+ response.expectHeader()
+ .valueEquals("Access-Control-Allow-Origin", CORS_DEFAULT_ORIGIN);
+ }
+
+ @Test
+ public void whenRequestingRegularDeleteEndpoint_thenObtainForbiddenResponse() {
+ ResponseSpec response = client.delete()
+ .uri(BASE_REGULAR_URL + "/regular-delete-endpoint")
+ .exchange();
+
+ response.expectStatus()
+ .isForbidden();
+ }
+
+ @Test
+ public void whenPreflightAllowedDeleteEndpoint_thenObtainResponseWithCorsHeaders() {
+ ResponseSpec response = client.options()
+ .uri(BASE_EXTRA_CORS_CONFIG_URL + "/further-mixed-config-endpoint")
+ .header("Access-Control-Request-Method", "DELETE")
+ .header("Access-Control-Request-Headers", "Baeldung-Not-Allowed, Baeldung-Allowed, Baeldung-Other-Allowed")
+ .exchange();
+
+ response.expectHeader()
+ .valueEquals("Access-Control-Allow-Origin", CORS_DEFAULT_ORIGIN);
+ response.expectHeader()
+ .valueEquals("Access-Control-Allow-Methods", "PUT,DELETE");
+ response.expectHeader()
+ .valueEquals("Access-Control-Allow-Headers", "Baeldung-Allowed, Baeldung-Other-Allowed");
+ response.expectHeader()
+ .exists("Access-Control-Max-Age");
+ }
+
+ @Test
+ public void whenRequestAllowedDeleteEndpoint_thenObtainResponseWithCorsHeaders() {
+ ResponseSpec response = client.delete()
+ .uri(BASE_EXTRA_CORS_CONFIG_URL + "/further-mixed-config-endpoint")
+ .exchange();
+
+ response.expectStatus()
+ .isOk();
+ }
+
+ @Test
+ public void whenPreflightFunctionalEndpoint_thenObtain404Response() {
+ ResponseSpec response = client.options()
+ .uri(BASE_FUNCTIONALS_URL + "/cors-disabled-functional-endpoint")
+ .header("Access-Control-Request-Method", "PUT")
+ .exchange();
+
+ response.expectStatus()
+ .isNotFound();
+ }
+
+ @Test
+ public void whenRequestFunctionalEndpoint_thenObtainResponseWithCorsHeaders() {
+ ResponseSpec response = client.put()
+ .uri(BASE_FUNCTIONALS_URL + "/cors-disabled-functional-endpoint")
+ .exchange();
+
+ response.expectHeader()
+ .valueEquals("Access-Control-Allow-Origin", CORS_DEFAULT_ORIGIN);
+ }
+}
diff --git a/spring-5-reactive/src/test/java/com/baeldung/reactive/cors/CorsOnWebFilterLiveTest.java b/spring-5-reactive/src/test/java/com/baeldung/reactive/cors/CorsOnWebFilterLiveTest.java
new file mode 100644
index 0000000000..e5a3c8a99a
--- /dev/null
+++ b/spring-5-reactive/src/test/java/com/baeldung/reactive/cors/CorsOnWebFilterLiveTest.java
@@ -0,0 +1,96 @@
+package com.baeldung.reactive.cors;
+
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.reactive.server.WebTestClient;
+import org.springframework.test.web.reactive.server.WebTestClient.ResponseSpec;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CorsOnWebFilterLiveTest {
+
+ private static final String BASE_URL = "http://localhost:8083";
+ private static final String BASE_REGULAR_URL = "/web-filter-on-annotated";
+ private static final String BASE_EXTRA_CORS_CONFIG_URL = "/web-filter-and-more-on-annotated";
+ private static final String BASE_FUNCTIONALS_URL = "/web-filter-on-functional";
+ private static final String CORS_DEFAULT_ORIGIN = "http://allowed-origin.com";
+
+ private static WebTestClient client;
+
+ @BeforeAll
+ public static void setup() {
+ client = WebTestClient.bindToServer()
+ .baseUrl(BASE_URL)
+ .defaultHeader("Origin", CORS_DEFAULT_ORIGIN)
+ .build();
+ }
+
+ @Test
+ public void whenRequestingRegularEndpoint_thenObtainResponseWithCorsHeaders() {
+ ResponseSpec response = client.put()
+ .uri(BASE_REGULAR_URL + "/regular-put-endpoint")
+ .exchange();
+
+ response.expectHeader()
+ .valueEquals("Access-Control-Allow-Origin", CORS_DEFAULT_ORIGIN);
+ }
+
+ @Test
+ public void whenRequestingRegularDeleteEndpoint_thenObtainForbiddenResponse() {
+ ResponseSpec response = client.delete()
+ .uri(BASE_REGULAR_URL + "/regular-delete-endpoint")
+ .exchange();
+
+ response.expectStatus()
+ .isForbidden();
+ }
+
+ @Test
+ public void whenPreflightDeleteEndpointWithExtraConfigs_thenObtainForbiddenResponse() {
+ ResponseSpec response = client.options()
+ .uri(BASE_EXTRA_CORS_CONFIG_URL + "/further-mixed-config-endpoint")
+ .header("Access-Control-Request-Method", "DELETE")
+ .exchange();
+
+ response.expectStatus()
+ .isForbidden();
+ }
+
+ @Test
+ public void whenRequestDeleteEndpointWithExtraConfigs_thenObtainForbiddenResponse() {
+ ResponseSpec response = client.delete()
+ .uri(BASE_EXTRA_CORS_CONFIG_URL + "/further-mixed-config-endpoint")
+ .exchange();
+
+ response.expectStatus()
+ .isForbidden();
+ }
+
+ @Test
+ public void whenPreflightFunctionalEndpoint_thenObtain404Response() {
+ ResponseSpec response = client.options()
+ .uri(BASE_FUNCTIONALS_URL + "/functional-endpoint")
+ .header("Access-Control-Request-Method", "PUT")
+ .exchange();
+
+ response.expectHeader()
+ .valueEquals("Access-Control-Allow-Origin", CORS_DEFAULT_ORIGIN);
+ response.expectHeader()
+ .valueEquals("Access-Control-Allow-Methods", "PUT");
+ response.expectHeader()
+ .valueEquals("Access-Control-Max-Age", "8000");
+ }
+
+ @Test
+ public void whenRequestFunctionalEndpoint_thenObtainResponseWithCorsHeaders() {
+ ResponseSpec response = client.put()
+ .uri(BASE_FUNCTIONALS_URL + "/functional-endpoint")
+ .exchange();
+
+ response.expectHeader()
+ .valueEquals("Access-Control-Allow-Origin", CORS_DEFAULT_ORIGIN);
+ }
+}
diff --git a/spring-5-reactive/src/test/java/com/baeldung/reactive/webflux/EmployeeControllerUnitTest.java b/spring-5-reactive/src/test/java/com/baeldung/reactive/webflux/EmployeeControllerUnitTest.java
new file mode 100644
index 0000000000..640f28c331
--- /dev/null
+++ b/spring-5-reactive/src/test/java/com/baeldung/reactive/webflux/EmployeeControllerUnitTest.java
@@ -0,0 +1,72 @@
+package com.baeldung.reactive.webflux;
+
+import static org.mockito.BDDMockito.given;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.MethodSorters;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.reactive.server.WebTestClient;
+
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class EmployeeControllerUnitTest {
+
+ @Autowired
+ private WebTestClient testClient;
+
+ @MockBean
+ private EmployeeRepository employeeRepository;
+
+ @Test
+ public void givenEmployeeId_whenGetEmployeeById_thenCorrectEmployee() {
+
+ Employee employee = new Employee("1", "Employee 1 Name");
+
+ given(employeeRepository.findEmployeeById("1")).willReturn(Mono.just(employee));
+ testClient.get()
+ .uri("/employees/1")
+ .exchange()
+ .expectStatus()
+ .isOk()
+ .expectBody(Employee.class)
+ .isEqualTo(employee);
+ }
+
+ @Test
+ public void whenGetAllEmployees_thenCorrectEmployees() {
+
+ List employeeList = new ArrayList<>();
+
+ Employee employee1 = new Employee("1", "Employee 1 Name");
+ Employee employee2 = new Employee("2", "Employee 2 Name");
+ Employee employee3 = new Employee("3", "Employee 3 Name");
+
+ employeeList.add(employee1);
+ employeeList.add(employee2);
+ employeeList.add(employee3);
+
+ Flux employeeFlux = Flux.fromIterable(employeeList);
+
+ given(employeeRepository.findAllEmployees()).willReturn(employeeFlux);
+ testClient.get()
+ .uri("/employees")
+ .exchange()
+ .expectStatus()
+ .isOk()
+ .expectBodyList(Employee.class)
+ .hasSize(3)
+ .isEqualTo(employeeList);
+ }
+}
diff --git a/spring-amqp-simple/src/test/java/broadcast/BroadcastMessageControllerIntegrationTest.java b/spring-amqp-simple/src/test/java/broadcast/BroadcastMessageControllerIntegrationTest.java
deleted file mode 100644
index c3be7f1ede..0000000000
--- a/spring-amqp-simple/src/test/java/broadcast/BroadcastMessageControllerIntegrationTest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package broadcast;
-
-import com.baeldung.springamqpsimple.broadcast.BroadcastConfig;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.amqp.rabbit.core.RabbitTemplate;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
-import org.springframework.boot.test.web.client.TestRestTemplate;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.test.context.ActiveProfiles;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import static org.junit.Assert.*;
-import static org.mockito.Mockito.*;
-import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT;
-
-@RunWith(SpringRunner.class)
-@ActiveProfiles("test")
-@SpringBootTest(webEnvironment = RANDOM_PORT)
-public class BroadcastMessageControllerIntegrationTest {
-
- @Autowired
- private TestRestTemplate restTemplate;
-
- @MockBean
- private RabbitTemplate rabbitTemplate;
-
- @Test
- public void whenPostingMessage_thenMessageIsCreated() {
- final String message = "Hello World!";
- ResponseEntity responseEntity = restTemplate.postForEntity("/broadcast", message, Void.class);
-
- assertEquals(HttpStatus.CREATED, responseEntity.getStatusCode());
- }
-
- @Test
- public void whenPostingMessage_thenMessageIsSentToBroker() {
- final String message = "Hello World!";
- restTemplate.postForEntity("/broadcast", message, Void.class);
-
- verify(rabbitTemplate).convertAndSend(BroadcastConfig.fanoutExchangeName, "", message);
- verify(rabbitTemplate).convertAndSend(BroadcastConfig.topicExchangeName, "user.not-important.info", message);
- verify(rabbitTemplate).convertAndSend(BroadcastConfig.topicExchangeName, "user.important.error", message);
- }
-}
\ No newline at end of file
diff --git a/spring-amqp-simple/src/test/java/com/baeldung/springamqpsimple/MessageControllerIntegrationTest.java b/spring-amqp-simple/src/test/java/com/baeldung/springamqpsimple/MessageControllerIntegrationTest.java
deleted file mode 100644
index a053edaa0e..0000000000
--- a/spring-amqp-simple/src/test/java/com/baeldung/springamqpsimple/MessageControllerIntegrationTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.baeldung.springamqpsimple;
-
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.amqp.rabbit.core.RabbitTemplate;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
-import org.springframework.boot.test.web.client.TestRestTemplate;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.test.context.ActiveProfiles;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.verify;
-import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT;
-
-@RunWith(SpringRunner.class)
-@ActiveProfiles("test")
-@SpringBootTest(webEnvironment = RANDOM_PORT)
-public class MessageControllerIntegrationTest {
-
- @Autowired
- private TestRestTemplate restTemplate;
-
- @MockBean
- private RabbitTemplate rabbitTemplate;
-
- @Test
- public void whenPostingMessage_thenMessageIsCreated() {
- final String message = "Hello World!";
- ResponseEntity responseEntity = restTemplate.postForEntity("/messages", message, Void.class);
-
- assertEquals(HttpStatus.CREATED, responseEntity.getStatusCode());
- }
-
- @Test
- public void whenPostingMessage_thenMessageIsSentToBroker() {
- final String message = "Hello World!";
- restTemplate.postForEntity("/messages", message, Void.class);
-
- verify(rabbitTemplate).convertAndSend(SpringAmqpConfig.queueName, message);
- }
-}
\ No newline at end of file
diff --git a/spring-boot-persistence/src/main/java/com/baeldung/domain/Article.java b/spring-boot-persistence/src/main/java/com/baeldung/domain/Article.java
new file mode 100644
index 0000000000..3b5a8be088
--- /dev/null
+++ b/spring-boot-persistence/src/main/java/com/baeldung/domain/Article.java
@@ -0,0 +1,23 @@
+package com.baeldung.domain;
+
+import javax.persistence.*;
+import java.util.Date;
+
+@Entity
+public class Article {
+
+ @Id
+ @GeneratedValue
+ private Integer id;
+ @Temporal(TemporalType.DATE)
+ private Date publicationDate;
+ @Temporal(TemporalType.TIME)
+ private Date publicationTime;
+ @Temporal(TemporalType.TIMESTAMP)
+ private Date creationDateTime;
+
+ public Integer getId() {
+ return id;
+ }
+
+}
diff --git a/spring-boot-persistence/src/main/java/com/baeldung/repository/ArticleRepository.java b/spring-boot-persistence/src/main/java/com/baeldung/repository/ArticleRepository.java
new file mode 100644
index 0000000000..4e1b109430
--- /dev/null
+++ b/spring-boot-persistence/src/main/java/com/baeldung/repository/ArticleRepository.java
@@ -0,0 +1,22 @@
+package com.baeldung.repository;
+
+import com.baeldung.domain.Article;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+import java.util.Date;
+import java.util.List;
+
+public interface ArticleRepository extends JpaRepository {
+
+ List findAllByPublicationDate(Date publicationDate);
+
+ List findAllByPublicationTimeBetween(Date publicationTimeStart,
+ Date publicationTimeEnd);
+
+ @Query("select a from Article a where a.creationDateTime <= :creationDateTime")
+ List findAllWithCreationDateTimeBefore(
+ @Param("creationDateTime") Date creationDateTime);
+
+}
diff --git a/spring-boot-persistence/src/test/java/com/baeldung/repository/ArticleRepositoryIntegrationTest.java b/spring-boot-persistence/src/test/java/com/baeldung/repository/ArticleRepositoryIntegrationTest.java
new file mode 100644
index 0000000000..7d531d1461
--- /dev/null
+++ b/spring-boot-persistence/src/test/java/com/baeldung/repository/ArticleRepositoryIntegrationTest.java
@@ -0,0 +1,66 @@
+package com.baeldung.repository;
+
+import com.baeldung.domain.Article;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+@RunWith(SpringRunner.class)
+@DataJpaTest
+public class ArticleRepositoryIntegrationTest {
+
+ @Autowired
+ private ArticleRepository repository;
+
+ @Test
+ public void givenImportedArticlesWhenFindAllByPublicationDateThenArticles1And2Returned()
+ throws Exception {
+ List result = repository.findAllByPublicationDate(
+ new SimpleDateFormat("yyyy-MM-dd").parse("2018-01-01")
+ );
+
+ assertEquals(2, result.size());
+ assertTrue(result.stream()
+ .map(Article::getId)
+ .allMatch(id -> Arrays.asList(1, 2).contains(id))
+ );
+ }
+
+ @Test
+ public void givenImportedArticlesWhenFindAllByPublicationTimeBetweenThenArticles2And3Returned()
+ throws Exception {
+ List result = repository.findAllByPublicationTimeBetween(
+ new SimpleDateFormat("HH:mm").parse("15:15"),
+ new SimpleDateFormat("HH:mm").parse("16:30")
+ );
+
+ assertEquals(2, result.size());
+ assertTrue(result.stream()
+ .map(Article::getId)
+ .allMatch(id -> Arrays.asList(2, 3).contains(id))
+ );
+ }
+
+ @Test
+ public void givenImportedArticlesWhenFindAllWithCreationDateTimeBeforeThenArticles2And3Returned() throws Exception {
+ List result = repository.findAllWithCreationDateTimeBefore(
+ new SimpleDateFormat("yyyy-MM-dd HH:mm").parse("2017-12-15 10:00")
+ );
+
+ assertEquals(2, result.size());
+ assertTrue(result.stream()
+ .map(Article::getId)
+ .allMatch(id -> Arrays.asList(2, 3).contains(id))
+ );
+ }
+
+}
diff --git a/spring-boot-persistence/src/test/resources/application.properties b/spring-boot-persistence/src/test/resources/application.properties
index a5c1d983cf..a5d09db840 100644
--- a/spring-boot-persistence/src/test/resources/application.properties
+++ b/spring-boot-persistence/src/test/resources/application.properties
@@ -13,4 +13,4 @@ hibernate.cache.use_query_cache=true
hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory
spring.jpa.properties.hibernate.hbm2ddl.import_files=migrated_users.sql
-spring.datasource.data=import_*_users.sql
\ No newline at end of file
+spring.datasource.data=import_*_users.sql,import_articles.sql
\ No newline at end of file
diff --git a/spring-boot-persistence/src/test/resources/import_articles.sql b/spring-boot-persistence/src/test/resources/import_articles.sql
new file mode 100644
index 0000000000..4fe18bf4aa
--- /dev/null
+++ b/spring-boot-persistence/src/test/resources/import_articles.sql
@@ -0,0 +1,3 @@
+insert into Article(id, publication_date, publication_time, creation_date_time) values(1, TO_DATE('01/01/2018', 'DD/MM/YYYY'), TO_DATE('15:00', 'HH24:MI'), TO_DATE('31/12/2017 07:30', 'DD/MM/YYYY HH24:MI'));
+insert into Article(id, publication_date, publication_time, creation_date_time) values(2, TO_DATE('01/01/2018', 'DD/MM/YYYY'), TO_DATE('15:30', 'HH24:MI'), TO_DATE('15/12/2017 08:00', 'DD/MM/YYYY HH24:MI'));
+insert into Article(id, publication_date, publication_time, creation_date_time) values(3, TO_DATE('15/12/2017', 'DD/MM/YYYY'), TO_DATE('16:00', 'HH24:MI'), TO_DATE('01/12/2017 13:45', 'DD/MM/YYYY HH24:MI'));
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-bootstrap/README.MD b/spring-cloud/spring-cloud-bootstrap/README.MD
index 164219c185..5185200469 100644
--- a/spring-cloud/spring-cloud-bootstrap/README.MD
+++ b/spring-cloud/spring-cloud-bootstrap/README.MD
@@ -11,5 +11,5 @@
- git add .
- git commit -m "First commit"
- start the config server
- - start the discover server
+ - start the discovery server
- start all the other servers in any order (gateway, svc-book, svc-rating, zipkin)
diff --git a/spring-data-5-reactive/pom.xml b/spring-data-5-reactive/pom.xml
index b2a317878f..bcf37f1da4 100644
--- a/spring-data-5-reactive/pom.xml
+++ b/spring-data-5-reactive/pom.xml
@@ -6,8 +6,6 @@
spring-5-data-reactive
0.0.1-SNAPSHOT
jar
- Spring-5-data-reactive
- Spring-5-data-reactive with Springboot 2.0.1
org.springframework.boot
diff --git a/spring-data-rest/pom.xml b/spring-data-rest/pom.xml
index f8cd630ea1..a756ef0497 100644
--- a/spring-data-rest/pom.xml
+++ b/spring-data-rest/pom.xml
@@ -6,7 +6,7 @@
spring-data-rest
1.0
jar
- intro-spring-data-rest
+ spring-data-rest
Intro to Spring Data REST
diff --git a/spring-data-rest/src/test/java/com/baeldung/relationships/SpringDataRelationshipsIntegrationTest.java b/spring-data-rest/src/test/java/com/baeldung/relationships/SpringDataRelationshipsIntegrationTest.java
deleted file mode 100644
index 196dc18d9e..0000000000
--- a/spring-data-rest/src/test/java/com/baeldung/relationships/SpringDataRelationshipsIntegrationTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package com.baeldung.relationships;
-
-import static org.junit.Assert.assertEquals;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
-import org.springframework.boot.test.web.client.TestRestTemplate;
-import org.springframework.http.HttpEntity;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpMethod;
-import org.springframework.http.ResponseEntity;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import com.baeldung.SpringDataRestApplication;
-import com.baeldung.models.Address;
-import com.baeldung.models.Author;
-import com.baeldung.models.Book;
-import com.baeldung.models.Library;
-
-@RunWith(SpringRunner.class)
-@SpringBootTest(classes = SpringDataRestApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT)
-public class SpringDataRelationshipsIntegrationTest {
-
- @Autowired
- private TestRestTemplate template;
-
- @Value("${local.server.port}")
- private int port;
-
- private static final String BOOK_ENDPOINT = "http://localhost:%s/books/";
- private static final String AUTHOR_ENDPOINT = "http://localhost:%s/authors/";
- private static final String ADDRESS_ENDPOINT = "http://localhost:%s/addresses/";
- private static final String LIBRARY_ENDPOINT = "http://localhost:%s/libraries/";
-
- private static final String LIBRARY_NAME = "My Library";
- private static final String AUTHOR_NAME = "George Orwell";
-
- @Test
- public void whenSaveOneToOneRelationship_thenCorrect() throws JSONException {
- Library library = new Library(LIBRARY_NAME);
- template.postForEntity(String.format(LIBRARY_ENDPOINT, port), library, Library.class);
-
- Address address = new Address("Main street, nr 1");
- template.postForEntity(String.format(ADDRESS_ENDPOINT, port), address, Address.class);
-
- HttpHeaders requestHeaders = new HttpHeaders();
- requestHeaders.add("Content-type", "text/uri-list");
- HttpEntity httpEntity = new HttpEntity<>(String.format(ADDRESS_ENDPOINT, port) + "/1", requestHeaders);
- template.exchange(String.format(LIBRARY_ENDPOINT, port) + "/1/libraryAddress", HttpMethod.PUT, httpEntity, String.class);
-
- ResponseEntity libraryGetResponse = template.getForEntity(String.format(ADDRESS_ENDPOINT, port) + "/1/library", Library.class);
- assertEquals("library is incorrect", libraryGetResponse.getBody()
- .getName(), LIBRARY_NAME);
- }
-
- @Test
- public void whenSaveOneToManyRelationship_thenCorrect() throws JSONException{
- Library library = new Library(LIBRARY_NAME);
- template.postForEntity(String.format(LIBRARY_ENDPOINT, port), library, Library.class);
-
- Book book1 = new Book("Dune");
- template.postForEntity(String.format(BOOK_ENDPOINT, port), book1, Book.class);
-
- Book book2 = new Book("1984");
- template.postForEntity(String.format(BOOK_ENDPOINT, port), book2, Book.class);
-
- HttpHeaders requestHeaders = new HttpHeaders();
- requestHeaders.add("Content-type", "text/uri-list");
- HttpEntity bookHttpEntity = new HttpEntity<>(String.format(LIBRARY_ENDPOINT, port) + "/1", requestHeaders);
- template.exchange(String.format(BOOK_ENDPOINT, port) + "/1/library", HttpMethod.PUT, bookHttpEntity, String.class);
- template.exchange(String.format(BOOK_ENDPOINT, port) + "/2/library", HttpMethod.PUT, bookHttpEntity, String.class);
-
- ResponseEntity libraryGetResponse = template.getForEntity(String.format(BOOK_ENDPOINT, port) + "/1/library", Library.class);
- assertEquals("library is incorrect", libraryGetResponse.getBody()
- .getName(), LIBRARY_NAME);
- }
-
- @Test
- public void whenSaveManyToManyRelationship_thenCorrect() throws JSONException{
- Author author1 = new Author(AUTHOR_NAME);
- template.postForEntity(String.format(AUTHOR_ENDPOINT, port), author1, Author.class);
-
- Book book1 = new Book("Animal Farm");
- template.postForEntity(String.format(BOOK_ENDPOINT, port), book1, Book.class);
-
- Book book2 = new Book("1984");
- template.postForEntity(String.format(BOOK_ENDPOINT, port), book2, Book.class);
-
- HttpHeaders requestHeaders = new HttpHeaders();
- requestHeaders.add("Content-type", "text/uri-list");
- HttpEntity httpEntity = new HttpEntity<>(String.format(BOOK_ENDPOINT, port) + "/1\n" + String.format(BOOK_ENDPOINT, port) + "/2", requestHeaders);
- template.exchange(String.format(AUTHOR_ENDPOINT, port) + "/1/books", HttpMethod.PUT, httpEntity, String.class);
-
- String jsonResponse = template.getForObject(String.format(BOOK_ENDPOINT, port) + "/1/authors", String.class);
- JSONObject jsonObj = new JSONObject(jsonResponse).getJSONObject("_embedded");
- JSONArray jsonArray = jsonObj.getJSONArray("authors");
- assertEquals("author is incorrect", jsonArray.getJSONObject(0)
- .getString("name"), AUTHOR_NAME);
- }
-}
diff --git a/spring-hibernate4/pom.xml b/spring-hibernate4/pom.xml
index 08533350d2..505a218a94 100644
--- a/spring-hibernate4/pom.xml
+++ b/spring-hibernate4/pom.xml
@@ -127,6 +127,12 @@
${hsqldb.version}
test
+
+ com.h2database
+ h2
+ ${h2.version}
+ test
+
@@ -153,6 +159,7 @@
8.5.8
1.1
2.3.4
+ 1.4.193
5.3.3.Final
diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/UserEager.java b/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/UserEager.java
index 2559d5f048..9fda4c43bb 100644
--- a/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/UserEager.java
+++ b/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/UserEager.java
@@ -16,7 +16,7 @@ public class UserEager implements Serializable {
@Column(name = "USER_ID")
private Long userId;
- @OneToMany(fetch = FetchType.EAGER, mappedBy = "user")
+ @OneToMany(fetch = FetchType.EAGER)
private Set orderDetail = new HashSet();
public UserEager() {
diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/UserLazy.java b/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/UserLazy.java
index 5852e74418..a78eaa4ac0 100644
--- a/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/UserLazy.java
+++ b/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/UserLazy.java
@@ -16,7 +16,7 @@ public class UserLazy implements Serializable {
@Column(name = "USER_ID")
private Long userId;
- @OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
+ @OneToMany(fetch = FetchType.LAZY)
private Set orderDetail = new HashSet();
public UserLazy() {
diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/view/FetchingAppView.java b/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/view/FetchingAppView.java
index 1a5142c5c2..35cdd254e3 100644
--- a/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/view/FetchingAppView.java
+++ b/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/view/FetchingAppView.java
@@ -20,7 +20,7 @@ public class FetchingAppView {
public Set lazyLoaded() {
final Session sessionLazy = HibernateUtil.getHibernateSession("lazy");
List users = sessionLazy.createQuery("From UserLazy").list();
- UserLazy userLazyLoaded = users.get(3);
+ UserLazy userLazyLoaded = users.get(0);
// since data is lazyloaded so data won't be initialized
return (userLazyLoaded.getOrderDetail());
}
@@ -31,7 +31,7 @@ public class FetchingAppView {
// data should be loaded in the following line
// also note the queries generated
List user = sessionEager.createQuery("From UserEager").list();
- UserEager userEagerLoaded = user.get(3);
+ UserEager userEagerLoaded = user.get(0);
return userEagerLoaded.getOrderDetail();
}
diff --git a/spring-hibernate4/src/test/java/com/baeldung/persistence/audit/EnversFooBarAuditIntegrationTest.java b/spring-hibernate4/src/test/java/com/baeldung/persistence/audit/EnversFooBarAuditIntegrationTest.java
index ed2e111c8f..2f23a9a532 100644
--- a/spring-hibernate4/src/test/java/com/baeldung/persistence/audit/EnversFooBarAuditIntegrationTest.java
+++ b/spring-hibernate4/src/test/java/com/baeldung/persistence/audit/EnversFooBarAuditIntegrationTest.java
@@ -5,11 +5,6 @@ import static org.junit.Assert.assertNotNull;
import java.util.List;
-import com.baeldung.persistence.model.Foo;
-import com.baeldung.persistence.service.IBarAuditableService;
-import com.baeldung.persistence.service.IFooAuditableService;
-import com.baeldung.spring.PersistenceConfig;
-import com.baeldung.persistence.model.Bar;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.junit.After;
@@ -26,8 +21,14 @@ import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
+import com.baeldung.persistence.model.Bar;
+import com.baeldung.persistence.model.Foo;
+import com.baeldung.persistence.service.IBarAuditableService;
+import com.baeldung.persistence.service.IFooAuditableService;
+import com.baeldung.spring.config.PersistenceTestConfig;
+
@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration(classes = { PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class)
+@ContextConfiguration(classes = { PersistenceTestConfig.class }, loader = AnnotationConfigContextLoader.class)
public class EnversFooBarAuditIntegrationTest {
private static Logger logger = LoggerFactory.getLogger(EnversFooBarAuditIntegrationTest.class);
diff --git a/spring-hibernate4/src/test/java/com/baeldung/persistence/audit/JPABarAuditIntegrationTest.java b/spring-hibernate4/src/test/java/com/baeldung/persistence/audit/JPABarAuditIntegrationTest.java
index b63a4b989b..733074a6a3 100644
--- a/spring-hibernate4/src/test/java/com/baeldung/persistence/audit/JPABarAuditIntegrationTest.java
+++ b/spring-hibernate4/src/test/java/com/baeldung/persistence/audit/JPABarAuditIntegrationTest.java
@@ -7,10 +7,6 @@ import static org.junit.Assert.assertTrue;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
-import com.baeldung.persistence.model.Bar;
-import com.baeldung.persistence.model.Bar.OPERATION;
-import com.baeldung.persistence.service.IBarService;
-import com.baeldung.spring.PersistenceConfig;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
@@ -25,8 +21,13 @@ import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
+import com.baeldung.persistence.model.Bar;
+import com.baeldung.persistence.model.Bar.OPERATION;
+import com.baeldung.persistence.service.IBarService;
+import com.baeldung.spring.config.PersistenceTestConfig;
+
@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration(classes = { PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class)
+@ContextConfiguration(classes = { PersistenceTestConfig.class }, loader = AnnotationConfigContextLoader.class)
public class JPABarAuditIntegrationTest {
private static Logger logger = LoggerFactory.getLogger(JPABarAuditIntegrationTest.class);
diff --git a/spring-hibernate4/src/test/java/com/baeldung/persistence/audit/SpringDataJPABarAuditIntegrationTest.java b/spring-hibernate4/src/test/java/com/baeldung/persistence/audit/SpringDataJPABarAuditIntegrationTest.java
index e794b282f6..18227abd28 100644
--- a/spring-hibernate4/src/test/java/com/baeldung/persistence/audit/SpringDataJPABarAuditIntegrationTest.java
+++ b/spring-hibernate4/src/test/java/com/baeldung/persistence/audit/SpringDataJPABarAuditIntegrationTest.java
@@ -6,9 +6,6 @@ import static org.junit.Assert.assertTrue;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
-import com.baeldung.persistence.model.Bar;
-import com.baeldung.persistence.service.IBarService;
-import com.baeldung.spring.PersistenceConfig;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
@@ -24,8 +21,12 @@ import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
+import com.baeldung.persistence.model.Bar;
+import com.baeldung.persistence.service.IBarService;
+import com.baeldung.spring.config.PersistenceTestConfig;
+
@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration(classes = { PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class)
+@ContextConfiguration(classes = { PersistenceTestConfig.class }, loader = AnnotationConfigContextLoader.class)
public class SpringDataJPABarAuditIntegrationTest {
private static Logger logger = LoggerFactory.getLogger(SpringDataJPABarAuditIntegrationTest.class);
diff --git a/spring-hibernate4/src/test/java/com/baeldung/persistence/hibernate/FooPaginationPersistenceIntegrationTest.java b/spring-hibernate4/src/test/java/com/baeldung/persistence/hibernate/FooPaginationPersistenceIntegrationTest.java
index 721b20db68..fd7bc4aabf 100644
--- a/spring-hibernate4/src/test/java/com/baeldung/persistence/hibernate/FooPaginationPersistenceIntegrationTest.java
+++ b/spring-hibernate4/src/test/java/com/baeldung/persistence/hibernate/FooPaginationPersistenceIntegrationTest.java
@@ -7,9 +7,6 @@ import static org.junit.Assert.assertThat;
import java.util.List;
-import com.baeldung.persistence.model.Foo;
-import com.baeldung.persistence.service.IFooService;
-import com.baeldung.spring.PersistenceConfig;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.ScrollMode;
@@ -26,10 +23,13 @@ import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
+import com.baeldung.persistence.model.Foo;
+import com.baeldung.persistence.service.IFooService;
+import com.baeldung.spring.config.PersistenceTestConfig;
import com.google.common.collect.Lists;
@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration(classes = { PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class)
+@ContextConfiguration(classes = { PersistenceTestConfig.class }, loader = AnnotationConfigContextLoader.class)
public class FooPaginationPersistenceIntegrationTest {
@Autowired
diff --git a/spring-hibernate4/src/test/java/com/baeldung/persistence/hibernate/FooSortingPersistenceIntegrationTest.java b/spring-hibernate4/src/test/java/com/baeldung/persistence/hibernate/FooSortingPersistenceIntegrationTest.java
index 0f76526960..8173088af0 100644
--- a/spring-hibernate4/src/test/java/com/baeldung/persistence/hibernate/FooSortingPersistenceIntegrationTest.java
+++ b/spring-hibernate4/src/test/java/com/baeldung/persistence/hibernate/FooSortingPersistenceIntegrationTest.java
@@ -5,9 +5,6 @@ import static org.junit.Assert.assertNull;
import java.util.List;
import java.util.Set;
-import com.baeldung.persistence.model.Bar;
-import com.baeldung.persistence.model.Foo;
-import com.baeldung.spring.PersistenceConfig;
import org.hibernate.Criteria;
import org.hibernate.NullPrecedence;
import org.hibernate.Query;
@@ -23,8 +20,12 @@ import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
+import com.baeldung.persistence.model.Bar;
+import com.baeldung.persistence.model.Foo;
+import com.baeldung.spring.config.PersistenceTestConfig;
+
@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration(classes = { PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class)
+@ContextConfiguration(classes = { PersistenceTestConfig.class }, loader = AnnotationConfigContextLoader.class)
@SuppressWarnings("unchecked")
public class FooSortingPersistenceIntegrationTest {
diff --git a/spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooServiceBasicPersistenceIntegrationTest.java b/spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooServiceBasicPersistenceIntegrationTest.java
index c77f5dfb95..146f8e9622 100644
--- a/spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooServiceBasicPersistenceIntegrationTest.java
+++ b/spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooServiceBasicPersistenceIntegrationTest.java
@@ -2,8 +2,6 @@ package com.baeldung.persistence.service;
import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
-import com.baeldung.persistence.model.Foo;
-import com.baeldung.spring.PersistenceConfig;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.junit.After;
@@ -15,8 +13,11 @@ import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
+import com.baeldung.persistence.model.Foo;
+import com.baeldung.spring.config.PersistenceTestConfig;
+
@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration(classes = { PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class)
+@ContextConfiguration(classes = { PersistenceTestConfig.class }, loader = AnnotationConfigContextLoader.class)
public class FooServiceBasicPersistenceIntegrationTest {
@Autowired
diff --git a/spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java b/spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java
index b82d4621ab..6d426849a6 100644
--- a/spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java
+++ b/spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java
@@ -2,8 +2,6 @@ package com.baeldung.persistence.service;
import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
-import com.baeldung.persistence.model.Foo;
-import com.baeldung.spring.PersistenceConfig;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -16,8 +14,11 @@ import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
+import com.baeldung.persistence.model.Foo;
+import com.baeldung.spring.config.PersistenceTestConfig;
+
@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration(classes = { PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class)
+@ContextConfiguration(classes = { PersistenceTestConfig.class }, loader = AnnotationConfigContextLoader.class)
public class FooServicePersistenceIntegrationTest {
@Autowired
diff --git a/spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooStoredProceduresIntegrationTest.java b/spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooStoredProceduresLiveTest.java
similarity index 95%
rename from spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooStoredProceduresIntegrationTest.java
rename to spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooStoredProceduresLiveTest.java
index db64107405..9ec04d297c 100644
--- a/spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooStoredProceduresIntegrationTest.java
+++ b/spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooStoredProceduresLiveTest.java
@@ -26,9 +26,9 @@ import com.baeldung.spring.PersistenceConfig;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class)
-public class FooStoredProceduresIntegrationTest {
+public class FooStoredProceduresLiveTest {
- private static final Logger LOGGER = LoggerFactory.getLogger(FooStoredProceduresIntegrationTest.class);
+ private static final Logger LOGGER = LoggerFactory.getLogger(FooStoredProceduresLiveTest.class);
@Autowired
private SessionFactory sessionFactory;
diff --git a/spring-hibernate4/src/test/java/com/baeldung/persistence/service/ParentServicePersistenceIntegrationTest.java b/spring-hibernate4/src/test/java/com/baeldung/persistence/service/ParentServicePersistenceIntegrationTest.java
index 9e8c4aba92..5a73e39ca2 100644
--- a/spring-hibernate4/src/test/java/com/baeldung/persistence/service/ParentServicePersistenceIntegrationTest.java
+++ b/spring-hibernate4/src/test/java/com/baeldung/persistence/service/ParentServicePersistenceIntegrationTest.java
@@ -1,8 +1,5 @@
package com.baeldung.persistence.service;
-import com.baeldung.persistence.model.Child;
-import com.baeldung.persistence.model.Parent;
-import com.baeldung.spring.PersistenceConfig;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
@@ -11,8 +8,12 @@ import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
+import com.baeldung.persistence.model.Child;
+import com.baeldung.persistence.model.Parent;
+import com.baeldung.spring.config.PersistenceTestConfig;
+
@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration(classes = { PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class)
+@ContextConfiguration(classes = { PersistenceTestConfig.class }, loader = AnnotationConfigContextLoader.class)
public class ParentServicePersistenceIntegrationTest {
@Autowired
diff --git a/spring-hibernate4/src/test/java/com/baeldung/spring/config/PersistenceTestConfig.java b/spring-hibernate4/src/test/java/com/baeldung/spring/config/PersistenceTestConfig.java
new file mode 100644
index 0000000000..9bf55c902a
--- /dev/null
+++ b/spring-hibernate4/src/test/java/com/baeldung/spring/config/PersistenceTestConfig.java
@@ -0,0 +1,179 @@
+package com.baeldung.spring.config;
+
+import java.util.Properties;
+
+import javax.sql.DataSource;
+
+import org.apache.tomcat.dbcp.dbcp2.BasicDataSource;
+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.dao.annotation.PersistenceExceptionTranslationPostProcessor;
+import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.orm.hibernate4.HibernateTransactionManager;
+import org.springframework.orm.hibernate4.LocalSessionFactoryBean;
+import org.springframework.orm.jpa.JpaTransactionManager;
+import org.springframework.orm.jpa.JpaVendorAdapter;
+import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
+import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+import com.baeldung.persistence.dao.IBarAuditableDao;
+import com.baeldung.persistence.dao.IBarDao;
+import com.baeldung.persistence.dao.IFooAuditableDao;
+import com.baeldung.persistence.dao.IFooDao;
+import com.baeldung.persistence.dao.impl.BarAuditableDao;
+import com.baeldung.persistence.dao.impl.BarDao;
+import com.baeldung.persistence.dao.impl.BarJpaDao;
+import com.baeldung.persistence.dao.impl.FooAuditableDao;
+import com.baeldung.persistence.dao.impl.FooDao;
+import com.baeldung.persistence.service.IBarAuditableService;
+import com.baeldung.persistence.service.IBarService;
+import com.baeldung.persistence.service.IFooAuditableService;
+import com.baeldung.persistence.service.IFooService;
+import com.baeldung.persistence.service.impl.BarAuditableService;
+import com.baeldung.persistence.service.impl.BarJpaService;
+import com.baeldung.persistence.service.impl.BarSpringDataJpaService;
+import com.baeldung.persistence.service.impl.FooAuditableService;
+import com.baeldung.persistence.service.impl.FooService;
+import com.google.common.base.Preconditions;
+
+@Configuration
+@EnableTransactionManagement
+@EnableJpaRepositories(basePackages = { "com.baeldung.persistence" }, transactionManagerRef = "jpaTransactionManager")
+@EnableJpaAuditing
+@PropertySource({ "classpath:persistence-h2.properties" })
+@ComponentScan({ "com.baeldung.persistence" })
+public class PersistenceTestConfig {
+
+ @Autowired
+ private Environment env;
+
+ public PersistenceTestConfig() {
+ super();
+ }
+
+ @Bean
+ public LocalSessionFactoryBean sessionFactory() {
+ final LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
+ sessionFactory.setDataSource(restDataSource());
+ sessionFactory.setPackagesToScan(new String[] { "com.baeldung.persistence.model" });
+ sessionFactory.setHibernateProperties(hibernateProperties());
+
+ return sessionFactory;
+ }
+
+ @Bean
+ public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
+ final LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
+ emf.setDataSource(restDataSource());
+ emf.setPackagesToScan(new String[] { "com.baeldung.persistence.model" });
+
+ final JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
+ emf.setJpaVendorAdapter(vendorAdapter);
+ emf.setJpaProperties(hibernateProperties());
+
+ return emf;
+ }
+
+ @Bean
+ public DataSource restDataSource() {
+ final BasicDataSource dataSource = new BasicDataSource();
+ dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("jdbc.driverClassName")));
+ dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("jdbc.url")));
+ dataSource.setUsername(Preconditions.checkNotNull(env.getProperty("jdbc.user")));
+ dataSource.setPassword(Preconditions.checkNotNull(env.getProperty("jdbc.pass")));
+
+ return dataSource;
+ }
+
+ @Bean
+ public PlatformTransactionManager hibernateTransactionManager() {
+ final HibernateTransactionManager transactionManager = new HibernateTransactionManager();
+ transactionManager.setSessionFactory(sessionFactory().getObject());
+ return transactionManager;
+ }
+
+ @Bean
+ public PlatformTransactionManager jpaTransactionManager() {
+ final JpaTransactionManager transactionManager = new JpaTransactionManager();
+ transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
+ return transactionManager;
+ }
+
+ @Bean
+ public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
+ return new PersistenceExceptionTranslationPostProcessor();
+ }
+
+ @Bean
+ public IBarService barJpaService() {
+ return new BarJpaService();
+ }
+
+ @Bean
+ public IBarService barSpringDataJpaService() {
+ return new BarSpringDataJpaService();
+ }
+
+ @Bean
+ public IFooService fooHibernateService() {
+ return new FooService();
+ }
+
+ @Bean
+ public IBarAuditableService barHibernateAuditableService() {
+ return new BarAuditableService();
+ }
+
+ @Bean
+ public IFooAuditableService fooHibernateAuditableService() {
+ return new FooAuditableService();
+ }
+
+ @Bean
+ public IBarDao barJpaDao() {
+ return new BarJpaDao();
+ }
+
+ @Bean
+ public IBarDao barHibernateDao() {
+ return new BarDao();
+ }
+
+ @Bean
+ public IBarAuditableDao barHibernateAuditableDao() {
+ return new BarAuditableDao();
+ }
+
+ @Bean
+ public IFooDao fooHibernateDao() {
+ return new FooDao();
+ }
+
+ @Bean
+ public IFooAuditableDao fooHibernateAuditableDao() {
+ return new FooAuditableDao();
+ }
+
+ private final Properties hibernateProperties() {
+ final Properties hibernateProperties = new Properties();
+ hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
+ hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect"));
+
+ hibernateProperties.setProperty("hibernate.show_sql", "true");
+ // hibernateProperties.setProperty("hibernate.format_sql", "true");
+ // hibernateProperties.setProperty("hibernate.globally_quoted_identifiers", "true");
+
+ // Envers properties
+ hibernateProperties.setProperty("org.hibernate.envers.audit_table_suffix", env.getProperty("envers.audit_table_suffix"));
+
+ return hibernateProperties;
+ }
+
+}
\ No newline at end of file
diff --git a/spring-hibernate4/src/test/resources/criteria.cfg.xml b/spring-hibernate4/src/test/resources/criteria.cfg.xml
index 653b5a188a..726e9acb3f 100644
--- a/spring-hibernate4/src/test/resources/criteria.cfg.xml
+++ b/spring-hibernate4/src/test/resources/criteria.cfg.xml
@@ -5,11 +5,12 @@
- com.mysql.jdbc.Driver
- jdbc:mysql://localhost:3306/test
- root
- iamtheking
- org.hibernate.dialect.MySQLDialect
+ org.h2.Driver
+ jdbc:h2:mem:testdb
+ sa
+
+ org.hibernate.dialect.H2Dialect
+ update
true
diff --git a/spring-hibernate4/src/test/resources/fetching.cfg.xml b/spring-hibernate4/src/test/resources/fetching.cfg.xml
index acee7008ba..55a3aeb51c 100644
--- a/spring-hibernate4/src/test/resources/fetching.cfg.xml
+++ b/spring-hibernate4/src/test/resources/fetching.cfg.xml
@@ -5,14 +5,15 @@
- com.mysql.jdbc.Driver
- jdbc:mysql://localhost:3306/test
- root
- iamtheking
- org.hibernate.dialect.MySQLDialect
+ org.h2.Driver
+ jdbc:h2:mem:testdb
+ sa
+
+ org.hibernate.dialect.H2Dialect
+ update
true
-
+
\ No newline at end of file
diff --git a/spring-hibernate4/src/test/resources/fetchingLazy.cfg.xml b/spring-hibernate4/src/test/resources/fetchingLazy.cfg.xml
index 1dc37d0cf8..8fcf578660 100644
--- a/spring-hibernate4/src/test/resources/fetchingLazy.cfg.xml
+++ b/spring-hibernate4/src/test/resources/fetchingLazy.cfg.xml
@@ -5,14 +5,15 @@
- com.mysql.jdbc.Driver
- jdbc:mysql://localhost:3306/test
- root
- iamtheking
- org.hibernate.dialect.MySQLDialect
+ org.h2.Driver
+ jdbc:h2:mem:testdb
+ sa
+
+ org.hibernate.dialect.H2Dialect
+ update
true
-
+
\ No newline at end of file
diff --git a/spring-hibernate4/src/test/resources/persistence-h2.properties b/spring-hibernate4/src/test/resources/persistence-h2.properties
new file mode 100644
index 0000000000..911619193b
--- /dev/null
+++ b/spring-hibernate4/src/test/resources/persistence-h2.properties
@@ -0,0 +1,13 @@
+# jdbc.X
+jdbc.driverClassName=org.h2.Driver
+jdbc.url=jdbc:h2:mem:test
+jdbc.user=sa
+jdbc.pass=
+
+# hibernate.X
+hibernate.dialect=org.hibernate.dialect.H2Dialect
+hibernate.show_sql=false
+hibernate.hbm2ddl.auto=create-drop
+
+# envers.X
+envers.audit_table_suffix=_audit_log
diff --git a/spring-reactive-kotlin/pom.xml b/spring-reactive-kotlin/pom.xml
new file mode 100644
index 0000000000..1425adc191
--- /dev/null
+++ b/spring-reactive-kotlin/pom.xml
@@ -0,0 +1,93 @@
+
+
+ 4.0.0
+
+ com.baeldung
+ springreactivekotlin
+ 0.0.1-SNAPSHOT
+ jar
+
+ springreactivekotlin
+ Demo project for Spring Boot
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.0.3.RELEASE
+
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+ 1.2.41
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-webflux
+
+
+ com.fasterxml.jackson.module
+ jackson-module-kotlin
+
+
+ org.jetbrains.kotlin
+ kotlin-stdlib-jdk8
+
+
+ org.jetbrains.kotlin
+ kotlin-reflect
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ io.projectreactor
+ reactor-test
+ test
+
+
+
+
+ ${project.basedir}/src/main/kotlin
+ ${project.basedir}/src/test/kotlin
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+ kotlin-maven-plugin
+ org.jetbrains.kotlin
+
+
+ -Xjsr305=strict
+
+
+ spring
+
+
+
+
+ org.jetbrains.kotlin
+ kotlin-maven-allopen
+ ${kotlin.version}
+
+
+
+
+
+
+
+
diff --git a/spring-reactive-kotlin/src/main/kotlin/com/baeldung/springreactivekotlin/Application.kt b/spring-reactive-kotlin/src/main/kotlin/com/baeldung/springreactivekotlin/Application.kt
new file mode 100644
index 0000000000..87ac7417b7
--- /dev/null
+++ b/spring-reactive-kotlin/src/main/kotlin/com/baeldung/springreactivekotlin/Application.kt
@@ -0,0 +1,11 @@
+package com.baeldung.springreactivekotlin
+
+import org.springframework.boot.SpringApplication
+import org.springframework.boot.autoconfigure.SpringBootApplication
+
+@SpringBootApplication
+class Application
+
+fun main(args: Array) {
+ SpringApplication.run(Application::class.java, *args)
+}
diff --git a/spring-reactive-kotlin/src/main/kotlin/com/baeldung/springreactivekotlin/Controller.kt b/spring-reactive-kotlin/src/main/kotlin/com/baeldung/springreactivekotlin/Controller.kt
new file mode 100644
index 0000000000..76f8a62b85
--- /dev/null
+++ b/spring-reactive-kotlin/src/main/kotlin/com/baeldung/springreactivekotlin/Controller.kt
@@ -0,0 +1,18 @@
+package com.baeldung.springreactivekotlin
+
+import org.springframework.http.MediaType
+import org.springframework.stereotype.Controller
+import org.springframework.web.bind.annotation.GetMapping
+import org.springframework.web.bind.annotation.ResponseBody
+import reactor.core.publisher.Flux
+
+@Controller
+class Controller {
+
+ @GetMapping(path = ["/numbers"], produces = [MediaType.APPLICATION_STREAM_JSON_VALUE])
+ @ResponseBody
+ fun getNumbers(): Flux {
+ return Flux.range(1, 100)
+ }
+
+}
diff --git a/spring-reactive-kotlin/src/main/kotlin/com/baeldung/springreactivekotlin/Device.kt b/spring-reactive-kotlin/src/main/kotlin/com/baeldung/springreactivekotlin/Device.kt
new file mode 100644
index 0000000000..9eb6eb8488
--- /dev/null
+++ b/spring-reactive-kotlin/src/main/kotlin/com/baeldung/springreactivekotlin/Device.kt
@@ -0,0 +1,5 @@
+package com.baeldung.springreactivekotlin
+
+class Device(val name: String, val reading: Double) {
+
+}
diff --git a/spring-reactive-kotlin/src/main/kotlin/com/baeldung/springreactivekotlin/HomeSensorsHandler.kt b/spring-reactive-kotlin/src/main/kotlin/com/baeldung/springreactivekotlin/HomeSensorsHandler.kt
new file mode 100644
index 0000000000..0ef9f37f1b
--- /dev/null
+++ b/spring-reactive-kotlin/src/main/kotlin/com/baeldung/springreactivekotlin/HomeSensorsHandler.kt
@@ -0,0 +1,36 @@
+package com.baeldung.springreactivekotlin
+
+import org.springframework.stereotype.Component
+import org.springframework.web.reactive.function.BodyInserters.fromObject
+import org.springframework.web.reactive.function.server.ServerRequest
+import org.springframework.web.reactive.function.server.ServerResponse
+import reactor.core.publisher.Mono
+
+@Component
+class HomeSensorsHandler {
+
+ var data = mapOf("lamp" to arrayOf(0.7, 0.65, 0.67), "fridge" to arrayOf(12.0, 11.9, 12.5))
+
+ fun setLight(request: ServerRequest): Mono = ServerResponse.ok().build()
+
+ fun getLightReading(request: ServerRequest): Mono =
+ ServerResponse.ok().body(fromObject(data["lamp"]!!))
+
+ fun getDeviceReadings(request: ServerRequest): Mono {
+ val id = request.pathVariable("id")
+ return ServerResponse.ok().body(fromObject(Device(id, 1.0)))
+ }
+
+ fun getAllDevices(request: ServerRequest): Mono =
+ ServerResponse.ok().body(fromObject(arrayOf("lamp", "tv")))
+
+ fun getAllDeviceApi(request: ServerRequest): Mono =
+ ServerResponse.ok().body(fromObject(arrayListOf("kettle", "fridge")))
+
+ fun setDeviceReadingApi(request: ServerRequest): Mono {
+ return request.bodyToMono(Device::class.java).flatMap { it ->
+ ServerResponse.ok().body(fromObject(Device(it.name.toUpperCase(), it.reading)))
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/spring-reactive-kotlin/src/main/kotlin/com/baeldung/springreactivekotlin/HomeSensorsRouters.kt b/spring-reactive-kotlin/src/main/kotlin/com/baeldung/springreactivekotlin/HomeSensorsRouters.kt
new file mode 100644
index 0000000000..27d87afd89
--- /dev/null
+++ b/spring-reactive-kotlin/src/main/kotlin/com/baeldung/springreactivekotlin/HomeSensorsRouters.kt
@@ -0,0 +1,32 @@
+package com.baeldung.springreactivekotlin
+
+import org.springframework.context.annotation.Bean
+import org.springframework.context.annotation.Configuration
+import org.springframework.http.MediaType.APPLICATION_JSON
+import org.springframework.http.MediaType.TEXT_HTML
+import org.springframework.web.reactive.function.server.router
+
+@Configuration
+class HomeSensorsRouters(private val handler: HomeSensorsHandler) {
+
+ @Bean
+ fun roomsRouter() = router {
+ (accept(TEXT_HTML) and "/room").nest {
+ GET("/light", handler::getLightReading)
+ POST("/light", handler::setLight)
+ }
+ }
+
+ @Bean
+ fun deviceRouter() = router {
+ accept(TEXT_HTML).nest {
+ (GET("/device/") or GET("/devices/")).invoke(handler::getAllDevices)
+ GET("/device/{id}", handler::getDeviceReadings)
+ }
+ (accept(APPLICATION_JSON) and "/api").nest {
+ (GET("/device/") or GET("/devices/")).invoke(handler::getAllDeviceApi)
+ POST("/device/", handler::setDeviceReadingApi)
+ }
+ }
+
+}
diff --git a/spring-reactive-kotlin/src/main/kotlin/com/baeldung/springreactivekotlin/Routes.kt b/spring-reactive-kotlin/src/main/kotlin/com/baeldung/springreactivekotlin/Routes.kt
new file mode 100644
index 0000000000..9015fc5df8
--- /dev/null
+++ b/spring-reactive-kotlin/src/main/kotlin/com/baeldung/springreactivekotlin/Routes.kt
@@ -0,0 +1,16 @@
+package com.baeldung.springreactivekotlin
+
+import org.springframework.context.annotation.Bean
+import org.springframework.context.annotation.Configuration
+import org.springframework.web.reactive.function.server.ServerResponse
+import org.springframework.web.reactive.function.server.router
+
+import org.springframework.web.reactive.function.BodyInserters.fromObject
+
+@Configuration
+class SimpleRoute {
+ @Bean
+ fun route() = router {
+ GET("/route") { _ -> ServerResponse.ok().body(fromObject(arrayOf(1, 2, 3))) }
+ }
+}
\ No newline at end of file
diff --git a/spring-reactive-kotlin/src/test/kotlin/RoutesTest.kt b/spring-reactive-kotlin/src/test/kotlin/RoutesTest.kt
new file mode 100644
index 0000000000..ba640070e3
--- /dev/null
+++ b/spring-reactive-kotlin/src/test/kotlin/RoutesTest.kt
@@ -0,0 +1,35 @@
+package veontomo
+
+import com.baeldung.springreactivekotlin.SimpleRoute
+import org.junit.Before
+import org.junit.Test
+import org.springframework.test.web.reactive.server.WebTestClient
+
+class RoutesTest {
+
+ lateinit var client: WebTestClient
+
+ @Before
+ fun init() {
+ this.client = WebTestClient.bindToRouterFunction(SimpleRoute().route()).build()
+ }
+
+
+ @Test
+ fun whenRequestToRoute_thenStatusShouldBeOk() {
+ client.get()
+ .uri("/route")
+ .exchange()
+ .expectStatus().isOk
+ }
+
+
+ @Test
+ fun whenRequestToRoute_thenBodyShouldContainArray123() {
+ client.get()
+ .uri("/route")
+ .exchange()
+ .expectBody()
+ .json("[1, 2, 3]")
+ }
+}
\ No newline at end of file
diff --git a/spring-rest-hal-browser/pom.xml b/spring-rest-hal-browser/pom.xml
new file mode 100644
index 0000000000..6c56faf0b2
--- /dev/null
+++ b/spring-rest-hal-browser/pom.xml
@@ -0,0 +1,53 @@
+
+
+ 4.0.0
+
+ com.baeldung
+ spring-rest-hal-browser
+ 1.0-SNAPSHOT
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 1.8
+ 1.8
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+ 2.0.3.RELEASE
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+ 2.0.3.RELEASE
+
+
+
+ org.springframework.data
+ spring-data-rest-hal-browser
+ 3.0.8.RELEASE
+
+
+
+ com.h2database
+ h2
+ 1.4.197
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-rest-hal-browser/src/main/java/com/baeldung/App.java b/spring-rest-hal-browser/src/main/java/com/baeldung/App.java
new file mode 100644
index 0000000000..14b6c201d5
--- /dev/null
+++ b/spring-rest-hal-browser/src/main/java/com/baeldung/App.java
@@ -0,0 +1,13 @@
+package com.baeldung;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class App {
+
+ public static void main(String[] args) {
+ SpringApplication.run(App.class);
+ }
+
+}
diff --git a/spring-rest-hal-browser/src/main/java/com/baeldung/config/DBLoader.java b/spring-rest-hal-browser/src/main/java/com/baeldung/config/DBLoader.java
new file mode 100644
index 0000000000..7251ef0e8c
--- /dev/null
+++ b/spring-rest-hal-browser/src/main/java/com/baeldung/config/DBLoader.java
@@ -0,0 +1,108 @@
+package com.baeldung.config;
+
+import com.baeldung.data.BookRepository;
+import com.baeldung.model.Book;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.stereotype.Component;
+
+import java.util.Random;
+import java.util.stream.IntStream;
+
+@Component
+public class DBLoader implements ApplicationRunner {
+
+ private final BookRepository bookRepository;
+
+ @Autowired
+ DBLoader(BookRepository bookRepository){
+ this.bookRepository = bookRepository;
+ }
+
+
+ public void run(ApplicationArguments applicationArguments) throws Exception {
+
+ String[] templates = {
+ "Up and running with %s",
+ "%s Basics",
+ "%s for Beginners",
+ "%s for Neckbeards",
+ "Under the hood: %s",
+ "Discovering %s",
+ "A short guide to %s",
+ "%s with Baeldung"
+ };
+
+ String[] buzzWords = {
+ "Spring REST Data",
+ "Java 9",
+ "Scala",
+ "Groovy",
+ "Hibernate",
+ "Spring HATEOS",
+ "The HAL Browser",
+ "Spring webflux",
+ };
+
+ String[] authorFirstName = {
+ "John %s",
+ "Steve %s",
+ "Samantha %s",
+ "Gale %s",
+ "Tom %s"
+ };
+
+ String[] authorLastName = {
+ "Giles",
+ "Gill",
+ "Smith",
+ "Armstrong"
+ };
+
+ String[] blurbs = {
+ "It was getting dark when the %s %s" ,
+ "Scott was nearly there when he heard that a %s %s",
+ "Diana was a lovable Java coder until the %s %s",
+ "The gripping story of a small %s and the day it %s"
+ };
+
+ String[] blublMiddles = {
+ "distaster",
+ "dog",
+ "cat",
+ "turtle",
+ "hurricane"
+ };
+
+ String[] end = {
+ "hit the school",
+ "memorised pi to 100 decimal places!",
+ "became a world champion armwrestler",
+ "became a Java REST master!!"
+ };
+
+ Random random = new Random();
+
+ IntStream.range(0, 100)
+ .forEach(i -> {
+ String template = templates[i % templates.length];
+ String buzzword = buzzWords[i % buzzWords.length];
+ String blurbStart = blurbs[i % blurbs.length];
+ String middle = blublMiddles[i % blublMiddles.length];
+ String ending = end[i % end.length];
+ String blurb = String.format(blurbStart, middle, ending);
+ String firstName = authorFirstName[i % authorFirstName.length];
+ String lastname = authorLastName[i % authorLastName.length];
+ Book book = new Book(String.format(template, buzzword), String.format(firstName, lastname), blurb, random.nextInt(1000-200) + 200);
+
+ bookRepository.save(book);
+
+ System.out.println(book);
+
+ });
+
+
+
+ }
+}
diff --git a/spring-rest-hal-browser/src/main/java/com/baeldung/config/RestConfig.java b/spring-rest-hal-browser/src/main/java/com/baeldung/config/RestConfig.java
new file mode 100644
index 0000000000..858371facc
--- /dev/null
+++ b/spring-rest-hal-browser/src/main/java/com/baeldung/config/RestConfig.java
@@ -0,0 +1,23 @@
+package com.baeldung.config;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.data.rest.core.event.ValidatingRepositoryEventListener;
+import org.springframework.data.rest.webmvc.config.RepositoryRestConfigurerAdapter;
+import org.springframework.validation.Validator;
+
+@Configuration
+public class RestConfig extends RepositoryRestConfigurerAdapter {
+
+ //access to global validator
+ @Autowired
+ @Lazy
+ private Validator validator;
+
+ @Override
+ public void configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener validatingListener) {
+ validatingListener.addValidator("beforeCreate", validator );
+ validatingListener.addValidator("beforeSave", validator);
+ }
+}
diff --git a/spring-rest-hal-browser/src/main/java/com/baeldung/data/BookRepository.java b/spring-rest-hal-browser/src/main/java/com/baeldung/data/BookRepository.java
new file mode 100644
index 0000000000..d8e35974b1
--- /dev/null
+++ b/spring-rest-hal-browser/src/main/java/com/baeldung/data/BookRepository.java
@@ -0,0 +1,21 @@
+package com.baeldung.data;
+
+import com.baeldung.model.Book;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.PagingAndSortingRepository;
+import org.springframework.data.repository.query.Param;
+import org.springframework.data.rest.core.annotation.RestResource;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface BookRepository extends PagingAndSortingRepository {
+
+ @RestResource(rel = "title-contains", path="title-contains")
+ Page findByTitleContaining(@Param("query") String query, Pageable page);
+
+ @RestResource(rel = "author-contains", path="author-contains", exported = false)
+ Page findByAuthorContaining(@Param("query") String query, Pageable page);
+
+}
diff --git a/spring-rest-hal-browser/src/main/java/com/baeldung/model/Book.java b/spring-rest-hal-browser/src/main/java/com/baeldung/model/Book.java
new file mode 100644
index 0000000000..b1dc1b41f3
--- /dev/null
+++ b/spring-rest-hal-browser/src/main/java/com/baeldung/model/Book.java
@@ -0,0 +1,86 @@
+package com.baeldung.model;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+@Entity
+public class Book {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private long id;
+
+ @NotNull
+ @Column(columnDefinition = "VARCHAR", length = 100)
+ private String title;
+
+ @NotNull
+ @Column(columnDefinition = "VARCHAR", length = 100)
+ private String author;
+
+ @Column(columnDefinition = "VARCHAR", length = 1000)
+ private String blurb;
+
+ private int pages;
+
+ public Book() {
+ }
+
+ public Book(@NotNull String title, @NotNull String author, String blurb, int pages) {
+ this.title = title;
+ this.author = author;
+ this.blurb = blurb;
+ this.pages = pages;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+
+ public String getBlurb() {
+ return blurb;
+ }
+
+ public void setBlurb(String blurb) {
+ this.blurb = blurb;
+ }
+
+ public int getPages() {
+ return pages;
+ }
+
+ public void setPages(int pages) {
+ this.pages = pages;
+ }
+
+ @Override
+ public String toString() {
+ return "Book{" +
+ "id=" + id +
+ ", title='" + title + '\'' +
+ ", author='" + author + '\'' +
+ ", blurb='" + blurb + '\'' +
+ ", pages=" + pages +
+ '}';
+ }
+}
diff --git a/spring-rest-hal-browser/src/main/resources/application.properties b/spring-rest-hal-browser/src/main/resources/application.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/spring-rest-simple/src/main/java/org/baeldung/web/controller/FooController.java b/spring-rest-simple/src/main/java/org/baeldung/web/controller/FooController.java
index 3c7e5ed13c..bf26eb3292 100644
--- a/spring-rest-simple/src/main/java/org/baeldung/web/controller/FooController.java
+++ b/spring-rest-simple/src/main/java/org/baeldung/web/controller/FooController.java
@@ -45,4 +45,19 @@ public class FooController {
.setName("Foo Name")
.build();
}
+
+ @RequestMapping(method = RequestMethod.POST, value = "/foos/new")
+ @ResponseStatus(HttpStatus.OK)
+ @ResponseBody
+ public Foo createFoo(@RequestBody final Foo foo) {
+ return foo;
+ }
+
+ @RequestMapping(method = RequestMethod.DELETE, value = "/foos/{id}")
+ @ResponseStatus(HttpStatus.OK)
+ @ResponseBody
+ public long deleteFoo(@PathVariable final long id) {
+ return id;
+ }
+
}
diff --git a/spring-rest-template/.gitignore b/spring-rest-template/.gitignore
new file mode 100644
index 0000000000..afdfaa6ded
--- /dev/null
+++ b/spring-rest-template/.gitignore
@@ -0,0 +1,14 @@
+*.class
+
+#folders#
+/target
+/neoDb*
+/data
+/src/main/webapp/WEB-INF/classes
+*/META-INF/*
+*/.idea/*
+
+# Packaged files #
+*.jar
+*.war
+*.ear
\ No newline at end of file
diff --git a/spring-rest-template/README.md b/spring-rest-template/README.md
new file mode 100644
index 0000000000..bf35f0d32c
--- /dev/null
+++ b/spring-rest-template/README.md
@@ -0,0 +1,4 @@
+## Spring REST Template Example Project
+
+### The Course
+The "REST With Spring" Classes: http://bit.ly/restwithspring
diff --git a/spring-rest-template/checkstyle.xml b/spring-rest-template/checkstyle.xml
new file mode 100644
index 0000000000..85063a7570
--- /dev/null
+++ b/spring-rest-template/checkstyle.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-rest-template/pom.xml b/spring-rest-template/pom.xml
new file mode 100644
index 0000000000..fa93308cf5
--- /dev/null
+++ b/spring-rest-template/pom.xml
@@ -0,0 +1,83 @@
+
+ 4.0.0
+ com.baeldung
+ spring-rest-template
+ 0.1-SNAPSHOT
+ spring-rest-template
+ jar
+
+
+ parent-boot-2
+ com.baeldung
+ 0.0.1-SNAPSHOT
+ ../parent-boot-2
+
+
+
+
+
+
+ org.springframework
+ spring-web
+
+
+ commons-logging
+ commons-logging
+
+
+
+
+
+
+ spring-rest-template
+
+
+ org.apache.maven.plugins
+ maven-checkstyle-plugin
+ ${checkstyle-maven-plugin.version}
+
+ checkstyle.xml
+
+
+
+
+ check
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+ 3
+ true
+
+ **/*IntegrationTest.java
+ **/*LongRunningUnitTest.java
+ **/*ManualTest.java
+ **/*LiveTest.java
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-checkstyle-plugin
+ ${checkstyle-maven-plugin.version}
+
+ checkstyle.xml
+
+
+
+
+
+
+
+ 3.0.0
+
+
diff --git a/spring-rest-template/src/main/java/com/baeldung/web/upload/client/MultipartFileUploadClient.java b/spring-rest-template/src/main/java/com/baeldung/web/upload/client/MultipartFileUploadClient.java
new file mode 100644
index 0000000000..804013d4dc
--- /dev/null
+++ b/spring-rest-template/src/main/java/com/baeldung/web/upload/client/MultipartFileUploadClient.java
@@ -0,0 +1,62 @@
+package com.baeldung.web.upload.client;
+
+import org.springframework.core.io.FileSystemResource;
+import org.springframework.core.io.Resource;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+public class MultipartFileUploadClient {
+
+ public static void main(String[] args) throws IOException {
+ uploadSingleFile();
+ uploadMultipleFile();
+ }
+
+ private static void uploadSingleFile() throws IOException {
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(MediaType.MULTIPART_FORM_DATA);
+
+ MultiValueMap body = new LinkedMultiValueMap<>();
+ body.add("file", getTestFile());
+
+
+ HttpEntity> requestEntity = new HttpEntity<>(body, headers);
+ String serverUrl = "http://localhost:8082/spring-rest/fileserver/singlefileupload/";
+ RestTemplate restTemplate = new RestTemplate();
+ ResponseEntity response = restTemplate.postForEntity(serverUrl, requestEntity, String.class);
+ System.out.println("Response code: " + response.getStatusCode());
+ }
+
+ private static void uploadMultipleFile() throws IOException {
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(MediaType.MULTIPART_FORM_DATA);
+
+ MultiValueMap body = new LinkedMultiValueMap<>();
+ body.add("files", getTestFile());
+ body.add("files", getTestFile());
+ body.add("files", getTestFile());
+
+ HttpEntity> requestEntity = new HttpEntity<>(body, headers);
+ String serverUrl = "http://localhost:8082/spring-rest/fileserver/multiplefileupload/";
+ RestTemplate restTemplate = new RestTemplate();
+ ResponseEntity response = restTemplate.postForEntity(serverUrl, requestEntity, String.class);
+ System.out.println("Response code: " + response.getStatusCode());
+ }
+
+ public static Resource getTestFile() throws IOException {
+ Path testFile = Files.createTempFile("test-file", ".txt");
+ System.out.println("Creating and Uploading Test File: " + testFile);
+ Files.write(testFile, "Hello World !!, This is a test file.".getBytes());
+ return new FileSystemResource(testFile.toFile());
+ }
+
+}
diff --git a/spring-rest/src/main/java/com/baeldung/web/upload/app/Application.java b/spring-rest/src/main/java/com/baeldung/web/upload/app/Application.java
new file mode 100644
index 0000000000..d6821196eb
--- /dev/null
+++ b/spring-rest/src/main/java/com/baeldung/web/upload/app/Application.java
@@ -0,0 +1,17 @@
+package com.baeldung.web.upload.app;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+import org.springframework.context.annotation.ComponentScan;
+
+@EnableAutoConfiguration
+@ComponentScan("com.baeldung.web.upload")
+@SpringBootApplication
+public class Application extends SpringBootServletInitializer {
+
+ public static void main(final String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+}
\ No newline at end of file
diff --git a/spring-rest/src/main/java/com/baeldung/web/upload/client/MultipartFileUploadClient.java b/spring-rest/src/main/java/com/baeldung/web/upload/client/MultipartFileUploadClient.java
new file mode 100644
index 0000000000..547aec17a0
--- /dev/null
+++ b/spring-rest/src/main/java/com/baeldung/web/upload/client/MultipartFileUploadClient.java
@@ -0,0 +1,61 @@
+package com.baeldung.web.upload.client;
+
+import org.springframework.core.io.FileSystemResource;
+import org.springframework.core.io.Resource;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+public class MultipartFileUploadClient {
+
+ public static void main(String[] args) throws IOException {
+ uploadSingleFile();
+ uploadMultipleFile();
+ }
+
+ private static void uploadSingleFile() throws IOException {
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(MediaType.MULTIPART_FORM_DATA);
+
+ MultiValueMap body = new LinkedMultiValueMap<>();
+ body.add("file", getTestFile());
+
+
+ HttpEntity> requestEntity = new HttpEntity<>(body, headers);
+ String serverUrl = "http://localhost:8082/spring-rest/fileserver/singlefileupload/";
+ RestTemplate restTemplate = new RestTemplate();
+ ResponseEntity response = restTemplate.postForEntity(serverUrl, requestEntity, String.class);
+ System.out.println("Response code: " + response.getStatusCode());
+ }
+
+ private static void uploadMultipleFile() throws IOException {
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(MediaType.MULTIPART_FORM_DATA);
+
+ MultiValueMap body = new LinkedMultiValueMap<>();
+ body.add("files", getTestFile());
+ body.add("files", getTestFile());
+ body.add("files", getTestFile());
+
+ HttpEntity> requestEntity = new HttpEntity<>(body, headers);
+ String serverUrl = "http://localhost:8082/spring-rest/fileserver/multiplefileupload/";
+ RestTemplate restTemplate = new RestTemplate();
+ ResponseEntity response = restTemplate.postForEntity(serverUrl, requestEntity, String.class);
+ System.out.println("Response code: " + response.getStatusCode());
+ }
+
+ public static Resource getTestFile() throws IOException {
+ Path testFile = Files.createTempFile("test-file", ".txt");
+ System.out.println("Creating and Uploading Test File: " + testFile);
+ Files.write(testFile, "Hello World !!, This is a test file.".getBytes());
+ return new FileSystemResource(testFile.toFile());
+ }
+}
diff --git a/spring-rest/src/main/java/com/baeldung/web/upload/controller/FileServerResource.java b/spring-rest/src/main/java/com/baeldung/web/upload/controller/FileServerResource.java
new file mode 100644
index 0000000000..3863a8f20d
--- /dev/null
+++ b/spring-rest/src/main/java/com/baeldung/web/upload/controller/FileServerResource.java
@@ -0,0 +1,43 @@
+package com.baeldung.web.upload.controller;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+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.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/fileserver")
+public class FileServerResource {
+
+ @RequestMapping(path = "/singlefileupload/", method = RequestMethod.POST)
+ public ResponseEntity processFile(@RequestParam("file") MultipartFile file) throws IOException {
+
+ byte[] bytes = file.getBytes();
+
+ System.out.println("File Name: " + file.getOriginalFilename());
+ System.out.println("File Content Type: " + file.getContentType());
+ System.out.println("File Content:\n" + new String(bytes));
+
+ return (new ResponseEntity<>("Successful", null, HttpStatus.OK));
+ }
+
+ @RequestMapping(path = "/multiplefileupload/", method = RequestMethod.POST)
+ public ResponseEntity processFile(@RequestParam("files") List files) throws IOException {
+
+ for (MultipartFile file : files) {
+ byte[] bytes = file.getBytes();
+
+ System.out.println("File Name: " + file.getOriginalFilename());
+ System.out.println("File Content Type: " + file.getContentType());
+ System.out.println("File Content:\n" + new String(bytes));
+ }
+
+ return (new ResponseEntity<>("Successful", null, HttpStatus.OK));
+ }
+}
\ No newline at end of file
diff --git a/spring-security-anguar/server/src/test/java/com/baeldung/springbootsecurityrest/BasicAuthConfigurationIntegrationTest.java b/spring-security-anguar/server/src/test/java/com/baeldung/springbootsecurityrest/BasicAuthConfigurationIntegrationTest.java
deleted file mode 100644
index 952a0806a1..0000000000
--- a/spring-security-anguar/server/src/test/java/com/baeldung/springbootsecurityrest/BasicAuthConfigurationIntegrationTest.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package com.baeldung.springbootsecurityrest;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT;
-
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.boot.context.embedded.LocalServerPort;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.web.client.TestRestTemplate;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import com.baeldung.springbootsecurityrest.basicauth.SpringBootSecurityApplication;
-import com.baeldung.springbootsecurityrest.vo.User;
-
-@RunWith(SpringRunner.class)
-@SpringBootTest(webEnvironment = RANDOM_PORT, classes = SpringBootSecurityApplication.class)
-public class BasicAuthConfigurationIntegrationTest {
-
- TestRestTemplate restTemplate;
- URL base;
-
- @LocalServerPort int port;
-
- @Before
- public void setUp() throws MalformedURLException {
- restTemplate = new TestRestTemplate("user", "password");
- base = new URL("http://localhost:" + port);
- }
-
- @Test
- public void givenCorrectCredentials_whenLogin_ThenSuccess() throws IllegalStateException, IOException {
- restTemplate = new TestRestTemplate();
- User user = new User();
- user.setUserName("user");
- user.setPassword("password");
- ResponseEntity response = restTemplate.postForEntity(base.toString()+"/login",user, String.class);
-
- assertEquals(HttpStatus.OK, response.getStatusCode());
- assertTrue(response
- .getBody()
- .contains("true"));
- }
-
- @Test
- public void givenWrongCredentials_whenLogin_ThenReturnFalse() throws IllegalStateException, IOException {
- restTemplate = new TestRestTemplate();
- User user = new User();
- user.setUserName("user");
- user.setPassword("wrongpassword");
- ResponseEntity response = restTemplate.postForEntity(base.toString()+"/login",user, String.class);
-
- assertEquals(HttpStatus.OK, response.getStatusCode());
- assertTrue(response
- .getBody()
- .contains("false"));
- }
-
- @Test
- public void givenLoggedInUser_whenRequestsHomePage_ThenSuccess() throws IllegalStateException, IOException {
- ResponseEntity response = restTemplate.getForEntity(base.toString()+"/user", String.class);
-
- assertEquals(HttpStatus.OK, response.getStatusCode());
- assertTrue(response
- .getBody()
- .contains("user"));
- }
-
- @Test
- public void givenWrongCredentials_whenRequestsHomePage_ThenUnauthorized() throws IllegalStateException, IOException {
- restTemplate = new TestRestTemplate("user", "wrongpassword");
- ResponseEntity response = restTemplate.getForEntity(base.toString()+"/user", String.class);
-
- assertEquals(HttpStatus.UNAUTHORIZED, response.getStatusCode());
- assertTrue(response
- .getBody()
- .contains("Unauthorized"));
- }
-}
diff --git a/spring-security-angular/server/src/main/java/com/baeldung/springbootsecurityrest/controller/UserController.java b/spring-security-angular/server/src/main/java/com/baeldung/springbootsecurityrest/controller/UserController.java
index 825290ff2d..ab66065b61 100644
--- a/spring-security-angular/server/src/main/java/com/baeldung/springbootsecurityrest/controller/UserController.java
+++ b/spring-security-angular/server/src/main/java/com/baeldung/springbootsecurityrest/controller/UserController.java
@@ -18,15 +18,12 @@ public class UserController {
@RequestMapping("/login")
public boolean login(@RequestBody User user) {
- if(user.getUserName().equals("user") && user.getPassword().equals("password")) {
- return true;
- }
- return false;
+ return user.getUserName().equals("user") && user.getPassword().equals("password");
}
-
+
@RequestMapping("/user")
public Principal user(HttpServletRequest request) {
String authToken = request.getHeader("Authorization").substring("Basic".length()).trim();
- return () -> new String(Base64.getDecoder().decode(authToken)).split(":")[0];
+ return () -> new String(Base64.getDecoder().decode(authToken)).split(":")[0];
}
}
diff --git a/spring-security-mvc-custom/src/test/java/org/baeldung/security/spring/ManualSecurityConfig.java b/spring-security-mvc-custom/src/test/java/org/baeldung/security/spring/ManualSecurityConfig.java
index 874856095c..23d13a0ff1 100644
--- a/spring-security-mvc-custom/src/test/java/org/baeldung/security/spring/ManualSecurityConfig.java
+++ b/spring-security-mvc-custom/src/test/java/org/baeldung/security/spring/ManualSecurityConfig.java
@@ -3,7 +3,6 @@ package org.baeldung.security.spring;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.config.BeanIds;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
@@ -24,7 +23,7 @@ public class ManualSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
- auth.inMemoryAuthentication().withUser("user1").password("user1Pass").authorities("ROLE_USER").and().withUser("admin").password("adminPass").authorities("ROLE_ADMIN");
+ auth.inMemoryAuthentication().withUser("user1").password("{noop}user1Pass").authorities("ROLE_USER").and().withUser("admin").password("adminPass").authorities("ROLE_ADMIN");
}
@Override
@@ -32,7 +31,7 @@ public class ManualSecurityConfig extends WebSecurityConfigurerAdapter {
web.ignoring().antMatchers("/resources/**");
}
- @Bean(name = BeanIds.AUTHENTICATION_MANAGER)
+ @Bean("authenticationManager")
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
diff --git a/spring-security-mvc-custom/src/test/java/org/baeldung/security/spring/SecurityWithCsrfConfig.java b/spring-security-mvc-custom/src/test/java/org/baeldung/security/spring/SecurityWithCsrfConfig.java
index 9600977e37..ca401622c0 100644
--- a/spring-security-mvc-custom/src/test/java/org/baeldung/security/spring/SecurityWithCsrfConfig.java
+++ b/spring-security-mvc-custom/src/test/java/org/baeldung/security/spring/SecurityWithCsrfConfig.java
@@ -1,6 +1,8 @@
package org.baeldung.security.spring;
+import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
@@ -17,7 +19,11 @@ public class SecurityWithCsrfConfig extends WebSecurityConfigurerAdapter {
super();
}
- // java config
+ @Bean("authenticationManager")
+ @Override
+ public AuthenticationManager authenticationManagerBean() throws Exception {
+ return super.authenticationManagerBean();
+ }
@Override
protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
diff --git a/spring-security-mvc-custom/src/test/java/org/baeldung/security/spring/SecurityWithoutCsrfConfig.java b/spring-security-mvc-custom/src/test/java/org/baeldung/security/spring/SecurityWithoutCsrfConfig.java
index f7dbd5b42c..1067c70fea 100644
--- a/spring-security-mvc-custom/src/test/java/org/baeldung/security/spring/SecurityWithoutCsrfConfig.java
+++ b/spring-security-mvc-custom/src/test/java/org/baeldung/security/spring/SecurityWithoutCsrfConfig.java
@@ -1,6 +1,8 @@
package org.baeldung.security.spring;
+import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
@@ -17,7 +19,11 @@ public class SecurityWithoutCsrfConfig extends WebSecurityConfigurerAdapter {
super();
}
- // java config
+ @Bean("authenticationManager")
+ @Override
+ public AuthenticationManager authenticationManagerBean() throws Exception {
+ return super.authenticationManagerBean();
+ }
@Override
protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
diff --git a/spring-security-x509/keystore/Makefile b/spring-security-x509/keystore/Makefile
index 5321be9de3..63498fea76 100644
--- a/spring-security-x509/keystore/Makefile
+++ b/spring-security-x509/keystore/Makefile
@@ -85,4 +85,4 @@ add-client:
clean:
# Remove generated artifacts
- find . ! -name Makefile -type f -exec rm -f {} \;
+ find . \( -name "$(CLIENTNAME)*" -o -name "$(HOSTNAME)*" -o -name "$(KEYSTORE)" -o -name "$(TRUSTSTORE)" -o -name ca.crt \) -type f -exec rm -f {} \;
diff --git a/testing-modules/gatling/pom.xml b/testing-modules/gatling/pom.xml
index 793e039f62..1afaefd47e 100644
--- a/testing-modules/gatling/pom.xml
+++ b/testing-modules/gatling/pom.xml
@@ -1,119 +1,122 @@
-
- 4.0.0
- org.baeldung
- gatling
- 1.0-SNAPSHOT
-
- com.baeldung
- parent-modules
- 1.0.0-SNAPSHOT
-
+
+ 4.0.0
+ org.baeldung
+ gatling
+ 1.0-SNAPSHOT
-
-
- io.gatling.highcharts
- gatling-charts-highcharts
-
-
- io.gatling
- gatling-app
-
-
- io.gatling
- gatling-recorder
-
-
- org.scala-lang
- scala-library
-
-
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+ ../../
+
-
- src/test/scala
-
-
-
- net.alchim31.maven
- scala-maven-plugin
- ${scala-maven-plugin.version}
-
-
-
-
-
- net.alchim31.maven
- scala-maven-plugin
-
-
-
- testCompile
-
-
-
-
- -Ydelambdafy:method
- -target:jvm-1.8
- -deprecation
- -feature
- -unchecked
- -language:implicitConversions
- -language:postfixOps
-
-
-
-
-
-
- io.gatling
- gatling-maven-plugin
- ${gatling-maven-plugin.version}
-
-
- test
-
- execute
-
-
-
-
-
-
+
+
+ io.gatling.highcharts
+ gatling-charts-highcharts
+
+
+ io.gatling
+ gatling-app
+
+
+ io.gatling
+ gatling-recorder
+
+
+ org.scala-lang
+ scala-library
+
+
-
-
-
- io.gatling
- gatling-app
- ${gatling.version}
-
-
- io.gatling
- gatling-recorder
- ${gatling.version}
-
-
- io.gatling.highcharts
- gatling-charts-highcharts
- ${gatling.version}
-
-
- org.scala-lang
- scala-library
- ${scala.version}
-
-
-
+
+ src/test/scala
+
+
+
+ net.alchim31.maven
+ scala-maven-plugin
+ ${scala-maven-plugin.version}
+
+
+
+
+
+ net.alchim31.maven
+ scala-maven-plugin
+
+
+
+ testCompile
+
+
+
+
+ -Ydelambdafy:method
+ -target:jvm-1.8
+ -deprecation
+ -feature
+ -unchecked
+ -language:implicitConversions
+ -language:postfixOps
+
+
+
+
+
+
+ io.gatling
+ gatling-maven-plugin
+ ${gatling-maven-plugin.version}
+
+
+ test
+
+ execute
+
+
+
+
+
+
-
- 1.8
- 1.8
- UTF-8
- 2.11.12
- 2.2.5
- 3.2.2
- 2.2.1
-
+
+
+
+ io.gatling
+ gatling-app
+ ${gatling.version}
+
+
+ io.gatling
+ gatling-recorder
+ ${gatling.version}
+
+
+ io.gatling.highcharts
+ gatling-charts-highcharts
+ ${gatling.version}
+
+
+ org.scala-lang
+ scala-library
+ ${scala.version}
+
+
+
+
+
+ 1.8
+ 1.8
+ UTF-8
+ 2.11.12
+ 2.2.5
+ 3.2.2
+ 2.2.1
+
diff --git a/testing-modules/groovy-spock/pom.xml b/testing-modules/groovy-spock/pom.xml
index f1f0883277..e0da345eb4 100644
--- a/testing-modules/groovy-spock/pom.xml
+++ b/testing-modules/groovy-spock/pom.xml
@@ -6,7 +6,6 @@
groovy-spock
1.0-SNAPSHOT
jar
- Spock Framework - Example Project
com.baeldung
diff --git a/testing-modules/junit-5/README.md b/testing-modules/junit-5/README.md
index 2292c3272a..5a73bca4d6 100644
--- a/testing-modules/junit-5/README.md
+++ b/testing-modules/junit-5/README.md
@@ -13,3 +13,5 @@
- [@Before vs @BeforeClass vs @BeforeEach vs @BeforeAll](http://www.baeldung.com/junit-before-beforeclass-beforeeach-beforeall)
- [Migrating from JUnit 4 to JUnit 5](http://www.baeldung.com/junit-5-migration)
- [JUnit5 Programmatic Extension Registration with @RegisterExtension](http://www.baeldung.com/junit-5-registerextension-annotation)
+- [The Order of Tests in JUnit](http://www.baeldung.com/junit-5-test-order)
+
diff --git a/junit5/src/main/java/com/baeldung/junit5/DefaultOrderOfExecutionTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/methodorders/DefaultOrderOfExecutionUnitTest.java
similarity index 88%
rename from junit5/src/main/java/com/baeldung/junit5/DefaultOrderOfExecutionTest.java
rename to testing-modules/junit-5/src/test/java/com/baeldung/methodorders/DefaultOrderOfExecutionUnitTest.java
index 15b07ee03a..c269a0e9b6 100644
--- a/junit5/src/main/java/com/baeldung/junit5/DefaultOrderOfExecutionTest.java
+++ b/testing-modules/junit-5/src/test/java/com/baeldung/methodorders/DefaultOrderOfExecutionUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.junit5;
+package com.baeldung.methodorders;
import static org.junit.Assert.assertEquals;
@@ -8,7 +8,7 @@ import org.junit.Test;
import org.junit.runners.MethodSorters;
@FixMethodOrder(MethodSorters.DEFAULT)
-public class DefaultOrderOfExecutionTest {
+public class DefaultOrderOfExecutionUnitTest {
private static StringBuilder output = new StringBuilder("");
@Test
diff --git a/junit5/src/main/java/com/baeldung/junit5/JVMOrderOfExecutionTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/methodorders/JVMOrderOfExecutionUnitTest.java
similarity index 84%
rename from junit5/src/main/java/com/baeldung/junit5/JVMOrderOfExecutionTest.java
rename to testing-modules/junit-5/src/test/java/com/baeldung/methodorders/JVMOrderOfExecutionUnitTest.java
index 189efc8945..c4996dacf3 100644
--- a/junit5/src/main/java/com/baeldung/junit5/JVMOrderOfExecutionTest.java
+++ b/testing-modules/junit-5/src/test/java/com/baeldung/methodorders/JVMOrderOfExecutionUnitTest.java
@@ -1,11 +1,11 @@
-package com.baeldung.junit5;
+package com.baeldung.methodorders;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;
@FixMethodOrder(MethodSorters.JVM)
-public class JVMOrderOfExecutionTest {
+public class JVMOrderOfExecutionUnitTest {
private static StringBuilder output = new StringBuilder("");
diff --git a/junit5/src/main/java/com/baeldung/junit5/NameAscendingOrderOfExecutionTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/methodorders/NameAscendingOrderOfExecutionUnitTest.java
similarity index 87%
rename from junit5/src/main/java/com/baeldung/junit5/NameAscendingOrderOfExecutionTest.java
rename to testing-modules/junit-5/src/test/java/com/baeldung/methodorders/NameAscendingOrderOfExecutionUnitTest.java
index 88de057fc8..032bc81779 100644
--- a/junit5/src/main/java/com/baeldung/junit5/NameAscendingOrderOfExecutionTest.java
+++ b/testing-modules/junit-5/src/test/java/com/baeldung/methodorders/NameAscendingOrderOfExecutionUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.junit5;
+package com.baeldung.methodorders;
import static org.junit.Assert.assertEquals;
@@ -8,7 +8,7 @@ import org.junit.Test;
import org.junit.runners.MethodSorters;
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
-public class NameAscendingOrderOfExecutionTest {
+public class NameAscendingOrderOfExecutionUnitTest {
private static StringBuilder output = new StringBuilder("");
@Test
diff --git a/testing-modules/junit-abstract/pom.xml b/testing-modules/junit-abstract/pom.xml
new file mode 100644
index 0000000000..c4957fbda4
--- /dev/null
+++ b/testing-modules/junit-abstract/pom.xml
@@ -0,0 +1,59 @@
+
+ 4.0.0
+
+ junit-abstract
+ 1.0-SNAPSHOT
+ jar
+
+ abstractclasses
+ http://maven.apache.org
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+ ../../
+
+
+
+ UTF-8
+ 1.7.0
+ 4.12
+ 1.10.19
+ 1.8
+
+
+
+
+ org.mockito
+ mockito-all
+ ${mockito.all.version}
+ test
+
+
+ org.powermock
+ powermock-module-junit4
+ ${powermock.version}
+ test
+
+
+ junit
+ junit
+
+
+
+
+
+ org.powermock
+ powermock-api-mockito
+ ${powermock.version}
+ test
+
+
+
+
+
+ junit-abstract
+
+
+
diff --git a/testing-modules/junit-abstract/src/main/java/org/baeldung/testing/abstractclass/abstractmethod/AbstractMethodCalling.java b/testing-modules/junit-abstract/src/main/java/org/baeldung/testing/abstractclass/abstractmethod/AbstractMethodCalling.java
new file mode 100644
index 0000000000..b0709bf6bf
--- /dev/null
+++ b/testing-modules/junit-abstract/src/main/java/org/baeldung/testing/abstractclass/abstractmethod/AbstractMethodCalling.java
@@ -0,0 +1,17 @@
+/**
+ *
+ */
+package org.baeldung.testing.abstractclass.abstractmethod;
+
+/**
+ * When method calls abstract method.
+ */
+public abstract class AbstractMethodCalling {
+
+ public abstract String abstractFunc();
+
+ public String defaultImpl() {
+ String res = abstractFunc();
+ return (res == null) ? "Default" : (res + " Default");
+ }
+}
diff --git a/testing-modules/junit-abstract/src/main/java/org/baeldung/testing/abstractclass/indepedentmethod/AbstractIndependent.java b/testing-modules/junit-abstract/src/main/java/org/baeldung/testing/abstractclass/indepedentmethod/AbstractIndependent.java
new file mode 100644
index 0000000000..7456a51c43
--- /dev/null
+++ b/testing-modules/junit-abstract/src/main/java/org/baeldung/testing/abstractclass/indepedentmethod/AbstractIndependent.java
@@ -0,0 +1,14 @@
+package org.baeldung.testing.abstractclass.indepedentmethod;
+
+/**
+ * Test Independent Method
+ *
+ */
+public abstract class AbstractIndependent {
+
+ public abstract int abstractFunc();
+
+ public String defaultImpl() {
+ return "DEFAULT-1";
+ }
+}
diff --git a/testing-modules/junit-abstract/src/main/java/org/baeldung/testing/abstractclass/indepedentmethod/ConcreteImpl.java b/testing-modules/junit-abstract/src/main/java/org/baeldung/testing/abstractclass/indepedentmethod/ConcreteImpl.java
new file mode 100644
index 0000000000..f568ad4eec
--- /dev/null
+++ b/testing-modules/junit-abstract/src/main/java/org/baeldung/testing/abstractclass/indepedentmethod/ConcreteImpl.java
@@ -0,0 +1,10 @@
+package org.baeldung.testing.abstractclass.indepedentmethod;
+
+public class ConcreteImpl extends AbstractIndependent {
+
+ @Override
+ public int abstractFunc() {
+ return 4;
+ }
+
+}
diff --git a/testing-modules/junit-abstract/src/main/java/org/baeldung/testing/abstractclass/instancefields/AbstractInstanceFields.java b/testing-modules/junit-abstract/src/main/java/org/baeldung/testing/abstractclass/instancefields/AbstractInstanceFields.java
new file mode 100644
index 0000000000..3761eb8c3b
--- /dev/null
+++ b/testing-modules/junit-abstract/src/main/java/org/baeldung/testing/abstractclass/instancefields/AbstractInstanceFields.java
@@ -0,0 +1,22 @@
+package org.baeldung.testing.abstractclass.instancefields;
+
+/**
+ * Test Independent Method
+ */
+public abstract class AbstractInstanceFields {
+
+ protected int count;
+ private boolean active = false;
+
+ public abstract int abstractFunc();
+
+ public String testFunc() {
+ String response;
+ if (count > 5) {
+ response = "Overflow";
+ } else {
+ response = active ? "Added" : "Blocked";
+ }
+ return response;
+ }
+}
diff --git a/testing-modules/junit-abstract/src/main/java/org/baeldung/testing/abstractclass/privatemethod/AbstractPrivateMethods.java b/testing-modules/junit-abstract/src/main/java/org/baeldung/testing/abstractclass/privatemethod/AbstractPrivateMethods.java
new file mode 100644
index 0000000000..98a9bcaa07
--- /dev/null
+++ b/testing-modules/junit-abstract/src/main/java/org/baeldung/testing/abstractclass/privatemethod/AbstractPrivateMethods.java
@@ -0,0 +1,17 @@
+package org.baeldung.testing.abstractclass.privatemethod;
+
+import java.time.LocalDateTime;
+
+public abstract class AbstractPrivateMethods {
+
+ public abstract int abstractFunc();
+
+ public String defaultImpl() {
+ return getCurrentDateTime() + "DEFAULT-1";
+ }
+
+ private String getCurrentDateTime() {
+ return LocalDateTime.now()
+ .toString();
+ }
+}
diff --git a/testing-modules/junit-abstract/src/test/java/org/baeldung/testing/abstractclass/abstractmethod/AbstractMethodCallingUnitTest.java b/testing-modules/junit-abstract/src/test/java/org/baeldung/testing/abstractclass/abstractmethod/AbstractMethodCallingUnitTest.java
new file mode 100644
index 0000000000..64094710b9
--- /dev/null
+++ b/testing-modules/junit-abstract/src/test/java/org/baeldung/testing/abstractclass/abstractmethod/AbstractMethodCallingUnitTest.java
@@ -0,0 +1,32 @@
+package org.baeldung.testing.abstractclass.abstractmethod;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class AbstractMethodCallingUnitTest {
+
+ @Test
+ public void givenDefaultImpl_whenMockAbstractFunc_thenExpectedBehaviour() {
+
+ // mock classes and call real methods available
+ AbstractMethodCalling cls = Mockito.mock(AbstractMethodCalling.class);
+ Mockito.doReturn("Abstract")
+ .when(cls)
+ .abstractFunc();
+ Mockito.doCallRealMethod()
+ .when(cls)
+ .defaultImpl();
+
+ // validate result by mock abstractFunc's behaviour
+ assertEquals("Abstract Default", cls.defaultImpl());
+
+ // check the value with null response from abstract method
+ Mockito.doReturn(null)
+ .when(cls)
+ .abstractFunc();
+ assertEquals("Default", cls.defaultImpl());
+ }
+
+}
diff --git a/testing-modules/junit-abstract/src/test/java/org/baeldung/testing/abstractclass/indepedentmethod/AbstractIndependentUnitTest.java b/testing-modules/junit-abstract/src/test/java/org/baeldung/testing/abstractclass/indepedentmethod/AbstractIndependentUnitTest.java
new file mode 100644
index 0000000000..ffad6327bd
--- /dev/null
+++ b/testing-modules/junit-abstract/src/test/java/org/baeldung/testing/abstractclass/indepedentmethod/AbstractIndependentUnitTest.java
@@ -0,0 +1,26 @@
+/**
+ *
+ */
+package org.baeldung.testing.abstractclass.indepedentmethod;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class AbstractIndependentUnitTest {
+
+@Test
+public void givenNonAbstractMethod_whenConcreteImpl_testCorrectBehaviour() {
+ ConcreteImpl conClass = new ConcreteImpl();
+ String actual = conClass.defaultImpl();
+
+ assertEquals("DEFAULT-1", actual);
+}
+
+ @Test
+ public void givenNonAbstractMethod_whenMockitoMock_testCorrectBehaviour() {
+ AbstractIndependent absCls = Mockito.mock(AbstractIndependent.class, Mockito.CALLS_REAL_METHODS);
+ assertEquals("DEFAULT-1", absCls.defaultImpl());
+ }
+}
diff --git a/testing-modules/junit-abstract/src/test/java/org/baeldung/testing/abstractclass/instancefields/AbstractInstanceFieldsUnitTest.java b/testing-modules/junit-abstract/src/test/java/org/baeldung/testing/abstractclass/instancefields/AbstractInstanceFieldsUnitTest.java
new file mode 100644
index 0000000000..ddaca8a245
--- /dev/null
+++ b/testing-modules/junit-abstract/src/test/java/org/baeldung/testing/abstractclass/instancefields/AbstractInstanceFieldsUnitTest.java
@@ -0,0 +1,40 @@
+package org.baeldung.testing.abstractclass.instancefields;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.reflect.Whitebox;
+
+public class AbstractInstanceFieldsUnitTest {
+
+ @Test
+ public void protectedInstanceField_MockClassCountGt5_testNonAbstractMethod() {
+
+ // mock
+ AbstractInstanceFields instClass = Mockito.mock(AbstractInstanceFields.class);
+ Mockito.doCallRealMethod()
+ .when(instClass)
+ .testFunc();
+
+ // set counter greater than 5
+ instClass.count = 7;
+
+ // compare the result
+ assertEquals("Overflow", instClass.testFunc());
+ }
+
+ @Test
+ public void givenNonAbstractMethodAndPrivateField_whenPowerMockitoAndActiveFieldTrue_thenCorrectBehaviour() {
+ AbstractInstanceFields instClass = PowerMockito.mock(AbstractInstanceFields.class);
+ PowerMockito.doCallRealMethod()
+ .when(instClass)
+ .testFunc();
+ Whitebox.setInternalState(instClass, "active", true);
+
+ // compare the expected result with actual
+ assertEquals("Added", instClass.testFunc());
+ }
+
+}
diff --git a/testing-modules/junit-abstract/src/test/java/org/baeldung/testing/abstractclass/privatemethod/AbstractPrivateMethodsUnitTest.java b/testing-modules/junit-abstract/src/test/java/org/baeldung/testing/abstractclass/privatemethod/AbstractPrivateMethodsUnitTest.java
new file mode 100644
index 0000000000..64f01a3c84
--- /dev/null
+++ b/testing-modules/junit-abstract/src/test/java/org/baeldung/testing/abstractclass/privatemethod/AbstractPrivateMethodsUnitTest.java
@@ -0,0 +1,40 @@
+/**
+ *
+ */
+package org.baeldung.testing.abstractclass.privatemethod;
+
+import static org.junit.Assert.assertEquals;
+
+import java.time.LocalDateTime;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+/**
+ * Providing custom values for private methods using powermock
+ *
+ */
+@RunWith(PowerMockRunner.class)
+@PrepareForTest(AbstractPrivateMethods.class)
+public class AbstractPrivateMethodsUnitTest {
+
+ @Test
+ public void givenNonAbstractMethodAndCallPrivateMethod_whenMockPrivateMethod_thenVerifyBehaviour() throws Exception {
+ AbstractPrivateMethods mockClass = PowerMockito.mock(AbstractPrivateMethods.class);
+ PowerMockito.doCallRealMethod()
+ .when(mockClass)
+ .defaultImpl();
+
+ String dateTime = LocalDateTime.now()
+ .toString();
+ PowerMockito.doReturn(dateTime)
+ .when(mockClass, "getCurrentDateTime");
+
+ String actual = mockClass.defaultImpl();
+ assertEquals(dateTime + "DEFAULT-1", actual);
+ }
+
+}
diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockAnnotationUnitTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockAnnotationUnitTest.java
index 5d565fea88..fcc646e8ea 100644
--- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockAnnotationUnitTest.java
+++ b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockAnnotationUnitTest.java
@@ -15,18 +15,22 @@ public class MockAnnotationUnitTest {
UserRepository mockRepository;
@Test
- public void testMockAnnotation() {
+ public void givenCountMethodMocked_WhenCountInvoked_ThenMockValueReturned() {
Mockito.when(mockRepository.count()).thenReturn(123L);
+
long userCount = mockRepository.count();
+
Assert.assertEquals(123L, userCount);
Mockito.verify(mockRepository).count();
}
@Test
- public void testMockitoMockMethod() {
+ public void givenCountMethodOfLocalMockVariableMocked_WhenCountInvoked_ThenMockedValueReturned() {
UserRepository localMockRepository = Mockito.mock(UserRepository.class);
Mockito.when(localMockRepository.count()).thenReturn(111L);
+
long userCount = localMockRepository.count();
+
Assert.assertEquals(111L, userCount);
Mockito.verify(localMockRepository).count();
}
diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockBeanAnnotationIntegrationTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockBeanAnnotationIntegrationTest.java
index 008e674696..fd9236fe13 100644
--- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockBeanAnnotationIntegrationTest.java
+++ b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockBeanAnnotationIntegrationTest.java
@@ -20,10 +20,12 @@ public class MockBeanAnnotationIntegrationTest {
ApplicationContext context;
@Test
- public void testMockBean() {
+ public void givenCountMethodMocked_WhenCountInvokedOnBeanFromContext_ThenMockValueReturned() {
Mockito.when(mockRepository.count()).thenReturn(123L);
+
UserRepository userRepoFromContext = context.getBean(UserRepository.class);
long userCount = userRepoFromContext.count();
+
Assert.assertEquals(123L, userCount);
Mockito.verify(mockRepository).count();
}
diff --git a/xml/src/test/resources/example_dom4j_new.xml b/xml/src/test/resources/example_dom4j_new.xml
deleted file mode 100644
index 020760fdd3..0000000000
--- a/xml/src/test/resources/example_dom4j_new.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
- XML with Dom4J
- XML handling with Dom4J
- 14/06/2016
- Dom4J tech writer
-
-
diff --git a/xml/src/test/resources/example_dom4j_updated.xml b/xml/src/test/resources/example_dom4j_updated.xml
deleted file mode 100755
index 962ca0c889..0000000000
--- a/xml/src/test/resources/example_dom4j_updated.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
- Guava updated
- Introduction to Guava
- 04/04/2016
- GuavaAuthor
-
-
- XML updated
- Introduction to XPath
- 04/05/2016
- XMLAuthor
-
-
- Android updated
- Introduction to Android
- 04/03/2016
- AndroidAuthor
-
-
- Spring updated
- Introduction to Spring
- 04/02/2016
- SpringAuthor
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/xml/src/test/resources/example_jaxb_new.xml b/xml/src/test/resources/example_jaxb_new.xml
deleted file mode 100644
index 646d938869..0000000000
--- a/xml/src/test/resources/example_jaxb_new.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
- Jaxb author
- 04/02/2015
- XML Binding with Jaxb
- XML with Jaxb
-
-