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-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..679e753c56
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java
@@ -0,0 +1,52 @@
+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.IterableUtils;
+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 convertListWithApacheCommons1(List list) {
+
+ Map map = new HashMap();
+
+ IterableUtils.forEach(list, animal -> {
+ map.put(animal.getId(), animal);
+ });
+
+ return map;
+ }
+
+ public Map convertListWithApacheCommons2(List list) {
+
+ Map map = new HashMap();
+
+ MapUtils.populateMap(map, list, Animal::getId);
+
+ return map;
+ }
+}
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..4e78af08cd
--- /dev/null
+++ b/core-java-8/src/test/java/com/baeldung/convertlisttomap/ConvertListToMapServiceUnitTest.java
@@ -0,0 +1,73 @@
+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_whenConvertWithApacheCommons1_thenReturnMapWithTheSameElements() {
+
+ Map map = convertListService.convertListWithApacheCommons1(list);
+
+ assertThat(map.values(), containsInAnyOrder(list.toArray()));
+ }
+
+ @Test
+ public void givenAList_whenConvertWithApacheCommons2_thenReturnMapWithTheSameElements() {
+
+ Map map = convertListService.convertListWithApacheCommons2(list);
+
+ assertThat(map.values(), containsInAnyOrder(list.toArray()));
+ }
+}
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
index 13df09b597..2e736501cf 100644
--- 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
@@ -50,22 +50,9 @@ public class HashSetInitalizingUnitTest {
@Test
public void whenUsingJava8_usingCollectOnStream_thenCorrectSize() {
- Set set = Stream.of("a", "b", "c").collect(Collectors.toSet());
+ Set set = Stream.of("a", "b", "c").collect(Collectors.toCollection(HashSet::new));
assertEquals(3, set.size());
}
- @Test
- public void whenUsingJava8_fromStringArray_thenCorrectSize() {
- String[] stringArray = {"a","b","c"};
- Set set = Arrays.stream(stringArray).collect(Collectors.toCollection(HashSet::new));
- assertEquals(3, set.size());
- }
-
- // Requires Java9 - uncomment if you are using Java 9 or higher
- /*@Test
- public void whenUsingJava9_usingCollectOnStream_thenCorrectSize() {
- Set set = Set.of("a", "b", "c");
- assertEquals(3, set.size());
- }*/
@Test
public void whenUsingGoogleGuava_createMutableSet_thenCorrectSize() {
@@ -78,4 +65,6 @@ public class HashSetInitalizingUnitTest {
Set set = ImmutableSet.of("a", "b", "c");
assertEquals(3, set.size());
}
+
}
+
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/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/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/pom.xml b/libraries/pom.xml
index 163f5872ce..69c55c4533 100644
--- a/libraries/pom.xml
+++ b/libraries/pom.xml
@@ -772,6 +772,12 @@
test
+
+ com.googlecode.jmapper-framework
+ jmapper-core
+ ${jmapper.version}
+
+
@@ -1015,6 +1021,7 @@
1.19.4
1.6.0
4.5.1
+ 1.6.0.1
3.3.0
3.0.2
diff --git a/libraries/src/main/java/com/baeldung/jmapper/User.java b/libraries/src/main/java/com/baeldung/jmapper/User.java
new file mode 100644
index 0000000000..9f99157183
--- /dev/null
+++ b/libraries/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/src/main/java/com/baeldung/jmapper/UserDto.java b/libraries/src/main/java/com/baeldung/jmapper/UserDto.java
new file mode 100644
index 0000000000..326e8f3cd5
--- /dev/null
+++ b/libraries/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/src/main/java/com/baeldung/jmapper/UserDto1.java b/libraries/src/main/java/com/baeldung/jmapper/UserDto1.java
new file mode 100644
index 0000000000..99247c56f6
--- /dev/null
+++ b/libraries/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/src/main/java/com/baeldung/jmapper/relational/User.java b/libraries/src/main/java/com/baeldung/jmapper/relational/User.java
new file mode 100644
index 0000000000..1238a82684
--- /dev/null
+++ b/libraries/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/src/main/java/com/baeldung/jmapper/relational/UserDto1.java b/libraries/src/main/java/com/baeldung/jmapper/relational/UserDto1.java
new file mode 100644
index 0000000000..375fd267a0
--- /dev/null
+++ b/libraries/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/src/main/java/com/baeldung/jmapper/relational/UserDto2.java b/libraries/src/main/java/com/baeldung/jmapper/relational/UserDto2.java
new file mode 100644
index 0000000000..d0858c7d8e
--- /dev/null
+++ b/libraries/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/src/main/resources/user_jmapper.xml b/libraries/src/main/resources/user_jmapper.xml
new file mode 100644
index 0000000000..f007de9f0a
--- /dev/null
+++ b/libraries/src/main/resources/user_jmapper.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/libraries/src/main/resources/user_jmapper1.xml b/libraries/src/main/resources/user_jmapper1.xml
new file mode 100644
index 0000000000..abcfd77e1c
--- /dev/null
+++ b/libraries/src/main/resources/user_jmapper1.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/libraries/src/main/resources/user_jmapper2.xml b/libraries/src/main/resources/user_jmapper2.xml
new file mode 100644
index 0000000000..1e708e14bf
--- /dev/null
+++ b/libraries/src/main/resources/user_jmapper2.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
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/libraries/src/test/java/com/baeldung/jmapper/JMapperIntegrationTest.java b/libraries/src/test/java/com/baeldung/jmapper/JMapperIntegrationTest.java
new file mode 100644
index 0000000000..96ed090482
--- /dev/null
+++ b/libraries/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/src/test/java/com/baeldung/jmapper/JMapperRelationalIntegrationTest.java b/libraries/src/test/java/com/baeldung/jmapper/JMapperRelationalIntegrationTest.java
new file mode 100644
index 0000000000..6af2865159
--- /dev/null
+++ b/libraries/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/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/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/pom.xml b/pom.xml
index 85eadf0392..71a2d35bfa 100644
--- a/pom.xml
+++ b/pom.xml
@@ -195,6 +195,61 @@
${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
+
+
+
+
+
+
+
+
+
+
+
+
@@ -203,33 +258,25 @@
default
+
org.apache.maven.plugins
maven-surefire-plugin
-
-
- integration-test
-
- test
-
-
-
- **/*ManualTest.java
- **/*LiveTest.java
-
-
- **/*IntegrationTest.java
- **/*IntTest.java
-
-
-
-
+ ${maven-surefire-plugin.version}
-
- json
-
+ 3
+ true
+
+ **/*IntegrationTest.java
+ **/*IntTest.java
+ **/*LongRunningUnitTest.java
+ **/*ManualTest.java
+ **/JdbcTest.java
+ **/*LiveTest.java
+
+
@@ -499,6 +546,7 @@
maven-archetype
apache-meecrowave
spring-reactive-kotlin
+ jnosql
@@ -572,14 +620,17 @@
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
+ 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
@@ -615,6 +666,12 @@
spring-amqp-simple
spring-apache-camel
spring-batch
+
+
+
+
+
+
spring-bom
spring-boot
spring-boot-keycloak
@@ -640,6 +697,276 @@
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
+ 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
@@ -673,46 +1000,161 @@
spring-rest-query-language
spring-rest
spring-rest-simple
- spring-reactive-kotlin
-
-
-
-
+ 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
+ ejb
+ persistence-modules/java-cassandra
+
+
+
+
+
+ integration-heavy
+
+
+
+
+ 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
+
+ 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
+
+
+
+
+
+
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/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-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-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-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-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-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/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