From 4a348df28ac3116b6ae662097494c39e3e5375ca Mon Sep 17 00:00:00 2001 From: 515882294 <515882294@qq.com> Date: Thu, 30 Sep 2021 23:19:04 +0800 Subject: [PATCH 001/278] Convert Byte Array to its Numeric Representation --- .../core-java-arrays-convert/pom.xml | 5 + .../ByteArrayToNumericRepresentation.java | 281 +++++++++++++ ...eArrayToNumericRepresentationUnitTest.java | 391 ++++++++++++++++++ 3 files changed, 677 insertions(+) create mode 100644 core-java-modules/core-java-arrays-convert/src/main/java/com/baeldung/array/conversions/ByteArrayToNumericRepresentation.java create mode 100644 core-java-modules/core-java-arrays-convert/src/test/java/com/baeldung/array/conversions/ByteArrayToNumericRepresentationUnitTest.java diff --git a/core-java-modules/core-java-arrays-convert/pom.xml b/core-java-modules/core-java-arrays-convert/pom.xml index 4cb2946ac9..6e001e12b0 100644 --- a/core-java-modules/core-java-arrays-convert/pom.xml +++ b/core-java-modules/core-java-arrays-convert/pom.xml @@ -19,6 +19,11 @@ guava ${guava.version} + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + diff --git a/core-java-modules/core-java-arrays-convert/src/main/java/com/baeldung/array/conversions/ByteArrayToNumericRepresentation.java b/core-java-modules/core-java-arrays-convert/src/main/java/com/baeldung/array/conversions/ByteArrayToNumericRepresentation.java new file mode 100644 index 0000000000..82d60e1666 --- /dev/null +++ b/core-java-modules/core-java-arrays-convert/src/main/java/com/baeldung/array/conversions/ByteArrayToNumericRepresentation.java @@ -0,0 +1,281 @@ +package com.baeldung.array.conversions; + +import com.google.common.primitives.Ints; +import com.google.common.primitives.Longs; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.Conversion; + +import java.math.BigInteger; +import java.nio.ByteBuffer; +import java.util.Arrays; + +class ByteArrayToNumericRepresentation { + + static int convertByteArrayToIntUsingShiftOperator(byte[] bytes) { + int value = 0; + for (byte b : bytes) { + value = (value << 8) + (b & 0xFF); + } + return value; + } + + static byte[] convertIntToByteArrayUsingShiftOperator(int value) { + byte[] bytes = new byte[Integer.BYTES]; + int length = bytes.length; + for (int i = 0; i < length; i++) { + bytes[length - i - 1] = (byte) (value & 0xFF); + value >>= 8; + } + return bytes; + } + + static long convertByteArrayToLongUsingShiftOperator(byte[] bytes) { + long value = 0; + for (byte b : bytes) { + value <<= 8; + value |= (b & 0xFF); + } + return value; + } + + static byte[] convertLongToByteArrayUsingShiftOperator(long value) { + byte[] bytes = new byte[Long.BYTES]; + int length = bytes.length; + for (int i = 0; i < length; i++) { + bytes[length - i - 1] = (byte) (value & 0xFF); + value >>= 8; + } + return bytes; + } + + static float convertByteArrayToFloatUsingShiftOperator(byte[] bytes) { + // convert bytes to int + int intValue = 0; + for (byte b : bytes) { + intValue = (intValue << 8) + (b & 0xFF); + } + + // convert int to float + return Float.intBitsToFloat(intValue); + } + + static byte[] convertFloatToByteArrayUsingShiftOperator(float value) { + // convert float to int + int intValue = Float.floatToIntBits(value); + + // convert int to bytes + byte[] bytes = new byte[Float.BYTES]; + int length = bytes.length; + for (int i = 0; i < length; i++) { + bytes[length - i - 1] = (byte) (intValue & 0xFF); + intValue >>= 8; + } + return bytes; + } + + static double convertingByteArrayToDoubleUsingShiftOperator(byte[] bytes) { + long longValue = 0; + for (byte b : bytes) { + longValue = (longValue << 8) + (b & 0xFF); + } + + return Double.longBitsToDouble(longValue); + } + + static byte[] convertDoubleToByteArrayUsingShiftOperator(double value) { + long longValue = Double.doubleToLongBits(value); + + byte[] bytes = new byte[Double.BYTES]; + int length = bytes.length; + for (int i = 0; i < length; i++) { + bytes[length - i - 1] = (byte) (longValue & 0xFF); + longValue >>= 8; + } + return bytes; + } + + static int convertByteArrayToIntUsingByteBuffer(byte[] bytes) { + ByteBuffer buffer = ByteBuffer.allocate(Integer.BYTES); + buffer.put(bytes); + buffer.rewind(); + return buffer.getInt(); + } + + static byte[] convertIntToByteArrayUsingByteBuffer(int value) { + ByteBuffer buffer = ByteBuffer.allocate(Integer.BYTES); + buffer.putInt(value); + buffer.rewind(); + return buffer.array(); + } + + static long convertByteArrayToLongUsingByteBuffer(byte[] bytes) { + ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES); + buffer.put(bytes); + buffer.rewind(); + return buffer.getLong(); + } + + static byte[] convertLongToByteArrayUsingByteBuffer(long value) { + ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES); + buffer.putLong(value); + buffer.rewind(); + return buffer.array(); + } + + static float convertByteArrayToFloatUsingByteBuffer(byte[] bytes) { + ByteBuffer buffer = ByteBuffer.allocate(Float.BYTES); + buffer.put(bytes); + buffer.rewind(); + return buffer.getFloat(); + } + + static byte[] convertFloatToByteArrayUsingByteBuffer(float value) { + ByteBuffer buffer = ByteBuffer.allocate(Float.BYTES); + buffer.putFloat(value); + buffer.rewind(); + return buffer.array(); + } + + static double convertByteArrayToDoubleUsingByteBuffer(byte[] bytes) { + ByteBuffer buffer = ByteBuffer.allocate(Double.BYTES); + buffer.put(bytes); + buffer.rewind(); + return buffer.getDouble(); + } + + static byte[] convertDoubleToByteArrayUsingByteBuffer(double value) { + ByteBuffer buffer = ByteBuffer.allocate(Double.BYTES); + buffer.putDouble(value); + buffer.rewind(); + return buffer.array(); + } + + static int convertByteArrayToIntUsingBigInteger(byte[] bytes) { + return new BigInteger(bytes).intValue(); + } + + static byte[] convertIntToByteArrayUsingBigInteger(int value) { + return BigInteger.valueOf(value).toByteArray(); + } + + static long convertByteArrayToLongUsingBigInteger(byte[] bytes) { + return new BigInteger(bytes).longValue(); + } + + static byte[] convertLongToByteArrayUsingBigInteger(long value) { + return BigInteger.valueOf(value).toByteArray(); + } + + static float convertByteArrayToFloatUsingBigInteger(byte[] bytes) { + int intValue = new BigInteger(bytes).intValue(); + return Float.intBitsToFloat(intValue); + } + + static byte[] convertFloatToByteArrayUsingBigInteger(float value) { + int intValue = Float.floatToIntBits(value); + return BigInteger.valueOf(intValue).toByteArray(); + } + + static double convertByteArrayToDoubleUsingBigInteger(byte[] bytes) { + long longValue = new BigInteger(bytes).longValue(); + return Double.longBitsToDouble(longValue); + } + + static byte[] convertDoubleToByteArrayUsingBigInteger(double value) { + long longValue = Double.doubleToLongBits(value); + return BigInteger.valueOf(longValue).toByteArray(); + } + + static int convertingByteArrayToIntUsingGuava(byte[] bytes) { + return Ints.fromByteArray(bytes); + } + + static byte[] convertIntToByteArrayUsingGuava(int value) { + return Ints.toByteArray(value); + } + + static long convertByteArrayToLongUsingGuava(byte[] bytes) { + return Longs.fromByteArray(bytes); + } + + static byte[] convertLongToByteArrayUsingGuava(long value) { + return Longs.toByteArray(value); + } + + static float convertByteArrayToFloatUsingGuava(byte[] bytes) { + int intValue = Ints.fromByteArray(bytes); + return Float.intBitsToFloat(intValue); + } + + static byte[] convertFloatToByteArrayUsingGuava(float value) { + int intValue = Float.floatToIntBits(value); + return Ints.toByteArray(intValue); + } + + static double convertByteArrayToDoubleUsingGuava(byte[] bytes) { + long longValue = Longs.fromByteArray(bytes); + return Double.longBitsToDouble(longValue); + } + + static byte[] convertDoubleToByteArrayUsingGuava(double value) { + long longValue = Double.doubleToLongBits(value); + return Longs.toByteArray(longValue); + } + + static int convertByteArrayToIntUsingCommonsLang(byte[] bytes) { + byte[] copyBytes = Arrays.copyOf(bytes, bytes.length); + ArrayUtils.reverse(copyBytes); + return Conversion.byteArrayToInt(copyBytes, 0, 0, 0, copyBytes.length); + } + + static byte[] convertIntToByteArrayUsingCommonsLang(int value) { + byte[] bytes = new byte[Integer.BYTES]; + Conversion.intToByteArray(value, 0, bytes, 0, bytes.length); + ArrayUtils.reverse(bytes); + return bytes; + } + + static long convertByteArrayToLongUsingCommonsLang(byte[] bytes) { + byte[] copyBytes = Arrays.copyOf(bytes, bytes.length); + ArrayUtils.reverse(copyBytes); + return Conversion.byteArrayToLong(copyBytes, 0, 0, 0, copyBytes.length); + } + + static byte[] convertLongToByteArrayUsingCommonsLang(long value) { + byte[] bytes = new byte[Long.BYTES]; + Conversion.longToByteArray(value, 0, bytes, 0, bytes.length); + ArrayUtils.reverse(bytes); + return bytes; + } + + static float convertByteArrayToFloatUsingCommonsLang(byte[] bytes) { + byte[] copyBytes = Arrays.copyOf(bytes, bytes.length); + ArrayUtils.reverse(copyBytes); + int intValue = Conversion.byteArrayToInt(copyBytes, 0, 0, 0, copyBytes.length); + return Float.intBitsToFloat(intValue); + } + + static byte[] convertFloatToByteArrayUsingCommonsLang(float value) { + int intValue = Float.floatToIntBits(value); + byte[] bytes = new byte[Float.BYTES]; + Conversion.intToByteArray(intValue, 0, bytes, 0, bytes.length); + ArrayUtils.reverse(bytes); + return bytes; + } + + static double convertByteArrayToDoubleUsingCommonsLang(byte[] bytes) { + byte[] copyBytes = Arrays.copyOf(bytes, bytes.length); + ArrayUtils.reverse(copyBytes); + long longValue = Conversion.byteArrayToLong(copyBytes, 0, 0, 0, copyBytes.length); + return Double.longBitsToDouble(longValue); + } + + static byte[] convertDoubleToByteArrayUsingCommonsLang(double value) { + long longValue = Double.doubleToLongBits(value); + byte[] bytes = new byte[Long.BYTES]; + Conversion.longToByteArray(longValue, 0, bytes, 0, bytes.length); + ArrayUtils.reverse(bytes); + return bytes; + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-arrays-convert/src/test/java/com/baeldung/array/conversions/ByteArrayToNumericRepresentationUnitTest.java b/core-java-modules/core-java-arrays-convert/src/test/java/com/baeldung/array/conversions/ByteArrayToNumericRepresentationUnitTest.java new file mode 100644 index 0000000000..666b5a6be8 --- /dev/null +++ b/core-java-modules/core-java-arrays-convert/src/test/java/com/baeldung/array/conversions/ByteArrayToNumericRepresentationUnitTest.java @@ -0,0 +1,391 @@ +package com.baeldung.array.conversions; + +import org.junit.Test; + +import java.util.Arrays; + +import static com.baeldung.array.conversions.ByteArrayToNumericRepresentation.*; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; + +public class ByteArrayToNumericRepresentationUnitTest { + private static final byte[] INT_BYTE_ARRAY = new byte[]{ + (byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE + }; + private static final int INT_VALUE = 0xCAFEBABE; + + + private static final byte[] FLOAT_BYTE_ARRAY = new byte[]{ + (byte) 0x40, (byte) 0x48, (byte) 0xF5, (byte) 0xC3 + }; + private static final float FLOAT_VALUE = 3.14F; + + + private static final byte[] LONG_BYTE_ARRAY = new byte[]{ + (byte) 0x01, (byte) 0x23, (byte) 0x45, (byte) 0x67, + (byte) 0x89, (byte) 0xAB, (byte) 0xCD, (byte) 0xEF + }; + private static final long LONG_VALUE = 0x0123456789ABCDEFL; + + + private static final byte[] DOUBLE_BYTE_ARRAY = new byte[]{ + (byte) 0x3F, (byte) 0xE3, (byte) 0xC6, (byte) 0xA7, + (byte) 0xEF, (byte) 0x9D, (byte) 0xB2, (byte) 0x2D + }; + private static final double DOUBLE_VALUE = 0.618D; + + + private int getIntValue() { + return INT_VALUE; + } + + private byte[] getIntByteArray() { + return Arrays.copyOf(INT_BYTE_ARRAY, INT_BYTE_ARRAY.length); + } + + private long getLongValue() { + return LONG_VALUE; + } + + private byte[] getLongByteArray() { + return Arrays.copyOf(LONG_BYTE_ARRAY, LONG_BYTE_ARRAY.length); + } + + private float getFloatValue() { + return FLOAT_VALUE; + } + + private byte[] getFloatByteArray() { + return Arrays.copyOf(FLOAT_BYTE_ARRAY, FLOAT_BYTE_ARRAY.length); + } + + private double getDoubleValue() { + return DOUBLE_VALUE; + } + + private byte[] getDoubleByteArray() { + return Arrays.copyOf(DOUBLE_BYTE_ARRAY, DOUBLE_BYTE_ARRAY.length); + } + + + @Test + public void givenShiftOperator_whenConvertingByteArrayToInt_thenSuccess() { + byte[] bytes = getIntByteArray(); + int value = convertByteArrayToIntUsingShiftOperator(bytes); + + assertEquals(INT_VALUE, value); + } + + @Test + public void givenShiftOperator_whenConvertingIntToByteArray_thenSuccess() { + int value = getIntValue(); + byte[] bytes = convertIntToByteArrayUsingShiftOperator(value); + + assertArrayEquals(INT_BYTE_ARRAY, bytes); + } + + @Test + public void givenShiftOperator_whenConvertingByteArrayToLong_thenSuccess() { + byte[] bytes = getLongByteArray(); + long value = convertByteArrayToLongUsingShiftOperator(bytes); + + assertEquals(LONG_VALUE, value); + } + + @Test + public void givenShiftOperator_whenConvertingLongToByteArray_thenSuccess() { + long value = getLongValue(); + byte[] bytes = convertLongToByteArrayUsingShiftOperator(value); + + assertArrayEquals(LONG_BYTE_ARRAY, bytes); + } + + @Test + public void givenShiftOperator_whenConvertingByteArrayToFloat_thenSuccess() { + byte[] bytes = getFloatByteArray(); + float value = convertByteArrayToFloatUsingShiftOperator(bytes); + + assertEquals(Float.floatToIntBits(FLOAT_VALUE), Float.floatToIntBits(value)); + } + + @Test + public void givenShiftOperator_whenConvertingFloatToByteArray_thenSuccess() { + float value = getFloatValue(); + byte[] bytes = convertFloatToByteArrayUsingShiftOperator(value); + + assertArrayEquals(FLOAT_BYTE_ARRAY, bytes); + } + + @Test + public void givenShiftOperator_whenConvertingByteArrayToDouble_thenSuccess() { + byte[] bytes = getDoubleByteArray(); + double value = convertingByteArrayToDoubleUsingShiftOperator(bytes); + + assertEquals(Double.doubleToLongBits(DOUBLE_VALUE), Double.doubleToLongBits(value)); + } + + @Test + public void givenShiftOperator_whenConvertingDoubleToByteArray_thenSuccess() { + double value = getDoubleValue(); + byte[] bytes = convertDoubleToByteArrayUsingShiftOperator(value); + + assertArrayEquals(DOUBLE_BYTE_ARRAY, bytes); + } + + @Test + public void givenByteBuffer_whenConvertingByteArrayToInt_thenSuccess() { + byte[] bytes = getIntByteArray(); + int value = convertByteArrayToIntUsingByteBuffer(bytes); + + assertEquals(INT_VALUE, value); + } + + @Test + public void givenByteBuffer_whenConvertingIntToByteArray_thenSuccess() { + int value = getIntValue(); + byte[] bytes = convertIntToByteArrayUsingByteBuffer(value); + + assertArrayEquals(INT_BYTE_ARRAY, bytes); + } + + @Test + public void givenByteBuffer_whenConvertingByteArrayToLong_thenSuccess() { + byte[] bytes = getLongByteArray(); + long value = convertByteArrayToLongUsingByteBuffer(bytes); + + assertEquals(LONG_VALUE, value); + } + + @Test + public void givenByteBuffer_whenConvertingLongToByteArray_thenSuccess() { + long value = getLongValue(); + byte[] bytes = convertLongToByteArrayUsingByteBuffer(value); + + assertArrayEquals(LONG_BYTE_ARRAY, bytes); + } + + @Test + public void givenByteBuffer_whenConvertingByteArrayToFloat_thenSuccess() { + byte[] bytes = getFloatByteArray(); + float value = convertByteArrayToFloatUsingByteBuffer(bytes); + + assertEquals(Float.floatToIntBits(FLOAT_VALUE), Float.floatToIntBits(value)); + } + + @Test + public void givenByteBuffer_whenConvertingFloatToByteArray_thenSuccess() { + float value = getFloatValue(); + byte[] bytes = convertFloatToByteArrayUsingByteBuffer(value); + + assertArrayEquals(FLOAT_BYTE_ARRAY, bytes); + } + + @Test + public void givenByteBuffer_whenConvertingByteArrayToDouble_thenSuccess() { + byte[] bytes = getDoubleByteArray(); + double value = convertByteArrayToDoubleUsingByteBuffer(bytes); + + assertEquals(Double.doubleToLongBits(DOUBLE_VALUE), Double.doubleToLongBits(value)); + } + + @Test + public void givenByteBuffer_whenConvertingDoubleToByteArray_thenSuccess() { + double value = getDoubleValue(); + byte[] bytes = convertDoubleToByteArrayUsingByteBuffer(value); + + assertArrayEquals(DOUBLE_BYTE_ARRAY, bytes); + } + + @Test + public void givenBigInteger_whenConvertingByteArrayToInt_thenSuccess() { + byte[] bytes = getIntByteArray(); + int value = convertByteArrayToIntUsingBigInteger(bytes); + + assertEquals(INT_VALUE, value); + } + + @Test + public void givenBigInteger_whenConvertingIntToByteArray_thenSuccess() { + int value = getIntValue(); + byte[] bytes = convertIntToByteArrayUsingBigInteger(value); + + assertArrayEquals(INT_BYTE_ARRAY, bytes); + } + + @Test + public void givenBigInteger_whenConvertingByteArrayToLong_thenSuccess() { + byte[] bytes = getLongByteArray(); + long value = convertByteArrayToLongUsingBigInteger(bytes); + + assertEquals(LONG_VALUE, value); + } + + @Test + public void givenBigInteger_whenConvertingLongToByteArray_thenSuccess() { + long value = getLongValue(); + byte[] bytes = convertLongToByteArrayUsingBigInteger(value); + + assertArrayEquals(LONG_BYTE_ARRAY, bytes); + } + + @Test + public void givenBigInteger_whenConvertingByteArrayToFloat_thenSuccess() { + byte[] bytes = getFloatByteArray(); + float value = convertByteArrayToFloatUsingBigInteger(bytes); + + assertEquals(Float.floatToIntBits(FLOAT_VALUE), Float.floatToIntBits(value)); + } + + @Test + public void givenBigInteger_whenConvertingFloatToByteArray_thenSuccess() { + float value = getFloatValue(); + byte[] bytes = convertFloatToByteArrayUsingBigInteger(value); + + assertArrayEquals(FLOAT_BYTE_ARRAY, bytes); + } + + @Test + public void givenBigInteger_whenConvertingByteArrayToDouble_thenSuccess() { + byte[] bytes = getDoubleByteArray(); + double value = convertByteArrayToDoubleUsingBigInteger(bytes); + + assertEquals(Double.doubleToLongBits(DOUBLE_VALUE), Double.doubleToLongBits(value)); + } + + @Test + public void givenBigInteger_whenConvertingDoubleToByteArray_thenSuccess() { + double value = getDoubleValue(); + byte[] bytes = convertDoubleToByteArrayUsingBigInteger(value); + + assertArrayEquals(DOUBLE_BYTE_ARRAY, bytes); + } + + @Test + public void givenGuava_whenConvertingByteArrayToInt_thenSuccess() { + byte[] bytes = getIntByteArray(); + int value = convertingByteArrayToIntUsingGuava(bytes); + + assertEquals(INT_VALUE, value); + } + + @Test + public void givenGuava_whenConvertingIntToByteArray_thenSuccess() { + int value = getIntValue(); + byte[] bytes = convertIntToByteArrayUsingGuava(value); + + assertArrayEquals(INT_BYTE_ARRAY, bytes); + } + + @Test + public void givenGuava_whenConvertingByteArrayToLong_thenSuccess() { + byte[] bytes = getLongByteArray(); + long value = convertByteArrayToLongUsingGuava(bytes); + + assertEquals(LONG_VALUE, value); + } + + @Test + public void givenGuava_whenConvertingLongToByteArray_thenSuccess() { + long value = getLongValue(); + byte[] bytes = convertLongToByteArrayUsingGuava(value); + + assertArrayEquals(LONG_BYTE_ARRAY, bytes); + } + + @Test + public void givenGuava_whenConvertingByteArrayToFloat_thenSuccess() { + byte[] bytes = getFloatByteArray(); + float value = convertByteArrayToFloatUsingGuava(bytes); + + assertEquals(Float.floatToIntBits(FLOAT_VALUE), Float.floatToIntBits(value)); + } + + @Test + public void givenGuava_whenConvertingFloatToByteArray_thenSuccess() { + float value = getFloatValue(); + byte[] bytes = convertFloatToByteArrayUsingGuava(value); + + assertArrayEquals(FLOAT_BYTE_ARRAY, bytes); + } + + @Test + public void givenGuava_whenConvertingByteArrayToDouble_thenSuccess() { + byte[] bytes = getDoubleByteArray(); + double value = convertByteArrayToDoubleUsingGuava(bytes); + + assertEquals(Double.doubleToLongBits(DOUBLE_VALUE), Double.doubleToLongBits(value)); + } + + @Test + public void givenGuava_whenConvertingDoubleToByteArray_thenSuccess() { + double value = getDoubleValue(); + byte[] bytes = convertDoubleToByteArrayUsingGuava(value); + + assertArrayEquals(DOUBLE_BYTE_ARRAY, bytes); + } + + @Test + public void givenCommonsLang_whenConvertingByteArrayToInt_thenSuccess() { + byte[] bytes = getIntByteArray(); + int value = convertByteArrayToIntUsingCommonsLang(bytes); + + assertEquals(INT_VALUE, value); + } + + @Test + public void givenCommonsLang_whenConvertingIntToByteArray_thenSuccess() { + int value = getIntValue(); + byte[] bytes = convertIntToByteArrayUsingCommonsLang(value); + + assertArrayEquals(INT_BYTE_ARRAY, bytes); + } + + @Test + public void givenCommonsLang_whenConvertingByteArrayToLong_thenSuccess() { + byte[] bytes = getLongByteArray(); + long value = convertByteArrayToLongUsingCommonsLang(bytes); + + assertEquals(LONG_VALUE, value); + } + + @Test + public void givenCommonsLang_whenConvertingLongToByteArray_thenSuccess() { + long value = getLongValue(); + byte[] bytes = convertLongToByteArrayUsingCommonsLang(value); + + assertArrayEquals(LONG_BYTE_ARRAY, bytes); + } + + @Test + public void givenCommonsLang_whenConvertingByteArrayToFloat_thenSuccess() { + byte[] bytes = getFloatByteArray(); + float value = convertByteArrayToFloatUsingCommonsLang(bytes); + + assertEquals(Float.floatToIntBits(FLOAT_VALUE), Float.floatToIntBits(value)); + } + + @Test + public void givenCommonsLang_whenConvertingFloatToByteArray_thenSuccess() { + float value = getFloatValue(); + byte[] bytes = convertFloatToByteArrayUsingCommonsLang(value); + + assertArrayEquals(FLOAT_BYTE_ARRAY, bytes); + } + + @Test + public void givenCommonsLang_whenConvertingByteArrayToDouble_thenSuccess() { + byte[] bytes = getDoubleByteArray(); + double value = convertByteArrayToDoubleUsingCommonsLang(bytes); + + assertEquals(Double.doubleToLongBits(DOUBLE_VALUE), Double.doubleToLongBits(value)); + } + + @Test + public void givenCommonsLang_whenConvertingDoubleToByteArray_thenSuccess() { + double value = getDoubleValue(); + byte[] bytes = convertDoubleToByteArrayUsingCommonsLang(value); + + assertArrayEquals(DOUBLE_BYTE_ARRAY, bytes); + } + +} \ No newline at end of file From b7ea6ec38893bdeb4fa505616b71083a7900fddb Mon Sep 17 00:00:00 2001 From: 515882294 <515882294@qq.com> Date: Thu, 7 Oct 2021 14:43:13 +0800 Subject: [PATCH 002/278] Remove Redundant Getter Method --- ...eArrayToNumericRepresentationUnitTest.java | 155 +++++------------- 1 file changed, 40 insertions(+), 115 deletions(-) diff --git a/core-java-modules/core-java-arrays-convert/src/test/java/com/baeldung/array/conversions/ByteArrayToNumericRepresentationUnitTest.java b/core-java-modules/core-java-arrays-convert/src/test/java/com/baeldung/array/conversions/ByteArrayToNumericRepresentationUnitTest.java index 666b5a6be8..0fae765d9c 100644 --- a/core-java-modules/core-java-arrays-convert/src/test/java/com/baeldung/array/conversions/ByteArrayToNumericRepresentationUnitTest.java +++ b/core-java-modules/core-java-arrays-convert/src/test/java/com/baeldung/array/conversions/ByteArrayToNumericRepresentationUnitTest.java @@ -2,8 +2,6 @@ package com.baeldung.array.conversions; import org.junit.Test; -import java.util.Arrays; - import static com.baeldung.array.conversions.ByteArrayToNumericRepresentation.*; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; @@ -35,355 +33,282 @@ public class ByteArrayToNumericRepresentationUnitTest { private static final double DOUBLE_VALUE = 0.618D; - private int getIntValue() { - return INT_VALUE; - } - - private byte[] getIntByteArray() { - return Arrays.copyOf(INT_BYTE_ARRAY, INT_BYTE_ARRAY.length); - } - - private long getLongValue() { - return LONG_VALUE; - } - - private byte[] getLongByteArray() { - return Arrays.copyOf(LONG_BYTE_ARRAY, LONG_BYTE_ARRAY.length); - } - - private float getFloatValue() { - return FLOAT_VALUE; - } - - private byte[] getFloatByteArray() { - return Arrays.copyOf(FLOAT_BYTE_ARRAY, FLOAT_BYTE_ARRAY.length); - } - - private double getDoubleValue() { - return DOUBLE_VALUE; - } - - private byte[] getDoubleByteArray() { - return Arrays.copyOf(DOUBLE_BYTE_ARRAY, DOUBLE_BYTE_ARRAY.length); - } - - @Test public void givenShiftOperator_whenConvertingByteArrayToInt_thenSuccess() { - byte[] bytes = getIntByteArray(); - int value = convertByteArrayToIntUsingShiftOperator(bytes); + int value = convertByteArrayToIntUsingShiftOperator(INT_BYTE_ARRAY); assertEquals(INT_VALUE, value); } @Test public void givenShiftOperator_whenConvertingIntToByteArray_thenSuccess() { - int value = getIntValue(); - byte[] bytes = convertIntToByteArrayUsingShiftOperator(value); + byte[] bytes = convertIntToByteArrayUsingShiftOperator(INT_VALUE); assertArrayEquals(INT_BYTE_ARRAY, bytes); } @Test public void givenShiftOperator_whenConvertingByteArrayToLong_thenSuccess() { - byte[] bytes = getLongByteArray(); - long value = convertByteArrayToLongUsingShiftOperator(bytes); + long value = convertByteArrayToLongUsingShiftOperator(LONG_BYTE_ARRAY); assertEquals(LONG_VALUE, value); } @Test public void givenShiftOperator_whenConvertingLongToByteArray_thenSuccess() { - long value = getLongValue(); - byte[] bytes = convertLongToByteArrayUsingShiftOperator(value); + byte[] bytes = convertLongToByteArrayUsingShiftOperator(LONG_VALUE); assertArrayEquals(LONG_BYTE_ARRAY, bytes); } @Test public void givenShiftOperator_whenConvertingByteArrayToFloat_thenSuccess() { - byte[] bytes = getFloatByteArray(); - float value = convertByteArrayToFloatUsingShiftOperator(bytes); + float value = convertByteArrayToFloatUsingShiftOperator(FLOAT_BYTE_ARRAY); assertEquals(Float.floatToIntBits(FLOAT_VALUE), Float.floatToIntBits(value)); } @Test public void givenShiftOperator_whenConvertingFloatToByteArray_thenSuccess() { - float value = getFloatValue(); - byte[] bytes = convertFloatToByteArrayUsingShiftOperator(value); + byte[] bytes = convertFloatToByteArrayUsingShiftOperator(FLOAT_VALUE); assertArrayEquals(FLOAT_BYTE_ARRAY, bytes); } @Test public void givenShiftOperator_whenConvertingByteArrayToDouble_thenSuccess() { - byte[] bytes = getDoubleByteArray(); - double value = convertingByteArrayToDoubleUsingShiftOperator(bytes); + double value = convertingByteArrayToDoubleUsingShiftOperator(DOUBLE_BYTE_ARRAY); assertEquals(Double.doubleToLongBits(DOUBLE_VALUE), Double.doubleToLongBits(value)); } @Test public void givenShiftOperator_whenConvertingDoubleToByteArray_thenSuccess() { - double value = getDoubleValue(); - byte[] bytes = convertDoubleToByteArrayUsingShiftOperator(value); + byte[] bytes = convertDoubleToByteArrayUsingShiftOperator(DOUBLE_VALUE); assertArrayEquals(DOUBLE_BYTE_ARRAY, bytes); } @Test public void givenByteBuffer_whenConvertingByteArrayToInt_thenSuccess() { - byte[] bytes = getIntByteArray(); - int value = convertByteArrayToIntUsingByteBuffer(bytes); + int value = convertByteArrayToIntUsingByteBuffer(INT_BYTE_ARRAY); assertEquals(INT_VALUE, value); } @Test public void givenByteBuffer_whenConvertingIntToByteArray_thenSuccess() { - int value = getIntValue(); - byte[] bytes = convertIntToByteArrayUsingByteBuffer(value); + byte[] bytes = convertIntToByteArrayUsingByteBuffer(INT_VALUE); assertArrayEquals(INT_BYTE_ARRAY, bytes); } @Test public void givenByteBuffer_whenConvertingByteArrayToLong_thenSuccess() { - byte[] bytes = getLongByteArray(); - long value = convertByteArrayToLongUsingByteBuffer(bytes); + long value = convertByteArrayToLongUsingByteBuffer(LONG_BYTE_ARRAY); assertEquals(LONG_VALUE, value); } @Test public void givenByteBuffer_whenConvertingLongToByteArray_thenSuccess() { - long value = getLongValue(); - byte[] bytes = convertLongToByteArrayUsingByteBuffer(value); + byte[] bytes = convertLongToByteArrayUsingByteBuffer(LONG_VALUE); assertArrayEquals(LONG_BYTE_ARRAY, bytes); } @Test public void givenByteBuffer_whenConvertingByteArrayToFloat_thenSuccess() { - byte[] bytes = getFloatByteArray(); - float value = convertByteArrayToFloatUsingByteBuffer(bytes); + float value = convertByteArrayToFloatUsingByteBuffer(FLOAT_BYTE_ARRAY); assertEquals(Float.floatToIntBits(FLOAT_VALUE), Float.floatToIntBits(value)); } @Test public void givenByteBuffer_whenConvertingFloatToByteArray_thenSuccess() { - float value = getFloatValue(); - byte[] bytes = convertFloatToByteArrayUsingByteBuffer(value); + byte[] bytes = convertFloatToByteArrayUsingByteBuffer(FLOAT_VALUE); assertArrayEquals(FLOAT_BYTE_ARRAY, bytes); } @Test public void givenByteBuffer_whenConvertingByteArrayToDouble_thenSuccess() { - byte[] bytes = getDoubleByteArray(); - double value = convertByteArrayToDoubleUsingByteBuffer(bytes); + double value = convertByteArrayToDoubleUsingByteBuffer(DOUBLE_BYTE_ARRAY); assertEquals(Double.doubleToLongBits(DOUBLE_VALUE), Double.doubleToLongBits(value)); } @Test public void givenByteBuffer_whenConvertingDoubleToByteArray_thenSuccess() { - double value = getDoubleValue(); - byte[] bytes = convertDoubleToByteArrayUsingByteBuffer(value); + byte[] bytes = convertDoubleToByteArrayUsingByteBuffer(DOUBLE_VALUE); assertArrayEquals(DOUBLE_BYTE_ARRAY, bytes); } @Test public void givenBigInteger_whenConvertingByteArrayToInt_thenSuccess() { - byte[] bytes = getIntByteArray(); - int value = convertByteArrayToIntUsingBigInteger(bytes); + int value = convertByteArrayToIntUsingBigInteger(INT_BYTE_ARRAY); assertEquals(INT_VALUE, value); } @Test public void givenBigInteger_whenConvertingIntToByteArray_thenSuccess() { - int value = getIntValue(); - byte[] bytes = convertIntToByteArrayUsingBigInteger(value); + byte[] bytes = convertIntToByteArrayUsingBigInteger(INT_VALUE); assertArrayEquals(INT_BYTE_ARRAY, bytes); } @Test public void givenBigInteger_whenConvertingByteArrayToLong_thenSuccess() { - byte[] bytes = getLongByteArray(); - long value = convertByteArrayToLongUsingBigInteger(bytes); + long value = convertByteArrayToLongUsingBigInteger(LONG_BYTE_ARRAY); assertEquals(LONG_VALUE, value); } @Test public void givenBigInteger_whenConvertingLongToByteArray_thenSuccess() { - long value = getLongValue(); - byte[] bytes = convertLongToByteArrayUsingBigInteger(value); + byte[] bytes = convertLongToByteArrayUsingBigInteger(LONG_VALUE); assertArrayEquals(LONG_BYTE_ARRAY, bytes); } @Test public void givenBigInteger_whenConvertingByteArrayToFloat_thenSuccess() { - byte[] bytes = getFloatByteArray(); - float value = convertByteArrayToFloatUsingBigInteger(bytes); + float value = convertByteArrayToFloatUsingBigInteger(FLOAT_BYTE_ARRAY); assertEquals(Float.floatToIntBits(FLOAT_VALUE), Float.floatToIntBits(value)); } @Test public void givenBigInteger_whenConvertingFloatToByteArray_thenSuccess() { - float value = getFloatValue(); - byte[] bytes = convertFloatToByteArrayUsingBigInteger(value); + byte[] bytes = convertFloatToByteArrayUsingBigInteger(FLOAT_VALUE); assertArrayEquals(FLOAT_BYTE_ARRAY, bytes); } @Test public void givenBigInteger_whenConvertingByteArrayToDouble_thenSuccess() { - byte[] bytes = getDoubleByteArray(); - double value = convertByteArrayToDoubleUsingBigInteger(bytes); + double value = convertByteArrayToDoubleUsingBigInteger(DOUBLE_BYTE_ARRAY); assertEquals(Double.doubleToLongBits(DOUBLE_VALUE), Double.doubleToLongBits(value)); } @Test public void givenBigInteger_whenConvertingDoubleToByteArray_thenSuccess() { - double value = getDoubleValue(); - byte[] bytes = convertDoubleToByteArrayUsingBigInteger(value); + byte[] bytes = convertDoubleToByteArrayUsingBigInteger(DOUBLE_VALUE); assertArrayEquals(DOUBLE_BYTE_ARRAY, bytes); } @Test public void givenGuava_whenConvertingByteArrayToInt_thenSuccess() { - byte[] bytes = getIntByteArray(); - int value = convertingByteArrayToIntUsingGuava(bytes); + int value = convertingByteArrayToIntUsingGuava(INT_BYTE_ARRAY); assertEquals(INT_VALUE, value); } @Test public void givenGuava_whenConvertingIntToByteArray_thenSuccess() { - int value = getIntValue(); - byte[] bytes = convertIntToByteArrayUsingGuava(value); + byte[] bytes = convertIntToByteArrayUsingGuava(INT_VALUE); assertArrayEquals(INT_BYTE_ARRAY, bytes); } @Test public void givenGuava_whenConvertingByteArrayToLong_thenSuccess() { - byte[] bytes = getLongByteArray(); - long value = convertByteArrayToLongUsingGuava(bytes); + long value = convertByteArrayToLongUsingGuava(LONG_BYTE_ARRAY); assertEquals(LONG_VALUE, value); } @Test public void givenGuava_whenConvertingLongToByteArray_thenSuccess() { - long value = getLongValue(); - byte[] bytes = convertLongToByteArrayUsingGuava(value); + byte[] bytes = convertLongToByteArrayUsingGuava(LONG_VALUE); assertArrayEquals(LONG_BYTE_ARRAY, bytes); } @Test public void givenGuava_whenConvertingByteArrayToFloat_thenSuccess() { - byte[] bytes = getFloatByteArray(); - float value = convertByteArrayToFloatUsingGuava(bytes); + float value = convertByteArrayToFloatUsingGuava(FLOAT_BYTE_ARRAY); assertEquals(Float.floatToIntBits(FLOAT_VALUE), Float.floatToIntBits(value)); } @Test public void givenGuava_whenConvertingFloatToByteArray_thenSuccess() { - float value = getFloatValue(); - byte[] bytes = convertFloatToByteArrayUsingGuava(value); + byte[] bytes = convertFloatToByteArrayUsingGuava(FLOAT_VALUE); assertArrayEquals(FLOAT_BYTE_ARRAY, bytes); } @Test public void givenGuava_whenConvertingByteArrayToDouble_thenSuccess() { - byte[] bytes = getDoubleByteArray(); - double value = convertByteArrayToDoubleUsingGuava(bytes); + double value = convertByteArrayToDoubleUsingGuava(DOUBLE_BYTE_ARRAY); assertEquals(Double.doubleToLongBits(DOUBLE_VALUE), Double.doubleToLongBits(value)); } @Test public void givenGuava_whenConvertingDoubleToByteArray_thenSuccess() { - double value = getDoubleValue(); - byte[] bytes = convertDoubleToByteArrayUsingGuava(value); + byte[] bytes = convertDoubleToByteArrayUsingGuava(DOUBLE_VALUE); assertArrayEquals(DOUBLE_BYTE_ARRAY, bytes); } @Test public void givenCommonsLang_whenConvertingByteArrayToInt_thenSuccess() { - byte[] bytes = getIntByteArray(); - int value = convertByteArrayToIntUsingCommonsLang(bytes); + int value = convertByteArrayToIntUsingCommonsLang(INT_BYTE_ARRAY); assertEquals(INT_VALUE, value); } @Test public void givenCommonsLang_whenConvertingIntToByteArray_thenSuccess() { - int value = getIntValue(); - byte[] bytes = convertIntToByteArrayUsingCommonsLang(value); + byte[] bytes = convertIntToByteArrayUsingCommonsLang(INT_VALUE); assertArrayEquals(INT_BYTE_ARRAY, bytes); } @Test public void givenCommonsLang_whenConvertingByteArrayToLong_thenSuccess() { - byte[] bytes = getLongByteArray(); - long value = convertByteArrayToLongUsingCommonsLang(bytes); + long value = convertByteArrayToLongUsingCommonsLang(LONG_BYTE_ARRAY); assertEquals(LONG_VALUE, value); } @Test public void givenCommonsLang_whenConvertingLongToByteArray_thenSuccess() { - long value = getLongValue(); - byte[] bytes = convertLongToByteArrayUsingCommonsLang(value); + byte[] bytes = convertLongToByteArrayUsingCommonsLang(LONG_VALUE); assertArrayEquals(LONG_BYTE_ARRAY, bytes); } @Test public void givenCommonsLang_whenConvertingByteArrayToFloat_thenSuccess() { - byte[] bytes = getFloatByteArray(); - float value = convertByteArrayToFloatUsingCommonsLang(bytes); + float value = convertByteArrayToFloatUsingCommonsLang(FLOAT_BYTE_ARRAY); assertEquals(Float.floatToIntBits(FLOAT_VALUE), Float.floatToIntBits(value)); } @Test public void givenCommonsLang_whenConvertingFloatToByteArray_thenSuccess() { - float value = getFloatValue(); - byte[] bytes = convertFloatToByteArrayUsingCommonsLang(value); + byte[] bytes = convertFloatToByteArrayUsingCommonsLang(FLOAT_VALUE); assertArrayEquals(FLOAT_BYTE_ARRAY, bytes); } @Test public void givenCommonsLang_whenConvertingByteArrayToDouble_thenSuccess() { - byte[] bytes = getDoubleByteArray(); - double value = convertByteArrayToDoubleUsingCommonsLang(bytes); + double value = convertByteArrayToDoubleUsingCommonsLang(DOUBLE_BYTE_ARRAY); assertEquals(Double.doubleToLongBits(DOUBLE_VALUE), Double.doubleToLongBits(value)); } @Test public void givenCommonsLang_whenConvertingDoubleToByteArray_thenSuccess() { - double value = getDoubleValue(); - byte[] bytes = convertDoubleToByteArrayUsingCommonsLang(value); + byte[] bytes = convertDoubleToByteArrayUsingCommonsLang(DOUBLE_VALUE); assertArrayEquals(DOUBLE_BYTE_ARRAY, bytes); } From ba638cb58aa213d3a69b5d47daf6acc648401413 Mon Sep 17 00:00:00 2001 From: 515882294 <515882294@qq.com> Date: Tue, 2 Nov 2021 16:09:03 +0800 Subject: [PATCH 003/278] BAEL-4286 How to get the value of a bit at a certain position from a byte --- .../core-java-lang-operators-2/pom.xml | 5 + .../GetABitFromIntegralValueUnitTest.java | 119 ++++++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 core-java-modules/core-java-lang-operators-2/src/test/java/com/baeldung/oroperators/GetABitFromIntegralValueUnitTest.java diff --git a/core-java-modules/core-java-lang-operators-2/pom.xml b/core-java-modules/core-java-lang-operators-2/pom.xml index 1779b7384c..2b81a797e0 100644 --- a/core-java-modules/core-java-lang-operators-2/pom.xml +++ b/core-java-modules/core-java-lang-operators-2/pom.xml @@ -15,6 +15,11 @@ + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + org.projectlombok lombok diff --git a/core-java-modules/core-java-lang-operators-2/src/test/java/com/baeldung/oroperators/GetABitFromIntegralValueUnitTest.java b/core-java-modules/core-java-lang-operators-2/src/test/java/com/baeldung/oroperators/GetABitFromIntegralValueUnitTest.java new file mode 100644 index 0000000000..d39e3b3c47 --- /dev/null +++ b/core-java-modules/core-java-lang-operators-2/src/test/java/com/baeldung/oroperators/GetABitFromIntegralValueUnitTest.java @@ -0,0 +1,119 @@ +package com.baeldung.oroperators; + +import org.apache.commons.lang3.BitField; +import org.junit.Test; + +import java.math.BigInteger; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class GetABitFromIntegralValueUnitTest { + @Test + public void givenAByte_whenUsingAHardCodedMask_thenGetBitValue() { + byte val1 = 0b0110_0100; + byte val2 = 0b0110_0010; + byte mask = 0b0000_0100; + boolean isSet1 = (val1 & mask) > 0; + boolean isSet2 = (val2 & mask) > 0; + + assertTrue(isSet1); + assertFalse(isSet2); + } + + @Test + public void givenAnIntValue_whenUsingACalculatedMask_thenGetBitValue() { + int val = 0b0110_0100; + int pos = 2; + int mask = 1 << pos; + boolean isSet = (val & mask) > 0; + + assertTrue(isSet); + } + + @Test + public void givenAnIntValue_whenUsingMultiPos_thenGetSameResult() { + int val = 0b0110_0100; + for (int i = 6; i < Integer.SIZE; i++) { + int pos = 1 << i | 2; + int mask = 1 << pos; + boolean isSet = (val & mask) > 0; + + assertTrue(isSet); + } + } + + @Test + public void givenALongValue_whenUsingACalculatedMask_thenGetBitValue() { + long val = 0b0110_0100; + int pos = 2; + long mask = 1L << pos; + boolean isSet = (val & mask) > 0; + + assertTrue(isSet); + } + + @Test + public void givenAnIntValue_whenUsingALeftShiftedValue_thenGetBitValue() { + int val = 0b0110_0100; + int pos = 2; + boolean isSet = ((val << ~pos) < 0); + + assertTrue(isSet); + } + + @Test + public void givenALongValue_whenUsingALeftShiftedValue_thenGetBitValue() { + long val = 0b0110_0100; + int pos = 2; + boolean isSet = ((val << ~pos) < 0); + + assertTrue(isSet); + } + + @Test + public void givenAnIntValue_whenUsingARightShiftedValue_thenGetBitValue() { + int val = 0b0110_0100; + int pos = 2; + boolean isSet = ((val >> pos) & 1) == 1; + + assertTrue(isSet); + } + + @Test + public void givenALongValue_whenUsingARightShiftedValue_thenGetBitValue() { + long val = 0b0110_0100; + int pos = 2; + boolean isSet = ((val >> pos) & 1) == 1; + + assertTrue(isSet); + } + + @Test + public void givenAnIntValue_whenUsingBigInteger_thenGetBitValue() { + int val = 0b0110_0100; + int pos = 2; + boolean isSet = BigInteger.valueOf(val).testBit(pos); + + assertTrue(isSet); + } + + @Test + public void givenALongValue_whenUsingBigInteger_thenGetBitValue() { + long val = 0b0110_0100; + int pos = 2; + boolean isSet = BigInteger.valueOf(val).testBit(pos); + + assertTrue(isSet); + } + + @Test + public void givenAnIntValue_whenUsingCommonsLang_thenGetBitValue() { + int val = 0b0110_0100; + int mask = 0b0000_1100; + BitField bitField = new BitField(mask); + boolean isSet = bitField.isSet(val); + + assertTrue(isSet); + } +} From 197d10e9f1dd7bf1f87a0a5b213f1e581251feae Mon Sep 17 00:00:00 2001 From: 515882294 <515882294@qq.com> Date: Wed, 17 Nov 2021 19:18:53 +0800 Subject: [PATCH 004/278] BAEL-4286(update): remove redundant test methods --- .../GetABitFromIntegralValueUnitTest.java | 55 +++---------------- 1 file changed, 7 insertions(+), 48 deletions(-) rename core-java-modules/core-java-lang-operators-2/src/test/java/com/baeldung/{oroperators => getbit}/GetABitFromIntegralValueUnitTest.java (51%) diff --git a/core-java-modules/core-java-lang-operators-2/src/test/java/com/baeldung/oroperators/GetABitFromIntegralValueUnitTest.java b/core-java-modules/core-java-lang-operators-2/src/test/java/com/baeldung/getbit/GetABitFromIntegralValueUnitTest.java similarity index 51% rename from core-java-modules/core-java-lang-operators-2/src/test/java/com/baeldung/oroperators/GetABitFromIntegralValueUnitTest.java rename to core-java-modules/core-java-lang-operators-2/src/test/java/com/baeldung/getbit/GetABitFromIntegralValueUnitTest.java index d39e3b3c47..61f9885a91 100644 --- a/core-java-modules/core-java-lang-operators-2/src/test/java/com/baeldung/oroperators/GetABitFromIntegralValueUnitTest.java +++ b/core-java-modules/core-java-lang-operators-2/src/test/java/com/baeldung/getbit/GetABitFromIntegralValueUnitTest.java @@ -1,6 +1,5 @@ -package com.baeldung.oroperators; +package com.baeldung.getbit; -import org.apache.commons.lang3.BitField; import org.junit.Test; import java.math.BigInteger; @@ -32,39 +31,26 @@ public class GetABitFromIntegralValueUnitTest { } @Test - public void givenAnIntValue_whenUsingMultiPos_thenGetSameResult() { + public void givenAnIntValue_whenUsingALeftShiftedValue1_thenGetBitValue() { int val = 0b0110_0100; - for (int i = 6; i < Integer.SIZE; i++) { - int pos = 1 << i | 2; - int mask = 1 << pos; - boolean isSet = (val & mask) > 0; - - assertTrue(isSet); - } - } - - @Test - public void givenALongValue_whenUsingACalculatedMask_thenGetBitValue() { - long val = 0b0110_0100; int pos = 2; - long mask = 1L << pos; - boolean isSet = (val & mask) > 0; + boolean isSet = ((val << (31 - pos)) < 0); assertTrue(isSet); } @Test - public void givenAnIntValue_whenUsingALeftShiftedValue_thenGetBitValue() { + public void givenAnIntValue_whenUsingALeftShiftedValue2_thenGetBitValue() { int val = 0b0110_0100; int pos = 2; - boolean isSet = ((val << ~pos) < 0); + boolean isSet = ((val << (~pos & 31)) < 0); assertTrue(isSet); } @Test - public void givenALongValue_whenUsingALeftShiftedValue_thenGetBitValue() { - long val = 0b0110_0100; + public void givenAnIntValue_whenUsingALeftShiftedValue3_thenGetBitValue() { + int val = 0b0110_0100; int pos = 2; boolean isSet = ((val << ~pos) < 0); @@ -80,15 +66,6 @@ public class GetABitFromIntegralValueUnitTest { assertTrue(isSet); } - @Test - public void givenALongValue_whenUsingARightShiftedValue_thenGetBitValue() { - long val = 0b0110_0100; - int pos = 2; - boolean isSet = ((val >> pos) & 1) == 1; - - assertTrue(isSet); - } - @Test public void givenAnIntValue_whenUsingBigInteger_thenGetBitValue() { int val = 0b0110_0100; @@ -98,22 +75,4 @@ public class GetABitFromIntegralValueUnitTest { assertTrue(isSet); } - @Test - public void givenALongValue_whenUsingBigInteger_thenGetBitValue() { - long val = 0b0110_0100; - int pos = 2; - boolean isSet = BigInteger.valueOf(val).testBit(pos); - - assertTrue(isSet); - } - - @Test - public void givenAnIntValue_whenUsingCommonsLang_thenGetBitValue() { - int val = 0b0110_0100; - int mask = 0b0000_1100; - BitField bitField = new BitField(mask); - boolean isSet = bitField.isSet(val); - - assertTrue(isSet); - } } From 0d683d5ce4f9f787d9987ee1e1f04ed74428085e Mon Sep 17 00:00:00 2001 From: 515882294 <515882294@qq.com> Date: Thu, 24 Feb 2022 11:45:01 +0800 Subject: [PATCH 005/278] BAEL-4151: Guide to ByteBuffer --- .../bytebuffer/ByteBufferUnitTest.java | 339 ++++++++++++++++++ 1 file changed, 339 insertions(+) create mode 100644 core-java-modules/core-java-nio-2/src/test/java/com/baeldung/bytebuffer/ByteBufferUnitTest.java diff --git a/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/bytebuffer/ByteBufferUnitTest.java b/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/bytebuffer/ByteBufferUnitTest.java new file mode 100644 index 0000000000..5d108ba14a --- /dev/null +++ b/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/bytebuffer/ByteBufferUnitTest.java @@ -0,0 +1,339 @@ +package com.baeldung.bytebuffer; + +import org.junit.Test; + +import java.lang.reflect.Field; +import java.nio.*; +import java.nio.charset.StandardCharsets; + +import static org.junit.Assert.*; + +public class ByteBufferUnitTest { + @Test + public void givenBufferCreation_whenUsingAllocate_thenSuccess() { + ByteBuffer buffer = ByteBuffer.allocate(10); + assertNotNull(buffer); + } + + @Test + public void givenBufferCreation_whenUsingAllocateDirect_thenSuccess() { + ByteBuffer buffer = ByteBuffer.allocateDirect(10); + assertNotNull(buffer); + } + + @Test + public void givenBufferCreation_whenUsingWrap_thenSuccess() { + byte[] bytes = new byte[10]; + ByteBuffer buffer = ByteBuffer.wrap(bytes); + assertNotNull(buffer); + } + + @Test + public void givenBufferIndex_whenUsingAllocate_thenInitialIndices() { + // create instance using allocate + ByteBuffer buffer = ByteBuffer.allocate(10); + + // get index + int position = buffer.position(); + int limit = buffer.limit(); + int capacity = buffer.capacity(); + + // assert + assertEquals(0, position); + assertEquals(10, limit); + assertEquals(10, capacity); + } + + @Test + public void givenBufferIndex_whenChangingPositionAndLimit_thenSuccess() { + // create instance + ByteBuffer buffer = ByteBuffer.allocate(10); + + // change index + buffer.position(2); + buffer.limit(5); + + // assert + assertIndex(buffer, -1, 2, 5, 10); + } + + @Test + public void givenBufferIndex_whenUsingWrap_thenInitialIndices() { + // create instance + byte[] bytes = new byte[10]; + ByteBuffer buffer = ByteBuffer.wrap(bytes); + + // assert + assertIndex(buffer, -1, 0, 10, 10); + } + + @Test + public void givenBufferIndex_whenUsingWrapWithOffsetAndLength_thenInitialIndices() { + // create instance + byte[] bytes = new byte[10]; + ByteBuffer buffer = ByteBuffer.wrap(bytes, 2, 6); + + // assert + assertIndex(buffer, -1, 2, 8, 10); + } + + @Test + public void givenBufferIndex_whenUsingMarkAndReset_thenOK() { + ByteBuffer buffer = ByteBuffer.allocate(10); + assertIndex(buffer, -1, 0, 10, 10); + + buffer.position(2); + assertIndex(buffer, -1, 2, 10, 10); + + buffer.mark(); + assertIndex(buffer, 2, 2, 10, 10); + + buffer.position(5); + assertIndex(buffer, 2, 5, 10, 10); + + buffer.reset(); + assertIndex(buffer, 2, 2, 10, 10); + } + + @Test + public void givenBufferIndex_whenUsingClear_thenOK() { + // create instance + ByteBuffer buffer = ByteBuffer.allocate(10); + assertIndex(buffer, -1, 0, 10, 10); + + // change index + buffer.position(2); + buffer.mark(); + buffer.position(5); + buffer.limit(8); + assertIndex(buffer, 2, 5, 8, 10); + + // clear + buffer.clear(); + assertIndex(buffer, -1, 0, 10, 10); + } + + @Test + public void givenBufferIndex_whenUsingFlip_thenOK() { + // create instance + ByteBuffer buffer = ByteBuffer.allocate(10); + assertIndex(buffer, -1, 0, 10, 10); + + // change index + buffer.position(2); + buffer.mark(); + buffer.position(5); + buffer.limit(8); + assertIndex(buffer, 2, 5, 8, 10); + + // flip + buffer.flip(); + assertIndex(buffer, -1, 0, 5, 10); + } + + @Test + public void givenBufferIndex_whenUsingRewind_thenOK() { + // create instance + ByteBuffer buffer = ByteBuffer.allocate(10); + assertIndex(buffer, -1, 0, 10, 10); + + // change index + buffer.position(2); + buffer.mark(); + buffer.position(5); + buffer.limit(8); + assertIndex(buffer, 2, 5, 8, 10); + + // rewind + buffer.rewind(); + assertIndex(buffer, -1, 0, 8, 10); + } + + @Test + public void givenBufferIndex_whenUsingCompact_thenOK() { + // create instance + ByteBuffer buffer = ByteBuffer.allocate(10); + assertIndex(buffer, -1, 0, 10, 10); + + // change index + buffer.position(2); + buffer.mark(); + buffer.position(5); + buffer.limit(8); + assertIndex(buffer, 2, 5, 8, 10); + + // compact + buffer.compact(); + assertIndex(buffer, -1, 3, 10, 10); + } + + @Test + public void givenBufferIndex_whenUsingRemain_thenOK() { + // create instance + ByteBuffer buffer = ByteBuffer.allocate(10); + + // change index + buffer.position(2); + buffer.limit(8); + + // remain + boolean flag = buffer.hasRemaining(); + int remaining = buffer.remaining(); + + // assert + assertTrue(flag); + assertEquals(6, remaining); + } + + @Test(expected = BufferUnderflowException.class) + public void givenNotEnoughRemaining_WhenCallingGetInt_thenBufferUnderflowException() { + ByteBuffer buffer = ByteBuffer.allocate(2); + buffer.getInt(); + } + + @Test(expected = BufferOverflowException.class) + public void givenNotEnoughRemaining_WhenCallingPutInt_thenBufferOverflowException() { + ByteBuffer buffer = ByteBuffer.allocate(2); + buffer.putInt(10); + } + + @Test + public void givenBufferView_whenUsingDuplicate_thenOK() { + // create instance + ByteBuffer buffer = ByteBuffer.allocate(10); + assertIndex(buffer, -1, 0, 10, 10); + + // change index + buffer.position(2); + buffer.mark(); + buffer.position(5); + buffer.limit(8); + assertIndex(buffer, 2, 5, 8, 10); + + // view + ByteBuffer view = buffer.duplicate(); + assertIndex(view, 2, 5, 8, 10); + } + + @Test + public void givenBufferView_whenUsingSlice_thenOK() { + // create instance + ByteBuffer buffer = ByteBuffer.allocate(10); + assertIndex(buffer, -1, 0, 10, 10); + + // change index + buffer.position(2); + buffer.mark(); + buffer.position(5); + buffer.limit(8); + assertIndex(buffer, 2, 5, 8, 10); + + // view + ByteBuffer view = buffer.slice(); + assertIndex(view, -1, 0, 3, 3); + } + + @Test + public void givenBufferView_whenUsingAsReaOnlyBuffer_thenOK() { + // create instance + ByteBuffer buffer = ByteBuffer.allocate(10); + assertIndex(buffer, -1, 0, 10, 10); + + // change index + buffer.position(2); + buffer.mark(); + buffer.position(5); + buffer.limit(8); + assertIndex(buffer, 2, 5, 8, 10); + + // view + ByteBuffer view = buffer.asReadOnlyBuffer(); + assertIndex(view, 2, 5, 8, 10); + } + + @Test + public void givenBufferView_whenUsingAsIntBuffer_thenOK() { + // create instance + byte[] bytes = new byte[]{ + (byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE, // CAFEBABE ---> cafebabe + (byte) 0xF0, (byte) 0x07, (byte) 0xBA, (byte) 0x11, // F007BA11 ---> football + (byte) 0x0F, (byte) 0xF1, (byte) 0xCE // 0FF1CE ---> office + }; + ByteBuffer buffer = ByteBuffer.wrap(bytes); + assertIndex(buffer, -1, 0, 11, 11); + + // view + IntBuffer intBuffer = buffer.asIntBuffer(); + int capacity = intBuffer.capacity(); + assertEquals(2, capacity); + assertIndex(intBuffer, -1, 0, 2, 2); + } + + @Test + public void givenByteOrder_whenUsingBigEndian_thenOK() { + // create instance + byte[] bytes = new byte[]{(byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE}; + ByteBuffer buffer = ByteBuffer.wrap(bytes); + + // change byte order + buffer.order(ByteOrder.BIG_ENDIAN); + int val = buffer.getInt(); + + // assert + assertEquals(0xCAFEBABE, val); + } + + @Test + public void givenByteOrder_whenUsingLittleEndian_thenOK() { + // create instance + byte[] bytes = new byte[]{(byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE}; + ByteBuffer buffer = ByteBuffer.wrap(bytes); + + // change byte order + buffer.order(ByteOrder.LITTLE_ENDIAN); + int val = buffer.getInt(); + + // assert + assertEquals(0xBEBAFECA, val); + } + + @Test + public void givenComparing_whenUsingEqualsAndCompareTo_thenOK() { + // create instance + byte[] bytes1 = "World".getBytes(StandardCharsets.UTF_8); + byte[] bytes2 = "HelloWorld".getBytes(StandardCharsets.UTF_8); + ByteBuffer buffer1 = ByteBuffer.wrap(bytes1); + ByteBuffer buffer2 = ByteBuffer.wrap(bytes2); + + // change index + buffer2.position(5); + + // equals and compareTo + boolean equal = buffer1.equals(buffer2); + int result = buffer1.compareTo(buffer2); + + // assert + assertTrue(equal); + assertEquals(0, result); + } + + private void assertIndex(Buffer buffer, int mark, int position, int limit, int capacity) { + assertEquals(mark, getMark(buffer)); + assertEquals(position, buffer.position()); + assertEquals(limit, buffer.limit()); + assertEquals(capacity, buffer.capacity()); + } + + private int getMark(Buffer buffer) { + try { + Class clazz = Buffer.class; + Field f = clazz.getDeclaredField("mark"); + f.setAccessible(true); + Object result = f.get(buffer); + return (int) result; + } catch (NoSuchFieldException | IllegalAccessException e) { + e.printStackTrace(); + } + return -1; + } +} From 9e36dd2a607b5ea6f2d85eeca8042ee146f2a9e4 Mon Sep 17 00:00:00 2001 From: Azhwani Date: Sat, 19 Mar 2022 20:09:32 +0100 Subject: [PATCH 006/278] first commit --- resteasy/pom.xml | 4 +-- .../server/RestEasyClientLiveTest.java | 29 ++++++++++--------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/resteasy/pom.xml b/resteasy/pom.xml index d35fc852ba..e4ab6d84b2 100644 --- a/resteasy/pom.xml +++ b/resteasy/pom.xml @@ -40,7 +40,7 @@ org.jboss.resteasy - resteasy-jackson-provider + resteasy-jackson2-provider ${resteasy.version} @@ -134,7 +134,7 @@ - 3.0.19.Final + 4.7.2.Final 1.6.1 diff --git a/resteasy/src/test/java/com/baeldung/server/RestEasyClientLiveTest.java b/resteasy/src/test/java/com/baeldung/server/RestEasyClientLiveTest.java index 7e709edb96..ba2878cc21 100644 --- a/resteasy/src/test/java/com/baeldung/server/RestEasyClientLiveTest.java +++ b/resteasy/src/test/java/com/baeldung/server/RestEasyClientLiveTest.java @@ -7,6 +7,7 @@ import java.util.List; import java.util.Locale; import javax.naming.NamingException; +import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriBuilder; @@ -14,21 +15,21 @@ import org.apache.commons.io.IOUtils; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; -import org.codehaus.jackson.map.DeserializationConfig; -import org.codehaus.jackson.map.ObjectMapper; import org.jboss.resteasy.client.jaxrs.ResteasyClient; import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder; import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget; -import org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine; +import org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient43Engine; import org.junit.Before; import org.junit.Test; import com.baeldung.client.ServicesInterface; import com.baeldung.model.Movie; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; public class RestEasyClientLiveTest { - public static final UriBuilder FULL_PATH = UriBuilder.fromPath("http://127.0.0.1:8082/RestEasyTutorial/rest"); + public static final UriBuilder FULL_PATH = UriBuilder.fromPath("http://127.0.0.1:8082/resteasy/rest"); Movie transformerMovie = null; Movie batmanMovie = null; ObjectMapper jsonMapper = null; @@ -36,8 +37,8 @@ public class RestEasyClientLiveTest { @Before public void setup() throws ClassNotFoundException, IllegalAccessException, InstantiationException, NamingException { - jsonMapper = new ObjectMapper().configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); - jsonMapper.configure(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true); + jsonMapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + jsonMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true); final SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.ENGLISH); jsonMapper.setDateFormat(sdf); @@ -60,8 +61,8 @@ public class RestEasyClientLiveTest { @Test public void testListAllMovies() { - - final ResteasyClient client = new ResteasyClientBuilder().build(); + + final ResteasyClient client = (ResteasyClient)ClientBuilder.newClient(); final ResteasyWebTarget target = client.target(FULL_PATH); final ServicesInterface proxy = target.proxy(ServicesInterface.class); @@ -79,7 +80,7 @@ public class RestEasyClientLiveTest { final String transformerImdbId = "tt0418279"; - final ResteasyClient client = new ResteasyClientBuilder().build(); + final ResteasyClient client = (ResteasyClient) ClientBuilder.newClient(); final ResteasyWebTarget target = client.target(FULL_PATH); final ServicesInterface proxy = target.proxy(ServicesInterface.class); @@ -93,7 +94,7 @@ public class RestEasyClientLiveTest { @Test public void testAddMovie() { - final ResteasyClient client = new ResteasyClientBuilder().build(); + final ResteasyClient client = (ResteasyClient) ClientBuilder.newClient(); final ResteasyWebTarget target = client.target(FULL_PATH); final ServicesInterface proxy = target.proxy(ServicesInterface.class); @@ -114,8 +115,8 @@ public class RestEasyClientLiveTest { final PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(); final CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).build(); - final ApacheHttpClient4Engine engine = new ApacheHttpClient4Engine(httpClient); - final ResteasyClient client = new ResteasyClientBuilder().httpEngine(engine).build(); + final ApacheHttpClient43Engine engine = new ApacheHttpClient43Engine(httpClient); + final ResteasyClient client = ((ResteasyClientBuilder) ClientBuilder.newBuilder()).httpEngine(engine).build(); final ResteasyWebTarget target = client.target(FULL_PATH); final ServicesInterface proxy = target.proxy(ServicesInterface.class); @@ -138,7 +139,7 @@ public class RestEasyClientLiveTest { @Test public void testDeleteMovie() { - final ResteasyClient client = new ResteasyClientBuilder().build(); + final ResteasyClient client = (ResteasyClient) ClientBuilder.newClient(); final ResteasyWebTarget target = client.target(FULL_PATH); final ServicesInterface proxy = target.proxy(ServicesInterface.class); @@ -158,7 +159,7 @@ public class RestEasyClientLiveTest { @Test public void testUpdateMovie() { - final ResteasyClient client = new ResteasyClientBuilder().build(); + final ResteasyClient client = (ResteasyClient) ClientBuilder.newClient(); final ResteasyWebTarget target = client.target(FULL_PATH); final ServicesInterface proxy = target.proxy(ServicesInterface.class); From b933c21023b6d39db62125423bab293f943765ac Mon Sep 17 00:00:00 2001 From: alemoles Date: Wed, 23 Mar 2022 01:41:59 -0400 Subject: [PATCH 007/278] BAEL-5429 - How to Fix Java Compiler Error: Illegal Character (#9) --- core-java-modules/core-java/pom.xml | 10 +++ .../IllegalCharacterUnitTest.java | 79 +++++++++++++++++++ .../core-java/src/test/resources/bom-file.txt | 1 + 3 files changed, 90 insertions(+) create mode 100644 core-java-modules/core-java/src/test/java/com/baeldung/illegalcharacter/IllegalCharacterUnitTest.java create mode 100644 core-java-modules/core-java/src/test/resources/bom-file.txt diff --git a/core-java-modules/core-java/pom.xml b/core-java-modules/core-java/pom.xml index bb19b525d0..786ee91192 100644 --- a/core-java-modules/core-java/pom.xml +++ b/core-java-modules/core-java/pom.xml @@ -59,6 +59,16 @@ spring-core ${spring.core.version} + + commons-io + commons-io + ${commons-io.version} + + + com.google.gdata + core + 1.47.1 + diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/illegalcharacter/IllegalCharacterUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/illegalcharacter/IllegalCharacterUnitTest.java new file mode 100644 index 0000000000..4a08daa271 --- /dev/null +++ b/core-java-modules/core-java/src/test/java/com/baeldung/illegalcharacter/IllegalCharacterUnitTest.java @@ -0,0 +1,79 @@ +package com.baeldung.illegalcharacter; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.util.Objects; + +import org.apache.commons.io.ByteOrderMark; +import org.apache.commons.io.input.BOMInputStream; +import org.junit.Test; + +import com.google.gdata.util.io.base.UnicodeReader; + +public class IllegalCharacterUnitTest { + + final String RESOURCE_FILE_NAME = "bom-file.txt"; + final InputStream ioStream = this.getClass() + .getClassLoader() + .getResourceAsStream(RESOURCE_FILE_NAME); + final String expected = "Hello world with BOM."; + + @Test + public void whenInputFileHasBOM_thenUseInputStream() throws IOException { + String line; + String actual = ""; + + try (BufferedReader br = new BufferedReader(new InputStreamReader(ioStream))) { + while ((line = br.readLine()) != null) { + actual += line; + } + } + + assertNotEquals(expected, actual); + } + + @Test + public void whenInputFileHasBOM_thenUseInputStreamWithReplace() throws IOException { + String line; + String actual = ""; + + try (BufferedReader br = new BufferedReader(new InputStreamReader(Objects.requireNonNull(ioStream)))) { + while ((line = br.readLine()) != null) { + actual += line.replace("\uFEFF", ""); + } + } + + assertEquals(expected, actual); + } + + @Test + public void whenInputFileHasBOM_thenUseBOMInputStream() throws IOException { + String line; + String actual = ""; + + try (BufferedReader br = new BufferedReader(new InputStreamReader(new BOMInputStream(ioStream, false, ByteOrderMark.UTF_8, ByteOrderMark.UTF_16BE, ByteOrderMark.UTF_16LE, ByteOrderMark.UTF_32BE, ByteOrderMark.UTF_32LE)))) { + while ((line = br.readLine()) != null) { + actual += line; + } + } + + assertEquals(expected, actual); + } + + @Test + public void whenInputFileHasBOM_thenUseGoogleGdata() throws IOException { + char[] actual = new char[21]; + + try (Reader r = new UnicodeReader(ioStream, null)) { + r.read(actual); + } + + assertEquals(expected, String.valueOf(actual)); + } +} diff --git a/core-java-modules/core-java/src/test/resources/bom-file.txt b/core-java-modules/core-java/src/test/resources/bom-file.txt new file mode 100644 index 0000000000..b2037fded6 --- /dev/null +++ b/core-java-modules/core-java/src/test/resources/bom-file.txt @@ -0,0 +1 @@ +Hello world with BOM. \ No newline at end of file From 2c4bffbe3b034e59a099fe59660c8dcfe53701f7 Mon Sep 17 00:00:00 2001 From: Christian GERMAN Date: Wed, 23 Mar 2022 17:55:49 +0100 Subject: [PATCH 008/278] BAEL-5431 BootstrapMode for JPA Repositories --- .../boot/bootstrapmode/Application.java | 50 +++++++++++++++++++ .../boot/bootstrapmode/domain/Todo.java | 37 ++++++++++++++ .../repository/TodoRepository.java | 8 +++ .../BootstrapmodeDefaultIntegrationTest.java | 24 +++++++++ .../BootstrapmodeDeferredIntegrationTest.java | 25 ++++++++++ .../BootstrapmodeLazyIntegrationTest.java | 25 ++++++++++ 6 files changed, 169 insertions(+) create mode 100644 spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/bootstrapmode/Application.java create mode 100644 spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/bootstrapmode/domain/Todo.java create mode 100644 spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/bootstrapmode/repository/TodoRepository.java create mode 100644 spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/bootstrapmode/BootstrapmodeDefaultIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/bootstrapmode/BootstrapmodeDeferredIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/bootstrapmode/BootstrapmodeLazyIntegrationTest.java diff --git a/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/bootstrapmode/Application.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/bootstrapmode/Application.java new file mode 100644 index 0000000000..0bb1884f23 --- /dev/null +++ b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/bootstrapmode/Application.java @@ -0,0 +1,50 @@ +package com.baeldung.boot.bootstrapmode; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.Future; + +import javax.sql.DataSource; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.core.task.AsyncTaskExecutor; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +@SpringBootApplication +public class Application { + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + + @Bean + AsyncTaskExecutor delayedTaskExecutor() { + return new ThreadPoolTaskExecutor() { + @Override + public Future submit(Callable task) { + return super.submit(() -> { + Thread.sleep(5000); + return task.call(); + }); + } + }; + } + + @Bean + LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource, AsyncTaskExecutor delayedTaskExecutor) { + LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); + factory.setPackagesToScan("com.baeldung.boot.bootstrapmode"); + factory.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); + factory.setDataSource(dataSource); + factory.setBootstrapExecutor(delayedTaskExecutor); + Map properties = new HashMap<>(); + properties.put("hibernate.hbm2ddl.auto", "create-drop"); + factory.setJpaPropertyMap(properties); + return factory; + } +} + diff --git a/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/bootstrapmode/domain/Todo.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/bootstrapmode/domain/Todo.java new file mode 100644 index 0000000000..8d6ab3cfb8 --- /dev/null +++ b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/bootstrapmode/domain/Todo.java @@ -0,0 +1,37 @@ +package com.baeldung.boot.bootstrapmode.domain; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Todo { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + private String label; + + public Todo() { + } + + public Todo(String label) { + this.label = label; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getId() { + return id; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } +} diff --git a/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/bootstrapmode/repository/TodoRepository.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/bootstrapmode/repository/TodoRepository.java new file mode 100644 index 0000000000..b32d1c5085 --- /dev/null +++ b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/bootstrapmode/repository/TodoRepository.java @@ -0,0 +1,8 @@ +package com.baeldung.boot.bootstrapmode.repository; + +import org.springframework.data.repository.CrudRepository; + +import com.baeldung.boot.bootstrapmode.domain.Todo; + +public interface TodoRepository extends CrudRepository { +} diff --git a/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/bootstrapmode/BootstrapmodeDefaultIntegrationTest.java b/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/bootstrapmode/BootstrapmodeDefaultIntegrationTest.java new file mode 100644 index 0000000000..3ff743299b --- /dev/null +++ b/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/bootstrapmode/BootstrapmodeDefaultIntegrationTest.java @@ -0,0 +1,24 @@ +package com.baeldung.boot.bootstrapmode; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +import com.baeldung.boot.bootstrapmode.domain.Todo; +import com.baeldung.boot.bootstrapmode.repository.TodoRepository; + +@DataJpaTest +class BootstrapmodeDefaultIntegrationTest { + + @Autowired + private TodoRepository todoRepository; + + @Test + void givenBootstrapmodeValueIsDefault_whenCreatingTodo_shouldSuccess() { + Todo todo = new Todo("Something to be done"); + + assertThat(todoRepository.save(todo)).hasNoNullFieldsOrProperties(); + } +} diff --git a/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/bootstrapmode/BootstrapmodeDeferredIntegrationTest.java b/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/bootstrapmode/BootstrapmodeDeferredIntegrationTest.java new file mode 100644 index 0000000000..02110519df --- /dev/null +++ b/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/bootstrapmode/BootstrapmodeDeferredIntegrationTest.java @@ -0,0 +1,25 @@ +package com.baeldung.boot.bootstrapmode; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.data.repository.config.BootstrapMode; + +import com.baeldung.boot.bootstrapmode.domain.Todo; +import com.baeldung.boot.bootstrapmode.repository.TodoRepository; + +@DataJpaTest(bootstrapMode = BootstrapMode.DEFERRED) +class BootstrapmodeDeferredIntegrationTest { + + @Autowired + private TodoRepository todoRepository; + + @Test + void givenBootstrapmodeValueIsDeferred_whenCreatingTodo_shouldSuccess() { + Todo todo = new Todo("Something to be done"); + + assertThat(todoRepository.save(todo)).hasNoNullFieldsOrProperties(); + } +} diff --git a/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/bootstrapmode/BootstrapmodeLazyIntegrationTest.java b/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/bootstrapmode/BootstrapmodeLazyIntegrationTest.java new file mode 100644 index 0000000000..eb5ddfa6ca --- /dev/null +++ b/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/bootstrapmode/BootstrapmodeLazyIntegrationTest.java @@ -0,0 +1,25 @@ +package com.baeldung.boot.bootstrapmode; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.data.repository.config.BootstrapMode; + +import com.baeldung.boot.bootstrapmode.domain.Todo; +import com.baeldung.boot.bootstrapmode.repository.TodoRepository; + +@DataJpaTest(bootstrapMode = BootstrapMode.LAZY) +class BootstrapmodeLazyIntegrationTest { + + @Autowired + private TodoRepository todoRepository; + + @Test + void givenBootstrapmodeValueIsLazy_whenCreatingTodo_shouldSuccess() { + Todo todo = new Todo("Something to be done"); + + assertThat(todoRepository.save(todo)).hasNoNullFieldsOrProperties(); + } +} From 1d1791c90d989b111c21474ec9332685e12d61dd Mon Sep 17 00:00:00 2001 From: "soni.sk@1969" Date: Wed, 30 Mar 2022 11:08:29 +0530 Subject: [PATCH 009/278] BAEL-5329 Hide a Request Field in Swagger UI --- .../swagger/ArticleApplication.java | 31 +++++++++++ .../controller/ArticlesController.java | 28 ++++++++++ .../springboot/swagger/model/Article.java | 54 +++++++++++++++++++ .../swagger/service/ArticleService.java | 25 +++++++++ 4 files changed, 138 insertions(+) create mode 100644 spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/ArticleApplication.java create mode 100644 spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/controller/ArticlesController.java create mode 100644 spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/model/Article.java create mode 100644 spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/service/ArticleService.java diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/ArticleApplication.java b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/ArticleApplication.java new file mode 100644 index 0000000000..fd03efa695 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/ArticleApplication.java @@ -0,0 +1,31 @@ +package com.baeldung.springboot.swagger; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; + +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +@SpringBootApplication +@EnableSwagger2 +public class ArticleApplication { + + public static void main(String[] args) { + SpringApplication.run(ArticleApplication.class, args); + + } + + @Bean + public Docket api() { + return new Docket(DocumentationType.SWAGGER_2) + .select() + .apis(RequestHandlerSelectors.any()) + .paths(PathSelectors.any()) + .build(); + } + +} diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/controller/ArticlesController.java b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/controller/ArticlesController.java new file mode 100644 index 0000000000..380f40dbd5 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/controller/ArticlesController.java @@ -0,0 +1,28 @@ +package com.baeldung.springboot.swagger.controller; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import com.baeldung.springboot.swagger.model.Article; +import com.baeldung.springboot.swagger.service.ArticleService; + +@RestController +@RequestMapping("/articles") +public class ArticlesController { + + @Autowired + private ArticleService articleService; + + @GetMapping("") + public List
getAllArticles(){ + return articleService.getAllArticles(); + } + + @PostMapping("") + public void addArticle(@RequestBody Article article) { + articleService.addArticle(article); + } + +} diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/model/Article.java b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/model/Article.java new file mode 100644 index 0000000000..ba927d5b4f --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/model/Article.java @@ -0,0 +1,54 @@ +package com.baeldung.springboot.swagger.model; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiParam; + +public class Article { + + //@JsonIgnore + //@JsonProperty(access = JsonProperty.Access.READ_ONLY) + //@ApiModelProperty(hidden = true) + @ApiParam(hidden = true) + //@ApiModelProperty(readOnly = true) + private int id; + private String title; + private int numOfWords; + + public Article() { + } + + public Article(int id, String title) { + this.id = id; + this.title = title; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public int getNumOfWords() { + return numOfWords; + } + + public void setNumOfWords(int numOfWords) { + this.numOfWords = numOfWords; + } + +} diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/service/ArticleService.java b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/service/ArticleService.java new file mode 100644 index 0000000000..b41bfabb29 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/service/ArticleService.java @@ -0,0 +1,25 @@ +package com.baeldung.springboot.swagger.service; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.stereotype.Service; + +import com.baeldung.springboot.swagger.model.Article; + +@Service +public class ArticleService { + + private List
articles = new ArrayList<>(); + + public List
getAllArticles(){ + return articles; + } + + public void addArticle(Article article) { + article.setId(articles.size()+1); + articles.add(article); + } + + +} From 31a9e429f1d64e9b5d867f4d20422b1a5d337c9b Mon Sep 17 00:00:00 2001 From: "soni.sk@1969" Date: Wed, 30 Mar 2022 11:09:45 +0530 Subject: [PATCH 010/278] Updated indentation --- .../swagger/ArticleApplication.java | 25 +++++++++--------- .../controller/ArticlesController.java | 26 +++++++++---------- .../springboot/swagger/model/Article.java | 2 +- .../swagger/service/ArticleService.java | 22 ++++++++-------- 4 files changed, 37 insertions(+), 38 deletions(-) diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/ArticleApplication.java b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/ArticleApplication.java index fd03efa695..568d31e8bc 100644 --- a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/ArticleApplication.java +++ b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/ArticleApplication.java @@ -14,18 +14,17 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2; @EnableSwagger2 public class ArticleApplication { - public static void main(String[] args) { - SpringApplication.run(ArticleApplication.class, args); - - } - - @Bean - public Docket api() { - return new Docket(DocumentationType.SWAGGER_2) - .select() - .apis(RequestHandlerSelectors.any()) - .paths(PathSelectors.any()) - .build(); - } + public static void main(String[] args) { + SpringApplication.run(ArticleApplication.class, args); + } + + @Bean + public Docket api() { + return new Docket(DocumentationType.SWAGGER_2) + .select() + .apis(RequestHandlerSelectors.any()) + .paths(PathSelectors.any()) + .build(); + } } diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/controller/ArticlesController.java b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/controller/ArticlesController.java index 380f40dbd5..96812e367a 100644 --- a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/controller/ArticlesController.java +++ b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/controller/ArticlesController.java @@ -11,18 +11,18 @@ import com.baeldung.springboot.swagger.service.ArticleService; @RestController @RequestMapping("/articles") public class ArticlesController { - - @Autowired - private ArticleService articleService; - - @GetMapping("") - public List
getAllArticles(){ - return articleService.getAllArticles(); - } - - @PostMapping("") - public void addArticle(@RequestBody Article article) { - articleService.addArticle(article); - } + + @Autowired + private ArticleService articleService; + + @GetMapping("") + public List
getAllArticles() { + return articleService.getAllArticles(); + } + + @PostMapping("") + public void addArticle(@RequestBody Article article) { + articleService.addArticle(article); + } } diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/model/Article.java b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/model/Article.java index ba927d5b4f..6512b4e1a7 100644 --- a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/model/Article.java +++ b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/model/Article.java @@ -13,7 +13,7 @@ public class Article { //@JsonIgnore //@JsonProperty(access = JsonProperty.Access.READ_ONLY) //@ApiModelProperty(hidden = true) - @ApiParam(hidden = true) + //@ApiParam(hidden = true) //@ApiModelProperty(readOnly = true) private int id; private String title; diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/service/ArticleService.java b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/service/ArticleService.java index b41bfabb29..04f6e6c6e3 100644 --- a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/service/ArticleService.java +++ b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/service/ArticleService.java @@ -9,17 +9,17 @@ import com.baeldung.springboot.swagger.model.Article; @Service public class ArticleService { - - private List
articles = new ArrayList<>(); - - public List
getAllArticles(){ - return articles; - } - - public void addArticle(Article article) { - article.setId(articles.size()+1); - articles.add(article); - } + + private List
articles = new ArrayList<>(); + + public List
getAllArticles() { + return articles; + } + + public void addArticle(Article article) { + article.setId(articles.size() + 1); + articles.add(article); + } } From f493bfc95929895edb751739d5684948f1699505 Mon Sep 17 00:00:00 2001 From: Arvind Kumar Avinash Date: Thu, 31 Mar 2022 08:59:10 +0100 Subject: [PATCH 011/278] Update UserController.java Changed the name and email address of the second and the third user to avoid confusion for the readers. --- .../baeldung/bootcustomfilters/controller/UserController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/bootcustomfilters/controller/UserController.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/bootcustomfilters/controller/UserController.java index 50d5f4ea71..9ef1fcbc8e 100644 --- a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/bootcustomfilters/controller/UserController.java +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/bootcustomfilters/controller/UserController.java @@ -27,8 +27,8 @@ public class UserController { LOG.info("Fetching all the users"); return Arrays.asList( new User(UUID.randomUUID().toString(), "User1", "user1@test.com"), - new User(UUID.randomUUID().toString(), "User1", "user1@test.com"), - new User(UUID.randomUUID().toString(), "User1", "user1@test.com")); + new User(UUID.randomUUID().toString(), "User2", "user2@test.com"), + new User(UUID.randomUUID().toString(), "User3", "user3@test.com")); } } From 4b11cc78b0a1d4f0560eda887bc71d72be1a4ca6 Mon Sep 17 00:00:00 2001 From: 515882294 <515882294@qq.com> Date: Thu, 7 Apr 2022 22:06:01 +0800 Subject: [PATCH 012/278] BAEL-1699 - Java 9 illegal reflective access warning --- .../A01-compile-and-package-baeldung-agent.sh | 11 +++ ...-compile-and-package-baeldung-reflected.sh | 11 +++ ...ompile-and-package-baeldung-intermedium.sh | 11 +++ ...e-and-package-baeldung-reflecting-named.sh | 11 +++ ...and-package-baeldung-reflecting-unnamed.sh | 11 +++ ...eldung-reflecting-named-using-add-opens.sh | 4 ++ ...ng-reflecting-named-using-forward-opens.sh | 4 ++ ...ldung-reflecting-named-using-java-agent.sh | 4 ++ ...aeldung-reflecting-unnamed-with-warning.sh | 2 + ...dung-reflecting-unnamed-using-add-opens.sh | 2 + ...ung-reflecting-unnamed-using-java-agent.sh | 2 + .../C01-clean.sh | 4 ++ .../com/baeldung/agent/LoadTimeAgent.java | 69 +++++++++++++++++++ .../baeldung-agent/manifest.txt | 3 + .../baeldung-agent/module-info.java | 3 + .../com/baeldung/intermedium/ForwardOpen.java | 15 ++++ .../baeldung-intermedium/module-info.java | 3 + .../exported/ExportedNonPublicClass.java | 11 +++ .../exported/ExportedPublicClass.java | 11 +++ .../internal/InternalNonPublicClass.java | 11 +++ .../internal/InternalPublicClass.java | 11 +++ .../opened/OpenedNonPublicClass.java | 11 +++ .../reflected/opened/OpenedPublicClass.java | 11 +++ .../baeldung-reflected/module-info.java | 4 ++ .../com/baeldung/reflecting/named/Main.java | 12 ++++ .../reflecting/named/MainWithForwardOpen.java | 18 +++++ .../module-info.java | 4 ++ .../com/baeldung/reflecting/unnamed/Main.java | 13 ++++ 28 files changed, 287 insertions(+) create mode 100644 core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A01-compile-and-package-baeldung-agent.sh create mode 100644 core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A02-compile-and-package-baeldung-reflected.sh create mode 100644 core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A03-compile-and-package-baeldung-intermedium.sh create mode 100644 core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A04-compile-and-package-baeldung-reflecting-named.sh create mode 100644 core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A05-compile-and-package-baeldung-reflecting-unnamed.sh create mode 100644 core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B01-runtime-baeldung-reflecting-named-using-add-opens.sh create mode 100644 core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B02-runtime-baeldung-reflecting-named-using-forward-opens.sh create mode 100644 core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B03-runtime-baeldung-reflecting-named-using-java-agent.sh create mode 100644 core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B04-runtime-baeldung-reflecting-unnamed-with-warning.sh create mode 100644 core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B05-runtime-baeldung-reflecting-unnamed-using-add-opens.sh create mode 100644 core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B06-runtime-baeldung-reflecting-unnamed-using-java-agent.sh create mode 100644 core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/C01-clean.sh create mode 100644 core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-agent/com/baeldung/agent/LoadTimeAgent.java create mode 100644 core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-agent/manifest.txt create mode 100644 core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-agent/module-info.java create mode 100644 core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-intermedium/com/baeldung/intermedium/ForwardOpen.java create mode 100644 core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-intermedium/module-info.java create mode 100644 core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/exported/ExportedNonPublicClass.java create mode 100644 core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/exported/ExportedPublicClass.java create mode 100644 core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/internal/InternalNonPublicClass.java create mode 100644 core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/internal/InternalPublicClass.java create mode 100644 core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/opened/OpenedNonPublicClass.java create mode 100644 core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/opened/OpenedPublicClass.java create mode 100644 core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/module-info.java create mode 100644 core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflecting-named/com/baeldung/reflecting/named/Main.java create mode 100644 core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflecting-named/com/baeldung/reflecting/named/MainWithForwardOpen.java create mode 100644 core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflecting-named/module-info.java create mode 100644 core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflecting-unnamed/com/baeldung/reflecting/unnamed/Main.java diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A01-compile-and-package-baeldung-agent.sh b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A01-compile-and-package-baeldung-agent.sh new file mode 100644 index 0000000000..959fa66ec4 --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A01-compile-and-package-baeldung-agent.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +DIR=baeldung-agent + +# compile +mkdir -p out/${DIR} +javac -d out/${DIR} $(find ${DIR} -type f -name "*.java") + +# package +mkdir -p mods +jar --create --file=mods/${DIR}.jar --manifest=${DIR}/manifest.txt -C out/${DIR} . diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A02-compile-and-package-baeldung-reflected.sh b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A02-compile-and-package-baeldung-reflected.sh new file mode 100644 index 0000000000..fa922c54df --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A02-compile-and-package-baeldung-reflected.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +DIR=baeldung-reflected + +# compile +mkdir -p out/${DIR} +javac -d out/${DIR} $(find ${DIR} -type f -name "*.java") + +# package +mkdir -p mods +jar --create --file=mods/${DIR}.jar -C out/${DIR} . diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A03-compile-and-package-baeldung-intermedium.sh b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A03-compile-and-package-baeldung-intermedium.sh new file mode 100644 index 0000000000..af76ff5a2e --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A03-compile-and-package-baeldung-intermedium.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +DIR=baeldung-intermedium + +# compile +mkdir -p out/${DIR} +javac -d out/${DIR} $(find ${DIR} -type f -name "*.java") + +# package +mkdir -p mods +jar --create --file=mods/${DIR}.jar -C out/${DIR} . diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A04-compile-and-package-baeldung-reflecting-named.sh b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A04-compile-and-package-baeldung-reflecting-named.sh new file mode 100644 index 0000000000..f3f91c9f04 --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A04-compile-and-package-baeldung-reflecting-named.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +DIR=baeldung-reflecting-named + +# compile +mkdir -p out/${DIR} +javac -d out/${DIR} --module-path mods $(find ${DIR} -type f -name "*.java") + +# package +mkdir -p mods +jar --create --file=mods/${DIR}.jar -C out/${DIR} . diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A05-compile-and-package-baeldung-reflecting-unnamed.sh b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A05-compile-and-package-baeldung-reflecting-unnamed.sh new file mode 100644 index 0000000000..deb0a8aaea --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A05-compile-and-package-baeldung-reflecting-unnamed.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +DIR=baeldung-reflecting-unnamed + +# compile +mkdir -p out/${DIR} +javac -d out/${DIR} $(find ${DIR} -type f -name "*.java") + +# package +mkdir -p mods +jar --create --file=mods/${DIR}.jar -C out/${DIR} . diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B01-runtime-baeldung-reflecting-named-using-add-opens.sh b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B01-runtime-baeldung-reflecting-named-using-add-opens.sh new file mode 100644 index 0000000000..720ad69003 --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B01-runtime-baeldung-reflecting-named-using-add-opens.sh @@ -0,0 +1,4 @@ +#!/bin/bash +java --module-path mods \ + --add-opens baeldung.reflected/com.baeldung.reflected.internal=baeldung.reflecting.named \ + --module baeldung.reflecting.named/com.baeldung.reflecting.named.Main diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B02-runtime-baeldung-reflecting-named-using-forward-opens.sh b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B02-runtime-baeldung-reflecting-named-using-forward-opens.sh new file mode 100644 index 0000000000..9b5f9cb094 --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B02-runtime-baeldung-reflecting-named-using-forward-opens.sh @@ -0,0 +1,4 @@ +#!/bin/bash +java --module-path mods \ + --add-opens baeldung.reflected/com.baeldung.reflected.internal=baeldung.intermedium \ + --module baeldung.reflecting.named/com.baeldung.reflecting.named.MainWithForwardOpen diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B03-runtime-baeldung-reflecting-named-using-java-agent.sh b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B03-runtime-baeldung-reflecting-named-using-java-agent.sh new file mode 100644 index 0000000000..cf66dd778f --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B03-runtime-baeldung-reflecting-named-using-java-agent.sh @@ -0,0 +1,4 @@ +#!/bin/bash +java --module-path mods \ + -javaagent:mods/baeldung-agent.jar=com.baeldung.reflected.internal.InternalNonPublicClass,com.baeldung.reflecting.named.Main \ + --module baeldung.reflecting.named/com.baeldung.reflecting.named.Main diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B04-runtime-baeldung-reflecting-unnamed-with-warning.sh b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B04-runtime-baeldung-reflecting-unnamed-with-warning.sh new file mode 100644 index 0000000000..525b8dc58c --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B04-runtime-baeldung-reflecting-unnamed-with-warning.sh @@ -0,0 +1,2 @@ +#!/bin/bash +java -cp "mods/*" com.baeldung.reflecting.unnamed.Main diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B05-runtime-baeldung-reflecting-unnamed-using-add-opens.sh b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B05-runtime-baeldung-reflecting-unnamed-using-add-opens.sh new file mode 100644 index 0000000000..f7f5f16237 --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B05-runtime-baeldung-reflecting-unnamed-using-add-opens.sh @@ -0,0 +1,2 @@ +#!/bin/bash +java -cp "mods/*" --add-opens java.base/java.lang=ALL-UNNAMED com.baeldung.reflecting.unnamed.Main \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B06-runtime-baeldung-reflecting-unnamed-using-java-agent.sh b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B06-runtime-baeldung-reflecting-unnamed-using-java-agent.sh new file mode 100644 index 0000000000..4b30ae1a5c --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B06-runtime-baeldung-reflecting-unnamed-using-java-agent.sh @@ -0,0 +1,2 @@ +#!/bin/bash +java -cp "mods/*" -javaagent:mods/baeldung-agent.jar com.baeldung.reflecting.unnamed.Main diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/C01-clean.sh b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/C01-clean.sh new file mode 100644 index 0000000000..98707f810f --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/C01-clean.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +rm -rf out +rm -rf mods diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-agent/com/baeldung/agent/LoadTimeAgent.java b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-agent/com/baeldung/agent/LoadTimeAgent.java new file mode 100644 index 0000000000..a2ec9c3d4a --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-agent/com/baeldung/agent/LoadTimeAgent.java @@ -0,0 +1,69 @@ +package com.baeldung.agent; + +import java.lang.instrument.Instrumentation; +import java.util.*; + +public class LoadTimeAgent { + public static void premain(String agentArgs, Instrumentation inst) { + System.out.println("agentArgs: " + agentArgs); + + if (agentArgs != null) { + addExportsAndOpensByClassName(inst, agentArgs); + } + else { + addExportsAndOpensToUnnamedModule(inst); + } + } + + private static void addExportsAndOpensByClassName(Instrumentation inst, String agentArgs) { + String[] array = agentArgs.split(","); + try { + String className1 = array[0]; + String className2 = array[1]; + Class clazz1 = Class.forName(className1); + Class clazz2 = Class.forName(className2); + + Module srcModule = clazz1.getModule(); + Module targetModule = clazz2.getModule(); + redefineModule(inst, srcModule, targetModule); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + } + + private static void addExportsAndOpensToUnnamedModule(Instrumentation inst) { + Module unnamedModule = ClassLoader.getSystemClassLoader().getUnnamedModule(); + Set modules = ModuleLayer.boot().modules(); + + for (Module m : modules) { + redefineModule(inst, m, unnamedModule); + } + } + + private static void redefineModule(Instrumentation inst, Module src, Module target) { + // prepare extra reads + Set extraReads = Collections.singleton(target); + + // prepare extra exports + Set packages = src.getPackages(); + Map> extraExports = new HashMap<>(); + for (String pkg : packages) { + extraExports.put(pkg, extraReads); + } + + // prepare extra opens + Map> extraOpens = new HashMap<>(); + for (String pkg : packages) { + extraOpens.put(pkg, extraReads); + } + + // prepare extra uses + Set> extraUses = Collections.emptySet(); + + // prepare extra uses + Map, List>> extraProvides = Collections.emptyMap(); + + // redefine module + inst.redefineModule(src, extraReads, extraExports, extraOpens, extraUses, extraProvides); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-agent/manifest.txt b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-agent/manifest.txt new file mode 100644 index 0000000000..3dc9de7ba5 --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-agent/manifest.txt @@ -0,0 +1,3 @@ +Premain-Class: com.baeldung.agent.LoadTimeAgent +Can-Redefine-Classes: true +Can-Retransform-Classes: true diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-agent/module-info.java b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-agent/module-info.java new file mode 100644 index 0000000000..c976de2881 --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-agent/module-info.java @@ -0,0 +1,3 @@ +module baeldung.agent { + requires java.instrument; +} \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-intermedium/com/baeldung/intermedium/ForwardOpen.java b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-intermedium/com/baeldung/intermedium/ForwardOpen.java new file mode 100644 index 0000000000..db031e2cfc --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-intermedium/com/baeldung/intermedium/ForwardOpen.java @@ -0,0 +1,15 @@ +package com.baeldung.intermedium; + +public class ForwardOpen { + public static void addOpens(Class clazz1, Class clazz2) { + Module currentModule = ForwardOpen.class.getModule(); + Module srcModule = clazz1.getModule(); + Module targetModule = clazz2.getModule(); + + System.out.println("current module: " + currentModule.getName()); + System.out.println("source module: " + srcModule.getName()); + System.out.println("target module: " + targetModule.getName()); + + srcModule.addOpens(clazz1.getPackageName(), targetModule); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-intermedium/module-info.java b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-intermedium/module-info.java new file mode 100644 index 0000000000..9ca6cbce43 --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-intermedium/module-info.java @@ -0,0 +1,3 @@ +module baeldung.intermedium { + exports com.baeldung.intermedium; +} \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/exported/ExportedNonPublicClass.java b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/exported/ExportedNonPublicClass.java new file mode 100644 index 0000000000..c95e17ec1f --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/exported/ExportedNonPublicClass.java @@ -0,0 +1,11 @@ +package com.baeldung.reflected.exported; + +class ExportedNonPublicClass { + public static void testPublicStaticMethod() { + System.out.println("ExportedNonPublicClass.testPublicStaticMethod()"); + } + + private static void testPrivateStaticMethod() { + System.out.println("ExportedNonPublicClass.testPrivateStaticMethod()"); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/exported/ExportedPublicClass.java b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/exported/ExportedPublicClass.java new file mode 100644 index 0000000000..3bbfca209c --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/exported/ExportedPublicClass.java @@ -0,0 +1,11 @@ +package com.baeldung.reflected.exported; + +public class ExportedPublicClass { + public static void testPublicStaticMethod() { + System.out.println("ExportedPublicClass.testPublicStaticMethod()"); + } + + private static void testPrivateStaticMethod() { + System.out.println("ExportedPublicClass.testPrivateStaticMethod()"); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/internal/InternalNonPublicClass.java b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/internal/InternalNonPublicClass.java new file mode 100644 index 0000000000..052ecbea9e --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/internal/InternalNonPublicClass.java @@ -0,0 +1,11 @@ +package com.baeldung.reflected.internal; + +class InternalNonPublicClass { + public static void testPublicStaticMethod() { + System.out.println("InternalNonPublicClass.testPublicStaticMethod()"); + } + + private static void testPrivateStaticMethod() { + System.out.println("InternalNonPublicClass.testPrivateStaticMethod()"); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/internal/InternalPublicClass.java b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/internal/InternalPublicClass.java new file mode 100644 index 0000000000..8f7a20698f --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/internal/InternalPublicClass.java @@ -0,0 +1,11 @@ +package com.baeldung.reflected.internal; + +public class InternalPublicClass { + public static void testPublicStaticMethod() { + System.out.println("InternalPublicClass.testPublicStaticMethod()"); + } + + private static void testPrivateStaticMethod() { + System.out.println("InternalPublicClass.testPrivateStaticMethod()"); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/opened/OpenedNonPublicClass.java b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/opened/OpenedNonPublicClass.java new file mode 100644 index 0000000000..99f9850cc1 --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/opened/OpenedNonPublicClass.java @@ -0,0 +1,11 @@ +package com.baeldung.reflected.opened; + +class OpenedNonPublicClass { + public static void testPublicStaticMethod() { + System.out.println("OpenedNonPublicClass.testPublicStaticMethod()"); + } + + private static void testPrivateStaticMethod() { + System.out.println("OpenedNonPublicClass.testPrivateStaticMethod()"); + } +} diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/opened/OpenedPublicClass.java b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/opened/OpenedPublicClass.java new file mode 100644 index 0000000000..f9a56ca26b --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/opened/OpenedPublicClass.java @@ -0,0 +1,11 @@ +package com.baeldung.reflected.opened; + +public class OpenedPublicClass { + public static void testPublicStaticMethod() { + System.out.println("OpenedPublicClass.testPublicStaticMethod()"); + } + + private static void testPrivateStaticMethod() { + System.out.println("OpenedPublicClass.testPrivateStaticMethod()"); + } +} diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/module-info.java b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/module-info.java new file mode 100644 index 0000000000..e2164415cf --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/module-info.java @@ -0,0 +1,4 @@ +module baeldung.reflected { + exports com.baeldung.reflected.exported; + opens com.baeldung.reflected.opened; +} \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflecting-named/com/baeldung/reflecting/named/Main.java b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflecting-named/com/baeldung/reflecting/named/Main.java new file mode 100644 index 0000000000..c0fa4010ab --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflecting-named/com/baeldung/reflecting/named/Main.java @@ -0,0 +1,12 @@ +package com.baeldung.reflecting.named; + +import java.lang.reflect.Method; + +public class Main { + public static void main(String[] args) throws Exception { + Class clazz = Class.forName("com.baeldung.reflected.internal.InternalNonPublicClass"); + Method method = clazz.getDeclaredMethod("testPrivateStaticMethod"); + method.setAccessible(true); + method.invoke(null); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflecting-named/com/baeldung/reflecting/named/MainWithForwardOpen.java b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflecting-named/com/baeldung/reflecting/named/MainWithForwardOpen.java new file mode 100644 index 0000000000..fad8a9ddce --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflecting-named/com/baeldung/reflecting/named/MainWithForwardOpen.java @@ -0,0 +1,18 @@ +package com.baeldung.reflecting.named; + +import com.baeldung.intermedium.ForwardOpen; + +import java.lang.reflect.Method; + +public class MainWithForwardOpen { + public static void main(String[] args) throws Exception { + Class currentClass = Main.class; + Class clazz = Class.forName("com.baeldung.reflected.internal.InternalNonPublicClass"); + + ForwardOpen.addOpens(clazz, currentClass); + + Method method = clazz.getDeclaredMethod("testPrivateStaticMethod"); + method.setAccessible(true); + method.invoke(null); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflecting-named/module-info.java b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflecting-named/module-info.java new file mode 100644 index 0000000000..936f53cd6e --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflecting-named/module-info.java @@ -0,0 +1,4 @@ +module baeldung.reflecting.named { + requires baeldung.intermedium; + requires baeldung.reflected; +} \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflecting-unnamed/com/baeldung/reflecting/unnamed/Main.java b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflecting-unnamed/com/baeldung/reflecting/unnamed/Main.java new file mode 100644 index 0000000000..37bdc57eaf --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflecting-unnamed/com/baeldung/reflecting/unnamed/Main.java @@ -0,0 +1,13 @@ +package com.baeldung.reflecting.unnamed; + +import java.lang.reflect.Field; + +public class Main { + public static void main(String[] args) throws Exception { + Class clazz = StringBuilder.class; + Field f = clazz.getDeclaredField("serialVersionUID"); + f.setAccessible(true); + Object value = f.get(null); + System.out.println(value); + } +} \ No newline at end of file From 15323bddf0477d539b1b9458410b94b22aed11de Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Tue, 5 Apr 2022 22:02:54 +0100 Subject: [PATCH 013/278] [JAVA-10446] Convert Feign-OAuth2 unit test to manual test --- spring-cloud/pom.xml | 2 +- ...nualTest.java => OpenFeignManualTest.java} | 2 +- .../openfeign/OpenFeignOAuth2ManualTest.java | 44 +++++++++++++++++++ .../openfeign/PaymentClientUnitTest.java | 30 ------------- 4 files changed, 46 insertions(+), 32 deletions(-) rename spring-cloud/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/{OpenfeignManualTest.java => OpenFeignManualTest.java} (96%) create mode 100644 spring-cloud/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/OpenFeignOAuth2ManualTest.java delete mode 100644 spring-cloud/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/PaymentClientUnitTest.java diff --git a/spring-cloud/pom.xml b/spring-cloud/pom.xml index a2c4b3509f..9205416cd5 100644 --- a/spring-cloud/pom.xml +++ b/spring-cloud/pom.xml @@ -45,7 +45,7 @@ spring-cloud-ribbon-retry spring-cloud-circuit-breaker spring-cloud-eureka-self-preservation - + spring-cloud-openfeign spring-cloud-netflix-feign spring-cloud-sentinel spring-cloud-dapr diff --git a/spring-cloud/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/OpenfeignManualTest.java b/spring-cloud/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/OpenFeignManualTest.java similarity index 96% rename from spring-cloud/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/OpenfeignManualTest.java rename to spring-cloud/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/OpenFeignManualTest.java index 8ae6883519..4eb014de96 100644 --- a/spring-cloud/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/OpenfeignManualTest.java +++ b/spring-cloud/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/OpenFeignManualTest.java @@ -15,7 +15,7 @@ import static org.junit.Assert.assertNotNull; @RunWith(SpringRunner.class) @SpringBootTest -public class OpenfeignManualTest { +public class OpenFeignManualTest { @Autowired private JSONPlaceHolderService jsonPlaceHolderService; diff --git a/spring-cloud/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/OpenFeignOAuth2ManualTest.java b/spring-cloud/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/OpenFeignOAuth2ManualTest.java new file mode 100644 index 0000000000..8084fd23cd --- /dev/null +++ b/spring-cloud/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/OpenFeignOAuth2ManualTest.java @@ -0,0 +1,44 @@ +package com.baeldung.cloud.openfeign; + +import com.baeldung.cloud.openfeign.client.PaymentClient; +import com.baeldung.cloud.openfeign.model.Payment; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.List; + +import static org.junit.Assert.assertFalse; + +/** + * This test can be used to verify OAuth2 Token functionality with Feign client + * (https://www.baeldung.com/spring-cloud-feign-oauth-token). + * + * The following components should be setup and running, as described in the article, prior to running this test. + * + * Authorization Server - embedded Keycloak server with the correct client and client-secret defined in the master realm. + * This will issue the auth tokens used by Feign client. + * Further details are available at: https://www.baeldung.com/keycloak-embedded-in-spring-boot-app + * + * Resource Server - OAuth resource server requiring valid JWT token (issued by the Authorization Server). + * Further details are available at: https://www.baeldung.com/spring-security-oauth-resource-server + * + */ +@RunWith(SpringRunner.class) +@SpringBootTest +public class OpenFeignOAuth2ManualTest { + + @Autowired + private PaymentClient paymentClient; + + @Test + public void whenGetPayment_thenListPayments() { + + List payments = paymentClient.getPayments(); + + assertFalse(payments.isEmpty()); + } + +} diff --git a/spring-cloud/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/PaymentClientUnitTest.java b/spring-cloud/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/PaymentClientUnitTest.java deleted file mode 100644 index 0372728515..0000000000 --- a/spring-cloud/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/PaymentClientUnitTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.baeldung.cloud.openfeign; - -import com.baeldung.cloud.openfeign.client.PaymentClient; -import com.baeldung.cloud.openfeign.model.Payment; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import java.util.List; - -import static org.junit.Assert.assertFalse; - -@RunWith(SpringRunner.class) -@SpringBootTest -public class PaymentClientUnitTest { - - @Autowired - private PaymentClient paymentClient; - - @Test - public void whenGetPayment_thenListPayments() { - - List payments = paymentClient.getPayments(); - - assertFalse(payments.isEmpty()); - } - -} From dfad1122a467c132a4779b12eecbb2da0dffb708 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Fri, 8 Apr 2022 21:06:02 +0530 Subject: [PATCH 014/278] JAVA-8372 Split or move spring-boot-data module --- .../spring-boot-data-2/README.md | 1 + .../spring-boot-data-2/pom.xml | 9 ++++++++ .../javers/SpringBootJaVersApplication.java | 0 .../javers/config/JaversConfiguration.java | 0 .../com/baeldung/javers/domain/Address.java | 0 .../com/baeldung/javers/domain/Product.java | 0 .../com/baeldung/javers/domain/Store.java | 0 .../javers/repo/ProductRepository.java | 0 .../baeldung/javers/repo/StoreRepository.java | 0 .../baeldung/javers/service/StoreService.java | 0 .../baeldung/javers/web/RebrandStoreDto.java | 0 .../baeldung/javers/web/StoreController.java | 0 .../baeldung/javers/web/UpdatePriceDto.java | 0 .../src/main/resources/application.properties | 22 +++++++++++++++++++ .../spring-boot-data/README.md | 2 +- spring-boot-modules/spring-boot-data/pom.xml | 6 ----- .../disableautoconfig/SpringDataJPA.java | 5 ++--- .../src/main/resources/application.properties | 16 +------------- 18 files changed, 36 insertions(+), 25 deletions(-) rename spring-boot-modules/{spring-boot-data => spring-boot-data-2}/src/main/java/com/baeldung/javers/SpringBootJaVersApplication.java (100%) rename spring-boot-modules/{spring-boot-data => spring-boot-data-2}/src/main/java/com/baeldung/javers/config/JaversConfiguration.java (100%) rename spring-boot-modules/{spring-boot-data => spring-boot-data-2}/src/main/java/com/baeldung/javers/domain/Address.java (100%) rename spring-boot-modules/{spring-boot-data => spring-boot-data-2}/src/main/java/com/baeldung/javers/domain/Product.java (100%) rename spring-boot-modules/{spring-boot-data => spring-boot-data-2}/src/main/java/com/baeldung/javers/domain/Store.java (100%) rename spring-boot-modules/{spring-boot-data => spring-boot-data-2}/src/main/java/com/baeldung/javers/repo/ProductRepository.java (100%) rename spring-boot-modules/{spring-boot-data => spring-boot-data-2}/src/main/java/com/baeldung/javers/repo/StoreRepository.java (100%) rename spring-boot-modules/{spring-boot-data => spring-boot-data-2}/src/main/java/com/baeldung/javers/service/StoreService.java (100%) rename spring-boot-modules/{spring-boot-data => spring-boot-data-2}/src/main/java/com/baeldung/javers/web/RebrandStoreDto.java (100%) rename spring-boot-modules/{spring-boot-data => spring-boot-data-2}/src/main/java/com/baeldung/javers/web/StoreController.java (100%) rename spring-boot-modules/{spring-boot-data => spring-boot-data-2}/src/main/java/com/baeldung/javers/web/UpdatePriceDto.java (100%) create mode 100644 spring-boot-modules/spring-boot-data-2/src/main/resources/application.properties diff --git a/spring-boot-modules/spring-boot-data-2/README.md b/spring-boot-modules/spring-boot-data-2/README.md index b99356492b..c01c54e29e 100644 --- a/spring-boot-modules/spring-boot-data-2/README.md +++ b/spring-boot-modules/spring-boot-data-2/README.md @@ -4,3 +4,4 @@ - [Spring Boot: Customize the Jackson ObjectMapper](https://www.baeldung.com/spring-boot-customize-jackson-objectmapper) - [“HttpMessageNotWritableException: No converter found for return value of type”](https://www.baeldung.com/spring-no-converter-found) - [Creating a Read-Only Repository with Spring Data](https://www.baeldung.com/spring-data-read-only-repository) +- [Using JaVers for Data Model Auditing in Spring Data](https://www.baeldung.com/spring-data-javers-audit) diff --git a/spring-boot-modules/spring-boot-data-2/pom.xml b/spring-boot-modules/spring-boot-data-2/pom.xml index a3c2430497..ea5de6d4b5 100644 --- a/spring-boot-modules/spring-boot-data-2/pom.xml +++ b/spring-boot-modules/spring-boot-data-2/pom.xml @@ -20,11 +20,20 @@ org.springframework.boot spring-boot-starter-data-jpa + + org.javers + javers-spring-boot-starter-sql + ${javers.version} + com.h2database h2 runtime + + + 6.5.3 + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/javers/SpringBootJaVersApplication.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/javers/SpringBootJaVersApplication.java similarity index 100% rename from spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/javers/SpringBootJaVersApplication.java rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/javers/SpringBootJaVersApplication.java diff --git a/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/javers/config/JaversConfiguration.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/javers/config/JaversConfiguration.java similarity index 100% rename from spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/javers/config/JaversConfiguration.java rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/javers/config/JaversConfiguration.java diff --git a/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/javers/domain/Address.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/javers/domain/Address.java similarity index 100% rename from spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/javers/domain/Address.java rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/javers/domain/Address.java diff --git a/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/javers/domain/Product.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/javers/domain/Product.java similarity index 100% rename from spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/javers/domain/Product.java rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/javers/domain/Product.java diff --git a/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/javers/domain/Store.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/javers/domain/Store.java similarity index 100% rename from spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/javers/domain/Store.java rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/javers/domain/Store.java diff --git a/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/javers/repo/ProductRepository.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/javers/repo/ProductRepository.java similarity index 100% rename from spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/javers/repo/ProductRepository.java rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/javers/repo/ProductRepository.java diff --git a/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/javers/repo/StoreRepository.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/javers/repo/StoreRepository.java similarity index 100% rename from spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/javers/repo/StoreRepository.java rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/javers/repo/StoreRepository.java diff --git a/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/javers/service/StoreService.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/javers/service/StoreService.java similarity index 100% rename from spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/javers/service/StoreService.java rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/javers/service/StoreService.java diff --git a/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/javers/web/RebrandStoreDto.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/javers/web/RebrandStoreDto.java similarity index 100% rename from spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/javers/web/RebrandStoreDto.java rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/javers/web/RebrandStoreDto.java diff --git a/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/javers/web/StoreController.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/javers/web/StoreController.java similarity index 100% rename from spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/javers/web/StoreController.java rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/javers/web/StoreController.java diff --git a/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/javers/web/UpdatePriceDto.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/javers/web/UpdatePriceDto.java similarity index 100% rename from spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/javers/web/UpdatePriceDto.java rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/javers/web/UpdatePriceDto.java diff --git a/spring-boot-modules/spring-boot-data-2/src/main/resources/application.properties b/spring-boot-modules/spring-boot-data-2/src/main/resources/application.properties new file mode 100644 index 0000000000..60a6e0fed5 --- /dev/null +++ b/spring-boot-modules/spring-boot-data-2/src/main/resources/application.properties @@ -0,0 +1,22 @@ +spring.h2.console.path=/h2 +spring.h2.console.enabled=true +spring.datasource.url=jdbc:h2:mem:testdb +spring.datasource.driver-class-name=org.h2.Driver +spring.datasource.username=sa +spring.datasource.password= +javers.mappingStyle=FIELD +javers.algorithm=SIMPLE +javers.commitIdGenerator=synchronized_sequence +javers.prettyPrint=true +javers.typeSafeValues=false +javers.newObjectSnapshot=true +javers.packagesToScan= +javers.auditableAspectEnabled=true +javers.springDataAuditableRepositoryAspectEnabled=true +javers.sqlSchema= +javers.sqlSchemaManagementEnabled=true +javers.prettyPrintDateFormats.localDateTime=dd MMM yyyy, HH:mm:ss +javers.prettyPrintDateFormats.zonedDateTime=dd MMM yyyy, HH:mm:ssZ +javers.prettyPrintDateFormats.localDate=dd MMM yyyy +javers.prettyPrintDateFormats.localTime=HH:mm:ss + diff --git a/spring-boot-modules/spring-boot-data/README.md b/spring-boot-modules/spring-boot-data/README.md index f72864e6d9..c56c87014d 100644 --- a/spring-boot-modules/spring-boot-data/README.md +++ b/spring-boot-modules/spring-boot-data/README.md @@ -11,4 +11,4 @@ This module contains articles about Spring Boot with Spring Data - [Spring Custom Property Editor](https://www.baeldung.com/spring-mvc-custom-property-editor) - [Using @JsonComponent in Spring Boot](https://www.baeldung.com/spring-boot-jsoncomponent) - [Guide To Running Logic on Startup in Spring](https://www.baeldung.com/running-setup-logic-on-startup-in-spring) -- [Using JaVers for Data Model Auditing in Spring Data](https://www.baeldung.com/spring-data-javers-audit) + diff --git a/spring-boot-modules/spring-boot-data/pom.xml b/spring-boot-modules/spring-boot-data/pom.xml index 18360bbd8b..b69d0e093a 100644 --- a/spring-boot-modules/spring-boot-data/pom.xml +++ b/spring-boot-modules/spring-boot-data/pom.xml @@ -19,11 +19,6 @@ org.springframework.boot spring-boot-starter-data-redis - - org.javers - javers-spring-boot-starter-sql - ${javers.version} - org.springframework.boot spring-boot-starter-data-mongodb @@ -164,7 +159,6 @@ - 5.14.0 2.2.4 1.8 1.8 diff --git a/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/disableautoconfig/SpringDataJPA.java b/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/disableautoconfig/SpringDataJPA.java index 87656f66a6..8554076612 100644 --- a/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/disableautoconfig/SpringDataJPA.java +++ b/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/disableautoconfig/SpringDataJPA.java @@ -1,6 +1,5 @@ package com.baeldung.disableautoconfig; -import org.javers.spring.boot.sql.JaversSqlAutoConfiguration; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration; @@ -9,8 +8,8 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerA import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, - JaversSqlAutoConfiguration.class, SpringDataWebAutoConfiguration.class, - DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class}) + SpringDataWebAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, + HibernateJpaAutoConfiguration.class}) public class SpringDataJPA { public static void main(String[] args) { diff --git a/spring-boot-modules/spring-boot-data/src/main/resources/application.properties b/spring-boot-modules/spring-boot-data/src/main/resources/application.properties index 969464a41c..cee5701cb5 100644 --- a/spring-boot-modules/spring-boot-data/src/main/resources/application.properties +++ b/spring-boot-modules/spring-boot-data/src/main/resources/application.properties @@ -6,19 +6,5 @@ spring.datasource.url=jdbc:h2:mem:testdb spring.datasource.driver-class-name=org.h2.Driver spring.datasource.username=sa spring.datasource.password= -javers.mappingStyle=FIELD -javers.algorithm=SIMPLE -javers.commitIdGenerator=synchronized_sequence -javers.prettyPrint=true -javers.typeSafeValues=false -javers.newObjectSnapshot=true -javers.packagesToScan= -javers.auditableAspectEnabled=true -javers.springDataAuditableRepositoryAspectEnabled=true -javers.sqlSchema= -javers.sqlSchemaManagementEnabled=true -javers.prettyPrintDateFormats.localDateTime=dd MMM yyyy, HH:mm:ss -javers.prettyPrintDateFormats.zonedDateTime=dd MMM yyyy, HH:mm:ssZ -javers.prettyPrintDateFormats.localDate=dd MMM yyyy -javers.prettyPrintDateFormats.localTime=HH:mm:ss + From bb7d2a5d5502c321805292d35a87d4be0def365f Mon Sep 17 00:00:00 2001 From: Vlad Fernoaga Date: Sat, 9 Apr 2022 06:29:33 +0300 Subject: [PATCH 015/278] How does spring singleton beans serve concurrent requests (#11987) * add service base structure - controllers & services & sanity check tests * finalize code * reformat continues lines with 2 spaces * reformat continues lines with 2 spaces --- .../ConcurrentRequestApplication.java | 11 ++++ .../baeldung/concurrentrequest/Product.java | 26 +++++++++ .../concurrentrequest/ProductController.java | 30 +++++++++++ .../concurrentrequest/ProductService.java | 32 +++++++++++ .../com/baeldung/concurrentrequest/Stock.java | 13 +++++ .../ConcurrentRequestUnitTest.java | 53 +++++++++++++++++++ 6 files changed, 165 insertions(+) create mode 100644 spring-core-5/src/main/java/com/baeldung/concurrentrequest/ConcurrentRequestApplication.java create mode 100644 spring-core-5/src/main/java/com/baeldung/concurrentrequest/Product.java create mode 100644 spring-core-5/src/main/java/com/baeldung/concurrentrequest/ProductController.java create mode 100644 spring-core-5/src/main/java/com/baeldung/concurrentrequest/ProductService.java create mode 100644 spring-core-5/src/main/java/com/baeldung/concurrentrequest/Stock.java create mode 100644 spring-core-5/src/test/java/com/baeldung/concurrentrequest/ConcurrentRequestUnitTest.java diff --git a/spring-core-5/src/main/java/com/baeldung/concurrentrequest/ConcurrentRequestApplication.java b/spring-core-5/src/main/java/com/baeldung/concurrentrequest/ConcurrentRequestApplication.java new file mode 100644 index 0000000000..21d031555b --- /dev/null +++ b/spring-core-5/src/main/java/com/baeldung/concurrentrequest/ConcurrentRequestApplication.java @@ -0,0 +1,11 @@ +package com.baeldung.concurrentrequest; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ConcurrentRequestApplication { + public static void main(String[] args) { + SpringApplication.run(ConcurrentRequestApplication.class, args); + } +} diff --git a/spring-core-5/src/main/java/com/baeldung/concurrentrequest/Product.java b/spring-core-5/src/main/java/com/baeldung/concurrentrequest/Product.java new file mode 100644 index 0000000000..30a47d27bc --- /dev/null +++ b/spring-core-5/src/main/java/com/baeldung/concurrentrequest/Product.java @@ -0,0 +1,26 @@ +package com.baeldung.concurrentrequest; + +public class Product { + + private final int id; + private final String name; + private final Stock stock; + + public Product(int id, String name, Stock stock) { + this.id = id; + this.name = name; + this.stock = stock; + } + + public Stock getStock() { + return stock; + } + + public int getId() { + return id; + } + + public String getName() { + return name; + } +} diff --git a/spring-core-5/src/main/java/com/baeldung/concurrentrequest/ProductController.java b/spring-core-5/src/main/java/com/baeldung/concurrentrequest/ProductController.java new file mode 100644 index 0000000000..11f824ddda --- /dev/null +++ b/spring-core-5/src/main/java/com/baeldung/concurrentrequest/ProductController.java @@ -0,0 +1,30 @@ +package com.baeldung.concurrentrequest; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController() +@RequestMapping("product") +public class ProductController { + + private final ProductService productService; + + public ProductController(ProductService productService) { + this.productService = productService; + } + + @GetMapping("/{id}") + public Product getProductDetails(@PathVariable("id") int productId) { + return productService.getProductById(productId) + .orElse(null); + } + + @GetMapping("{id}/stock") + public Stock getProductStock(@PathVariable("id") int productId) { + return productService.getProductById(productId) + .map(Product::getStock) + .orElse(null); + } +} diff --git a/spring-core-5/src/main/java/com/baeldung/concurrentrequest/ProductService.java b/spring-core-5/src/main/java/com/baeldung/concurrentrequest/ProductService.java new file mode 100644 index 0000000000..447c450213 --- /dev/null +++ b/spring-core-5/src/main/java/com/baeldung/concurrentrequest/ProductService.java @@ -0,0 +1,32 @@ +package com.baeldung.concurrentrequest; + +import static java.lang.Thread.currentThread; +import static java.util.Arrays.asList; + +import java.util.List; +import java.util.Optional; + +import org.springframework.stereotype.Service; + +@Service +public class ProductService { + + // @formatter:off + private final static List productRepository = asList( + new Product(1, "Product 1", new Stock(100)), + new Product(2, "Product 2", new Stock(50)) + ); + // @formatter:on + + public Optional getProductById(int id) { + Optional product = productRepository.stream() + .filter(p -> p.getId() == id) + .findFirst(); + String productName = product.map(Product::getName) + .orElse(null); + + System.out.printf("Thread: %s; bean instance: %s; product id: %s has the name: %s%n", currentThread().getName(), this, id, productName); + + return product; + } +} diff --git a/spring-core-5/src/main/java/com/baeldung/concurrentrequest/Stock.java b/spring-core-5/src/main/java/com/baeldung/concurrentrequest/Stock.java new file mode 100644 index 0000000000..bb7860f5be --- /dev/null +++ b/spring-core-5/src/main/java/com/baeldung/concurrentrequest/Stock.java @@ -0,0 +1,13 @@ +package com.baeldung.concurrentrequest; + +public class Stock { + private final int inStockItems; + + public Stock(int inStockItems) { + this.inStockItems = inStockItems; + } + + public int getInStockItems() { + return inStockItems; + } +} diff --git a/spring-core-5/src/test/java/com/baeldung/concurrentrequest/ConcurrentRequestUnitTest.java b/spring-core-5/src/test/java/com/baeldung/concurrentrequest/ConcurrentRequestUnitTest.java new file mode 100644 index 0000000000..76a0d764e1 --- /dev/null +++ b/spring-core-5/src/test/java/com/baeldung/concurrentrequest/ConcurrentRequestUnitTest.java @@ -0,0 +1,53 @@ +package com.baeldung.concurrentrequest; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultMatcher; + +@SpringBootTest +@AutoConfigureMockMvc +public class ConcurrentRequestUnitTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private ProductController controller; + + @Test + public void givenContextLoads_thenProductControllerIsAvailable() { + assertThat(controller).isNotNull(); + } + + @Test + public void givenMultipleCallsRunInParallel_thenAllCallsReturn200() throws Exception { + ExecutorService executor = Executors.newFixedThreadPool(2); + + executor.submit(() -> performCall("/product/1", status().isOk())); + executor.submit(() -> performCall("/product/2/stock", status().isOk())); + + if (!executor.awaitTermination(60, TimeUnit.SECONDS)) { + executor.shutdownNow(); + } + } + + private void performCall(String url, ResultMatcher expect) { + try { + this.mockMvc.perform(get(url)) + .andExpect(expect); + } catch (Exception e) { + throw new RuntimeException(e); + } + } +} From 2712a77d08e9b444471d8beafda7e1a7e664ffc0 Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Sat, 9 Apr 2022 12:01:45 +0100 Subject: [PATCH 016/278] [JAVA-11283] Fix and cleanup live test for HttpClient URL expansion --- httpclient-2/README.md | 2 +- .../HttpClientExpandUrlLiveTest.java} | 16 +++++----------- 2 files changed, 6 insertions(+), 12 deletions(-) rename httpclient-2/src/test/java/com/baeldung/httpclient/{rare/HttpClientUnshortenLiveTest.java => expandurl/HttpClientExpandUrlLiveTest.java} (91%) diff --git a/httpclient-2/README.md b/httpclient-2/README.md index 49adf470e9..695a92ce00 100644 --- a/httpclient-2/README.md +++ b/httpclient-2/README.md @@ -12,5 +12,5 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Reading an HTTP Response Body as a String in Java](https://www.baeldung.com/java-http-response-body-as-string) - [How To Get Cookies From the Apache HttpClient Response](https://www.baeldung.com/java-apache-httpclient-cookies) - [Enabling Logging for Apache HttpClient](https://www.baeldung.com/apache-httpclient-enable-logging) -- [Unshorten URLs with HttpClient](https://www.baeldung.com/unshorten-url-httpclient) +- [Expand Shortened URLs with Apache HttpClient](https://www.baeldung.com/unshorten-url-httpclient) - More articles: [[<-- prev]](../httpclient) diff --git a/httpclient-2/src/test/java/com/baeldung/httpclient/rare/HttpClientUnshortenLiveTest.java b/httpclient-2/src/test/java/com/baeldung/httpclient/expandurl/HttpClientExpandUrlLiveTest.java similarity index 91% rename from httpclient-2/src/test/java/com/baeldung/httpclient/rare/HttpClientUnshortenLiveTest.java rename to httpclient-2/src/test/java/com/baeldung/httpclient/expandurl/HttpClientExpandUrlLiveTest.java index efa7953ba8..fb3d730ec4 100644 --- a/httpclient-2/src/test/java/com/baeldung/httpclient/rare/HttpClientUnshortenLiveTest.java +++ b/httpclient-2/src/test/java/com/baeldung/httpclient/expandurl/HttpClientExpandUrlLiveTest.java @@ -1,4 +1,4 @@ -package com.baeldung.httpclient.rare; +package com.baeldung.httpclient.expandurl; import com.google.common.base.Preconditions; import com.google.common.collect.Lists; @@ -22,35 +22,29 @@ import java.util.List; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertThat; -public class HttpClientUnshortenLiveTest { +public class HttpClientExpandUrlLiveTest { private CloseableHttpClient client; - // fixtures - @Before public final void before() { client = HttpClientBuilder.create().disableRedirectHandling().build(); } - // tests - @Test - public final void givenShortenedOnce_whenUrlIsUnshortened_thenCorrectResult() throws IOException { + public final void givenShortenedOnce_whenUrlIsExpanded_thenCorrectResult() throws IOException { final String expectedResult = "http://www.baeldung.com/rest-versioning"; final String actualResult = expandSingleLevel("http://bit.ly/13jEoS1"); assertThat(actualResult, equalTo(expectedResult)); } @Test - public final void givenShortenedMultiple_whenUrlIsUnshortened_thenCorrectResult() throws IOException { - final String expectedResult = "http://www.baeldung.com/rest-versioning"; + public final void givenShortenedMultiple_whenUrlIsExpanded_thenCorrectResult() throws IOException { + final String expectedResult = "https://www.baeldung.com/rest-versioning"; final String actualResult = expand("http://t.co/e4rDDbnzmk"); assertThat(actualResult, equalTo(expectedResult)); } - // API - private String expand(final String urlArg) throws IOException { String originalUrl = urlArg; String newUrl = expandSingleLevel(originalUrl); From de994fdabd2f18051219f13d797583f51a2a38eb Mon Sep 17 00:00:00 2001 From: emanueltrandafir1993 Date: Sat, 9 Apr 2022 14:36:40 +0300 Subject: [PATCH 017/278] BAEL-4942: added tests for hibernate nullability check --- .../persistentobject/HibernateUtil.java | 47 ++++++++++++++ .../persistentobject/entity/Article.java | 29 +++++++++ .../persistentobject/entity/Author.java | 48 ++++++++++++++ .../persistentobject/entity/Book.java | 34 ++++++++++ .../HibernatePersistentObjectUnitTest.java | 65 +++++++++++++++++++ 5 files changed, 223 insertions(+) create mode 100644 persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/persistentobject/HibernateUtil.java create mode 100644 persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/persistentobject/entity/Article.java create mode 100644 persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/persistentobject/entity/Author.java create mode 100644 persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/persistentobject/entity/Book.java create mode 100644 persistence-modules/hibernate-exceptions/src/test/java/com/baeldung/hibernate/exception/persistentobject/HibernatePersistentObjectUnitTest.java diff --git a/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/persistentobject/HibernateUtil.java b/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/persistentobject/HibernateUtil.java new file mode 100644 index 0000000000..641b80b412 --- /dev/null +++ b/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/persistentobject/HibernateUtil.java @@ -0,0 +1,47 @@ +package com.baeldung.hibernate.exception.persistentobject; + +import java.util.Properties; + +import org.hibernate.SessionFactory; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.cfg.Configuration; +import org.hibernate.cfg.Environment; +import org.hibernate.service.ServiceRegistry; + +import com.baeldung.hibernate.exception.persistentobject.entity.Article; +import com.baeldung.hibernate.exception.persistentobject.entity.Author; +import com.baeldung.hibernate.exception.persistentobject.entity.Book; + +public class HibernateUtil { + private static SessionFactory sessionFactory; + + public static SessionFactory getSessionFactory() { + if (sessionFactory == null) { + try { + Configuration configuration = new Configuration(); + Properties settings = new Properties(); + + settings.put(Environment.DRIVER, "org.hsqldb.jdbcDriver"); + settings.put(Environment.URL, "jdbc:hsqldb:mem:userrole"); + settings.put(Environment.USER, "sa"); + settings.put(Environment.PASS, ""); + settings.put(Environment.DIALECT, "org.hibernate.dialect.HSQLDialect"); + settings.put(Environment.SHOW_SQL, "true"); + settings.put(Environment.HBM2DDL_AUTO, "update"); + settings.put(Environment.CHECK_NULLABILITY, "true"); + + configuration.setProperties(settings); + configuration.addAnnotatedClass(Book.class); + configuration.addAnnotatedClass(Author.class); + configuration.addAnnotatedClass(Article.class); + + ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() + .applySettings(configuration.getProperties()).build(); + sessionFactory = configuration.buildSessionFactory(serviceRegistry); + } catch (Exception e) { + e.printStackTrace(); + } + } + return sessionFactory; + } +} \ No newline at end of file diff --git a/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/persistentobject/entity/Article.java b/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/persistentobject/entity/Article.java new file mode 100644 index 0000000000..3c9c7c5b31 --- /dev/null +++ b/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/persistentobject/entity/Article.java @@ -0,0 +1,29 @@ +package com.baeldung.hibernate.exception.persistentobject.entity; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.ManyToOne; + +@Entity +public class Article { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + private String title; + + @ManyToOne(optional = false) + private Author author; + + public Article(String title) { + this.title = title; + } + + public void setAuthor(Author author) { + this.author = author; + } + +} diff --git a/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/persistentobject/entity/Author.java b/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/persistentobject/entity/Author.java new file mode 100644 index 0000000000..fa6aaa9abe --- /dev/null +++ b/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/persistentobject/entity/Author.java @@ -0,0 +1,48 @@ +package com.baeldung.hibernate.exception.persistentobject.entity; + +import java.util.List; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.OneToOne; + +import org.hibernate.annotations.Cascade; +import org.hibernate.annotations.CascadeType; + +@Entity +public class Author { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + private String name; + + @OneToMany + @Cascade(CascadeType.ALL) + private List
articles; + + public Author(String name) { + this.name = name; + } + + public Author() { + } + + public List
getArticles() { + return articles; + } + + public void setArticles(List
articles) { + this.articles = articles; + } + + public void addArticles(List
articles) { + this.articles = articles; + articles.forEach(article -> article.setAuthor(this)); + } + +} diff --git a/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/persistentobject/entity/Book.java b/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/persistentobject/entity/Book.java new file mode 100644 index 0000000000..342da27c77 --- /dev/null +++ b/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/persistentobject/entity/Book.java @@ -0,0 +1,34 @@ +package com.baeldung.hibernate.exception.persistentobject.entity; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; + +@Entity +public class Book { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + @Column(nullable = false) + private String title; + + public Book(String title) { + this.title = title; + } + + public Book() { + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } +} diff --git a/persistence-modules/hibernate-exceptions/src/test/java/com/baeldung/hibernate/exception/persistentobject/HibernatePersistentObjectUnitTest.java b/persistence-modules/hibernate-exceptions/src/test/java/com/baeldung/hibernate/exception/persistentobject/HibernatePersistentObjectUnitTest.java new file mode 100644 index 0000000000..09f11b07a2 --- /dev/null +++ b/persistence-modules/hibernate-exceptions/src/test/java/com/baeldung/hibernate/exception/persistentobject/HibernatePersistentObjectUnitTest.java @@ -0,0 +1,65 @@ +package com.baeldung.hibernate.exception.persistentobject; + +import static java.util.Arrays.asList; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import org.hibernate.PropertyValueException; +import org.hibernate.Session; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.hibernate.exception.persistentobject.entity.Article; +import com.baeldung.hibernate.exception.persistentobject.entity.Author; +import com.baeldung.hibernate.exception.persistentobject.entity.Book; + +public class HibernatePersistentObjectUnitTest { + + private static Session session; + + @Before + public void beforeAll() { + session = HibernateUtil.getSessionFactory() + .openSession(); + session.beginTransaction(); + } + + @After + public void afterAll() { + session.close(); + } + + @Test + public void whenSavingEntityWithNullMandatoryField_thenThrowPropertyValueException() { + Book book = new Book(); + + assertThatThrownBy(() -> session.save(book)).isInstanceOf(PropertyValueException.class) + .hasMessageContaining("not-null property references a null or transient value"); + } + + @Test + public void whenSavingEntityWithAllMandatoryField_thenDoNotThrowException() { + Book book = new Book(); + book.setTitle("Clean Code"); + + session.save(book); + } + + @Test + public void whenSavingBidirectionalEntitiesWithoutSettingParent_thenThrowPropertyValueException() { + Author author = new Author("John Doe"); + author.setArticles(asList(new Article("Java Tutorial"), new Article("What's New in JUnit5"))); + + assertThatThrownBy(() -> session.save(author)).isInstanceOf(PropertyValueException.class) + .hasMessageContaining("not-null property references a null or transient value"); + } + + @Test + public void whenSavingBidirectionalEntitiesWithCorrectParent_thenDoNotThrowException() { + Author author = new Author("John Doe"); + author.addArticles(asList(new Article("Java tutorial"), new Article("What's new in JUnit5"))); + + session.save(author); + } + +} \ No newline at end of file From bb09c8675db1eaecc61ceb5cd7b2efa785bf3363 Mon Sep 17 00:00:00 2001 From: Attila Uhrin Date: Sat, 9 Apr 2022 17:15:06 +0200 Subject: [PATCH 018/278] Add examples for Java HttpClient with Basic authentication. --- .../HttpClientBasicAuthentication.java | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 core-java-modules/core-java-11-2/src/main/java/com/baeldung/httpclient/basicauthentication/HttpClientBasicAuthentication.java diff --git a/core-java-modules/core-java-11-2/src/main/java/com/baeldung/httpclient/basicauthentication/HttpClientBasicAuthentication.java b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/httpclient/basicauthentication/HttpClientBasicAuthentication.java new file mode 100644 index 0000000000..3ade3bd553 --- /dev/null +++ b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/httpclient/basicauthentication/HttpClientBasicAuthentication.java @@ -0,0 +1,67 @@ +package com.baeldung.httpclient.basicauthentication; + +import java.io.IOException; +import java.net.Authenticator; +import java.net.PasswordAuthentication; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.net.http.HttpResponse.BodyHandlers; +import java.util.Base64; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class HttpClientBasicAuthentication { + + private static final Logger logger = LoggerFactory.getLogger(HttpClientBasicAuthentication.class); + + public static void main(String[] args) throws URISyntaxException, IOException, InterruptedException { + useClientWithAuthenticator(); + useClientWithHeaders(); + } + + private static void useClientWithAuthenticator() throws URISyntaxException, IOException, InterruptedException { + HttpClient client = HttpClient.newBuilder() + .authenticator(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication("postman", "password".toCharArray()); + } + }) + .build(); + + HttpRequest request = HttpRequest.newBuilder() + .GET() + .uri(new URI("https://postman-echo.com/basic-auth")) + .build(); + + HttpResponse response = client.send(request, BodyHandlers.ofString()); + + logger.info("Status using authenticator {}", response.statusCode()); + } + + private static void useClientWithHeaders() throws IOException, InterruptedException, URISyntaxException { + HttpClient client = HttpClient.newBuilder() + .build(); + + HttpRequest request = HttpRequest.newBuilder() + .GET() + .uri(new URI("https://postman-echo.com/basic-auth")) + .header("Authorization", getBasicAuthenticationHeader("postman", "password")) + .build(); + + HttpResponse response = client.send(request, BodyHandlers.ofString()); + + logger.info("Status using headers: {}", response.statusCode()); + } + + private static final String getBasicAuthenticationHeader(String username, String password) { + String valueToEncode = username + ":" + password; + return "Basic " + Base64.getEncoder() + .encodeToString(valueToEncode.getBytes()); + } + +} From ee1bc18e04f02349f71a40015d281d1caeed40fc Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Sun, 10 Apr 2022 04:02:29 +0200 Subject: [PATCH 019/278] filesize in humanreadable format (#12012) --- .../FileSizeFormatUtil.java | 81 +++++++++++++++++++ .../FileSizeFormatUtilUnitTest.java | 40 +++++++++ 2 files changed, 121 insertions(+) create mode 100644 java-numbers-4/src/main/java/com/baeldung/humanreadablebytes/FileSizeFormatUtil.java create mode 100644 java-numbers-4/src/test/java/com/baeldung/humanreadablebytes/FileSizeFormatUtilUnitTest.java diff --git a/java-numbers-4/src/main/java/com/baeldung/humanreadablebytes/FileSizeFormatUtil.java b/java-numbers-4/src/main/java/com/baeldung/humanreadablebytes/FileSizeFormatUtil.java new file mode 100644 index 0000000000..941aa105aa --- /dev/null +++ b/java-numbers-4/src/main/java/com/baeldung/humanreadablebytes/FileSizeFormatUtil.java @@ -0,0 +1,81 @@ +package com.baeldung.humanreadablebytes; + +import java.text.DecimalFormat; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class FileSizeFormatUtil { + private static final long BYTE = 1L; + private static final long KB = BYTE << 10; + private static final long MB = KB << 10; + private static final long GB = MB << 10; + private static final long TB = GB << 10; + private static final long PB = TB << 10; + private static final long EB = PB << 10; + private static final DecimalFormat DEC_FORMAT = new DecimalFormat("#.##"); + + public static String toHumanReadable(long size) { + if (size < 0) + throw new IllegalArgumentException("Invalid file size: " + size); + if (size >= EB) return formatSize(size, EB, "EB"); + if (size >= PB) return formatSize(size, PB, "PB"); + if (size >= TB) return formatSize(size, TB, "TB"); + if (size >= GB) return formatSize(size, GB, "GB"); + if (size >= MB) return formatSize(size, MB, "MB"); + if (size >= KB) return formatSize(size, KB, "KB"); + return formatSize(size, BYTE, "Bytes"); + } + + private static String formatSize(long size, long divider, String unitName) { + return DEC_FORMAT.format((double) size / divider) + " " + unitName; + } + + public static String toHumanReadableWithEnum(long size) { + final List units = SizeUnit.unitsInDescending(); + if (size < 0) + throw new IllegalArgumentException("Invalid file size: " + size); + String result = null; + for (SizeUnit unit : units) { + if (size >= unit.getUnitBase()) { + result = formatSize(size, unit.getUnitBase(), unit.name()); + break; + } + } + return result == null ? formatSize(size, SizeUnit.Bytes.getUnitBase(), SizeUnit.Bytes.name()) : result; + } + + public static String toHumanReadableByNumOfLeadingZeros(long size) { + if (size < 0) + throw new IllegalArgumentException("Invalid file size: " + size); + if (size < 1024) return size + " Bytes"; + int unitIdx = (63 - Long.numberOfLeadingZeros(size)) / 10; + return formatSize(size, 1L << (unitIdx * 10), " KMGTPE".charAt(unitIdx) + "B"); + } + + enum SizeUnit { + Bytes(1L), + KB(Bytes.unitBase << 10), + MB(KB.unitBase << 10), + GB(MB.unitBase << 10), + TB(GB.unitBase << 10), + PB(TB.unitBase << 10), + EB(PB.unitBase << 10); + + private final Long unitBase; + + public static List unitsInDescending() { + List list = Arrays.asList(values()); + Collections.reverse(list); + return list; + } + + public Long getUnitBase() { + return unitBase; + } + + SizeUnit(long unitBase) { + this.unitBase = unitBase; + } + } +} diff --git a/java-numbers-4/src/test/java/com/baeldung/humanreadablebytes/FileSizeFormatUtilUnitTest.java b/java-numbers-4/src/test/java/com/baeldung/humanreadablebytes/FileSizeFormatUtilUnitTest.java new file mode 100644 index 0000000000..4326e92e2f --- /dev/null +++ b/java-numbers-4/src/test/java/com/baeldung/humanreadablebytes/FileSizeFormatUtilUnitTest.java @@ -0,0 +1,40 @@ +package com.baeldung.humanreadablebytes; + +import org.apache.commons.io.FileUtils; +import org.junit.Assert; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + +public class FileSizeFormatUtilUnitTest { + private final static Map DATA_MAP = new HashMap() {{ + put(0L, "0 Bytes"); + put(1023L, "1023 Bytes"); + put(1024L, "1 KB"); + put(12_345L, "12.06 KB"); + put(10_123_456L, "9.65 MB"); + put(10_123_456_798L, "9.43 GB"); + put(1_777_777_777_777_777_777L, "1.54 EB"); + }}; + + @Test + public void givenBytes_whenCalltoHumanReadableMethod_thenGetExpectedResults() { + DATA_MAP.forEach((in, expected) -> Assert.assertEquals(expected, FileSizeFormatUtil.toHumanReadable(in))); + } + + @Test + public void givenBytes_whenCalltoHumanReadableWithEnumMethod_thenGetExpectedResults() { + DATA_MAP.forEach((in, expected) -> Assert.assertEquals(expected, FileSizeFormatUtil.toHumanReadableWithEnum(in))); + } + + @Test + public void givenBytes_whenCalltoHumanReadableByLeadingZeros_thenGetExpectedResults() { + DATA_MAP.forEach((in, expected) -> Assert.assertEquals(expected, FileSizeFormatUtil.toHumanReadableByNumOfLeadingZeros(in))); + } + + @Test + public void givenBytes_whenCalltoHumanReadableByFileUtils_thenOutputExpectedResults() { + DATA_MAP.forEach((in, expected) -> System.out.println(in + " bytes -> " + FileUtils.byteCountToDisplaySize(in))); + } +} From ca824c47d96701dc95290c9a11cffc2a6694c9a7 Mon Sep 17 00:00:00 2001 From: Daniel Strmecki Date: Sun, 10 Apr 2022 04:12:31 +0200 Subject: [PATCH 020/278] Feature/bael 5393 closable http client (#12009) * BAEL-5393: Inital commit * BAEL-5393: Update tests * BAEL-5393: Revert comment --- httpclient-2/pom.xml | 20 ++++- .../httpclient/ApacheHttpClientUnitTest.java | 78 +++++++++++++++++++ .../httpclient/GetRequestMockServer.java | 78 +++++++++++++++++++ 3 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 httpclient-2/src/test/java/com/baeldung/httpclient/httpclient/ApacheHttpClientUnitTest.java create mode 100644 httpclient-2/src/test/java/com/baeldung/httpclient/httpclient/GetRequestMockServer.java diff --git a/httpclient-2/pom.xml b/httpclient-2/pom.xml index 32f2e80b18..f2da238494 100644 --- a/httpclient-2/pom.xml +++ b/httpclient-2/pom.xml @@ -55,6 +55,22 @@ spring-boot-starter-webflux ${spring-boot.version} + + org.mock-server + mockserver-netty + ${mockserver.version} + + + org.mock-server + mockserver-client-java + ${mockserver.version} + + + org.assertj + assertj-core + ${assertj.version} + test + @@ -79,8 +95,10 @@ + 3.22.0 + 5.11.2 4.5.8 - 5.1 + 5.1.3 11 11 2.1.7.RELEASE diff --git a/httpclient-2/src/test/java/com/baeldung/httpclient/httpclient/ApacheHttpClientUnitTest.java b/httpclient-2/src/test/java/com/baeldung/httpclient/httpclient/ApacheHttpClientUnitTest.java new file mode 100644 index 0000000000..0d45eedc12 --- /dev/null +++ b/httpclient-2/src/test/java/com/baeldung/httpclient/httpclient/ApacheHttpClientUnitTest.java @@ -0,0 +1,78 @@ +package com.baeldung.httpclient.httpclient; + +import org.apache.hc.client5.http.classic.HttpClient; +import org.apache.hc.client5.http.classic.methods.HttpGet; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; +import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; +import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.core5.http.HttpEntity; +import org.apache.hc.core5.http.HttpResponse; +import org.apache.hc.core5.http.HttpStatus; +import org.apache.hc.core5.http.io.entity.EntityUtils; +import org.junit.jupiter.api.Test; + +import java.io.IOException; + +import static org.assertj.core.api.Assertions.assertThat; + +class ApacheHttpClientUnitTest extends GetRequestMockServer { + + @Test + void givenDeveloperUsedHttpClient_whenExecutingGetRequest_thenStatusIsOkButSonarReportsAnIssue() throws IOException { + HttpClient httpClient = HttpClients.createDefault(); + HttpGet httpGet = new HttpGet(serviceOneUrl); + HttpResponse response = httpClient.execute(httpGet); + assertThat(response.getCode()).isEqualTo(HttpStatus.SC_OK); + } + + @Test + void givenDeveloperUsedCloseableHttpClient_whenExecutingGetRequest_thenStatusIsOk() throws IOException { + try (CloseableHttpClient httpClient = HttpClients.createDefault()) { + HttpGet httpGet = new HttpGet(serviceOneUrl); + HttpResponse response = httpClient.execute(httpGet); + assertThat(response.getCode()).isEqualTo(HttpStatus.SC_OK); + } + } + + @Test + void givenDeveloperUsedHttpClientBuilder_whenExecutingGetRequest_thenStatusIsOk() throws IOException { + try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) { + HttpGet httpGet = new HttpGet(serviceOneUrl); + HttpResponse response = httpClient.execute(httpGet); + assertThat(response.getCode()).isEqualTo(HttpStatus.SC_OK); + } + } + + @Test + void givenDeveloperUsedCloseableHttpResponse_whenExecutingGetRequest_thenStatusIsOk() throws IOException { + try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) { + HttpGet httpGet = new HttpGet(serviceOneUrl); + try (CloseableHttpResponse response = httpClient.execute(httpGet)) { + HttpEntity entity = response.getEntity(); + EntityUtils.consume(entity); + assertThat(response.getCode()).isEqualTo(HttpStatus.SC_OK); + } + } + } + + @Test + void givenDeveloperUsedSingleClient_whenExecutingTwoGetRequest_thenStatusIsOk() throws IOException { + try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) { + HttpGet httpGetOne = new HttpGet(serviceOneUrl); + try (CloseableHttpResponse responseOne = httpClient.execute(httpGetOne)) { + HttpEntity entityOne = responseOne.getEntity(); + EntityUtils.consume(entityOne); + assertThat(responseOne.getCode()).isEqualTo(HttpStatus.SC_OK); + } + + HttpGet httpGetTwo = new HttpGet(serviceTwoUrl); + try (CloseableHttpResponse responseTwo = httpClient.execute(httpGetTwo)) { + HttpEntity entityTwo = responseTwo.getEntity(); + EntityUtils.consume(entityTwo); + assertThat(responseTwo.getCode()).isEqualTo(HttpStatus.SC_OK); + } + } + } + +} diff --git a/httpclient-2/src/test/java/com/baeldung/httpclient/httpclient/GetRequestMockServer.java b/httpclient-2/src/test/java/com/baeldung/httpclient/httpclient/GetRequestMockServer.java new file mode 100644 index 0000000000..2c08cfa6e4 --- /dev/null +++ b/httpclient-2/src/test/java/com/baeldung/httpclient/httpclient/GetRequestMockServer.java @@ -0,0 +1,78 @@ +package com.baeldung.httpclient.httpclient; + +import org.apache.hc.core5.http.HttpStatus; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.mockserver.client.MockServerClient; +import org.mockserver.integration.ClientAndServer; + +import java.io.IOException; +import java.net.ServerSocket; +import java.net.URISyntaxException; + +import static org.mockserver.integration.ClientAndServer.startClientAndServer; +import static org.mockserver.matchers.Times.exactly; +import static org.mockserver.model.HttpRequest.request; +import static org.mockserver.model.HttpResponse.response; + +public class GetRequestMockServer { + + public static ClientAndServer mockServer; + public static String serviceOneUrl; + public static String serviceTwoUrl; + + private static int serverPort; + + public static final String SERVER_ADDRESS = "127.0.0.1"; + public static final String PATH_ONE = "/test1"; + public static final String PATH_TWO = "/test2"; + public static final String METHOD = "GET"; + + @BeforeAll + static void startServer() throws IOException, URISyntaxException { + serverPort = getFreePort(); + serviceOneUrl = "http://" + SERVER_ADDRESS + ":" + serverPort + PATH_ONE; + serviceTwoUrl = "http://" + SERVER_ADDRESS + ":" + serverPort + PATH_TWO; + mockServer = startClientAndServer(serverPort); + mockGetRequest(); + } + + @AfterAll + static void stopServer() { + mockServer.stop(); + } + + private static void mockGetRequest() { + new MockServerClient(SERVER_ADDRESS, serverPort) + .when( + request() + .withPath(PATH_ONE) + .withMethod(METHOD), + exactly(5) + ) + .respond( + response() + .withStatusCode(HttpStatus.SC_OK) + .withBody("{\"status\":\"ok\"}") + ); + new MockServerClient(SERVER_ADDRESS, serverPort) + .when( + request() + .withPath(PATH_TWO) + .withMethod(METHOD), + exactly(1) + ) + .respond( + response() + .withStatusCode(HttpStatus.SC_OK) + .withBody("{\"status\":\"ok\"}") + ); + } + + private static int getFreePort () throws IOException { + try (ServerSocket serverSocket = new ServerSocket(0)) { + return serverSocket.getLocalPort(); + } + } + +} From d0e3eebb12492f960980d97575159eaa5618f35e Mon Sep 17 00:00:00 2001 From: lucaCambi77 Date: Sun, 10 Apr 2022 16:19:13 +0200 Subject: [PATCH 021/278] BAEL-5400 - Return Only Specific Fields for a Query in Spring Data MongoDB (#11991) * feat: field projection spring data mongodb * fix: use available ports * fix: typo * fix: add abstraction * fix: avoid blank lines --- .../baeldung/projection/model/InStock.java | 46 ++++ .../baeldung/projection/model/Inventory.java | 70 ++++++ .../com/baeldung/projection/model/Size.java | 56 +++++ .../repository/InventoryRepository.java | 33 +++ .../com/baeldung/logging/LoggingUnitTest.java | 3 +- .../projection/AbstractTestProjection.java | 88 +++++++ .../MongoTemplateProjectionUnitTest.java | 216 ++++++++++++++++++ .../RepositoryProjectionUnitTest.java | 175 ++++++++++++++ 8 files changed, 686 insertions(+), 1 deletion(-) create mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/projection/model/InStock.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/projection/model/Inventory.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/projection/model/Size.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/projection/repository/InventoryRepository.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/projection/AbstractTestProjection.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/projection/MongoTemplateProjectionUnitTest.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/projection/RepositoryProjectionUnitTest.java diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/projection/model/InStock.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/projection/model/InStock.java new file mode 100644 index 0000000000..6f57808ab0 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/projection/model/InStock.java @@ -0,0 +1,46 @@ +package com.baeldung.projection.model; + +import java.util.Objects; + +public class InStock { + + private String wareHouse; + private Integer quantity; + + public InStock(String wareHouse, int quantity) { + this.wareHouse = wareHouse; + this.quantity = quantity; + } + + public String getWareHouse() { + return wareHouse; + } + + public void setWareHouse(String wareHouse) { + this.wareHouse = wareHouse; + } + + public Integer getQuantity() { + return quantity; + } + + public void setQuantity(Integer quantity) { + this.quantity = quantity; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + InStock inStock = (InStock) o; + return Objects.equals(wareHouse, inStock.wareHouse) && Objects.equals(quantity, inStock.quantity); + } + + @Override + public int hashCode() { + return Objects.hash(wareHouse, quantity); + } + +} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/projection/model/Inventory.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/projection/model/Inventory.java new file mode 100644 index 0000000000..28e6607dc9 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/projection/model/Inventory.java @@ -0,0 +1,70 @@ +package com.baeldung.projection.model; + +import java.util.List; +import java.util.Objects; + +import org.springframework.data.mongodb.core.mapping.Document; +import org.springframework.data.mongodb.core.mapping.MongoId; + +@Document(collection = "inventory") +public class Inventory { + + @MongoId + private String id; + private String item; + private String status; + private Size size; + private List inStock; + + public String getId() { + return id; + } + + public String getItem() { + return item; + } + + public void setItem(String item) { + this.item = item; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public Size getSize() { + return size; + } + + public void setSize(Size size) { + this.size = size; + } + + public List getInStock() { + return inStock; + } + + public void setInStock(List inStock) { + this.inStock = inStock; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + Inventory inventory = (Inventory) o; + return Objects.equals(id, inventory.id) && Objects.equals(item, inventory.item) && Objects.equals(status, inventory.status); + } + + @Override + public int hashCode() { + return Objects.hash(id, item, status); + } + +} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/projection/model/Size.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/projection/model/Size.java new file mode 100644 index 0000000000..54af8f09f7 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/projection/model/Size.java @@ -0,0 +1,56 @@ +package com.baeldung.projection.model; + +import java.util.Objects; + +public class Size { + + private Double height; + private Double width; + private String uom; + + public Size(Double height, Double width, String uom) { + this.height = height; + this.width = width; + this.uom = uom; + } + + public Double getHeight() { + return height; + } + + public void setHeight(Double height) { + this.height = height; + } + + public Double getWidth() { + return width; + } + + public void setWidth(Double width) { + this.width = width; + } + + public String getUom() { + return uom; + } + + public void setUom(String uom) { + this.uom = uom; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + Size size = (Size) o; + return Objects.equals(height, size.height) && Objects.equals(width, size.width) && Objects.equals(uom, size.uom); + } + + @Override + public int hashCode() { + return Objects.hash(height, width, uom); + } + +} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/projection/repository/InventoryRepository.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/projection/repository/InventoryRepository.java new file mode 100644 index 0000000000..66b4ef02d5 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/projection/repository/InventoryRepository.java @@ -0,0 +1,33 @@ +package com.baeldung.projection.repository; + +import java.util.List; + +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.data.mongodb.repository.Query; + +import com.baeldung.projection.model.Inventory; + +public interface InventoryRepository extends MongoRepository { + + @Query(value = "{ 'status' : ?0 }", fields = "{ 'item' : 1, 'status' : 1 }") + List findByStatusIncludeItemAndStatusFields(String status); + + @Query(value = "{ 'status' : ?0 }", fields = "{ 'item' : 1, 'status' : 1, '_id' : 0 }") + List findByStatusIncludeItemAndStatusExcludeIdFields(String status); + + @Query(value = "{ 'status' : ?0 }", fields = "{ 'status' : 0, 'inStock' : 0 }") + List findByStatusIncludeAllButStatusAndStockFields(String status); + + @Query(value = "{ 'status' : ?0 }", fields = "{ 'item' : 1, 'status' : 1, 'size.uom': 1 }") + List findByStatusIncludeEmbeddedFields(String status); + + @Query(value = "{ 'status' : ?0 }", fields = "{ 'size.uom': 0 }") + List findByStatusExcludeEmbeddedFields(String status); + + @Query(value = "{ 'status' : ?0 }", fields = "{ 'item' : 1, 'status' : 1, 'inStock.quantity': 1 }") + List findByStatusIncludeEmbeddedFieldsInArray(String status); + + @Query(value = "{ 'status' : ?0 }", fields = "{ 'item' : 1, 'status' : 1, 'inStock': { $slice: -1 } }") + List findByStatusIncludeEmbeddedFieldsLastElementInArray(String status); + +} \ No newline at end of file diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/logging/LoggingUnitTest.java b/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/logging/LoggingUnitTest.java index 577e039176..1c59dcb5ac 100644 --- a/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/logging/LoggingUnitTest.java +++ b/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/logging/LoggingUnitTest.java @@ -21,6 +21,7 @@ import org.springframework.data.mongodb.core.aggregation.Aggregation; import org.springframework.data.mongodb.core.aggregation.AggregationResults; import org.springframework.data.mongodb.core.aggregation.GroupOperation; import org.springframework.test.context.TestPropertySource; +import org.springframework.util.SocketUtils; import com.baeldung.logging.model.Book; import com.mongodb.client.MongoClients; @@ -50,7 +51,7 @@ public class LoggingUnitTest { @BeforeEach void setup() throws Exception { String ip = "localhost"; - int port = 27017; + int port = SocketUtils.findAvailableTcpPort(); ImmutableMongodConfig mongodConfig = MongodConfig.builder() .version(Version.Main.PRODUCTION) diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/projection/AbstractTestProjection.java b/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/projection/AbstractTestProjection.java new file mode 100644 index 0000000000..c86d8c170e --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/projection/AbstractTestProjection.java @@ -0,0 +1,88 @@ +package com.baeldung.projection; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import org.junit.jupiter.api.AfterEach; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.util.SocketUtils; + +import com.baeldung.projection.model.InStock; +import com.baeldung.projection.model.Inventory; +import com.baeldung.projection.model.Size; +import com.mongodb.client.MongoClients; + +import de.flapdoodle.embed.mongo.MongodExecutable; +import de.flapdoodle.embed.mongo.MongodStarter; +import de.flapdoodle.embed.mongo.config.ImmutableMongodConfig; +import de.flapdoodle.embed.mongo.config.MongodConfig; +import de.flapdoodle.embed.mongo.config.Net; +import de.flapdoodle.embed.mongo.distribution.Version; +import de.flapdoodle.embed.process.runtime.Network; + +abstract class AbstractTestProjection { + + private static final String CONNECTION_STRING = "mongodb://%s:%d"; + + protected MongodExecutable mongodExecutable; + protected MongoTemplate mongoTemplate; + + @AfterEach + void clean() { + mongodExecutable.stop(); + } + + void setUp() throws IOException { + String ip = "localhost"; + int port = SocketUtils.findAvailableTcpPort(); + + ImmutableMongodConfig mongodbConfig = MongodConfig.builder() + .version(Version.Main.PRODUCTION) + .net(new Net(ip, port, Network.localhostIsIPv6())) + .build(); + + MongodStarter starter = MongodStarter.getDefaultInstance(); + mongodExecutable = starter.prepare(mongodbConfig); + mongodExecutable.start(); + mongoTemplate = new MongoTemplate(MongoClients.create(String.format(CONNECTION_STRING, ip, port)), "test"); + } + + public List getInventories() { + Inventory journal = new Inventory(); + journal.setItem("journal"); + journal.setStatus("A"); + journal.setSize(new Size(14.0, 21.0, "cm")); + journal.setInStock(Collections.singletonList(new InStock("A", 5))); + + Inventory notebook = new Inventory(); + notebook.setItem("notebook"); + notebook.setStatus("A"); + notebook.setSize(new Size(8.5, 11.0, "in")); + notebook.setInStock(Collections.singletonList(new InStock("C", 5))); + + Inventory paper = new Inventory(); + paper.setItem("paper"); + paper.setStatus("D"); + paper.setSize(new Size(8.5, 11.0, "in")); + paper.setInStock(Collections.singletonList(new InStock("A", 60))); + + return Arrays.asList(journal, notebook, paper); + } + + abstract void whenIncludeFields_thenOnlyIncludedFieldsAreNotNull(); + + abstract void whenIncludeFieldsAndExcludeOtherFields_thenOnlyExcludedFieldsAreNull(); + + abstract void whenIncludeAllButExcludeSomeFields_thenOnlyExcludedFieldsAreNull(); + + abstract void whenIncludeEmbeddedFields_thenEmbeddedFieldsAreNotNull(); + + abstract void whenExcludeEmbeddedFields_thenEmbeddedFieldsAreNull(); + + abstract void whenIncludeEmbeddedFieldsInArray_thenEmbeddedFieldsInArrayAreNotNull(); + + abstract void whenIncludeEmbeddedFieldsSliceInArray_thenArrayLengthEqualToSlice(); + +} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/projection/MongoTemplateProjectionUnitTest.java b/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/projection/MongoTemplateProjectionUnitTest.java new file mode 100644 index 0000000000..a174b73f2c --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/projection/MongoTemplateProjectionUnitTest.java @@ -0,0 +1,216 @@ +package com.baeldung.projection; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.Arrays; +import java.util.List; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.mongodb.core.query.Query; + +import com.baeldung.projection.model.InStock; +import com.baeldung.projection.model.Inventory; +import com.baeldung.projection.model.Size; + +@SpringBootTest +public class MongoTemplateProjectionUnitTest extends AbstractTestProjection { + + @BeforeEach + void setup() throws Exception { + super.setUp(); + + List inventoryList = getInventories(); + + mongoTemplate.insert(inventoryList, Inventory.class); + } + + @Test + void whenIncludeFields_thenOnlyIncludedFieldsAreNotNull() { + Query query = new Query(); + query.fields() + .include("item") + .include("status"); + + List inventoryList = mongoTemplate.find(query, Inventory.class); + + assertTrue(inventoryList.size() > 0); + + inventoryList.forEach(i -> { + assertNotNull(i.getId()); + assertNotNull(i.getItem()); + assertNotNull(i.getStatus()); + assertNull(i.getSize()); + assertNull(i.getInStock()); + }); + } + + @Test + void whenIncludeFieldsAndExcludeOtherFields_thenOnlyExcludedFieldsAreNull() { + Query query = new Query(); + query.fields() + .include("item") + .include("status") + .exclude("_id"); + + List inventoryList = mongoTemplate.find(query, Inventory.class); + + assertTrue(inventoryList.size() > 0); + + inventoryList.forEach(i -> { + assertNotNull(i.getItem()); + assertNotNull(i.getStatus()); + assertNull(i.getId()); + assertNull(i.getSize()); + assertNull(i.getInStock()); + }); + } + + @Test + void whenIncludeAllButExcludeSomeFields_thenOnlyExcludedFieldsAreNull() { + Query query = new Query(); + query.fields() + .exclude("status") + .exclude("inStock"); + + List inventoryList = mongoTemplate.find(query, Inventory.class); + + assertTrue(inventoryList.size() > 0); + + inventoryList.forEach(i -> { + assertNotNull(i.getItem()); + assertNotNull(i.getId()); + assertNotNull(i.getSize()); + assertNull(i.getInStock()); + assertNull(i.getStatus()); + }); + } + + @Test + void whenIncludeEmbeddedFields_thenEmbeddedFieldsAreNotNull() { + Query query = new Query(); + query.fields() + .include("item") + .include("status") + .include("size.uom"); + + List inventoryList = mongoTemplate.find(query, Inventory.class); + + assertTrue(inventoryList.size() > 0); + + inventoryList.forEach(i -> { + assertNotNull(i.getItem()); + assertNotNull(i.getStatus()); + assertNotNull(i.getId()); + assertNotNull(i.getSize()); + assertNotNull(i.getSize() + .getUom()); + assertNull(i.getSize() + .getHeight()); + assertNull(i.getSize() + .getWidth()); + assertNull(i.getInStock()); + }); + } + + @Test + void whenExcludeEmbeddedFields_thenEmbeddedFieldsAreNull() { + Query query = new Query(); + query.fields() + .exclude("size.uom"); + + List inventoryList = mongoTemplate.find(query, Inventory.class); + + assertTrue(inventoryList.size() > 0); + + inventoryList.forEach(i -> { + assertNotNull(i.getItem()); + assertNotNull(i.getStatus()); + assertNotNull(i.getId()); + assertNotNull(i.getSize()); + assertNull(i.getSize() + .getUom()); + assertNotNull(i.getSize() + .getHeight()); + assertNotNull(i.getSize() + .getWidth()); + assertNotNull(i.getInStock()); + }); + } + + @Test + void whenIncludeEmbeddedFieldsInArray_thenEmbeddedFieldsInArrayAreNotNull() { + Query query = new Query(); + query.fields() + .include("item") + .include("status") + .include("inStock.quantity"); + + List inventoryList = mongoTemplate.find(query, Inventory.class); + + assertTrue(inventoryList.size() > 0); + + inventoryList.forEach(i -> { + assertNotNull(i.getItem()); + assertNotNull(i.getStatus()); + assertNotNull(i.getId()); + assertNotNull(i.getInStock()); + i.getInStock() + .forEach(stock -> { + assertNull(stock.getWareHouse()); + assertNotNull(stock.getQuantity()); + }); + assertNull(i.getSize()); + }); + } + + @Test + void whenIncludeEmbeddedFieldsSliceInArray_thenArrayLengthEqualToSlice() { + Inventory postcard = new Inventory(); + postcard.setItem("postcard"); + postcard.setStatus("A"); + postcard.setSize(new Size(10.0, 15.25, "cm")); + + InStock firstInStock = new InStock("B", 15); + InStock lastInStock = new InStock("C", 35); + + postcard.setInStock(Arrays.asList(firstInStock, lastInStock)); + + mongoTemplate.save(postcard); + + Query query = new Query(); + query.fields() + .include("item") + .include("status") + .slice("inStock", -1); + + List inventoryList = mongoTemplate.find(query, Inventory.class); + + assertTrue(inventoryList.size() > 0); + + inventoryList.forEach(i -> { + assertNotNull(i.getItem()); + assertNotNull(i.getStatus()); + assertNotNull(i.getId()); + assertNotNull(i.getInStock()); + assertEquals(1, i.getInStock() + .size()); + assertNull(i.getSize()); + }); + + InStock stock = inventoryList.stream() + .filter(i -> i.getItem() + .equals("postcard")) + .map(i -> i.getInStock() + .get(0)) + .findFirst() + .orElse(null); + + assertEquals(lastInStock, stock); + } + +} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/projection/RepositoryProjectionUnitTest.java b/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/projection/RepositoryProjectionUnitTest.java new file mode 100644 index 0000000000..6b0fa7f7fd --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/projection/RepositoryProjectionUnitTest.java @@ -0,0 +1,175 @@ +package com.baeldung.projection; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.Arrays; +import java.util.List; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import com.baeldung.projection.model.InStock; +import com.baeldung.projection.model.Inventory; +import com.baeldung.projection.model.Size; +import com.baeldung.projection.repository.InventoryRepository; + +@SpringBootTest +public class RepositoryProjectionUnitTest extends AbstractTestProjection { + + @Autowired + private InventoryRepository inventoryRepository; + + @BeforeEach + void setup() throws Exception { + super.setUp(); + + List inventoryList = getInventories(); + + inventoryRepository.saveAll(inventoryList); + } + + @Test + void whenIncludeFields_thenOnlyIncludedFieldsAreNotNull() { + List inventoryList = inventoryRepository.findByStatusIncludeItemAndStatusFields("A"); + assertTrue(inventoryList.size() > 0); + + inventoryList.forEach(i -> { + assertNotNull(i.getId()); + assertNotNull(i.getItem()); + assertNotNull(i.getStatus()); + assertNull(i.getSize()); + assertNull(i.getInStock()); + }); + } + + @Test + void whenIncludeFieldsAndExcludeOtherFields_thenOnlyExcludedFieldsAreNull() { + List inventoryList = inventoryRepository.findByStatusIncludeItemAndStatusExcludeIdFields("A"); + assertTrue(inventoryList.size() > 0); + + inventoryList.forEach(i -> { + assertNotNull(i.getItem()); + assertNotNull(i.getStatus()); + assertNull(i.getId()); + assertNull(i.getSize()); + assertNull(i.getInStock()); + }); + } + + @Test + void whenIncludeAllButExcludeSomeFields_thenOnlyExcludedFieldsAreNull() { + List inventoryList = inventoryRepository.findByStatusIncludeAllButStatusAndStockFields("A"); + assertTrue(inventoryList.size() > 0); + + inventoryList.forEach(i -> { + assertNotNull(i.getItem()); + assertNotNull(i.getId()); + assertNotNull(i.getSize()); + assertNull(i.getInStock()); + assertNull(i.getStatus()); + }); + } + + @Test + void whenIncludeEmbeddedFields_thenEmbeddedFieldsAreNotNull() { + List inventoryList = inventoryRepository.findByStatusIncludeEmbeddedFields("A"); + assertTrue(inventoryList.size() > 0); + + inventoryList.forEach(i -> { + assertNotNull(i.getItem()); + assertNotNull(i.getStatus()); + assertNotNull(i.getId()); + assertNotNull(i.getSize()); + assertNotNull(i.getSize() + .getUom()); + assertNull(i.getSize() + .getHeight()); + assertNull(i.getSize() + .getWidth()); + assertNull(i.getInStock()); + }); + } + + @Test + void whenExcludeEmbeddedFields_thenEmbeddedFieldsAreNull() { + List inventoryList = inventoryRepository.findByStatusExcludeEmbeddedFields("A"); + assertTrue(inventoryList.size() > 0); + + inventoryList.forEach(i -> { + assertNotNull(i.getItem()); + assertNotNull(i.getStatus()); + assertNotNull(i.getId()); + assertNotNull(i.getSize()); + assertNull(i.getSize() + .getUom()); + assertNotNull(i.getSize() + .getHeight()); + assertNotNull(i.getSize() + .getWidth()); + assertNotNull(i.getInStock()); + }); + } + + @Test + void whenIncludeEmbeddedFieldsInArray_thenEmbeddedFieldsInArrayAreNotNull() { + List inventoryList = inventoryRepository.findByStatusIncludeEmbeddedFieldsInArray("A"); + assertTrue(inventoryList.size() > 0); + + inventoryList.forEach(i -> { + assertNotNull(i.getItem()); + assertNotNull(i.getStatus()); + assertNotNull(i.getId()); + assertNotNull(i.getInStock()); + i.getInStock() + .forEach(stock -> { + assertNull(stock.getWareHouse()); + assertNotNull(stock.getQuantity()); + }); + assertNull(i.getSize()); + }); + } + + @Test + void whenIncludeEmbeddedFieldsSliceInArray_thenArrayLengthEqualToSlice() { + Inventory postcard = new Inventory(); + postcard.setItem("postcard"); + postcard.setStatus("A"); + postcard.setSize(new Size(10.0, 15.25, "cm")); + + InStock firstInStock = new InStock("B", 15); + InStock lastInStock = new InStock("C", 35); + + postcard.setInStock(Arrays.asList(firstInStock, lastInStock)); + + inventoryRepository.save(postcard); + + List inventoryList = inventoryRepository.findByStatusIncludeEmbeddedFieldsLastElementInArray("A"); + assertTrue(inventoryList.size() > 0); + + inventoryList.forEach(i -> { + assertNotNull(i.getItem()); + assertNotNull(i.getStatus()); + assertNotNull(i.getId()); + assertNotNull(i.getInStock()); + assertEquals(1, i.getInStock() + .size()); + assertNull(i.getSize()); + }); + + InStock stock = inventoryList.stream() + .filter(i -> i.getItem() + .equals("postcard")) + .map(i -> i.getInStock() + .get(0)) + .findFirst() + .orElse(null); + + assertEquals(lastInStock, stock); + } + +} From 891e044e4ae63524456165a52efc7db5c2407cd5 Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Sun, 10 Apr 2022 17:39:01 -0300 Subject: [PATCH 022/278] BAEL-5157 - Exception Handling with Jersey First draft: https://drafts.baeldung.com/wp-admin/post.php?post=131880&action=edit --- .../ExceptionHandlingConfig.java | 19 ++++ .../jersey/exceptionhandling/data/Stock.java | 33 +++++++ .../jersey/exceptionhandling/data/Wallet.java | 51 ++++++++++ .../jersey/exceptionhandling/repo/Db.java | 32 ++++++ .../exceptionhandling/repo/Identifiable.java | 17 ++++ .../rest/StocksResource.java | 42 ++++++++ .../rest/WalletsResource.java | 98 ++++++++++++++++++ .../IllegalArgumentExceptionMapper.java | 23 +++++ .../exceptions/InvalidTradeException.java | 17 ++++ .../rest/exceptions/RestErrorResponse.java | 34 +++++++ .../exceptions/ServerExceptionMapper.java | 35 +++++++ .../exceptionhandling/service/Repository.java | 10 ++ .../rest/StocksResourceIntegrationTest.java | 99 +++++++++++++++++++ 13 files changed, 510 insertions(+) create mode 100644 jersey/src/main/java/com/baeldung/jersey/exceptionhandling/ExceptionHandlingConfig.java create mode 100644 jersey/src/main/java/com/baeldung/jersey/exceptionhandling/data/Stock.java create mode 100644 jersey/src/main/java/com/baeldung/jersey/exceptionhandling/data/Wallet.java create mode 100644 jersey/src/main/java/com/baeldung/jersey/exceptionhandling/repo/Db.java create mode 100644 jersey/src/main/java/com/baeldung/jersey/exceptionhandling/repo/Identifiable.java create mode 100644 jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/StocksResource.java create mode 100644 jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/WalletsResource.java create mode 100644 jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/IllegalArgumentExceptionMapper.java create mode 100644 jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/InvalidTradeException.java create mode 100644 jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/RestErrorResponse.java create mode 100644 jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/ServerExceptionMapper.java create mode 100644 jersey/src/main/java/com/baeldung/jersey/exceptionhandling/service/Repository.java create mode 100644 jersey/src/test/java/com/baeldung/jersey/exceptionhandling/rest/StocksResourceIntegrationTest.java diff --git a/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/ExceptionHandlingConfig.java b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/ExceptionHandlingConfig.java new file mode 100644 index 0000000000..d4cc1a81a1 --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/ExceptionHandlingConfig.java @@ -0,0 +1,19 @@ +package com.baeldung.jersey.exceptionhandling; + +import javax.ws.rs.ApplicationPath; + +import org.glassfish.jersey.server.ResourceConfig; + +import com.baeldung.jersey.exceptionhandling.rest.exceptions.IllegalArgumentExceptionMapper; +import com.baeldung.jersey.exceptionhandling.rest.exceptions.ServerExceptionMapper; + +@ApplicationPath("/exception-handling/*") +public class ExceptionHandlingConfig extends ResourceConfig { + + public ExceptionHandlingConfig() { + packages("com.baeldung.jersey.exceptionhandling.rest"); + register(IllegalArgumentExceptionMapper.class); + register(ServerExceptionMapper.class); + } + +} diff --git a/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/data/Stock.java b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/data/Stock.java new file mode 100644 index 0000000000..9a3f321651 --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/data/Stock.java @@ -0,0 +1,33 @@ +package com.baeldung.jersey.exceptionhandling.data; + +import com.baeldung.jersey.exceptionhandling.repo.Identifiable; + +public class Stock implements Identifiable { + private static final long serialVersionUID = 1L; + private String id; + private Double price; + + public Stock() { + } + + public Stock(String id, Double price) { + this.id = id; + this.price = price; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Double getPrice() { + return price; + } + + public void setPrice(Double price) { + this.price = price; + } +} diff --git a/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/data/Wallet.java b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/data/Wallet.java new file mode 100644 index 0000000000..8ef47b4c99 --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/data/Wallet.java @@ -0,0 +1,51 @@ +package com.baeldung.jersey.exceptionhandling.data; + +import com.baeldung.jersey.exceptionhandling.repo.Identifiable; + +public class Wallet implements Identifiable { + private static final long serialVersionUID = 1L; + + public static final Double MIN_CHARGE = 50.0; + public static final String MIN_CHARGE_MSG = "minimum charge is: " + MIN_CHARGE; + + private String id; + private Double balance = 0.0; + + public Wallet() { + } + + public Wallet(String id) { + this.id = id; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Double getBalance() { + return balance; + } + + public void setBalance(Double balance) { + this.balance = balance; + } + + public Double addBalance(Double amount) { + if (balance == null) + balance = 0.0; + + return balance += amount; + } + + public boolean hasFunds(Double amount) { + if (balance == null || amount == null) { + return false; + } + + return (balance - amount) >= 0; + } +} diff --git a/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/repo/Db.java b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/repo/Db.java new file mode 100644 index 0000000000..c91085f25b --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/repo/Db.java @@ -0,0 +1,32 @@ +package com.baeldung.jersey.exceptionhandling.repo; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; + +public class Db { + private Map db = new HashMap<>(); + + public Optional findById(String id) { + return Optional.ofNullable(db.get(id)); + } + + public String save(T t) { + String id = t.getId(); + if (id == null) { + id = UUID.randomUUID() + .toString(); + t.setId(id); + } + db.put(id, t); + return id; + } + + public void remove(T t) { + db.entrySet() + .removeIf(entry -> entry.getValue() + .getId() + .equals(t.getId())); + } +} diff --git a/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/repo/Identifiable.java b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/repo/Identifiable.java new file mode 100644 index 0000000000..11af44bcc5 --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/repo/Identifiable.java @@ -0,0 +1,17 @@ +package com.baeldung.jersey.exceptionhandling.repo; + +import java.io.Serializable; + +public interface Identifiable extends Serializable { + void setId(String id); + + String getId(); + + public static void assertValid(Identifiable i) { + if (i == null) + throw new IllegalArgumentException("object cannot be null"); + + if (i.getId() == null) + throw new IllegalArgumentException("object id cannot be null"); + } +} diff --git a/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/StocksResource.java b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/StocksResource.java new file mode 100644 index 0000000000..94ce329ad0 --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/StocksResource.java @@ -0,0 +1,42 @@ +package com.baeldung.jersey.exceptionhandling.rest; + +import java.util.Optional; + +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import com.baeldung.jersey.exceptionhandling.data.Stock; +import com.baeldung.jersey.exceptionhandling.repo.Db; +import com.baeldung.jersey.exceptionhandling.service.Repository; + +@Path("/stocks") +public class StocksResource { + private static final Db stocks = Repository.STOCKS_DB; + + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Response post(Stock stock) { + stocks.save(stock); + + return Response.ok(stock) + .build(); + } + + @GET + @Path("/{ticker}") + @Produces(MediaType.APPLICATION_JSON) + public Response get(@PathParam("ticker") String id) { + Optional stock = stocks.findById(id); + stock.orElseThrow(IllegalArgumentException::new); + + return Response.ok(stock.get()) + .build(); + } +} diff --git a/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/WalletsResource.java b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/WalletsResource.java new file mode 100644 index 0000000000..e5f8ddec06 --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/WalletsResource.java @@ -0,0 +1,98 @@ +package com.baeldung.jersey.exceptionhandling.rest; + +import java.util.Optional; + +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; + +import com.baeldung.jersey.exceptionhandling.data.Stock; +import com.baeldung.jersey.exceptionhandling.data.Wallet; +import com.baeldung.jersey.exceptionhandling.repo.Db; +import com.baeldung.jersey.exceptionhandling.rest.exceptions.InvalidTradeException; +import com.baeldung.jersey.exceptionhandling.rest.exceptions.RestErrorResponse; +import com.baeldung.jersey.exceptionhandling.service.Repository; + +@Path("/wallets") +public class WalletsResource { + private static final Db stocks = Repository.STOCKS_DB; + private static final Db wallets = Repository.WALLETS_DB; + + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Response post(Wallet wallet) { + wallets.save(wallet); + + return Response.ok(wallet) + .build(); + } + + @GET + @Path("/{id}") + @Produces(MediaType.APPLICATION_JSON) + public Response get(@PathParam("id") String id) { + Optional wallet = wallets.findById(id); + wallet.orElseThrow(IllegalArgumentException::new); + + return Response.ok(wallet.get()) + .build(); + } + + @PUT + @Path("/{id}/{amount}") + @Produces(MediaType.APPLICATION_JSON) + public Response putAmount(@PathParam("id") String id, @PathParam("amount") Double amount) { + Optional wallet = wallets.findById(id); + wallet.orElseThrow(IllegalArgumentException::new); + + if (amount < Wallet.MIN_CHARGE) { + throw new InvalidTradeException(Wallet.MIN_CHARGE_MSG); + } + + wallet.get() + .addBalance(amount); + wallets.save(wallet.get()); + + return Response.ok(wallet) + .build(); + } + + @POST + @Path("/{wallet}/buy/{ticker}") + @Produces(MediaType.APPLICATION_JSON) + public Response postBuyStock(@PathParam("wallet") String walletId, @PathParam("ticker") String id) { + Optional stock = stocks.findById(id); + stock.orElseThrow(InvalidTradeException::new); + + Optional w = wallets.findById(walletId); + w.orElseThrow(InvalidTradeException::new); + + Wallet wallet = w.get(); + Double price = stock.get() + .getPrice(); + + if (!wallet.hasFunds(price)) { + RestErrorResponse response = new RestErrorResponse(); + response.setSubject(wallet); + response.setMessage("insufficient balance"); + throw new WebApplicationException(Response.status(Status.NOT_ACCEPTABLE) + .entity(response) + .build()); + } + + wallet.addBalance(-price); + wallets.save(wallet); + + return Response.ok(wallet) + .build(); + } +} diff --git a/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/IllegalArgumentExceptionMapper.java b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/IllegalArgumentExceptionMapper.java new file mode 100644 index 0000000000..b577121027 --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/IllegalArgumentExceptionMapper.java @@ -0,0 +1,23 @@ +package com.baeldung.jersey.exceptionhandling.rest.exceptions; + +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.ext.ExceptionMapper; + +public class IllegalArgumentExceptionMapper implements ExceptionMapper { + public static final String DEFAULT_MESSAGE = "an illegal argument was provided"; + + @Override + public Response toResponse(final IllegalArgumentException exception) { + return Response.status(Response.Status.EXPECTATION_FAILED) + .entity(build(exception.getMessage())) + .type(MediaType.APPLICATION_JSON) + .build(); + } + + private RestErrorResponse build(String message) { + RestErrorResponse response = new RestErrorResponse(); + response.setMessage(DEFAULT_MESSAGE + ": " + message); + return response; + } +} diff --git a/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/InvalidTradeException.java b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/InvalidTradeException.java new file mode 100644 index 0000000000..11277c048a --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/InvalidTradeException.java @@ -0,0 +1,17 @@ +package com.baeldung.jersey.exceptionhandling.rest.exceptions; + +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Response; + +public class InvalidTradeException extends WebApplicationException { + private static final long serialVersionUID = 1L; + private static final String MESSAGE = "invalid trade operation"; + + public InvalidTradeException() { + super(MESSAGE, Response.Status.NOT_ACCEPTABLE); + } + + public InvalidTradeException(String detail) { + super(MESSAGE + ": " + detail, Response.Status.NOT_ACCEPTABLE); + } +} diff --git a/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/RestErrorResponse.java b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/RestErrorResponse.java new file mode 100644 index 0000000000..dd193ab059 --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/RestErrorResponse.java @@ -0,0 +1,34 @@ +package com.baeldung.jersey.exceptionhandling.rest.exceptions; + +public class RestErrorResponse { + private Object subject; + private String message; + + public RestErrorResponse() { + } + + public RestErrorResponse(String message) { + this.message = message; + } + + public RestErrorResponse(Object subject, String message) { + this.subject = subject; + this.message = message; + } + + public Object getSubject() { + return subject; + } + + public void setSubject(Object subject) { + this.subject = subject; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/ServerExceptionMapper.java b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/ServerExceptionMapper.java new file mode 100644 index 0000000000..a6e9cc7f39 --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/ServerExceptionMapper.java @@ -0,0 +1,35 @@ +package com.baeldung.jersey.exceptionhandling.rest.exceptions; + +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; +import javax.ws.rs.ext.ExceptionMapper; + +public class ServerExceptionMapper implements ExceptionMapper { + public static final String HTTP_405_MESSAGE = "METHOD_NOT_ALLOWED"; + + @Override + public Response toResponse(final WebApplicationException exception) { + String message = exception.getMessage(); + Response response = exception.getResponse(); + Status status = response.getStatusInfo() + .toEnum(); + + switch (status) { + case METHOD_NOT_ALLOWED: + message = HTTP_405_MESSAGE; + break; + case INTERNAL_SERVER_ERROR: + message = "internal validation - " + exception; + break; + default: + message = "[unhandled response code] " + exception; + } + + return Response.status(status) + .entity(status + ": " + message) + .type(MediaType.TEXT_PLAIN) + .build(); + } +} diff --git a/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/service/Repository.java b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/service/Repository.java new file mode 100644 index 0000000000..459b062068 --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/service/Repository.java @@ -0,0 +1,10 @@ +package com.baeldung.jersey.exceptionhandling.service; + +import com.baeldung.jersey.exceptionhandling.data.Stock; +import com.baeldung.jersey.exceptionhandling.data.Wallet; +import com.baeldung.jersey.exceptionhandling.repo.Db; + +public class Repository { + public static Db STOCKS_DB = new Db<>(); + public static Db WALLETS_DB = new Db<>(); +} diff --git a/jersey/src/test/java/com/baeldung/jersey/exceptionhandling/rest/StocksResourceIntegrationTest.java b/jersey/src/test/java/com/baeldung/jersey/exceptionhandling/rest/StocksResourceIntegrationTest.java new file mode 100644 index 0000000000..1648116918 --- /dev/null +++ b/jersey/src/test/java/com/baeldung/jersey/exceptionhandling/rest/StocksResourceIntegrationTest.java @@ -0,0 +1,99 @@ +package com.baeldung.jersey.exceptionhandling.rest; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.startsWith; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +import java.util.HashMap; + +import javax.ws.rs.client.Entity; +import javax.ws.rs.client.Invocation; +import javax.ws.rs.core.Application; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; + +import org.glassfish.jersey.test.JerseyTest; +import org.junit.Test; + +import com.baeldung.jersey.exceptionhandling.ExceptionHandlingConfig; +import com.baeldung.jersey.exceptionhandling.data.Stock; +import com.baeldung.jersey.exceptionhandling.data.Wallet; +import com.baeldung.jersey.exceptionhandling.rest.exceptions.IllegalArgumentExceptionMapper; +import com.baeldung.jersey.exceptionhandling.rest.exceptions.RestErrorResponse; +import com.baeldung.jersey.exceptionhandling.rest.exceptions.ServerExceptionMapper; + +public class StocksResourceIntegrationTest extends JerseyTest { + private static final Entity EMPTY_BODY = Entity.json(""); + private static final Stock STOCK = new Stock("BAEL", 51.57); + private static final String MY_WALLET = "MY-WALLET"; + private static final Wallet WALLET = new Wallet(MY_WALLET); + private static final int INSUFFICIENT_AMOUNT = (int) (Wallet.MIN_CHARGE - 1); + + @Override + protected Application configure() { + return new ExceptionHandlingConfig(); + } + + private Invocation.Builder stocks(String path) { + return target("/stocks" + path).request(); + } + + private Invocation.Builder wallets(String path, Object... args) { + return target("/wallets" + String.format(path, args)).request(); + } + + private Entity entity(Object object) { + return Entity.entity(object, MediaType.APPLICATION_JSON_TYPE); + } + + @Test + public void whenMethodNotAllowed_thenCustomMessage() { + Response response = stocks("").get(); + + assertEquals(Status.METHOD_NOT_ALLOWED.getStatusCode(), response.getStatus()); + + String content = response.readEntity(String.class); + assertThat(content, containsString(ServerExceptionMapper.HTTP_405_MESSAGE)); + } + + @Test + public void whenTickerNotExists_thenRestErrorResponse() { + Response response = stocks("/UNDEFINED").get(); + + assertEquals(Status.EXPECTATION_FAILED.getStatusCode(), response.getStatus()); + + RestErrorResponse content = response.readEntity(RestErrorResponse.class); + assertThat(content.getMessage(), startsWith(IllegalArgumentExceptionMapper.DEFAULT_MESSAGE)); + } + + @Test + public void givenAmountLessThanMinimum_whenAddingToWallet_thenInvalidTradeException() { + wallets("").post(entity(WALLET)); + Response response = wallets("/%s/%d", MY_WALLET, INSUFFICIENT_AMOUNT).put(EMPTY_BODY); + + assertEquals(Status.NOT_ACCEPTABLE.getStatusCode(), response.getStatus()); + + String content = response.readEntity(String.class); + assertThat(content, containsString(Wallet.MIN_CHARGE_MSG)); + } + + @Test + public void givenInsifficientFunds_whenBuyingStock_thenWebApplicationException() { + stocks("").post(entity(STOCK)); + wallets("").post(entity(WALLET)); + + Response response = wallets("/%s/buy/%s", MY_WALLET, STOCK.getId()).post(EMPTY_BODY); + assertEquals(Status.NOT_ACCEPTABLE.getStatusCode(), response.getStatus()); + + RestErrorResponse content = response.readEntity(RestErrorResponse.class); + assertNotNull(content.getSubject()); + + HashMap subject = (HashMap) content.getSubject(); + assertEquals(subject.get("id"), WALLET.getId()); + assertTrue(WALLET.getBalance() < Wallet.MIN_CHARGE); + } +} From 4ad546c702c789e2f8976e3c75ace975b6e191be Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Mon, 11 Apr 2022 15:55:30 +0100 Subject: [PATCH 023/278] [JAVA-11226] Fix and update Hibernate OneToMany code (#12031) --- .../hibernate-annotations/pom.xml | 2 +- .../config/HibernateAnnotationUtil.java | 43 +++++++---- .../main/HibernateManyIsOwningSide.java | 71 ++++++++++++++++++ .../main/HibernateManyisOwningSide.java | 71 ------------------ ...ide.java => HibernateOneIsOwningSide.java} | 44 +++++------ .../HibernateOneToManyAnnotationMain.java | 41 +++++----- .../hibernate/oneToMany/model/Cart.java | 8 +- .../hibernate/oneToMany/model/CartOIO.java | 8 +- .../oneToMany/model/{Items.java => Item.java} | 7 +- .../model/{ItemsOIO.java => ItemOIO.java} | 6 +- .../resources/hibernate-annotation.cfg.xml | 18 +++++ .../src/main/resources/log4j.xml | 31 ++++++++ ...neToManyAnnotationMainIntegrationTest.java | 62 +++++++-------- .../src/test/resources/log4j.xml | 13 +++- .../src/test/resources/profile.png | Bin 1117 -> 0 bytes 15 files changed, 243 insertions(+), 182 deletions(-) create mode 100644 persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateManyIsOwningSide.java delete mode 100644 persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateManyisOwningSide.java rename persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/{HibernateOneisOwningSide.java => HibernateOneIsOwningSide.java} (50%) rename persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/{Items.java => Item.java} (92%) rename persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/{ItemsOIO.java => ItemOIO.java} (91%) create mode 100644 persistence-modules/hibernate-annotations/src/main/resources/hibernate-annotation.cfg.xml create mode 100644 persistence-modules/hibernate-annotations/src/main/resources/log4j.xml delete mode 100644 persistence-modules/hibernate-annotations/src/test/resources/profile.png diff --git a/persistence-modules/hibernate-annotations/pom.xml b/persistence-modules/hibernate-annotations/pom.xml index ed158216fb..023e5aa30f 100644 --- a/persistence-modules/hibernate-annotations/pom.xml +++ b/persistence-modules/hibernate-annotations/pom.xml @@ -82,7 +82,7 @@ 5.0.2.RELEASE 1.10.6.RELEASE - 5.4.7.Final + 5.6.7.Final true 2.1.7.RELEASE 1.4.200 diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java index 46e6824f42..6c94d34339 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java @@ -1,34 +1,51 @@ package com.baeldung.hibernate.oneToMany.config; +import com.baeldung.hibernate.oneToMany.model.Cart; +import com.baeldung.hibernate.oneToMany.model.CartOIO; +import com.baeldung.hibernate.oneToMany.model.Item; +import com.baeldung.hibernate.oneToMany.model.ItemOIO; import org.hibernate.SessionFactory; import org.hibernate.boot.Metadata; import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.service.ServiceRegistry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class HibernateAnnotationUtil { + private static final Logger LOGGER = LoggerFactory.getLogger(HibernateAnnotationUtil.class); + private static SessionFactory sessionFactory; + public static SessionFactory getSessionFactory() { + if (sessionFactory == null) { + sessionFactory = buildSessionFactory(); + } + return sessionFactory; + } + private static SessionFactory buildSessionFactory() { try { - // Create the SessionFactory from hibernate-annotation.cfg.xml - ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure("hibernate-annotation.cfg.xml").build(); - Metadata metadata = new MetadataSources(serviceRegistry).getMetadataBuilder().build(); - SessionFactory sessionFactory = metadata.getSessionFactoryBuilder().build(); + ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() + .configure("hibernate-annotation.cfg.xml") + .build(); - return sessionFactory; + Metadata metadata = new MetadataSources(serviceRegistry) + .addAnnotatedClass(Cart.class) + .addAnnotatedClass(CartOIO.class) + .addAnnotatedClass(Item.class) + .addAnnotatedClass(ItemOIO.class) + .getMetadataBuilder() + .applyImplicitNamingStrategy(ImplicitNamingStrategyJpaCompliantImpl.INSTANCE) + .build(); + + return metadata.getSessionFactoryBuilder().build(); } catch (Throwable ex) { - System.err.println("Initial SessionFactory creation failed." + ex); - ex.printStackTrace(); + LOGGER.error("Initial SessionFactory creation failed.", ex); throw new ExceptionInInitializerError(ex); } } - - public static SessionFactory getSessionFactory() { - if (sessionFactory == null) - sessionFactory = buildSessionFactory(); - return sessionFactory; - } } diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateManyIsOwningSide.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateManyIsOwningSide.java new file mode 100644 index 0000000000..f74aecbb92 --- /dev/null +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateManyIsOwningSide.java @@ -0,0 +1,71 @@ +package com.baeldung.hibernate.oneToMany.main; + +import java.util.HashSet; +import java.util.Set; + +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.Transaction; + +import com.baeldung.hibernate.oneToMany.config.HibernateAnnotationUtil; +import com.baeldung.hibernate.oneToMany.model.Cart; +import com.baeldung.hibernate.oneToMany.model.Item; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class HibernateManyIsOwningSide { + + private static final Logger LOGGER = LoggerFactory.getLogger(HibernateManyIsOwningSide.class); + + public static void main(String[] args) { + + Cart cart = new Cart(); + Cart cart2 = new Cart(); + + Item item1 = new Item(cart); + Item item2 = new Item(cart2); + + Set itemsSet = new HashSet<>(); + itemsSet.add(item1); + itemsSet.add(item2); + cart.setItems(itemsSet); + + // Get Session + SessionFactory sessionFactory = HibernateAnnotationUtil.getSessionFactory(); + Session session = sessionFactory.getCurrentSession(); + + try { + LOGGER.info("Session created"); + + // start transaction + Transaction tx = session.beginTransaction(); + + // Save the Model object + session.save(cart); + session.save(cart2); + session.save(item1); + session.save(item2); + + // Commit transaction + tx.commit(); + + session = sessionFactory.getCurrentSession(); + tx = session.beginTransaction(); + + item1 = session.get(Item.class, 1L); + item2 = session.get(Item.class, 2L); + tx.commit(); + + LOGGER.info("item1 ID={}, Foreign Key CartOIO ID={}", item1.getId(), item1.getCart().getId()); + LOGGER.info("item2 ID={}, Foreign Key CartOIO ID={}", item2.getId(), item2.getCart().getId()); + + } catch (Exception e) { + LOGGER.error("Exception occurred", e); + } finally { + if (!sessionFactory.isClosed()) { + LOGGER.info("Closing SessionFactory"); + sessionFactory.close(); + } + } + } +} diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateManyisOwningSide.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateManyisOwningSide.java deleted file mode 100644 index 372fb2fc07..0000000000 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateManyisOwningSide.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.baeldung.hibernate.oneToMany.main; - -import java.util.HashSet; -import java.util.Set; - -import org.hibernate.Session; -import org.hibernate.SessionFactory; -import org.hibernate.Transaction; - -import com.baeldung.hibernate.oneToMany.config.HibernateAnnotationUtil; -import com.baeldung.hibernate.oneToMany.model.Cart; -import com.baeldung.hibernate.oneToMany.model.Items; -import com.baeldung.hibernate.oneToMany.model.ItemsOIO; - -public class HibernateManyisOwningSide { - public static void main(String[] args) { - - Cart cart = new Cart(); - Cart cart2 = new Cart(); - - Items item1 = new Items(cart); - Items item2 = new Items(cart2); - Set itemsSet = new HashSet(); - itemsSet.add(item1); - itemsSet.add(item2); - - cart.setItems(itemsSet); - - - - SessionFactory sessionFactory = null; - Session session = null; - Transaction tx = null; - try { - // Get Session - sessionFactory = HibernateAnnotationUtil.getSessionFactory(); - session = sessionFactory.getCurrentSession(); - System.out.println("Session created"); - // start transaction - tx = session.beginTransaction(); - // Save the Model object - session.save(cart); - session.save(cart2); - session.save(item1); - session.save(item2); - // Commit transaction - tx.commit(); - session = sessionFactory.getCurrentSession(); - tx = session.beginTransaction(); - - item1 = (Items) session.get(Items.class, new Long(1)); - item2 = (Items) session.get(Items.class, new Long(2)); - tx.commit(); - - - System.out.println("item1 ID=" + item1.getId() + ", Foreign Key CartOIO ID=" + item1.getCart() - .getId()); - System.out.println("item2 ID=" + item2.getId() + ", Foreign Key CartOIO ID=" + item2.getCart() - .getId()); - - } catch (Exception e) { - System.out.println("Exception occured. " + e.getMessage()); - e.printStackTrace(); - } finally { - if (!sessionFactory.isClosed()) { - System.out.println("Closing SessionFactory"); - sessionFactory.close(); - } - } - } -} diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneisOwningSide.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneIsOwningSide.java similarity index 50% rename from persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneisOwningSide.java rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneIsOwningSide.java index 0777664dd0..086e015ad1 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneisOwningSide.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneIsOwningSide.java @@ -9,57 +9,59 @@ import org.hibernate.Transaction; import com.baeldung.hibernate.oneToMany.config.HibernateAnnotationUtil; import com.baeldung.hibernate.oneToMany.model.CartOIO; -import com.baeldung.hibernate.oneToMany.model.ItemsOIO; +import com.baeldung.hibernate.oneToMany.model.ItemOIO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class HibernateOneIsOwningSide { + + private static final Logger LOGGER = LoggerFactory.getLogger(HibernateOneIsOwningSide.class); -public class HibernateOneisOwningSide { public static void main(String[] args) { CartOIO cart = new CartOIO(); CartOIO cart2 = new CartOIO(); - ItemsOIO item1 = new ItemsOIO(cart); - ItemsOIO item2 = new ItemsOIO(cart2); - Set itemsSet = new HashSet(); + ItemOIO item1 = new ItemOIO(cart); + ItemOIO item2 = new ItemOIO(cart2); + Set itemsSet = new HashSet<>(); itemsSet.add(item1); itemsSet.add(item2); cart.setItems(itemsSet); - SessionFactory sessionFactory = null; - Session session = null; - Transaction tx = null; + SessionFactory sessionFactory = HibernateAnnotationUtil.getSessionFactory(); + Session session = sessionFactory.getCurrentSession(); + LOGGER.info("Session created"); + + Transaction tx; try { - // Get Session - sessionFactory = HibernateAnnotationUtil.getSessionFactory(); - session = sessionFactory.getCurrentSession(); - System.out.println("Session created"); // start transaction tx = session.beginTransaction(); + // Save the Model object session.save(cart); session.save(cart2); session.save(item1); session.save(item2); + // Commit transaction tx.commit(); session = sessionFactory.getCurrentSession(); tx = session.beginTransaction(); - item1 = (ItemsOIO) session.get(ItemsOIO.class, new Long(1)); - item2 = (ItemsOIO) session.get(ItemsOIO.class, new Long(2)); + item1 = session.get(ItemOIO.class, 1L); + item2 = session.get(ItemOIO.class, 2L); tx.commit(); - System.out.println("item1 ID=" + item1.getId() + ", Foreign Key CartOIO ID=" + item1.getCartOIO() - .getId()); - System.out.println("item2 ID=" + item2.getId() + ", Foreign Key CartOIO ID=" + item2.getCartOIO() - .getId()); + LOGGER.info("item1 ID={}, Foreign Key CartOIO ID={}", item1.getId(), item1.getCartOIO().getId()); + LOGGER.info("item2 ID={}, Foreign Key CartOIO ID={}", item2.getId(), item2.getCartOIO().getId()); } catch (Exception e) { - System.out.println("Exception occured. " + e.getMessage()); - e.printStackTrace(); + LOGGER.error("Exception occurred", e); } finally { if (!sessionFactory.isClosed()) { - System.out.println("Closing SessionFactory"); + LOGGER.info("Closing SessionFactory"); sessionFactory.close(); } } diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMain.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMain.java index 2bc5e514f7..99df67b4a8 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMain.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMain.java @@ -9,52 +9,53 @@ import org.hibernate.Transaction; import com.baeldung.hibernate.oneToMany.config.HibernateAnnotationUtil; import com.baeldung.hibernate.oneToMany.model.Cart; -import com.baeldung.hibernate.oneToMany.model.Items; +import com.baeldung.hibernate.oneToMany.model.Item; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class HibernateOneToManyAnnotationMain { + private static final Logger LOGGER = LoggerFactory.getLogger(HibernateOneToManyAnnotationMain.class); + public static void main(String[] args) { Cart cart = new Cart(); - Items item1 = new Items(cart); - Items item2 = new Items(cart); - Set itemsSet = new HashSet(); + Item item1 = new Item(cart); + Item item2 = new Item(cart); + Set itemsSet = new HashSet<>(); itemsSet.add(item1); itemsSet.add(item2); cart.setItems(itemsSet); - - SessionFactory sessionFactory = null; - Session session = null; - Transaction tx = null; + SessionFactory sessionFactory = HibernateAnnotationUtil.getSessionFactory(); + Session session = sessionFactory.getCurrentSession(); + LOGGER.info("Session created"); + try { - // Get Session - sessionFactory = HibernateAnnotationUtil.getSessionFactory(); - session = sessionFactory.getCurrentSession(); - System.out.println("Session created"); // start transaction - tx = session.beginTransaction(); + Transaction tx = session.beginTransaction(); + // Save the Model object session.save(cart); session.save(item1); session.save(item2); + // Commit transaction tx.commit(); - System.out.println("Cart ID=" + cart.getId()); - System.out.println("item1 ID=" + item1.getId() + ", Foreign Key Cart ID=" + item1.getCart().getId()); - System.out.println("item2 ID=" + item2.getId() + ", Foreign Key Cart ID=" + item1.getCart().getId()); + + LOGGER.info("Cart ID={}", cart.getId()); + LOGGER.info("item1 ID={}, Foreign Key Cart ID={}", item1.getId(), item1.getCart().getId()); + LOGGER.info("item2 ID={}, Foreign Key Cart ID={}", item2.getId(), item2.getCart().getId()); } catch (Exception e) { - System.out.println("Exception occured. " + e.getMessage()); - e.printStackTrace(); + LOGGER.error("Exception occurred", e); } finally { if (!sessionFactory.isClosed()) { - System.out.println("Closing SessionFactory"); + LOGGER.info("Closing SessionFactory"); sessionFactory.close(); } } } - } diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java index b8b991831e..53878af445 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java @@ -19,9 +19,8 @@ public class Cart { @Column(name = "cart_id") private long id; - @OneToMany(mappedBy = "cart") - private Set items; + private Set items; public long getId() { return id; @@ -31,12 +30,11 @@ public class Cart { this.id = id; } - - public Set getItems() { + public Set getItems() { return items; } - public void setItems(Set items) { + public void setItems(Set items) { this.items = items; } diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/CartOIO.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/CartOIO.java index 8a5ed5e7a4..27b28a6753 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/CartOIO.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/CartOIO.java @@ -9,8 +9,6 @@ import javax.persistence.JoinColumn; import javax.persistence.OneToMany; import javax.persistence.Table; - - @Entity @Table(name = "CARTOIO") public class CartOIO { @@ -21,7 +19,7 @@ public class CartOIO { @OneToMany @JoinColumn(name = "cart_id") // we need to duplicate the physical information - private Set items; + private Set items; public long getId() { return id; @@ -31,11 +29,11 @@ public class CartOIO { this.id = id; } - public Set getItems() { + public Set getItems() { return items; } - public void setItems(Set items) { + public void setItems(Set items) { this.items = items; } diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Items.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Item.java similarity index 92% rename from persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Items.java rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Item.java index f63a4855b5..a055682d0d 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Items.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Item.java @@ -11,23 +11,22 @@ import javax.persistence.Table; @Entity @Table(name = "ITEMS") -public class Items { +public class Item { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private long id; - @ManyToOne @JoinColumn(name = "cart_id", nullable = false) private Cart cart; // Hibernate requires no-args constructor - public Items() { + public Item() { } - public Items(Cart c) { + public Item(Cart c) { this.cart = c; } diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemsOIO.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemOIO.java similarity index 91% rename from persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemsOIO.java rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemOIO.java index a3d6a796c5..baaf57b106 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemsOIO.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemOIO.java @@ -10,7 +10,7 @@ import javax.persistence.Table; @Entity @Table(name = "ITEMSOIO") -public class ItemsOIO { +public class ItemOIO { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -21,10 +21,10 @@ public class ItemsOIO { private CartOIO cart; // Hibernate requires no-args constructor - public ItemsOIO() { + public ItemOIO() { } - public ItemsOIO(CartOIO c) { + public ItemOIO(CartOIO c) { this.cart = c; } diff --git a/persistence-modules/hibernate-annotations/src/main/resources/hibernate-annotation.cfg.xml b/persistence-modules/hibernate-annotations/src/main/resources/hibernate-annotation.cfg.xml new file mode 100644 index 0000000000..6e845b3781 --- /dev/null +++ b/persistence-modules/hibernate-annotations/src/main/resources/hibernate-annotation.cfg.xml @@ -0,0 +1,18 @@ + + + + + + org.h2.Driver + sa + + jdbc:h2:mem:spring_hibernate_one_to_many + + org.hibernate.dialect.H2Dialect + thread + true + create + + diff --git a/persistence-modules/hibernate-annotations/src/main/resources/log4j.xml b/persistence-modules/hibernate-annotations/src/main/resources/log4j.xml new file mode 100644 index 0000000000..bc2c24ea93 --- /dev/null +++ b/persistence-modules/hibernate-annotations/src/main/resources/log4j.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainIntegrationTest.java b/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainIntegrationTest.java index 3bc5a6e12a..cb11df4212 100644 --- a/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainIntegrationTest.java +++ b/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainIntegrationTest.java @@ -1,26 +1,21 @@ package com.baeldung.hibernate.oneToMany.main; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; - -import java.util.HashSet; -import java.util.Set; - +import com.baeldung.hibernate.oneToMany.config.HibernateAnnotationUtil; +import com.baeldung.hibernate.oneToMany.model.Cart; +import com.baeldung.hibernate.oneToMany.model.Item; import org.hibernate.Session; import org.hibernate.SessionFactory; -import org.hibernate.boot.registry.StandardServiceRegistryBuilder; -import org.hibernate.cfg.Configuration; -import org.hibernate.dialect.H2Dialect; -import org.hibernate.service.ServiceRegistry; import org.junit.After; import org.junit.AfterClass; -import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; -import com.baeldung.hibernate.oneToMany.model.Cart; -import com.baeldung.hibernate.oneToMany.model.Items; +import java.util.HashSet; +import java.util.Set; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; public class HibernateOneToManyAnnotationMainIntegrationTest { @@ -28,20 +23,9 @@ public class HibernateOneToManyAnnotationMainIntegrationTest { private Session session; - public HibernateOneToManyAnnotationMainIntegrationTest() { - } - @BeforeClass public static void beforeTests() { - Configuration configuration = new Configuration().addAnnotatedClass(Cart.class).addAnnotatedClass(Items.class) - .setProperty("hibernate.dialect", H2Dialect.class.getName()) - .setProperty("hibernate.connection.driver_class", org.h2.Driver.class.getName()) - .setProperty("hibernate.connection.url", "jdbc:h2:mem:test") - .setProperty("hibernate.connection.username", "sa").setProperty("hibernate.connection.password", "") - .setProperty("hibernate.hbm2ddl.auto", "update"); - ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() - .applySettings(configuration.getProperties()).build(); - sessionFactory = configuration.buildSessionFactory(serviceRegistry); + sessionFactory = HibernateAnnotationUtil.getSessionFactory(); } @Before @@ -52,32 +36,38 @@ public class HibernateOneToManyAnnotationMainIntegrationTest { @Test public void givenSession_checkIfDatabaseIsEmpty() { - Cart cart = (Cart) session.get(Cart.class, new Long(1)); + Cart cart = session.get(Cart.class, 1L); assertNull(cart); - } @Test public void givenSession_checkIfDatabaseIsPopulated_afterCommit() { Cart cart = new Cart(); - Set cartItems = new HashSet<>(); - cartItems = cart.getItems(); - Assert.assertNull(cartItems); - Items item1 = new Items(); + Set cartItems = cart.getItems(); + + assertNull(cartItems); + + Item item1 = new Item(); item1.setCart(cart); + assertNotNull(item1); - Set itemsSet = new HashSet(); - itemsSet.add(item1); - assertNotNull(itemsSet); - cart.setItems(itemsSet); + + Set itemSet = new HashSet<>(); + itemSet.add(item1); + + assertNotNull(itemSet); + cart.setItems(itemSet); + assertNotNull(cart); + session.persist(cart); session.getTransaction().commit(); session.close(); session = sessionFactory.openSession(); session.beginTransaction(); - cart = (Cart) session.get(Cart.class, new Long(1)); + cart = session.get(Cart.class, 1L); + assertNotNull(cart); } diff --git a/persistence-modules/hibernate-annotations/src/test/resources/log4j.xml b/persistence-modules/hibernate-annotations/src/test/resources/log4j.xml index 7e2895f1e0..bc2c24ea93 100644 --- a/persistence-modules/hibernate-annotations/src/test/resources/log4j.xml +++ b/persistence-modules/hibernate-annotations/src/test/resources/log4j.xml @@ -1,24 +1,31 @@ - + + + + + - + + + - \ No newline at end of file + + \ No newline at end of file diff --git a/persistence-modules/hibernate-annotations/src/test/resources/profile.png b/persistence-modules/hibernate-annotations/src/test/resources/profile.png deleted file mode 100644 index 1cd4e978b96d0f59a6e48692fcb68d1c6c565a20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1117 zcmV-j1fu(iP)%yyh@V&OYl(_AFwE`D&8)` zPnvkdvc#Z>pRh2kBHk{=qaGfCG;?<;rVe;D+%LyZS~!K}c+|op81YK@rzPHU@Th|m z4Dk`HcojTY;+}_-W%HGqKH@C!LiH8Tp>1lC@aTqoy zBU~QK<}hs@q|M8($ee`o<9#`B3-PL4Y7d9kW#<;n>t}6VNpYCswLrJTtEa_lFwgN$52-_vxvvfJs@B6-OYs%-@M_JTx*UfozG6(Bhs)>w z!pG%vU$b%f++EGa<#Tu1FZ^c#{;G|y5=kM3Y#X^mtSrFA_-o-vX7e_$5-udx(>S4U)i|4)(UJ~zR(vwE+6VTAzoo7wIS|c zh*yt`3wK%<+yX~Z9G1z2GQgf3~qx jc9u$WjpqGof00000NkvXXu0mjfJX<<= From 0ad2fa54126ff49a0608ede30622ae42b185fa59 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Mon, 11 Apr 2022 21:53:04 +0530 Subject: [PATCH 024/278] JAVA-8859 --- .../reactor/core/CombiningPublishersIntegrationTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactor-core/src/test/java/com/baeldung/reactor/core/CombiningPublishersIntegrationTest.java b/reactor-core/src/test/java/com/baeldung/reactor/core/CombiningPublishersIntegrationTest.java index e6108759e1..4f37718814 100644 --- a/reactor-core/src/test/java/com/baeldung/reactor/core/CombiningPublishersIntegrationTest.java +++ b/reactor-core/src/test/java/com/baeldung/reactor/core/CombiningPublishersIntegrationTest.java @@ -18,8 +18,8 @@ public class CombiningPublishersIntegrationTest { @Test public void givenFluxes_whenMergeDelayErrorIsInvoked_thenMergeDelayError() { Flux fluxOfIntegers = Flux.mergeDelayError(1, - evenNumbers.delayElements(Duration.ofMillis(2000L)), - oddNumbers.delayElements(Duration.ofMillis(1000L))); + evenNumbers.delayElements(Duration.ofMillis(500L)), + oddNumbers.delayElements(Duration.ofMillis(300L))); StepVerifier.create(fluxOfIntegers) .expectNext(1) From 620653f6a6eed8ce5515db9a8b0e7ee9682aa419 Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Mon, 11 Apr 2022 13:43:37 -0300 Subject: [PATCH 025/278] BAEL-5157 - Exception Handling with Jersey (#12045) First draft: https://drafts.baeldung.com/wp-admin/post.php?post=131880&action=edit --- .../ExceptionHandlingConfig.java | 19 ++++ .../jersey/exceptionhandling/data/Stock.java | 33 +++++++ .../jersey/exceptionhandling/data/Wallet.java | 51 ++++++++++ .../jersey/exceptionhandling/repo/Db.java | 32 ++++++ .../exceptionhandling/repo/Identifiable.java | 17 ++++ .../rest/StocksResource.java | 42 ++++++++ .../rest/WalletsResource.java | 98 ++++++++++++++++++ .../IllegalArgumentExceptionMapper.java | 23 +++++ .../exceptions/InvalidTradeException.java | 17 ++++ .../rest/exceptions/RestErrorResponse.java | 34 +++++++ .../exceptions/ServerExceptionMapper.java | 35 +++++++ .../exceptionhandling/service/Repository.java | 10 ++ .../rest/StocksResourceIntegrationTest.java | 99 +++++++++++++++++++ 13 files changed, 510 insertions(+) create mode 100644 jersey/src/main/java/com/baeldung/jersey/exceptionhandling/ExceptionHandlingConfig.java create mode 100644 jersey/src/main/java/com/baeldung/jersey/exceptionhandling/data/Stock.java create mode 100644 jersey/src/main/java/com/baeldung/jersey/exceptionhandling/data/Wallet.java create mode 100644 jersey/src/main/java/com/baeldung/jersey/exceptionhandling/repo/Db.java create mode 100644 jersey/src/main/java/com/baeldung/jersey/exceptionhandling/repo/Identifiable.java create mode 100644 jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/StocksResource.java create mode 100644 jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/WalletsResource.java create mode 100644 jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/IllegalArgumentExceptionMapper.java create mode 100644 jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/InvalidTradeException.java create mode 100644 jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/RestErrorResponse.java create mode 100644 jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/ServerExceptionMapper.java create mode 100644 jersey/src/main/java/com/baeldung/jersey/exceptionhandling/service/Repository.java create mode 100644 jersey/src/test/java/com/baeldung/jersey/exceptionhandling/rest/StocksResourceIntegrationTest.java diff --git a/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/ExceptionHandlingConfig.java b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/ExceptionHandlingConfig.java new file mode 100644 index 0000000000..d4cc1a81a1 --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/ExceptionHandlingConfig.java @@ -0,0 +1,19 @@ +package com.baeldung.jersey.exceptionhandling; + +import javax.ws.rs.ApplicationPath; + +import org.glassfish.jersey.server.ResourceConfig; + +import com.baeldung.jersey.exceptionhandling.rest.exceptions.IllegalArgumentExceptionMapper; +import com.baeldung.jersey.exceptionhandling.rest.exceptions.ServerExceptionMapper; + +@ApplicationPath("/exception-handling/*") +public class ExceptionHandlingConfig extends ResourceConfig { + + public ExceptionHandlingConfig() { + packages("com.baeldung.jersey.exceptionhandling.rest"); + register(IllegalArgumentExceptionMapper.class); + register(ServerExceptionMapper.class); + } + +} diff --git a/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/data/Stock.java b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/data/Stock.java new file mode 100644 index 0000000000..9a3f321651 --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/data/Stock.java @@ -0,0 +1,33 @@ +package com.baeldung.jersey.exceptionhandling.data; + +import com.baeldung.jersey.exceptionhandling.repo.Identifiable; + +public class Stock implements Identifiable { + private static final long serialVersionUID = 1L; + private String id; + private Double price; + + public Stock() { + } + + public Stock(String id, Double price) { + this.id = id; + this.price = price; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Double getPrice() { + return price; + } + + public void setPrice(Double price) { + this.price = price; + } +} diff --git a/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/data/Wallet.java b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/data/Wallet.java new file mode 100644 index 0000000000..8ef47b4c99 --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/data/Wallet.java @@ -0,0 +1,51 @@ +package com.baeldung.jersey.exceptionhandling.data; + +import com.baeldung.jersey.exceptionhandling.repo.Identifiable; + +public class Wallet implements Identifiable { + private static final long serialVersionUID = 1L; + + public static final Double MIN_CHARGE = 50.0; + public static final String MIN_CHARGE_MSG = "minimum charge is: " + MIN_CHARGE; + + private String id; + private Double balance = 0.0; + + public Wallet() { + } + + public Wallet(String id) { + this.id = id; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Double getBalance() { + return balance; + } + + public void setBalance(Double balance) { + this.balance = balance; + } + + public Double addBalance(Double amount) { + if (balance == null) + balance = 0.0; + + return balance += amount; + } + + public boolean hasFunds(Double amount) { + if (balance == null || amount == null) { + return false; + } + + return (balance - amount) >= 0; + } +} diff --git a/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/repo/Db.java b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/repo/Db.java new file mode 100644 index 0000000000..c91085f25b --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/repo/Db.java @@ -0,0 +1,32 @@ +package com.baeldung.jersey.exceptionhandling.repo; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; + +public class Db { + private Map db = new HashMap<>(); + + public Optional findById(String id) { + return Optional.ofNullable(db.get(id)); + } + + public String save(T t) { + String id = t.getId(); + if (id == null) { + id = UUID.randomUUID() + .toString(); + t.setId(id); + } + db.put(id, t); + return id; + } + + public void remove(T t) { + db.entrySet() + .removeIf(entry -> entry.getValue() + .getId() + .equals(t.getId())); + } +} diff --git a/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/repo/Identifiable.java b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/repo/Identifiable.java new file mode 100644 index 0000000000..11af44bcc5 --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/repo/Identifiable.java @@ -0,0 +1,17 @@ +package com.baeldung.jersey.exceptionhandling.repo; + +import java.io.Serializable; + +public interface Identifiable extends Serializable { + void setId(String id); + + String getId(); + + public static void assertValid(Identifiable i) { + if (i == null) + throw new IllegalArgumentException("object cannot be null"); + + if (i.getId() == null) + throw new IllegalArgumentException("object id cannot be null"); + } +} diff --git a/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/StocksResource.java b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/StocksResource.java new file mode 100644 index 0000000000..94ce329ad0 --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/StocksResource.java @@ -0,0 +1,42 @@ +package com.baeldung.jersey.exceptionhandling.rest; + +import java.util.Optional; + +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import com.baeldung.jersey.exceptionhandling.data.Stock; +import com.baeldung.jersey.exceptionhandling.repo.Db; +import com.baeldung.jersey.exceptionhandling.service.Repository; + +@Path("/stocks") +public class StocksResource { + private static final Db stocks = Repository.STOCKS_DB; + + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Response post(Stock stock) { + stocks.save(stock); + + return Response.ok(stock) + .build(); + } + + @GET + @Path("/{ticker}") + @Produces(MediaType.APPLICATION_JSON) + public Response get(@PathParam("ticker") String id) { + Optional stock = stocks.findById(id); + stock.orElseThrow(IllegalArgumentException::new); + + return Response.ok(stock.get()) + .build(); + } +} diff --git a/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/WalletsResource.java b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/WalletsResource.java new file mode 100644 index 0000000000..e5f8ddec06 --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/WalletsResource.java @@ -0,0 +1,98 @@ +package com.baeldung.jersey.exceptionhandling.rest; + +import java.util.Optional; + +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; + +import com.baeldung.jersey.exceptionhandling.data.Stock; +import com.baeldung.jersey.exceptionhandling.data.Wallet; +import com.baeldung.jersey.exceptionhandling.repo.Db; +import com.baeldung.jersey.exceptionhandling.rest.exceptions.InvalidTradeException; +import com.baeldung.jersey.exceptionhandling.rest.exceptions.RestErrorResponse; +import com.baeldung.jersey.exceptionhandling.service.Repository; + +@Path("/wallets") +public class WalletsResource { + private static final Db stocks = Repository.STOCKS_DB; + private static final Db wallets = Repository.WALLETS_DB; + + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Response post(Wallet wallet) { + wallets.save(wallet); + + return Response.ok(wallet) + .build(); + } + + @GET + @Path("/{id}") + @Produces(MediaType.APPLICATION_JSON) + public Response get(@PathParam("id") String id) { + Optional wallet = wallets.findById(id); + wallet.orElseThrow(IllegalArgumentException::new); + + return Response.ok(wallet.get()) + .build(); + } + + @PUT + @Path("/{id}/{amount}") + @Produces(MediaType.APPLICATION_JSON) + public Response putAmount(@PathParam("id") String id, @PathParam("amount") Double amount) { + Optional wallet = wallets.findById(id); + wallet.orElseThrow(IllegalArgumentException::new); + + if (amount < Wallet.MIN_CHARGE) { + throw new InvalidTradeException(Wallet.MIN_CHARGE_MSG); + } + + wallet.get() + .addBalance(amount); + wallets.save(wallet.get()); + + return Response.ok(wallet) + .build(); + } + + @POST + @Path("/{wallet}/buy/{ticker}") + @Produces(MediaType.APPLICATION_JSON) + public Response postBuyStock(@PathParam("wallet") String walletId, @PathParam("ticker") String id) { + Optional stock = stocks.findById(id); + stock.orElseThrow(InvalidTradeException::new); + + Optional w = wallets.findById(walletId); + w.orElseThrow(InvalidTradeException::new); + + Wallet wallet = w.get(); + Double price = stock.get() + .getPrice(); + + if (!wallet.hasFunds(price)) { + RestErrorResponse response = new RestErrorResponse(); + response.setSubject(wallet); + response.setMessage("insufficient balance"); + throw new WebApplicationException(Response.status(Status.NOT_ACCEPTABLE) + .entity(response) + .build()); + } + + wallet.addBalance(-price); + wallets.save(wallet); + + return Response.ok(wallet) + .build(); + } +} diff --git a/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/IllegalArgumentExceptionMapper.java b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/IllegalArgumentExceptionMapper.java new file mode 100644 index 0000000000..b577121027 --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/IllegalArgumentExceptionMapper.java @@ -0,0 +1,23 @@ +package com.baeldung.jersey.exceptionhandling.rest.exceptions; + +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.ext.ExceptionMapper; + +public class IllegalArgumentExceptionMapper implements ExceptionMapper { + public static final String DEFAULT_MESSAGE = "an illegal argument was provided"; + + @Override + public Response toResponse(final IllegalArgumentException exception) { + return Response.status(Response.Status.EXPECTATION_FAILED) + .entity(build(exception.getMessage())) + .type(MediaType.APPLICATION_JSON) + .build(); + } + + private RestErrorResponse build(String message) { + RestErrorResponse response = new RestErrorResponse(); + response.setMessage(DEFAULT_MESSAGE + ": " + message); + return response; + } +} diff --git a/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/InvalidTradeException.java b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/InvalidTradeException.java new file mode 100644 index 0000000000..11277c048a --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/InvalidTradeException.java @@ -0,0 +1,17 @@ +package com.baeldung.jersey.exceptionhandling.rest.exceptions; + +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Response; + +public class InvalidTradeException extends WebApplicationException { + private static final long serialVersionUID = 1L; + private static final String MESSAGE = "invalid trade operation"; + + public InvalidTradeException() { + super(MESSAGE, Response.Status.NOT_ACCEPTABLE); + } + + public InvalidTradeException(String detail) { + super(MESSAGE + ": " + detail, Response.Status.NOT_ACCEPTABLE); + } +} diff --git a/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/RestErrorResponse.java b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/RestErrorResponse.java new file mode 100644 index 0000000000..dd193ab059 --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/RestErrorResponse.java @@ -0,0 +1,34 @@ +package com.baeldung.jersey.exceptionhandling.rest.exceptions; + +public class RestErrorResponse { + private Object subject; + private String message; + + public RestErrorResponse() { + } + + public RestErrorResponse(String message) { + this.message = message; + } + + public RestErrorResponse(Object subject, String message) { + this.subject = subject; + this.message = message; + } + + public Object getSubject() { + return subject; + } + + public void setSubject(Object subject) { + this.subject = subject; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/ServerExceptionMapper.java b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/ServerExceptionMapper.java new file mode 100644 index 0000000000..a6e9cc7f39 --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/ServerExceptionMapper.java @@ -0,0 +1,35 @@ +package com.baeldung.jersey.exceptionhandling.rest.exceptions; + +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; +import javax.ws.rs.ext.ExceptionMapper; + +public class ServerExceptionMapper implements ExceptionMapper { + public static final String HTTP_405_MESSAGE = "METHOD_NOT_ALLOWED"; + + @Override + public Response toResponse(final WebApplicationException exception) { + String message = exception.getMessage(); + Response response = exception.getResponse(); + Status status = response.getStatusInfo() + .toEnum(); + + switch (status) { + case METHOD_NOT_ALLOWED: + message = HTTP_405_MESSAGE; + break; + case INTERNAL_SERVER_ERROR: + message = "internal validation - " + exception; + break; + default: + message = "[unhandled response code] " + exception; + } + + return Response.status(status) + .entity(status + ": " + message) + .type(MediaType.TEXT_PLAIN) + .build(); + } +} diff --git a/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/service/Repository.java b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/service/Repository.java new file mode 100644 index 0000000000..459b062068 --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/service/Repository.java @@ -0,0 +1,10 @@ +package com.baeldung.jersey.exceptionhandling.service; + +import com.baeldung.jersey.exceptionhandling.data.Stock; +import com.baeldung.jersey.exceptionhandling.data.Wallet; +import com.baeldung.jersey.exceptionhandling.repo.Db; + +public class Repository { + public static Db STOCKS_DB = new Db<>(); + public static Db WALLETS_DB = new Db<>(); +} diff --git a/jersey/src/test/java/com/baeldung/jersey/exceptionhandling/rest/StocksResourceIntegrationTest.java b/jersey/src/test/java/com/baeldung/jersey/exceptionhandling/rest/StocksResourceIntegrationTest.java new file mode 100644 index 0000000000..1648116918 --- /dev/null +++ b/jersey/src/test/java/com/baeldung/jersey/exceptionhandling/rest/StocksResourceIntegrationTest.java @@ -0,0 +1,99 @@ +package com.baeldung.jersey.exceptionhandling.rest; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.startsWith; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +import java.util.HashMap; + +import javax.ws.rs.client.Entity; +import javax.ws.rs.client.Invocation; +import javax.ws.rs.core.Application; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; + +import org.glassfish.jersey.test.JerseyTest; +import org.junit.Test; + +import com.baeldung.jersey.exceptionhandling.ExceptionHandlingConfig; +import com.baeldung.jersey.exceptionhandling.data.Stock; +import com.baeldung.jersey.exceptionhandling.data.Wallet; +import com.baeldung.jersey.exceptionhandling.rest.exceptions.IllegalArgumentExceptionMapper; +import com.baeldung.jersey.exceptionhandling.rest.exceptions.RestErrorResponse; +import com.baeldung.jersey.exceptionhandling.rest.exceptions.ServerExceptionMapper; + +public class StocksResourceIntegrationTest extends JerseyTest { + private static final Entity EMPTY_BODY = Entity.json(""); + private static final Stock STOCK = new Stock("BAEL", 51.57); + private static final String MY_WALLET = "MY-WALLET"; + private static final Wallet WALLET = new Wallet(MY_WALLET); + private static final int INSUFFICIENT_AMOUNT = (int) (Wallet.MIN_CHARGE - 1); + + @Override + protected Application configure() { + return new ExceptionHandlingConfig(); + } + + private Invocation.Builder stocks(String path) { + return target("/stocks" + path).request(); + } + + private Invocation.Builder wallets(String path, Object... args) { + return target("/wallets" + String.format(path, args)).request(); + } + + private Entity entity(Object object) { + return Entity.entity(object, MediaType.APPLICATION_JSON_TYPE); + } + + @Test + public void whenMethodNotAllowed_thenCustomMessage() { + Response response = stocks("").get(); + + assertEquals(Status.METHOD_NOT_ALLOWED.getStatusCode(), response.getStatus()); + + String content = response.readEntity(String.class); + assertThat(content, containsString(ServerExceptionMapper.HTTP_405_MESSAGE)); + } + + @Test + public void whenTickerNotExists_thenRestErrorResponse() { + Response response = stocks("/UNDEFINED").get(); + + assertEquals(Status.EXPECTATION_FAILED.getStatusCode(), response.getStatus()); + + RestErrorResponse content = response.readEntity(RestErrorResponse.class); + assertThat(content.getMessage(), startsWith(IllegalArgumentExceptionMapper.DEFAULT_MESSAGE)); + } + + @Test + public void givenAmountLessThanMinimum_whenAddingToWallet_thenInvalidTradeException() { + wallets("").post(entity(WALLET)); + Response response = wallets("/%s/%d", MY_WALLET, INSUFFICIENT_AMOUNT).put(EMPTY_BODY); + + assertEquals(Status.NOT_ACCEPTABLE.getStatusCode(), response.getStatus()); + + String content = response.readEntity(String.class); + assertThat(content, containsString(Wallet.MIN_CHARGE_MSG)); + } + + @Test + public void givenInsifficientFunds_whenBuyingStock_thenWebApplicationException() { + stocks("").post(entity(STOCK)); + wallets("").post(entity(WALLET)); + + Response response = wallets("/%s/buy/%s", MY_WALLET, STOCK.getId()).post(EMPTY_BODY); + assertEquals(Status.NOT_ACCEPTABLE.getStatusCode(), response.getStatus()); + + RestErrorResponse content = response.readEntity(RestErrorResponse.class); + assertNotNull(content.getSubject()); + + HashMap subject = (HashMap) content.getSubject(); + assertEquals(subject.get("id"), WALLET.getId()); + assertTrue(WALLET.getBalance() < Wallet.MIN_CHARGE); + } +} From 55deea7849ea93a724c8941f235d30a425eefcdc Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Mon, 11 Apr 2022 19:16:04 +0100 Subject: [PATCH 026/278] [JAVA-11283] Use https link for short url --- httpclient-2/README.md | 2 +- .../httpclient/expandurl/HttpClientExpandUrlLiveTest.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/httpclient-2/README.md b/httpclient-2/README.md index 695a92ce00..571a45f207 100644 --- a/httpclient-2/README.md +++ b/httpclient-2/README.md @@ -12,5 +12,5 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Reading an HTTP Response Body as a String in Java](https://www.baeldung.com/java-http-response-body-as-string) - [How To Get Cookies From the Apache HttpClient Response](https://www.baeldung.com/java-apache-httpclient-cookies) - [Enabling Logging for Apache HttpClient](https://www.baeldung.com/apache-httpclient-enable-logging) -- [Expand Shortened URLs with Apache HttpClient](https://www.baeldung.com/unshorten-url-httpclient) +- [Expand Shortened URLs with Apache HttpClient](https://www.baeldung.com/apache-httpclient-expand-url) - More articles: [[<-- prev]](../httpclient) diff --git a/httpclient-2/src/test/java/com/baeldung/httpclient/expandurl/HttpClientExpandUrlLiveTest.java b/httpclient-2/src/test/java/com/baeldung/httpclient/expandurl/HttpClientExpandUrlLiveTest.java index fb3d730ec4..5a8c87f4aa 100644 --- a/httpclient-2/src/test/java/com/baeldung/httpclient/expandurl/HttpClientExpandUrlLiveTest.java +++ b/httpclient-2/src/test/java/com/baeldung/httpclient/expandurl/HttpClientExpandUrlLiveTest.java @@ -33,8 +33,8 @@ public class HttpClientExpandUrlLiveTest { @Test public final void givenShortenedOnce_whenUrlIsExpanded_thenCorrectResult() throws IOException { - final String expectedResult = "http://www.baeldung.com/rest-versioning"; - final String actualResult = expandSingleLevel("http://bit.ly/13jEoS1"); + final String expectedResult = "https://www.baeldung.com/rest-versioning"; + final String actualResult = expandSingleLevel("http://bit.ly/3LScTri"); assertThat(actualResult, equalTo(expectedResult)); } From add090f2e1a4ccb73e9a434d985432cb94b30a9c Mon Sep 17 00:00:00 2001 From: sanitaso <98709855+sanitaso@users.noreply.github.com> Date: Tue, 12 Apr 2022 05:15:51 +0200 Subject: [PATCH 027/278] BAEL-5416 How to Store HashMap Inside a List (#12047) * add unit test * fix the error * correcting the name of the test * trigger build process --- .../ListOfHashMapsUnitTest.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 core-java-modules/core-java-collections-list/src/test/java/com/baeldung/list/listOfHashMaps/ListOfHashMapsUnitTest.java diff --git a/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/list/listOfHashMaps/ListOfHashMapsUnitTest.java b/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/list/listOfHashMaps/ListOfHashMapsUnitTest.java new file mode 100644 index 0000000000..39110aedd3 --- /dev/null +++ b/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/list/listOfHashMaps/ListOfHashMapsUnitTest.java @@ -0,0 +1,36 @@ +package test.java.com.baeldung.list.listOfHashMaps; + +import org.junit.Test; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.stream.Collectors; + +import static org.junit.Assert.assertTrue; + +public class ListOfHashMapsUnitTest { + List>> booksAuthorsMapsList = new ArrayList<>(); + + @Test + public void givenMaps_whenAddToList_thenListContainsMaps() { + HashMap> javaBooksAuthorsMap = new HashMap<>(); + HashMap> phpBooksAuthorsMap = new HashMap<>(); + javaBooksAuthorsMap.put("Head First Java", Arrays.asList("Kathy Sierra", "Bert Bates")); + javaBooksAuthorsMap.put("Effective Java", Arrays.asList("Joshua Bloch")); + javaBooksAuthorsMap.put("OCA Java SE 8", + Arrays.asList("Kathy Sierra", "Bert Bates", "Elisabeth Robson")); + phpBooksAuthorsMap.put("The Joy of PHP", Arrays.asList("Alan Forbes")); + phpBooksAuthorsMap.put("Head First PHP & MySQL", + Arrays.asList("Lynn Beighley", "Michael Morrison")); + + booksAuthorsMapsList.add(javaBooksAuthorsMap); + booksAuthorsMapsList.add(phpBooksAuthorsMap); + + assertTrue(booksAuthorsMapsList.get(0).keySet().containsAll + (javaBooksAuthorsMap.keySet().stream().collect(Collectors.toList()))); + assertTrue(booksAuthorsMapsList.get(1).keySet().containsAll + (phpBooksAuthorsMap.keySet().stream().collect(Collectors.toList()))); + } +} From f16bd2b949882a63acf4607ace610054b6e6dcc5 Mon Sep 17 00:00:00 2001 From: opokharel <66694687+opokharel@users.noreply.github.com> Date: Mon, 11 Apr 2022 21:17:54 -0600 Subject: [PATCH 028/278] [BAEL-5518] Create Array of Regex Matches (#12052) * opokharel's code for "A quick and practical example of Hexagonal Architecture in Java" * opokharel - added unit Tests * [BAEL-5518] by @opokharel * updated Files * updated formatting * whitespaceFix * [BAEL-5518] Create Array of Regex Matches * reCreatingPR --- .../src/regex/array/RegexMatches.java | 24 ++++++++++++++ .../regex/array/RegexMatchesUnitTest.java | 33 +++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 regexMatchesToArray/src/regex/array/RegexMatches.java create mode 100644 regexMatchesToArray/test/regex/array/RegexMatchesUnitTest.java diff --git a/regexMatchesToArray/src/regex/array/RegexMatches.java b/regexMatchesToArray/src/regex/array/RegexMatches.java new file mode 100644 index 0000000000..d7b50d95ca --- /dev/null +++ b/regexMatchesToArray/src/regex/array/RegexMatches.java @@ -0,0 +1,24 @@ +package regex.array; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.*; + +class RegexMatches { + + String[] regexMatch(String strSearch) + { + List matchesList = new ArrayList(); + String stringToSearch = strSearch; + Pattern p1 = Pattern.compile("780{1}\\d{7}"); + Matcher m1 = p1.matcher(stringToSearch); + while (m1.find()) + { + matchesList.add(m1.group()); + } + int sizeOfNewArray = matchesList.size(); + String newArrayOfMatches[] = new String[sizeOfNewArray]; + matchesList.toArray(newArrayOfMatches); + return newArrayOfMatches; + } +} diff --git a/regexMatchesToArray/test/regex/array/RegexMatchesUnitTest.java b/regexMatchesToArray/test/regex/array/RegexMatchesUnitTest.java new file mode 100644 index 0000000000..3e8f23c4bb --- /dev/null +++ b/regexMatchesToArray/test/regex/array/RegexMatchesUnitTest.java @@ -0,0 +1,33 @@ +package regex.array; + +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; + +import regex.array.RegexMatches; + +class RegexMatchesUnitTest { + + @Test + void whenFourNums_thenFourMatches() { + RegexMatches rm = new RegexMatches(); + String actual[] = rm.regexMatch("7801111211fsdafasdfa 7802222222 sadfsadfsda7803333333 sadfdasfasd 7804444444"); + + assertArrayEquals(new String[] {"7801111211", "7802222222", "7803333333", "7804444444"}, actual, "success"); + } + + @Test + void whenThreeNums_thenThreeMatches() { + RegexMatches rm = new RegexMatches(); + String actual[] = rm.regexMatch("7801111211fsdafasdfa 780222222 sadfsadfsda7803333333 sadfdasfasd 7804444444"); + + assertArrayEquals(new String[] {"7801111211", "7803333333", "7804444444"}, actual, "success"); + } + + @Test + void whenZeroNums_thenZeroMatches() { + RegexMatches rm = new RegexMatches(); + String actual[] = rm.regexMatch("78011111fsdafasdfa 780222222 sadfsadfsda78033333 sadfdasfasd 7804444"); + + assertArrayEquals(new String[] {}, actual, "success"); + } +} From 3c2b8bb1f13acdc56e605b8e099677b965e0a2c4 Mon Sep 17 00:00:00 2001 From: 515882294 <515882294@qq.com> Date: Tue, 12 Apr 2022 16:39:47 +0800 Subject: [PATCH 029/278] BAEL-1699 - modify code comment typo --- .../baeldung-agent/com/baeldung/agent/LoadTimeAgent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-agent/com/baeldung/agent/LoadTimeAgent.java b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-agent/com/baeldung/agent/LoadTimeAgent.java index a2ec9c3d4a..33d9a231ea 100644 --- a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-agent/com/baeldung/agent/LoadTimeAgent.java +++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-agent/com/baeldung/agent/LoadTimeAgent.java @@ -60,7 +60,7 @@ public class LoadTimeAgent { // prepare extra uses Set> extraUses = Collections.emptySet(); - // prepare extra uses + // prepare extra provides Map, List>> extraProvides = Collections.emptyMap(); // redefine module From 35fd43e5778330c0d148606065bf28f91c75a880 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Tue, 12 Apr 2022 20:43:57 +0530 Subject: [PATCH 030/278] JAVA-10625: Remove module immutables --- immutables/README.md | 6 ---- immutables/pom.xml | 34 ------------------- immutables/src/main/resources/logback.xml | 13 ------- libraries-3/README.md | 1 + libraries-3/pom.xml | 13 +++++++ .../java/com/baeldung/immutable/Address.java | 0 .../java/com/baeldung/immutable/Person.java | 0 .../baeldung/immutable/auxiliary/Person.java | 0 .../baeldung/immutable/default_/Person.java | 0 .../baeldung/immutable/parameter/Person.java | 0 .../baeldung/immutable/prehash/Person.java | 0 .../immutable/ImmutablePersonUnitTest.java | 0 .../ImmutablePersonAuxiliaryUnitTest.java | 0 .../ImmutablePersonDefaultUnitTest.java | 0 14 files changed, 14 insertions(+), 53 deletions(-) delete mode 100644 immutables/README.md delete mode 100644 immutables/pom.xml delete mode 100644 immutables/src/main/resources/logback.xml rename {immutables => libraries-3}/src/main/java/com/baeldung/immutable/Address.java (100%) rename {immutables => libraries-3}/src/main/java/com/baeldung/immutable/Person.java (100%) rename {immutables => libraries-3}/src/main/java/com/baeldung/immutable/auxiliary/Person.java (100%) rename {immutables => libraries-3}/src/main/java/com/baeldung/immutable/default_/Person.java (100%) rename {immutables => libraries-3}/src/main/java/com/baeldung/immutable/parameter/Person.java (100%) rename {immutables => libraries-3}/src/main/java/com/baeldung/immutable/prehash/Person.java (100%) rename {immutables => libraries-3}/src/test/java/com/baeldung/immutable/ImmutablePersonUnitTest.java (100%) rename {immutables => libraries-3}/src/test/java/com/baeldung/immutable/auxiliary/ImmutablePersonAuxiliaryUnitTest.java (100%) rename {immutables => libraries-3}/src/test/java/com/baeldung/immutable/default_/ImmutablePersonDefaultUnitTest.java (100%) diff --git a/immutables/README.md b/immutables/README.md deleted file mode 100644 index a93a342f9c..0000000000 --- a/immutables/README.md +++ /dev/null @@ -1,6 +0,0 @@ -## Immutables - -This module contains articles about the Immutables library. - -### Relevant Articles: -- [Introduction to Immutables](https://www.baeldung.com/immutables) diff --git a/immutables/pom.xml b/immutables/pom.xml deleted file mode 100644 index 7704cddbb6..0000000000 --- a/immutables/pom.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - 4.0.0 - immutables - immutables - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - - - - org.immutables - value - ${immutables.version} - - - org.mutabilitydetector - MutabilityDetector - ${mutabilitydetector.version} - test - - - - - 2.5.6 - 0.9.6 - - - \ No newline at end of file diff --git a/immutables/src/main/resources/logback.xml b/immutables/src/main/resources/logback.xml deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/immutables/src/main/resources/logback.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - - \ No newline at end of file diff --git a/libraries-3/README.md b/libraries-3/README.md index 047d6738a1..b267e82ed9 100644 --- a/libraries-3/README.md +++ b/libraries-3/README.md @@ -17,4 +17,5 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m - [Using NullAway to Avoid NullPointerExceptions](https://www.baeldung.com/java-nullaway) - [Introduction to Alibaba Arthas](https://www.baeldung.com/java-alibaba-arthas-intro) - [Introduction to Structurizr](https://www.baeldung.com/structurizr) +- [Introduction to Immutables](https://www.baeldung.com/immutables) - More articles [[<-- prev]](../libraries-2) [[next -->]](../libraries-4) diff --git a/libraries-3/pom.xml b/libraries-3/pom.xml index e38aecd879..c51b264e83 100644 --- a/libraries-3/pom.xml +++ b/libraries-3/pom.xml @@ -112,6 +112,17 @@ structurizr-plantuml ${structurizr.version} + + org.immutables + value + ${immutables.version} + + + org.mutabilitydetector + MutabilityDetector + ${mutabilitydetector.version} + test + @@ -256,6 +267,8 @@ 2.8 2.1.3 1.0.0 + 2.5.6 + 0.9.6 \ No newline at end of file diff --git a/immutables/src/main/java/com/baeldung/immutable/Address.java b/libraries-3/src/main/java/com/baeldung/immutable/Address.java similarity index 100% rename from immutables/src/main/java/com/baeldung/immutable/Address.java rename to libraries-3/src/main/java/com/baeldung/immutable/Address.java diff --git a/immutables/src/main/java/com/baeldung/immutable/Person.java b/libraries-3/src/main/java/com/baeldung/immutable/Person.java similarity index 100% rename from immutables/src/main/java/com/baeldung/immutable/Person.java rename to libraries-3/src/main/java/com/baeldung/immutable/Person.java diff --git a/immutables/src/main/java/com/baeldung/immutable/auxiliary/Person.java b/libraries-3/src/main/java/com/baeldung/immutable/auxiliary/Person.java similarity index 100% rename from immutables/src/main/java/com/baeldung/immutable/auxiliary/Person.java rename to libraries-3/src/main/java/com/baeldung/immutable/auxiliary/Person.java diff --git a/immutables/src/main/java/com/baeldung/immutable/default_/Person.java b/libraries-3/src/main/java/com/baeldung/immutable/default_/Person.java similarity index 100% rename from immutables/src/main/java/com/baeldung/immutable/default_/Person.java rename to libraries-3/src/main/java/com/baeldung/immutable/default_/Person.java diff --git a/immutables/src/main/java/com/baeldung/immutable/parameter/Person.java b/libraries-3/src/main/java/com/baeldung/immutable/parameter/Person.java similarity index 100% rename from immutables/src/main/java/com/baeldung/immutable/parameter/Person.java rename to libraries-3/src/main/java/com/baeldung/immutable/parameter/Person.java diff --git a/immutables/src/main/java/com/baeldung/immutable/prehash/Person.java b/libraries-3/src/main/java/com/baeldung/immutable/prehash/Person.java similarity index 100% rename from immutables/src/main/java/com/baeldung/immutable/prehash/Person.java rename to libraries-3/src/main/java/com/baeldung/immutable/prehash/Person.java diff --git a/immutables/src/test/java/com/baeldung/immutable/ImmutablePersonUnitTest.java b/libraries-3/src/test/java/com/baeldung/immutable/ImmutablePersonUnitTest.java similarity index 100% rename from immutables/src/test/java/com/baeldung/immutable/ImmutablePersonUnitTest.java rename to libraries-3/src/test/java/com/baeldung/immutable/ImmutablePersonUnitTest.java diff --git a/immutables/src/test/java/com/baeldung/immutable/auxiliary/ImmutablePersonAuxiliaryUnitTest.java b/libraries-3/src/test/java/com/baeldung/immutable/auxiliary/ImmutablePersonAuxiliaryUnitTest.java similarity index 100% rename from immutables/src/test/java/com/baeldung/immutable/auxiliary/ImmutablePersonAuxiliaryUnitTest.java rename to libraries-3/src/test/java/com/baeldung/immutable/auxiliary/ImmutablePersonAuxiliaryUnitTest.java diff --git a/immutables/src/test/java/com/baeldung/immutable/default_/ImmutablePersonDefaultUnitTest.java b/libraries-3/src/test/java/com/baeldung/immutable/default_/ImmutablePersonDefaultUnitTest.java similarity index 100% rename from immutables/src/test/java/com/baeldung/immutable/default_/ImmutablePersonDefaultUnitTest.java rename to libraries-3/src/test/java/com/baeldung/immutable/default_/ImmutablePersonDefaultUnitTest.java From 230992c2a0788f8366769d854cb8cbf5dd1ab1cc Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Tue, 12 Apr 2022 20:44:42 +0530 Subject: [PATCH 031/278] remove immutables from main pom --- pom.xml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 441cf0e580..21589f5525 100644 --- a/pom.xml +++ b/pom.xml @@ -432,8 +432,6 @@ httpclient-simple hystrix - immutables - jackson-modules jackson-simple java-blockchain @@ -916,9 +914,7 @@ helidon httpclient httpclient-simple - hystrix - - immutables + hystrix jackson-modules jackson-simple From 266c908abf3a22a2d987b15dfe9820216b94f88b Mon Sep 17 00:00:00 2001 From: opokharel <66694687+opokharel@users.noreply.github.com> Date: Tue, 12 Apr 2022 18:25:50 -0600 Subject: [PATCH 032/278] new PR to replace PR# 12052 by @opokharel (#12054) * opokharel's code for "A quick and practical example of Hexagonal Architecture in Java" * opokharel - added unit Tests * [BAEL-5518] by @opokharel * updated Files * updated formatting * whitespaceFix * [BAEL-5518] Create Array of Regex Matches * reCreatingPR * new PR to replace PR# 12052 * moving to new locn --- .../src/regex/array/RegexMatches.java | 24 ++++++++++++++ .../regex/array/RegexMatchesUnitTest.java | 33 +++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 core-java-modules/core-java-regex-2/regexMatchToArray/src/regex/array/RegexMatches.java create mode 100644 core-java-modules/core-java-regex-2/regexMatchToArray/test/regex/array/RegexMatchesUnitTest.java diff --git a/core-java-modules/core-java-regex-2/regexMatchToArray/src/regex/array/RegexMatches.java b/core-java-modules/core-java-regex-2/regexMatchToArray/src/regex/array/RegexMatches.java new file mode 100644 index 0000000000..d7b50d95ca --- /dev/null +++ b/core-java-modules/core-java-regex-2/regexMatchToArray/src/regex/array/RegexMatches.java @@ -0,0 +1,24 @@ +package regex.array; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.*; + +class RegexMatches { + + String[] regexMatch(String strSearch) + { + List matchesList = new ArrayList(); + String stringToSearch = strSearch; + Pattern p1 = Pattern.compile("780{1}\\d{7}"); + Matcher m1 = p1.matcher(stringToSearch); + while (m1.find()) + { + matchesList.add(m1.group()); + } + int sizeOfNewArray = matchesList.size(); + String newArrayOfMatches[] = new String[sizeOfNewArray]; + matchesList.toArray(newArrayOfMatches); + return newArrayOfMatches; + } +} diff --git a/core-java-modules/core-java-regex-2/regexMatchToArray/test/regex/array/RegexMatchesUnitTest.java b/core-java-modules/core-java-regex-2/regexMatchToArray/test/regex/array/RegexMatchesUnitTest.java new file mode 100644 index 0000000000..3e8f23c4bb --- /dev/null +++ b/core-java-modules/core-java-regex-2/regexMatchToArray/test/regex/array/RegexMatchesUnitTest.java @@ -0,0 +1,33 @@ +package regex.array; + +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; + +import regex.array.RegexMatches; + +class RegexMatchesUnitTest { + + @Test + void whenFourNums_thenFourMatches() { + RegexMatches rm = new RegexMatches(); + String actual[] = rm.regexMatch("7801111211fsdafasdfa 7802222222 sadfsadfsda7803333333 sadfdasfasd 7804444444"); + + assertArrayEquals(new String[] {"7801111211", "7802222222", "7803333333", "7804444444"}, actual, "success"); + } + + @Test + void whenThreeNums_thenThreeMatches() { + RegexMatches rm = new RegexMatches(); + String actual[] = rm.regexMatch("7801111211fsdafasdfa 780222222 sadfsadfsda7803333333 sadfdasfasd 7804444444"); + + assertArrayEquals(new String[] {"7801111211", "7803333333", "7804444444"}, actual, "success"); + } + + @Test + void whenZeroNums_thenZeroMatches() { + RegexMatches rm = new RegexMatches(); + String actual[] = rm.regexMatch("78011111fsdafasdfa 780222222 sadfsadfsda78033333 sadfdasfasd 7804444"); + + assertArrayEquals(new String[] {}, actual, "success"); + } +} From 2c72a1e42cd4a2947a5cde2433bf2e2ce01c334b Mon Sep 17 00:00:00 2001 From: Kapil Khandelwal Date: Wed, 13 Apr 2022 05:56:26 +0530 Subject: [PATCH 033/278] BAEL-5369: Checking Connection to MongoDB (#12057) --- .../com/baeldung/mongo/ConnectionCheck.java | 46 ++++++++++++++++++ .../mongo/ConnectionCheckLiveTest.java | 47 +++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 persistence-modules/java-mongodb-2/src/main/java/com/baeldung/mongo/ConnectionCheck.java create mode 100644 persistence-modules/java-mongodb-2/src/test/java/com/baeldung/mongo/ConnectionCheckLiveTest.java diff --git a/persistence-modules/java-mongodb-2/src/main/java/com/baeldung/mongo/ConnectionCheck.java b/persistence-modules/java-mongodb-2/src/main/java/com/baeldung/mongo/ConnectionCheck.java new file mode 100644 index 0000000000..240e54ab99 --- /dev/null +++ b/persistence-modules/java-mongodb-2/src/main/java/com/baeldung/mongo/ConnectionCheck.java @@ -0,0 +1,46 @@ +package com.baeldung; + +import com.mongodb.DB; +import com.mongodb.MongoClient; +import com.mongodb.MongoClientOptions; +import com.mongodb.ServerAddress; + +public class ConnectionCheck { + + public static void checkingConnection() { + + MongoClientOptions.Builder builder = MongoClientOptions.builder(); + + builder.connectionsPerHost(100); + builder.maxWaitTime(60000); + builder.connectTimeout(1500); + builder.socketTimeout(60000); + builder.socketKeepAlive(true); + + ServerAddress ServerAddress = new ServerAddress("localhost", 27017); + MongoClient mongoClient = new MongoClient(ServerAddress, builder.build()); + + try { + System.out.println("MongoDB Server is Up:- " + mongoClient.getAddress()); + DB db = mongoClient.getDB("baeldung"); + System.out.println(mongoClient.getConnectPoint()); + System.out.println(db.getStats()); + } catch (Exception e) { + System.out.println("MongoDB Server is Down"); + mongoClient.close(); + } + + } + + public static void main(String[] args) { + + // + // Connection check + // + + checkingConnection(); + + } + +} + diff --git a/persistence-modules/java-mongodb-2/src/test/java/com/baeldung/mongo/ConnectionCheckLiveTest.java b/persistence-modules/java-mongodb-2/src/test/java/com/baeldung/mongo/ConnectionCheckLiveTest.java new file mode 100644 index 0000000000..69f356997c --- /dev/null +++ b/persistence-modules/java-mongodb-2/src/test/java/com/baeldung/mongo/ConnectionCheckLiveTest.java @@ -0,0 +1,47 @@ +package com.baeldung.mongo; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; + +import org.junit.BeforeClass; +import org.junit.Test; + +import com.mongodb.MongoClient; +import com.mongodb.MongoClientOptions; +import com.mongodb.ServerAddress; + +public class ConnectionCheckLiveTest { + + private static MongoClient mongoClient; + private static MongoClientOptions.Builder builder; + private static ServerAddress ServerAddress; + + @BeforeClass + public static void setup() throws IOException { + if (mongoClient == null) { + + builder = MongoClientOptions.builder(); + builder.connectionsPerHost(100); + builder.maxWaitTime(60000); + builder.connectTimeout(1500); + builder.socketTimeout(60000); + builder.socketKeepAlive(true); + + ServerAddress = new ServerAddress("localhost", 27017); + mongoClient = new MongoClient(ServerAddress, builder.build()); + + } + } + + @Test + public void givenMongoClient_whenConnectionCheck_thenCheckingForConnectionPoint() { + + String connectionPoint = mongoClient.getConnectPoint(); + assertNotNull(connectionPoint); + assertFalse(connectionPoint.isEmpty()); + + } +} + From 1a5990f62da892c57d6f0df84a54926588b5c016 Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Wed, 13 Apr 2022 05:43:12 +0500 Subject: [PATCH 034/278] Updated README.md added link back o the article: https://www.baeldung.com/jmeter-basic-auth --- jmeter/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/jmeter/README.md b/jmeter/README.md index 6fdc79a2ce..23614307bd 100644 --- a/jmeter/README.md +++ b/jmeter/README.md @@ -53,3 +53,4 @@ Enjoy it :) - [Intro to Performance Testing using JMeter](https://www.baeldung.com/jmeter) - [Configure Jenkins to Run and Show JMeter Tests](https://www.baeldung.com/ops/jenkins-and-jmeter) - [Write Extracted Data to a File Using JMeter](https://www.baeldung.com/jmeter-write-to-file) +- [Basic Authentication in JMeter](https://www.baeldung.com/jmeter-basic-auth) From 396db57d4e9e11e76f70211158c211200453d24d Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Wed, 13 Apr 2022 05:49:40 +0500 Subject: [PATCH 035/278] Updated README.md added link back to the article: https://www.baeldung.com/spring-singleton-concurrent-requests --- spring-core-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-core-5/README.md b/spring-core-5/README.md index b6c9ba606a..ebf62ac24f 100644 --- a/spring-core-5/README.md +++ b/spring-core-5/README.md @@ -10,4 +10,5 @@ This module contains articles about core Spring functionality. - [AliasFor Annotation in Spring](https://www.baeldung.com/spring-aliasfor-annotation) - [A Quick Guide to the Spring @Lazy Annotation](https://www.baeldung.com/spring-lazy-annotation) - [Finding the Spring Version](https://www.baeldung.com/spring-find-version) +- [How Does the Spring Singleton Bean Serve Concurrent Requests?](https://www.baeldung.com/spring-singleton-concurrent-requests) - More articles: [[<-- prev]](../spring-core-4) From a8fca31d661a326aacd93562357eaabffd661a33 Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Wed, 13 Apr 2022 05:54:09 +0500 Subject: [PATCH 036/278] Updated README.md added link back to the article: https://www.baeldung.com/jpa-bootstrap-mode --- spring-boot-modules/spring-boot-data-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-modules/spring-boot-data-2/README.md b/spring-boot-modules/spring-boot-data-2/README.md index c01c54e29e..fd9d034f8a 100644 --- a/spring-boot-modules/spring-boot-data-2/README.md +++ b/spring-boot-modules/spring-boot-data-2/README.md @@ -5,3 +5,4 @@ - [“HttpMessageNotWritableException: No converter found for return value of type”](https://www.baeldung.com/spring-no-converter-found) - [Creating a Read-Only Repository with Spring Data](https://www.baeldung.com/spring-data-read-only-repository) - [Using JaVers for Data Model Auditing in Spring Data](https://www.baeldung.com/spring-data-javers-audit) +- [BootstrapMode for JPA Repositories](https://github.com/eugenp/tutorials/tree/master/spring-boot-modules/spring-boot-data-2) From 789dc0d8fcac942763c0bd86a56de1782d23cbdb Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Wed, 13 Apr 2022 05:57:21 +0500 Subject: [PATCH 037/278] Updated README.md added link back to the article: https://www.baeldung.com/java-human-readable-byte-size --- java-numbers-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/java-numbers-4/README.md b/java-numbers-4/README.md index a6d866218c..95d46203ab 100644 --- a/java-numbers-4/README.md +++ b/java-numbers-4/README.md @@ -5,3 +5,4 @@ - [Determine if an Integer’s Square Root Is an Integer in Java](https://www.baeldung.com/java-find-if-square-root-is-integer) - [Guide to Java BigInteger](https://www.baeldung.com/java-biginteger) - [Automorphic Numbers in Java](https://www.baeldung.com/java-automorphic-numbers) +- [Convert Byte Size Into a Human-Readable Format in Java](https://www.baeldung.com/java-human-readable-byte-size) From d7fdaaf92fcabb6f6ed2b84a4ca8c20369c85c93 Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Wed, 13 Apr 2022 09:47:32 +0500 Subject: [PATCH 038/278] Updated README.md added link back to the article: https://www.baeldung.com/apache-httpclient-vs-closeablehttpclient --- httpclient-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/httpclient-2/README.md b/httpclient-2/README.md index 571a45f207..2e101a0609 100644 --- a/httpclient-2/README.md +++ b/httpclient-2/README.md @@ -13,4 +13,5 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [How To Get Cookies From the Apache HttpClient Response](https://www.baeldung.com/java-apache-httpclient-cookies) - [Enabling Logging for Apache HttpClient](https://www.baeldung.com/apache-httpclient-enable-logging) - [Expand Shortened URLs with Apache HttpClient](https://www.baeldung.com/apache-httpclient-expand-url) +- [Apache HttpClient vs. CloseableHttpClient](https://www.baeldung.com/apache-httpclient-vs-closeablehttpclient) - More articles: [[<-- prev]](../httpclient) From 9f8d01175b9e54321f4d3079829ecf21fadf37a3 Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Wed, 13 Apr 2022 09:50:50 +0500 Subject: [PATCH 039/278] Updated README.md added link back to the article: https://www.baeldung.com/mongodb-return-specific-fields --- persistence-modules/spring-boot-persistence-mongodb/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/spring-boot-persistence-mongodb/README.md b/persistence-modules/spring-boot-persistence-mongodb/README.md index 91dd8718e1..6659e82677 100644 --- a/persistence-modules/spring-boot-persistence-mongodb/README.md +++ b/persistence-modules/spring-boot-persistence-mongodb/README.md @@ -8,3 +8,4 @@ - [A Guide to @DBRef in MongoDB](https://www.baeldung.com/spring-mongodb-dbref-annotation) - [Import Data to MongoDB From JSON File Using Java](https://www.baeldung.com/java-import-json-mongodb) - [Logging MongoDB Queries with Spring Boot](https://www.baeldung.com/spring-boot-mongodb-logging) +- [Return Only Specific Fields for a Query in Spring Data MongoDB](https://www.baeldung.com/mongodb-return-specific-fields) From 1e519eb47efeb6f011f900b91920b71457b59225 Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Wed, 13 Apr 2022 09:53:15 +0500 Subject: [PATCH 040/278] Updated README.md added link back to the article: https://www.baeldung.com/java-hql-distinct --- persistence-modules/hibernate-queries/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/hibernate-queries/README.md b/persistence-modules/hibernate-queries/README.md index f1bc1cba0f..ac52e73abf 100644 --- a/persistence-modules/hibernate-queries/README.md +++ b/persistence-modules/hibernate-queries/README.md @@ -10,3 +10,4 @@ This module contains articles about use of Queries in Hibernate. - [Hibernate Named Query](https://www.baeldung.com/hibernate-named-query) - [Hibernate Query Plan Cache](https://www.baeldung.com/hibernate-query-plan-cache) - [Hibernate’s addScalar() Method](https://www.baeldung.com/hibernate-addscalar) +- [Distinct Queries in HQL](https://www.baeldung.com/java-hql-distinct) From 96a62ee2de9c945cef2473e6cfd8cb6fc7afe592 Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Wed, 13 Apr 2022 09:56:02 +0500 Subject: [PATCH 041/278] Updated README.md added link back to the article: https://www.baeldung.com/java-illegal-reflective-access --- core-java-modules/core-java-9-jigsaw/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-9-jigsaw/README.md b/core-java-modules/core-java-9-jigsaw/README.md index b1a401d48c..cfffb86588 100644 --- a/core-java-modules/core-java-9-jigsaw/README.md +++ b/core-java-modules/core-java-9-jigsaw/README.md @@ -7,5 +7,6 @@ This module contains articles about Project Jigsaw and the Java Platform Module - [Introduction to Project Jigsaw](http://www.baeldung.com/project-jigsaw-java-modularity) - [A Guide to Java 9 Modularity](https://www.baeldung.com/java-9-modularity) - [Java 9 java.lang.Module API](https://www.baeldung.com/java-9-module-api) +- [Java 9 Illegal Reflective Access Warning](https://www.baeldung.com/java-illegal-reflective-access) From 598d0e41ab9cd6842f2f9b23ecb69ab01a630ddd Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Wed, 13 Apr 2022 16:22:00 +0500 Subject: [PATCH 042/278] Updated README.md added link back to the article: https://www.baeldung.com/spring-swagger-hide-field --- spring-boot-modules/spring-boot-mvc/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-modules/spring-boot-mvc/README.md b/spring-boot-modules/spring-boot-mvc/README.md index 5e9ecded10..cdb2bd0fce 100644 --- a/spring-boot-modules/spring-boot-mvc/README.md +++ b/spring-boot-modules/spring-boot-mvc/README.md @@ -11,4 +11,5 @@ This module contains articles about Spring Web MVC in Spring Boot projects. - [Using Spring ResponseEntity to Manipulate the HTTP Response](https://www.baeldung.com/spring-response-entity) - [The @ServletComponentScan Annotation in Spring Boot](https://www.baeldung.com/spring-servletcomponentscan) - [Guide to Internationalization in Spring Boot](https://www.baeldung.com/spring-boot-internationalization) +- [Hide a Request Field in Swagger API](https://www.baeldung.com/spring-swagger-hide-field) - More articles: [[next -->]](/spring-boot-modules/spring-boot-mvc-2) From 2b68a32cb7552dafa0184f33c451abfddd067307 Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Thu, 14 Apr 2022 10:31:13 +0100 Subject: [PATCH 043/278] [JAVA-11197] Fix graphql-java Application class --- graphql/graphql-java/pom.xml | 105 +++++++++--------- .../baeldung/graphql/handler/UserHandler.java | 19 ++-- 2 files changed, 66 insertions(+), 58 deletions(-) diff --git a/graphql/graphql-java/pom.xml b/graphql/graphql-java/pom.xml index f2733bf671..5808dd17fb 100644 --- a/graphql/graphql-java/pom.xml +++ b/graphql/graphql-java/pom.xml @@ -12,7 +12,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../../ + ../../pom.xml @@ -36,51 +36,15 @@ graphql-java-annotations ${graphql-java-annotations.version} - - io.ratpack - ratpack-core - ${ratpack-core.version} - - - com.github.americanexpress.nodes - nodes - 0.5.0 - - - com.graphql-java - graphql-java - 9.2 - com.graphql-java graphql-java-tools - 5.2.4 + ${graphql-java-tools.version} com.graphql-java graphql-java-servlet - 6.1.3 - - - javax.servlet - javax.servlet-api - 3.0.1 - provided - - - org.apache.commons - commons-lang3 - 3.12.0 - - - org.mock-server - mockserver-netty - 5.11.2 - - - org.mock-server - mockserver-client-java - 5.11.2 + ${graphql-java-servlet.version} com.graphql-java-generator @@ -88,15 +52,47 @@ ${graphql.java.generator.version} - org.junit.jupiter - junit-jupiter-engine - 5.8.2 + javax.servlet + javax.servlet-api + ${javax.servlet-api.version} + provided + + + com.fasterxml.jackson.core + jackson-core + ${jackson.version} + + + io.ratpack + ratpack-core + ${ratpack-core.version} + + + com.github.americanexpress.nodes + nodes + ${nodes.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + org.apache.httpcomponents + httpclient + ${httpclient.version} + + + + org.mock-server + mockserver-netty + ${mockserver-netty.version} test - org.assertj - assertj-core - 3.22.0 + org.mock-server + mockserver-client-java + ${mockserver-client-java.version} test @@ -115,11 +111,11 @@ org.eclipse.jetty jetty-maven-plugin - 10.0.7 + ${jetty-maven-plugin.version} maven-war-plugin - 3.1.0 + ${maven-war-plugin.version} com.graphql-java-generator @@ -143,12 +139,21 @@ + 5.2.4 + 6.1.3 3.0.3 - 1.4.6 - 3.1 + 1.18 + 1.9.0 + 0.5.0 + 4.5.13 + + 5.13.2 + 5.13.2 + + 10.0.7 + 1.8 1.8 - 1.18 \ No newline at end of file diff --git a/graphql/graphql-java/src/main/java/com/baeldung/graphql/handler/UserHandler.java b/graphql/graphql-java/src/main/java/com/baeldung/graphql/handler/UserHandler.java index a6d474a70d..eb7cf021c6 100644 --- a/graphql/graphql-java/src/main/java/com/baeldung/graphql/handler/UserHandler.java +++ b/graphql/graphql-java/src/main/java/com/baeldung/graphql/handler/UserHandler.java @@ -19,24 +19,27 @@ import com.baeldung.graphql.utils.SchemaUtils; import static ratpack.jackson.Jackson.json; public class UserHandler implements Handler { + private static final Logger LOGGER = Logger.getLogger(UserHandler.class.getSimpleName()); - private GraphQL graphql; - private static List users = new ArrayList<>(); + + private static final List USERS = new ArrayList<>(); + + private final GraphQL graphql; public UserHandler() throws Exception { - graphql = new GraphQL(new UserSchema().getSchema()); + graphql = GraphQL.newGraphQL(new UserSchema().getSchema()).build(); } @Override - public void handle(Context context) throws Exception { + public void handle(Context context) { context.parse(Map.class) .then(payload -> { Map parameters = (Map) payload.get("parameters"); ExecutionResult executionResult = graphql.execute(payload.get(SchemaUtils.QUERY) .toString(), null, this, parameters); + Map result = new LinkedHashMap<>(); - if (executionResult.getErrors() - .isEmpty()) { + if (executionResult.getErrors().isEmpty()) { result.put(SchemaUtils.DATA, executionResult.getData()); } else { result.put(SchemaUtils.ERRORS, executionResult.getErrors()); @@ -46,8 +49,8 @@ public class UserHandler implements Handler { }); } - public static List getUsers() { - return users; + public List getUsers() { + return USERS; } public static List getUsers(DataFetchingEnvironment env) { From d8b5ab011172d8876fc9f3e0ee3605188b845ca0 Mon Sep 17 00:00:00 2001 From: "soni.sk@1969" Date: Thu, 14 Apr 2022 21:31:50 +0530 Subject: [PATCH 044/278] BAEL-5329 : Updated code module --- .../spring-boot-mvc-4/README.md | 4 ++ spring-boot-modules/spring-boot-mvc-4/pom.xml | 62 +++++++++++++++++++ .../swagger/ArticleApplication.java | 2 + .../controller/ArticlesController.java | 2 +- .../springboot/swagger/model/Article.java | 1 + .../swagger/service/ArticleService.java | 2 +- .../src/main/resources/static/index.html | 1 + 7 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 spring-boot-modules/spring-boot-mvc-4/README.md create mode 100644 spring-boot-modules/spring-boot-mvc-4/pom.xml rename spring-boot-modules/{spring-boot-mvc => spring-boot-mvc-4}/src/main/java/com/baeldung/springboot/swagger/ArticleApplication.java (91%) rename spring-boot-modules/{spring-boot-mvc => spring-boot-mvc-4}/src/main/java/com/baeldung/springboot/swagger/controller/ArticlesController.java (91%) rename spring-boot-modules/{spring-boot-mvc => spring-boot-mvc-4}/src/main/java/com/baeldung/springboot/swagger/model/Article.java (97%) rename spring-boot-modules/{spring-boot-mvc => spring-boot-mvc-4}/src/main/java/com/baeldung/springboot/swagger/service/ArticleService.java (99%) create mode 100644 spring-boot-modules/spring-boot-mvc-4/src/main/resources/static/index.html diff --git a/spring-boot-modules/spring-boot-mvc-4/README.md b/spring-boot-modules/spring-boot-mvc-4/README.md new file mode 100644 index 0000000000..651453c6d4 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-4/README.md @@ -0,0 +1,4 @@ +## Spring Boot MVC + +This module contains articles about Spring Web MVC in Spring Boot projects. + diff --git a/spring-boot-modules/spring-boot-mvc-4/pom.xml b/spring-boot-modules/spring-boot-mvc-4/pom.xml new file mode 100644 index 0000000000..edf6185259 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-4/pom.xml @@ -0,0 +1,62 @@ + + + 4.0.0 + spring-boot-mvc-4 + spring-boot-mvc-4 + jar + Module For Spring Boot + + + com.baeldung.spring-boot-modules + spring-boot-modules + 1.0.0-SNAPSHOT + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-devtools + true + + + io.springfox + springfox-boot-starter + ${spring.fox.version} + + + com.fasterxml.jackson.core + jackson-databind + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + ${start-class} + JAR + + + + + + + + 3.0.0 + com.baeldung.springboot.swagger.ArticleApplication + + + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/ArticleApplication.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/ArticleApplication.java similarity index 91% rename from spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/ArticleApplication.java rename to spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/ArticleApplication.java index 568d31e8bc..8be380baa0 100644 --- a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/ArticleApplication.java +++ b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/ArticleApplication.java @@ -4,6 +4,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.spi.DocumentationType; @@ -12,6 +13,7 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2; @SpringBootApplication @EnableSwagger2 +@EnableWebMvc public class ArticleApplication { public static void main(String[] args) { diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/controller/ArticlesController.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/controller/ArticlesController.java similarity index 91% rename from spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/controller/ArticlesController.java rename to spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/controller/ArticlesController.java index 96812e367a..c4336a7cfe 100644 --- a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/controller/ArticlesController.java +++ b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/controller/ArticlesController.java @@ -21,7 +21,7 @@ public class ArticlesController { } @PostMapping("") - public void addArticle(@RequestBody Article article) { + public void addArticle(@ModelAttribute Article article) { articleService.addArticle(article); } diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/model/Article.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/model/Article.java similarity index 97% rename from spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/model/Article.java rename to spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/model/Article.java index 6512b4e1a7..f6318c04b3 100644 --- a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/model/Article.java +++ b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/model/Article.java @@ -15,6 +15,7 @@ public class Article { //@ApiModelProperty(hidden = true) //@ApiParam(hidden = true) //@ApiModelProperty(readOnly = true) + @ApiParam(hidden = true) private int id; private String title; private int numOfWords; diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/service/ArticleService.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/service/ArticleService.java similarity index 99% rename from spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/service/ArticleService.java rename to spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/service/ArticleService.java index 04f6e6c6e3..3fd0279988 100644 --- a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springboot/swagger/service/ArticleService.java +++ b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/service/ArticleService.java @@ -20,6 +20,6 @@ public class ArticleService { article.setId(articles.size() + 1); articles.add(article); } - + } diff --git a/spring-boot-modules/spring-boot-mvc-4/src/main/resources/static/index.html b/spring-boot-modules/spring-boot-mvc-4/src/main/resources/static/index.html new file mode 100644 index 0000000000..9f55d12685 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-4/src/main/resources/static/index.html @@ -0,0 +1 @@ +Welcome to Baeldung \ No newline at end of file From 0c480dbeedaf1f43660165fde4c517858b022ca5 Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Thu, 14 Apr 2022 21:10:20 +0100 Subject: [PATCH 045/278] [JAVA-11252] Fix Mongodb live test --- .../bsontojson/BsonToJsonLiveTest.java | 70 +++++++++---------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/persistence-modules/java-mongodb/src/test/java/com/baeldung/bsontojson/BsonToJsonLiveTest.java b/persistence-modules/java-mongodb/src/test/java/com/baeldung/bsontojson/BsonToJsonLiveTest.java index 12053523f8..0548119d7a 100644 --- a/persistence-modules/java-mongodb/src/test/java/com/baeldung/bsontojson/BsonToJsonLiveTest.java +++ b/persistence-modules/java-mongodb/src/test/java/com/baeldung/bsontojson/BsonToJsonLiveTest.java @@ -21,7 +21,7 @@ import dev.morphia.Datastore; import dev.morphia.Morphia; public class BsonToJsonLiveTest { - + private static final String DB_NAME = "library"; private static Datastore datastore; @@ -31,17 +31,17 @@ public class BsonToJsonLiveTest { morphia.mapPackage("com.baeldung.bsontojson"); datastore = morphia.createDatastore(new MongoClient(), DB_NAME); datastore.ensureIndexes(); - + datastore.save(new Book() .setIsbn("isbn") .setTitle("title") .setAuthor("author") .setCost(3.95) .setPublisher(new Publisher(new ObjectId("fffffffffffffffffffffffa"),"publisher")) - .setPublishDate(LocalDateTime.parse("2020-01-01T18:13:32Z", DateTimeFormatter.ISO_DATE_TIME)) + .setPublishDate(LocalDateTime.parse("2020-01-01T17:13:32Z", DateTimeFormatter.ISO_DATE_TIME)) .addCompanionBooks(new Book().setIsbn("isbn2"))); } - + @AfterClass public static void tearDown() { datastore.delete(datastore.createQuery(Book.class)); @@ -50,32 +50,32 @@ public class BsonToJsonLiveTest { @Test public void givenBsonDocument_whenUsingStandardJsonTransformation_thenJsonDateIsObjectEpochTime() { - String json = null; + String json; try (MongoClient mongoClient = new MongoClient()) { MongoDatabase mongoDatabase = mongoClient.getDatabase(DB_NAME); Document bson = mongoDatabase.getCollection("Books").find().first(); json = bson.toJson(); } - - String expectedJson = "{\"_id\": \"isbn\", " + - "\"className\": \"com.baeldung.bsontojson.Book\", " + - "\"title\": \"title\", " + - "\"author\": \"author\", " + - "\"publisher\": {\"_id\": {\"$oid\": \"fffffffffffffffffffffffa\"}, " + - "\"name\": \"publisher\"}, " + - "\"price\": 3.95, " + + + String expectedJson = "{\"_id\": \"isbn\", " + + "\"className\": \"com.baeldung.bsontojson.Book\", " + + "\"title\": \"title\", " + + "\"author\": \"author\", " + + "\"publisher\": {\"_id\": {\"$oid\": \"fffffffffffffffffffffffa\"}, " + + "\"name\": \"publisher\"}, " + + "\"price\": 3.95, " + "\"publishDate\": {\"$date\": 1577898812000}}"; assertNotNull(json); - + assertEquals(expectedJson, json); } - + @Test public void givenBsonDocument_whenUsingRelaxedJsonTransformation_thenJsonDateIsObjectIsoDate() { - - String json = null; + + String json; try (MongoClient mongoClient = new MongoClient()) { MongoDatabase mongoDatabase = mongoClient.getDatabase(DB_NAME); Document bson = mongoDatabase.getCollection("Books").find().first(); @@ -84,25 +84,25 @@ public class BsonToJsonLiveTest { .outputMode(JsonMode.RELAXED) .build()); } - - String expectedJson = "{\"_id\": \"isbn\", " + - "\"className\": \"com.baeldung.bsontojson.Book\", " + - "\"title\": \"title\", " + - "\"author\": \"author\", " + - "\"publisher\": {\"_id\": {\"$oid\": \"fffffffffffffffffffffffa\"}, " + - "\"name\": \"publisher\"}, " + - "\"price\": 3.95, " + + + String expectedJson = "{\"_id\": \"isbn\", " + + "\"className\": \"com.baeldung.bsontojson.Book\", " + + "\"title\": \"title\", " + + "\"author\": \"author\", " + + "\"publisher\": {\"_id\": {\"$oid\": \"fffffffffffffffffffffffa\"}, " + + "\"name\": \"publisher\"}, " + + "\"price\": 3.95, " + "\"publishDate\": {\"$date\": \"2020-01-01T17:13:32Z\"}}"; assertNotNull(json); - + assertEquals(expectedJson, json); } - + @Test public void givenBsonDocument_whenUsingCustomJsonTransformation_thenJsonDateIsStringField() { - String json = null; + String json; try (MongoClient mongoClient = new MongoClient()) { MongoDatabase mongoDatabase = mongoClient.getDatabase(DB_NAME); Document bson = mongoDatabase.getCollection("Books").find().first(); @@ -112,13 +112,13 @@ public class BsonToJsonLiveTest { .build()); } - String expectedJson = "{\"_id\": \"isbn\", " + - "\"className\": \"com.baeldung.bsontojson.Book\", " + - "\"title\": \"title\", " + - "\"author\": \"author\", " + - "\"publisher\": {\"_id\": {\"$oid\": \"fffffffffffffffffffffffa\"}, " + - "\"name\": \"publisher\"}, " + - "\"price\": 3.95, " + + String expectedJson = "{\"_id\": \"isbn\", " + + "\"className\": \"com.baeldung.bsontojson.Book\", " + + "\"title\": \"title\", " + + "\"author\": \"author\", " + + "\"publisher\": {\"_id\": {\"$oid\": \"fffffffffffffffffffffffa\"}, " + + "\"name\": \"publisher\"}, " + + "\"price\": 3.95, " + "\"publishDate\": \"2020-01-01T17:13:32Z\"}"; assertEquals(expectedJson, json); From 3045fea67032979d3da1a7ce868d2dddad898417 Mon Sep 17 00:00:00 2001 From: Palaniappan Arunachalam Date: Fri, 15 Apr 2022 02:11:00 +0530 Subject: [PATCH 046/278] BAEL-5419: List vs ArrayList in Java + tests (#11936) * BAEL-5419: List vs ArrayList in Java + tests * BAEL-5419: Updated code +tests as per review comments * BAEL-5419: Fixed failing tests * BAEL-5419: Fixed JUnit test as per review comments --- .../list/listvsarraylist/ArrayListDemo.java | 51 ++++++++++ .../list/listvsarraylist/ListDemo.java | 53 +++++++++++ .../list/listvsarraylist/Passenger.java | 49 ++++++++++ .../ArrayListDemoUnitTest.java | 91 ++++++++++++++++++ .../listvsarraylist/ListDemoUnitTest.java | 92 +++++++++++++++++++ 5 files changed, 336 insertions(+) create mode 100644 core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/listvsarraylist/ArrayListDemo.java create mode 100644 core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/listvsarraylist/ListDemo.java create mode 100644 core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/listvsarraylist/Passenger.java create mode 100644 core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/listvsarraylist/ArrayListDemoUnitTest.java create mode 100644 core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/listvsarraylist/ListDemoUnitTest.java diff --git a/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/listvsarraylist/ArrayListDemo.java b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/listvsarraylist/ArrayListDemo.java new file mode 100644 index 0000000000..f425f19189 --- /dev/null +++ b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/listvsarraylist/ArrayListDemo.java @@ -0,0 +1,51 @@ +package com.baeldung.list.listvsarraylist; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Locale; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class ArrayListDemo { + + private ArrayList passengers = new ArrayList<>(20); +// private LinkedList passengers = new LinkedList<>(); // compile time error + + public ArrayList addPassenger(Passenger passenger) { + passengers.add(passenger); + return passengers; + } + + public ArrayList removePassenger(Passenger passenger) { + passengers.remove(passenger); + return passengers; + } + + public ArrayList getPassengersBySource(String source) { + return new ArrayList(passengers.stream() + .filter(it -> it.getSource().equals(source)) + .collect(Collectors.toList())); + } + + public ArrayList getPassengersByDestination(String destination) { + return new ArrayList (passengers.stream() + .filter(it -> it.getDestination().equals(destination)) + .collect(Collectors.toList())); + } + + public long getKidsCount(ArrayList passengerList) { + return passengerList.stream() + .filter(it -> (it.getAge() <= 10)) + .count(); + } + + public ArrayList getFinalPassengersList() { + return new ArrayList (Collections.unmodifiableList(passengers)); + } + + public ArrayList getServicedCountries() { + return new ArrayList (Stream.of(Locale.getISOCountries()) + .collect(Collectors.toList())); + } + +} diff --git a/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/listvsarraylist/ListDemo.java b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/listvsarraylist/ListDemo.java new file mode 100644 index 0000000000..a9a182d21e --- /dev/null +++ b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/listvsarraylist/ListDemo.java @@ -0,0 +1,53 @@ +package com.baeldung.list.listvsarraylist; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import java.util.Locale; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class ListDemo { + + private List passengers = new ArrayList<>(20); +// private List passengers = new LinkedList<>(); // No compile time error + + public List addPassenger(Passenger passenger) { + passengers.add(passenger); + return passengers; + } + + public List removePassenger(Passenger passenger) { + passengers.remove(passenger); + return passengers; + } + + public List getPassengersBySource(String source) { + return passengers.stream() + .filter(it -> it.getSource().equals(source)) + .collect(Collectors.toList()); + } + + public List getPassengersByDestination(String destination) { + return passengers.stream() + .filter(it -> it.getDestination().equals(destination)) + .collect(Collectors.toList()); + } + + public long getKidsCount(List passengerList) { + return passengerList.stream() + .filter(it -> (it.getAge() <= 10)) + .count(); + } + + public List getFinalPassengersList() { + return Collections.unmodifiableList(passengers); + } + + public List getServicedCountries() { + return Stream.of(Locale.getISOCountries()) + .collect(Collectors.toList()); + } + +} diff --git a/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/listvsarraylist/Passenger.java b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/listvsarraylist/Passenger.java new file mode 100644 index 0000000000..9c61b70aa6 --- /dev/null +++ b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/listvsarraylist/Passenger.java @@ -0,0 +1,49 @@ +package com.baeldung.list.listvsarraylist; + +public class Passenger { + + private String name; + private int age; + private String source; + private String destination; + + public Passenger(String name, int age, String source, String destination) { + this.name = name; + this.age = age; + this.source = source; + this.destination = destination; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public String getSource() { + return source; + } + + public void setSource(String source) { + this.source = source; + } + + public String getDestination() { + return destination; + } + + public void setDestination(String destination) { + this.destination = destination; + } + +} diff --git a/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/listvsarraylist/ArrayListDemoUnitTest.java b/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/listvsarraylist/ArrayListDemoUnitTest.java new file mode 100644 index 0000000000..59094ab562 --- /dev/null +++ b/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/listvsarraylist/ArrayListDemoUnitTest.java @@ -0,0 +1,91 @@ +package com.baeldung.list.listvsarraylist; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertNotNull; + +import java.util.ArrayList; +import java.util.Locale; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class ArrayListDemoUnitTest { + + ArrayListDemo application = new ArrayListDemo(); + + Passenger passenger1; + Passenger passenger2; + Passenger passenger3; + + @BeforeEach + protected void setUp() { + passenger1 = new Passenger("Anna", 25, "London", "New York"); + passenger2 = new Passenger("Binny", 35, "New York", "London"); + passenger3 = new Passenger("Chandra", 8, "Paris", "New Delhi"); + application.addPassenger(passenger1); + application.addPassenger(passenger2); + application.addPassenger(passenger3); + } + + @Test + public void givenEmptyList_whenAddedPassenger_thenReturnCurrentPassengerList() { + ArrayList list = application.addPassenger(new Passenger("David", 54, "Milan", "Paris")); + + assertNotNull(list); + assertThat(list).hasSize(4); + } + + @Test + public void givenPassengerList_whenRemovedPassenger_thenReturnCurrentPassengerList() { + ArrayList list = application.removePassenger(passenger3); + + assertNotNull(list); + assertThat(list).hasSize(2); + } + + @Test + public void givenPassengerList_whenPassedWithSourceCity_thenReturnMatchingPassengerList() { + ArrayList list = application.getPassengersBySource("Singapore"); + ArrayList list2 = application.getPassengersBySource("London"); + + assertThat(list).isEmpty(); + assertThat(list2.get(0)).isEqualTo(passenger1); + } + + @Test + public void givenPassengerList_whenPassedWithDestinationCity_thenReturnMatchingPassengerList() { + ArrayList list = application.getPassengersByDestination("Singapore"); + ArrayList list2 = application.getPassengersByDestination("London"); + + assertThat(list).isEmpty(); + assertThat(list2.get(0)).isEqualTo(passenger2); + } + + @Test + public void givenPassengerList_whenFindKidsByAge_thenReturnKidsList() { + ArrayList list = new ArrayList<>(); + list.add(passenger1); + list.add(passenger2); + list.add(passenger3); + long count = application.getKidsCount(list); + + assertThat(count).isEqualTo(1); + } + + @Test + public void givenPassengerList_whenCalledWithCollectionsFunction_thenReturnsListType() { + ArrayList list = application.getFinalPassengersList(); + + assertNotNull(list); + assertThat(list).hasSize(3); + } + + @Test + public void givenCurrentLocale_whenUsingStreams_thenReturnsListType() { + ArrayList servicedCountries = application.getServicedCountries(); + + assertNotNull(servicedCountries); + assertThat(servicedCountries).hasSize(Locale.getISOCountries().length); + } + +} diff --git a/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/listvsarraylist/ListDemoUnitTest.java b/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/listvsarraylist/ListDemoUnitTest.java new file mode 100644 index 0000000000..cf239a79ce --- /dev/null +++ b/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/listvsarraylist/ListDemoUnitTest.java @@ -0,0 +1,92 @@ +package com.baeldung.list.listvsarraylist; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertNotNull; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class ListDemoUnitTest { + + ListDemo application = new ListDemo(); + + Passenger passenger1; + Passenger passenger2; + Passenger passenger3; + + @BeforeEach + protected void setUp() { + passenger1 = new Passenger("Anna", 25, "London", "New York"); + passenger2 = new Passenger("Binny", 35, "New York", "London"); + passenger3 = new Passenger("Chandra", 8, "Paris", "New Delhi"); + application.addPassenger(passenger1); + application.addPassenger(passenger2); + application.addPassenger(passenger3); + } + + @Test + public void givenEmptyList_whenAddedPassenger_thenReturnCurrentPassengerList() { + List list = application.addPassenger(new Passenger("David", 54, "Milan", "Paris")); + + assertNotNull(list); + assertThat(list).hasSize(4); + } + + @Test + public void givenPresentList_whenRemovedPassenger_thenReturnCurrentPassengerList() { + List list = application.removePassenger(passenger3); + + assertNotNull(list); + assertThat(list).hasSize(2); + } + + @Test + public void givenPresentList_whenPassedWithSourceCity_thenReturnMatchingPassengerList() { + List list = application.getPassengersBySource("Singapore"); + List list2 = application.getPassengersBySource("London"); + + assertThat(list).isEmpty(); + assertThat(list2.get(0)).isEqualTo(passenger1); + } + + @Test + public void givenPresentList_whenPassedWithDestinationCity_thenReturnMatchingPassengerList() { + List list = application.getPassengersByDestination("Singapore"); + List list2 = application.getPassengersByDestination("London"); + + assertThat(list).isEmpty(); + assertThat(list2.get(0)).isEqualTo(passenger2); + } + + @Test + public void givenPassengerList_whenFindKidsByAge_thenReturnKidsList() { + List list = new ArrayList<>(); + list.add(passenger1); + list.add(passenger2); + list.add(passenger3); + long count = application.getKidsCount(list); + + assertThat(count).isEqualTo(1); + } + + @Test + public void givenPresentList_whenCalledWithCollectionsFunction_thenReturnsListType() { + List list = application.getFinalPassengersList(); + + assertNotNull(list); + assertThat(list).hasSize(3); + } + + @Test + public void givenCurrentLocale_whenUsingStreams_thenReturnsListType() { + List servicedCountries = application.getServicedCountries(); + + assertNotNull(servicedCountries); + assertThat(servicedCountries).hasSize(Locale.getISOCountries().length); + } + +} From 9f584fd32f397a6820d11333ecfbabab868494e2 Mon Sep 17 00:00:00 2001 From: Abhinav Pandey Date: Fri, 15 Apr 2022 02:30:00 +0530 Subject: [PATCH 047/278] BAEL-5268 - Using Profiles with Discovery Clients (#11913) * BAEL-5268 - Using Profiles with Discovery Clients * BAEL-5268 - Adding separate property file for dev environment Co-authored-by: Abhinav Pandey --- .../pom.xml | 48 +++++++++++++++++++ .../client/EurekaClientApplication.java | 13 +++++ .../controller/HelloWorldController.java | 13 +++++ .../main/resources/application-dev.properties | 2 + .../src/main/resources/application.properties | 9 ++++ .../eureka/client/SpringContextTest.java | 16 +++++++ 6 files changed, 101 insertions(+) create mode 100644 spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client-profiles/pom.xml create mode 100644 spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client-profiles/src/main/java/com/baeldung/spring/cloud/eureka/client/EurekaClientApplication.java create mode 100644 spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client-profiles/src/main/java/com/baeldung/spring/cloud/eureka/client/controller/HelloWorldController.java create mode 100644 spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client-profiles/src/main/resources/application-dev.properties create mode 100644 spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client-profiles/src/main/resources/application.properties create mode 100644 spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client-profiles/src/test/java/com/baeldung/spring/cloud/eureka/client/SpringContextTest.java diff --git a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client-profiles/pom.xml b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client-profiles/pom.xml new file mode 100644 index 0000000000..23e06a55f9 --- /dev/null +++ b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client-profiles/pom.xml @@ -0,0 +1,48 @@ + + + 4.0.0 + spring-cloud-eureka-client-profiles + 1.0.0-SNAPSHOT + spring-cloud-eureka-client-profiles + jar + Spring Cloud Eureka Sample Client + + + com.baeldung.spring.cloud + spring-cloud-eureka + 1.0.0-SNAPSHOT + + + + + + org.junit + junit-bom + ${junit-jupiter.version} + pom + import + + + org.springframework.cloud + spring-cloud-starter-parent + ${spring-cloud-dependencies.version} + pom + import + + + + + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + + + org.springframework.boot + spring-boot-starter-web + + + + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client-profiles/src/main/java/com/baeldung/spring/cloud/eureka/client/EurekaClientApplication.java b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client-profiles/src/main/java/com/baeldung/spring/cloud/eureka/client/EurekaClientApplication.java new file mode 100644 index 0000000000..854bab97e7 --- /dev/null +++ b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client-profiles/src/main/java/com/baeldung/spring/cloud/eureka/client/EurekaClientApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.spring.cloud.eureka.client; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class EurekaClientApplication { + + public static void main(String[] args) { + SpringApplication.run(EurekaClientApplication.class, args); + } + +} diff --git a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client-profiles/src/main/java/com/baeldung/spring/cloud/eureka/client/controller/HelloWorldController.java b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client-profiles/src/main/java/com/baeldung/spring/cloud/eureka/client/controller/HelloWorldController.java new file mode 100644 index 0000000000..d0d0a6ec9f --- /dev/null +++ b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client-profiles/src/main/java/com/baeldung/spring/cloud/eureka/client/controller/HelloWorldController.java @@ -0,0 +1,13 @@ +package com.baeldung.spring.cloud.eureka.client.controller; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class HelloWorldController { + + @RequestMapping("/hello") + public String hello() { + return "Hello World!"; + } +} diff --git a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client-profiles/src/main/resources/application-dev.properties b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client-profiles/src/main/resources/application-dev.properties new file mode 100644 index 0000000000..c565e42678 --- /dev/null +++ b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client-profiles/src/main/resources/application-dev.properties @@ -0,0 +1,2 @@ +server.port=8080 +spring.cloud.discovery.enabled=false \ No newline at end of file diff --git a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client-profiles/src/main/resources/application.properties b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client-profiles/src/main/resources/application.properties new file mode 100644 index 0000000000..3cfecbbf08 --- /dev/null +++ b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client-profiles/src/main/resources/application.properties @@ -0,0 +1,9 @@ +server.port=8080 + +eureka.client.serviceUrl.defaultZone=${EUREKA_URI:http://localhost:8761/eureka} +eureka.instance.preferIpAddress=false + +spring.application.name=spring-cloud-eureka-client +#--- +spring.config.activate.on-profile=dev +spring.cloud.discovery.enabled=false \ No newline at end of file diff --git a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client-profiles/src/test/java/com/baeldung/spring/cloud/eureka/client/SpringContextTest.java b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client-profiles/src/test/java/com/baeldung/spring/cloud/eureka/client/SpringContextTest.java new file mode 100644 index 0000000000..a3ed012abb --- /dev/null +++ b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client-profiles/src/test/java/com/baeldung/spring/cloud/eureka/client/SpringContextTest.java @@ -0,0 +1,16 @@ +package com.baeldung.spring.cloud.eureka.client; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class SpringContextTest { + + @Test + public void whenSpringContextIsBootstrapped_thenNoExceptions() { + } + +} From f12099f7dd1f27f65f39a1788f49975fdc5f795e Mon Sep 17 00:00:00 2001 From: nrsureshdeveloper <86210937+nrsureshdeveloper@users.noreply.github.com> Date: Fri, 15 Apr 2022 01:49:56 -0500 Subject: [PATCH 048/278] Bael-5306: graphql error handling (#12041) * Example implementation of Hexagonal Architecture pattern * BAEL-5306 - spring boot/graphql error handling example * removed the ddd hexagonal arch module Co-authored-by: Suresh Raghavan --- graphql/graphql-error-handling/pom.xml | 97 +++++++++++++++++++ .../GraphQLErrorHandlerApplication.java | 46 +++++++++ .../error/handling/domain/Location.java | 29 ++++++ .../error/handling/domain/Vehicle.java | 26 +++++ .../exception/AbstractGraphQLException.java | 44 +++++++++ .../exception/GraphQLErrorAdapter.java | 48 +++++++++ .../exception/InvalidInputException.java | 7 ++ .../VehicleAlreadyPresentException.java | 14 +++ .../exception/VehicleNotFoundException.java | 14 +++ .../repository/InventoryRepository.java | 9 ++ .../repository/LocationRepository.java | 9 ++ .../error/handling/resolver/Mutation.java | 20 ++++ .../error/handling/resolver/Query.java | 29 ++++++ .../handling/service/InventoryService.java | 67 +++++++++++++ .../src/main/resources/application.yml | 23 +++++ .../main/resources/graphql/inventory.graphqls | 23 +++++ .../src/main/resources/import.sql | 7 ++ ...rrorHandlerApplicationIntegrationTest.java | 55 +++++++++++ .../graphql/error/handling/TestUtils.java | 15 +++ ...t_non_null_fields_partial_response.graphql | 10 ++ ...quest_error_invalid_request_syntax.graphql | 9 ++ .../request_error_unknown_operation.graphql | 9 ++ ...uest_non_null_fields_partial_response.json | 34 +++++++ .../request_error_invalid_request_syntax.json | 18 ++++ .../request_error_unknown_operation.json | 18 ++++ .../src/test/resources/init_script.sql | 0 26 files changed, 680 insertions(+) create mode 100644 graphql/graphql-error-handling/pom.xml create mode 100644 graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/GraphQLErrorHandlerApplication.java create mode 100644 graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/domain/Location.java create mode 100644 graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/domain/Vehicle.java create mode 100644 graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/AbstractGraphQLException.java create mode 100644 graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/GraphQLErrorAdapter.java create mode 100644 graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/InvalidInputException.java create mode 100644 graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/VehicleAlreadyPresentException.java create mode 100644 graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/VehicleNotFoundException.java create mode 100644 graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/repository/InventoryRepository.java create mode 100644 graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/repository/LocationRepository.java create mode 100644 graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/resolver/Mutation.java create mode 100644 graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/resolver/Query.java create mode 100644 graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/service/InventoryService.java create mode 100644 graphql/graphql-error-handling/src/main/resources/application.yml create mode 100644 graphql/graphql-error-handling/src/main/resources/graphql/inventory.graphqls create mode 100644 graphql/graphql-error-handling/src/main/resources/import.sql create mode 100644 graphql/graphql-error-handling/src/test/java/com/baeldung/graphql/error/handling/GraphQLErrorHandlerApplicationIntegrationTest.java create mode 100644 graphql/graphql-error-handling/src/test/java/com/baeldung/graphql/error/handling/TestUtils.java create mode 100644 graphql/graphql-error-handling/src/test/resources/graphql/request/field_error_request_non_null_fields_partial_response.graphql create mode 100644 graphql/graphql-error-handling/src/test/resources/graphql/request/request_error_invalid_request_syntax.graphql create mode 100644 graphql/graphql-error-handling/src/test/resources/graphql/request/request_error_unknown_operation.graphql create mode 100644 graphql/graphql-error-handling/src/test/resources/graphql/response/field_error_request_non_null_fields_partial_response.json create mode 100644 graphql/graphql-error-handling/src/test/resources/graphql/response/request_error_invalid_request_syntax.json create mode 100644 graphql/graphql-error-handling/src/test/resources/graphql/response/request_error_unknown_operation.json create mode 100644 graphql/graphql-error-handling/src/test/resources/init_script.sql diff --git a/graphql/graphql-error-handling/pom.xml b/graphql/graphql-error-handling/pom.xml new file mode 100644 index 0000000000..0cd00df3b9 --- /dev/null +++ b/graphql/graphql-error-handling/pom.xml @@ -0,0 +1,97 @@ + + + 4.0.0 + com.baeldung.graphql + graphql-error-handling + 1.0 + jar + graphql-error-handling + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 + + + + 1.8 + 1.18.18 + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + org.springframework.boot + spring-boot-starter-web + + + + com.graphql-java + graphql-spring-boot-starter + 5.0.2 + + + + com.graphql-java + graphql-java-tools + 5.2.4 + + + + org.projectlombok + lombok + ${lombok.version} + + + + com.h2database + h2 + ${h2.version} + + + + org.springframework.boot + spring-boot-test + test + 2.6.4 + + + + com.graphql-java + graphql-spring-boot-starter-test + test + 5.0.2 + + + + org.assertj + assertj-core + 3.22.0 + test + + + + org.skyscreamer + jsonassert + 1.5.0 + test + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + \ No newline at end of file diff --git a/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/GraphQLErrorHandlerApplication.java b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/GraphQLErrorHandlerApplication.java new file mode 100644 index 0000000000..565c9e0a15 --- /dev/null +++ b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/GraphQLErrorHandlerApplication.java @@ -0,0 +1,46 @@ +package com.baeldung.graphql.error.handling; + +import com.baeldung.graphql.error.handling.exception.GraphQLErrorAdapter; +import graphql.ExceptionWhileDataFetching; +import graphql.GraphQLError; +import graphql.servlet.GraphQLErrorHandler; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@SpringBootApplication +public class GraphQLErrorHandlerApplication { + public static void main(String[] args) { + SpringApplication.run(GraphQLErrorHandlerApplication.class, args); + } + + @Bean + public GraphQLErrorHandler errorHandler() { + return new GraphQLErrorHandler() { + @Override + public List processErrors(List errors) { + List clientErrors = errors.stream() + .filter(this::isClientError) + .collect(Collectors.toList()); + + List serverErrors = errors.stream() + .filter(e -> !isClientError(e)) + .map(GraphQLErrorAdapter::new) + .collect(Collectors.toList()); + + List e = new ArrayList<>(); + e.addAll(clientErrors); + e.addAll(serverErrors); + return e; + } + + private boolean isClientError(GraphQLError error) { + return !(error instanceof ExceptionWhileDataFetching || error instanceof Throwable); + } + }; + } +} diff --git a/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/domain/Location.java b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/domain/Location.java new file mode 100644 index 0000000000..815bf3a26a --- /dev/null +++ b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/domain/Location.java @@ -0,0 +1,29 @@ +package com.baeldung.graphql.error.handling.domain; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import java.util.ArrayList; +import java.util.List; + +@Data +@Entity +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class Location { + @Id + private String zipcode; + + private String city; + private String state; + + @OneToMany(mappedBy = "location", fetch = FetchType.EAGER) + private List vehicles = new ArrayList<>(); +} diff --git a/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/domain/Vehicle.java b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/domain/Vehicle.java new file mode 100644 index 0000000000..e206bdb009 --- /dev/null +++ b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/domain/Vehicle.java @@ -0,0 +1,26 @@ +package com.baeldung.graphql.error.handling.domain; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Data +@Entity +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class Vehicle { + @Id + private String vin; + private Integer year; + private String make; + private String model; + private String trim; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "fk_location") + private Location location; +} diff --git a/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/AbstractGraphQLException.java b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/AbstractGraphQLException.java new file mode 100644 index 0000000000..4e7be50ae4 --- /dev/null +++ b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/AbstractGraphQLException.java @@ -0,0 +1,44 @@ +package com.baeldung.graphql.error.handling.exception; + +import graphql.ErrorType; +import graphql.GraphQLError; +import graphql.language.SourceLocation; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class AbstractGraphQLException extends RuntimeException implements GraphQLError { + private Map parameters = new HashMap(); + + public AbstractGraphQLException(String message) { + super(message); + } + + public AbstractGraphQLException(String message, Map additionParams) { + this(message); + if (additionParams != null) { + parameters = additionParams; + } + } + + @Override + public String getMessage() { + return super.getMessage(); + } + + @Override + public List getLocations() { + return null; + } + + @Override + public ErrorType getErrorType() { + return null; + } + + @Override + public Map getExtensions() { + return this.parameters; + } +} diff --git a/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/GraphQLErrorAdapter.java b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/GraphQLErrorAdapter.java new file mode 100644 index 0000000000..d982f98db3 --- /dev/null +++ b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/GraphQLErrorAdapter.java @@ -0,0 +1,48 @@ +package com.baeldung.graphql.error.handling.exception; + +import graphql.ErrorType; +import graphql.ExceptionWhileDataFetching; +import graphql.GraphQLError; +import graphql.language.SourceLocation; + +import java.util.List; +import java.util.Map; + +public class GraphQLErrorAdapter implements GraphQLError { + + private GraphQLError error; + + public GraphQLErrorAdapter(GraphQLError error) { + this.error = error; + } + + @Override + public Map getExtensions() { + return error.getExtensions(); + } + + @Override + public List getLocations() { + return error.getLocations(); + } + + @Override + public ErrorType getErrorType() { + return error.getErrorType(); + } + + @Override + public List getPath() { + return error.getPath(); + } + + @Override + public Map toSpecification() { + return error.toSpecification(); + } + + @Override + public String getMessage() { + return (error instanceof ExceptionWhileDataFetching) ? ((ExceptionWhileDataFetching) error).getException().getMessage() : error.getMessage(); + } +} \ No newline at end of file diff --git a/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/InvalidInputException.java b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/InvalidInputException.java new file mode 100644 index 0000000000..78c8e83e27 --- /dev/null +++ b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/InvalidInputException.java @@ -0,0 +1,7 @@ +package com.baeldung.graphql.error.handling.exception; + +public class InvalidInputException extends RuntimeException { + public InvalidInputException(String message) { + super(message); + } +} diff --git a/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/VehicleAlreadyPresentException.java b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/VehicleAlreadyPresentException.java new file mode 100644 index 0000000000..8f6f0ce615 --- /dev/null +++ b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/VehicleAlreadyPresentException.java @@ -0,0 +1,14 @@ +package com.baeldung.graphql.error.handling.exception; + +import java.util.Map; + +public class VehicleAlreadyPresentException extends AbstractGraphQLException { + + public VehicleAlreadyPresentException(String message) { + super(message); + } + + public VehicleAlreadyPresentException(String message, Map additionParams) { + super(message, additionParams); + } +} diff --git a/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/VehicleNotFoundException.java b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/VehicleNotFoundException.java new file mode 100644 index 0000000000..0d2ad8c597 --- /dev/null +++ b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/VehicleNotFoundException.java @@ -0,0 +1,14 @@ +package com.baeldung.graphql.error.handling.exception; + +import java.util.Map; + +public class VehicleNotFoundException extends AbstractGraphQLException { + + public VehicleNotFoundException(String message) { + super(message); + } + + public VehicleNotFoundException(String message, Map params) { + super(message, params); + } +} diff --git a/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/repository/InventoryRepository.java b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/repository/InventoryRepository.java new file mode 100644 index 0000000000..f4a0043408 --- /dev/null +++ b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/repository/InventoryRepository.java @@ -0,0 +1,9 @@ +package com.baeldung.graphql.error.handling.repository; + +import com.baeldung.graphql.error.handling.domain.Vehicle; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface InventoryRepository extends JpaRepository { +} diff --git a/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/repository/LocationRepository.java b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/repository/LocationRepository.java new file mode 100644 index 0000000000..716b8d3ef3 --- /dev/null +++ b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/repository/LocationRepository.java @@ -0,0 +1,9 @@ +package com.baeldung.graphql.error.handling.repository; + +import com.baeldung.graphql.error.handling.domain.Location; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface LocationRepository extends JpaRepository { +} diff --git a/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/resolver/Mutation.java b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/resolver/Mutation.java new file mode 100644 index 0000000000..8463ebf8eb --- /dev/null +++ b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/resolver/Mutation.java @@ -0,0 +1,20 @@ +package com.baeldung.graphql.error.handling.resolver; + +import com.baeldung.graphql.error.handling.domain.Location; +import com.baeldung.graphql.error.handling.domain.Vehicle; +import com.baeldung.graphql.error.handling.service.InventoryService; +import com.coxautodev.graphql.tools.GraphQLMutationResolver; +import org.springframework.stereotype.Component; + +@Component +public class Mutation implements GraphQLMutationResolver { + private InventoryService inventoryService; + + public Mutation(InventoryService inventoryService) { + this.inventoryService = inventoryService; + } + + public Vehicle addVehicle(String vin, Integer year, String make, String model, String trim, Location location) { + return this.inventoryService.addVehicle(vin, year, make, model, trim, location); + } +} diff --git a/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/resolver/Query.java b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/resolver/Query.java new file mode 100644 index 0000000000..ece018464a --- /dev/null +++ b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/resolver/Query.java @@ -0,0 +1,29 @@ +package com.baeldung.graphql.error.handling.resolver; + +import com.baeldung.graphql.error.handling.domain.Vehicle; +import com.baeldung.graphql.error.handling.service.InventoryService; +import com.coxautodev.graphql.tools.GraphQLQueryResolver; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class Query implements GraphQLQueryResolver { + private final InventoryService inventoryService; + + public Query(InventoryService inventoryService) { + this.inventoryService = inventoryService; + } + + public List searchAll() { + return this.inventoryService.searchAll(); + } + + public List searchByLocation(String zipcode) { + return this.inventoryService.searchByLocation(zipcode); + } + + public Vehicle searchByVin(String vin) { + return this.inventoryService.searchByVin(vin); + } +} diff --git a/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/service/InventoryService.java b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/service/InventoryService.java new file mode 100644 index 0000000000..7064b08760 --- /dev/null +++ b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/service/InventoryService.java @@ -0,0 +1,67 @@ +package com.baeldung.graphql.error.handling.service; + +import com.baeldung.graphql.error.handling.domain.Location; +import com.baeldung.graphql.error.handling.domain.Vehicle; +import com.baeldung.graphql.error.handling.exception.InvalidInputException; +import com.baeldung.graphql.error.handling.exception.VehicleAlreadyPresentException; +import com.baeldung.graphql.error.handling.exception.VehicleNotFoundException; +import com.baeldung.graphql.error.handling.repository.InventoryRepository; +import com.baeldung.graphql.error.handling.repository.LocationRepository; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.transaction.Transactional; +import java.util.*; + +@Service +public class InventoryService { + private InventoryRepository inventoryRepository; + private LocationRepository locationRepository; + + public InventoryService(InventoryRepository inventoryRepository, LocationRepository locationRepository) { + this.inventoryRepository = inventoryRepository; + this.locationRepository = locationRepository; + } + + @Transactional + public Vehicle addVehicle(String vin, Integer year, String make, String model, String trim, Location location) { + Optional existingVehicle = this.inventoryRepository.findById(vin); + if (existingVehicle.isPresent()) { + Map params = new HashMap<>(); + params.put("vin", vin); + throw new VehicleAlreadyPresentException("Failed to add vehicle. Vehicle with vin " + vin + " already present.", params); + } + Vehicle vehicle = Vehicle.builder() + .vin(vin) + .year(year) + .make(make) + .model(model) + .location(location) + .trim(trim) + .build(); + + this.locationRepository.save(location); + return this.inventoryRepository.save(vehicle); + } + + public List searchAll() { + return this.inventoryRepository.findAll(); + } + + public List searchByLocation(String zipcode) { + if (StringUtils.isEmpty(zipcode) || zipcode.length() != 5) { + throw new InvalidInputException("Invalid zipcode " + zipcode + " provided."); + } + return this.locationRepository.findById(zipcode) + .map(Location::getVehicles) + .orElse(new ArrayList<>()); + } + + public Vehicle searchByVin(String vin) { + return this.inventoryRepository.findById(vin).orElseThrow(() -> { + Map params = new HashMap<>(); + params.put("vin", vin); + return new VehicleNotFoundException("Vehicle with vin " + vin + " not found.", params); + }); + } +} diff --git a/graphql/graphql-error-handling/src/main/resources/application.yml b/graphql/graphql-error-handling/src/main/resources/application.yml new file mode 100644 index 0000000000..155e133a62 --- /dev/null +++ b/graphql/graphql-error-handling/src/main/resources/application.yml @@ -0,0 +1,23 @@ +graphql: + servlet: + mapping: /graphql + +spring: + datasource: + url: "jdbc:h2:mem:graphqldb" + driverClassName: "org.h2.Driver" + username: sa + password: + + initialization-mode: always + platform: h2 + + jpa: + show-sql: true + properties: + hibernate: + dialect: org.hibernate.dialect.H2Dialect + ddl-auto: none + + h2: + console.enabled: true \ No newline at end of file diff --git a/graphql/graphql-error-handling/src/main/resources/graphql/inventory.graphqls b/graphql/graphql-error-handling/src/main/resources/graphql/inventory.graphqls new file mode 100644 index 0000000000..7dcb5403c1 --- /dev/null +++ b/graphql/graphql-error-handling/src/main/resources/graphql/inventory.graphqls @@ -0,0 +1,23 @@ +type Vehicle { + vin: ID! + year: Int! + make: String! + model: String! + trim: String! +} + +input Location { + city: String + state: String + zipcode: String! +} + +type Query { + searchAll: [Vehicle]! + searchByLocation(zipcode: String!): [Vehicle]! + searchByVin(vin: String!): Vehicle +} + +type Mutation { + addVehicle(vin: ID!, year: Int!, make: String!, model: String!, trim: String, location: Location): Vehicle! +} \ No newline at end of file diff --git a/graphql/graphql-error-handling/src/main/resources/import.sql b/graphql/graphql-error-handling/src/main/resources/import.sql new file mode 100644 index 0000000000..62907a86c3 --- /dev/null +++ b/graphql/graphql-error-handling/src/main/resources/import.sql @@ -0,0 +1,7 @@ +insert into LOCATION values('07092', 'Mountainside', 'NJ'); +insert into LOCATION values ('94118', 'San Francisco', 'CA'); +insert into LOCATION values ('10002', 'New York', 'NY'); + +insert into VEHICLE (vin, year, make, model, trim, fk_location) values('KM8JN72DX7U587496', 2007, 'Hyundai', 'Tucson', null, '07092'); +insert into VEHICLE (vin, year, make, model, trim, fk_location) values('JTKKU4B41C1023346', 2012, 'Toyota', 'Scion', 'Xd', '94118'); +insert into VEHICLE (vin, year, make, model, trim, fk_location) values('1G1JC1444PZ215071', 2000, 'Chevrolet', 'CAVALIER VL', 'RS', '07092'); \ No newline at end of file diff --git a/graphql/graphql-error-handling/src/test/java/com/baeldung/graphql/error/handling/GraphQLErrorHandlerApplicationIntegrationTest.java b/graphql/graphql-error-handling/src/test/java/com/baeldung/graphql/error/handling/GraphQLErrorHandlerApplicationIntegrationTest.java new file mode 100644 index 0000000000..069a08ce02 --- /dev/null +++ b/graphql/graphql-error-handling/src/test/java/com/baeldung/graphql/error/handling/GraphQLErrorHandlerApplicationIntegrationTest.java @@ -0,0 +1,55 @@ +package com.baeldung.graphql.error.handling; + +import com.graphql.spring.boot.test.GraphQLResponse; +import com.graphql.spring.boot.test.GraphQLTestTemplate; +import org.json.JSONException; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.skyscreamer.jsonassert.JSONAssert; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.test.context.junit4.SpringRunner; + +import java.io.IOException; + +import static com.baeldung.graphql.error.handling.TestUtils.readFile; +import static java.lang.String.format; + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, classes = GraphQLErrorHandlerApplication.class) +public class GraphQLErrorHandlerApplicationIntegrationTest { + + @Autowired + private GraphQLTestTemplate graphQLTestTemplate; + + private static final String GRAPHQL_TEST_REQUEST_PATH = "graphql/request/%s.graphql"; + private static final String GRAPHQL_TEST_RESPONSE_PATH = "graphql/response/%s.json"; + + @Test + public void whenUnknownOperation_thenRespondWithRequestError() throws IOException, JSONException { + String graphqlName = "request_error_unknown_operation"; + GraphQLResponse actualResponse = graphQLTestTemplate.postForResource(format(GRAPHQL_TEST_REQUEST_PATH, graphqlName)); + String expectedResponse = readFile(format(GRAPHQL_TEST_RESPONSE_PATH, graphqlName)); + + JSONAssert.assertEquals(expectedResponse, actualResponse.getRawResponse().getBody(), true); + } + + @Test + public void whenInvalidSyntaxRequest_thenRespondWithRequestError() throws IOException, JSONException { + String graphqlName = "request_error_invalid_request_syntax"; + GraphQLResponse actualResponse = graphQLTestTemplate.postForResource(format(GRAPHQL_TEST_REQUEST_PATH, graphqlName)); + String expectedResponse = readFile(format(GRAPHQL_TEST_RESPONSE_PATH, graphqlName)); + + JSONAssert.assertEquals(expectedResponse, actualResponse.getRawResponse().getBody(), true); + } + + @Test + public void whenRequestAllNonNullField_thenRespondPartialDataWithFieldError() throws IOException, JSONException { + String graphqlName = "field_error_request_non_null_fields_partial_response"; + GraphQLResponse actualResponse = graphQLTestTemplate.postForResource(format(GRAPHQL_TEST_REQUEST_PATH, graphqlName)); + String expectedResponse = readFile(format(GRAPHQL_TEST_RESPONSE_PATH, graphqlName)); + + JSONAssert.assertEquals(expectedResponse, actualResponse.getRawResponse().getBody(), true); + } +} diff --git a/graphql/graphql-error-handling/src/test/java/com/baeldung/graphql/error/handling/TestUtils.java b/graphql/graphql-error-handling/src/test/java/com/baeldung/graphql/error/handling/TestUtils.java new file mode 100644 index 0000000000..557f1d9c91 --- /dev/null +++ b/graphql/graphql-error-handling/src/test/java/com/baeldung/graphql/error/handling/TestUtils.java @@ -0,0 +1,15 @@ +package com.baeldung.graphql.error.handling; + +import org.apache.commons.io.IOUtils; +import org.springframework.core.io.ClassPathResource; + +import java.io.IOException; +import java.nio.charset.Charset; + +public class TestUtils { + public static String readFile(String path) throws IOException { + return IOUtils.toString( + new ClassPathResource(path).getInputStream(), Charset.defaultCharset() + ); + } +} diff --git a/graphql/graphql-error-handling/src/test/resources/graphql/request/field_error_request_non_null_fields_partial_response.graphql b/graphql/graphql-error-handling/src/test/resources/graphql/request/field_error_request_non_null_fields_partial_response.graphql new file mode 100644 index 0000000000..17affc50cb --- /dev/null +++ b/graphql/graphql-error-handling/src/test/resources/graphql/request/field_error_request_non_null_fields_partial_response.graphql @@ -0,0 +1,10 @@ +# trim is non null but one of the record has null value for trim +query { + searchAll { + vin + year + make + model + trim + } +} \ No newline at end of file diff --git a/graphql/graphql-error-handling/src/test/resources/graphql/request/request_error_invalid_request_syntax.graphql b/graphql/graphql-error-handling/src/test/resources/graphql/request/request_error_invalid_request_syntax.graphql new file mode 100644 index 0000000000..98920eb17a --- /dev/null +++ b/graphql/graphql-error-handling/src/test/resources/graphql/request/request_error_invalid_request_syntax.graphql @@ -0,0 +1,9 @@ +query { + searchByVin(vin: "error) { + vin + year + make + model + trim + } +} \ No newline at end of file diff --git a/graphql/graphql-error-handling/src/test/resources/graphql/request/request_error_unknown_operation.graphql b/graphql/graphql-error-handling/src/test/resources/graphql/request/request_error_unknown_operation.graphql new file mode 100644 index 0000000000..fb6c3d1039 --- /dev/null +++ b/graphql/graphql-error-handling/src/test/resources/graphql/request/request_error_unknown_operation.graphql @@ -0,0 +1,9 @@ +subscription { + searchByVin(vin: "75024") { + vin + year + make + model + trim + } +} \ No newline at end of file diff --git a/graphql/graphql-error-handling/src/test/resources/graphql/response/field_error_request_non_null_fields_partial_response.json b/graphql/graphql-error-handling/src/test/resources/graphql/response/field_error_request_non_null_fields_partial_response.json new file mode 100644 index 0000000000..760190128e --- /dev/null +++ b/graphql/graphql-error-handling/src/test/resources/graphql/response/field_error_request_non_null_fields_partial_response.json @@ -0,0 +1,34 @@ +{ + "data": { + "searchAll": [ + null, + { + "vin": "JTKKU4B41C1023346", + "year": 2012, + "make": "Toyota", + "model": "Scion", + "trim": "Xd" + }, + { + "vin": "1G1JC1444PZ215071", + "year": 2000, + "make": "Chevrolet", + "model": "CAVALIER VL", + "trim": "RS" + } + ] + }, + "errors": [ + { + "message": "Cannot return null for non-nullable type: 'String' within parent 'Vehicle' (/searchAll[0]/trim)", + "path": [ + "searchAll", + 0, + "trim" + ], + "errorType": "DataFetchingException", + "locations": null, + "extensions": null + } + ] +} \ No newline at end of file diff --git a/graphql/graphql-error-handling/src/test/resources/graphql/response/request_error_invalid_request_syntax.json b/graphql/graphql-error-handling/src/test/resources/graphql/response/request_error_invalid_request_syntax.json new file mode 100644 index 0000000000..2835b42133 --- /dev/null +++ b/graphql/graphql-error-handling/src/test/resources/graphql/response/request_error_invalid_request_syntax.json @@ -0,0 +1,18 @@ +{ + "data": null, + "errors": [ + { + "message": "Invalid Syntax", + "locations": [ + { + "line": 5, + "column": 8, + "sourceName": null + } + ], + "errorType": "InvalidSyntax", + "path": null, + "extensions": null + } + ] +} \ No newline at end of file diff --git a/graphql/graphql-error-handling/src/test/resources/graphql/response/request_error_unknown_operation.json b/graphql/graphql-error-handling/src/test/resources/graphql/response/request_error_unknown_operation.json new file mode 100644 index 0000000000..b5872fc80f --- /dev/null +++ b/graphql/graphql-error-handling/src/test/resources/graphql/response/request_error_unknown_operation.json @@ -0,0 +1,18 @@ +{ + "data": null, + "errors": [ + { + "errorType": "OperationNotSupported", + "locations": [ + { + "line": 1, + "column": 1, + "sourceName": null + } + ], + "extensions": null, + "message": "Schema is not configured for subscriptions.", + "path": null + } + ] +} \ No newline at end of file diff --git a/graphql/graphql-error-handling/src/test/resources/init_script.sql b/graphql/graphql-error-handling/src/test/resources/init_script.sql new file mode 100644 index 0000000000..e69de29bb2 From 45b2266b6acfe7ccc01ef3c278e00392ea20be12 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Fri, 15 Apr 2022 13:13:13 +0530 Subject: [PATCH 049/278] JAVA-10606: Resolve errors from module rule-engines/jess --- rule-engines/jess/pom.xml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/rule-engines/jess/pom.xml b/rule-engines/jess/pom.xml index f5db0374ef..be26d54a1e 100644 --- a/rule-engines/jess/pom.xml +++ b/rule-engines/jess/pom.xml @@ -7,18 +7,28 @@ jess 1.0-SNAPSHOT - jsr94 jsr94 1.1 + + + + + wso2 + Numerical Method's Maven Repository + http://dist.wso2.org/maven2/ + + + \ No newline at end of file From 20762cfeb9dddc21dac53258be2836c10b323367 Mon Sep 17 00:00:00 2001 From: freelansam <79205526+freelansam@users.noreply.github.com> Date: Fri, 15 Apr 2022 14:57:20 +0530 Subject: [PATCH 050/278] JAVA-10516: Revisit spring-boot module inside spring-boot-modules folder (#12038) --- spring-boot-modules/pom.xml | 4 +- .../main/resources/templates/customer.html | 0 .../README.md | 2 + .../spring-boot-basic-customization-2/pom.xml | 13 + .../baeldung/container}/CustomContainer.java | 2 +- .../baeldung/typeconversion}/Application.java | 2 +- .../typeconversion}/config/WebConfig.java | 9 +- .../converter/GenericBigDecimalConverter.java | 2 +- .../converter/StringToEmployeeConverter.java | 4 +- .../StringToEnumConverterFactory.java | 2 +- .../StringToEmployeeConverterController.java | 4 +- .../baeldung/typeconversion/domain/Modes.java | 6 + .../typeconversion/entity}/Employee.java | 2 +- .../CustomConverterIntegrationTest.java | 8 +- ...yeeConverterControllerIntegrationTest.java | 6 +- .../spring-boot-crud/README.md | 1 + .../com/baeldung/demo/DemoApplication.java | 0 .../baeldung/demo/components/FooService.java | 0 .../demo/exceptions/CommonException.java | 0 .../demo/exceptions/FooNotFoundException.java | 0 .../java/com/baeldung/demo/model/Foo.java | 0 .../demo/repository/FooRepository.java | 0 .../baeldung/demo/service/FooController.java | 0 .../session/exception/Application.java | 0 .../exception/repository/FooRepository.java | 0 .../repository/FooRepositoryImpl.java | 0 .../boot/ApplicationIntegrationTest.java | 3 +- .../FooRepositoryIntegrationTest.java | 2 +- .../HibernateSessionIntegrationTest.java | 2 +- .../NoHibernateSessionIntegrationTest.java | 1 + .../demo}/DemoApplicationIntegrationTest.java | 2 +- .../resources/exception-hibernate.properties | 0 .../src/test/resources/exception.properties | 0 .../resources/templates/displayallbeans.html | 0 .../spring-boot-mvc-3/README.md | 2 +- .../spring-boot-mvc-4/README.md | 10 + spring-boot-modules/spring-boot-mvc-4/pom.xml | 45 ++++ .../controller/servlet/HelloWorldServlet.java | 0 .../servlet/SpringHelloWorldServlet.java | 0 .../common/error/MyCustomErrorController.java | 0 .../SpringHelloServletRegistrationBean.java | 0 .../error/controller/ErrorController.java | 0 .../MyServletContainerCustomizationBean.java | 0 .../ExecutorServiceExitCodeGenerator.java | 0 .../baeldung/main/SpringBootApplication.java | 0 .../baeldung/servlets/ApplicationMain.java | 0 .../configuration/WebAppInitializer.java | 0 .../configuration/WebMvcConfigure.java | 0 .../baeldung/servlets/props/Constants.java | 0 .../servlets/props/PropertyLoader.java | 0 .../servlets/props/PropertySourcesLoader.java | 0 .../servlets/GenericCustomServlet.java | 0 .../servlets/javaee/AnnotationServlet.java | 0 .../servlets/javaee/EEWebXmlServlet.java | 0 .../SpringRegistrationBeanServlet.java | 0 .../embedded/EmbeddedTomcatExample.java | 0 .../com/baeldung/utils/UtilsApplication.java | 0 .../utils/controller/UtilsController.java | 0 .../src/main/resources/application.properties | 0 .../src/main/resources/custom.properties | 0 .../src/main/resources/logback.xml | 6 - .../src/main/resources/shutdown/shutdown.bat | 0 .../src/main/resources/templates/other.html | 0 .../src/main/resources/templates/utils.html | 0 .../src/main/webapp/WEB-INF/context.xml | 0 .../src/main/webapp/WEB-INF/dispatcher.xml | 0 .../src/main/webapp/WEB-INF/web.xml | 0 .../src/main/webapp/annotationservlet.jsp | 0 .../src/main/webapp/index.jsp | 0 .../utils/UtilsControllerIntegrationTest.java | 0 .../spring-boot-validation/README.md | 1 + .../spring-boot-validation/pom.xml | 8 + .../application/Application.java | 0 .../controllers/UserController.java | 0 .../application/entities/User.java | 0 .../repositories/UserRepository.java | 0 .../UserControllerIntegrationTest.java | 0 spring-boot-modules/spring-boot/.gitignore | 5 - .../.mvn/wrapper/maven-wrapper.properties | 1 - spring-boot-modules/spring-boot/README.md | 16 -- spring-boot-modules/spring-boot/mvnw | 227 ------------------ spring-boot-modules/spring-boot/mvnw.cmd | 145 ----------- spring-boot-modules/spring-boot/pom.xml | 166 ------------- .../com/baeldung/boot/config/H2JpaConfig.java | 67 ------ .../java/com/baeldung/boot/domain/Modes.java | 6 - .../baeldung/buildproperties/Application.java | 18 -- .../buildproperties/BuildInfoService.java | 21 -- .../src/main/java/com/baeldung/intro/App.java | 11 - .../intro/controller/HomeController.java | 18 -- .../com/baeldung/jsondateformat/Contact.java | 70 ------ .../baeldung/jsondateformat/ContactApp.java | 13 - .../jsondateformat/ContactAppConfig.java | 33 --- .../jsondateformat/ContactController.java | 77 ------ .../ContactWithJavaUtilDate.java | 69 ------ .../baeldung/jsondateformat/PlainContact.java | 66 ----- .../PlainContactWithJavaUtilDate.java | 69 ------ .../main/java/com/baeldung/model/User.java | 49 ---- .../baeldung/repository/UserRepository.java | 79 ------ .../com/baeldung/rss/ArticleFeedView.java | 54 ----- .../baeldung/rss/ArticleRssController.java | 16 -- .../main/java/com/baeldung/rss/RssApp.java | 18 -- .../application-errorhandling.properties | 4 - .../src/main/resources/build.properties | 2 - .../spring-boot/src/main/resources/build.yml | 2 - .../src/main/resources/data-expressions.sql | 3 - .../spring-boot/src/main/resources/data.sql | 5 - .../src/main/resources/demo.properties | 2 - .../persistence-generic-entity.properties | 8 - .../src/main/resources/public/error/404.html | 8 - .../src/main/resources/schema-expressions.sql | 5 - .../spring-boot/src/main/resources/schema.sql | 8 - .../main/resources/templates/customers.html | 33 --- .../src/main/resources/templates/error.html | 16 -- .../main/resources/templates/error/404.html | 8 - .../main/resources/templates/external.html | 31 --- .../src/main/resources/templates/index.html | 19 -- .../src/main/resources/templates/layout.html | 18 -- .../BuildInfoServiceIntegrationTest.java | 24 -- .../java/com/baeldung/intro/AppLiveTest.java | 35 --- .../jsondateformat/ContactAppUnitTest.java | 109 --------- ...AppWithObjectMapperCustomizerUnitTest.java | 76 ------ .../UserRepositoryIntegrationTest.java | 73 ------ .../spring-boot/src/test/resources/README.md | 3 - .../src/test/resources/application.properties | 19 -- .../src/test/resources/conversion.properties | 11 - .../spring-boot/src/test/resources/import.sql | 1 - .../resources/org/baeldung/boot/expected.json | 4 - 127 files changed, 116 insertions(+), 1874 deletions(-) rename spring-boot-modules/{spring-boot => spring-boot-1}/src/main/resources/templates/customer.html (100%) rename spring-boot-modules/{spring-boot/src/main/java/com/baeldung/rss => spring-boot-basic-customization-2/src/main/java/com/baeldung/container}/CustomContainer.java (93%) rename spring-boot-modules/{spring-boot/src/main/java/com/baeldung/boot => spring-boot-basic-customization-2/src/main/java/com/baeldung/typeconversion}/Application.java (91%) rename spring-boot-modules/{spring-boot/src/main/java/com/baeldung/boot => spring-boot-basic-customization-2/src/main/java/com/baeldung/typeconversion}/config/WebConfig.java (67%) rename spring-boot-modules/{spring-boot/src/main/java/com/baeldung/boot => spring-boot-basic-customization-2/src/main/java/com/baeldung/typeconversion}/converter/GenericBigDecimalConverter.java (96%) rename spring-boot-modules/{spring-boot/src/main/java/com/baeldung/boot => spring-boot-basic-customization-2/src/main/java/com/baeldung/typeconversion}/converter/StringToEmployeeConverter.java (76%) rename spring-boot-modules/{spring-boot/src/main/java/com/baeldung/boot => spring-boot-basic-customization-2/src/main/java/com/baeldung/typeconversion}/converter/StringToEnumConverterFactory.java (94%) rename spring-boot-modules/{spring-boot/src/main/java/com/baeldung/boot => spring-boot-basic-customization-2/src/main/java/com/baeldung/typeconversion}/converter/controller/StringToEmployeeConverterController.java (81%) create mode 100644 spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/typeconversion/domain/Modes.java rename spring-boot-modules/{spring-boot/src/main/java/com/baeldung/toggle => spring-boot-basic-customization-2/src/main/java/com/baeldung/typeconversion/entity}/Employee.java (92%) rename spring-boot-modules/{spring-boot/src/test/java/com/baeldung => spring-boot-basic-customization-2/src/test/java/com/baeldung/typeconversion}/converter/CustomConverterIntegrationTest.java (90%) rename spring-boot-modules/{spring-boot/src/test/java/com/baeldung => spring-boot-basic-customization-2/src/test/java/com/baeldung/typeconversion}/converter/controller/StringToEmployeeConverterControllerIntegrationTest.java (92%) rename spring-boot-modules/{spring-boot => spring-boot-crud}/src/main/java/com/baeldung/demo/DemoApplication.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-crud}/src/main/java/com/baeldung/demo/components/FooService.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-crud}/src/main/java/com/baeldung/demo/exceptions/CommonException.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-crud}/src/main/java/com/baeldung/demo/exceptions/FooNotFoundException.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-crud}/src/main/java/com/baeldung/demo/model/Foo.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-crud}/src/main/java/com/baeldung/demo/repository/FooRepository.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-crud}/src/main/java/com/baeldung/demo/service/FooController.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-crud}/src/main/java/com/baeldung/session/exception/Application.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-crud}/src/main/java/com/baeldung/session/exception/repository/FooRepository.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-crud}/src/main/java/com/baeldung/session/exception/repository/FooRepositoryImpl.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-crud}/src/test/java/com/baeldung/boot/ApplicationIntegrationTest.java (99%) rename spring-boot-modules/{spring-boot => spring-boot-crud}/src/test/java/com/baeldung/boot/repository/FooRepositoryIntegrationTest.java (94%) rename spring-boot-modules/{spring-boot => spring-boot-crud}/src/test/java/com/baeldung/boot/repository/HibernateSessionIntegrationTest.java (94%) rename spring-boot-modules/{spring-boot => spring-boot-crud}/src/test/java/com/baeldung/boot/repository/NoHibernateSessionIntegrationTest.java (99%) rename spring-boot-modules/{spring-boot/src/test/java/com/baeldung/boot => spring-boot-crud/src/test/java/com/baeldung/demo}/DemoApplicationIntegrationTest.java (95%) rename spring-boot-modules/{spring-boot => spring-boot-crud}/src/test/resources/exception-hibernate.properties (100%) rename spring-boot-modules/{spring-boot => spring-boot-crud}/src/test/resources/exception.properties (100%) rename spring-boot-modules/{spring-boot => spring-boot-di}/src/main/resources/templates/displayallbeans.html (100%) create mode 100644 spring-boot-modules/spring-boot-mvc-4/README.md create mode 100644 spring-boot-modules/spring-boot-mvc-4/pom.xml rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/main/java/com/baeldung/boot/controller/servlet/HelloWorldServlet.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/main/java/com/baeldung/boot/controller/servlet/SpringHelloWorldServlet.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/main/java/com/baeldung/common/error/MyCustomErrorController.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/main/java/com/baeldung/common/error/SpringHelloServletRegistrationBean.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/main/java/com/baeldung/common/error/controller/ErrorController.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/main/java/com/baeldung/common/properties/MyServletContainerCustomizationBean.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/main/java/com/baeldung/common/resources/ExecutorServiceExitCodeGenerator.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/main/java/com/baeldung/main/SpringBootApplication.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/main/java/com/baeldung/servlets/ApplicationMain.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/main/java/com/baeldung/servlets/configuration/WebAppInitializer.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/main/java/com/baeldung/servlets/configuration/WebMvcConfigure.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/main/java/com/baeldung/servlets/props/Constants.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/main/java/com/baeldung/servlets/props/PropertyLoader.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/main/java/com/baeldung/servlets/props/PropertySourcesLoader.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/main/java/com/baeldung/servlets/servlets/GenericCustomServlet.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/main/java/com/baeldung/servlets/servlets/javaee/AnnotationServlet.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/main/java/com/baeldung/servlets/servlets/javaee/EEWebXmlServlet.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/main/java/com/baeldung/servlets/servlets/springboot/SpringRegistrationBeanServlet.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/main/java/com/baeldung/servlets/servlets/springboot/embedded/EmbeddedTomcatExample.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/main/java/com/baeldung/utils/UtilsApplication.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/main/java/com/baeldung/utils/controller/UtilsController.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/main/resources/application.properties (100%) rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/main/resources/custom.properties (100%) rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/main/resources/logback.xml (57%) rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/main/resources/shutdown/shutdown.bat (100%) rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/main/resources/templates/other.html (100%) rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/main/resources/templates/utils.html (100%) rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/main/webapp/WEB-INF/context.xml (100%) rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/main/webapp/WEB-INF/dispatcher.xml (100%) rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/main/webapp/WEB-INF/web.xml (100%) rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/main/webapp/annotationservlet.jsp (100%) rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/main/webapp/index.jsp (100%) rename spring-boot-modules/{spring-boot => spring-boot-mvc-4}/src/test/java/com/baeldung/utils/UtilsControllerIntegrationTest.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-validation}/src/main/java/com/baeldung/beanvalidation/application/Application.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-validation}/src/main/java/com/baeldung/beanvalidation/application/controllers/UserController.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-validation}/src/main/java/com/baeldung/beanvalidation/application/entities/User.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-validation}/src/main/java/com/baeldung/beanvalidation/application/repositories/UserRepository.java (100%) rename spring-boot-modules/{spring-boot => spring-boot-validation}/src/test/java/com/baeldung/beanvalidation/application/UserControllerIntegrationTest.java (100%) delete mode 100644 spring-boot-modules/spring-boot/.gitignore delete mode 100755 spring-boot-modules/spring-boot/.mvn/wrapper/maven-wrapper.properties delete mode 100644 spring-boot-modules/spring-boot/README.md delete mode 100755 spring-boot-modules/spring-boot/mvnw delete mode 100755 spring-boot-modules/spring-boot/mvnw.cmd delete mode 100644 spring-boot-modules/spring-boot/pom.xml delete mode 100644 spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/config/H2JpaConfig.java delete mode 100644 spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/domain/Modes.java delete mode 100644 spring-boot-modules/spring-boot/src/main/java/com/baeldung/buildproperties/Application.java delete mode 100644 spring-boot-modules/spring-boot/src/main/java/com/baeldung/buildproperties/BuildInfoService.java delete mode 100644 spring-boot-modules/spring-boot/src/main/java/com/baeldung/intro/App.java delete mode 100644 spring-boot-modules/spring-boot/src/main/java/com/baeldung/intro/controller/HomeController.java delete mode 100644 spring-boot-modules/spring-boot/src/main/java/com/baeldung/jsondateformat/Contact.java delete mode 100644 spring-boot-modules/spring-boot/src/main/java/com/baeldung/jsondateformat/ContactApp.java delete mode 100644 spring-boot-modules/spring-boot/src/main/java/com/baeldung/jsondateformat/ContactAppConfig.java delete mode 100644 spring-boot-modules/spring-boot/src/main/java/com/baeldung/jsondateformat/ContactController.java delete mode 100644 spring-boot-modules/spring-boot/src/main/java/com/baeldung/jsondateformat/ContactWithJavaUtilDate.java delete mode 100644 spring-boot-modules/spring-boot/src/main/java/com/baeldung/jsondateformat/PlainContact.java delete mode 100644 spring-boot-modules/spring-boot/src/main/java/com/baeldung/jsondateformat/PlainContactWithJavaUtilDate.java delete mode 100644 spring-boot-modules/spring-boot/src/main/java/com/baeldung/model/User.java delete mode 100644 spring-boot-modules/spring-boot/src/main/java/com/baeldung/repository/UserRepository.java delete mode 100644 spring-boot-modules/spring-boot/src/main/java/com/baeldung/rss/ArticleFeedView.java delete mode 100644 spring-boot-modules/spring-boot/src/main/java/com/baeldung/rss/ArticleRssController.java delete mode 100644 spring-boot-modules/spring-boot/src/main/java/com/baeldung/rss/RssApp.java delete mode 100644 spring-boot-modules/spring-boot/src/main/resources/application-errorhandling.properties delete mode 100644 spring-boot-modules/spring-boot/src/main/resources/build.properties delete mode 100644 spring-boot-modules/spring-boot/src/main/resources/build.yml delete mode 100644 spring-boot-modules/spring-boot/src/main/resources/data-expressions.sql delete mode 100644 spring-boot-modules/spring-boot/src/main/resources/data.sql delete mode 100644 spring-boot-modules/spring-boot/src/main/resources/demo.properties delete mode 100644 spring-boot-modules/spring-boot/src/main/resources/persistence-generic-entity.properties delete mode 100644 spring-boot-modules/spring-boot/src/main/resources/public/error/404.html delete mode 100644 spring-boot-modules/spring-boot/src/main/resources/schema-expressions.sql delete mode 100644 spring-boot-modules/spring-boot/src/main/resources/schema.sql delete mode 100644 spring-boot-modules/spring-boot/src/main/resources/templates/customers.html delete mode 100644 spring-boot-modules/spring-boot/src/main/resources/templates/error.html delete mode 100644 spring-boot-modules/spring-boot/src/main/resources/templates/error/404.html delete mode 100644 spring-boot-modules/spring-boot/src/main/resources/templates/external.html delete mode 100644 spring-boot-modules/spring-boot/src/main/resources/templates/index.html delete mode 100644 spring-boot-modules/spring-boot/src/main/resources/templates/layout.html delete mode 100644 spring-boot-modules/spring-boot/src/test/java/com/baeldung/buildproperties/BuildInfoServiceIntegrationTest.java delete mode 100644 spring-boot-modules/spring-boot/src/test/java/com/baeldung/intro/AppLiveTest.java delete mode 100644 spring-boot-modules/spring-boot/src/test/java/com/baeldung/jsondateformat/ContactAppUnitTest.java delete mode 100644 spring-boot-modules/spring-boot/src/test/java/com/baeldung/jsondateformat/ContactAppWithObjectMapperCustomizerUnitTest.java delete mode 100644 spring-boot-modules/spring-boot/src/test/java/com/baeldung/repository/UserRepositoryIntegrationTest.java delete mode 100644 spring-boot-modules/spring-boot/src/test/resources/README.md delete mode 100644 spring-boot-modules/spring-boot/src/test/resources/application.properties delete mode 100644 spring-boot-modules/spring-boot/src/test/resources/conversion.properties delete mode 100644 spring-boot-modules/spring-boot/src/test/resources/import.sql delete mode 100644 spring-boot-modules/spring-boot/src/test/resources/org/baeldung/boot/expected.json diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index fabd54aa92..a12ee55018 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -16,8 +16,7 @@ ../parent-boot-2 - - spring-boot + spring-boot-1 spring-boot-2 spring-boot-admin @@ -56,6 +55,7 @@ spring-boot-mvc spring-boot-mvc-2 spring-boot-mvc-3 + spring-boot-mvc-4 spring-boot-mvc-birt spring-boot-mvc-jersey spring-boot-nashorn diff --git a/spring-boot-modules/spring-boot/src/main/resources/templates/customer.html b/spring-boot-modules/spring-boot-1/src/main/resources/templates/customer.html similarity index 100% rename from spring-boot-modules/spring-boot/src/main/resources/templates/customer.html rename to spring-boot-modules/spring-boot-1/src/main/resources/templates/customer.html diff --git a/spring-boot-modules/spring-boot-basic-customization-2/README.md b/spring-boot-modules/spring-boot-basic-customization-2/README.md index 9488618ca5..bfd24a0475 100644 --- a/spring-boot-modules/spring-boot-basic-customization-2/README.md +++ b/spring-boot-modules/spring-boot-basic-customization-2/README.md @@ -8,3 +8,5 @@ This module contains articles about Spring Boot customization 2 - [XML Defined Beans in Spring Boot](https://www.baeldung.com/spring-boot-xml-beans) - [What Is OncePerRequestFilter?](https://www.baeldung.com/spring-onceperrequestfilter) - [Spring Boot Exit Codes](https://www.baeldung.com/spring-boot-exit-codes) + - [Guide to Spring Type Conversions](https://www.baeldung.com/spring-type-conversions) + - [Container Configuration in Spring Boot 2](https://www.baeldung.com/embeddedservletcontainercustomizer-configurableembeddedservletcontainer-spring-boot) \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-basic-customization-2/pom.xml b/spring-boot-modules/spring-boot-basic-customization-2/pom.xml index b615947de7..b537f43c23 100644 --- a/spring-boot-modules/spring-boot-basic-customization-2/pom.xml +++ b/spring-boot-modules/spring-boot-basic-customization-2/pom.xml @@ -19,10 +19,23 @@ org.springframework.boot spring-boot-starter-web + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.h2database + h2 + org.springframework.boot spring-boot-starter-test + + com.google.guava + guava + ${guava.version} + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/rss/CustomContainer.java b/spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/container/CustomContainer.java similarity index 93% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/rss/CustomContainer.java rename to spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/container/CustomContainer.java index aaa3188010..6ebd4d5c62 100644 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/rss/CustomContainer.java +++ b/spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/container/CustomContainer.java @@ -1,4 +1,4 @@ -package com.baeldung.rss; +package com.baeldung.container; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory; diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/Application.java b/spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/typeconversion/Application.java similarity index 91% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/Application.java rename to spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/typeconversion/Application.java index cb0d0c1532..1313032bbe 100644 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/Application.java +++ b/spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/typeconversion/Application.java @@ -1,4 +1,4 @@ -package com.baeldung.boot; +package com.baeldung.typeconversion; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/config/WebConfig.java b/spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/typeconversion/config/WebConfig.java similarity index 67% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/config/WebConfig.java rename to spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/typeconversion/config/WebConfig.java index b23c910a04..bad84edf88 100644 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/config/WebConfig.java +++ b/spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/typeconversion/config/WebConfig.java @@ -1,12 +1,13 @@ -package com.baeldung.boot.config; +package com.baeldung.typeconversion.config; -import com.baeldung.boot.converter.StringToEmployeeConverter; -import com.baeldung.boot.converter.StringToEnumConverterFactory; -import com.baeldung.boot.converter.GenericBigDecimalConverter; import org.springframework.context.annotation.Configuration; import org.springframework.format.FormatterRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import com.baeldung.typeconversion.converter.GenericBigDecimalConverter; +import com.baeldung.typeconversion.converter.StringToEmployeeConverter; +import com.baeldung.typeconversion.converter.StringToEnumConverterFactory; + @Configuration public class WebConfig implements WebMvcConfigurer { diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/GenericBigDecimalConverter.java b/spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/typeconversion/converter/GenericBigDecimalConverter.java similarity index 96% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/GenericBigDecimalConverter.java rename to spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/typeconversion/converter/GenericBigDecimalConverter.java index fc73cfee5f..440ffba5ee 100644 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/GenericBigDecimalConverter.java +++ b/spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/typeconversion/converter/GenericBigDecimalConverter.java @@ -1,4 +1,4 @@ -package com.baeldung.boot.converter; +package com.baeldung.typeconversion.converter; import com.google.common.collect.ImmutableSet; import org.springframework.core.convert.TypeDescriptor; diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/StringToEmployeeConverter.java b/spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/typeconversion/converter/StringToEmployeeConverter.java similarity index 76% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/StringToEmployeeConverter.java rename to spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/typeconversion/converter/StringToEmployeeConverter.java index ac635532ea..9703ed2514 100644 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/StringToEmployeeConverter.java +++ b/spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/typeconversion/converter/StringToEmployeeConverter.java @@ -1,8 +1,8 @@ -package com.baeldung.boot.converter; +package com.baeldung.typeconversion.converter; import org.springframework.core.convert.converter.Converter; -import com.baeldung.toggle.Employee; +import com.baeldung.typeconversion.entity.Employee; public class StringToEmployeeConverter implements Converter { diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/StringToEnumConverterFactory.java b/spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/typeconversion/converter/StringToEnumConverterFactory.java similarity index 94% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/StringToEnumConverterFactory.java rename to spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/typeconversion/converter/StringToEnumConverterFactory.java index a2dce11a6a..dc15f83d6d 100644 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/StringToEnumConverterFactory.java +++ b/spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/typeconversion/converter/StringToEnumConverterFactory.java @@ -1,4 +1,4 @@ -package com.baeldung.boot.converter; +package com.baeldung.typeconversion.converter; import org.springframework.core.convert.converter.Converter; import org.springframework.core.convert.converter.ConverterFactory; diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/controller/StringToEmployeeConverterController.java b/spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/typeconversion/converter/controller/StringToEmployeeConverterController.java similarity index 81% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/controller/StringToEmployeeConverterController.java rename to spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/typeconversion/converter/controller/StringToEmployeeConverterController.java index 260b1c734b..5c3f93f346 100644 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/controller/StringToEmployeeConverterController.java +++ b/spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/typeconversion/converter/controller/StringToEmployeeConverterController.java @@ -1,11 +1,11 @@ -package com.baeldung.boot.converter.controller; +package com.baeldung.typeconversion.converter.controller; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import com.baeldung.toggle.Employee; +import com.baeldung.typeconversion.entity.Employee; @RestController public class StringToEmployeeConverterController { diff --git a/spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/typeconversion/domain/Modes.java b/spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/typeconversion/domain/Modes.java new file mode 100644 index 0000000000..d905faacac --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/typeconversion/domain/Modes.java @@ -0,0 +1,6 @@ +package com.baeldung.typeconversion.domain; + +public enum Modes { + + ALPHA, BETA; +} diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/toggle/Employee.java b/spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/typeconversion/entity/Employee.java similarity index 92% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/toggle/Employee.java rename to spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/typeconversion/entity/Employee.java index 64a8b3ce5b..e1897de877 100644 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/toggle/Employee.java +++ b/spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/typeconversion/entity/Employee.java @@ -1,4 +1,4 @@ -package com.baeldung.toggle; +package com.baeldung.typeconversion.entity; import javax.persistence.Entity; import javax.persistence.Id; diff --git a/spring-boot-modules/spring-boot/src/test/java/com/baeldung/converter/CustomConverterIntegrationTest.java b/spring-boot-modules/spring-boot-basic-customization-2/src/test/java/com/baeldung/typeconversion/converter/CustomConverterIntegrationTest.java similarity index 90% rename from spring-boot-modules/spring-boot/src/test/java/com/baeldung/converter/CustomConverterIntegrationTest.java rename to spring-boot-modules/spring-boot-basic-customization-2/src/test/java/com/baeldung/typeconversion/converter/CustomConverterIntegrationTest.java index 4619964783..3e12e3c58d 100644 --- a/spring-boot-modules/spring-boot/src/test/java/com/baeldung/converter/CustomConverterIntegrationTest.java +++ b/spring-boot-modules/spring-boot-basic-customization-2/src/test/java/com/baeldung/typeconversion/converter/CustomConverterIntegrationTest.java @@ -1,9 +1,9 @@ -package com.baeldung.converter; +package com.baeldung.typeconversion.converter; -import com.baeldung.toggle.Employee; +import com.baeldung.typeconversion.Application; +import com.baeldung.typeconversion.domain.Modes; +import com.baeldung.typeconversion.entity.Employee; -import com.baeldung.boot.Application; -import com.baeldung.boot.domain.Modes; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring-boot-modules/spring-boot/src/test/java/com/baeldung/converter/controller/StringToEmployeeConverterControllerIntegrationTest.java b/spring-boot-modules/spring-boot-basic-customization-2/src/test/java/com/baeldung/typeconversion/converter/controller/StringToEmployeeConverterControllerIntegrationTest.java similarity index 92% rename from spring-boot-modules/spring-boot/src/test/java/com/baeldung/converter/controller/StringToEmployeeConverterControllerIntegrationTest.java rename to spring-boot-modules/spring-boot-basic-customization-2/src/test/java/com/baeldung/typeconversion/converter/controller/StringToEmployeeConverterControllerIntegrationTest.java index 52dc542ebf..8632eebda3 100644 --- a/spring-boot-modules/spring-boot/src/test/java/com/baeldung/converter/controller/StringToEmployeeConverterControllerIntegrationTest.java +++ b/spring-boot-modules/spring-boot-basic-customization-2/src/test/java/com/baeldung/typeconversion/converter/controller/StringToEmployeeConverterControllerIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.converter.controller; +package com.baeldung.typeconversion.converter.controller; import org.junit.Test; import org.junit.runner.RunWith; @@ -8,14 +8,14 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; +import com.baeldung.typeconversion.Application; + import static org.hamcrest.CoreMatchers.is; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import com.baeldung.boot.Application; - @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK, classes = Application.class) @AutoConfigureMockMvc diff --git a/spring-boot-modules/spring-boot-crud/README.md b/spring-boot-modules/spring-boot-crud/README.md index 6b0032deb3..3d3d8f42d7 100644 --- a/spring-boot-modules/spring-boot-crud/README.md +++ b/spring-boot-modules/spring-boot-crud/README.md @@ -5,3 +5,4 @@ This module contains articles about Spring Boot CRUD Operations ### Relevant Articles: - [Spring Boot CRUD Application with Thymeleaf](https://www.baeldung.com/spring-boot-crud-thymeleaf) - [Using a Spring Boot Application as a Dependency](https://www.baeldung.com/spring-boot-dependency) +- [A Guide to Spring in Eclipse STS](https://www.baeldung.com/eclipse-sts-spring) \ No newline at end of file diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/DemoApplication.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/demo/DemoApplication.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/DemoApplication.java rename to spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/demo/DemoApplication.java diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/components/FooService.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/demo/components/FooService.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/components/FooService.java rename to spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/demo/components/FooService.java diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/exceptions/CommonException.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/demo/exceptions/CommonException.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/exceptions/CommonException.java rename to spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/demo/exceptions/CommonException.java diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/exceptions/FooNotFoundException.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/demo/exceptions/FooNotFoundException.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/exceptions/FooNotFoundException.java rename to spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/demo/exceptions/FooNotFoundException.java diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/model/Foo.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/demo/model/Foo.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/model/Foo.java rename to spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/demo/model/Foo.java diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/repository/FooRepository.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/demo/repository/FooRepository.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/repository/FooRepository.java rename to spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/demo/repository/FooRepository.java diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/service/FooController.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/demo/service/FooController.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/service/FooController.java rename to spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/demo/service/FooController.java diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/session/exception/Application.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/session/exception/Application.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/session/exception/Application.java rename to spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/session/exception/Application.java diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/session/exception/repository/FooRepository.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/session/exception/repository/FooRepository.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/session/exception/repository/FooRepository.java rename to spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/session/exception/repository/FooRepository.java diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/session/exception/repository/FooRepositoryImpl.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/session/exception/repository/FooRepositoryImpl.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/session/exception/repository/FooRepositoryImpl.java rename to spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/session/exception/repository/FooRepositoryImpl.java diff --git a/spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/ApplicationIntegrationTest.java b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/boot/ApplicationIntegrationTest.java similarity index 99% rename from spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/ApplicationIntegrationTest.java rename to spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/boot/ApplicationIntegrationTest.java index 462291e0ac..88ff8c75f1 100644 --- a/spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/ApplicationIntegrationTest.java +++ b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/boot/ApplicationIntegrationTest.java @@ -1,12 +1,13 @@ package com.baeldung.boot; -import com.baeldung.session.exception.Application; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; +import com.baeldung.session.exception.Application; + @RunWith(SpringRunner.class) @SpringBootTest(classes = Application.class) @TestPropertySource("classpath:exception.properties") diff --git a/spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/repository/FooRepositoryIntegrationTest.java b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/boot/repository/FooRepositoryIntegrationTest.java similarity index 94% rename from spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/repository/FooRepositoryIntegrationTest.java rename to spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/boot/repository/FooRepositoryIntegrationTest.java index 1772739d20..9de1f56af0 100644 --- a/spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/repository/FooRepositoryIntegrationTest.java +++ b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/boot/repository/FooRepositoryIntegrationTest.java @@ -1,6 +1,6 @@ package com.baeldung.boot.repository; -import com.baeldung.boot.DemoApplicationIntegrationTest; +import com.baeldung.demo.DemoApplicationIntegrationTest; import com.baeldung.demo.model.Foo; import com.baeldung.demo.repository.FooRepository; import org.junit.Before; diff --git a/spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/repository/HibernateSessionIntegrationTest.java b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/boot/repository/HibernateSessionIntegrationTest.java similarity index 94% rename from spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/repository/HibernateSessionIntegrationTest.java rename to spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/boot/repository/HibernateSessionIntegrationTest.java index 2fe072bb67..63b4734cf0 100644 --- a/spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/repository/HibernateSessionIntegrationTest.java +++ b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/boot/repository/HibernateSessionIntegrationTest.java @@ -1,6 +1,6 @@ package com.baeldung.boot.repository; -import com.baeldung.boot.DemoApplicationIntegrationTest; +import com.baeldung.demo.DemoApplicationIntegrationTest; import com.baeldung.demo.model.Foo; import com.baeldung.demo.repository.FooRepository; import org.junit.Test; diff --git a/spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/repository/NoHibernateSessionIntegrationTest.java b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/boot/repository/NoHibernateSessionIntegrationTest.java similarity index 99% rename from spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/repository/NoHibernateSessionIntegrationTest.java rename to spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/boot/repository/NoHibernateSessionIntegrationTest.java index 2e3326e6b1..ae20b15cb3 100644 --- a/spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/repository/NoHibernateSessionIntegrationTest.java +++ b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/boot/repository/NoHibernateSessionIntegrationTest.java @@ -3,6 +3,7 @@ package com.baeldung.boot.repository; import com.baeldung.boot.ApplicationIntegrationTest; import com.baeldung.demo.model.Foo; import com.baeldung.session.exception.repository.FooRepository; + import org.hibernate.HibernateException; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/DemoApplicationIntegrationTest.java b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/demo/DemoApplicationIntegrationTest.java similarity index 95% rename from spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/DemoApplicationIntegrationTest.java rename to spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/demo/DemoApplicationIntegrationTest.java index aaf4f1f780..3d72ec0140 100644 --- a/spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/DemoApplicationIntegrationTest.java +++ b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/demo/DemoApplicationIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.boot; +package com.baeldung.demo; import com.baeldung.demo.DemoApplication; import org.junit.Test; diff --git a/spring-boot-modules/spring-boot/src/test/resources/exception-hibernate.properties b/spring-boot-modules/spring-boot-crud/src/test/resources/exception-hibernate.properties similarity index 100% rename from spring-boot-modules/spring-boot/src/test/resources/exception-hibernate.properties rename to spring-boot-modules/spring-boot-crud/src/test/resources/exception-hibernate.properties diff --git a/spring-boot-modules/spring-boot/src/test/resources/exception.properties b/spring-boot-modules/spring-boot-crud/src/test/resources/exception.properties similarity index 100% rename from spring-boot-modules/spring-boot/src/test/resources/exception.properties rename to spring-boot-modules/spring-boot-crud/src/test/resources/exception.properties diff --git a/spring-boot-modules/spring-boot/src/main/resources/templates/displayallbeans.html b/spring-boot-modules/spring-boot-di/src/main/resources/templates/displayallbeans.html similarity index 100% rename from spring-boot-modules/spring-boot/src/main/resources/templates/displayallbeans.html rename to spring-boot-modules/spring-boot-di/src/main/resources/templates/displayallbeans.html diff --git a/spring-boot-modules/spring-boot-mvc-3/README.md b/spring-boot-modules/spring-boot-mvc-3/README.md index fa24ac11ed..e4b0a73bda 100644 --- a/spring-boot-modules/spring-boot-mvc-3/README.md +++ b/spring-boot-modules/spring-boot-mvc-3/README.md @@ -11,4 +11,4 @@ This module contains articles about Spring Web MVC in Spring Boot projects. - [CharacterEncodingFilter In SpringBoot](https://www.baeldung.com/spring-boot-characterencodingfilter) - [HandlerInterceptors vs. Filters in Spring MVC](https://www.baeldung.com/spring-mvc-handlerinterceptor-vs-filter) - [ETags for REST with Spring](https://www.baeldung.com/etags-for-rest-with-spring) -- More articles: [[prev -->]](/spring-boot-modules/spring-boot-mvc-2) +- More articles: [[<-- Prev]](/spring-boot-modules/spring-boot-mvc-2)[[Next -->]](/spring-boot-modules/spring-boot-mvc-4) diff --git a/spring-boot-modules/spring-boot-mvc-4/README.md b/spring-boot-modules/spring-boot-mvc-4/README.md new file mode 100644 index 0000000000..68fcfa8b6b --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-4/README.md @@ -0,0 +1,10 @@ +## Spring Boot MVC + +This module contains articles about Spring Web MVC in Spring Boot projects. + +### Relevant Articles: + +- [How to Register a Servlet in Java](https://www.baeldung.com/register-servlet) +- [Guide to Spring WebUtils and ServletRequestUtils](https://www.baeldung.com/spring-webutils-servletrequestutils) +- [Configure a Spring Boot Web Application](https://www.baeldung.com/spring-boot-application-configuration) +- More articles: [[<-- Prev]](/spring-boot-modules/spring-boot-mvc-3) diff --git a/spring-boot-modules/spring-boot-mvc-4/pom.xml b/spring-boot-modules/spring-boot-mvc-4/pom.xml new file mode 100644 index 0000000000..7d4d6e3d0c --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-4/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + spring-boot-mvc-4 + spring-boot-mvc-4 + jar + Module For Spring Boot MVC Web + + + com.baeldung.spring-boot-modules + spring-boot-modules + 1.0.0-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.h2database + h2 + + + commons-io + commons-io + ${commons-io.version} + + + + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/controller/servlet/HelloWorldServlet.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/boot/controller/servlet/HelloWorldServlet.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/controller/servlet/HelloWorldServlet.java rename to spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/boot/controller/servlet/HelloWorldServlet.java diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/controller/servlet/SpringHelloWorldServlet.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/boot/controller/servlet/SpringHelloWorldServlet.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/controller/servlet/SpringHelloWorldServlet.java rename to spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/boot/controller/servlet/SpringHelloWorldServlet.java diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/error/MyCustomErrorController.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/common/error/MyCustomErrorController.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/error/MyCustomErrorController.java rename to spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/common/error/MyCustomErrorController.java diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/error/SpringHelloServletRegistrationBean.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/common/error/SpringHelloServletRegistrationBean.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/error/SpringHelloServletRegistrationBean.java rename to spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/common/error/SpringHelloServletRegistrationBean.java diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/error/controller/ErrorController.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/common/error/controller/ErrorController.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/error/controller/ErrorController.java rename to spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/common/error/controller/ErrorController.java diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/properties/MyServletContainerCustomizationBean.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/common/properties/MyServletContainerCustomizationBean.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/properties/MyServletContainerCustomizationBean.java rename to spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/common/properties/MyServletContainerCustomizationBean.java diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/resources/ExecutorServiceExitCodeGenerator.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/common/resources/ExecutorServiceExitCodeGenerator.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/resources/ExecutorServiceExitCodeGenerator.java rename to spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/common/resources/ExecutorServiceExitCodeGenerator.java diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/main/SpringBootApplication.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/main/SpringBootApplication.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/main/SpringBootApplication.java rename to spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/main/SpringBootApplication.java diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/servlets/ApplicationMain.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/servlets/ApplicationMain.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/servlets/ApplicationMain.java rename to spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/servlets/ApplicationMain.java diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/servlets/configuration/WebAppInitializer.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/servlets/configuration/WebAppInitializer.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/servlets/configuration/WebAppInitializer.java rename to spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/servlets/configuration/WebAppInitializer.java diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/servlets/configuration/WebMvcConfigure.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/servlets/configuration/WebMvcConfigure.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/servlets/configuration/WebMvcConfigure.java rename to spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/servlets/configuration/WebMvcConfigure.java diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/servlets/props/Constants.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/servlets/props/Constants.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/servlets/props/Constants.java rename to spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/servlets/props/Constants.java diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/servlets/props/PropertyLoader.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/servlets/props/PropertyLoader.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/servlets/props/PropertyLoader.java rename to spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/servlets/props/PropertyLoader.java diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/servlets/props/PropertySourcesLoader.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/servlets/props/PropertySourcesLoader.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/servlets/props/PropertySourcesLoader.java rename to spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/servlets/props/PropertySourcesLoader.java diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/servlets/servlets/GenericCustomServlet.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/servlets/servlets/GenericCustomServlet.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/servlets/servlets/GenericCustomServlet.java rename to spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/servlets/servlets/GenericCustomServlet.java diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/servlets/servlets/javaee/AnnotationServlet.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/servlets/servlets/javaee/AnnotationServlet.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/servlets/servlets/javaee/AnnotationServlet.java rename to spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/servlets/servlets/javaee/AnnotationServlet.java diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/servlets/servlets/javaee/EEWebXmlServlet.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/servlets/servlets/javaee/EEWebXmlServlet.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/servlets/servlets/javaee/EEWebXmlServlet.java rename to spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/servlets/servlets/javaee/EEWebXmlServlet.java diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/servlets/servlets/springboot/SpringRegistrationBeanServlet.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/servlets/servlets/springboot/SpringRegistrationBeanServlet.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/servlets/servlets/springboot/SpringRegistrationBeanServlet.java rename to spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/servlets/servlets/springboot/SpringRegistrationBeanServlet.java diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/servlets/servlets/springboot/embedded/EmbeddedTomcatExample.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/servlets/servlets/springboot/embedded/EmbeddedTomcatExample.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/servlets/servlets/springboot/embedded/EmbeddedTomcatExample.java rename to spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/servlets/servlets/springboot/embedded/EmbeddedTomcatExample.java diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/utils/UtilsApplication.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/utils/UtilsApplication.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/utils/UtilsApplication.java rename to spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/utils/UtilsApplication.java diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/utils/controller/UtilsController.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/utils/controller/UtilsController.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/utils/controller/UtilsController.java rename to spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/utils/controller/UtilsController.java diff --git a/spring-boot-modules/spring-boot/src/main/resources/application.properties b/spring-boot-modules/spring-boot-mvc-4/src/main/resources/application.properties similarity index 100% rename from spring-boot-modules/spring-boot/src/main/resources/application.properties rename to spring-boot-modules/spring-boot-mvc-4/src/main/resources/application.properties diff --git a/spring-boot-modules/spring-boot/src/main/resources/custom.properties b/spring-boot-modules/spring-boot-mvc-4/src/main/resources/custom.properties similarity index 100% rename from spring-boot-modules/spring-boot/src/main/resources/custom.properties rename to spring-boot-modules/spring-boot-mvc-4/src/main/resources/custom.properties diff --git a/spring-boot-modules/spring-boot/src/main/resources/logback.xml b/spring-boot-modules/spring-boot-mvc-4/src/main/resources/logback.xml similarity index 57% rename from spring-boot-modules/spring-boot/src/main/resources/logback.xml rename to spring-boot-modules/spring-boot-mvc-4/src/main/resources/logback.xml index 56af2d397e..7d900d8ea8 100644 --- a/spring-boot-modules/spring-boot/src/main/resources/logback.xml +++ b/spring-boot-modules/spring-boot-mvc-4/src/main/resources/logback.xml @@ -7,12 +7,6 @@ - - - - - - diff --git a/spring-boot-modules/spring-boot/src/main/resources/shutdown/shutdown.bat b/spring-boot-modules/spring-boot-mvc-4/src/main/resources/shutdown/shutdown.bat similarity index 100% rename from spring-boot-modules/spring-boot/src/main/resources/shutdown/shutdown.bat rename to spring-boot-modules/spring-boot-mvc-4/src/main/resources/shutdown/shutdown.bat diff --git a/spring-boot-modules/spring-boot/src/main/resources/templates/other.html b/spring-boot-modules/spring-boot-mvc-4/src/main/resources/templates/other.html similarity index 100% rename from spring-boot-modules/spring-boot/src/main/resources/templates/other.html rename to spring-boot-modules/spring-boot-mvc-4/src/main/resources/templates/other.html diff --git a/spring-boot-modules/spring-boot/src/main/resources/templates/utils.html b/spring-boot-modules/spring-boot-mvc-4/src/main/resources/templates/utils.html similarity index 100% rename from spring-boot-modules/spring-boot/src/main/resources/templates/utils.html rename to spring-boot-modules/spring-boot-mvc-4/src/main/resources/templates/utils.html diff --git a/spring-boot-modules/spring-boot/src/main/webapp/WEB-INF/context.xml b/spring-boot-modules/spring-boot-mvc-4/src/main/webapp/WEB-INF/context.xml similarity index 100% rename from spring-boot-modules/spring-boot/src/main/webapp/WEB-INF/context.xml rename to spring-boot-modules/spring-boot-mvc-4/src/main/webapp/WEB-INF/context.xml diff --git a/spring-boot-modules/spring-boot/src/main/webapp/WEB-INF/dispatcher.xml b/spring-boot-modules/spring-boot-mvc-4/src/main/webapp/WEB-INF/dispatcher.xml similarity index 100% rename from spring-boot-modules/spring-boot/src/main/webapp/WEB-INF/dispatcher.xml rename to spring-boot-modules/spring-boot-mvc-4/src/main/webapp/WEB-INF/dispatcher.xml diff --git a/spring-boot-modules/spring-boot/src/main/webapp/WEB-INF/web.xml b/spring-boot-modules/spring-boot-mvc-4/src/main/webapp/WEB-INF/web.xml similarity index 100% rename from spring-boot-modules/spring-boot/src/main/webapp/WEB-INF/web.xml rename to spring-boot-modules/spring-boot-mvc-4/src/main/webapp/WEB-INF/web.xml diff --git a/spring-boot-modules/spring-boot/src/main/webapp/annotationservlet.jsp b/spring-boot-modules/spring-boot-mvc-4/src/main/webapp/annotationservlet.jsp similarity index 100% rename from spring-boot-modules/spring-boot/src/main/webapp/annotationservlet.jsp rename to spring-boot-modules/spring-boot-mvc-4/src/main/webapp/annotationservlet.jsp diff --git a/spring-boot-modules/spring-boot/src/main/webapp/index.jsp b/spring-boot-modules/spring-boot-mvc-4/src/main/webapp/index.jsp similarity index 100% rename from spring-boot-modules/spring-boot/src/main/webapp/index.jsp rename to spring-boot-modules/spring-boot-mvc-4/src/main/webapp/index.jsp diff --git a/spring-boot-modules/spring-boot/src/test/java/com/baeldung/utils/UtilsControllerIntegrationTest.java b/spring-boot-modules/spring-boot-mvc-4/src/test/java/com/baeldung/utils/UtilsControllerIntegrationTest.java similarity index 100% rename from spring-boot-modules/spring-boot/src/test/java/com/baeldung/utils/UtilsControllerIntegrationTest.java rename to spring-boot-modules/spring-boot-mvc-4/src/test/java/com/baeldung/utils/UtilsControllerIntegrationTest.java diff --git a/spring-boot-modules/spring-boot-validation/README.md b/spring-boot-modules/spring-boot-validation/README.md index 8c3c8b9305..93b6e7d2d1 100644 --- a/spring-boot-modules/spring-boot-validation/README.md +++ b/spring-boot-modules/spring-boot-validation/README.md @@ -1,3 +1,4 @@ ### Relevant Articles - [Spring Validation in the Service Layer](https://www.baeldung.com/spring-service-layer-validation) +- [Validation in Spring Boot](https://www.baeldung.com/spring-boot-bean-validation) diff --git a/spring-boot-modules/spring-boot-validation/pom.xml b/spring-boot-modules/spring-boot-validation/pom.xml index fa4e8439e6..639a62059d 100644 --- a/spring-boot-modules/spring-boot-validation/pom.xml +++ b/spring-boot-modules/spring-boot-validation/pom.xml @@ -22,6 +22,14 @@ org.hibernate.validator hibernate-validator + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.h2database + h2 + diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/beanvalidation/application/Application.java b/spring-boot-modules/spring-boot-validation/src/main/java/com/baeldung/beanvalidation/application/Application.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/beanvalidation/application/Application.java rename to spring-boot-modules/spring-boot-validation/src/main/java/com/baeldung/beanvalidation/application/Application.java diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/beanvalidation/application/controllers/UserController.java b/spring-boot-modules/spring-boot-validation/src/main/java/com/baeldung/beanvalidation/application/controllers/UserController.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/beanvalidation/application/controllers/UserController.java rename to spring-boot-modules/spring-boot-validation/src/main/java/com/baeldung/beanvalidation/application/controllers/UserController.java diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/beanvalidation/application/entities/User.java b/spring-boot-modules/spring-boot-validation/src/main/java/com/baeldung/beanvalidation/application/entities/User.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/beanvalidation/application/entities/User.java rename to spring-boot-modules/spring-boot-validation/src/main/java/com/baeldung/beanvalidation/application/entities/User.java diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/beanvalidation/application/repositories/UserRepository.java b/spring-boot-modules/spring-boot-validation/src/main/java/com/baeldung/beanvalidation/application/repositories/UserRepository.java similarity index 100% rename from spring-boot-modules/spring-boot/src/main/java/com/baeldung/beanvalidation/application/repositories/UserRepository.java rename to spring-boot-modules/spring-boot-validation/src/main/java/com/baeldung/beanvalidation/application/repositories/UserRepository.java diff --git a/spring-boot-modules/spring-boot/src/test/java/com/baeldung/beanvalidation/application/UserControllerIntegrationTest.java b/spring-boot-modules/spring-boot-validation/src/test/java/com/baeldung/beanvalidation/application/UserControllerIntegrationTest.java similarity index 100% rename from spring-boot-modules/spring-boot/src/test/java/com/baeldung/beanvalidation/application/UserControllerIntegrationTest.java rename to spring-boot-modules/spring-boot-validation/src/test/java/com/baeldung/beanvalidation/application/UserControllerIntegrationTest.java diff --git a/spring-boot-modules/spring-boot/.gitignore b/spring-boot-modules/spring-boot/.gitignore deleted file mode 100644 index da7c2c5c0a..0000000000 --- a/spring-boot-modules/spring-boot/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -/target/ -.settings/ -.classpath -.project - diff --git a/spring-boot-modules/spring-boot/.mvn/wrapper/maven-wrapper.properties b/spring-boot-modules/spring-boot/.mvn/wrapper/maven-wrapper.properties deleted file mode 100755 index a447c9fa81..0000000000 --- a/spring-boot-modules/spring-boot/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1 +0,0 @@ -distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.2/apache-maven-3.5.2-bin.zip \ No newline at end of file diff --git a/spring-boot-modules/spring-boot/README.md b/spring-boot-modules/spring-boot/README.md deleted file mode 100644 index fdc8093806..0000000000 --- a/spring-boot-modules/spring-boot/README.md +++ /dev/null @@ -1,16 +0,0 @@ -## Spring Boot - -This module contains articles about Spring Boot - -### The Course -The "REST With Spring" Classes: http://bit.ly/restwithspring - -### Relevant Articles: - -- [A Guide to Spring in Eclipse STS](https://www.baeldung.com/eclipse-sts-spring) -- [Guide to Spring Type Conversions](https://www.baeldung.com/spring-type-conversions) -- [Spring Boot: Configuring a Main Class](https://www.baeldung.com/spring-boot-main-class) -- [Container Configuration in Spring Boot 2](https://www.baeldung.com/embeddedservletcontainercustomizer-configurableembeddedservletcontainer-spring-boot) -- [Validation in Spring Boot](https://www.baeldung.com/spring-boot-bean-validation) -- [How to Register a Servlet in Java](https://www.baeldung.com/register-servlet) -- [Guide to Spring WebUtils and ServletRequestUtils](https://www.baeldung.com/spring-webutils-servletrequestutils) diff --git a/spring-boot-modules/spring-boot/mvnw b/spring-boot-modules/spring-boot/mvnw deleted file mode 100755 index e96ccd5fbb..0000000000 --- a/spring-boot-modules/spring-boot/mvnw +++ /dev/null @@ -1,227 +0,0 @@ -#!/bin/sh -# ---------------------------------------------------------------------------- -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# ---------------------------------------------------------------------------- - -# ---------------------------------------------------------------------------- -# Maven2 Start Up Batch script -# -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir -# -# Optional ENV vars -# ----------------- -# M2_HOME - location of maven2's installed home dir -# MAVEN_OPTS - parameters passed to the Java VM when running Maven -# e.g. to debug Maven itself, use -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files -# ---------------------------------------------------------------------------- - -if [ -z "$MAVEN_SKIP_RC" ] ; then - - if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc - fi - - if [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" - fi - -fi - -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -mingw=false -case "`uname`" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - export JAVA_HOME="`/usr/libexec/java_home`" - else - export JAVA_HOME="/Library/Java/Home" - fi - fi - ;; -esac - -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=`java-config --jre-home` - fi -fi - -if [ -z "$M2_HOME" ] ; then - ## resolve links - $0 may be a link to maven's home - PRG="$0" - - # need this for relative symlinks - while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi - done - - saveddir=`pwd` - - M2_HOME=`dirname "$PRG"`/.. - - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` - - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi - -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` -fi - -# For Mingw, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" - # TODO classpath? -fi - -if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then - if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" - else - javaExecutable="`readlink -f \"$javaExecutable\"`" - fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi - -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD="`which java`" - fi -fi - -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi - -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." -fi - -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher - -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { - - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 - fi - - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break - fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=`cd "$wdir/.."; pwd` - fi - # end of workaround - done - echo "${basedir}" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" - fi -} - -BASE_DIR=`find_maven_basedir "$(pwd)"` -if [ -z "$BASE_DIR" ]; then - exit 1; -fi - -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -if [ "$MVNW_VERBOSE" = true ]; then - echo $MAVEN_PROJECTBASEDIR -fi -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` -fi - -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -exec "$JAVACMD" \ - $MAVEN_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/spring-boot-modules/spring-boot/mvnw.cmd b/spring-boot-modules/spring-boot/mvnw.cmd deleted file mode 100755 index 6a6eec39ba..0000000000 --- a/spring-boot-modules/spring-boot/mvnw.cmd +++ /dev/null @@ -1,145 +0,0 @@ -@REM ---------------------------------------------------------------------------- -@REM Licensed to the Apache Software Foundation (ASF) under one -@REM or more contributor license agreements. See the NOTICE file -@REM distributed with this work for additional information -@REM regarding copyright ownership. The ASF licenses this file -@REM to you under the Apache License, Version 2.0 (the -@REM "License"); you may not use this file except in compliance -@REM with the License. You may obtain a copy of the License at -@REM -@REM http://www.apache.org/licenses/LICENSE-2.0 -@REM -@REM Unless required by applicable law or agreed to in writing, -@REM software distributed under the License is distributed on an -@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -@REM KIND, either express or implied. See the License for the -@REM specific language governing permissions and limitations -@REM under the License. -@REM ---------------------------------------------------------------------------- - -@REM ---------------------------------------------------------------------------- -@REM Maven2 Start Up Batch script -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir -@REM -@REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files -@REM ---------------------------------------------------------------------------- - -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM set title of command window -title %0 -@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" - -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%" == "on" pause - -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% - -exit /B %ERROR_CODE% diff --git a/spring-boot-modules/spring-boot/pom.xml b/spring-boot-modules/spring-boot/pom.xml deleted file mode 100644 index 3afccef925..0000000000 --- a/spring-boot-modules/spring-boot/pom.xml +++ /dev/null @@ -1,166 +0,0 @@ - - - 4.0.0 - spring-boot - 0.0.1-SNAPSHOT - spring-boot - war - This is simple boot application for Spring boot actuator test - - - com.baeldung.spring-boot-modules - spring-boot-modules - 1.0.0-SNAPSHOT - - - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-validation - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.ehcache - ehcache - - - org.hibernate - hibernate-ehcache - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-starter-tomcat - - - org.springframework.boot - spring-boot-starter-test - test - - - io.dropwizard.metrics - metrics-core - - - com.h2database - h2 - - - org.springframework.boot - spring-boot-starter - - - com.jayway.jsonpath - json-path - test - - - com.google.guava - guava - ${guava.version} - - - org.apache.tomcat - tomcat-servlet-api - ${tomee-servlet-api.version} - provided - - - org.apache.activemq - artemis-server - - - com.rometools - rome - ${rome.version} - - - - - spring-boot - - - src/main/resources - true - - - - - org.apache.maven.plugins - maven-war-plugin - - - org.apache.maven.plugins - maven-resources-plugin - - - @ - - false - - - - - - - - autoconfiguration - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - **/*LiveTest.java - **/*IntegrationTest.java - **/*IntTest.java - - - **/AutoconfigurationTest.java - - - - - - - json - - - - - - - - - - - com.baeldung.intro.App - 8.5.11 - 1.9.0 - @ - - - \ No newline at end of file diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/config/H2JpaConfig.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/config/H2JpaConfig.java deleted file mode 100644 index 928928c9a5..0000000000 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/config/H2JpaConfig.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.baeldung.boot.config; - -import java.util.Properties; - -import javax.persistence.EntityManagerFactory; -import javax.sql.DataSource; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.PropertySource; -import org.springframework.core.env.Environment; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; -import org.springframework.jdbc.datasource.DriverManagerDataSource; -import org.springframework.orm.jpa.JpaTransactionManager; -import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; -import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -@Configuration -@EnableJpaRepositories(basePackages = { "com.baeldung.boot.repository", "com.baeldung.boot.boottest", "com.baeldung.repository" }) -@PropertySource("classpath:persistence-generic-entity.properties") -@EnableTransactionManagement -public class H2JpaConfig { - - @Autowired - private Environment env; - - @Bean - public DataSource dataSource() { - final DriverManagerDataSource dataSource = new DriverManagerDataSource(); - dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName")); - dataSource.setUrl(env.getProperty("jdbc.url")); - dataSource.setUsername(env.getProperty("jdbc.user")); - dataSource.setPassword(env.getProperty("jdbc.pass")); - - return dataSource; - } - - @Bean - public LocalContainerEntityManagerFactoryBean entityManagerFactory() { - final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); - em.setDataSource(dataSource()); - em.setPackagesToScan(new String[] { "com.baeldung.boot.domain", "com.baeldung.boot.model", "com.baeldung.boot.boottest", "com.baeldung.model" }); - em.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); - em.setJpaProperties(additionalProperties()); - return em; - } - - @Bean - JpaTransactionManager transactionManager(final EntityManagerFactory entityManagerFactory) { - final JpaTransactionManager transactionManager = new JpaTransactionManager(); - transactionManager.setEntityManagerFactory(entityManagerFactory); - return transactionManager; - } - - final Properties additionalProperties() { - final Properties hibernateProperties = new Properties(); - - hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto")); - hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect")); - hibernateProperties.setProperty("hibernate.show_sql", env.getProperty("hibernate.show_sql")); - - return hibernateProperties; - } - -} diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/domain/Modes.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/domain/Modes.java deleted file mode 100644 index 7717294996..0000000000 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/domain/Modes.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.baeldung.boot.domain; - -public enum Modes { - - ALPHA, BETA; -} diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/buildproperties/Application.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/buildproperties/Application.java deleted file mode 100644 index 405cec3eac..0000000000 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/buildproperties/Application.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.baeldung.buildproperties; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.PropertySource; - -@SpringBootApplication -@ComponentScan(basePackages = "com.baeldung.buildproperties") -@PropertySource("classpath:build.properties") -//@PropertySource("classpath:build.yml") -public class Application { - - public static void main(String[] args) { - SpringApplication.run(Application.class, args); - } - -} diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/buildproperties/BuildInfoService.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/buildproperties/BuildInfoService.java deleted file mode 100644 index 2a0d27188e..0000000000 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/buildproperties/BuildInfoService.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.buildproperties; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -@Service -public class BuildInfoService { - @Value("${application-description}") - private String applicationDescription; - - @Value("${application-version}") - private String applicationVersion; - - public String getApplicationDescription() { - return applicationDescription; - } - - public String getApplicationVersion() { - return applicationVersion; - } -} diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/intro/App.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/intro/App.java deleted file mode 100644 index 77cdf4ddb9..0000000000 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/intro/App.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.baeldung.intro; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class App { - public static void main(String[] args) { - SpringApplication.run(App.class, args); - } -} diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/intro/controller/HomeController.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/intro/controller/HomeController.java deleted file mode 100644 index 4797d6e593..0000000000 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/intro/controller/HomeController.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.baeldung.intro.controller; - -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -public class HomeController { - - @GetMapping("/") - public String root() { - return "Index Page"; - } - - @GetMapping("/local") - public String local() { - return "/local"; - } -} diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/jsondateformat/Contact.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/jsondateformat/Contact.java deleted file mode 100644 index f131d17196..0000000000 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/jsondateformat/Contact.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.baeldung.jsondateformat; - -import com.fasterxml.jackson.annotation.JsonFormat; - -import java.time.LocalDate; -import java.time.LocalDateTime; - -public class Contact { - - private String name; - private String address; - private String phone; - - @JsonFormat(pattern="yyyy-MM-dd") - private LocalDate birthday; - - @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") - private LocalDateTime lastUpdate; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getAddress() { - return address; - } - - public void setAddress(String address) { - this.address = address; - } - - public String getPhone() { - return phone; - } - - public void setPhone(String phone) { - this.phone = phone; - } - - public LocalDate getBirthday() { - return birthday; - } - - public void setBirthday(LocalDate birthday) { - this.birthday = birthday; - } - - public LocalDateTime getLastUpdate() { - return lastUpdate; - } - - public void setLastUpdate(LocalDateTime lastUpdate) { - this.lastUpdate = lastUpdate; - } - - public Contact() { - } - - public Contact(String name, String address, String phone, LocalDate birthday, LocalDateTime lastUpdate) { - this.name = name; - this.address = address; - this.phone = phone; - this.birthday = birthday; - this.lastUpdate = lastUpdate; - } -} diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/jsondateformat/ContactApp.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/jsondateformat/ContactApp.java deleted file mode 100644 index 79037e1038..0000000000 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/jsondateformat/ContactApp.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.jsondateformat; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class ContactApp { - - public static void main(String[] args) { - SpringApplication.run(ContactApp.class, args); - } - -} diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/jsondateformat/ContactAppConfig.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/jsondateformat/ContactAppConfig.java deleted file mode 100644 index 7a20ebfa51..0000000000 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/jsondateformat/ContactAppConfig.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.baeldung.jsondateformat; - -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; - -import java.time.format.DateTimeFormatter; - -@Configuration -public class ContactAppConfig { - - private static final String dateFormat = "yyyy-MM-dd"; - - private static final String dateTimeFormat = "yyyy-MM-dd HH:mm:ss"; - - @Bean - @ConditionalOnProperty(value = "spring.jackson.date-format", matchIfMissing = true, havingValue = "none") - public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() { - return new Jackson2ObjectMapperBuilderCustomizer() { - @Override - public void customize(Jackson2ObjectMapperBuilder builder) { - builder.simpleDateFormat(dateTimeFormat); - builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(dateFormat))); - builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(dateTimeFormat))); - } - }; - } - -} diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/jsondateformat/ContactController.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/jsondateformat/ContactController.java deleted file mode 100644 index 8894d82fc7..0000000000 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/jsondateformat/ContactController.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.baeldung.jsondateformat; - -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -@RestController -@RequestMapping(value = "/contacts") -public class ContactController { - - @GetMapping - public List getContacts() { - List contacts = new ArrayList<>(); - - Contact contact1 = new Contact("John Doe", "123 Sesame Street", "123-456-789", LocalDate.now(), LocalDateTime.now()); - Contact contact2 = new Contact("John Doe 2", "124 Sesame Street", "123-456-789", LocalDate.now(), LocalDateTime.now()); - Contact contact3 = new Contact("John Doe 3", "125 Sesame Street", "123-456-789", LocalDate.now(), LocalDateTime.now()); - - contacts.add(contact1); - contacts.add(contact2); - contacts.add(contact3); - - return contacts; - } - - @GetMapping("/javaUtilDate") - public List getContactsWithJavaUtilDate() { - List contacts = new ArrayList<>(); - - ContactWithJavaUtilDate contact1 = new ContactWithJavaUtilDate("John Doe", "123 Sesame Street", "123-456-789", new Date(), new Date()); - ContactWithJavaUtilDate contact2 = new ContactWithJavaUtilDate("John Doe 2", "124 Sesame Street", "123-456-789", new Date(), new Date()); - ContactWithJavaUtilDate contact3 = new ContactWithJavaUtilDate("John Doe 3", "125 Sesame Street", "123-456-789", new Date(), new Date()); - - contacts.add(contact1); - contacts.add(contact2); - contacts.add(contact3); - - return contacts; - } - - @GetMapping("/plain") - public List getPlainContacts() { - List contacts = new ArrayList<>(); - - PlainContact contact1 = new PlainContact("John Doe", "123 Sesame Street", "123-456-789", LocalDate.now(), LocalDateTime.now()); - PlainContact contact2 = new PlainContact("John Doe 2", "124 Sesame Street", "123-456-789", LocalDate.now(), LocalDateTime.now()); - PlainContact contact3 = new PlainContact("John Doe 3", "125 Sesame Street", "123-456-789", LocalDate.now(), LocalDateTime.now()); - - contacts.add(contact1); - contacts.add(contact2); - contacts.add(contact3); - - return contacts; - } - - @GetMapping("/plainWithJavaUtilDate") - public List getPlainContactsWithJavaUtilDate() { - List contacts = new ArrayList<>(); - - PlainContactWithJavaUtilDate contact1 = new PlainContactWithJavaUtilDate("John Doe", "123 Sesame Street", "123-456-789", new Date(), new Date()); - PlainContactWithJavaUtilDate contact2 = new PlainContactWithJavaUtilDate("John Doe 2", "124 Sesame Street", "123-456-789", new Date(), new Date()); - PlainContactWithJavaUtilDate contact3 = new PlainContactWithJavaUtilDate("John Doe 3", "125 Sesame Street", "123-456-789", new Date(), new Date()); - - contacts.add(contact1); - contacts.add(contact2); - contacts.add(contact3); - - return contacts; - } - -} diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/jsondateformat/ContactWithJavaUtilDate.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/jsondateformat/ContactWithJavaUtilDate.java deleted file mode 100644 index 5a1c508098..0000000000 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/jsondateformat/ContactWithJavaUtilDate.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.baeldung.jsondateformat; - -import com.fasterxml.jackson.annotation.JsonFormat; - -import java.util.Date; - -public class ContactWithJavaUtilDate { - - private String name; - private String address; - private String phone; - - @JsonFormat(pattern="yyyy-MM-dd") - private Date birthday; - - @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") - private Date lastUpdate; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getAddress() { - return address; - } - - public void setAddress(String address) { - this.address = address; - } - - public String getPhone() { - return phone; - } - - public void setPhone(String phone) { - this.phone = phone; - } - - public Date getBirthday() { - return birthday; - } - - public void setBirthday(Date birthday) { - this.birthday = birthday; - } - - public Date getLastUpdate() { - return lastUpdate; - } - - public void setLastUpdate(Date lastUpdate) { - this.lastUpdate = lastUpdate; - } - - public ContactWithJavaUtilDate() { - } - - public ContactWithJavaUtilDate(String name, String address, String phone, Date birthday, Date lastUpdate) { - this.name = name; - this.address = address; - this.phone = phone; - this.birthday = birthday; - this.lastUpdate = lastUpdate; - } -} diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/jsondateformat/PlainContact.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/jsondateformat/PlainContact.java deleted file mode 100644 index 7e9e53d205..0000000000 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/jsondateformat/PlainContact.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.baeldung.jsondateformat; - -import java.time.LocalDate; -import java.time.LocalDateTime; - -public class PlainContact { - - private String name; - private String address; - private String phone; - - private LocalDate birthday; - - private LocalDateTime lastUpdate; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getAddress() { - return address; - } - - public void setAddress(String address) { - this.address = address; - } - - public String getPhone() { - return phone; - } - - public void setPhone(String phone) { - this.phone = phone; - } - - public LocalDate getBirthday() { - return birthday; - } - - public void setBirthday(LocalDate birthday) { - this.birthday = birthday; - } - - public LocalDateTime getLastUpdate() { - return lastUpdate; - } - - public void setLastUpdate(LocalDateTime lastUpdate) { - this.lastUpdate = lastUpdate; - } - - public PlainContact() { - } - - public PlainContact(String name, String address, String phone, LocalDate birthday, LocalDateTime lastUpdate) { - this.name = name; - this.address = address; - this.phone = phone; - this.birthday = birthday; - this.lastUpdate = lastUpdate; - } -} diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/jsondateformat/PlainContactWithJavaUtilDate.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/jsondateformat/PlainContactWithJavaUtilDate.java deleted file mode 100644 index daefb15543..0000000000 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/jsondateformat/PlainContactWithJavaUtilDate.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.baeldung.jsondateformat; - -import com.fasterxml.jackson.annotation.JsonFormat; - -import java.util.Date; - -public class PlainContactWithJavaUtilDate { - - private String name; - private String address; - private String phone; - - @JsonFormat(pattern="yyyy-MM-dd") - private Date birthday; - - @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") - private Date lastUpdate; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getAddress() { - return address; - } - - public void setAddress(String address) { - this.address = address; - } - - public String getPhone() { - return phone; - } - - public void setPhone(String phone) { - this.phone = phone; - } - - public Date getBirthday() { - return birthday; - } - - public void setBirthday(Date birthday) { - this.birthday = birthday; - } - - public Date getLastUpdate() { - return lastUpdate; - } - - public void setLastUpdate(Date lastUpdate) { - this.lastUpdate = lastUpdate; - } - - public PlainContactWithJavaUtilDate() { - } - - public PlainContactWithJavaUtilDate(String name, String address, String phone, Date birthday, Date lastUpdate) { - this.name = name; - this.address = address; - this.phone = phone; - this.birthday = birthday; - this.lastUpdate = lastUpdate; - } -} diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/model/User.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/model/User.java deleted file mode 100644 index cc5f27f38c..0000000000 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/model/User.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.baeldung.model; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; - -@Entity -@Table(name = "users") -public class User { - - @Id - @GeneratedValue - private Integer id; - private String name; - private Integer status; - - public User() { - } - - public User(String name, Integer status) { - this.name = name; - this.status = status; - } - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public Integer getStatus() { - return status; - } - - public void setStatus(Integer status) { - this.status = status; - } -} diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/repository/UserRepository.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/repository/UserRepository.java deleted file mode 100644 index 4dd863fb17..0000000000 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/repository/UserRepository.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.baeldung.repository; - -import com.baeldung.model.User; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Modifying; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Repository; - -import java.util.Collection; -import java.util.List; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; - -@Repository("userRepository") -public interface UserRepository extends JpaRepository { - - int countByStatus(int status); - - Optional findOneByName(String name); - - @Async - CompletableFuture findOneByStatus(Integer status); - - @Query("SELECT u FROM User u WHERE u.status = 1") - Collection findAllActiveUsers(); - - @Query(value = "SELECT * FROM USERS u WHERE u.status = 1", nativeQuery = true) - Collection findAllActiveUsersNative(); - - @Query("SELECT u FROM User u WHERE u.status = ?1") - User findUserByStatus(Integer status); - - @Query(value = "SELECT * FROM Users u WHERE u.status = ?1", nativeQuery = true) - User findUserByStatusNative(Integer status); - - @Query("SELECT u FROM User u WHERE u.status = ?1 and u.name = ?2") - User findUserByStatusAndName(Integer status, String name); - - @Query("SELECT u FROM User u WHERE u.status = :status and u.name = :name") - User findUserByStatusAndNameNamedParams(@Param("status") Integer status, @Param("name") String name); - - @Query(value = "SELECT * FROM Users u WHERE u.status = :status AND u.name = :name", nativeQuery = true) - User findUserByStatusAndNameNamedParamsNative(@Param("status") Integer status, @Param("name") String name); - - @Query("SELECT u FROM User u WHERE u.status = :status and u.name = :name") - User findUserByUserStatusAndUserName(@Param("status") Integer userStatus, @Param("name") String userName); - - @Query("SELECT u FROM User u WHERE u.name like ?1%") - User findUserByNameLike(String name); - - @Query("SELECT u FROM User u WHERE u.name like :name%") - User findUserByNameLikeNamedParam(@Param("name") String name); - - @Query(value = "SELECT * FROM users u WHERE u.name LIKE ?1%", nativeQuery = true) - User findUserByNameLikeNative(String name); - - @Query(value = "SELECT u FROM User u") - List findAllUsers(Sort sort); - - @Query(value = "SELECT u FROM User u ORDER BY id") - Page findAllUsersWithPagination(Pageable pageable); - - @Query(value = "SELECT * FROM Users ORDER BY id \n-- #pageable\n", countQuery = "SELECT count(*) FROM Users", nativeQuery = true) - Page findAllUsersWithPaginationNative(Pageable pageable); - - @Modifying - @Query("update User u set u.status = :status where u.name = :name") - int updateUserSetStatusForName(@Param("status") Integer status, @Param("name") String name); - - @Modifying - @Query(value = "UPDATE Users u SET u.status = ? WHERE u.name = ?", nativeQuery = true) - int updateUserSetStatusForNameNative(Integer status, String name); - -} diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/rss/ArticleFeedView.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/rss/ArticleFeedView.java deleted file mode 100644 index 3efa619409..0000000000 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/rss/ArticleFeedView.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.baeldung.rss; - -import com.rometools.rome.feed.rss.Channel; -import com.rometools.rome.feed.rss.Description; -import com.rometools.rome.feed.rss.Item; -import org.springframework.stereotype.Service; -import org.springframework.web.servlet.view.feed.AbstractRssFeedView; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Map; - -@Service("articleFeedView") -public class ArticleFeedView extends AbstractRssFeedView { - - protected Channel newFeed() { - Channel channel = new Channel("rss_2.0"); - channel.setLink("http://localhost:8080/rss"); - channel.setTitle("Article Feed"); - channel.setDescription("Article Feed Description"); - channel.setPubDate(new Date()); - return channel; - } - - @Override - protected List buildFeedItems(Map map, HttpServletRequest httpStRequest, HttpServletResponse httpStResponse) throws Exception { - List list = new ArrayList(); - - Item item1 = new Item(); - item1.setLink("http://www.baeldung.com/netty-exception-handling"); - item1.setTitle("Exceptions in Netty"); - Description description1 = new Description(); - description1.setValue("In this quick article, we’ll be looking at exception handling in Netty."); - item1.setDescription(description1); - item1.setPubDate(new Date()); - item1.setAuthor("Carlos"); - - Item item2 = new Item(); - item2.setLink("http://www.baeldung.com/cockroachdb-java"); - item2.setTitle("Guide to CockroachDB in Java"); - Description description2 = new Description(); - description2.setValue("This tutorial is an introductory guide to using CockroachDB with Java."); - item2.setDescription(description2); - item2.setPubDate(new Date()); - item2.setAuthor("Baeldung"); - - list.add(item1); - list.add(item2); - return list; - } -} diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/rss/ArticleRssController.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/rss/ArticleRssController.java deleted file mode 100644 index daaeb8159b..0000000000 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/rss/ArticleRssController.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.baeldung.rss; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; - -@Controller -@RequestMapping(value = "/rss", produces = "application/*") -public class ArticleRssController { - - @GetMapping - public String articleFeed() { - return "articleFeedView"; - } - -} diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/rss/RssApp.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/rss/RssApp.java deleted file mode 100644 index e067d3cfd1..0000000000 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/rss/RssApp.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.baeldung.rss; - -import javax.annotation.security.RolesAllowed; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; - -@SpringBootApplication -@ComponentScan(basePackages = "com.baeldung.rss") -public class RssApp { - - @RolesAllowed("*") - public static void main(String[] args) { - SpringApplication.run(RssApp.class, args); - } - -} diff --git a/spring-boot-modules/spring-boot/src/main/resources/application-errorhandling.properties b/spring-boot-modules/spring-boot/src/main/resources/application-errorhandling.properties deleted file mode 100644 index 270e86d443..0000000000 --- a/spring-boot-modules/spring-boot/src/main/resources/application-errorhandling.properties +++ /dev/null @@ -1,4 +0,0 @@ -#server -server.port=9000 -server.servlet-path=/ -server.context-path=/ \ No newline at end of file diff --git a/spring-boot-modules/spring-boot/src/main/resources/build.properties b/spring-boot-modules/spring-boot/src/main/resources/build.properties deleted file mode 100644 index 1612b8086d..0000000000 --- a/spring-boot-modules/spring-boot/src/main/resources/build.properties +++ /dev/null @@ -1,2 +0,0 @@ -application-description=@project.description@ -application-version=@project.version@ \ No newline at end of file diff --git a/spring-boot-modules/spring-boot/src/main/resources/build.yml b/spring-boot-modules/spring-boot/src/main/resources/build.yml deleted file mode 100644 index 528d2e3440..0000000000 --- a/spring-boot-modules/spring-boot/src/main/resources/build.yml +++ /dev/null @@ -1,2 +0,0 @@ -application-description: ^project.description^ -application-version: ^project.version^ \ No newline at end of file diff --git a/spring-boot-modules/spring-boot/src/main/resources/data-expressions.sql b/spring-boot-modules/spring-boot/src/main/resources/data-expressions.sql deleted file mode 100644 index 3e702a759d..0000000000 --- a/spring-boot-modules/spring-boot/src/main/resources/data-expressions.sql +++ /dev/null @@ -1,3 +0,0 @@ -insert into contact_info_expression values ('email','[a-z0-9!#$%&*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?') -insert into contact_info_expression values ('phone','^([0-9]( |-)?)?(\(?[0-9]{3}\)?|[0-9]{3})( |-)?([0-9]{3}( |-)?[0-9]{4}|[a-zA-Z0-9]{7})$') -insert into contact_info_expression values ('website','^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$') \ No newline at end of file diff --git a/spring-boot-modules/spring-boot/src/main/resources/data.sql b/spring-boot-modules/spring-boot/src/main/resources/data.sql deleted file mode 100644 index c44034c739..0000000000 --- a/spring-boot-modules/spring-boot/src/main/resources/data.sql +++ /dev/null @@ -1,5 +0,0 @@ -insert into users values (1, 'Alex', 1); -insert into users values (2, 'Bob', 1); -insert into users values (3, 'John', 0); -insert into users values (4, 'Harry', 0); -insert into users values (5, 'Smith', 1); \ No newline at end of file diff --git a/spring-boot-modules/spring-boot/src/main/resources/demo.properties b/spring-boot-modules/spring-boot/src/main/resources/demo.properties deleted file mode 100644 index 6b4cbeb7a0..0000000000 --- a/spring-boot-modules/spring-boot/src/main/resources/demo.properties +++ /dev/null @@ -1,2 +0,0 @@ -spring.output.ansi.enabled=never -server.port=7070 diff --git a/spring-boot-modules/spring-boot/src/main/resources/persistence-generic-entity.properties b/spring-boot-modules/spring-boot/src/main/resources/persistence-generic-entity.properties deleted file mode 100644 index b19304cb1f..0000000000 --- a/spring-boot-modules/spring-boot/src/main/resources/persistence-generic-entity.properties +++ /dev/null @@ -1,8 +0,0 @@ -jdbc.driverClassName=org.h2.Driver -jdbc.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1 -jdbc.user=sa -jdbc.pass=sa - -hibernate.dialect=org.hibernate.dialect.H2Dialect -hibernate.show_sql=true -hibernate.hbm2ddl.auto=create-drop diff --git a/spring-boot-modules/spring-boot/src/main/resources/public/error/404.html b/spring-boot-modules/spring-boot/src/main/resources/public/error/404.html deleted file mode 100644 index df83ce219b..0000000000 --- a/spring-boot-modules/spring-boot/src/main/resources/public/error/404.html +++ /dev/null @@ -1,8 +0,0 @@ - - - RESOURCE NOT FOUND - - -

404 RESOURCE NOT FOUND

- - \ No newline at end of file diff --git a/spring-boot-modules/spring-boot/src/main/resources/schema-expressions.sql b/spring-boot-modules/spring-boot/src/main/resources/schema-expressions.sql deleted file mode 100644 index 59f6ab05eb..0000000000 --- a/spring-boot-modules/spring-boot/src/main/resources/schema-expressions.sql +++ /dev/null @@ -1,5 +0,0 @@ -create table contact_info_expression( - expression_type varchar(50) not null, - pattern varchar(500) not null, - PRIMARY KEY ( expression_type ) -); \ No newline at end of file diff --git a/spring-boot-modules/spring-boot/src/main/resources/schema.sql b/spring-boot-modules/spring-boot/src/main/resources/schema.sql deleted file mode 100644 index 4cd345c762..0000000000 --- a/spring-boot-modules/spring-boot/src/main/resources/schema.sql +++ /dev/null @@ -1,8 +0,0 @@ -drop table if exists USERS; - -create table USERS( - ID int not null AUTO_INCREMENT, - NAME varchar(100) not null, - STATUS int, - PRIMARY KEY ( ID ) -); \ No newline at end of file diff --git a/spring-boot-modules/spring-boot/src/main/resources/templates/customers.html b/spring-boot-modules/spring-boot/src/main/resources/templates/customers.html deleted file mode 100644 index 5a060d31da..0000000000 --- a/spring-boot-modules/spring-boot/src/main/resources/templates/customers.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - -
-

- Hello, --name--. -

- - - - - - - - - - - - - - - - - -
IDNameAddressService Rendered
Text ...Text ...Text ...Text...
- -
- - - diff --git a/spring-boot-modules/spring-boot/src/main/resources/templates/error.html b/spring-boot-modules/spring-boot/src/main/resources/templates/error.html deleted file mode 100644 index bc517913b2..0000000000 --- a/spring-boot-modules/spring-boot/src/main/resources/templates/error.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - -
-
-

Something went wrong!

- -

Our Engineers are on it.

-

Go Home

-
- - diff --git a/spring-boot-modules/spring-boot/src/main/resources/templates/error/404.html b/spring-boot-modules/spring-boot/src/main/resources/templates/error/404.html deleted file mode 100644 index df83ce219b..0000000000 --- a/spring-boot-modules/spring-boot/src/main/resources/templates/error/404.html +++ /dev/null @@ -1,8 +0,0 @@ - - - RESOURCE NOT FOUND - - -

404 RESOURCE NOT FOUND

- - \ No newline at end of file diff --git a/spring-boot-modules/spring-boot/src/main/resources/templates/external.html b/spring-boot-modules/spring-boot/src/main/resources/templates/external.html deleted file mode 100644 index 2f9cc76961..0000000000 --- a/spring-boot-modules/spring-boot/src/main/resources/templates/external.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - -
-
-

Customer Portal

-
-
-

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam - erat lectus, vehicula feugiat ultricies at, tempus sed ante. Cras - arcu erat, lobortis vitae quam et, mollis pharetra odio. Nullam sit - amet congue ipsum. Nunc dapibus odio ut ligula venenatis porta non - id dui. Duis nec tempor tellus. Suspendisse id blandit ligula, sit - amet varius mauris. Nulla eu eros pharetra, tristique dui quis, - vehicula libero. Aenean a neque sit amet tellus porttitor rutrum nec - at leo.

- -

Existing Customers

-
- Enter the intranet: customers -
-
- -
- - - - diff --git a/spring-boot-modules/spring-boot/src/main/resources/templates/index.html b/spring-boot-modules/spring-boot/src/main/resources/templates/index.html deleted file mode 100644 index c1314558f6..0000000000 --- a/spring-boot-modules/spring-boot/src/main/resources/templates/index.html +++ /dev/null @@ -1,19 +0,0 @@ - - - WebJars Demo - - - -

Welcome Home

-

-
- × - Success! It is working as we expected. -
-
- - - - - - diff --git a/spring-boot-modules/spring-boot/src/main/resources/templates/layout.html b/spring-boot-modules/spring-boot/src/main/resources/templates/layout.html deleted file mode 100644 index bab0c2982b..0000000000 --- a/spring-boot-modules/spring-boot/src/main/resources/templates/layout.html +++ /dev/null @@ -1,18 +0,0 @@ - - - -Customer Portal - - - - - \ No newline at end of file diff --git a/spring-boot-modules/spring-boot/src/test/java/com/baeldung/buildproperties/BuildInfoServiceIntegrationTest.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/buildproperties/BuildInfoServiceIntegrationTest.java deleted file mode 100644 index cb056fe56d..0000000000 --- a/spring-boot-modules/spring-boot/src/test/java/com/baeldung/buildproperties/BuildInfoServiceIntegrationTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.baeldung.buildproperties; - -import static org.junit.Assert.assertThat; - -import org.hamcrest.Matchers; -import org.junit.jupiter.api.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = Application.class) -class BuildInfoServiceIntegrationTest { - - @Autowired - private BuildInfoService service; - - @Test - void whenGetApplicationDescription_thenSuccess() { - assertThat(service.getApplicationDescription(), Matchers.is("This is simple boot application for Spring boot actuator test")); - assertThat(service.getApplicationVersion(), Matchers.is("0.0.1-SNAPSHOT")); - } -} diff --git a/spring-boot-modules/spring-boot/src/test/java/com/baeldung/intro/AppLiveTest.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/intro/AppLiveTest.java deleted file mode 100644 index 2785054153..0000000000 --- a/spring-boot-modules/spring-boot/src/test/java/com/baeldung/intro/AppLiveTest.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.baeldung.intro; - -import static org.hamcrest.Matchers.equalTo; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.MediaType; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; - -@RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK) -@AutoConfigureMockMvc -public class AppLiveTest { - - @Autowired - private MockMvc mvc; - - @Test - public void getIndex() throws Exception { - mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk()).andExpect(content().string(equalTo("Index Page"))); - } - - @Test - public void getLocal() throws Exception { - mvc.perform(MockMvcRequestBuilders.get("/local").accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk()).andExpect(content().string(equalTo("/local"))); - } - -} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot/src/test/java/com/baeldung/jsondateformat/ContactAppUnitTest.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/jsondateformat/ContactAppUnitTest.java deleted file mode 100644 index 7be85b5e4f..0000000000 --- a/spring-boot-modules/spring-boot/src/test/java/com/baeldung/jsondateformat/ContactAppUnitTest.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.baeldung.jsondateformat; - -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.boot.web.server.LocalServerPort; -import org.springframework.http.ResponseEntity; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; - -import java.io.IOException; -import java.text.ParseException; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeParseException; -import java.util.List; -import java.util.Map; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; - -@RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = RANDOM_PORT, classes = ContactApp.class) -@TestPropertySource(properties = { - "spring.jackson.date-format=yyyy-MM-dd HH:mm:ss" -}) -public class ContactAppUnitTest { - - private final ObjectMapper mapper = new ObjectMapper(); - - @Autowired - TestRestTemplate restTemplate; - - @LocalServerPort - int port; - - String url; - - @Before - public void before() { - url=String.format("http://localhost:%s", port); - } - - @Test - public void givenJsonFormatAnnotationAndJava8DateType_whenGet_thenReturnExpectedDateFormat() throws IOException, ParseException { - ResponseEntity response = restTemplate.getForEntity(url + "/contacts", String.class); - - assertEquals(200, response.getStatusCodeValue()); - - List> respMap = mapper.readValue(response.getBody(), new TypeReference>>(){}); - - LocalDate birthdayDate = LocalDate.parse(respMap.get(0).get("birthday"), DateTimeFormatter.ofPattern("yyyy-MM-dd")); - LocalDateTime lastUpdateTime = LocalDateTime.parse(respMap.get(0).get("lastUpdate"), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); - - assertNotNull(birthdayDate); - assertNotNull(lastUpdateTime); - } - - @Test - public void givenJsonFormatAnnotationAndLegacyDateType_whenGet_thenReturnExpectedDateFormat() throws IOException { - ResponseEntity response = restTemplate.getForEntity(url + "/contacts/javaUtilDate", String.class); - - assertEquals(200, response.getStatusCodeValue()); - - List> respMap = mapper.readValue(response.getBody(), new TypeReference>>(){}); - - LocalDate birthdayDate = LocalDate.parse(respMap.get(0).get("birthday"), DateTimeFormatter.ofPattern("yyyy-MM-dd")); - LocalDateTime lastUpdateTime = LocalDateTime.parse(respMap.get(0).get("lastUpdate"), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); - - assertNotNull(birthdayDate); - assertNotNull(lastUpdateTime); - } - - @Test - public void givenDefaultDateFormatInAppPropertiesAndLegacyDateType_whenGet_thenReturnExpectedDateFormat() throws IOException { - ResponseEntity response = restTemplate.getForEntity(url + "/contacts/plainWithJavaUtilDate", String.class); - - assertEquals(200, response.getStatusCodeValue()); - - List> respMap = mapper.readValue(response.getBody(), new TypeReference>>(){}); - - LocalDate birthdayDate = LocalDate.parse(respMap.get(0).get("birthday"), DateTimeFormatter.ofPattern("yyyy-MM-dd")); - LocalDateTime lastUpdateTime = LocalDateTime.parse(respMap.get(0).get("lastUpdate"), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); - - assertNotNull(birthdayDate); - assertNotNull(lastUpdateTime); - } - - @Test(expected = DateTimeParseException.class) - public void givenDefaultDateFormatInAppPropertiesAndJava8DateType_whenGet_thenNotApplyFormat() throws IOException { - ResponseEntity response = restTemplate.getForEntity(url + "/contacts/plain", String.class); - - assertEquals(200, response.getStatusCodeValue()); - - List> respMap = mapper.readValue(response.getBody(), new TypeReference>>(){}); - - LocalDate birthdayDate = LocalDate.parse(respMap.get(0).get("birthday"), DateTimeFormatter.ofPattern("yyyy-MM-dd")); - LocalDateTime lastUpdateTime = LocalDateTime.parse(respMap.get(0).get("lastUpdate"), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); - } - -} diff --git a/spring-boot-modules/spring-boot/src/test/java/com/baeldung/jsondateformat/ContactAppWithObjectMapperCustomizerUnitTest.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/jsondateformat/ContactAppWithObjectMapperCustomizerUnitTest.java deleted file mode 100644 index 114f9bfc1a..0000000000 --- a/spring-boot-modules/spring-boot/src/test/java/com/baeldung/jsondateformat/ContactAppWithObjectMapperCustomizerUnitTest.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.baeldung.jsondateformat; - -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.boot.web.server.LocalServerPort; -import org.springframework.http.ResponseEntity; -import org.springframework.test.context.junit4.SpringRunner; - -import java.io.IOException; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.List; -import java.util.Map; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; - -@RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = RANDOM_PORT, classes = ContactApp.class) -public class ContactAppWithObjectMapperCustomizerUnitTest { - - private final ObjectMapper mapper = new ObjectMapper(); - - @Autowired - TestRestTemplate restTemplate; - - @LocalServerPort - int port; - - String url; - - @Before - public void before() { - url=String.format("http://localhost:%s", port); - } - - @Test - public void givenDefaultDateFormatInAppPropertiesAndLegacyDateType_whenGet_thenReturnExpectedDateFormat() throws IOException { - ResponseEntity response = restTemplate.getForEntity(url + "/contacts/plainWithJavaUtilDate", String.class); - - assertEquals(200, response.getStatusCodeValue()); - - List> respMap = mapper.readValue(response.getBody(), new TypeReference>>(){}); - - LocalDate birthdayDate = LocalDate.parse(respMap.get(0).get("birthday"), DateTimeFormatter.ofPattern("yyyy-MM-dd")); - LocalDateTime lastUpdateTime = LocalDateTime.parse(respMap.get(0).get("lastUpdate"), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); - - assertNotNull(birthdayDate); - assertNotNull(lastUpdateTime); - } - - @Test - public void givenDefaultDateFormatInAppPropertiesAndJava8DateType_whenGet_thenReturnExpectedDateFormat() throws IOException { - ResponseEntity response = restTemplate.getForEntity(url + "/contacts/plain", String.class); - - assertEquals(200, response.getStatusCodeValue()); - - List> respMap = mapper.readValue(response.getBody(), new TypeReference>>(){}); - - LocalDate birthdayDate = LocalDate.parse(respMap.get(0).get("birthday"), DateTimeFormatter.ofPattern("yyyy-MM-dd")); - LocalDateTime lastUpdateTime = LocalDateTime.parse(respMap.get(0).get("lastUpdate"), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); - - assertNotNull(birthdayDate); - assertNotNull(lastUpdateTime); - } - -} diff --git a/spring-boot-modules/spring-boot/src/test/java/com/baeldung/repository/UserRepositoryIntegrationTest.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/repository/UserRepositoryIntegrationTest.java deleted file mode 100644 index a1318949f3..0000000000 --- a/spring-boot-modules/spring-boot/src/test/java/com/baeldung/repository/UserRepositoryIntegrationTest.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.baeldung.repository; - -import com.baeldung.boot.config.H2JpaConfig; -import com.baeldung.model.User; -import com.baeldung.repository.UserRepository; -import org.junit.After; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import java.util.Optional; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Created by adam. - */ -@RunWith(SpringRunner.class) -@SpringBootTest(classes = H2JpaConfig.class) -public class UserRepositoryIntegrationTest { - - private final String USER_NAME_ADAM = "Adam"; - private final Integer ACTIVE_STATUS = 1; - - @Autowired - private UserRepository userRepository; - - @Test - public void givenEmptyDBWhenFindOneByNameThenReturnEmptyOptional() { - Optional foundUser = userRepository.findOneByName(USER_NAME_ADAM); - - assertThat(foundUser.isPresent()).isEqualTo(false); - } - - @Test - public void givenUserInDBWhenFindOneByNameThenReturnOptionalWithUser() { - User user = new User(); - user.setName(USER_NAME_ADAM); - userRepository.save(user); - - Optional foundUser = userRepository.findOneByName(USER_NAME_ADAM); - - assertThat(foundUser.isPresent()).isEqualTo(true); - - assertThat(foundUser - .get() - .getName()).isEqualTo(USER_NAME_ADAM); - } - - @Test - public void givenUserInDBWhenFindOneByStatusAsyncThenReturnCompletableFutureUser() throws ExecutionException, InterruptedException { - User user = new User(); - user.setName(USER_NAME_ADAM); - user.setStatus(ACTIVE_STATUS); - userRepository.save(user); - - CompletableFuture userByStatus = userRepository.findOneByStatus(ACTIVE_STATUS); - - assertThat(userByStatus - .get() - .getName()).isEqualTo(USER_NAME_ADAM); - } - - @After - public void cleanUp() { - userRepository.deleteAll(); - } - -} diff --git a/spring-boot-modules/spring-boot/src/test/resources/README.md b/spring-boot-modules/spring-boot/src/test/resources/README.md deleted file mode 100644 index 51c95afd9d..0000000000 --- a/spring-boot-modules/spring-boot/src/test/resources/README.md +++ /dev/null @@ -1,3 +0,0 @@ -### Relevant Articles: - -- [How to Test GraphQL Using Postman](https://www.baeldung.com/graphql-postman) diff --git a/spring-boot-modules/spring-boot/src/test/resources/application.properties b/spring-boot-modules/spring-boot/src/test/resources/application.properties deleted file mode 100644 index 9ad65e1815..0000000000 --- a/spring-boot-modules/spring-boot/src/test/resources/application.properties +++ /dev/null @@ -1,19 +0,0 @@ -spring.mail.host=localhost -spring.mail.port=8025 -spring.mail.properties.mail.smtp.auth=false - - -# spring.datasource.x -spring.datasource.driver-class-name=org.h2.Driver -spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1 -spring.datasource.username=sa -spring.datasource.password=sa - -# hibernate.X -spring.jpa.hibernate.dialect=org.hibernate.dialect.H2Dialect -spring.jpa.hibernate.ddl-auto=create-drop -spring.jpa.hibernate.show_sql=true -spring.jpa.hibernate.hbm2ddl.auto=create-drop -spring.jpa.hibernate.cache.use_second_level_cache=true -spring.jpa.hibernate.cache.use_query_cache=true -spring.jpa.hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory diff --git a/spring-boot-modules/spring-boot/src/test/resources/conversion.properties b/spring-boot-modules/spring-boot/src/test/resources/conversion.properties deleted file mode 100644 index 640442ec33..0000000000 --- a/spring-boot-modules/spring-boot/src/test/resources/conversion.properties +++ /dev/null @@ -1,11 +0,0 @@ -###### time unit -conversion.timeInDefaultUnit=10 -conversion.timeInNano=9ns -conversion.timeInDays=2 - -###### data size -conversion.sizeInDefaultUnit=300 -conversion.sizeInGB=2GB -conversion.sizeInTB=4 - -conversion.employee=john,2000 \ No newline at end of file diff --git a/spring-boot-modules/spring-boot/src/test/resources/import.sql b/spring-boot-modules/spring-boot/src/test/resources/import.sql deleted file mode 100644 index 9095b9468c..0000000000 --- a/spring-boot-modules/spring-boot/src/test/resources/import.sql +++ /dev/null @@ -1 +0,0 @@ ---insert into Foo values(1,'Foo_Name'); \ No newline at end of file diff --git a/spring-boot-modules/spring-boot/src/test/resources/org/baeldung/boot/expected.json b/spring-boot-modules/spring-boot/src/test/resources/org/baeldung/boot/expected.json deleted file mode 100644 index f5409421a6..0000000000 --- a/spring-boot-modules/spring-boot/src/test/resources/org/baeldung/boot/expected.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "id":3, - "name":"Foo_Name_3" -} \ No newline at end of file From 4f6634745d703f6bdaba12a6ec8b1d9e68e654f8 Mon Sep 17 00:00:00 2001 From: Sameer Date: Fri, 15 Apr 2022 19:46:47 +0530 Subject: [PATCH 051/278] Spring Boot Properties Migrator Demo (#11975) * Spring Boot Properties Migrator Demo * updated demo properties (#1) Co-authored-by: s9m33r * Article/bael 5446 (#2) * updated demo properties * formatting Co-authored-by: s9m33r Co-authored-by: s9m33r --- spring-boot-modules/pom.xml | 1 + .../pom.xml | 57 +++++++++++++++++++ .../spring/boot/properties/migrator/Main.java | 11 ++++ .../src/main/resources/application-dev.yaml | 16 ++++++ .../src/main/resources/application.properties | 7 +++ 5 files changed, 92 insertions(+) create mode 100644 spring-boot-modules/spring-boot-properties-migrator-demo/pom.xml create mode 100644 spring-boot-modules/spring-boot-properties-migrator-demo/src/main/java/com/baeldung/spring/boot/properties/migrator/Main.java create mode 100644 spring-boot-modules/spring-boot-properties-migrator-demo/src/main/resources/application-dev.yaml create mode 100644 spring-boot-modules/spring-boot-properties-migrator-demo/src/main/resources/application.properties diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index a12ee55018..939add1147 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -64,6 +64,7 @@ spring-boot-properties spring-boot-properties-2 spring-boot-properties-3 + spring-boot-properties-migrator-demo spring-boot-property-exp spring-boot-runtime spring-boot-runtime-2 diff --git a/spring-boot-modules/spring-boot-properties-migrator-demo/pom.xml b/spring-boot-modules/spring-boot-properties-migrator-demo/pom.xml new file mode 100644 index 0000000000..d44a8ce6f1 --- /dev/null +++ b/spring-boot-modules/spring-boot-properties-migrator-demo/pom.xml @@ -0,0 +1,57 @@ + + + 4.0.0 + + spring-boot-properties-migrator-demo + 1.0-SNAPSHOT + + + com.baeldung.spring-boot-modules + spring-boot-modules + 1.0.0-SNAPSHOT + ../pom.xml + + + + + + + + + + + 8 + 8 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-properties-migrator + runtime + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + + diff --git a/spring-boot-modules/spring-boot-properties-migrator-demo/src/main/java/com/baeldung/spring/boot/properties/migrator/Main.java b/spring-boot-modules/spring-boot-properties-migrator-demo/src/main/java/com/baeldung/spring/boot/properties/migrator/Main.java new file mode 100644 index 0000000000..848b9680a0 --- /dev/null +++ b/spring-boot-modules/spring-boot-properties-migrator-demo/src/main/java/com/baeldung/spring/boot/properties/migrator/Main.java @@ -0,0 +1,11 @@ +package com.baeldung.spring.boot.properties.migrator; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Main { + public static void main(String[] args) { + SpringApplication.run(Main.class, args); + } +} diff --git a/spring-boot-modules/spring-boot-properties-migrator-demo/src/main/resources/application-dev.yaml b/spring-boot-modules/spring-boot-properties-migrator-demo/src/main/resources/application-dev.yaml new file mode 100644 index 0000000000..6eadac798b --- /dev/null +++ b/spring-boot-modules/spring-boot-properties-migrator-demo/src/main/resources/application-dev.yaml @@ -0,0 +1,16 @@ +# Deprecated Properties for Demonstration +#spring: +# resources: +# cache: +# period: 31536000 +# chain: +# compressed: true +# html-application-cache: true + +spring: + web: + resources: + cache: + period: 31536000 + chain: + compressed: false diff --git a/spring-boot-modules/spring-boot-properties-migrator-demo/src/main/resources/application.properties b/spring-boot-modules/spring-boot-properties-migrator-demo/src/main/resources/application.properties new file mode 100644 index 0000000000..15199b7710 --- /dev/null +++ b/spring-boot-modules/spring-boot-properties-migrator-demo/src/main/resources/application.properties @@ -0,0 +1,7 @@ +# Deprecated Properties for Demonstration +#spring.resources.cache.period=31536000 +#spring.resources.chain.compressed=false +#spring.resources.chain.html-application-cache=false +spring.web.resources.cache.period=31536000 +spring.web.resources.chain.compressed=false +banner.image.location="myBanner.txt" From de77319b355da002c6cb5cc251f5481c3c29e90c Mon Sep 17 00:00:00 2001 From: Iulian Manda Date: Sun, 17 Apr 2022 14:16:25 +0300 Subject: [PATCH 052/278] BAEL-5115 Deduction-Based Polymorphism in Jackson 2.12 (#11732) * BAEL-5115 Deduction-Based Polymorphism in Jackson 2.12 * Fix pmd * Code review changes * Improvements * Code review * Code review * fix typo * Rename package * Apply formatter * Add old deduction * revert --- .../deductionbasedpolymorphism/Character.java | 12 +++ .../ControlledCharacter.java | 14 ++++ .../ImperialSpy.java | 5 ++ .../deductionbasedpolymorphism/King.java | 14 ++++ .../deductionbasedpolymorphism/Knight.java | 14 ++++ .../NamedCharacter.java | 14 ++++ .../CaseInsensitiveInferenceUnitTest.java | 33 +++++++++ .../ContainedInferenceUnitTest.java | 73 +++++++++++++++++++ .../JsonStringFormatterUtil.java | 9 +++ .../SimpleInferenceUnitTest.java | 61 ++++++++++++++++ 10 files changed, 249 insertions(+) create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/deductionbasedpolymorphism/Character.java create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/deductionbasedpolymorphism/ControlledCharacter.java create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/deductionbasedpolymorphism/ImperialSpy.java create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/deductionbasedpolymorphism/King.java create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/deductionbasedpolymorphism/Knight.java create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/deductionbasedpolymorphism/NamedCharacter.java create mode 100644 jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/deductionbasedpolymorphism/CaseInsensitiveInferenceUnitTest.java create mode 100644 jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/deductionbasedpolymorphism/ContainedInferenceUnitTest.java create mode 100644 jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/deductionbasedpolymorphism/JsonStringFormatterUtil.java create mode 100644 jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/deductionbasedpolymorphism/SimpleInferenceUnitTest.java diff --git a/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/deductionbasedpolymorphism/Character.java b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/deductionbasedpolymorphism/Character.java new file mode 100644 index 0000000000..6be7483cc2 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/deductionbasedpolymorphism/Character.java @@ -0,0 +1,12 @@ +package com.baeldung.jackson.deductionbasedpolymorphism; + +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonSubTypes.Type; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonTypeInfo.Id; + +@JsonTypeInfo(use = Id.DEDUCTION) +@JsonSubTypes({ @Type(ImperialSpy.class), @Type(King.class), @Type(Knight.class) }) +public interface Character { + +} diff --git a/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/deductionbasedpolymorphism/ControlledCharacter.java b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/deductionbasedpolymorphism/ControlledCharacter.java new file mode 100644 index 0000000000..9f6f03954e --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/deductionbasedpolymorphism/ControlledCharacter.java @@ -0,0 +1,14 @@ +package com.baeldung.jackson.deductionbasedpolymorphism; + +public class ControlledCharacter { + + private Character character; + + public Character getCharacter() { + return character; + } + + public void setCharacter(Character character) { + this.character = character; + } +} diff --git a/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/deductionbasedpolymorphism/ImperialSpy.java b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/deductionbasedpolymorphism/ImperialSpy.java new file mode 100644 index 0000000000..ff86966e38 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/deductionbasedpolymorphism/ImperialSpy.java @@ -0,0 +1,5 @@ +package com.baeldung.jackson.deductionbasedpolymorphism; + +public class ImperialSpy implements Character { + +} diff --git a/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/deductionbasedpolymorphism/King.java b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/deductionbasedpolymorphism/King.java new file mode 100644 index 0000000000..3270d92b3a --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/deductionbasedpolymorphism/King.java @@ -0,0 +1,14 @@ +package com.baeldung.jackson.deductionbasedpolymorphism; + +public class King extends NamedCharacter { + + private String land; + + public String getLand() { + return land; + } + + public void setLand(String land) { + this.land = land; + } +} diff --git a/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/deductionbasedpolymorphism/Knight.java b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/deductionbasedpolymorphism/Knight.java new file mode 100644 index 0000000000..197d3b758b --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/deductionbasedpolymorphism/Knight.java @@ -0,0 +1,14 @@ +package com.baeldung.jackson.deductionbasedpolymorphism; + +public class Knight extends NamedCharacter { + + private String weapon; + + public String getWeapon() { + return weapon; + } + + public void setWeapon(String weapon) { + this.weapon = weapon; + } +} diff --git a/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/deductionbasedpolymorphism/NamedCharacter.java b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/deductionbasedpolymorphism/NamedCharacter.java new file mode 100644 index 0000000000..15892f8659 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/deductionbasedpolymorphism/NamedCharacter.java @@ -0,0 +1,14 @@ +package com.baeldung.jackson.deductionbasedpolymorphism; + +public class NamedCharacter implements Character { + + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/deductionbasedpolymorphism/CaseInsensitiveInferenceUnitTest.java b/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/deductionbasedpolymorphism/CaseInsensitiveInferenceUnitTest.java new file mode 100644 index 0000000000..cad9e73091 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/deductionbasedpolymorphism/CaseInsensitiveInferenceUnitTest.java @@ -0,0 +1,33 @@ +package com.baeldung.jackson.deductionbasedpolymorphism; + +import static com.baeldung.jackson.deductionbasedpolymorphism.JsonStringFormatterUtil.formatJson; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +import com.fasterxml.jackson.databind.MapperFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; + +class CaseInsensitiveInferenceUnitTest { + + private final ObjectMapper objectMapper = JsonMapper.builder() + .configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true) + .build(); + + @Test + void givenACaseInsensitiveKnight_whenMapping_thenExpectKnight() throws Exception { + String knightJson = formatJson("{'NaMe':'Ostrava, of Boletaria', 'WeaPON':'Rune Sword'}"); + + Character character = objectMapper.readValue(knightJson, Character.class); + + assertTrue(character instanceof Knight); + assertSame(character.getClass(), Knight.class); + Knight knight = (Knight) character; + assertEquals("Ostrava, of Boletaria", knight.getName()); + assertEquals("Rune Sword", knight.getWeapon()); + } + +} diff --git a/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/deductionbasedpolymorphism/ContainedInferenceUnitTest.java b/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/deductionbasedpolymorphism/ContainedInferenceUnitTest.java new file mode 100644 index 0000000000..810051f2ab --- /dev/null +++ b/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/deductionbasedpolymorphism/ContainedInferenceUnitTest.java @@ -0,0 +1,73 @@ +package com.baeldung.jackson.deductionbasedpolymorphism; + +import static com.baeldung.jackson.deductionbasedpolymorphism.JsonStringFormatterUtil.formatJson; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; + +class ContainedInferenceUnitTest { + + private final ObjectMapper objectMapper = JsonMapper.builder() + .build(); + + @Test + void givenAKnightControlledCharacter_whenMapping_thenExpectAControlledCharacterWithKnight() throws Exception { + String controlledCharacterJson = formatJson("{'character': {'name': 'Ostrava, of Boletaria', 'weapon': 'Rune Sword'}}"); + + ControlledCharacter controlledCharacter = objectMapper.readValue(controlledCharacterJson, ControlledCharacter.class); + Character character = controlledCharacter.getCharacter(); + + assertTrue(character instanceof Knight); + assertSame(character.getClass(), Knight.class); + Knight knight = (Knight) character; + assertEquals("Ostrava, of Boletaria", knight.getName()); + assertEquals("Rune Sword", knight.getWeapon()); + } + + @Test + void givenAKingControlledCharacter_whenMapping_thenExpectAControlledCharacterWithKing() throws Exception { + String controlledCharacterJson = formatJson("{'character': {'name': 'King Allant', 'land': 'Boletaria'}}"); + + ControlledCharacter controlledCharacter = objectMapper.readValue(controlledCharacterJson, ControlledCharacter.class); + Character character = controlledCharacter.getCharacter(); + + assertTrue(character instanceof King); + assertSame(character.getClass(), King.class); + King king = (King) character; + assertEquals("King Allant", king.getName()); + assertEquals("Boletaria", king.getLand()); + } + + @Test + void givenAnEmptySubtype_whenMapping_thenExpectImperialSpy() throws Exception { + String controlledCharacterJson = formatJson("{'character': {}}"); + + ControlledCharacter controlledCharacter = objectMapper.readValue(controlledCharacterJson, ControlledCharacter.class); + + assertTrue(controlledCharacter.getCharacter() instanceof ImperialSpy); + } + + @Test + void givenANullCharacter_whenMapping_thenExpectNullCharacter() throws Exception { + String controlledCharacterJson = formatJson("{'character': null}"); + + ControlledCharacter controlledCharacter = objectMapper.readValue(controlledCharacterJson, ControlledCharacter.class); + + assertNull(controlledCharacter.getCharacter()); + } + + @Test + void givenAAnAbsentCharacter_whenMapping_thenExpectNullCharacter() throws Exception { + String controlledCharacterJson = formatJson("{}"); + + ControlledCharacter controlledCharacter = objectMapper.readValue(controlledCharacterJson, ControlledCharacter.class); + + assertNull(controlledCharacter.getCharacter()); + } +} diff --git a/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/deductionbasedpolymorphism/JsonStringFormatterUtil.java b/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/deductionbasedpolymorphism/JsonStringFormatterUtil.java new file mode 100644 index 0000000000..948b264c45 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/deductionbasedpolymorphism/JsonStringFormatterUtil.java @@ -0,0 +1,9 @@ +package com.baeldung.jackson.deductionbasedpolymorphism; + +public class JsonStringFormatterUtil { + + public static String formatJson(String input) { + return input.replaceAll("'", "\""); + } + +} diff --git a/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/deductionbasedpolymorphism/SimpleInferenceUnitTest.java b/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/deductionbasedpolymorphism/SimpleInferenceUnitTest.java new file mode 100644 index 0000000000..5e63e95289 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/deductionbasedpolymorphism/SimpleInferenceUnitTest.java @@ -0,0 +1,61 @@ +package com.baeldung.jackson.deductionbasedpolymorphism; + +import static com.baeldung.jackson.deductionbasedpolymorphism.JsonStringFormatterUtil.formatJson; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; + +class SimpleInferenceUnitTest { + + private final ObjectMapper objectMapper = JsonMapper.builder() + .build(); + + @Test + void givenAKnight_whenMapping_thenExpectAKnightType() throws Exception { + String knightJson = formatJson("{'name':'Ostrava, of Boletaria', 'weapon':'Rune Sword'}"); + + Character character = objectMapper.readValue(knightJson, Character.class); + + assertTrue(character instanceof Knight); + assertSame(character.getClass(), Knight.class); + Knight king = (Knight) character; + assertEquals("Ostrava, of Boletaria", king.getName()); + assertEquals("Rune Sword", king.getWeapon()); + } + + @Test + void givenAKing_whenMapping_thenExpectAKingType() throws Exception { + String kingJson = formatJson("{'name':'Old King Allant', 'land':'Boletaria'}"); + + Character character = objectMapper.readValue(kingJson, Character.class); + + assertTrue(character instanceof King); + assertSame(character.getClass(), King.class); + King king = (King) character; + assertEquals("Old King Allant", king.getName()); + assertEquals("Boletaria", king.getLand()); + } + + @Test + void givenAnEmptyObject_whenMapping_thenExpectAnImperialSpy() throws Exception { + String imperialSpyJson = "{}"; + + Character character = objectMapper.readValue(imperialSpyJson, Character.class); + + assertTrue(character instanceof ImperialSpy); + } + + @Test + void givenANullObject_whenMapping_thenExpectANullObject() throws Exception { + Character character = objectMapper.readValue("null", Character.class); + + assertNull(character); + } + +} From 49b61559523b7e17dc9be0a57446e758ae568116 Mon Sep 17 00:00:00 2001 From: etrandafir93 <75391049+etrandafir93@users.noreply.github.com> Date: Sun, 17 Apr 2022 14:23:51 +0200 Subject: [PATCH 053/278] BAEL-5440: hql distinct queries (#12007) * BAEL-5440: hql distinct queries * BAEL-5440: formated the code and renamed test class --- .../com/baeldung/hibernate/HibernateUtil.java | 4 + .../hibernate/distinct/entities/Comment.java | 28 +++++++ .../hibernate/distinct/entities/Post.java | 59 ++++++++++++++ .../entities/DistinctHqlQueriesUnitTest.java | 80 +++++++++++++++++++ 4 files changed, 171 insertions(+) create mode 100644 persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/distinct/entities/Comment.java create mode 100644 persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/distinct/entities/Post.java create mode 100644 persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/distinct/entities/DistinctHqlQueriesUnitTest.java diff --git a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/HibernateUtil.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/HibernateUtil.java index 58724e690c..84b20197bd 100644 --- a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/HibernateUtil.java +++ b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/HibernateUtil.java @@ -13,6 +13,8 @@ import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.service.ServiceRegistry; import com.baeldung.hibernate.customtypes.LocalDateStringType; +import com.baeldung.hibernate.distinct.entities.Post; +import com.baeldung.hibernate.distinct.entities.Comment; import com.baeldung.hibernate.entities.DeptEmployee; import com.baeldung.hibernate.pojo.Student; @@ -41,6 +43,8 @@ public class HibernateUtil { metadataSources.addAnnotatedClass(Student.class); metadataSources.addAnnotatedClass(DeptEmployee.class); metadataSources.addAnnotatedClass(com.baeldung.hibernate.entities.Department.class); + metadataSources.addAnnotatedClass(Comment.class); + metadataSources.addAnnotatedClass(Post.class); Metadata metadata = metadataSources.getMetadataBuilder() .applyBasicType(LocalDateStringType.INSTANCE) diff --git a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/distinct/entities/Comment.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/distinct/entities/Comment.java new file mode 100644 index 0000000000..1d155b112e --- /dev/null +++ b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/distinct/entities/Comment.java @@ -0,0 +1,28 @@ +package com.baeldung.hibernate.distinct.entities; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Comment { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + private String text; + + public Comment() { + } + + public Comment(String text) { + this.text = text; + } + + @Override + public String toString() { + return "Comment{" + "id=" + id + ", text='" + text + '\'' + '}'; + } +} diff --git a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/distinct/entities/Post.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/distinct/entities/Post.java new file mode 100644 index 0000000000..d2608e614c --- /dev/null +++ b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/distinct/entities/Post.java @@ -0,0 +1,59 @@ +package com.baeldung.hibernate.distinct.entities; + +import java.util.List; + +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToMany; + +import org.hibernate.annotations.Cascade; +import org.hibernate.annotations.CascadeType; + +@Entity +public class Post { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + private String title; + + @OneToMany + @Cascade(CascadeType.ALL) + private List comments; + + public Post() { + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public List getComments() { + return comments; + } + + public void setComments(List comments) { + this.comments = comments; + } + + @Override + public String toString() { + return "Post{" + "id=" + id + ", title='" + title + '\'' + ", comments=" + comments + '}'; + } +} diff --git a/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/distinct/entities/DistinctHqlQueriesUnitTest.java b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/distinct/entities/DistinctHqlQueriesUnitTest.java new file mode 100644 index 0000000000..799439a51b --- /dev/null +++ b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/distinct/entities/DistinctHqlQueriesUnitTest.java @@ -0,0 +1,80 @@ +package com.baeldung.hibernate.distinct.entities; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.annotations.QueryHints; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.hibernate.HibernateUtil; + +public class DistinctHqlQueriesUnitTest { + + private Session session; + + @Before + public void setUp() throws IOException { + this.session = HibernateUtil.getSessionFactory() + .openSession(); + saveDummyData(); + } + + private void saveDummyData() { + Transaction trx = session.beginTransaction(); + session.createQuery("delete from Post") + .executeUpdate(); + + Post post = new Post(); + post.setTitle("Distinct Queries in HQL"); + post.setComments(Arrays.asList(new Comment("Great article!"), new Comment("Nice one :)"), new Comment("Keep up the good work!"))); + session.persist(post); + + trx.commit(); + } + + @After + public void tearDown() { + session.close(); + } + + @Test + public void whenExecutingSelectQuery_thereWillBeDuplicates() { + String hql = "SELECT p FROM Post p LEFT JOIN FETCH p.comments"; + List posts = session.createQuery(hql, Post.class) + .getResultList(); + + assertThat(posts).hasSize(3); + } + + @Test + public void whenExecutingSelectDistinctQuery_thereShouldBeNoDuplicates() { + String hql = "SELECT DISTINCT p FROM Post p LEFT JOIN FETCH p.comments"; + List posts = session.createQuery(hql, Post.class) + .getResultList(); + + assertThat(posts).hasSize(1) + .allMatch(post -> post.getTitle() + .equals("Distinct Queries in HQL") && post.getComments() + .size() == 3); + } + + @Test + public void whenExecutingSelectDistinctQueryWithHint_thereShouldBeNoDuplicates() { + String hql = "SELECT DISTINCT p FROM Post p LEFT JOIN FETCH p.comments"; + List posts = session.createQuery(hql, Post.class) + .setHint(QueryHints.PASS_DISTINCT_THROUGH, false) + .getResultList(); + + assertThat(posts).hasSize(1) + .allMatch(post -> post.getTitle() + .equals("Distinct Queries in HQL") && post.getComments() + .size() == 3); + } +} \ No newline at end of file From c89d0ef7b18efbf88967c09ecd462b32c48b2f90 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sun, 17 Apr 2022 18:09:24 +0530 Subject: [PATCH 054/278] JAVA-9557 GitHub Issue: Bug in StringPerformance.java --- .../java/com/baeldung/stringperformance/StringPerformance.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringperformance/StringPerformance.java b/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringperformance/StringPerformance.java index 8e9d3afdde..90335b4aba 100644 --- a/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringperformance/StringPerformance.java +++ b/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringperformance/StringPerformance.java @@ -125,6 +125,8 @@ public class StringPerformance { stringSplit.add(longString.substring(pos, end)); pos = end + 1; } + //Add last token of string + stringSplit.add(longString.substring(pos)); return stringSplit; } From 51987ce1bcc6116d16789abfee87114fcb0c3741 Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Mon, 18 Apr 2022 16:54:23 +0500 Subject: [PATCH 055/278] Updated README.md added link back to the article: https://www.baeldung.com/java-boolean-to-int --- java-numbers-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/java-numbers-4/README.md b/java-numbers-4/README.md index 95d46203ab..267639a829 100644 --- a/java-numbers-4/README.md +++ b/java-numbers-4/README.md @@ -6,3 +6,4 @@ - [Guide to Java BigInteger](https://www.baeldung.com/java-biginteger) - [Automorphic Numbers in Java](https://www.baeldung.com/java-automorphic-numbers) - [Convert Byte Size Into a Human-Readable Format in Java](https://www.baeldung.com/java-human-readable-byte-size) +- [Convert boolean to int in Java](https://www.baeldung.com/java-boolean-to-int) From 65e888046f6adffa7316494ec1f0cc392f3cd85c Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Mon, 18 Apr 2022 16:59:16 +0500 Subject: [PATCH 056/278] Updated README.md added link back to the article: https://www.baeldung.com/spring-cloud-disable-discovery-clients --- spring-cloud/spring-cloud-eureka/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-cloud/spring-cloud-eureka/README.md b/spring-cloud/spring-cloud-eureka/README.md index 5fc96256f4..0029ea60f6 100644 --- a/spring-cloud/spring-cloud-eureka/README.md +++ b/spring-cloud/spring-cloud-eureka/README.md @@ -1,3 +1,4 @@ ### Relevant Articles: - [Introduction to Spring Cloud Netflix – Eureka](http://www.baeldung.com/spring-cloud-netflix-eureka) - [Integration Tests With Spring Cloud Netflix and Feign](https://www.baeldung.com/spring-cloud-feign-integration-tests) +- [Spring Cloud – Disable Discovery Clients with Profiles](https://www.baeldung.com/spring-cloud-disable-discovery-clients) From 316e7b1e04a4d3704fd7303bf87a55818dcefe0b Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Mon, 18 Apr 2022 17:02:21 +0500 Subject: [PATCH 057/278] Updated README.md added link back to the article: https://www.baeldung.com/java-implements-vs-extends --- core-java-modules/core-java-lang-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-lang-4/README.md b/core-java-modules/core-java-lang-4/README.md index a145633d2b..befef0b6eb 100644 --- a/core-java-modules/core-java-lang-4/README.md +++ b/core-java-modules/core-java-lang-4/README.md @@ -11,3 +11,4 @@ This module contains articles about core features in the Java language - [Fixing the “Declared package does not match the expected package” Error](https://www.baeldung.com/java-declared-expected-package-error) - [Chaining Constructors in Java](https://www.baeldung.com/java-chain-constructors) - [Difference Between POJO, JavaBeans, DTO and VO](https://www.baeldung.com/java-pojo-javabeans-dto-vo) +- [Implements vs. Extends in Java](https://www.baeldung.com/java-implements-vs-extends) From 5be5a938feda5a3a492bd67d8556bf3a052c4eb5 Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Mon, 18 Apr 2022 17:06:50 +0500 Subject: [PATCH 058/278] Updated README.md added link back to the article: https://www.baeldung.com/java-list-vs-arraylist --- core-java-modules/core-java-collections-list-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-list-3/README.md b/core-java-modules/core-java-collections-list-3/README.md index 967e148a99..bcc8b3f3ed 100644 --- a/core-java-modules/core-java-collections-list-3/README.md +++ b/core-java-modules/core-java-collections-list-3/README.md @@ -11,4 +11,5 @@ This module contains articles about the Java List collection - [Filtering a Java Collection by a List](https://www.baeldung.com/java-filter-collection-by-list) - [How to Count Duplicate Elements in Arraylist](https://www.baeldung.com/java-count-duplicate-elements-arraylist) - [Finding the Differences Between Two Lists in Java](https://www.baeldung.com/java-lists-difference) +- [List vs. ArrayList in Java](https://www.baeldung.com/java-list-vs-arraylist) - [[<-- Prev]](/core-java-modules/core-java-collections-list-2) From f93ca672b4619274d94a301d593610eabe07cf7c Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Mon, 18 Apr 2022 17:09:18 +0500 Subject: [PATCH 059/278] Created/Updated README.md added link back to the article: https://www.baeldung.com/spring-boot-properties-migrator --- .../spring-boot-properties-migrator-demo/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 spring-boot-modules/spring-boot-properties-migrator-demo/README.md diff --git a/spring-boot-modules/spring-boot-properties-migrator-demo/README.md b/spring-boot-modules/spring-boot-properties-migrator-demo/README.md new file mode 100644 index 0000000000..c00eae2681 --- /dev/null +++ b/spring-boot-modules/spring-boot-properties-migrator-demo/README.md @@ -0,0 +1,3 @@ + +### Relevant Articles: +- [Spring Boot Configuration Properties Migrator](https://www.baeldung.com/spring-boot-properties-migrator) From c26826c7004ff2ac956d40ab58bbb617bb7b2822 Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Mon, 18 Apr 2022 17:11:30 +0500 Subject: [PATCH 060/278] Updated README.md added link back to the article: https://www.baeldung.com/hibernate-not-null-error --- persistence-modules/hibernate-exceptions/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/hibernate-exceptions/README.md b/persistence-modules/hibernate-exceptions/README.md index 2e5a98c2f8..c485de2f34 100644 --- a/persistence-modules/hibernate-exceptions/README.md +++ b/persistence-modules/hibernate-exceptions/README.md @@ -5,3 +5,4 @@ - [TransactionRequiredException Error](https://www.baeldung.com/jpa-transaction-required-exception) - [Hibernate’s “Object References an Unsaved Transient Instance” Error](https://www.baeldung.com/hibernate-unsaved-transient-instance-error) - [EntityNotFoundException in Hibernate](https://www.baeldung.com/hibernate-entitynotfoundexception) +- [Hibernate’s “Not-Null Property References a Null or Transient Value” Error](https://www.baeldung.com/hibernate-not-null-error) From bba9f4374b2b10d95be0c8768aa07ddbd5be646b Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Mon, 18 Apr 2022 17:16:03 +0500 Subject: [PATCH 061/278] Updated README.md added link back to the article: https://www.baeldung.com/jackson-deduction-based-polymorphism --- jackson-modules/jackson-annotations/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/jackson-modules/jackson-annotations/README.md b/jackson-modules/jackson-annotations/README.md index 783a06605b..3b6cd6f20b 100644 --- a/jackson-modules/jackson-annotations/README.md +++ b/jackson-modules/jackson-annotations/README.md @@ -7,3 +7,4 @@ This module contains articles about Jackson annotations. - [More Jackson Annotations](https://www.baeldung.com/jackson-advanced-annotations) - [Jackson – Bidirectional Relationships](https://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion) - [Jackson JSON Views](https://www.baeldung.com/jackson-json-view-annotation) +- [Deduction-Based Polymorphism in Jackson 2.12](https://www.baeldung.com/jackson-deduction-based-polymorphism) From 3b92f0b83477e29e41bf4c399d2fdf31c8351183 Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Mon, 18 Apr 2022 10:46:13 -0300 Subject: [PATCH 062/278] BAEL-5157 * more meaningful exception messages --- .../jersey/exceptionhandling/rest/StocksResource.java | 2 +- .../rest/exceptions/ServerExceptionMapper.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/StocksResource.java b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/StocksResource.java index 94ce329ad0..64b645a1c6 100644 --- a/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/StocksResource.java +++ b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/StocksResource.java @@ -34,7 +34,7 @@ public class StocksResource { @Produces(MediaType.APPLICATION_JSON) public Response get(@PathParam("ticker") String id) { Optional stock = stocks.findById(id); - stock.orElseThrow(IllegalArgumentException::new); + stock.orElseThrow(() -> new IllegalArgumentException("ticker")); return Response.ok(stock.get()) .build(); diff --git a/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/ServerExceptionMapper.java b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/ServerExceptionMapper.java index a6e9cc7f39..adfac000e8 100644 --- a/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/ServerExceptionMapper.java +++ b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/ServerExceptionMapper.java @@ -7,7 +7,7 @@ import javax.ws.rs.core.Response.Status; import javax.ws.rs.ext.ExceptionMapper; public class ServerExceptionMapper implements ExceptionMapper { - public static final String HTTP_405_MESSAGE = "METHOD_NOT_ALLOWED"; + public static final String HTTP_405_MESSAGE = "use one of"; @Override public Response toResponse(final WebApplicationException exception) { @@ -18,7 +18,7 @@ public class ServerExceptionMapper implements ExceptionMapper Date: Tue, 19 Apr 2022 01:13:13 +0200 Subject: [PATCH 063/278] BAEL-5465: changed example to LocalDateTime (#12086) --- .../baeldung/subtractdays/SubtractDaysFromDateUnitTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/subtractdays/SubtractDaysFromDateUnitTest.java b/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/subtractdays/SubtractDaysFromDateUnitTest.java index 9afb6e8db0..91cd29cd54 100644 --- a/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/subtractdays/SubtractDaysFromDateUnitTest.java +++ b/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/subtractdays/SubtractDaysFromDateUnitTest.java @@ -4,6 +4,7 @@ import static org.junit.Assert.assertEquals; import java.text.SimpleDateFormat; import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; @@ -15,7 +16,7 @@ public class SubtractDaysFromDateUnitTest { @Test public void givenLocalDateTime_whenSubtractingFiveDays_dateIsChangedCorrectly() { - LocalDate localDateTime = LocalDate.of(2022, 4, 20); + LocalDateTime localDateTime = LocalDateTime.of(2022, 4, 20, 0, 0); localDateTime = localDateTime.minusDays(5); From 09d6595514029345c2bdf839768d008a2ed92c13 Mon Sep 17 00:00:00 2001 From: Kapil Khandelwal Date: Tue, 19 Apr 2022 05:05:55 +0530 Subject: [PATCH 064/278] Bael 5369 new (#12073) * BAEL-5369: Checking Connection to MongoDB * BAEL-5369:- Minor Fix Checking Connection to MongoDB --- .../com/baeldung/mongo/ConnectionCheck.java | 8 ++--- .../mongo/ConnectionCheckLiveTest.java | 31 +++---------------- 2 files changed, 8 insertions(+), 31 deletions(-) diff --git a/persistence-modules/java-mongodb-2/src/main/java/com/baeldung/mongo/ConnectionCheck.java b/persistence-modules/java-mongodb-2/src/main/java/com/baeldung/mongo/ConnectionCheck.java index 240e54ab99..df17e27351 100644 --- a/persistence-modules/java-mongodb-2/src/main/java/com/baeldung/mongo/ConnectionCheck.java +++ b/persistence-modules/java-mongodb-2/src/main/java/com/baeldung/mongo/ConnectionCheck.java @@ -7,7 +7,7 @@ import com.mongodb.ServerAddress; public class ConnectionCheck { - public static void checkingConnection() { + public static MongoClient checkingConnection() { MongoClientOptions.Builder builder = MongoClientOptions.builder(); @@ -27,9 +27,10 @@ public class ConnectionCheck { System.out.println(db.getStats()); } catch (Exception e) { System.out.println("MongoDB Server is Down"); - mongoClient.close(); } + return mongoClient; + } public static void main(String[] args) { @@ -42,5 +43,4 @@ public class ConnectionCheck { } -} - +} \ No newline at end of file diff --git a/persistence-modules/java-mongodb-2/src/test/java/com/baeldung/mongo/ConnectionCheckLiveTest.java b/persistence-modules/java-mongodb-2/src/test/java/com/baeldung/mongo/ConnectionCheckLiveTest.java index 69f356997c..32014a4473 100644 --- a/persistence-modules/java-mongodb-2/src/test/java/com/baeldung/mongo/ConnectionCheckLiveTest.java +++ b/persistence-modules/java-mongodb-2/src/test/java/com/baeldung/mongo/ConnectionCheckLiveTest.java @@ -3,45 +3,22 @@ package com.baeldung.mongo; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; -import java.io.IOException; - -import org.junit.BeforeClass; import org.junit.Test; +import com.baeldung.ConnectionCheck; import com.mongodb.MongoClient; -import com.mongodb.MongoClientOptions; -import com.mongodb.ServerAddress; public class ConnectionCheckLiveTest { - private static MongoClient mongoClient; - private static MongoClientOptions.Builder builder; - private static ServerAddress ServerAddress; - - @BeforeClass - public static void setup() throws IOException { - if (mongoClient == null) { - - builder = MongoClientOptions.builder(); - builder.connectionsPerHost(100); - builder.maxWaitTime(60000); - builder.connectTimeout(1500); - builder.socketTimeout(60000); - builder.socketKeepAlive(true); - - ServerAddress = new ServerAddress("localhost", 27017); - mongoClient = new MongoClient(ServerAddress, builder.build()); - - } - } + ConnectionCheck ConnectionCheck = new ConnectionCheck(); @Test public void givenMongoClient_whenConnectionCheck_thenCheckingForConnectionPoint() { + MongoClient mongoClient = ConnectionCheck.checkingConnection(); String connectionPoint = mongoClient.getConnectPoint(); assertNotNull(connectionPoint); assertFalse(connectionPoint.isEmpty()); } -} - +} \ No newline at end of file From 66f829cd8d4ef029c6b5275cf9bd82dfcfd74c82 Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Mon, 18 Apr 2022 21:37:21 -0300 Subject: [PATCH 065/278] BAEL-5157 - Exception Handling With Jersey (#12082) * BAEL-5157 - Exception Handling with Jersey First draft: https://drafts.baeldung.com/wp-admin/post.php?post=131880&action=edit * BAEL-5157 * more meaningful exception messages --- .../jersey/exceptionhandling/rest/StocksResource.java | 2 +- .../rest/exceptions/ServerExceptionMapper.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/StocksResource.java b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/StocksResource.java index 94ce329ad0..64b645a1c6 100644 --- a/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/StocksResource.java +++ b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/StocksResource.java @@ -34,7 +34,7 @@ public class StocksResource { @Produces(MediaType.APPLICATION_JSON) public Response get(@PathParam("ticker") String id) { Optional stock = stocks.findById(id); - stock.orElseThrow(IllegalArgumentException::new); + stock.orElseThrow(() -> new IllegalArgumentException("ticker")); return Response.ok(stock.get()) .build(); diff --git a/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/ServerExceptionMapper.java b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/ServerExceptionMapper.java index a6e9cc7f39..adfac000e8 100644 --- a/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/ServerExceptionMapper.java +++ b/jersey/src/main/java/com/baeldung/jersey/exceptionhandling/rest/exceptions/ServerExceptionMapper.java @@ -7,7 +7,7 @@ import javax.ws.rs.core.Response.Status; import javax.ws.rs.ext.ExceptionMapper; public class ServerExceptionMapper implements ExceptionMapper { - public static final String HTTP_405_MESSAGE = "METHOD_NOT_ALLOWED"; + public static final String HTTP_405_MESSAGE = "use one of"; @Override public Response toResponse(final WebApplicationException exception) { @@ -18,7 +18,7 @@ public class ServerExceptionMapper implements ExceptionMapper Date: Tue, 19 Apr 2022 13:09:20 +0500 Subject: [PATCH 066/278] Removed unused import "EnableAutoConfiguration" --- .../kafka/embedded/KafkaProducerConsumerApplication.java | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-kafka/src/main/java/com/baeldung/kafka/embedded/KafkaProducerConsumerApplication.java b/spring-kafka/src/main/java/com/baeldung/kafka/embedded/KafkaProducerConsumerApplication.java index b4a03a12b0..0b6b7cce8b 100644 --- a/spring-kafka/src/main/java/com/baeldung/kafka/embedded/KafkaProducerConsumerApplication.java +++ b/spring-kafka/src/main/java/com/baeldung/kafka/embedded/KafkaProducerConsumerApplication.java @@ -1,7 +1,6 @@ package com.baeldung.kafka.embedded; import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication From c53a7035879636fbac23c5378b6dd2964f53d70a Mon Sep 17 00:00:00 2001 From: waqasakramef <103989631+waqasakramef@users.noreply.github.com> Date: Tue, 19 Apr 2022 13:22:22 +0500 Subject: [PATCH 067/278] Add placeholder The placeholder is mentioned in the kafkaConsumer.java but didn't defined in the applications.prop. So we need to defined that. Current exception is as follow. org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'kafkaConsumer' defined in file [/Users/mac/Library/Mobile Documents/com~apple~CloudDocs/development/kafka-poc/producer/target/classes/com/ef/kafka/embedded/KafkaConsumer.class]: Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'test.topic' in value "${test.topic}" --- spring-kafka/src/main/resources/application.properties | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spring-kafka/src/main/resources/application.properties b/spring-kafka/src/main/resources/application.properties index e1a983339b..9a614cbafd 100644 --- a/spring-kafka/src/main/resources/application.properties +++ b/spring-kafka/src/main/resources/application.properties @@ -13,4 +13,5 @@ monitor.topic.name=baeldung # monitoring - simulation monitor.producer.simulate=true monitor.consumer.simulate=true -monitor.kafka.consumer.groupid.simulate=baeldungGrpSimulate \ No newline at end of file +monitor.kafka.consumer.groupid.simulate=baeldungGrpSimulate +test.topic=testtopic1 From 79bc953888c6a9386fda9e1ddd5e6d78022031cb Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Tue, 19 Apr 2022 12:27:00 -0300 Subject: [PATCH 068/278] BAEL-5157 * midified integration test to use the first available port --- .../exceptionhandling/rest/StocksResourceIntegrationTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/jersey/src/test/java/com/baeldung/jersey/exceptionhandling/rest/StocksResourceIntegrationTest.java b/jersey/src/test/java/com/baeldung/jersey/exceptionhandling/rest/StocksResourceIntegrationTest.java index 1648116918..ceb59adc1f 100644 --- a/jersey/src/test/java/com/baeldung/jersey/exceptionhandling/rest/StocksResourceIntegrationTest.java +++ b/jersey/src/test/java/com/baeldung/jersey/exceptionhandling/rest/StocksResourceIntegrationTest.java @@ -17,6 +17,7 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import org.glassfish.jersey.test.JerseyTest; +import org.glassfish.jersey.test.TestProperties; import org.junit.Test; import com.baeldung.jersey.exceptionhandling.ExceptionHandlingConfig; @@ -35,6 +36,7 @@ public class StocksResourceIntegrationTest extends JerseyTest { @Override protected Application configure() { + forceSet(TestProperties.CONTAINER_PORT, "0"); return new ExceptionHandlingConfig(); } From a3e7a9815507402876b6ece17f94fea4baec8b72 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Tue, 19 Apr 2022 22:39:54 +0530 Subject: [PATCH 069/278] JAVA-10628: Create new aws-modules and move other aws related modules inside it --- .../aws-app-sync}/README.md | 0 .../aws-app-sync}/pom.xml | 2 +- .../awsappsync/AppSyncClientHelper.java | 0 .../awsappsync/AwsAppSyncApplication.java | 0 .../AwsAppSyncApplicationUnitTest.java | 0 .../aws-lambda}/.gitignore | 0 .../aws-lambda}/README.md | 2 + .../aws-lambda}/lambda/pom.xml | 0 .../sam-templates/template-implicit.yaml | 0 .../template-inline-swagger.yaml | 0 .../baeldung/lambda/LambdaMethodHandler.java | 0 .../baeldung/lambda/LambdaRequestHandler.java | 0 .../lambda/LambdaRequestStreamHandler.java | 0 .../lambda/apigateway/APIDemoHandler.java | 0 .../lambda/apigateway/model/Person.java | 0 .../lambda/dynamodb/SavePersonHandler.java | 0 .../lambda/dynamodb/bean/PersonRequest.java | 0 .../lambda/dynamodb/bean/PersonResponse.java | 0 .../lambda/src/main/resources/logback.xml | 0 .../aws-lambda}/pom.xml | 2 +- .../aws-lambda}/shipping-tracker/.gitignore | 0 .../shipping-tracker/ShippingFunction/pom.xml | 0 .../com/baeldung/lambda/shipping/App.java | 0 .../com/baeldung/lambda/shipping/Checkin.java | 0 .../baeldung/lambda/shipping/Consignment.java | 0 .../com/baeldung/lambda/shipping/Item.java | 0 .../baeldung/lambda/shipping/ShippingDao.java | 0 .../lambda/shipping/ShippingService.java | 0 .../shipping-tracker/template.yaml | 0 .../todo-reminder/ToDoFunction/pom.xml | 0 .../java/com/baeldung/lambda/todo/App.java | 0 .../com/baeldung/lambda/todo/api/PostApi.java | 0 .../baeldung/lambda/todo/api/PostItem.java | 0 .../com/baeldung/lambda/todo/api/ToDoApi.java | 0 .../baeldung/lambda/todo/api/ToDoItem.java | 0 .../baeldung/lambda/todo/config/Config.java | 0 .../lambda/todo/config/Credentials.java | 0 .../lambda/todo/config/ExecutionContext.java | 0 .../baeldung/lambda/todo/config/Services.java | 0 .../lambda/todo/service/PostService.java | 0 .../todo/service/ToDoReaderService.java | 0 .../src/main/resources/configuration.yml | 0 .../src/main/resources/log4j2.xml | 0 .../com/baeldung/lambda/todo/AppTest.java | 0 .../todo/service/ToDoReaderServiceTest.java | 0 .../aws-lambda}/todo-reminder/template.yaml | 0 .../aws-miscellaneous}/.gitignore | 0 aws-modules/aws-miscellaneous/README.md | 10 +++ .../aws-miscellaneous}/pom.xml | 17 +---- .../baeldung/dynamodb/entity/ProductInfo.java | 0 .../repository/AbstractRepository.java | 0 .../repository/ProductInfoRepository.java | 0 .../java/com/baeldung/ec2/EC2Application.java | 0 .../java/com/baeldung/rds/AWSRDSService.java | 0 .../java/com/baeldung/sqs/SQSApplication.java | 0 .../src/main/resources/db.properties | 0 .../src/main/resources/logback.xml | 0 .../ProductInfoRepositoryIntegrationTest.java | 0 .../dynamodb/rule/LocalDbCreationRule.java | 0 .../src/test/resources/test.properties | 0 .../aws-reactive}/README.md | 4 + .../aws-reactive}/images/rective-upload.png | Bin .../aws-reactive}/images/rective-upload.txt | 0 .../images/thread-per-client.png | Bin .../images/thread-per-client.txt | 0 .../aws-reactive}/pom.xml | 2 +- .../reactive/s3/DownloadFailedException.java | 0 .../aws/reactive/s3/DownloadResource.java | 0 .../reactive/s3/ReactiveS3Application.java | 0 .../s3/S3ClientConfigurarionProperties.java | 0 .../reactive/s3/S3ClientConfiguration.java | 0 .../reactive/s3/UploadFailedException.java | 0 .../aws/reactive/s3/UploadResource.java | 0 .../aws/reactive/s3/UploadResult.java | 0 .../src/main/resources/application-minio.yml | 0 .../src/main/resources/application.yml | 0 .../s3/ReactiveS3ApplicationLiveTest.java | 0 .../src/test/resources/testimage1.png | Bin .../src/test/resources/testimage2.png | Bin aws-modules/aws-s3/.gitignore | 2 + aws-modules/aws-s3/README.md | 9 +++ aws-modules/aws-s3/pom.xml | 70 ++++++++++++++++++ .../java/com/baeldung/s3/AWSS3Service.java | 0 .../java/com/baeldung/s3/MultipartUpload.java | 0 .../java/com/baeldung/s3/S3Application.java | 0 .../aws-s3/src/main/resources/logback.xml | 13 ++++ .../com/baeldung/jets3t/JetS3tLiveTest.java | 0 .../s3/AWSS3ServiceIntegrationTest.java | 0 .../baeldung/s3/MultipartUploadLiveTest.java | 0 aws-modules/pom.xml | 24 ++++++ aws/README.md | 15 ---- .../libsqlite4java-linux-amd64-1.0.392.so | Bin 902282 -> 0 bytes .../libsqlite4java-linux-i386-1.0.392.so | Bin 887104 -> 0 bytes .../sqlite4java-win32-x64-1.0.392.dll | Bin 684032 -> 0 bytes .../sqlite4java-win32-x86-1.0.392.dll | Bin 529408 -> 0 bytes 95 files changed, 140 insertions(+), 32 deletions(-) rename {aws-app-sync => aws-modules/aws-app-sync}/README.md (100%) rename {aws-app-sync => aws-modules/aws-app-sync}/pom.xml (96%) rename {aws-app-sync => aws-modules/aws-app-sync}/src/main/java/com/baeldung/awsappsync/AppSyncClientHelper.java (100%) rename {aws-app-sync => aws-modules/aws-app-sync}/src/main/java/com/baeldung/awsappsync/AwsAppSyncApplication.java (100%) rename {aws-app-sync => aws-modules/aws-app-sync}/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationUnitTest.java (100%) rename {aws-lambda => aws-modules/aws-lambda}/.gitignore (100%) rename {aws-lambda => aws-modules/aws-lambda}/README.md (73%) rename {aws-lambda => aws-modules/aws-lambda}/lambda/pom.xml (100%) rename {aws-lambda => aws-modules/aws-lambda}/lambda/sam-templates/template-implicit.yaml (100%) rename {aws-lambda => aws-modules/aws-lambda}/lambda/sam-templates/template-inline-swagger.yaml (100%) rename {aws-lambda => aws-modules/aws-lambda}/lambda/src/main/java/com/baeldung/lambda/LambdaMethodHandler.java (100%) rename {aws-lambda => aws-modules/aws-lambda}/lambda/src/main/java/com/baeldung/lambda/LambdaRequestHandler.java (100%) rename {aws-lambda => aws-modules/aws-lambda}/lambda/src/main/java/com/baeldung/lambda/LambdaRequestStreamHandler.java (100%) rename {aws-lambda => aws-modules/aws-lambda}/lambda/src/main/java/com/baeldung/lambda/apigateway/APIDemoHandler.java (100%) rename {aws-lambda => aws-modules/aws-lambda}/lambda/src/main/java/com/baeldung/lambda/apigateway/model/Person.java (100%) rename {aws-lambda => aws-modules/aws-lambda}/lambda/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java (100%) rename {aws-lambda => aws-modules/aws-lambda}/lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java (100%) rename {aws-lambda => aws-modules/aws-lambda}/lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java (100%) rename {aws-lambda => aws-modules/aws-lambda}/lambda/src/main/resources/logback.xml (100%) rename {aws-lambda => aws-modules/aws-lambda}/pom.xml (93%) rename {aws-lambda => aws-modules/aws-lambda}/shipping-tracker/.gitignore (100%) rename {aws-lambda => aws-modules/aws-lambda}/shipping-tracker/ShippingFunction/pom.xml (100%) rename {aws-lambda => aws-modules/aws-lambda}/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/App.java (100%) rename {aws-lambda => aws-modules/aws-lambda}/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Checkin.java (100%) rename {aws-lambda => aws-modules/aws-lambda}/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Consignment.java (100%) rename {aws-lambda => aws-modules/aws-lambda}/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Item.java (100%) rename {aws-lambda => aws-modules/aws-lambda}/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingDao.java (100%) rename {aws-lambda => aws-modules/aws-lambda}/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingService.java (100%) rename {aws-lambda => aws-modules/aws-lambda}/shipping-tracker/template.yaml (100%) rename {aws-lambda => aws-modules/aws-lambda}/todo-reminder/ToDoFunction/pom.xml (100%) rename {aws-lambda => aws-modules/aws-lambda}/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/App.java (100%) rename {aws-lambda => aws-modules/aws-lambda}/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostApi.java (100%) rename {aws-lambda => aws-modules/aws-lambda}/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostItem.java (100%) rename {aws-lambda => aws-modules/aws-lambda}/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoApi.java (100%) rename {aws-lambda => aws-modules/aws-lambda}/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoItem.java (100%) rename {aws-lambda => aws-modules/aws-lambda}/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Config.java (100%) rename {aws-lambda => aws-modules/aws-lambda}/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Credentials.java (100%) rename {aws-lambda => aws-modules/aws-lambda}/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/ExecutionContext.java (100%) rename {aws-lambda => aws-modules/aws-lambda}/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Services.java (100%) rename {aws-lambda => aws-modules/aws-lambda}/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/PostService.java (100%) rename {aws-lambda => aws-modules/aws-lambda}/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/ToDoReaderService.java (100%) rename {aws-lambda => aws-modules/aws-lambda}/todo-reminder/ToDoFunction/src/main/resources/configuration.yml (100%) rename {aws-lambda => aws-modules/aws-lambda}/todo-reminder/ToDoFunction/src/main/resources/log4j2.xml (100%) rename {aws-lambda => aws-modules/aws-lambda}/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/AppTest.java (100%) rename {aws-lambda => aws-modules/aws-lambda}/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/service/ToDoReaderServiceTest.java (100%) rename {aws-lambda => aws-modules/aws-lambda}/todo-reminder/template.yaml (100%) rename {aws => aws-modules/aws-miscellaneous}/.gitignore (100%) create mode 100644 aws-modules/aws-miscellaneous/README.md rename {aws => aws-modules/aws-miscellaneous}/pom.xml (88%) rename {aws => aws-modules/aws-miscellaneous}/src/main/java/com/baeldung/dynamodb/entity/ProductInfo.java (100%) rename {aws => aws-modules/aws-miscellaneous}/src/main/java/com/baeldung/dynamodb/repository/AbstractRepository.java (100%) rename {aws => aws-modules/aws-miscellaneous}/src/main/java/com/baeldung/dynamodb/repository/ProductInfoRepository.java (100%) rename {aws => aws-modules/aws-miscellaneous}/src/main/java/com/baeldung/ec2/EC2Application.java (100%) rename {aws => aws-modules/aws-miscellaneous}/src/main/java/com/baeldung/rds/AWSRDSService.java (100%) rename {aws => aws-modules/aws-miscellaneous}/src/main/java/com/baeldung/sqs/SQSApplication.java (100%) rename {aws => aws-modules/aws-miscellaneous}/src/main/resources/db.properties (100%) rename {aws => aws-modules/aws-miscellaneous}/src/main/resources/logback.xml (100%) rename {aws => aws-modules/aws-miscellaneous}/src/test/java/com/baeldung/dynamodb/ProductInfoRepositoryIntegrationTest.java (100%) rename {aws => aws-modules/aws-miscellaneous}/src/test/java/com/baeldung/dynamodb/rule/LocalDbCreationRule.java (100%) rename {aws => aws-modules/aws-miscellaneous}/src/test/resources/test.properties (100%) rename {aws-reactive => aws-modules/aws-reactive}/README.md (58%) rename {aws-reactive => aws-modules/aws-reactive}/images/rective-upload.png (100%) rename {aws-reactive => aws-modules/aws-reactive}/images/rective-upload.txt (100%) rename {aws-reactive => aws-modules/aws-reactive}/images/thread-per-client.png (100%) rename {aws-reactive => aws-modules/aws-reactive}/images/thread-per-client.txt (100%) rename {aws-reactive => aws-modules/aws-reactive}/pom.xml (98%) rename {aws-reactive => aws-modules/aws-reactive}/src/main/java/com/baeldung/aws/reactive/s3/DownloadFailedException.java (100%) rename {aws-reactive => aws-modules/aws-reactive}/src/main/java/com/baeldung/aws/reactive/s3/DownloadResource.java (100%) rename {aws-reactive => aws-modules/aws-reactive}/src/main/java/com/baeldung/aws/reactive/s3/ReactiveS3Application.java (100%) rename {aws-reactive => aws-modules/aws-reactive}/src/main/java/com/baeldung/aws/reactive/s3/S3ClientConfigurarionProperties.java (100%) rename {aws-reactive => aws-modules/aws-reactive}/src/main/java/com/baeldung/aws/reactive/s3/S3ClientConfiguration.java (100%) rename {aws-reactive => aws-modules/aws-reactive}/src/main/java/com/baeldung/aws/reactive/s3/UploadFailedException.java (100%) rename {aws-reactive => aws-modules/aws-reactive}/src/main/java/com/baeldung/aws/reactive/s3/UploadResource.java (100%) rename {aws-reactive => aws-modules/aws-reactive}/src/main/java/com/baeldung/aws/reactive/s3/UploadResult.java (100%) rename {aws-reactive => aws-modules/aws-reactive}/src/main/resources/application-minio.yml (100%) rename {aws-reactive => aws-modules/aws-reactive}/src/main/resources/application.yml (100%) rename {aws-reactive => aws-modules/aws-reactive}/src/test/java/com/baeldung/aws/reactive/s3/ReactiveS3ApplicationLiveTest.java (100%) rename {aws-reactive => aws-modules/aws-reactive}/src/test/resources/testimage1.png (100%) rename {aws-reactive => aws-modules/aws-reactive}/src/test/resources/testimage2.png (100%) create mode 100644 aws-modules/aws-s3/.gitignore create mode 100644 aws-modules/aws-s3/README.md create mode 100644 aws-modules/aws-s3/pom.xml rename {aws => aws-modules/aws-s3}/src/main/java/com/baeldung/s3/AWSS3Service.java (100%) rename {aws => aws-modules/aws-s3}/src/main/java/com/baeldung/s3/MultipartUpload.java (100%) rename {aws => aws-modules/aws-s3}/src/main/java/com/baeldung/s3/S3Application.java (100%) create mode 100644 aws-modules/aws-s3/src/main/resources/logback.xml rename {aws => aws-modules/aws-s3}/src/test/java/com/baeldung/jets3t/JetS3tLiveTest.java (100%) rename {aws => aws-modules/aws-s3}/src/test/java/com/baeldung/s3/AWSS3ServiceIntegrationTest.java (100%) rename {aws => aws-modules/aws-s3}/src/test/java/com/baeldung/s3/MultipartUploadLiveTest.java (100%) create mode 100644 aws-modules/pom.xml delete mode 100644 aws/README.md delete mode 100644 aws/native-libs/libsqlite4java-linux-amd64-1.0.392.so delete mode 100644 aws/native-libs/libsqlite4java-linux-i386-1.0.392.so delete mode 100644 aws/native-libs/sqlite4java-win32-x64-1.0.392.dll delete mode 100644 aws/native-libs/sqlite4java-win32-x86-1.0.392.dll diff --git a/aws-app-sync/README.md b/aws-modules/aws-app-sync/README.md similarity index 100% rename from aws-app-sync/README.md rename to aws-modules/aws-app-sync/README.md diff --git a/aws-app-sync/pom.xml b/aws-modules/aws-app-sync/pom.xml similarity index 96% rename from aws-app-sync/pom.xml rename to aws-modules/aws-app-sync/pom.xml index b759de4a72..8d7d90e631 100644 --- a/aws-app-sync/pom.xml +++ b/aws-modules/aws-app-sync/pom.xml @@ -11,7 +11,7 @@ com.baeldung parent-boot-2 0.0.1-SNAPSHOT - ../parent-boot-2 + ../../parent-boot-2 diff --git a/aws-app-sync/src/main/java/com/baeldung/awsappsync/AppSyncClientHelper.java b/aws-modules/aws-app-sync/src/main/java/com/baeldung/awsappsync/AppSyncClientHelper.java similarity index 100% rename from aws-app-sync/src/main/java/com/baeldung/awsappsync/AppSyncClientHelper.java rename to aws-modules/aws-app-sync/src/main/java/com/baeldung/awsappsync/AppSyncClientHelper.java diff --git a/aws-app-sync/src/main/java/com/baeldung/awsappsync/AwsAppSyncApplication.java b/aws-modules/aws-app-sync/src/main/java/com/baeldung/awsappsync/AwsAppSyncApplication.java similarity index 100% rename from aws-app-sync/src/main/java/com/baeldung/awsappsync/AwsAppSyncApplication.java rename to aws-modules/aws-app-sync/src/main/java/com/baeldung/awsappsync/AwsAppSyncApplication.java diff --git a/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationUnitTest.java b/aws-modules/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationUnitTest.java similarity index 100% rename from aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationUnitTest.java rename to aws-modules/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationUnitTest.java diff --git a/aws-lambda/.gitignore b/aws-modules/aws-lambda/.gitignore similarity index 100% rename from aws-lambda/.gitignore rename to aws-modules/aws-lambda/.gitignore diff --git a/aws-lambda/README.md b/aws-modules/aws-lambda/README.md similarity index 73% rename from aws-lambda/README.md rename to aws-modules/aws-lambda/README.md index 0ae188fc97..a845c5835e 100644 --- a/aws-lambda/README.md +++ b/aws-modules/aws-lambda/README.md @@ -3,7 +3,9 @@ This module contains articles about AWS Lambda ### Relevant Articles: +- [A Basic AWS Lambda Example With Java](https://www.baeldung.com/java-aws-lambda) - [Using AWS Lambda with API Gateway](https://www.baeldung.com/aws-lambda-api-gateway) - [Introduction to AWS Serverless Application Model](https://www.baeldung.com/aws-serverless) - [How to Implement Hibernate in an AWS Lambda Function in Java](https://www.baeldung.com/java-aws-lambda-hibernate) - [Writing an Enterprise-Grade AWS Lambda in Java](https://www.baeldung.com/java-enterprise-aws-lambda) +- [AWS Lambda Using DynamoDB With Java](https://www.baeldung.com/aws-lambda-dynamodb-java) diff --git a/aws-lambda/lambda/pom.xml b/aws-modules/aws-lambda/lambda/pom.xml similarity index 100% rename from aws-lambda/lambda/pom.xml rename to aws-modules/aws-lambda/lambda/pom.xml diff --git a/aws-lambda/lambda/sam-templates/template-implicit.yaml b/aws-modules/aws-lambda/lambda/sam-templates/template-implicit.yaml similarity index 100% rename from aws-lambda/lambda/sam-templates/template-implicit.yaml rename to aws-modules/aws-lambda/lambda/sam-templates/template-implicit.yaml diff --git a/aws-lambda/lambda/sam-templates/template-inline-swagger.yaml b/aws-modules/aws-lambda/lambda/sam-templates/template-inline-swagger.yaml similarity index 100% rename from aws-lambda/lambda/sam-templates/template-inline-swagger.yaml rename to aws-modules/aws-lambda/lambda/sam-templates/template-inline-swagger.yaml diff --git a/aws-lambda/lambda/src/main/java/com/baeldung/lambda/LambdaMethodHandler.java b/aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/LambdaMethodHandler.java similarity index 100% rename from aws-lambda/lambda/src/main/java/com/baeldung/lambda/LambdaMethodHandler.java rename to aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/LambdaMethodHandler.java diff --git a/aws-lambda/lambda/src/main/java/com/baeldung/lambda/LambdaRequestHandler.java b/aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/LambdaRequestHandler.java similarity index 100% rename from aws-lambda/lambda/src/main/java/com/baeldung/lambda/LambdaRequestHandler.java rename to aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/LambdaRequestHandler.java diff --git a/aws-lambda/lambda/src/main/java/com/baeldung/lambda/LambdaRequestStreamHandler.java b/aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/LambdaRequestStreamHandler.java similarity index 100% rename from aws-lambda/lambda/src/main/java/com/baeldung/lambda/LambdaRequestStreamHandler.java rename to aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/LambdaRequestStreamHandler.java diff --git a/aws-lambda/lambda/src/main/java/com/baeldung/lambda/apigateway/APIDemoHandler.java b/aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/apigateway/APIDemoHandler.java similarity index 100% rename from aws-lambda/lambda/src/main/java/com/baeldung/lambda/apigateway/APIDemoHandler.java rename to aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/apigateway/APIDemoHandler.java diff --git a/aws-lambda/lambda/src/main/java/com/baeldung/lambda/apigateway/model/Person.java b/aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/apigateway/model/Person.java similarity index 100% rename from aws-lambda/lambda/src/main/java/com/baeldung/lambda/apigateway/model/Person.java rename to aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/apigateway/model/Person.java diff --git a/aws-lambda/lambda/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java b/aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java similarity index 100% rename from aws-lambda/lambda/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java rename to aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java diff --git a/aws-lambda/lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java b/aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java similarity index 100% rename from aws-lambda/lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java rename to aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java diff --git a/aws-lambda/lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java b/aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java similarity index 100% rename from aws-lambda/lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java rename to aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java diff --git a/aws-lambda/lambda/src/main/resources/logback.xml b/aws-modules/aws-lambda/lambda/src/main/resources/logback.xml similarity index 100% rename from aws-lambda/lambda/src/main/resources/logback.xml rename to aws-modules/aws-lambda/lambda/src/main/resources/logback.xml diff --git a/aws-lambda/pom.xml b/aws-modules/aws-lambda/pom.xml similarity index 93% rename from aws-lambda/pom.xml rename to aws-modules/aws-lambda/pom.xml index fc655f282d..bdd295c007 100644 --- a/aws-lambda/pom.xml +++ b/aws-modules/aws-lambda/pom.xml @@ -9,7 +9,7 @@ com.baeldung - parent-modules + aws-modules 1.0.0-SNAPSHOT diff --git a/aws-lambda/shipping-tracker/.gitignore b/aws-modules/aws-lambda/shipping-tracker/.gitignore similarity index 100% rename from aws-lambda/shipping-tracker/.gitignore rename to aws-modules/aws-lambda/shipping-tracker/.gitignore diff --git a/aws-lambda/shipping-tracker/ShippingFunction/pom.xml b/aws-modules/aws-lambda/shipping-tracker/ShippingFunction/pom.xml similarity index 100% rename from aws-lambda/shipping-tracker/ShippingFunction/pom.xml rename to aws-modules/aws-lambda/shipping-tracker/ShippingFunction/pom.xml diff --git a/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/App.java b/aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/App.java similarity index 100% rename from aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/App.java rename to aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/App.java diff --git a/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Checkin.java b/aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Checkin.java similarity index 100% rename from aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Checkin.java rename to aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Checkin.java diff --git a/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Consignment.java b/aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Consignment.java similarity index 100% rename from aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Consignment.java rename to aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Consignment.java diff --git a/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Item.java b/aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Item.java similarity index 100% rename from aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Item.java rename to aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Item.java diff --git a/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingDao.java b/aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingDao.java similarity index 100% rename from aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingDao.java rename to aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingDao.java diff --git a/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingService.java b/aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingService.java similarity index 100% rename from aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingService.java rename to aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingService.java diff --git a/aws-lambda/shipping-tracker/template.yaml b/aws-modules/aws-lambda/shipping-tracker/template.yaml similarity index 100% rename from aws-lambda/shipping-tracker/template.yaml rename to aws-modules/aws-lambda/shipping-tracker/template.yaml diff --git a/aws-lambda/todo-reminder/ToDoFunction/pom.xml b/aws-modules/aws-lambda/todo-reminder/ToDoFunction/pom.xml similarity index 100% rename from aws-lambda/todo-reminder/ToDoFunction/pom.xml rename to aws-modules/aws-lambda/todo-reminder/ToDoFunction/pom.xml diff --git a/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/App.java b/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/App.java similarity index 100% rename from aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/App.java rename to aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/App.java diff --git a/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostApi.java b/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostApi.java similarity index 100% rename from aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostApi.java rename to aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostApi.java diff --git a/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostItem.java b/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostItem.java similarity index 100% rename from aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostItem.java rename to aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostItem.java diff --git a/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoApi.java b/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoApi.java similarity index 100% rename from aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoApi.java rename to aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoApi.java diff --git a/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoItem.java b/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoItem.java similarity index 100% rename from aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoItem.java rename to aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoItem.java diff --git a/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Config.java b/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Config.java similarity index 100% rename from aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Config.java rename to aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Config.java diff --git a/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Credentials.java b/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Credentials.java similarity index 100% rename from aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Credentials.java rename to aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Credentials.java diff --git a/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/ExecutionContext.java b/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/ExecutionContext.java similarity index 100% rename from aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/ExecutionContext.java rename to aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/ExecutionContext.java diff --git a/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Services.java b/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Services.java similarity index 100% rename from aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Services.java rename to aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Services.java diff --git a/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/PostService.java b/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/PostService.java similarity index 100% rename from aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/PostService.java rename to aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/PostService.java diff --git a/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/ToDoReaderService.java b/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/ToDoReaderService.java similarity index 100% rename from aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/ToDoReaderService.java rename to aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/ToDoReaderService.java diff --git a/aws-lambda/todo-reminder/ToDoFunction/src/main/resources/configuration.yml b/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/resources/configuration.yml similarity index 100% rename from aws-lambda/todo-reminder/ToDoFunction/src/main/resources/configuration.yml rename to aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/resources/configuration.yml diff --git a/aws-lambda/todo-reminder/ToDoFunction/src/main/resources/log4j2.xml b/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/resources/log4j2.xml similarity index 100% rename from aws-lambda/todo-reminder/ToDoFunction/src/main/resources/log4j2.xml rename to aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/resources/log4j2.xml diff --git a/aws-lambda/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/AppTest.java b/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/AppTest.java similarity index 100% rename from aws-lambda/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/AppTest.java rename to aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/AppTest.java diff --git a/aws-lambda/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/service/ToDoReaderServiceTest.java b/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/service/ToDoReaderServiceTest.java similarity index 100% rename from aws-lambda/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/service/ToDoReaderServiceTest.java rename to aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/service/ToDoReaderServiceTest.java diff --git a/aws-lambda/todo-reminder/template.yaml b/aws-modules/aws-lambda/todo-reminder/template.yaml similarity index 100% rename from aws-lambda/todo-reminder/template.yaml rename to aws-modules/aws-lambda/todo-reminder/template.yaml diff --git a/aws/.gitignore b/aws-modules/aws-miscellaneous/.gitignore similarity index 100% rename from aws/.gitignore rename to aws-modules/aws-miscellaneous/.gitignore diff --git a/aws-modules/aws-miscellaneous/README.md b/aws-modules/aws-miscellaneous/README.md new file mode 100644 index 0000000000..5be8e6a3f2 --- /dev/null +++ b/aws-modules/aws-miscellaneous/README.md @@ -0,0 +1,10 @@ +## AWS Miscellaneous + +This module contains articles about various Amazon Web Services (AWS) such as EC2, DynamoDB, SQS, RDS + +### Relevant articles + +- [Managing EC2 Instances in Java](https://www.baeldung.com/ec2-java) +- [Integration Testing with a Local DynamoDB Instance](https://www.baeldung.com/dynamodb-local-integration-tests) +- [Managing Amazon SQS Queues in Java](https://www.baeldung.com/aws-queues-java) +- [Guide to AWS Aurora RDS with Java](https://www.baeldung.com/aws-aurora-rds-java) diff --git a/aws/pom.xml b/aws-modules/aws-miscellaneous/pom.xml similarity index 88% rename from aws/pom.xml rename to aws-modules/aws-miscellaneous/pom.xml index a57dd6690e..f05764f10a 100644 --- a/aws/pom.xml +++ b/aws-modules/aws-miscellaneous/pom.xml @@ -3,14 +3,14 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - aws + aws-miscellaneous 0.1.0-SNAPSHOT - aws + aws-miscellaneous jar com.baeldung - parent-modules + aws-modules 1.0.0-SNAPSHOT @@ -58,17 +58,6 @@ ${dynamodblocal.version} test - - - org.lucee - jets3t - ${jets3t-version} - - - org.lucee - commons-codec - ${commons-codec-version} - diff --git a/aws/src/main/java/com/baeldung/dynamodb/entity/ProductInfo.java b/aws-modules/aws-miscellaneous/src/main/java/com/baeldung/dynamodb/entity/ProductInfo.java similarity index 100% rename from aws/src/main/java/com/baeldung/dynamodb/entity/ProductInfo.java rename to aws-modules/aws-miscellaneous/src/main/java/com/baeldung/dynamodb/entity/ProductInfo.java diff --git a/aws/src/main/java/com/baeldung/dynamodb/repository/AbstractRepository.java b/aws-modules/aws-miscellaneous/src/main/java/com/baeldung/dynamodb/repository/AbstractRepository.java similarity index 100% rename from aws/src/main/java/com/baeldung/dynamodb/repository/AbstractRepository.java rename to aws-modules/aws-miscellaneous/src/main/java/com/baeldung/dynamodb/repository/AbstractRepository.java diff --git a/aws/src/main/java/com/baeldung/dynamodb/repository/ProductInfoRepository.java b/aws-modules/aws-miscellaneous/src/main/java/com/baeldung/dynamodb/repository/ProductInfoRepository.java similarity index 100% rename from aws/src/main/java/com/baeldung/dynamodb/repository/ProductInfoRepository.java rename to aws-modules/aws-miscellaneous/src/main/java/com/baeldung/dynamodb/repository/ProductInfoRepository.java diff --git a/aws/src/main/java/com/baeldung/ec2/EC2Application.java b/aws-modules/aws-miscellaneous/src/main/java/com/baeldung/ec2/EC2Application.java similarity index 100% rename from aws/src/main/java/com/baeldung/ec2/EC2Application.java rename to aws-modules/aws-miscellaneous/src/main/java/com/baeldung/ec2/EC2Application.java diff --git a/aws/src/main/java/com/baeldung/rds/AWSRDSService.java b/aws-modules/aws-miscellaneous/src/main/java/com/baeldung/rds/AWSRDSService.java similarity index 100% rename from aws/src/main/java/com/baeldung/rds/AWSRDSService.java rename to aws-modules/aws-miscellaneous/src/main/java/com/baeldung/rds/AWSRDSService.java diff --git a/aws/src/main/java/com/baeldung/sqs/SQSApplication.java b/aws-modules/aws-miscellaneous/src/main/java/com/baeldung/sqs/SQSApplication.java similarity index 100% rename from aws/src/main/java/com/baeldung/sqs/SQSApplication.java rename to aws-modules/aws-miscellaneous/src/main/java/com/baeldung/sqs/SQSApplication.java diff --git a/aws/src/main/resources/db.properties b/aws-modules/aws-miscellaneous/src/main/resources/db.properties similarity index 100% rename from aws/src/main/resources/db.properties rename to aws-modules/aws-miscellaneous/src/main/resources/db.properties diff --git a/aws/src/main/resources/logback.xml b/aws-modules/aws-miscellaneous/src/main/resources/logback.xml similarity index 100% rename from aws/src/main/resources/logback.xml rename to aws-modules/aws-miscellaneous/src/main/resources/logback.xml diff --git a/aws/src/test/java/com/baeldung/dynamodb/ProductInfoRepositoryIntegrationTest.java b/aws-modules/aws-miscellaneous/src/test/java/com/baeldung/dynamodb/ProductInfoRepositoryIntegrationTest.java similarity index 100% rename from aws/src/test/java/com/baeldung/dynamodb/ProductInfoRepositoryIntegrationTest.java rename to aws-modules/aws-miscellaneous/src/test/java/com/baeldung/dynamodb/ProductInfoRepositoryIntegrationTest.java diff --git a/aws/src/test/java/com/baeldung/dynamodb/rule/LocalDbCreationRule.java b/aws-modules/aws-miscellaneous/src/test/java/com/baeldung/dynamodb/rule/LocalDbCreationRule.java similarity index 100% rename from aws/src/test/java/com/baeldung/dynamodb/rule/LocalDbCreationRule.java rename to aws-modules/aws-miscellaneous/src/test/java/com/baeldung/dynamodb/rule/LocalDbCreationRule.java diff --git a/aws/src/test/resources/test.properties b/aws-modules/aws-miscellaneous/src/test/resources/test.properties similarity index 100% rename from aws/src/test/resources/test.properties rename to aws-modules/aws-miscellaneous/src/test/resources/test.properties diff --git a/aws-reactive/README.md b/aws-modules/aws-reactive/README.md similarity index 58% rename from aws-reactive/README.md rename to aws-modules/aws-reactive/README.md index 1abf987b52..9164bd0ea6 100644 --- a/aws-reactive/README.md +++ b/aws-modules/aws-reactive/README.md @@ -1,3 +1,7 @@ +## AWS Reactive + +This module contains articles about reactive support with AWS + ### Relevant Articles: - [AWS S3 with Java – Reactive Support](https://www.baeldung.com/java-aws-s3-reactive) diff --git a/aws-reactive/images/rective-upload.png b/aws-modules/aws-reactive/images/rective-upload.png similarity index 100% rename from aws-reactive/images/rective-upload.png rename to aws-modules/aws-reactive/images/rective-upload.png diff --git a/aws-reactive/images/rective-upload.txt b/aws-modules/aws-reactive/images/rective-upload.txt similarity index 100% rename from aws-reactive/images/rective-upload.txt rename to aws-modules/aws-reactive/images/rective-upload.txt diff --git a/aws-reactive/images/thread-per-client.png b/aws-modules/aws-reactive/images/thread-per-client.png similarity index 100% rename from aws-reactive/images/thread-per-client.png rename to aws-modules/aws-reactive/images/thread-per-client.png diff --git a/aws-reactive/images/thread-per-client.txt b/aws-modules/aws-reactive/images/thread-per-client.txt similarity index 100% rename from aws-reactive/images/thread-per-client.txt rename to aws-modules/aws-reactive/images/thread-per-client.txt diff --git a/aws-reactive/pom.xml b/aws-modules/aws-reactive/pom.xml similarity index 98% rename from aws-reactive/pom.xml rename to aws-modules/aws-reactive/pom.xml index 923e1361ab..7a9cefb9d1 100644 --- a/aws-reactive/pom.xml +++ b/aws-modules/aws-reactive/pom.xml @@ -10,7 +10,7 @@ com.baeldung - parent-modules + aws-modules 1.0.0-SNAPSHOT diff --git a/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/DownloadFailedException.java b/aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/DownloadFailedException.java similarity index 100% rename from aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/DownloadFailedException.java rename to aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/DownloadFailedException.java diff --git a/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/DownloadResource.java b/aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/DownloadResource.java similarity index 100% rename from aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/DownloadResource.java rename to aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/DownloadResource.java diff --git a/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/ReactiveS3Application.java b/aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/ReactiveS3Application.java similarity index 100% rename from aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/ReactiveS3Application.java rename to aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/ReactiveS3Application.java diff --git a/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/S3ClientConfigurarionProperties.java b/aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/S3ClientConfigurarionProperties.java similarity index 100% rename from aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/S3ClientConfigurarionProperties.java rename to aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/S3ClientConfigurarionProperties.java diff --git a/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/S3ClientConfiguration.java b/aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/S3ClientConfiguration.java similarity index 100% rename from aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/S3ClientConfiguration.java rename to aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/S3ClientConfiguration.java diff --git a/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadFailedException.java b/aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadFailedException.java similarity index 100% rename from aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadFailedException.java rename to aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadFailedException.java diff --git a/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadResource.java b/aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadResource.java similarity index 100% rename from aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadResource.java rename to aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadResource.java diff --git a/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadResult.java b/aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadResult.java similarity index 100% rename from aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadResult.java rename to aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadResult.java diff --git a/aws-reactive/src/main/resources/application-minio.yml b/aws-modules/aws-reactive/src/main/resources/application-minio.yml similarity index 100% rename from aws-reactive/src/main/resources/application-minio.yml rename to aws-modules/aws-reactive/src/main/resources/application-minio.yml diff --git a/aws-reactive/src/main/resources/application.yml b/aws-modules/aws-reactive/src/main/resources/application.yml similarity index 100% rename from aws-reactive/src/main/resources/application.yml rename to aws-modules/aws-reactive/src/main/resources/application.yml diff --git a/aws-reactive/src/test/java/com/baeldung/aws/reactive/s3/ReactiveS3ApplicationLiveTest.java b/aws-modules/aws-reactive/src/test/java/com/baeldung/aws/reactive/s3/ReactiveS3ApplicationLiveTest.java similarity index 100% rename from aws-reactive/src/test/java/com/baeldung/aws/reactive/s3/ReactiveS3ApplicationLiveTest.java rename to aws-modules/aws-reactive/src/test/java/com/baeldung/aws/reactive/s3/ReactiveS3ApplicationLiveTest.java diff --git a/aws-reactive/src/test/resources/testimage1.png b/aws-modules/aws-reactive/src/test/resources/testimage1.png similarity index 100% rename from aws-reactive/src/test/resources/testimage1.png rename to aws-modules/aws-reactive/src/test/resources/testimage1.png diff --git a/aws-reactive/src/test/resources/testimage2.png b/aws-modules/aws-reactive/src/test/resources/testimage2.png similarity index 100% rename from aws-reactive/src/test/resources/testimage2.png rename to aws-modules/aws-reactive/src/test/resources/testimage2.png diff --git a/aws-modules/aws-s3/.gitignore b/aws-modules/aws-s3/.gitignore new file mode 100644 index 0000000000..bf11a4cc38 --- /dev/null +++ b/aws-modules/aws-s3/.gitignore @@ -0,0 +1,2 @@ +/target/ +.idea/ \ No newline at end of file diff --git a/aws-modules/aws-s3/README.md b/aws-modules/aws-s3/README.md new file mode 100644 index 0000000000..efebf7d933 --- /dev/null +++ b/aws-modules/aws-s3/README.md @@ -0,0 +1,9 @@ +## AWS S3 + +This module contains articles about Simple Storage Service (S3) on AWS + +### Relevant articles + +- [AWS S3 with Java](https://www.baeldung.com/aws-s3-java) +- [Multipart Uploads in Amazon S3 with Java](https://www.baeldung.com/aws-s3-multipart-upload) +- [Using the JetS3t Java Client With Amazon S3](https://www.baeldung.com/jets3t-amazon-s3) \ No newline at end of file diff --git a/aws-modules/aws-s3/pom.xml b/aws-modules/aws-s3/pom.xml new file mode 100644 index 0000000000..65ad6f27f8 --- /dev/null +++ b/aws-modules/aws-s3/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + aws-s3 + 0.1.0-SNAPSHOT + aws-s3 + jar + + + com.baeldung + aws-modules + 1.0.0-SNAPSHOT + + + + + com.amazonaws + aws-java-sdk + ${aws-java-sdk.version} + + + + commons-io + commons-io + ${commons-io.version} + + + + org.lucee + jets3t + ${jets3t-version} + + + org.lucee + commons-codec + ${commons-codec-version} + + + + + + + org.apache.maven.plugins + maven-shade-plugin + ${maven-shade-plugin.version} + + false + + + + package + + shade + + + + + + + + + 1.11.290 + 1.10.L001 + 0.9.4.0006L + 3.0.0 + + + \ No newline at end of file diff --git a/aws/src/main/java/com/baeldung/s3/AWSS3Service.java b/aws-modules/aws-s3/src/main/java/com/baeldung/s3/AWSS3Service.java similarity index 100% rename from aws/src/main/java/com/baeldung/s3/AWSS3Service.java rename to aws-modules/aws-s3/src/main/java/com/baeldung/s3/AWSS3Service.java diff --git a/aws/src/main/java/com/baeldung/s3/MultipartUpload.java b/aws-modules/aws-s3/src/main/java/com/baeldung/s3/MultipartUpload.java similarity index 100% rename from aws/src/main/java/com/baeldung/s3/MultipartUpload.java rename to aws-modules/aws-s3/src/main/java/com/baeldung/s3/MultipartUpload.java diff --git a/aws/src/main/java/com/baeldung/s3/S3Application.java b/aws-modules/aws-s3/src/main/java/com/baeldung/s3/S3Application.java similarity index 100% rename from aws/src/main/java/com/baeldung/s3/S3Application.java rename to aws-modules/aws-s3/src/main/java/com/baeldung/s3/S3Application.java diff --git a/aws-modules/aws-s3/src/main/resources/logback.xml b/aws-modules/aws-s3/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/aws-modules/aws-s3/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/aws/src/test/java/com/baeldung/jets3t/JetS3tLiveTest.java b/aws-modules/aws-s3/src/test/java/com/baeldung/jets3t/JetS3tLiveTest.java similarity index 100% rename from aws/src/test/java/com/baeldung/jets3t/JetS3tLiveTest.java rename to aws-modules/aws-s3/src/test/java/com/baeldung/jets3t/JetS3tLiveTest.java diff --git a/aws/src/test/java/com/baeldung/s3/AWSS3ServiceIntegrationTest.java b/aws-modules/aws-s3/src/test/java/com/baeldung/s3/AWSS3ServiceIntegrationTest.java similarity index 100% rename from aws/src/test/java/com/baeldung/s3/AWSS3ServiceIntegrationTest.java rename to aws-modules/aws-s3/src/test/java/com/baeldung/s3/AWSS3ServiceIntegrationTest.java diff --git a/aws/src/test/java/com/baeldung/s3/MultipartUploadLiveTest.java b/aws-modules/aws-s3/src/test/java/com/baeldung/s3/MultipartUploadLiveTest.java similarity index 100% rename from aws/src/test/java/com/baeldung/s3/MultipartUploadLiveTest.java rename to aws-modules/aws-s3/src/test/java/com/baeldung/s3/MultipartUploadLiveTest.java diff --git a/aws-modules/pom.xml b/aws-modules/pom.xml new file mode 100644 index 0000000000..4bdffa789a --- /dev/null +++ b/aws-modules/pom.xml @@ -0,0 +1,24 @@ + + + 4.0.0 + aws-modules + aws-modules + pom + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + aws-app-sync + aws-lambda + aws-miscellaneous + aws-reactive + aws-s3 + + + \ No newline at end of file diff --git a/aws/README.md b/aws/README.md deleted file mode 100644 index 9006c2d190..0000000000 --- a/aws/README.md +++ /dev/null @@ -1,15 +0,0 @@ -## AWS - -This module contains articles about Amazon Web Services (AWS) - -### Relevant articles - -- [AWS Lambda Using DynamoDB With Java](https://www.baeldung.com/aws-lambda-dynamodb-java) -- [AWS S3 with Java](https://www.baeldung.com/aws-s3-java) -- [A Basic AWS Lambda Example With Java](https://www.baeldung.com/java-aws-lambda) -- [Managing EC2 Instances in Java](https://www.baeldung.com/ec2-java) -- [Multipart Uploads in Amazon S3 with Java](https://www.baeldung.com/aws-s3-multipart-upload) -- [Integration Testing with a Local DynamoDB Instance](https://www.baeldung.com/dynamodb-local-integration-tests) -- [Using the JetS3t Java Client With Amazon S3](https://www.baeldung.com/jets3t-amazon-s3) -- [Managing Amazon SQS Queues in Java](https://www.baeldung.com/aws-queues-java) -- [Guide to AWS Aurora RDS with Java](https://www.baeldung.com/aws-aurora-rds-java) diff --git a/aws/native-libs/libsqlite4java-linux-amd64-1.0.392.so b/aws/native-libs/libsqlite4java-linux-amd64-1.0.392.so deleted file mode 100644 index 884615789b9ca54e9487153e0492a6be5fe550bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 902282 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

Q6(0=X~EJi!@f{eSY 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 z zKgvk1MxZctt{Azx*51mWD)YM`^E>m5U|Y-7A)rARhV;CV-*W$8_>r9=qoiFgc?~y= zp$XxR*8z-*tz3-ctnv=|jF@^qn zl=L0jw8BJ;{Bvwk5DzgwXS`TRknBmwLZZb>^Avzf1 zWVTpvHA>j+)n=riLF7sSH$J@{rK%6QAq8Tr1xx7Fc`UR1ErEh5{=Ql!2svpK3xw_N z$PjsPDl(O!65CR+5d=XshMi}gz7$KH$7Ec>K%I#Q3~N(1$BFRt$_+U(uIn)d(_fil zJadgli4!zj=uku#LV&6*EE1HQ4OkvYUsV_veZ+>pwaX!9`C~aA^lVHb9vPd(+@5GTzXhp5@Hb$|9CbW zeI{4YS<;H5pc!4&Qu`G6SK{f-ZmC|=5?oDjBD%WG&LewewQ08m|7Pk0$8EN!CHQxI zknH@H;6LOyuO;}j*$HdGBk>@qb+rVa5z+Bnzwtmj5C_fbu~##N!T^AzqN`|;`cnLJ zRU9aoEuVv&F+yQhHp8s6U=yi16#^9q8*{5-S2oG>4)uJC^L(qr$+WMRbDRAjh9~eK zqpTSm>Z7Z|iRt+=amy%%x9RN9Ass#K#DHW6{&oyM(Z9a&UbVbFHh8RY3fZIDD+LRI zXhf`OY+Nu&TL)nN)t(I|VF9meubAT2tVKV^>st0rL0{+@C&|mwjT7M^o%~eZ7h*sg z+O&&vp?qKAzgY*EVuJiSj}(0nepYj{4%#Y=HI8;0_uL{(0J9ri&Fl8xp5Z)+(Y#L0 zfL=kY5JjXZTr=9TYsW!}%DTAcHQ1zKu_M_=(~aE3j<|8!CX|xV^c>p~uHI;RiVIo| zN$`B#qS5q_G-Ul$@Q_&PNII5)bU|Fv%DEsT+ga*cUw`#S#APyjU}NBiz?=xnqBjXe zNjKFX@5Ps{bu9~O0vzq68nf2Vg<&TbTpKD6cIsD_64w(#jorAa1g}NQOx0G62aw~; z=F@aX zj8bMgdV0uuR^dRpb6H8ZU8ixtMa&c^z};SPx+`b|KZcMX;?idvCt8i-d;0O%;xmL0 zp2n$ntK?^AUGtPG=L0=$Ew!r^vJq%z(Q8*Xk@9DkNF}Un5f?r6I^~K9FYcewQ9t5de1z_`caT5!OdhqUx~%Uae4 zE!zWIliwR?R~EA6A1tvpMoqp=+X6_;lkhb07xIi}4l2gZ0VfQ&Wu$*rebDDQHl5g; zz#%l&*w3!+?Q750JVH8t7uk%^{46sst01by3Tsh$xONP?3n zr^iv+YHMw6ecxJ3Z%VC&s1*`~1T1Q_Ua)FG1Uch~AZiGxNzTYV^VbBkWciR4E}dZ^O1@sHb=y!6?$8m>Cs^QRuwrZ zgMLx;(}4dk`_eM>aLa-Gv>t8=zS>G))+4%f9%4jDBO#1RP{l24=ENGp?~@J)?TEXG zLRUw&&>WuTeua` zt=%skU`MFfK-)waMlr0h8{}l+BGT-K87}81)hR*-2j6bw#i8`7rax4Fm;xml5wV@f z9Ju6sW`4tYimd_(h+J78oSE&V;e1{! zd|FPjTP7rZf0pwPdTg8U`xN~ntUt}~gDuUReCAZsz6!vRWmbchf~6-B83?p-|GK~$ zAA7KRo#+Q{b$(1aoGNkh%GpW}1_CdkzuLN+F7j=la2o@ofuWS(>db&?@Ow_h*&N zk}h>_=L#)i9_ibr#5QUjXx|;b_$Qw0xbdfGUS`2LkCNh?SdH@!JZN3SuZ$G<#Wsms z*BiBsy-52X1LKH>ZdmAgf3j2WFGXZ1X)#dF!M8$26)$>uV#-kPdZ1ZR7LW3#W#N2J zbTM)UxDA}Mer0sm?U$M7^z|3Jzh&~{CRJKfG>2i5lU!Q;Bq71} z!ZfJDsaC^ISvBf+`}@`PN$WqiG#?G|^IFh8&%8KDG;gst2x#`H2&(9?vFvr4Ktb_O zPe@asf=73|c<*p`P8T1=6n3@4#Tc4IA7^*zI?X=@tM{6}YgtqXglb)DqwP-Wm8;KV zKXc&$3);V`Vd2mqt_V>lOE!(ITqoe+wFJ-GMw{kQJtG`K=j2BOJz>SK9)p(VOA^&P zJG3#($q3g-WAOtR4THy&Kz@19SgS^rI8np7kfE9e)y`Mbj7=zgN+8JRUe5i^`P*+H zr4*AFGCN=umL~ArqMbV>-^3WexdS^CA!DxQv*h!c@HU8hA^JE=`q&`qhDroMeN^qo zOv3q%(1g9A)3TxqMOwa0^bZ2@yF4^BNrEOX7!@E|aImdU+gEZxdTQg*3XFI|#_Ao8 zlndAm6~XfDOn<;?m=G;v^(-PrZ=hz_vw-AbR#4yy&DgrrvXb0{w>l3{SjA>S{@^wr zvgcNW&YU|zb;G#p4#t?6&!6SB@n>7;Wyo4m;XDi?O$e?V1i!+sQy3DEb$0)nMMdW5 z-ZGrC{-72)McDt)$p_NpN{^dyTnxVz9h<(WxLOKA=ntaT1|UZ4QIQZ7v^*nl0tzeS z8Z%Ck%cdM-u9BrDzM10CFJDe>^0)JrtGmTd2B5$!R7@D3Fvh10k8R6Em%%*Yf8j?c zH3#R^BV_S~m0y@=9xe9^XwUouXkNe^as7`eC7pslo}Rp zm!9&kg{M&yUKR_0@f&YBj=#C%c^c5Jyd_t{nRf_}7QSO_`%xysr%OlJSL6e|eV~Sd zltvKrk5IuOG$7J)L^#1i)<;&yX=L5PRyG#jzIms5*2FgAHff6M?R7|b{KfY73&rW; zo6Pv_3je6_P4lhrMN3xXMDtf1HP5)BBU(zs%jx+U(u36gkdgD4reB5(L_BcyId}CQ zQZBg|hSWcssKlAyH^_u#_b^4)PBmvLrC!JCna3%0Cu=Tq{PI zg|ThBWiDMZR;uAn>@FDb9mQek@9;hfzviTj=^y%)h9k8<+2>MFoQ}bX=OVRL_tGcL zI0^Ul&L_uJF*&8%#W-z&ubh{JI86B$s}767 zX0~YOip>ST%+{2G-l@ZVQQ|gD@wM!DZ+MS8=wi`vPSvO4twkN@zQ<+bM;#)oC7&1q zU#O-biqy7?a*qs(b1{U0;KZg2!N}SiK+i`2Eo4*Bd(b-YuWf<0kVm;mcCS;H>;ogB zJ&M$~BvidCiq5!uopN~t>U{tIuf1#jU$v*{^RLjyr~_Xqx4@Z^Mtms#pzPv!&Q1X{ zE+%=k2Uzuoy3)ONg7BF=4M>9FLUX5>5r_R!jh-G1_s` z2OJ>EoYnOwetE5q<|5W7cGC?rjJ3BebS|Su7dr^8xMt245%WG=wTYXaTFxnu^WbJbPM1fj+)ix@W z$6xU%rhH^MWTnjc+Q?4hYv3=<&(#-Ga~522EOVuX57bH!WQp_ao0tmDf_*XzdRFXV zMT>bxJsI`*a@zP@-l`P2EJitWI;DPc49#iyO6R%qNvTLKPrl@z)BVx=&vm|`bgU`@ zUH%c^NH087q`(~_0V=NXnL5~|CE72^KaRk?QvQh*3}vo^7jw z6Qk|TR|TrOZ@FC5-m{l<7^}`l0=Mu6Kf1%ne1w*^qOTgOaPD+S-lM1#SQaAm54X?m zPzkTmk_(mLPRt23KtmxvvKv;S^gM6k#lD+=EHa>Z;+ZtIzQP46<(Ft+f5fA&%E#vO zLYs8h(O0Pg@lR4h0I;9Xpa&kJJXKu*9JbaIL+qq9fui+dkE5wWH)kj$#&bOFM-lOMGcF6(50-iT!Vl98=AGY zDtDvK2%3eU2?^^@9i2n&gM;s*Lc00fYUcb*RRd$z*#J5oB64Y!sT?{#9NV8e!Y-C> z?A6_X>E*QX{gAPL{rAfRE8-Y?wIA2JP|hto_P1;bp_L6e?+4){`Xesa zq(9q!o*vIQ zP;iSBEW%?fP;nCby9d)!AKnvoL-3egF1_Wn;xjYZ&iQMHwn%{-mKQLQPCypTc2e+} zvEDw%U_i0HY!l(AtFtP%YlInMiYIwIVVm!;jwyP{h3BF7d3c)x`aIM8@U;Yp&j@D^ z0|qgBig-^~Y>C6%_ELDq2-?l;yXR~15y!1rGd#sMKR* zQ2nZLkJw{+UukdQ_0og#*NF7+qN#vNHGFtq;ko$$b6FB@+z0x0ZjY0n1;)c;$R03lyoPA40ZR1NJaqNIzL|uER{E!n9U`E*|>>VkN#x73bcY6^UUgF?s zYpD8A$hhPXI%m%7K#cGQMo=#<E*P0i181eJ)-9YO{E zo9|NdAs)1v!DZ_r_OSAe;(W6Dbtn=*sje?*9SjhaLYnwJp9JZIQrDliybg~xbRVu| zWk;Qb+YIk1u5SfBA2Jat%u@zF7lx$pXCXHaVC`7}02FkS!Lm)SPn|shk8_dID)b_)ePQu}xHrA_ z=8@$u#}4?KFUz3s;tlOeb|$3358w!k)T=9c7jWMmw*C#{9@|M{m2X+3r~^Clg)fEU za)^H9+`0-^PRDH@8Aw&Ege9z;?IJnjqs+HmuIeKXK!c=t-H2(ULGpz@3_Z z9kwrLe!k?ifww5O4TuDriZkx>DXv1qI!E}q>S`hfIbOIW|C?9fy|Z%0NyY` zgYvan?l94jIt5*m*dlbh&t^XyZVH2Z6QAy{?Cn>&A!t~1Mqf>C68s_c2kki^5loua z5%pV7D!Y17g|OSqXk_8$Xk6 zA&hP5iaKlj1)KV}InPH0SK#>yTY8j!tB!lc!vEE!$kPE;%VlJMB4@|*0i?^`7l;lz1OSI#%6`KRLf)JHVLYI?XPWIT$NkC zSc|Gm_+{(s$*I6RIQ}yU?R{?kA?4BWc}WpI!ZK%bv#iz< zhwfunmaR~rxlutS>R}w2dGoBvtVVX1e z@ji#EkP@%E&)63QTKA~`6~R|K7?qlWJx&KjIVDC1VmFp}l}UB_9+X~xt`+RjJ&t_F zG{4Gol{~kqZ=>sZ_RI5n{r*Xw!}5Hce*Xy1bL9CE{r*0lZ;)r<$WdQwojs302*kk* zfYNXpa;oTnaX%IR4`ottBp@vPzJg!g&5tF$(e1Lk)b+z184A9)vbw!yMXlZ7Q}O0w z+p=UdGBka)gVZbV7;W2F^n^Gt)bqm>ZyCBjQus#8>jv;mTdzhp=22*E(R&b|IW}Z{ z8i?)4(!|IREXz3X@8*{ca|?^GC-7vJ^Gh|J=u4@KvaO%jQjler3-2B?-zlP(OwS*d zCx7Dz@k#n2MJFfk74mNYA8UAYT~p2w?ufXv_=Y_ug4fZux0(x*r>O5lg3Q#JMX9^N z(W+f@SIXT(+U50-`fIH|H#P-8NBtF?wmsYdu%^Iw(F<5>3p%#mKUAMj^&Cfq0c8Xt;=C$VPk zeS#bK{(xAe!0U0^7;UI}uBUldCWr^2f4|b7NW88GcPe^(Oa4lzEqtq3AqO;=>eGUU zy!4V0-UNqPhLf z=%+|L+LDS5ViE9DCcO*?17OPsL<8bv=}3#wCi{z54?U1ehIqsXTlX(y(7atn{@;sL za=G)5&qXE>ERA4eBkuvMJ5*P+<)iv`mx`aOO3BW;wM(p!2 z=Mat3O8jGh34CdN350{a&eQiQQhiKHhhXAt&*C>-bpeSQr1w3}bq63}$og>~Q~E0Q z#Xdw=qckBdo*5M1>>|ZPUUMxI?%agCcfmurotagzG@Ro(Qo#4QfiK+nFYFue6`IZs zd(9KY;Z8BC#u`q!S-bvrPGxd2mu}b#@H-|CK$h?$*==GH0r0sY07RCv*$jmn$Jm#F zGcJNLc-Z zpE(m}CpEt?=Po#*<^=PEn!8kg&C`S}FaYm0zgqB7_p~x5!=o@sYJOt}bId6SBMxRq zdsb$-CD8Zjoton{AIST}RDB=CL)uHm~ArbnnP%_z`Y8m$(ldOy&D=Xx+hi_-{M(;r=b$%P6dP32JFu zWegtlkd$Maj2A7EFZDRh)Zw;}+MlXFm2c_p z&yIdr`4*Z1_X(t=is|QP6_H;BK4t8cewiE=O%_JQAh^SBG-JaOX=8mt1Ixa zgKpCU>r23fC)DR#oo}m>CVnu^{hiKY4?5FTt^n8|z01`6K&Z-)di@b1Q~ivIh{P4c zBoe>39ugs9b!fN?+V%M&d2WU$TNuHa{YQakm@Nq=AX1p-RDB^lXoad@UXmBEo(oye zvwLd!Al5e`x-$^_yx%;puJNs)ed+w^@tj{q;;nbdAjMEtF3NyVLr}$4&fU7;9f*Ua*7ln1uCfPPiNhOpX#f66=^>ZFx!UtX;^(PeFb@;a3l8N+rX?-;u9W8 zAB$p&9G^g>)?Vj3-xsdY2G;<2w|SMZdd3_mB0m&SUE`-rVYbtBCpSg1Bi8r)m&U*U z8Qby}AMeB7SDfz*yz}ucD(@7jTFZ-;>5ULz->a(ZK#I^vwO@DMs{O}qR%Fx!W$`v1 z&kRa`pi}vq#aU3ed}Hi(A9h?qeQMjZ@DiCWKXB1p>}eNm)96Q}OT4qSwLqSGZW*gD z&B7;2dk!VUu~v5VKJ(PryICi3QTN8SAcocZ$t}0i>lTW>g^LN%w+uXUET7T^*UP;a zbFhzRSpQ_yRY0@&iH{eRqJV_Q`*t+pJA%tX{|qjxdmc|vSx;}8e9RNsb(^h?`#(U_ zy>DzVJ`SVqgW;v?dVr@u=a;C?G^`XyFoE(7SjmKp$CJVGM8JB%uG@^KI_K$Jb!JNJ z;Yr3SYPN3ta~<8W-nKaJtbe2319d=rQ1~jxj)j{8b{ z2{IFT2wiGQjMfL~oycf$0GS1rI|4cF;yF7K$0wC~1w{Yj9Kd`MGWOg+ zOI>3QmGDtOvIu@f3q)=d-o%wmwc6@hq$ZG{_P5Lzmx|ZY?vNKM_5LTN&-U3|09<{* z*zMd#TOU%{h*$_p^lj!HYE8LUlp*5bMzE04Dgp-4?Qyo^rB(49$v_1K0NoKS(D61! z?O9!oC>38<$&z$?_RPHcaO3lK zzTLLzw(oEd77#kz{I76zUla{tqIrOG9-_1J#orK)r|O;Kfd~em@B(`2=V&}4^G_i8 z9VSMzA1l@rSZt588^i;}H((E{>CKe5S?t+2nLkM;g4JBKl%^Q^A5HTS=c%?HdsieL z>(ob#Jla*+Q5#!QA_0|>PpkP=`%~hviXEYbJ5i=DVY637&*OG9AFihP?XdkVznIkL zCok9il{W%HwbkGq(N8=u9x^E-?>9=v)81^Nn+#Xue07ycDeNJ zRdsgs1{s$7ojfMrl>5tJ?(36;iCtx%2Q}W?bgl$b+mZ5@n!2%vCeHONIYVxDa#gg= zVxRM4beC|8^v>WZOtr74R9#Mn-p2)h)mdGE28=OeTW+r0G{gFrknB*W92qUqav4;1 z$Qln*Rv}kh@}V@C;Ts*1h@xi*KlVQG&cViA3KhM@>>sshJI!Zmt?p!j+n+j^_u_r* zQMTi>g6b_%>=c?yl&@+WVZF~+BH6?V*6UK>$iVOo`X1!cOE3*??9=i9hmMw1FQ`Fm z)hvD>G9cjrcjEAVw4eXC%63b+^mST(N8h^P(9mDkI|RS5PSJ(Seo*fBg7b;s z8eJjohq1iMtX#v13hXwmqOzkQesOO91PT`$ND}_~p9BHdFS$`VUc!>r|>f+J)fBCO3;`oPHMM0ck@su7AJ14HFt_mN56S~9l{%S&{{#FC4%va0Slw` zRhfLQ8ImnI<_dXNLRLu4Cx(h;ALCsYdTwW8lC~|XQ?t3 zl5SyXY156<Y(2eG$ zNGT;8Y`9ENj$=&4yb-Gx@U{yNJtz?%oPN&)FyBrV4A?0CX?{X9z5VA+o z#WEla4M{^v%y(uzEX>LA%|8`I9avcI>5$kKQ||UP``Yb~!uL8X4QB+x@kLaonB}r+ zV;FB5ZbgAQ4YxDhVty$m>n3l)@^FFsrd}S-a^K96hxzWq4f4>)1Hbawe3ou@VjpJe zuKwyE{UPCSa?LYObn4Y24b}w8XH4pzGr)I}1xmwg2eUdU>hqnrx;D*0>R z+c|~tQZD&pjRz^kmfz(>s8_O6=icGq$^356#w`M1gg^tsCt!*77L73F-5l<%^hQ

B1`wn-9>UXwb0|Q>T@VVBeO#Ex$M6Uh}#UNLF#dEBs@t^~cg z^d@8)E{24*eVAH7gv{es=MnZIX&7Hyon<;-;nT%BEj>j+tit&|O3lJXcZ{qFn zut;z!rQCTMjLFn_r}TNCT7d$OB1Ek_X? zvlF*{lyU!}UrGd9=Q!^oY=C5d9#Eklu0j**#l&VZ53_%^3C{(hIg`;sUyxskrOIq+ zot?JdnUqu_fP9&jN|iRD;1ub4voxpg#@CY+F3S+E32cJdiE_`T%1vwJ@J!6PTE6&% z5Kkh>)};q*#Ps=Exe3eOumZz9&NtKtZ;HcvYrFEnxhG+O){5ZMpD46Z;vFvwiGFG3(G9jcxDdz@8~^P^aow!Zx%3cq7|imp4ywM9<~0 z-KR6U|ISqu!7+F0x%%>PQOj68wSog~;n`U8bU=A@Zi5#e0JBs$o5iBV`VSWdxekm$ z&JnTRBjRA{d$`-Estv|}5>E+NoURh82=xSxB>te)u--i19s^pbM_lDP0S!?2jL5$k6mH1y5hg;Dx_&D?e8)t_IZxz z=penVQeFyJt*r{bYk4nz3sla9x{QCIOpQVXB13k|)LK*h&S^RqzsXYv-Z*lZMBkO; zyu+Mq7o?na#l=tV%bJBMytn5g@x=uTU3^FTWdn7`y5>7)P)l9)p(w)2K}5y?JjwhL z-%-0UQFh70g7yyxj(u$jMrT|BB6da7ZGqTsoCP;lp~1JCDM0OdXI^djhC1)gJo(DtG<>@IWefX%8(W?I?}&~C zltRiL4>hksdjTeSuLY|2FZn@T<9V_8 zb0RhH4AAd#I&~U^wafW?ugYh0?Q&{0%8=xLZqpj$PoP5LB#k4}U4SU=q)6Sd2E{eH>_q=|TZcH(-9x%*3=2g&ahCK{rB z@|~c4nrPko5rl#KIVr$^b@A)+xEbJh&3S{SB*jqoIM1UgnNmVHga|qv<}|N)9j#GB zNZ{FsY7<*|J0Qp=E$QUI+6s{$(NcW;gf{CDwc#)m5!UB>ucCMsJ@lXj(Mz7 zTxhX>lj0T^EWKGOxIroaxfy{NzURHMZHE*S`(^;t@50Iu_|*JRk=@JYa6Vr{b#|x> zWex76a)!BdoA?D-T*65weh+@f_}r6B`#lK6=8i*KY>zYXK1GW-=d7j2AVKnIH!yp4 z;)g$GzY@8kOP#+%t`XU=#8O_xik+!cuWrI%p(!PDV_=F|@P$>I5@+yk0KOz&-6&kS zirVj2Xk!C8HQ`b!Qx2= zx{~TCWzCxd+KyQ)tE`&RWUKoOYou71Ns6~)++)ItkWLFSyhhLs8)(e4ayu#`$hOo; zpKisKK&9YGndh(_ETA79=4ImdA!3&SR&6UO7|3q>2S12J*)z3vTLH7cV)&6Ht>`a$ z^Ye0#@p!16mF9JSQ8~}qvbP#mxF32$Pim{Kb%X(2RMz|x`a-jgA>CTYxQhnyJpjfli{N0WL|LhWi+ zjC-qOmAchH={6`xP0|O?FiD}*qRWaV?&Y$?aRpZ~v^k|zsV7Ld-Z<xx(+Hd#VT9^bPE* zH%#t6z?OgaX3qf%S7v&{bpmtnjef z+=OUJ{!~A^_zp~mx}BC3yEKkj6SRe2-ZVi`%D6JBe2Xiz7dkn2pngvJv5;blxgn~T zwZqqo`I=l}LET@Kqo&&9KA)k~$d!QmPZWM?kF2}M$qDxbLXeOe_N+3eLFUm4ZA@p+ zuW|x94@BV>oga42QWK0)bt?^nQZZ%%@VuHNro>Ic{ur}#4ll|0G;_Uh^ zKA)zH2B+!*$#(#*LH%**w}JgCYRB>Kq2K=n0Sh4rUcHI>6@{wg3+QrGV52%tu-Jb{ zjL*Tezf2k*x>FMm^5pUg zPMTbMFK>__`z?3E@>1;&&H%wqHuR7Ne47W`qt2C$9xJAX$JKpfFjK#g5pIvyl6gja(uVM<;Ioh&R? z==8bUG>eGY*KR0)2=)^mBksrXB5iS%Ra~HLElW(e3;u^YW$p_sG^tj zuE#609OE!+jkaNOo{PXh{Jw#Irxzq~UeY4V6}B&{Qm@{VS5+4mM0eYh%lO>f$*0k6 z#_GxAjMdY}1&!6074qj>$KdZ&5>t+uN3f$iKBekgpPm;W+Eu>bg~gA}3spb2c!jZ= zSX18EfqwIc#_En>+|Na@GZG)YK{Z;wv957%Bwn+jPw)YAA0Rl2(FzR9xmQuUe@kuW zwrr_SI7HbOS4_9f6VXu&S69ku8wAV{*tTAzHm~CgS5NRpch_Q{TUY&gbTcYOGYaYW zF%VUV!jDlm$<%m}N&z}fA;t$_d^t}=BLIX`r}&vh>syQnA#at(oQQy`DoL0k+7m7$2BN3xcK24%Ua=O104*4r9R98ATc9iYc5ij!6oQzxk%Hoefn| zA$%crvX5UMzXkjj@JqDaP_gWAehK7WhRg=5geiP%g~oy0Q2#DebLi}wBT>*Z_-1~&QT-|}JiM2Fu0RV#W0IR-{RewRRdZ%9X7Y48T zZG1?WgVd_)eWKQV`q!-cG`>J3?CaMZd6%sFSm~06b3uQJBY>ARbLfjK&AK2Xvo^4j zsSR(mipP}Nc*qZ%B?NAhA21t#6>4K1)ZLM#sYsjv$O!)-VoRuVF644N*I92zMxNZ( zKOWUcduS6;Jt6>vOlW1tCGq^15J2N(y5Bslwz|)} z49PUnc8t%|<_tTiRc;eI79f4>wLACi7l#W$pLiSLtj{*~Ha5 zrMZFUFLtD#E9L#&$p13mzdfY<;`au>zj{ddKkpv={_c+sOWzKh-@_n7xY@#eJ{{s& zIM4B!!`R8qJ`nA9vcmC;(M4W|pa1ur0;Vc<=3v*W4Gg%dSQMa?nwLxFDK#%{>jYav z>8~K%NZ7TR$M$!=i|%1gLFLC!56{V38qe`pcBb_Jz0VUuv3#A?Lm1KWp7KuW^_)Px z+(cK6_O%O{iJH2o=+2JB&zj4tNPNv;LEG4gdzu@IISl$1QG#xwGU-WP-)jC@Iv zoN2)pieV+k(0`ckOk|eOy6BQk2&3#8v^vxDfw79{I}^^2y`LA&Z8>ml^k|4bt}sAt zm)BSo?r+@`eVhA4$K>9eVL4iLt+sK4@>L+hz^$0EKEMPUeI5g zLZ)g9zs(raTiu7LBKGuWIz2aD==n-i- z);Gy$y#?ipSl@+4>-HQ;)DZ9vE!*zA%TgaF*UP+U=hUjUXb@h`oPmzL~GH(5ImD-Fe?i%~oO_B{V#B=Uti3ttYoT@A&ky zUp-%yey)&u_59v{lus`)!^Z#C06oup4L{vpc@^CwqY?dv#6Cbs{P|8}RATwq`Ya49 zWxJzS7qk-u5`ewNe==x8iabgYPNNT)OoPj^(KeHTP$an}V|)P9uPN7^r{Ip1Cvm5= zrRrn+ryFetImf&6?&KAE_u$~7*WmnxZi~H1Mb_HrnGZeCv6w#Tks+3F>9^ zgO&rQ8?BeohZL9xj8&eR({WGLfn|@Z&dg!n-{u^k*NK260Df+yn4P> zRVHp9RKD`9?z~HR$Gl9!-i7`pu9O0)`RvX+CjF(K7u|Uc>E{adJUjhdqMlRZkoEe2 zcWOzAiK1F(s=r&nnKC9-e}L&6yv7pOD%`jitbKOu{i)Iaz-%(^{jnO&1xA}NE?X8G zUXrMYsI~8q`J?}fjn)gnVcmI`^FojHp3hV3-kmomox70SRQswN>mxHSJzlIUMO}(% zoE>!(GE5wqQO~jIdMe0eK)*12p2QzWyLGitAPo?Sk*YE1pAIvbI0T2##oKIyOQa?R zpYNyhSN<&Vh<-?~x5Que)hq<-OI7SApu%UgPS;O(6dQFcJ$ObqZoN5P-aJ4Bsqs-h zM**GMe?H*lcBwvn|LxBEX1W)1c+;JCP5QZBJxrJeZt`5 zx6mq@yN$3BIzfIHc+Kr#ehSb_2=Wxlus%ub;;}pLigXX&;JFu___p8CH9;wAA_mTL z^Z~R?^HW!*QQWe2x;nnwzMv9Zf=C#u_X%r$$k*&sEJLMU*x$A(Xw)9SP$3t055$}@4I5E0m!xDw5_J-)FXsO#X$#U#Op@H`jh&0 zpjHg5QWY~sr6UzvR7GQ`7Vx6sE8eejikC1-4Q?`9AUe+&UpM#o%c(c zqWXb8d5!y2r<4oJbba<(=>QZHZm66iW^o6u>wsoT?BcKr+qwCkGhlUem|6WjI5Z6y zkF$9F&S|ju6kj*@)Bf_*dnHA{78Az#p8ld4+si%Hy3T`R1N#qQ@{%y1vw%C{heCta zFFllC1HzC;8qlx}rzr4jLfiuC`h<^2eh>1B0wz+ppyo+S4}Cy!^M^|hCHd77n^sXh zO7VeoSzM#?ncT>O_FW>2g3X{F#c3*UN_b-zs2|Az$&e{`QQOxJo#TnFbp8o^s!BCJ zsoVtLGCADvPZvz#U8=)<>fS_JVQ7JDW{2?TJ`~+j8Mj%P%tY6_r*7I~cL>urPYkR_Ng{KxQpjL2_ksuGoCZ z9jo%ut z>8zIr@ezb!o~#2_DMIYpOCF9Gm#o7KI8yEaDiY(fMXJTXf|I_}Vg7H{^WP!!Uw(+` zuZ!OR&z$v8o7cNPTur^!l824fd-!t6Vj5MQarVgB={6dkB-4kZqNPv=OmW-o{3N!5 zeq~h5BC(rf7KK2gf|U_3FwHCyYwiJDP$d3NN!MSsOj!cV&+}&KD-Mh1@}%J=HQ-xl zJ9!8EB)2aTpCmmSm-CPig*wrE+~X{eca1#>aVIIy*UR$*i6{l6Q<61PXWd5$M)YtO zodgPNxgztpLegPzG=}Pl${q%;smi$W)ADAaQ=HM5o)EV_@ubujk8V_%!^l*Fijgbm zECc_rGg86=JY&!okrasU9(*w^5edfpfbI9=jIk_YUm%W{h^E8;Nb8^T_GMSsT0Nrj zDdW6x1^+*6E%_Ay(e6BlZ!TFIJNheJ`aDctN9CqE^bP8)cU8zBDJ&?N|2I1K>(VP_ zsf|{-0tllbT;0%N&c$WIMuxId;Llmi9Rc=rnLVQd38J+ju>ZAS_Khp>u2kFjrAW%W z-HxwThC7A0FtGZWL3@fHoePEA5StuUxS>EoH9&-&{z3i;(jDP8#(YXAuBS}mR#q>q zAHPk6KVU`?{4lV+%o{4%-_Xjdwbh^9j9=?v0!v>fx1nwXHhY}AF_sKJQ0v_w4j%9| z7qQNaj;!_O;V53gUu}6_@|hv)=jxNDNxImF3(*F#8d{Ck5g;9VY7J!XvVCl0d}}Cq z#4%(~47D0}k0SHTP;1b>$!E2FpApqHb{MP1;?n4WI&U9?U5WG@gW1O2;DZO$0J=jD zyT2>sx6Vr>fY364WhH}ecef154oBp{)Ff-)F4cVGyeK)bB`ZDV6)L!qSx;cc2PAgi zaUF1jBOKIcHax7Xv5m)j!m)$kP2o=)cjvoE2(6Dq?m)HTBkCh(L8{v5ADG_`Jh(eE zFVXRPYsBSPu>2DdoB66ktxZ0=p*3L5#2O0A$BZ51;w9dOtPOS6{vf`N0e3i__shH_ zSQnw!Sd$JQVg=*EjCx52{+zA0g%l7?2L;doHvt6D3+G-yrrB|OqI`$A_TXK~6;XdtCJ7O=4uOS~h~XuU*GGXv2H1I-pQ6xg@~GV<_y$CH&`<&795ux zJ%HZ?T}GzEmYAug8GC+z zOaE|1mXRni%lJFWJej{E%+dVKC-gi&BaQpkNuW<9h;L!2nj{x{eAuRtJ~(uE#l&*& z6-c=QXZbv_555huGS=i2AOUF_3HQOZ0#}rV&?kb-4Ju;mrbYbZQ=fQm<+MKwQ*6k= zKS^!Qx5Ez@YYMXzjw|np9rQL8%$6z=i`{W(f{O9*u}i=Dl6mMia5)vNo<}Grbau-` zPt-`B1hQ$BVbBl#Ui26=9Zm^)#O@I<2m|&INE0&alldE{Z_HQf6aUZY_ikm1ZgATx z9Qb~v7uVN#qi)IU&m->l#Nnhr_x&IHvp%yu6ugIyZ)WEE!}JHs?1BC!|MQja3kUV* z|2#iC*ri`LpM&h9tj`euIe%Bh&6C8;eSvv=%|i2-n%nS47hmLc61plpA_E_T+`K3} zu_#L_FjXOmGL(Ef^ZW-kW6kpwSTKuXRoOJ3`CM1t6GfZwPMPy?^; z9=uSb=FiSM6ObL)Z~s^IDc|$|dwmVD{$_o0W0!g}Rz>|6d77^aSO=gwdIO#Bj(GZh zIoIMv=Zxo8xpY%McMxJ%r|(1Y`ChBD`t|0bc+S}`_eB~zrcKPhc6~EY9{c-b{c;OM&8=ZT`dJn#Q5OG{AYl41H&;D@SfOUec(=epIzA zFwDQKQav21@Gm3wkK`XJBgvgak|iY3kC!ANhkuAS4@nk~%+*OB$vkc>=Ed-xd?`N~ zoDeI00jqOaAUn{RC=MoBVZrz%$a^|5ck1$bI|9|6i`R8$ zu}B^n4<_tA^cxU&Aer{6BSfk26=R}N!rkOFw9RtR$Rns9V|@{Z$$q@cP8T8Fx3eMm zj8%cG&TT$o%u6`=Gx1YU2%;+u;lx+yjX->6DQC-+V(aD31HNVT*~`LN-BSvs`N|Hy z;Mj3kKGFYHT7g>KegIxl_q+Wm`w`ckS;s}J588OA-PBa0*kNM#cZq%7`C`dzj#h@j zT*^&6W8=i5zekh+UI>Xg&qX4$!~V8d;-bIcv`eN-4i1)P&RZ_=EE?JYB2MC+3y8xw zzEgq!f}?QVQu#{NF!j#(`8s2YT>Y1~G!JL<#-~+LJc^6oD+oU%ewK1zs8k4kW)l0o z;$S*=>GzRQz+garcb=j_&=f5HWU^5Zxx>fCkkrgOe8#sn8Q*$kpK&$5m$G7=S=HV9 zj4L~v#&TthGusWE9 z*!mLrYsnun^CdGMr@Q>cBZ%bl#32{!@P)h`LG1LNQi~bm zK8q&?-{M;KLSfLR(_Fyh^;+1$ z(oH?IwlaY-^!n2bS;ABE*glfo;!?)U{1Ez25i==|F`uOaMK4Uvm&oRrEQqxD9O^e# zP0nIDZzhO4w2KqZ{BK0(z>f2o<2usU$*cZOmHTW}JHurT957 zHSeWA@DwdbYZ)`g;aVDrw@KSh8%zalIpQ2-j)&AVFqNLLbX@T1>StZcx{0 zKfQ#(Zswvz6P37(sLRT+9P;kaXZPXnr}pJJghk0A&~0e=uE73oPYx&Y$-$Gh2mZlb z&eQUKj@dzFTw1E9`P}-FkIf_g)heXKM+B-inl*uzzH5zEVaKD%pudaSVsH|)grg*6 z!XyS8>m$J5L+eH5HGzvGeUISVUzwBn`ylqN;*bJugmc7!3Y>EMM|C*wT_6+9rJWX` zwU4DXX-~SMY8tC*@&qg09>=y9X#d@ziXAc@zp$EQZsoy;5aLO6nt%Yv`&%$GS|Xiv ze$6ukaoa08AFm5b(B9tX-09{&t@BIBFOmFzPSM-+f5?}1mhSSDNIQ6*7PYww8WF9z z3Zt!s98~(eOTZF2dmh-Dr48z-D-q?!&!pNH@jw< z`AufCrp`QGL&!ExFR@(W1dFOjPrz~JEG<;uMqdFFggiC11bURuBWfv5dQ}|D_*HrO zEi4CFV@T28QiV*W3kfq+u6&cUhQPP0PZNosdkCRMpaJ(?uIBiFfm~7YHgz7z+M_jI zj5W@2=4G-|Wmm4Ml68r0pB~S@jvG-o)r33WMHE@+6NhT%&Ej&S5g&io)me+X$V&$V z9jZSquiEq30U1|$YK%&a@ljnn%89C__`P_NP{*QG&t!KLhjBreOg=h2UU*%^uIWks z6pVRa(~k|6uLRmJp#G;siXw{_m#e6@x>Q?QG;QN`nE#?}3%3l9?qR%s zm8_9%i8~()>jrI>#c#nxGWi9*`OPVnGCI1E^PX4jJadc=!FgCLz&Zz7nsYBOT0?AN z39?lizc!bs7MFiKOfZ?$YKPVbxWN=TMNo`njzK=V@!I0brhaM78HpCb3W zRAzJ^nuw#N66L)MJrD8!AL~2QyfW5zdo-xvMwd5M^-xbC`WTh3z-hjJ9f1UtpD3fP z2EYl~ONcYbQFMRk%uq#dLQWdJ4#Lu=c&zVR=99_i=PlQkR!r)va+hHud(snr1Rcqo z%Axb98yqs5&M#qffWeUTv+aoH@N|t-6MHTXgPrWqtI*BeOvLEK`E-f>TN`iAqt(qQ z7$9oscuE#XEuC|jstAty_o#?z_l;+=eP;PSQoaj;NbNTL-@9-U5Dkes)<8X;;_70i+7M)9_{GKYma?fYh zA;Z@3@fKE#B+mNO3gl4Lb5LvRqg(bF*K|^#ZZlb(iBCZSjBfznz?4k!Ct+2>sJRX) z(y1csgXghDnB;ghgX2YnmpReA$i(Y!Fu#Ly`g$CRJuUDG*QEy;hYE`jEkRf_d>?`+ zY!lU6XU2p>_+M?GOG)+_ddwMt3XHZB0i>_8J{A64R9{PQXCH3!oNK}FpoQn8SqS?H z@*>}<)wzF>T*)aQkbyHnXFfoDqB*j$4cl&)PI?I_F=I}$B~`c(>S(i*r%EGiXIWBj zpioeY`|u%sLa2LN!$us<4A)T~IoFUR&}}s&<4##osEF8svBsTaNiRLfWzl2Yb+n`p z=rk<7ey(tBuN!S&u(0uO_P0H6w0%rc*jlmYq3O3e7vHVu7wf00zjQwl;4|mBN~j&Z zUZ4^JM&e{;_FhGc;<9YJGQdX*{6*uEe+A0lhI!p%`To*p4&;^Js(VM`mTAJCySI8kz%TfZ! z+&{c0xV3OC?lF5-rufpj?#GTv*ZmlvvCVk_QyWPr+~C|hUY?@cWE!5U)^D6MI17?3 z&U0vk$@mq0$qaBTW_rk~2-{-?wPK-jwmsbkH+l>0>V=3Y$}6m4jz+E zV-lNFD!+2;8@Tf6^KT+O+2V{lkJdM2;CoPfia#ba&ZWeQ#vBBd`9(fwtUxgb4lNXoYXmHz{Q--*1-M7vaHg3`B?oA=y=%y`&g?hUHqlBj))S z0OPk^dI0I6j`7)v`&kx!pVah{%Pc^?;@bP!x!+n>?!nx~4TW?5+Usb&zXzIW9D4Ms zFLD7F_Pf%*9}EKN`Cl8RsME_XW>27a?=d$;tU0VOD?XzD58?J@Io9i)AC2|yi~rCU z>m2^_!RptIx|ebJ#U2D$y)$MBWa;WLCjW~4z9?R&{ZY_i%Vvn7bAItZqGU8T;R^Nu>!m>T%S@RRY(&> z&fHU(AUB9BzcOiTDzLPAJ59e8C=?s8S@O&2H?#Dr0CMa)>!a#*P4nvFHz9xTpB}&Z zMzKs_Q11!F>HNFO-8tP;gv62tjW*1k*af$ga9N5P30cGx{}*-@mmDlfMQr$M^(|(B zoEke5A&QBwOTWjwRNGK74^>hp?TV~Jbvw`%ES-gZU9eR3R}wxc<9w6KWacX5NnyVM z4`xywySY~)x?Dr+PN}pEGD_(QW1mBxc;}4JZ=$;s3+YeVUUVn~8>_Au%~4y1f8Szm z!{%u~Yk$#_H_PGpFRT=E5`b$6+JgS;nl@TQCmGnxUB4;iVsNyKB_Ph@>~3GorS-%ZMjrxe!ceFSsEy5T&sgvB=#@BFG(O>kR z*SY5)UFtR`qR+JWcyod{KYqZwWOJ=|JwmGFvnl>AT2M~==`t(036AyUn7?Iq+}5&} zY{uGi$wu>xw*GnTBfJYw=DO@|v&!Cb7{MxJp`7iZGY<8)i|`gWEX%msEO!Sgqjc)e zWXtkC&A-u3YFp?#-(e(mq+9t~S+zt9f7mtcPO<7ARkYJLb;Tci{t4lcT7L;_U{87- zKmi7vo6Zu|9Qa~k>%>>c3wP(f#E<-oSf{p=w2Ln0Z_`MH9BYXo_G_Sc($C1Va@X_M z`6Vl&AUkvUGun^!j{@bJ-)K59)_;O9Z7w8O^tMB$zboTuPf(Y{)Rsb$e<^v^!!=3W*pStBG~f6?yO^u7x&YeXWO zGH-<*@h`h&G#W^+vAYKKIwU7-Ge`gt67K69Of!GFkj9uZ6F*LiLq+NXmIY- z!YX(dr!gq;e_`A!a`T!j|5C+U&QVq0usm;!P=V^R6@IB@DmXo1C?9gcBkhBXg z_5t$O2;uHZ9yn6IICvsE+ z7mU+96}BY4hN7n^yeojml!cbfD@duP2p=`$-Re{4T@D|#WTK;&HjeA>Un@-) zJ2hlxZq%jI$9X({Pjb84A61`3Aw#=1Xy@)+%^F%!?hXxXM^U=1>q84R>W3py5bHk% zbyy(|fVd8FdidRVYrYc5xca8>njS(SlVG!rg~Tqz>5IlkYbz68kF(}?UNmwA52dtb zzX1G@fGPc0c&F{0p1HnN6?7I5fRPHG0u45YCwb+s zF{P7R2UY%zo*B!AOWEq4Fu@_ySwiv~I$1_?oK9AdEZ4~@lBcPp z-_HBn_CDgF4iO8V(X z?lmN(@d13Eny=C!?F*c|{kK$C{hsdJbv(%i>dyTKDfuTgrM@p5^1bSRQ70*Wr(B5R}+%Lf8p4q2gn2I{ttyyqsx<8heAow9MugO$2BUYMt7A?O71M3 zl+iWlq>Sz|os`jCs*^Ihh)&ArYIV|2a;i>-NlwwpdXj#foJDeyPR`LYA^XtPmfyiK zse2s1*vF2G9biAR7P%Ao0xpu83EAugdb7(Um8n;I7^~ju#V)=mBwsh+PuHJ+xET@1 zoc=@_Uc)*mxgnhtc%7`10!j?P^K{Zr@*JHEldRCmdXi`95{hq_L8z;Ou#xIFo^lotd(~yE@)}I>3)*<-= z?dow{p(c0GI3kjj`u=pqt8NhhI81-6qH8k?8+2;`Uk)1o8$;(G_pD{#vaZhD){#iluR_0wqVEh9lgww2I)zomV|v?jGI_B{r#z-M zPY3|)FB--JrYX;12*z7G_osg;hv&0H2>3_H5dPS&#zKMTen7$Q+_(8FCkpRdf2FIF zEZ%gvZ;V#)PtSL;+%=Nryubjs->u@o`6gA-gCEN$*cZzduqXXW-u#|Y(%3gtV{K$< zo0;6(NgDSoV-n?ci&O?1P}z9n@ejhuvzBTYNgX|}wbm26#-$T!$oaEsXdYjqqjk>n zvcaB$RAI|V^h!JT5ejhsI%+MrkvfJ`N7%|8LBX(n?sM`azFF?zrJef^9%FrtO$&nd zs3%E_me2Qs)=RN%ePQd|Lz{TJ$7|)@&#Ry{s+VV+TQqJ&Va`GwWg{MCG(Ch`LfE^p z`ryS@j%V?{Ks=x<7{kWnondbmmMS#HG9l8m&i!vHNmi!zQ+IBhXZ5-}_hg!pf8Dty z>D2LVijf~9NwZ+-q@zg41=hItZAx<+KOl3WKHQ&9ee9-KjgS6B`JyfS6^DcyjMn3T zEv7zbC7rAjzcTwlW~S&GN<-y-az7uzbSb*{XFOwgq{*^Jhiq9GQZH zpncY}f0X6IW8ZZYUn>CIUvwg$2kjI8hgVc~ET7`5-DsUGJ5<2Gnnd7P0T$&UHUpo; zi#D+iPl=UoC3oSoe#!po&V82pq-HVk7vM_oN4QXL;Y#9uz7Zi^ZQR`8agP0^Oy%bj zqwi9|!L{X{inr4Aj4nTSQ2AXCs`9?*yP%H|@U^LN3MHHuEr9mr3wKY*%0Gz_+YX3n^z!nks)s1^H{-yN|cl#;31G zf)0RJktb2afXe_$`PbPuwma9KdN`O>zK#uptwNEHJeX?ST*UB3eOHhHPks|Mgt@Vj=Ty6-3@ z44rD9`}XfaZN!s|P8Jc@2kcn}FmfZkyh-+Kckbuzgm&j9+?1eEEu}h>;^0xq5PfYI zpMFV|NC1%*M@9EBcieLH175Xt% zw8OlVqIXKQZqYkP_xFG>ez87{nY(iryC3Rp#3%p!HJ@~=%6R(wz>__xp0danpx<&s zZpE10a?f<@5S?~sB;#`)9es#ZD0K4^6BTx7kxFG?X?~_KGp)~sk$L}-YI2X$I$gqu z7Ovl>#IyPC`I5;)7^DxP>vOsJqQ9ebcUqe3IiJ3W&QV9oy)+!2xLOQ}Z=Od&Y>sc4 zZLGd4OajZeTPI3D!T&zU;)&2{gISJ0r29(MTQMlqZv)EGSvrGhavb51RM9@+1t$Zu_f~>zQGoX<6hItCDlRspBO5FJ= z60l_<3uIbcKD}y3PgvLrInGJ+3QENpC^AsrP-zDdtFVQt-n-!i z?gKbD+O7}ZP-vXvR~hH!;p)9c>n52+M5<2v7-?uxnV9-~|A0&kHXw9vkz}H@?EHQ> zmUdH0s0tZ1yigI;93||aaP=X;wsA(jQ_8kOmGX>3@22xAa6=iKzKoRM0=8LaIn&;K=6L>O6c3{c-~?xt#XHiyB!s;Wn$tfL#z^ zN?%Ql0$Y?sC3BrVPpTJ`$dW83j^DK6d9mw#qX+{rt)Q~Q)vuim{rP}GSFKD>8or0Z zW7{i0BQD^ZE~2Br#qXpIi4j%8w4hFhS)rB9nAu)OAmo6<{V#TelB5q3E-jZJ6744s zj8p9k057FJ-Jq6C0>BP0kr<8s0?l`yZS6xc3=Zm2k@V8zYY>%#w1nLmbu{d{URlg+ z@qm}cT7Oqqi+OY5Q;koB+wNPV7;;Kq?p5anL6UE=g`#7`acypGEQHnWpdo0wOaf;) z&5RMoXY^GuCvoR*aDSFipY(>?VZA7fHI3aDHqJn&WGmV@E)o?zo5ZVZP^Cwp@#@!& z?<`%PsQ8$u>gXz{4fTPaPy_n#Yf4zf!APnE<4flg`YN4fD?6tbtA3l~MdDZ zqGD*CBk!pceV`-Rj{%M>RDVKF*OcSX7CMp{P4C^bJWkESeksYgIuIHZkC<^BUr8O= z(HFw;MY3j2=!b$I&1bu&6nhaLW}Ht#@ut_WciM2jIo4i~pMAb!iaz0mqP}FW)61#Y z*739u9j1z}ZS`>YsQGGKlpk(9npw|YRN!1=aQn!fx3tmM|7_(e-YH^2?{muzz;{YN z!dQKUueZw|mAKQ}k1{KR_Eqfpw*>5Fu+?WEB*OGUsS-2AD3d!k(GQf8q#tNe5C>Ns zg3=G?9CifEdSCJhjXxV{9EpDy*7)I6I*8fAyrt89o-FmHoHuv_$3K@GDMLj#94i?r zzM6l*<|qrS^*sOJL;)%^co*IfXgPpF-fN-bdhxJvM1Wp$>@GWtgP~UWsJvB`Sk4k4;MUys?V^{N9@W=*X6XhXVhQ`x4>u zP#QfH9o}*f&zW(06>8mKUQM5rK0$g`qgUE9n7Ks-u@7*quprCg2?6GM0sPcF4xLkk z9V7I-CP%t-SJ#vg-gdb(hpNAPnja5VYzNFzZqBwo9&s_cFXB!uRJ~`(&Ut~QFM6`nthXT!B1Y-{E)NC>ADBm= zgD92Xzix7T<{4hPq`GF@`(1!0cCf_Vvs;Zi6wvju1YspuT^PS>V8fBxg_M9S^tInq`N|0wfDa|}LETs(!PNT6j20?f}sI;W=xd0J^{ zt54BtOE0$ARs=60iI@aL3wQxk_6IkJ9(Gd3ZRn;H!dkjZ{vLAs&+-!`yt03-H!9Y0P&1h zdr5cx#>xvS6pzjx&lyt;Msa=@k#+HHyR)*OyADdxJr(2Kaqg6L0n?Of)$<_ZgTB4Nh{S&( zjIHzW4x-CQENc0V2dud1)F>oKp&^tsgC48z=-_ z19wyeoNu1e1!mcu2SXxH7=N1HGBHj8uVaT#3#aRID`NlJbc)))5Pqx@84dlIl4=tF zuC`S|Kh*s*`o8o1m~BAX%~^Tf4x+{Cl;u48T+qxnvL?1J>jI~W?=8*7S!`;Jtx&Mk*Cv6Y`@3( zYkv27?8|RUNT8S2%C!pBoxk*S`=ani&S2s@YfTEkepUxso4Ao>U~sT%!*$W0^Rglr z==pW=zjF}DRIc;|*&*h7mp92*c!OPjv7MJCj&bm>Iv$C}N$?x|tz4U2tjHU5TjMuT zHCmIOveeXisT2-_d?%Dq_Pi%$HqzlaDr6Kl(h1~wV(ypkx2K_*-+kQi^01~BQ=RR^ zn{slPfl>C54<`#Uo2~e`;~(d|whxHGnoLF(KRIOHJzk&0edg_W=*=$R+W?tNueOVx zz?)(NHqfj~o^T|evgLWH3Ob8B3Pvmzj!sq`$#i}Ot?I&0YLFs&E6*%e3*8m?uph{B z4z@N5qPzP+Cq+sA{E%AVUHE?T@|_gnmJ`c&=kFf_nPt4yf!OTAta(+@*~M9r;nCS= zW<|&sakug`q05lB%XI&`^X%_KH@ffu@`}BzBCJgL=K8!W7qgQ?0lh9K_}M9cP-x8| zlQ=4GlK)*W&l8>~c0wdElJkj>RAbUwaRR-!fTsJrc3Hmoc{FJ-xN8~9z`*acfMTftbCmrNKDd2L=66DCeH3-~DdtNz#GtYnlv=FGTGp1#SJ33F z?26gl%vhMTvVqx)D-@;LjLqOmnnFq%uwN1yj=yriRN*ax%jBq8I%O20nIpl=0vS=DAfp+rXpN_*^QIsc-d1^^ZC>FtR-cK;{sNxnfH`rCC|s_mMRA|{o}iRnx5at9<5-8)|5YU?4__g# z{sG+qh_648r*tOku>ZlzsWnIX8d$JKpyb-_$>AuY-I^u?3q*3{mM=hF{7L*i1M6<4O}cHL4rH8!^R+dM7) zwftL`)#FZp+TwpTi|8X(Tv|cADn?Ywrw4m5D=xh-{r|R9UJEh9dJi=f{LE4}4fS9h z#YB%y+j4996v*5oze1c^Ci@p1G%jqUKm6taoIHMYM!k5$!)EzPdlOGF=y@Nb!1{eW z8$ke`qa<*q22>wapUoJbd;-8IxQ41eop~FX9XLtN%t6zU+q5&^^QqY~sFBi5dwMU} zDbW*RjnxbGbP&F-X-99*r=GUh;rX*F6P%u#3BvN(%7@5CrV3p8g-=ZN0S{%LOT zmE$Z!F0__x2K5|KeuOU>o;zw9oD1VA$ADlIP!K>Lgeo9Cn=Z-IA z>%?J?BZ#ofT{hpU{;Om(v&x&21+ipFqBqf%cZ`%SHAZ7QMQxk*S-nr=tu_hvTE=Yiw-Btv*%#BZf~FS*4F zB+x)%Y!@NYP{$1^L{>VpE1rou$_G4&@ty>m8HSftEwfSz2psmlO%*Pk0b`hLkiiFY zu4dba?UBh|(N7Lz_Gr(7qpP_$-!>j}_+|UQ?!~;U1$!I05wq(R1%1PpB0usp$dj|* zjD#okXKdFOI29u%5vu3NAx>#%aE z+QK@VYp!E-3y@E9^V0?B;z5pE?f*uv*O9oE*cC71kg>OS)Be+9yBcGAa$@@lZ*hhB zdei>iu{|R_2NRP#=DMc6`LSI&vAv~O>>2xxsjF2XhS`^+GP#9gnU&0guj1m8JXte}hl74n7H184u3=IzHW* ziBGq=_;jttC-e2hwb_I&0e6^kdfBv>^_v6gfDD38vAt#9*p5bU%D(PBpQi;(OH6_Q zx)>#TlH{Lh8tgIKn)aWFKkpnGo1ZN-JbXHK-MvZYbLy08LbxPLkIGW4X6dONtBb#N znJX<3(fR8G_LSx96VUx?VX7pp_Ova}WIK1KNH+rAR-4E#1qe9#jAu*pHzE^dV;Oj= z%nM{qr*4$?GR{lI#&cuy|2(x6S<`g{>_QbWku}02&m$bT)>UuHLjuAUTDQ$c69pYG$IiA#cf_|yuCa%rR3-dU??CMvt+|Upg$||FROgQN4H@x< z?Hj(0fKVm27tCSHYuc6Vj3LWP(5x?&dQvOsLD%|u{s4Rk7)A$#)1xCOX;GKL@L6M~ z5@Ug83p|ZVWLZsRK#!ON)^O*XT~g;7mrdFo9?U}#++O`L+?ga9{_9`#e*tU)+jp|A zn)c@6Yg}VawQ7_Gbd;%Y=F6$CsQfo#z?{3la!^r-WTEdzOc&Cw%B z?SWlMHUC3$osQhIP`%OZfBL97yu?1`2MD8IniS4U619UjI3>1Hc6T#9oURkdv)F+jR zKf&32AF_K~9m$iUN5JlJ5m(|Lq6MbXOV)9t%faWs35e6!C*D<G6)l={m1<^mzI5gn8=1*OT|B#$4|-v8`A&g^Vv`?ovZ^=6&a+qdNiLph6`7h7f7@ zIg{*+`*2J?6#hx&rYQNu1`vEVJ>SBbN3YC^w3i*0k%1sS%86=5Ub4x#`8b|y^AQaknO%Y2?|2YTxiBwS7 z=d*LPWJAt?TT+jv`{T~fiOMx1=D5nW@m|Jb*0f2`8Nd0Oa|ci&oKQAPH(>EtMW4CJ zPtXL^7(|r!5dhX_eo8+Zis_;p4iX@azy9O!nZijUb#DwCqB|G?6~6wMFLCDv(VU({ z^Q7b>7R!{8g3*TW<(BHRJ!I0%guhxpYV~;1^1HM=-C4~OYr-uJ7b;k_5(~~8cZ(vY zQ__C)YJb+-hqH*{(mSQMG~a2spU-YaVAz`aP3L~9zs~R{r+w8rnV8i6%8i^Kb>b%p z)Di?O()xzABx*0zMqTku^NW)bUs>;KI%3%x56POs_luIs8{S8p)_FgLV#8(>b$Ele zujn`|KM~tGhe^!V=xmQSlCRP`c_RDGttzi-M}zp&IzI#-Kx2*^=GF$TJDh)V8j;?c z@A%C9>ez+9l?v~Yyy7RFaxB^mKdT1WbujA&Z=4I%iryhddrcuwNkupley$hx+YM*Z zflA^fFztj zt02ak=D~(J)FKG$jG~fNGE)-Ud6xhzixY0Z%JGqq6}9_3{MB~5@(iz}N4@69>qkVqm>FZ)D|K^PoNnHvEiso!2=9R&J8<${t6XG9Tqa2Ni_# z0sD-zx`8^w6h+}-=A5M7!oC8wT!S2LpmPh6E=c4ik*S#L&5ew^MB2ZG_CW{`lD2`} z0Zq0gNBke|(DF|zqav`)4SGvZFKhvV;v%Wy-`*`dA~M325UJ%g<|{r-=}`l-+s_=~ zypMF6ZQ1e{iV^Atnv`8nX81mnlPe4DQ>Z>*y}OJ{}5fbb1F3}jdUkHvL+TbT&&x74#+}^)fMAy z`?A_FieqA&<6q7u!K;pj3n=L0i;z`Q%!qu*iRqme)b^PhE%1KgQlB|xnIrj3=%775 zyJ4`do0FRJIKcE-QrA31 zc3O2*&?^n_{*x{yrvPJ3-|YT>RbWf(Ff;t3QGY;|TW!sYBHWV9=Hf4H)+|fQ z@l_sof_c}y7%D#uCm;2dcbIi6C53ayeli=Lp1zK*kU)*q!q0dmV&ngI`RQfHiVv3# zLjL>P@G#;``by7}FE13Kf=CC;1X>S$rZI=Iq0;kZ7wglBKZ%gAH+5}?#+G9lguD$2 z@-3wmVjjP69d}Y2MB@KI3UpsY_RI(fjUlN67e2t}!P*w`IaMDE*%v-2{F1^IA>QNi zS=Lp}Gf$E8uIbyD-?eGdWtJtKjpTy{xqOo43<32rzuo%{-v(nJ7kJULQ$ggHI!XsQ zC!F}_f~KKTaO(eRBvQ6Wv^wjdg2Em}64LB77x^5)Mnj1#4vb(Lx2yBWZc8 zOl4^ef_t!`87#?DCJC6**f)6c4~@DiH)PEyG3s|yl~*;4g5;9nB5`q^VU zWLN#nX9Tu*qjQi0**zL?MT!_TweN;tTL`CjbI{Ihu4Pvki>2R375jy-QFc}PmZh?!V#4Uy@$pGvdMf9n^z0~ zUstm-w(QTAXO{>df<)RO zj+1+~ZY7Yq|N-6th+g&r(T8MIkbjJY6n$hDl3xTqk6SZG?)S<*50)GR(;=CF8KyzI%B>{;0*J_mjtaF#dMaS?ZwjK}<@N?@B$OtK2l*H~c$B{aA)Cyg=0^!@g5iAA&o1L;l9q zo5X5z5)aMs5Dn&l2}q9R-tCVyn^`$KXU;HlcCIzMz(rGYc7F0(0-nzExB9l>c6V~V ziwq%i2IBLmQHqo`^mU8;jv~o>c?^hUzp0g+H#KY)+ud3+7q4}LC*UMMl?71OhAn6k zD|C$y-b3C?34kh|kKX8gLm|SG$|60zhnlOy-}9ml84W5BVouOKo-KuBjNakbjVE&` zP;aSK;Ox#4<|q!)*(-fr=F(ARqf)3aK<$h)q?_T(TgcCnURj`T>g zj|6hY5j(npaKedR{9f%LPJ_=3=HB;jZ~F!>k)o+F^*5iVRx*1Orq3TD4`VZToDUF| zn@t>!t%**2ZRA}RflBhg;f((}@u8DH5Mi!FWL5H9gouna-x}(*bB7EcoohTa1l+W* z>F`y3YW(~kbUMxNP@q79on&G`pmw7;Hkq3t>3IRq79f!uAl#4V9d8x!issP4*)VBy z;5v}OT65rqXBYEZ!Y}k}4tx6SGJY%gt>70fW%e+B*(qjM^9xO#9pHC7zvKCx%A~*AS_V_&*H*Sz#nU@J;f-JtgS$1$q%_KX}PWs6# z&dtep{k5Pov&kKm8))AJ zeejx-a+7zfg{Acyav+m4nhq|{xi4~{EB?NH50nT+2DvS>Ydt%mX#%9%N92i;{YteNEVH9*h-B4(E^D zaxL)SRJlWomoluOy5u(vv+0vFv{eb(=tOuu8!fn&m7D-nr!V5no%)^V2^4%P-*ry; z5tamh>ZJGG&85rf{%Nti zI!4RQVgPjiaUn2v}?+U2*3XM62`0YI}-P>gplg-O|xGO)iwtaI|b2@kTxr5W)TqEYgXq=wfq)% ztuZ%n;PIMcAdJ;TUbGR?`Jg$OVBCJ?mKEX{Wd-u-=_q_S`)Yb2%8gi4N!4M||5Qf5 z`&;x{%#E+=nhPTz_>AYqRZQo)0Q?{JjXDUJ9q40M^bbh81oy)!t;I-WRpq87{A%EpsXYOQab8P;h(Yb};BI-q6 zJ+??gY<#km4tQI~7756bIN@~Kcd`&fdYKsyTobCVuyzlBFJN7UxeO@){O>(4dnBi1 z=QKtaFp{Ysmxm5xn2dzk(3 zi${5tPkU_jT8YK4OdR7W(cL`IDR6W3tDa2~WM1q2dN}i1G)bxopm4VOrIs#I%(2t6 zv;X1mC`q0WU2l^+sL}ZmOmX%4R&EiWIFVYl;3&orixEz{iIURtN_Rep&(@jGjWgCi zM3sXY5^9Qvi1|AC%xJ>Go3mMb6UB^2&<4{hi`Laf`4TaB(zVI1!WJS(0 zRy?$n3wBgmQ!4@Ntse z?ffjQ&kNYUoGd_4;?cwMdaWxpYDrdHOT0@hZ0)}P)*V*cnv#$%*tbC@+`7Ve4sv0> zB-{dc6Ec-`V!*V;n54%14|474X8gO{IAx7$B2mhPELDnJ?=n#F=zo(7zz{U2a4yV~ zo@vWPw6bM2rhizCSyxRE^!!_OD3$f0us0A}Ez2n@d%tk^H%{hQ zGCm1;k@z^BK9*`f7I>!heb%oZRS5Z>#BblXpDIwp+8*=&O>UFkH! zksZO>&t+t5lP&P4F5WeEjY#%^?)cFeuaY{`&W=^HSSN4I8;UBiqNeuq%EoK$-1Z=f z22SYpb#ygoPGnV{eC=fU3FwZHdOiopAz#S2oOSOh6CgPST!1xB8RjnpM{N$;BU<$~ zkmH>H)-kwibSmb|vXrIZo{ssffSMwWl1uNS_m9k`9;807YSqtYMbS85f-7?8N7HZ?3>GXbvg$nx_KJ9kOfSd4bo3P6AR7@IaFV%?W-;Ikx^pd@QrZPR1sF ziz?RY-yy%P{(bU8%VO76rmVW6@}x%=SO>qck3>2<0`~H=4+vpn08RS~9AUz&`zH^s z+b8Gg$QDJcXNnD2Dk3g29N=NsUdC*VwwVD(_Cb|ZU(Xzs0RIp4k{Atuddqx{9z9RWRRyST`X zL=eIcTZhPK;0P;Bd!@R9%*MrY-m0Ej)i$F)_V-dTX4)AiRImA(_uqNm1+U2Hg9|?1 z4tWkXeOy3%oTd+QJ+Ioge7g)8UOSvL8$A^+rNZ#PMcxVNs(k}>fzNz;5f7ahD-K#M z1$>rzv^uLq+Pgj1ic60?jSF6qUunu1bJ%%8SBhhfQU5sNVWcopkx0cBKB&OCSSkzI zFYVx`HU6S}E3g#h*5c*dNxn9KG?mLv{I{N!asf*LjQQj=U$dNvT zXn9Q4=&{rfDO+-@;?h3YN(9umRR>Vdlsg=}v(0#;s@0Yrp^o%fwt7(O%{4c|855>i z9qi%wEY%-55ZSq2AhwJzjD;$=+hVs8d6drQHQl5X>~dA}d`QWvZ!th@2E^>qQlCms z!HasjJpy?Oqw9e3kowE1pp$88uL?l#}FxUIisQ}o0d4t)qp6Rxs|uK}%2d(9wwbUSJE%n!mX3)Wh0aOGJcr%VZs*z_!qe!>f_bgd zAxohObj`fFgvk*onxlv^aCIU3=JJ3!s+glqiN*qr0WNkK4=<;m4B!O;x%0sq2|A?m zCQ;1>s!={h2;~BXU#&>XdyCJyZ!)uGDufr02y?M?m`*I=CsdmnV}<|nLx0tA=9vHw!8;kmUpVJ>ag(u;z2RR>S5Gh!WFw%WT<6FDZ}=8pPVPh zD$P>--m0xkNWId)NG4E3r4GO%Uy$BbsqPTuJF1MDh3Vb zBsE$rU6dSvWFDJGnK%3yLz2Y;R#i9B^N~pMumId;#wYXC`2%S@EOnU#ha{|p5x<84 z`Y{k`RY)ftPX3v9%s}#We!KTacf{?La@loO50@SRb|e03^}+Ht^*qUGDdceiHp{p=-w z`kVTdix*W#XMTjd<5OSGy#pvfLO04p-t)#}3;WV<)^Uz`j6VCSo|WZq#4e@RzTwZx zD2;~(aZ~k}V65@LnOwWD^x8La`Rr_-17)>u0A5yfUckP3n6+5;0F}7Mh_6)ORG4Lt z%lJr75h$ihtC=a5nR$p0yw((rN}W5Jf_iHf)l!G5EntnRATFm>O}ZNNX3KOtOK2JV z^O;DaT`~cZVn=b$NSRcH+|FiBX34Weo}sI_H zt%vYAB0q{>$!L`X%4ezZCp|o%Q^`LHAyJ*i%JNNjQqrSv(Y#E0zjC6$pWQ@^P!%VL z36k)KB4~geEFmRCA-R|Gy*9QR9P(=qVRO18P&>9*Vw}}-tgmXBe|>a*smGi(AY3VD zpWkde#woUiG~3~OL?RF(Gd8v}&dHcWRuV?k*i!CsE`3%Gzb&a&wZAz3dJAjM%8y${ z56W&O`2_!^USQuNvI=5UaxW28Ndj54JMXMJ*3o6J$!S7Pw-LVPQ&0L+j$idsNBaE0 z_{0>O^8+?j3^O`^5WMUckt#-#6}g(!h68+qe^lHume$9r*1fTPXn1zdJ0nnge=$Nk zPSPr5%*`~9lBbx_W!Qdou1E82=QrSvz`9ADUkIZFwC#ez;nxnRI}`elGq%vYws?x1 zCCt`j0o6&lDaq@ZOYFtO>Q6!x{h#E0Q&LZ6oR3_2n4FK)G>VSlP3Td$FaDoBgE-L& z8FPL@8^9i*IlokwVrQo0?v9A}xq+)cpofOh8Q-={;akW-R#NBy{mVRGjxDw(4X_I; zsy5C&Lm(Osiqb`ngPr=U_#sHcJO_&G(mN&+x(JPG$vw5io*`0M5An3(hvx5gKUVml z=4C*6bHsbobiO6`;5PFH*Gc@fm^W{oLxE-|Svw|mn_%x63p zBw!L(Fv|9wgNFA&9pYS)MjU0Dne2e)KhBIcCOW4Ux}SqI9Ch*TQ7yS8ILw?BugBWq z^Vl(m`^-a5;&oW>jPo_#^`~%DETBn2+$gQH0^6OEmSbx5-UDP$z}NKo8I|_8^br~Z znMjYSSp{?Z&_0JQNnIj*p}4c4UM!L};eF69hQCdJQD2Ju1O5;RS;l;{W((6GORH;r zbS64U-%+Kk$nKno zL%{$!QUdnGee!|hu%ImeJ|vs4=AEil-GAZL18BKAd-L-dg2=8rFr}4)vzUUq)u$GGhIf#&eU4nT)M(P7@VwHu;O)F^#LB zs|?xeS&v1YhWdmuy4u-I{2}l|%KJXdUWr;i+#>;Lbv~aeOnATKM~qF@aloEg;cV9r zt#K8pKc?kJ-j&0EQO2qx<(7`8D;ctk_`i6oQf}4xM7>PTE$^Ym6O(T7C^PF89%XLY zE%P#SLOzOx$QiAp3uKwg8iWks@U)BNh5dw0ax;4#Fm7?~CMJ{u_jYqMAd;1ye34Sp zf1QuZ8$&6IZ<-37qSi4JDfzs-%db$~t-ns;dNqkZz(b0Qb7Zy(n5gLk_Oe7fb6t*Q zy;%lZE|3c?(@XfMOjwn+ljuBk9_5=u|4xcSPyyrLn`&F?ID+WaT`Vj z(GkocM#Hw>3{Y@e;1#w6uZzB6=zL^^F5=dJ;_{}vLQ$Cxt+h8R| zBFMMd!E8}>awu93oFP?;r)l+zj+MLh^5ZogX?6Z_)Wrq$8T3Q^`DSN~MDSaMh>*~P z{O2=aG4?wTfkT2k>y7wFJXPb0sd6yKZ}G$$oiAh%mtc%#7hznJK=1CYT5qmH{6W{e z#x+WX-GC1b0tlY?%6IaGuZcg2xzbXv!{J$+c%vAs)j-AjfdC1DqkY9Y(dc0IN93Ut z-o^*T7((!5h9|aG<}cAZ!l5s=b3XPDczMrchZ0Mh#R?{7HpsCQx#1Eh&2rVbi3vdG z{2@K2$QkaKoh-nkhgpA?bP-h}V)4k0U+Y%*zKkyA>vjGA+%JKWb5*NIrRtVDL%3j> zer-OO2*qub(IG`w^u6dTqJT#6bFO^5*cm9bF|EC+M(2tYEI}IMIB!DJ8Hekf*+DS!Fm?b1-SrqgTjqNyom3Xb=iwuUrx4XV#o9kqvBV{#J$BdZxCz2A+!y>xLwsF={s^L`_g8CXnFs{SkJw|rg4wNVnp+lYsRmvN z=bl&6EK0(tzn@+N22Uu7jV|LY>TXYS2tl5V%um)sTw|7GSN`bV;Y+A5WLBA;) z?w>l3e89$vo*54_z~7?5-!5lmI(nh;yhPeQg>PpH>H9g!2Xvfw?jruxg3O z9IyTJ(k%AS*pbS6C-?@-Vjj&QY~pfE=a#}W76r|0zyvBU*PL%Qfp)!^YkKy5tyJNmZV^Tv)r+kc-8@e2PEokR(lvy)dt zh`ab_Z;ZTcR|o7qIe!FRwT)NXxeJWvP+r`f<9Xd%^?BXJST|%VuWw)F&a+$MuSW)K zaFklA$KA{FvLH*-eL1B8tSWb_^?-m3eiVfn1K)nTFg+6!oQ~4?qRzGF(FK{v2d^GPn|81^4hMUfa2+hV1@!>2IK^UrHK z+>@|YBV$fAh!{;^2KWOGFU{G>`zY9n|LOi-+jO`f=9Ey3fRKE~*AhmA7$T!Q(iXq4 zK1A&p&e!0F^kWA@RctV`bol!@SxU<1(!Hj`r=je_IR@UlT?wZFE@{sybrCB#cnN zT-WMvV@B8{qv~hHrHFhy3y!arXA4E8wqSoFe<6U2X5-mf^&eyk#)=^oM*T-DW1Je; z=+>F73qF!kvDRpKKx%MTe~cB`nai}8skq|1o(%X-xS$3aov7WohOF z>5z)m)c0Ca__75@)l{GJwW*Fgo5V(^<9Rh-L%FhlcCwjzTlKp3^?)6E_$#x0k5^lt7-^rl)N7FsxglxMHq^gY;r7>DtU@1WI5_+iCmW`4wqRutPpHw zPp4chp5wi^n)_&J~N9FAlOG1QWo{vP$1R<1I^8asXmI1SAAqWEOv<;w2S;z?-}-I+|<p;tkpIl;G@USMAhj{i~uQGJo1URs(t>uHRiW`=9ND4Y-@Cp zS4lpB)ngfXG#9%_HOet8%5UL6vY`cV2SfsO#

    ;v<9)vqJ=Z()61=fAda{ITd68 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�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

    Xg)`Mc_4Fz9(MG$=6ozt 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 z ze7G+^Q#ZwF_7-JCU{vx8?!pGoa6( zMQM({qn?=Ak>6r@omE^k@!nQtb6=?P%vf-rAr^IM0p$N3wmYbwVQbI1;&9)e^sx@x za67XablOjyNcZ_oo1^|?kUA8IW#)g*x0>$R3O!^}4`C+-Up`A%qM&Ir)7_W!cMyUA z5rya4JDIK6+A@1TnYxe%l62-#)_(lk2QeG}r=Ue{eHG-{4Zq-UHq8$?8f0EGX5{M<`#K_Tf=65@pkCf$$UkISmSoaU&iRki%j zR#YwN`-N-2f#SNxHkmW}m>D9Z`P+u@&H;GI1h@ezC&{FakYk(#?p|Dz@ShvE+pZ^X z?HL%ePU+cEnp@@-RY~x=h5>CXS^8cPh?MZ^pSA86>1W11r?9k<=NkMY^1^us-wg-- z1h33z;vekuH|5hj4(WlvG5;3B=x9O$Y4BZaT12y%`Ac{@RG;hKNL2%Z3HV%)Zojv;$6HSfi{Nxmix8tUqjo+%G;+2C^qoBm0l- zK!u4zrFxGkXv5+5$Sl z)yUNMRj%fh?TkynTS2ihzA_iO zLiz98xh-mvIQc3pbvyfX<0#55w(EPD9C+6GWexs6rOiH~K{|kdV!>?I@?`|wG#DcA8rZ;uYnroSIjTLoVF)~q1s-Z`0X zU-5w$So&&Mkl4z3a>FWR#Up52DB;@nL~1zxFX_wWipnbU+CFK4OH~9sk^SM&VdfK2 zD?gyZ;MBZe6KX(AaV$bN8_XZex3n9MT?i@}aHHw9enV zZ%gJ^+_N2#Q!r?uS*rP$spgy)G)2V{&5hu0YXTM3G1O^hn?ag!c89y=cD}R zc&&rCZ|j41kKxHdJaOaOQa>%yf2Ztq8mD<$Z{Gwh3-UJFXctB2DcN@BnixycI*+5P z>W!~bllU*Z06A?3mMSKH0#FSjKb=)v)Kn_-wbXL2SMX$m{ESV2lZ9CGa@xT z-ZEUZ5Wvo2ezg}vG8dKfu6sg_1oJD{<#kDXs(FTk%1FT&O@LE)#@)Q}drRFB)cCfs zd0|z;udiq%QV)t0)C)*)NEVQAv_-=kBE1bR0#QTnRPpH|eyuMjzva3Q>g&+7CxT*B zeC1|&w_`;ks9KUsiNGdN3yyD>hk0bZUHhv|^A^hn=I%#s>Zq^EW}E1(sM+c*SF|sQ za|nNAkecW>b(l*wiPqsWm3|63y5}6t-^)USmw%wh-zcuSq*yoxu|MQfd;Da(IoGzE z?o!F}hhR*}cJ_XwrF7q8Mp7p%Y5%@B{;hpI@-Cl2fR+q2(f{*;9GRQ2W8nQa2j1u9 zo+&wsa|=Kxy{aLnBd;ypU^>h!y7a*!Kos+nkC+QSB`Y@mRcx2edSK7KOnp^^-eunV zl-KrircpAr@MY``0uHG6m_A3+8e7Mimgr;tC27*`zdl^?jm#@nM5MwOp08y-8&p zAudXB0024^TtSfJ^L{XK+7D8nrrQ5O&~tDfNtGc}RXCohSbnE}4XYy%<@>Ut^kIo$ zb-8+m^f01z@oB?S#qIJ2sIOShJTTG)rRv(gPfAQ)Qi{FqpZ0QUX)qr%(6rLbYj}0^ zW*#l3+pW%r3Rj#Cb32Jt*xq%x@CJB7n}@3)kwLswhC8ne-PGV5m|F>Q=q5n!EJxZ7 zA#v|z_85riP-QuXgKg`unMv$yH}CNnaA=+t5%y!|Ie#K>baZI_tgy0A{mPPRudSYM z9QZ~je8x<6C|{m!iYT2Z;}^9}qMY9fegQIBqx?h_zt#N00?(P4@TX18zvFyxyX=Z} zGr4OEO%MvUt}qWvE+3rQpCYjH@0{J9l*o zqp>&~zcqgjPxrT%TW&4>x7Tv(*}IT{b}{HS@aA6$7nQHkr9~p}zzn80bsRDJy9u5z8tP6PYE`*fPFAqij>YLw(=pOz$u39X00;dzi*?lzTyf z+78IRxrSD3tGUCTJ@DN(2H*Ytz;~w)zI*$?cgOKAh`#_`R(Ln3G@D76>x4U|^j3(` z(8s`~F_@~}4G(K_eS-wQ0KViEDQj@NWM>6-16nRn`uvHB;Hqlmw&nWVZ&X_JF_jJe z;|&Nf=*d|b_`aIzZp(5*N$wSeK3GVsZ99|lfazT8W-@Nfnhn|!8hTj`!IgURJ z$d_O&sA_ktp=?PH)RWxgPI}=~an^YB55h`tDzwt9rqU3HAb@aa^1D6iH8U(i$L~ykB;|cxUVTCD1a5rkg`H)M z42$v3t7_TMqD^_T!5@JuYP<^>5l--YYIqR8%P$7lAMaaX*B`Za_PkcC$W9Trq-i6K zQyb2DxMi99SRexC-HKa{F^^ zai>!=)M)^@#|y(Ga2I54$ql{nZH%eNeC2)#RjFe{x8i-Kms^a=2VhwNUfWDB*hxpX z2|fGo)2C@%EkC^2yU|jm{;om!yLE%;)Uc-BsTZpyuroDgT({P~gWt@&LOKtY7yV+> zV{m#z4iy@+Tf1y89{$>}DahczY&1gi=Uq1R^(pEH!iU>CGem`=bQrJMA^6Qx6OzF&|Jxdw9%y`u@O6k@+#=*KP?g2WM2OhYbSSO zFS<46gr&@ky&;Hs?RG7ZV_3eAL+NJhFN!NRa}!-K7#syXQ|%Uw zF?X}FH411f>-?|u)K<`S5XEBb+(onZt7VYh+4^>y*|vs~^!onb0DU6oNkfw81PsxI zP{2491yO_l7jc}qOwT6;pk{W3RJm3f1&7L<@LF!W$DCHL-P7Qo-A^07KI>s#j2J%U9A@BFygOSh#Rd&h3}j6=5HhgpagmXuZ$QVfz2H-X{hnOQZWv z=3OWsCyI-#?sss$fk3=^xA_-r!oH1AiSX9y%|dnK4A%wECb+T@F9*N3 z_=3Ouv!RQH3$ZLF5lpGhm9*w26`5_~L3S_awY>~@s8~eu$!WXAyG_i&wA6G;&54KWI`{;B&HkP1ry^+k0C6RZdHSe{LUa~$U+LDl^ zb9$HbamY>QHUvM>v1#DZ=cvl}R3m==|D8x6 z((e8-v#l7{Wr_f4K^)${K(serBx&}5@4({%yf|OL7C|AY|0T1;BhqT(uny2-?C5xIv1C%|Xe1$q1`@WB>3u9f|*l58#4OA{zN; zP0Rft1o6QH34pNv2!LT;e$}nb2hvv!0fKp$G3nlkv^Y69T)4~eo^DgivbDhZ_HVg> zUic%;NDw9eO|eD#gN|vX`4<#5h_B@30dp4Z9VtY}j}xl|mXA;{?*E_s=XI~S*lk7u z_3-jfzfl|URnC;WTyg60u)^v2LFt%tC0R#eiEUDl?-R}MC5m;VGmSXfw37I#=Ib%3 zU)kw2t&H@*V*C6OFll2+qPA&u`my|YRoc|G=Q$L>8HoXIKbk*{OYCPun4wOvI9}Mg z_#i0hhY-{B;pEm54;#w5th|>-uzr1D$McGXHcqa`$%gZ=44-eCePTBUd>+z$nVLi> zE6dy}-FzDaNw;zhJE+Lq1&&GtSZW`dr++O>^f#q{spHzXP|LgE+t4l*A03%<-$9Z7 zYemPL{y_3%1CGo1=?+#|Q&;*DR5(>~o$^28%(e2TP%)vuzip3VA@M>@z)JJ0 zOFp1S->8DxdN*#?{`Yg@OORKyM+BE-NK7;jE>xU@^lR3@-GqVAALdR?#y-CtgCMOSh>r9v=YX41 zU1hK47qPkj7>7AGZo~^H5(}D^#cHNkd&}`GC~Cta7HvKqtgnj`3@q+{81tK!o!&Z$ z=$jm>TZ|0$jQO`HUT|ea!ks9V&BAUs*pD!`*3M$8&fF_|wB0YL@m{)*-{Z~FPN z+;mxwta07>8+jzG(3Ds9AJ<_c0rL@h&>VTacAL+92UED{u0@Mf33A!XTw?+PJ1rhDWN$L9C9%y7sBKx@}oBY^sO@nDv2S<9lUG<1OiL5 zKH86QP(>Iil>BsTtfWy0!!~j_3p^~R#OaBI?-EA_#D26{S~O+7*#ubVt{THDukBI< zz(j6^B7)1QW)B}!gfF?oaln4TrL?;Gn9GUbr8y6$Xl9+nJL~i;HQBdWZOxx7v9*Tg z#M0iaV5|AyPahI%tdvsHVy&~(dR-m2W+{bjzN28BdV%w`xm=`F%+NOFwY>yi#}&4k zpr`7bQ##wu_)gpGl1c|Fq>QeeR_*2F92;2Ov@<)q9F(~U|NNc+F^^&n5Q_WluCzqm z)uQmqMW*ewTS>h!UnI|uYeUNn`o zevcM{HG&?;2M^k2A>+HBXP z_7QZwOh1kdT+Zd3^#`H5x4m+x#i&KoG(v|>d7lLs3oL-#8CNMvPp~iua>57Hs9)z` z8kDMaLmhp_V-=Mm?hrkDOH3vFNpBK4i;T|r>fs*ChPhKTA%_MWhG;(1h-cQ}RG0Y( z3Nn|A{9i0s+Ne_4S(tp&^D8U&qsQfa*jJm}HUHwj)td>|R-+-p3ZjM3b}Pug51Z1s zeXh*CD&q!dzT;Mjg-N)K?)n4EXoVJXA~^U*#~+Ju$dwJ?%kgzHLDj9cCMpY~JlQMu znbSJ=IQN?a<$Xt<+%EA+>__q{<@oQ2guhPFu)OPj&oY8)(IFchD~G)@H{r__=uK<0 z)`XqCk`nsF`_Z2fkTA=yg-M;!d}t@<@%L?qtyYGddXvU ztuNpaJQ>Htg=J=;9tR6C#fl8fa<4YWN9{D<;!V8m6`syeAG43J6(#hbZs5Mso1sWX zQDVDn-sS9(nA@Wa4Q9{|GhRhWm@$NGkPa*WqMFCv?4t0Bf^#XzDP@&!$XugjBr$3a z>`;2MI@Cp_8jYH?7>L4_wxTm#ktspciN6O3q2-+8)@>HA8RLj~KR!*Oi99*5yFws(Bj^EQZ8#`SC3%?4IwnljYG&ehGwPK;8~! zuFie-!k)jEAj=m?TDNGX-g#}s43r%chYnHV+(0!U4g_`vp~4zvueGGAC0adowsvXu zc?cmtD;A5;AM@>M4XbeWSQ1E-o97ZR6MP9Bb;~}ncq}R`c6>r9cb4#A%y11)Zf_iA z(ZLbx>YB$noow3?%V{}&&^)LO}()U%yYn!DtPw12r)@hL9gDbXC zKkh)*ulLtmxzTy+n7>Yw+&?lL*u)H**c}&@B-;2yDVx7&BK8 zvdDuMroVB~Jp`pv)qq&lGGh*QfLP6Y%kKsjjK7N;fr8E;OVg`fdq`7{2v*j|+eENJ zg%XkXai*w3T2i&v*{g>_K~B{b=QKF&FUaxDcDLy+FZbWPC9r%quL(HO@Z>84_;iBp zLIW- zzResrjQX&qC%wyCKVsEKDPk(6?@HuaI?T;+!NT^-VOG;!HCq=G6e-=2Z&g1XC>*#l zcD(R*3yNxgV~u^_Ei0iUKvahu4#jHM%;Uye{)*+Ib`YHZ@^7DL`@F82pO|mU0A-<* z=l4)F`-H=P!PHx>)KzZs2d26)vL{#}0BWWaxvPj^&`bWuE!F1wDf`drqtwcK&yU%X;zv~)p=QZ#YC59;KCwb7fOKU6> z@UEM|!pK;<9?4jmUgF#a8*6`EM^Ue>1kB7hj*_ds z)~$EuNC1#Of(L^%tk*IbptCREy;rp?EH&rA+(TZN$PHigr3l1+wHjr3gXJl)z&1F1 z7A3fw#a*7G`SfA+!@Vt$XGRYxGw ziN@dvsup0(2epn#dD-(df4TVTK|<4OGqehyfS53an)MNeegTw?^j(7<04k=ek(w_)rg&Uv9BksMn^D3E`N-aa4#7*1F|!bGH&P zMB6rd*&03q_vh*-lxSb>{7~7wvLsC9)xm#0`dH*Q8=u|s@o=S>3vXmKkU&xGvtdYg zgky7s+<*|`t#okqqi$SM@Z>M1&#s@GMigZUt6j5zPV_&*#z(qeZ~zxEpo??v?#+?( zLH={{uk`-=srh?QK4vXOrau{2r*p{k*vEMH@A+?!eJJWb9_`5=9gRF5ef&ME%yDO! z9Y*F>(F)Vu8DdwcTM=@N?IAoxWFt66YNsL<^H-GeV>*cW$h2%^S7RRs_OX|J9Vo|& z?Fvfz??$DIdy-EzYv73escGu=a$7VT{w=C2)Zc)C-JuRA)Zfr0^1>?ZHRmmI_+8-0 zv2S{n&i>jDQ@6v*^f2bX>t|I}(tpt^Qfy~3@6S$OXua2plierSE}`lj5smz%;mMtN z;Vh{jv;C6KfWmH-Xn`xi$g-E&kK|8*gD}UMfN;v}oS2_JV&`pRs@H!qeo0a0IUvlX|2p zHsiozMXs2k>jV6LsJ$xcKQ+`|WwUp^%jtt{9KEeZJ07cf*=yTmA+X(RllL*&|5(j- zrQxDmDmf2!*#{NGkjio2GpAWsMSuN$!UVNmVuVR^ZedSRKSn^?8lEL(fYxdmh7 zoXnEahnr>o$BaQ)^e9BZ(Vp$QTkrHll;MT^s^Ax22&+Evm;v$d$QCsRq6Iwb30YA`=3DYq97`>F%$E!XSHJ_u-Aw}yTS<`2!s+RS7uXx4_(f*pl zfFOS3)#JMRf4ybuXk_jFHs_xqHxK_+0D?D0(m0x=U`GY>`oqlWPV@ugw! z&!(O-a%~^JZw;{@-bY6SNwWL6r2i-#>jds9vYH}yQH0AbZ~3pZi+KMN;GuWjPq-$t zSY|u;lX{?25_R^6JhSY`?rh{f=~QMvTP~GZOR3TPa8c&+Nt5c+cx)Qpu@yQ{~?p+F}H#3n+})UNTVTT zR){*h(jGk4y1(7`6FX93inzjF+ts$S@_pi}wCAeu9G`LQP(Emz4-7G6aPSYxHq|bCaPX1wpQk z7k&)qP^VdJ^fAUgs)#BK%Yt0jR_LZ+0^OR;aJv!h_U;vS5MJ9cbV_HVu~`muU-M!v zUN!(H-zxta{m0Dr`78tx&fZdjcQ9f%q2>@fb(0@CMx9pp-2b99E{*O3Xh2x*-V~ZL z3+MiF(UZwP;|q#^o8p#p@r~d2@s44X52jBHC!~RtRHRI`RhddRq9N1rver#b$AgAW z%V%L0`%R1X>4N(W5OWK6r`tXN;E7!QtRYPw2#MJz~u}&#?tcIuCxP6_Ay(IEENW3C+s9B znj2WS^f=U@Gb~=4f-hh_OB5BAG1AA(?x+Ux)LMj@3U175jRwevfs`-ie zzdlh9{f7tmYa%!N$b+TbBv1}#t|o1xhpR+PL;nNW+7iLCzX>$^chvkBR8p4xY&q}D zv3wNR%iQ#cOh7%E_e;HB5So5dr0wzaPo;==od{efg0RQ7pLqrKlYVRf{|Xc&0C7R8 zIAqhI;b!A9Y6J$*LxIh(uLUCpy?81=)UC^nEKY*Z6CR|-7Uvjiv z7!AC)w6(`;JB2UN>XvxR(Nz~kyU>U+%v&^P;S9$7O>zG<%n1Es1Rp+3ox&YSK`N;7 zc&dbbkLw1?#4jv0JL#hA%Hgc!xQ*6urqa&L63v0F+W|vHO3vXmQ;|7J@O?(i(y@*I z=F4!LG>6*6M0p~s;&>Wln#_MeAmH&yiv!{T=4ktkOP|d3KeiL!XgenQ^GRxF6E;AC`d1TKC|^s%nktxbSwI0dCyXp# zEBR8JxyR^1*TsTt=KYHkUXpNg^@)5BPec2?+_s!!xjAvKJr}#5e;2MMdd~zE8B%EL z-0Xhu3xO1;!`)|4%3r7LZbN{vVnJ!bU$aUb@mF;716J>~Ke;Y`{G8Az+$qGowR4N% z{#`UvWH$du;LoWrbJ?k%;Oa7SJC6hV6;D_4H22xR?4k}NvR?sGi&k0D53lWXTv{5N z|899SU^C;}5m{a`3k${Ye>s{WGDdP<#xUbpK8Y&UTzz_G~s1$ zcG>dsq{Xe}*-|b8v43LX-op5Ix1L_L`-~>NwKyUvjuG zkvr_CpViO7ztuOn3BRzPTEi@GnaDSzH1N=h>NMDV`(1tHTMIULGK*r=bh)kK;OVx) z3Fq_Ul>C@PxSByBnIU>DGa?DBYMsYJm!;1+0yeew#@nS~KU z0;AF->xuv-d6^x;e#u2`HB|-HFb!c6lILP0BECBf)oe}Z8T*&uODAu1Dco=DiPhXL zEcR~Q`1yw#h|(!NDN2~^CQ<*)I*W)zO6=9tghfUEyJ}NbB(RT$t6=fr^8!&MDFyhlSX+zN`pn#5@P$68{>QH$Y^!vZgQn=Rtjceibkhe}h!v&@(mZ6EncM$4=u`+de?p#8qI1th81Ds(&+7v zsY>+c5Z*S+?Au)?sl1WTvs?G zoY&bcbj=l@N5tV(&6+CV%5^_str2OO-V0mZ9tFlbDHg0L;sI&wIU@e1#!D8mex33Z ze?O+oqV#teQHahQzJx0iPxP%N≻^p8>vDGH20Xoh5##1t)GyRkOv;O_+^F62dUc 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

    f@WisTkb4UBp8$qrt2J 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 A*#H0l diff --git a/aws/native-libs/sqlite4java-win32-x64-1.0.392.dll b/aws/native-libs/sqlite4java-win32-x64-1.0.392.dll deleted file mode 100644 index 70d258f29bc4ecd0d00c93ec6544492eb1651b65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 684032 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�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/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%0A~nCOa&eq5#+&)%$nz;=FjHE>Syf0x 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 z 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

    N6>N;BVq)D#0WE$DJ6D^JB%Dn0VW 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 +6A3d6oh1#ova9Y(*njXjB30>N5Oa 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%0DA%2>vlE?@G7AFddS;=rvbHq!5bj21HJ_K-oU&8 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 Date: Tue, 19 Apr 2022 22:40:39 +0530 Subject: [PATCH 070/278] JAVA-10628: Create new aws-modules and move other aws related modules inside it --- pom.xml | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index 21589f5525..e47d3aa4dd 100644 --- a/pom.xml +++ b/pom.xml @@ -366,11 +366,8 @@ atomix - aws - aws-app-sync - aws-lambda - aws-reactive - + aws-modules + axon azure @@ -850,11 +847,8 @@ atomix - aws - aws-app-sync - aws-lambda - aws-reactive - + aws-modules + axon azure From 3800a6a858287219aca9c9cbaddf7a4929bd987b Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Tue, 19 Apr 2022 23:08:18 +0530 Subject: [PATCH 071/278] JAVA-9610 Verify Stored Procedures with Hibernate --- .../com/baeldung/persistence/model/Foo.java | 17 +++++++++ .../service/FooStoredProceduresLiveTest.java | 37 +++++++++++++++++-- 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/persistence/model/Foo.java b/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/persistence/model/Foo.java index eec15c5e56..ac79653b2b 100644 --- a/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/persistence/model/Foo.java +++ b/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/persistence/model/Foo.java @@ -13,6 +13,9 @@ import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.NamedNativeQueries; import javax.persistence.NamedNativeQuery; +import javax.persistence.NamedStoredProcedureQuery; +import javax.persistence.ParameterMode; +import javax.persistence.StoredProcedureParameter; import org.hibernate.envers.Audited; @@ -20,6 +23,20 @@ import org.hibernate.envers.Audited; @NamedNativeQuery(name = "callGetAllFoos", query = "CALL GetAllFoos()", resultClass = Foo.class), @NamedNativeQuery(name = "callGetFoosByName", query = "CALL GetFoosByName(:fooName)", resultClass = Foo.class) }) +@NamedStoredProcedureQuery( + name="GetAllFoos", + procedureName="GetAllFoos", + resultClasses = { Foo.class } + ) +@NamedStoredProcedureQuery( + name="GetFoosByName", + procedureName="GetFoosByName", + resultClasses = { Foo.class }, + parameters={ + @StoredProcedureParameter(name="fooName", type=String.class, mode=ParameterMode.IN) + } + ) + @Entity @Audited // @Proxy(lazy = false) diff --git a/persistence-modules/spring-data-jpa-query-2/src/test/java/com/baeldung/persistence/service/FooStoredProceduresLiveTest.java b/persistence-modules/spring-data-jpa-query-2/src/test/java/com/baeldung/persistence/service/FooStoredProceduresLiveTest.java index 8bf33c4110..f6dedfc6de 100644 --- a/persistence-modules/spring-data-jpa-query-2/src/test/java/com/baeldung/persistence/service/FooStoredProceduresLiveTest.java +++ b/persistence-modules/spring-data-jpa-query-2/src/test/java/com/baeldung/persistence/service/FooStoredProceduresLiveTest.java @@ -1,10 +1,14 @@ package com.baeldung.persistence.service; -import java.util.List; - import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; import static org.junit.Assert.assertEquals; +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.StoredProcedureQuery; + import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; @@ -17,6 +21,7 @@ import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; @@ -38,8 +43,15 @@ public class FooStoredProceduresLiveTest { private Session session; + @Autowired + @Qualifier("jpaEntityManager") + private EntityManagerFactory entityManagerFactory; + + private EntityManager entityManager; + @Before public final void before() { + entityManager = entityManagerFactory.createEntityManager(); session = sessionFactory.openSession(); Assume.assumeTrue(getAllFoosExists()); Assume.assumeTrue(getFoosByNameExists()); @@ -70,6 +82,7 @@ public class FooStoredProceduresLiveTest { @After public final void after() { session.close(); + entityManager.close(); } @Test @@ -94,6 +107,15 @@ public class FooStoredProceduresLiveTest { LOGGER.info("getAllFoos() NamedQuery result : {}", foo.getName()); } assertEquals(allFoos2.size(), fooService.findAll().size()); + + StoredProcedureQuery spQuery = + entityManager.createNamedStoredProcedureQuery("GetAllFoos"); + List allFoos3 = spQuery.getResultList(); + for (Foo foo : allFoos3) { + LOGGER.info("getAllFoos() StoredProcedureQuery result : {}", foo.getName()); + } + assertEquals(allFoos3.size(), fooService.findAll().size()); + } @Test @@ -116,6 +138,15 @@ public class FooStoredProceduresLiveTest { for (Foo foo : allFoosByName2) { LOGGER.info("getFoosByName() using Native Query : found => {}", foo.toString()); } - + + StoredProcedureQuery spQuery = entityManager. + createNamedStoredProcedureQuery("GetFoosByName") + .setParameter("fooName", "NewFooName"); + List allFoosByName3 = spQuery.getResultList(); + assertEquals(1, allFoosByName3.size()); + for (Foo foo : allFoosByName3) { + LOGGER.info("getFoosByName() using StoredProcedureQuery : found => {}", foo.toString()); + assertEquals("NewFooName", foo.getName()); + } } } From 5888cf423bda162bdc6db23dca23aaa4759d52c0 Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Tue, 19 Apr 2022 15:02:25 -0300 Subject: [PATCH 072/278] BAEL-5157 - Exception Handling with Jersey (#12090) * BAEL-5157 - Exception Handling with Jersey First draft: https://drafts.baeldung.com/wp-admin/post.php?post=131880&action=edit * BAEL-5157 * more meaningful exception messages * BAEL-5157 * midified integration test to use the first available port --- .../exceptionhandling/rest/StocksResourceIntegrationTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/jersey/src/test/java/com/baeldung/jersey/exceptionhandling/rest/StocksResourceIntegrationTest.java b/jersey/src/test/java/com/baeldung/jersey/exceptionhandling/rest/StocksResourceIntegrationTest.java index 1648116918..ceb59adc1f 100644 --- a/jersey/src/test/java/com/baeldung/jersey/exceptionhandling/rest/StocksResourceIntegrationTest.java +++ b/jersey/src/test/java/com/baeldung/jersey/exceptionhandling/rest/StocksResourceIntegrationTest.java @@ -17,6 +17,7 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import org.glassfish.jersey.test.JerseyTest; +import org.glassfish.jersey.test.TestProperties; import org.junit.Test; import com.baeldung.jersey.exceptionhandling.ExceptionHandlingConfig; @@ -35,6 +36,7 @@ public class StocksResourceIntegrationTest extends JerseyTest { @Override protected Application configure() { + forceSet(TestProperties.CONTAINER_PORT, "0"); return new ExceptionHandlingConfig(); } From 8fd4df52c277ca036ead9ecc7ed68f15b0f5b0aa Mon Sep 17 00:00:00 2001 From: sanitaso <98709855+sanitaso@users.noreply.github.com> Date: Tue, 19 Apr 2022 20:03:23 +0200 Subject: [PATCH 073/278] BAEL-5416 How to Store HashMap Inside a List (#12091) * add unit test * fix the error * correcting the name of the test * trigger build process * change directory --- .../com/baeldung/list/listOfHashMaps/ListOfHashMapsUnitTest.java | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/listOfHashMaps/ListOfHashMapsUnitTest.java diff --git a/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/listOfHashMaps/ListOfHashMapsUnitTest.java b/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/listOfHashMaps/ListOfHashMapsUnitTest.java new file mode 100644 index 0000000000..e69de29bb2 From 3f78a1e9c0f0763659906c6c17c687f58a5892f2 Mon Sep 17 00:00:00 2001 From: andresluzu Date: Tue, 19 Apr 2022 22:02:34 -0500 Subject: [PATCH 074/278] BAEL-4559 Stop Execution After Certain Time improvements (#12076) --- .../stopexecution/FixedTimeTask.java | 28 ++++++ .../stopexecution/LongRunningTask.java | 21 ++++ .../concurrent/stopexecution/Step.java | 23 +++++ .../concurrent/stopexecution/SteppedTask.java | 31 ++++++ .../stopexecution/StoppingExecution.java | 95 +++++++++++++++++++ .../concurrent/stopexecution/TimeOutTask.java | 22 +++++ .../stopexecution/FixedTimeTaskUnitTest.java | 18 ++++ .../LongRunningTaskUnitTest.java | 19 ++++ .../stopexecution/SteppedTaskUnitTest.java | 26 +++++ .../stopexecution/TimeOutTaskUnitTest.java | 20 ++++ 10 files changed, 303 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/FixedTimeTask.java create mode 100644 core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/LongRunningTask.java create mode 100644 core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/Step.java create mode 100644 core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/SteppedTask.java create mode 100644 core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/StoppingExecution.java create mode 100644 core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/TimeOutTask.java create mode 100644 core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/stopexecution/FixedTimeTaskUnitTest.java create mode 100644 core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/stopexecution/LongRunningTaskUnitTest.java create mode 100644 core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/stopexecution/SteppedTaskUnitTest.java create mode 100644 core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/stopexecution/TimeOutTaskUnitTest.java diff --git a/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/FixedTimeTask.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/FixedTimeTask.java new file mode 100644 index 0000000000..9ac20d73dd --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/FixedTimeTask.java @@ -0,0 +1,28 @@ +package com.baeldung.concurrent.stopexecution; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.TimeUnit; + +public class FixedTimeTask implements Runnable { + + private static final Logger LOG = LoggerFactory.getLogger(FixedTimeTask.class); + + final int fixedTime; // milliseconds + + public FixedTimeTask(int fixedTime) { + this.fixedTime = fixedTime; + } + + @Override + public void run() { + LOG.info(fixedTime + " milliseconds running task"); + try { + TimeUnit.MILLISECONDS.sleep(fixedTime); + } catch (InterruptedException e) { + LOG.info("interrupted"); + } + LOG.info("finished"); + } +} diff --git a/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/LongRunningTask.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/LongRunningTask.java new file mode 100644 index 0000000000..7167859308 --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/LongRunningTask.java @@ -0,0 +1,21 @@ +package com.baeldung.concurrent.stopexecution; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class LongRunningTask implements Runnable { + + private static final Logger LOG = LoggerFactory.getLogger(LongRunningTask.class); + + @Override + public void run() { + LOG.info("running"); + for (int i = 0; i < Long.MAX_VALUE; i++) { + if (Thread.interrupted()) { + LOG.info("stopping"); + return; + } + } + LOG.info("finished"); + } +} diff --git a/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/Step.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/Step.java new file mode 100644 index 0000000000..d6d8c8c036 --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/Step.java @@ -0,0 +1,23 @@ +package com.baeldung.concurrent.stopexecution; + +import java.util.Random; + +public class Step { + + private static int MAX = Integer.MAX_VALUE / 2; + int number; + + public Step(int number) { + this.number = number; + } + + public void perform() throws InterruptedException { + Random rnd = new Random(); + int target = rnd.nextInt(MAX); + while (rnd.nextInt(MAX) != target) { + if (Thread.interrupted()) { + throw new InterruptedException(); + } + } + } +} diff --git a/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/SteppedTask.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/SteppedTask.java new file mode 100644 index 0000000000..5b2b0c445a --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/SteppedTask.java @@ -0,0 +1,31 @@ +package com.baeldung.concurrent.stopexecution; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +public class SteppedTask implements Runnable { + private static final Logger LOG = LoggerFactory.getLogger(SteppedTask.class); + + private List steps; + + public SteppedTask(List steps) { + this.steps = steps; + } + + @Override + public void run() { + LOG.info("running stepped process"); + for (Step step : steps) { + LOG.info("running step " + step.number); + try { + step.perform(); + } catch (InterruptedException e) { + LOG.info("interrupting task"); + return; + } + } + LOG.info("stepped process finished"); + } +} diff --git a/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/StoppingExecution.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/StoppingExecution.java new file mode 100644 index 0000000000..ac4af8adc4 --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/StoppingExecution.java @@ -0,0 +1,95 @@ +package com.baeldung.concurrent.stopexecution; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.Timer; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class StoppingExecution { + + private static final Logger LOG = LoggerFactory.getLogger(StoppingExecution.class); + + public static void main(String[] args) { + StoppingExecution.testUsingLoop(); + StoppingExecution.testUsingTimer(); + StoppingExecution.testUsingFuture(); + StoppingExecution.testScheduledExecutor(); + StoppingExecution.testSteppedProcess(); + } + + public static void testUsingLoop() { + LOG.info("using loop started"); + long start = System.currentTimeMillis(); + long end = start + 30 * 1000; // 30 seconds + while (System.currentTimeMillis() < end) { + LOG.info("running task"); + new FixedTimeTask(7 * 1000).run(); // 7 seconds + } + LOG.info("using loop ended"); + } + + public static void testUsingTimer() { + LOG.info("using timer started"); + Thread thread = new Thread(new LongRunningTask()); + thread.start(); + + Timer timer = new Timer(); + TimeOutTask timeOutTask = new TimeOutTask(thread, timer); + + LOG.info("scheduling timeout in 3 seconds"); + timer.schedule(timeOutTask, 3000); + LOG.info("using timer ended"); + } + + public static void testUsingFuture() { + LOG.info("using future started"); + ExecutorService executor = Executors.newSingleThreadExecutor(); + Future future = executor.submit(new LongRunningTask()); + try { + LOG.info("future get with 7 seconds timeout"); + future.get(7, TimeUnit.SECONDS); + } catch (TimeoutException e) { + LOG.info("future timeout"); + future.cancel(true); + } catch (Exception e) { + LOG.info("future exception", e); + } finally { + executor.shutdownNow(); + } + LOG.info("using future ended"); + } + + public static void testScheduledExecutor() { + LOG.info("using future schedule executor started"); + + ScheduledExecutorService executor = Executors.newScheduledThreadPool(2); + Future future = executor.submit(new LongRunningTask()); + Runnable cancelTask = () -> future.cancel(true); + + LOG.info("cancel task in 3 seconds"); + executor.schedule(cancelTask, 3000, TimeUnit.MILLISECONDS); + executor.shutdown(); + LOG.info("using future schedule executor ended"); + } + + public static void testSteppedProcess() { + List steps = Stream.of(new Step(1), new Step(2), new Step(3), new Step(4)).collect(Collectors.toList()); + + LOG.info("stepped process started"); + Thread thread = new Thread(new SteppedTask(steps)); + thread.start(); + + Timer timer = new Timer(); + TimeOutTask timeOutTask = new TimeOutTask(thread, timer); + timer.schedule(timeOutTask, 10000); + } +} diff --git a/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/TimeOutTask.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/TimeOutTask.java new file mode 100644 index 0000000000..e27e64476e --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/TimeOutTask.java @@ -0,0 +1,22 @@ +package com.baeldung.concurrent.stopexecution; + +import java.util.Timer; +import java.util.TimerTask; + +public class TimeOutTask extends TimerTask { + private Thread thread; + private Timer timer; + + public TimeOutTask(Thread thread, Timer timer) { + this.thread = thread; + this.timer = timer; + } + + @Override + public void run() { + if (thread != null && thread.isAlive()) { + thread.interrupt(); + timer.cancel(); + } + } +} diff --git a/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/stopexecution/FixedTimeTaskUnitTest.java b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/stopexecution/FixedTimeTaskUnitTest.java new file mode 100644 index 0000000000..bbb8d0571a --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/stopexecution/FixedTimeTaskUnitTest.java @@ -0,0 +1,18 @@ +package com.baeldung.concurrent.stopexecution; + +import org.junit.Test; + +import static org.junit.Assert.assertTrue; + +public class FixedTimeTaskUnitTest { + + @Test + public void run() throws InterruptedException { + long start = System.currentTimeMillis(); + Thread thread = new Thread(new FixedTimeTask(10)); + thread.start(); + thread.join(); + long end = System.currentTimeMillis(); + assertTrue(end - start >= 10); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/stopexecution/LongRunningTaskUnitTest.java b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/stopexecution/LongRunningTaskUnitTest.java new file mode 100644 index 0000000000..c9bcb75e6d --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/stopexecution/LongRunningTaskUnitTest.java @@ -0,0 +1,19 @@ +package com.baeldung.concurrent.stopexecution; + +import org.junit.Test; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class LongRunningTaskUnitTest { + + @Test + public void run() { + Thread thread = new Thread(new LongRunningTask()); + thread.start(); + assertTrue(thread.isAlive()); + + thread.interrupt(); + assertTrue(thread.isInterrupted()); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/stopexecution/SteppedTaskUnitTest.java b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/stopexecution/SteppedTaskUnitTest.java new file mode 100644 index 0000000000..ab9ac2732a --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/stopexecution/SteppedTaskUnitTest.java @@ -0,0 +1,26 @@ +package com.baeldung.concurrent.stopexecution; + +import org.junit.Test; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static org.junit.Assert.*; + +public class SteppedTaskUnitTest { + + @Test + public void run() throws InterruptedException { + List steps = Stream.of( + new Step(1), + new Step(2), + new Step(3)) + .collect(Collectors.toList()); + + Thread thread = new Thread(new SteppedTask(steps)); + thread.start(); + thread.interrupt(); + thread.join(); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/stopexecution/TimeOutTaskUnitTest.java b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/stopexecution/TimeOutTaskUnitTest.java new file mode 100644 index 0000000000..39ec9f7d26 --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/stopexecution/TimeOutTaskUnitTest.java @@ -0,0 +1,20 @@ +package com.baeldung.concurrent.stopexecution; + +import org.junit.Test; + +import java.util.Timer; + +import static org.junit.Assert.assertTrue; + +public class TimeOutTaskUnitTest { + + @Test + public void run() { + Thread thread = new Thread(new LongRunningTask()); + Timer timer = new Timer(); + TimeOutTask timeOutTask = new TimeOutTask(thread, timer); + thread.start(); + timeOutTask.run(); + assertTrue(thread.isInterrupted()); + } +} \ No newline at end of file From 0947c717100c5f900502c781c0eca83349b264bd Mon Sep 17 00:00:00 2001 From: 515882294 <515882294@qq.com> Date: Wed, 20 Apr 2022 20:02:59 +0800 Subject: [PATCH 075/278] BAEL-5283: Serialize a lambda in Java --- .../NotSerializableLambdaExpression.java | 8 ++ .../SerializableLambdaExpression.java | 10 +++ .../LambdaSerializationUnitTest.java | 77 +++++++++++++++++++ 3 files changed, 95 insertions(+) create mode 100644 core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/serialization/NotSerializableLambdaExpression.java create mode 100644 core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/serialization/SerializableLambdaExpression.java create mode 100644 core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/lambda/serialization/LambdaSerializationUnitTest.java diff --git a/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/serialization/NotSerializableLambdaExpression.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/serialization/NotSerializableLambdaExpression.java new file mode 100644 index 0000000000..38f87e4ba9 --- /dev/null +++ b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/serialization/NotSerializableLambdaExpression.java @@ -0,0 +1,8 @@ +package com.baeldung.java8.lambda.serialization; + +public class NotSerializableLambdaExpression { + public static Object getLambdaExpressionObject() { + Runnable r = () -> System.out.println("please serialize this message"); + return r; + } +} diff --git a/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/serialization/SerializableLambdaExpression.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/serialization/SerializableLambdaExpression.java new file mode 100644 index 0000000000..74541013bb --- /dev/null +++ b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/serialization/SerializableLambdaExpression.java @@ -0,0 +1,10 @@ +package com.baeldung.java8.lambda.serialization; + +import java.io.Serializable; + +public class SerializableLambdaExpression { + public static Object getLambdaExpressionObject() { + Runnable r = (Runnable & Serializable) () -> System.out.println("please serialize this message"); + return r; + } +} diff --git a/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/lambda/serialization/LambdaSerializationUnitTest.java b/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/lambda/serialization/LambdaSerializationUnitTest.java new file mode 100644 index 0000000000..580319c92e --- /dev/null +++ b/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/lambda/serialization/LambdaSerializationUnitTest.java @@ -0,0 +1,77 @@ +package com.baeldung.java8.lambda.serialization; + +import org.junit.Test; + +import java.io.*; +import java.nio.file.Files; +import java.util.function.Consumer; +import java.util.function.Function; + +import static org.junit.Assert.assertTrue; + +public class LambdaSerializationUnitTest { + @Test(expected = NotSerializableException.class) + public void givenRunnable_whenNoCapturing_thenSerializationFailed() throws IOException, ClassNotFoundException { + Object obj = NotSerializableLambdaExpression.getLambdaExpressionObject(); + writeAndReadObject(obj, Runnable.class); + } + + @Test + public void givenIntersectionType_whenNoCapturing_thenSerializationSuccess() throws IOException, ClassNotFoundException { + Object obj = SerializableLambdaExpression.getLambdaExpressionObject(); + writeAndReadObject(obj, Runnable.class); + } + + @Test + public void givenSerializableRunnable_whenNoCapturing_thenSerializationSuccess() throws IOException, ClassNotFoundException { + SerializableRunnable obj = () -> System.out.println("please serialize this message"); + writeAndReadObject(obj, SerializableRunnable.class); + } + + @Test + public void givenSerializableFunction_whenNoCapturing_thenSerializationSuccess() throws IOException, ClassNotFoundException { + SerializableFunction obj = message -> String.format("Hello %s", message); + writeAndReadObject(obj, SerializableFunction.class); + } + + @Test + public void givenSerializableConsumer_whenNoCapturing_thenSerializationSuccess() throws IOException, ClassNotFoundException { + SerializableConsumer obj = System.out::println; + writeAndReadObject(obj, SerializableConsumer.class); + } + + @Test(expected = NotSerializableException.class) + public void givenSerializableConsumer_whenCapturingNotSerializable_thenSerializationFailed() throws IOException, ClassNotFoundException { + SerializableConsumer obj = System.out::println; + writeAndReadObject(obj, SerializableConsumer.class); + } + + private void writeAndReadObject(Object obj, Class clazz) throws IOException, ClassNotFoundException { + File file = Files.createTempFile("lambda", "ser").toFile(); + try ( + FileOutputStream fos = new FileOutputStream(file); + ObjectOutputStream oos = new ObjectOutputStream(fos) + ) { + oos.writeObject(obj); + } + + try ( + FileInputStream fis = new FileInputStream(file); + ObjectInputStream ois = new ObjectInputStream(fis) + ) { + Object newObj = ois.readObject(); + boolean isInstance = clazz.isInstance(newObj); + + assertTrue(isInstance); + } + } + + interface SerializableRunnable extends Runnable, Serializable { + } + + interface SerializableFunction extends Function, Serializable { + } + + interface SerializableConsumer extends Consumer, Serializable { + } +} From c6c8cb4abd76ded6fbbf822799d94eadf6e30a11 Mon Sep 17 00:00:00 2001 From: freelansam <79205526+freelansam@users.noreply.github.com> Date: Wed, 20 Apr 2022 17:53:00 +0530 Subject: [PATCH 076/278] JAVA-10903: Rename HttpClient Modules to Apache HttpClient (#12070) * JAVA-10903: rename httpclient to apache-httpclient * JAVA-10903: rename httpclient-2 to apache-httpclient * JAVA-10903: update main pom --- {httpclient-2 => apache-httpclient-2}/.gitignore | 0 {httpclient-2 => apache-httpclient-2}/README.md | 2 +- {httpclient-2 => apache-httpclient-2}/pom.xml | 6 +++--- .../tlsversion/ClientTlsVersionExamples.java | 0 .../HttpClientGettingCookieValueUnitTest.java | 0 .../expandurl/HttpClientExpandUrlLiveTest.java | 0 .../httpclient/ApacheHttpClientUnitTest.java | 0 .../httpclient/httpclient/GetRequestMockServer.java | 0 .../ApacheHttpClient5UnitTest.java | 0 .../ApacheHttpClientUnitTest.java | 0 .../readresponsebodystring/HttpClientUnitTest.java | 0 .../HttpUrlConnectionUnitTest.java | 0 .../SpringRestTemplateUnitTest.java | 0 .../SpringWebClientUnitTest.java | 0 .../src/test/resources/logback.xml | 0 {httpclient => apache-httpclient}/.gitignore | 0 {httpclient => apache-httpclient}/README.md | 2 +- {httpclient => apache-httpclient}/pom.xml | 6 +++--- .../src/main/resources/logback.xml | 0 .../src/main/resources/temp.txt | 0 .../httpclient/HttpAsyncClientLiveTest.java | 0 .../httpclient/HttpClientMultipartLiveTest.java | 0 .../httpclient/HttpClientRedirectLiveTest.java | 0 .../java/com/baeldung/httpclient/ResponseUtil.java | 0 ...pClientAdvancedConfigurationIntegrationTest.java | 0 .../base/HttpClientBasicPostLiveTest.java | 0 .../httpclient/base/HttpClientLiveTest.java | 0 .../httpclient/base/HttpClientSandboxLiveTest.java | 0 .../HttpClientConnectionManagementLiveTest.java | 0 .../conn/IdleConnectionMonitorThread.java | 0 .../httpclient/conn/MultiHttpClientConnThread.java | 0 .../TesterVersion_MultiHttpClientConnThread.java | 0 .../src/test/resources/.gitignore | 0 .../src/test/resources/test.in | 0 .../src/test/resources/uploads/image.jpg | Bin .../src/test/resources/uploads/sandbox.txt | 0 .../src/test/resources/uploads/temp.txt | 0 .../src/test/resources/uploads/zipFile.zip | Bin pom.xml | 8 ++++---- 39 files changed, 12 insertions(+), 12 deletions(-) rename {httpclient-2 => apache-httpclient-2}/.gitignore (100%) rename {httpclient-2 => apache-httpclient-2}/README.md (94%) rename {httpclient-2 => apache-httpclient-2}/pom.xml (96%) rename {httpclient-2 => apache-httpclient-2}/src/main/java/com/baeldung/tlsversion/ClientTlsVersionExamples.java (100%) rename {httpclient-2 => apache-httpclient-2}/src/test/java/com/baeldung/httpclient/cookies/HttpClientGettingCookieValueUnitTest.java (100%) rename {httpclient-2 => apache-httpclient-2}/src/test/java/com/baeldung/httpclient/expandurl/HttpClientExpandUrlLiveTest.java (100%) rename {httpclient-2 => apache-httpclient-2}/src/test/java/com/baeldung/httpclient/httpclient/ApacheHttpClientUnitTest.java (100%) rename {httpclient-2 => apache-httpclient-2}/src/test/java/com/baeldung/httpclient/httpclient/GetRequestMockServer.java (100%) rename {httpclient-2 => apache-httpclient-2}/src/test/java/com/baeldung/httpclient/readresponsebodystring/ApacheHttpClient5UnitTest.java (100%) rename {httpclient-2 => apache-httpclient-2}/src/test/java/com/baeldung/httpclient/readresponsebodystring/ApacheHttpClientUnitTest.java (100%) rename {httpclient-2 => apache-httpclient-2}/src/test/java/com/baeldung/httpclient/readresponsebodystring/HttpClientUnitTest.java (100%) rename {httpclient-2 => apache-httpclient-2}/src/test/java/com/baeldung/httpclient/readresponsebodystring/HttpUrlConnectionUnitTest.java (100%) rename {httpclient-2 => apache-httpclient-2}/src/test/java/com/baeldung/httpclient/readresponsebodystring/SpringRestTemplateUnitTest.java (100%) rename {httpclient-2 => apache-httpclient-2}/src/test/java/com/baeldung/httpclient/readresponsebodystring/SpringWebClientUnitTest.java (100%) rename {httpclient-2 => apache-httpclient-2}/src/test/resources/logback.xml (100%) rename {httpclient => apache-httpclient}/.gitignore (100%) rename {httpclient => apache-httpclient}/README.md (95%) rename {httpclient => apache-httpclient}/pom.xml (95%) rename {httpclient => apache-httpclient}/src/main/resources/logback.xml (100%) rename {httpclient => apache-httpclient}/src/main/resources/temp.txt (100%) rename {httpclient => apache-httpclient}/src/test/java/com/baeldung/httpclient/HttpAsyncClientLiveTest.java (100%) rename {httpclient => apache-httpclient}/src/test/java/com/baeldung/httpclient/HttpClientMultipartLiveTest.java (100%) rename {httpclient => apache-httpclient}/src/test/java/com/baeldung/httpclient/HttpClientRedirectLiveTest.java (100%) rename {httpclient => apache-httpclient}/src/test/java/com/baeldung/httpclient/ResponseUtil.java (100%) rename {httpclient => apache-httpclient}/src/test/java/com/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfigurationIntegrationTest.java (100%) rename {httpclient => apache-httpclient}/src/test/java/com/baeldung/httpclient/base/HttpClientBasicPostLiveTest.java (100%) rename {httpclient => apache-httpclient}/src/test/java/com/baeldung/httpclient/base/HttpClientLiveTest.java (100%) rename {httpclient => apache-httpclient}/src/test/java/com/baeldung/httpclient/base/HttpClientSandboxLiveTest.java (100%) rename {httpclient => apache-httpclient}/src/test/java/com/baeldung/httpclient/conn/HttpClientConnectionManagementLiveTest.java (100%) rename {httpclient => apache-httpclient}/src/test/java/com/baeldung/httpclient/conn/IdleConnectionMonitorThread.java (100%) rename {httpclient => apache-httpclient}/src/test/java/com/baeldung/httpclient/conn/MultiHttpClientConnThread.java (100%) rename {httpclient => apache-httpclient}/src/test/java/com/baeldung/httpclient/conn/TesterVersion_MultiHttpClientConnThread.java (100%) rename {httpclient => apache-httpclient}/src/test/resources/.gitignore (100%) rename {httpclient => apache-httpclient}/src/test/resources/test.in (100%) rename {httpclient => apache-httpclient}/src/test/resources/uploads/image.jpg (100%) rename {httpclient => apache-httpclient}/src/test/resources/uploads/sandbox.txt (100%) rename {httpclient => apache-httpclient}/src/test/resources/uploads/temp.txt (100%) rename {httpclient => apache-httpclient}/src/test/resources/uploads/zipFile.zip (100%) diff --git a/httpclient-2/.gitignore b/apache-httpclient-2/.gitignore similarity index 100% rename from httpclient-2/.gitignore rename to apache-httpclient-2/.gitignore diff --git a/httpclient-2/README.md b/apache-httpclient-2/README.md similarity index 94% rename from httpclient-2/README.md rename to apache-httpclient-2/README.md index 2e101a0609..338f10d765 100644 --- a/httpclient-2/README.md +++ b/apache-httpclient-2/README.md @@ -14,4 +14,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Enabling Logging for Apache HttpClient](https://www.baeldung.com/apache-httpclient-enable-logging) - [Expand Shortened URLs with Apache HttpClient](https://www.baeldung.com/apache-httpclient-expand-url) - [Apache HttpClient vs. CloseableHttpClient](https://www.baeldung.com/apache-httpclient-vs-closeablehttpclient) -- More articles: [[<-- prev]](../httpclient) +- More articles: [[<-- prev]](../apache-httpclient) diff --git a/httpclient-2/pom.xml b/apache-httpclient-2/pom.xml similarity index 96% rename from httpclient-2/pom.xml rename to apache-httpclient-2/pom.xml index f2da238494..c5b8195472 100644 --- a/httpclient-2/pom.xml +++ b/apache-httpclient-2/pom.xml @@ -3,9 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - httpclient-2 + apache-httpclient-2 0.1-SNAPSHOT - httpclient-2 + apache-httpclient-2 com.baeldung @@ -74,7 +74,7 @@ - httpclient-2 + apache-httpclient-2 src/main/resources diff --git a/httpclient-2/src/main/java/com/baeldung/tlsversion/ClientTlsVersionExamples.java b/apache-httpclient-2/src/main/java/com/baeldung/tlsversion/ClientTlsVersionExamples.java similarity index 100% rename from httpclient-2/src/main/java/com/baeldung/tlsversion/ClientTlsVersionExamples.java rename to apache-httpclient-2/src/main/java/com/baeldung/tlsversion/ClientTlsVersionExamples.java diff --git a/httpclient-2/src/test/java/com/baeldung/httpclient/cookies/HttpClientGettingCookieValueUnitTest.java b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/cookies/HttpClientGettingCookieValueUnitTest.java similarity index 100% rename from httpclient-2/src/test/java/com/baeldung/httpclient/cookies/HttpClientGettingCookieValueUnitTest.java rename to apache-httpclient-2/src/test/java/com/baeldung/httpclient/cookies/HttpClientGettingCookieValueUnitTest.java diff --git a/httpclient-2/src/test/java/com/baeldung/httpclient/expandurl/HttpClientExpandUrlLiveTest.java b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/expandurl/HttpClientExpandUrlLiveTest.java similarity index 100% rename from httpclient-2/src/test/java/com/baeldung/httpclient/expandurl/HttpClientExpandUrlLiveTest.java rename to apache-httpclient-2/src/test/java/com/baeldung/httpclient/expandurl/HttpClientExpandUrlLiveTest.java diff --git a/httpclient-2/src/test/java/com/baeldung/httpclient/httpclient/ApacheHttpClientUnitTest.java b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/httpclient/ApacheHttpClientUnitTest.java similarity index 100% rename from httpclient-2/src/test/java/com/baeldung/httpclient/httpclient/ApacheHttpClientUnitTest.java rename to apache-httpclient-2/src/test/java/com/baeldung/httpclient/httpclient/ApacheHttpClientUnitTest.java diff --git a/httpclient-2/src/test/java/com/baeldung/httpclient/httpclient/GetRequestMockServer.java b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/httpclient/GetRequestMockServer.java similarity index 100% rename from httpclient-2/src/test/java/com/baeldung/httpclient/httpclient/GetRequestMockServer.java rename to apache-httpclient-2/src/test/java/com/baeldung/httpclient/httpclient/GetRequestMockServer.java diff --git a/httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/ApacheHttpClient5UnitTest.java b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/ApacheHttpClient5UnitTest.java similarity index 100% rename from httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/ApacheHttpClient5UnitTest.java rename to apache-httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/ApacheHttpClient5UnitTest.java diff --git a/httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/ApacheHttpClientUnitTest.java b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/ApacheHttpClientUnitTest.java similarity index 100% rename from httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/ApacheHttpClientUnitTest.java rename to apache-httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/ApacheHttpClientUnitTest.java diff --git a/httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/HttpClientUnitTest.java b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/HttpClientUnitTest.java similarity index 100% rename from httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/HttpClientUnitTest.java rename to apache-httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/HttpClientUnitTest.java diff --git a/httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/HttpUrlConnectionUnitTest.java b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/HttpUrlConnectionUnitTest.java similarity index 100% rename from httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/HttpUrlConnectionUnitTest.java rename to apache-httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/HttpUrlConnectionUnitTest.java diff --git a/httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/SpringRestTemplateUnitTest.java b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/SpringRestTemplateUnitTest.java similarity index 100% rename from httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/SpringRestTemplateUnitTest.java rename to apache-httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/SpringRestTemplateUnitTest.java diff --git a/httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/SpringWebClientUnitTest.java b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/SpringWebClientUnitTest.java similarity index 100% rename from httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/SpringWebClientUnitTest.java rename to apache-httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/SpringWebClientUnitTest.java diff --git a/httpclient-2/src/test/resources/logback.xml b/apache-httpclient-2/src/test/resources/logback.xml similarity index 100% rename from httpclient-2/src/test/resources/logback.xml rename to apache-httpclient-2/src/test/resources/logback.xml diff --git a/httpclient/.gitignore b/apache-httpclient/.gitignore similarity index 100% rename from httpclient/.gitignore rename to apache-httpclient/.gitignore diff --git a/httpclient/README.md b/apache-httpclient/README.md similarity index 95% rename from httpclient/README.md rename to apache-httpclient/README.md index ea3bc28572..d7dddeb907 100644 --- a/httpclient/README.md +++ b/apache-httpclient/README.md @@ -17,4 +17,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Apache HttpClient – Do Not Follow Redirects](https://www.baeldung.com/httpclient-stop-follow-redirect) - [Custom User-Agent in Apache HttpClient](https://www.baeldung.com/httpclient-user-agent-header) - [Apache HttpClient Connection Management](https://www.baeldung.com/httpclient-connection-management) -- More articles: [[next -->]](../httpclient-2) +- More articles: [[next -->]](../apache-httpclient-2) diff --git a/httpclient/pom.xml b/apache-httpclient/pom.xml similarity index 95% rename from httpclient/pom.xml rename to apache-httpclient/pom.xml index b69981fb13..26eb319ac0 100644 --- a/httpclient/pom.xml +++ b/apache-httpclient/pom.xml @@ -3,9 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - httpclient + apache-httpclient 0.1-SNAPSHOT - httpclient + apache-httpclient com.baeldung @@ -63,7 +63,7 @@ - httpclient + apache-httpclient src/main/resources diff --git a/httpclient/src/main/resources/logback.xml b/apache-httpclient/src/main/resources/logback.xml similarity index 100% rename from httpclient/src/main/resources/logback.xml rename to apache-httpclient/src/main/resources/logback.xml diff --git a/httpclient/src/main/resources/temp.txt b/apache-httpclient/src/main/resources/temp.txt similarity index 100% rename from httpclient/src/main/resources/temp.txt rename to apache-httpclient/src/main/resources/temp.txt diff --git a/httpclient/src/test/java/com/baeldung/httpclient/HttpAsyncClientLiveTest.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpAsyncClientLiveTest.java similarity index 100% rename from httpclient/src/test/java/com/baeldung/httpclient/HttpAsyncClientLiveTest.java rename to apache-httpclient/src/test/java/com/baeldung/httpclient/HttpAsyncClientLiveTest.java diff --git a/httpclient/src/test/java/com/baeldung/httpclient/HttpClientMultipartLiveTest.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpClientMultipartLiveTest.java similarity index 100% rename from httpclient/src/test/java/com/baeldung/httpclient/HttpClientMultipartLiveTest.java rename to apache-httpclient/src/test/java/com/baeldung/httpclient/HttpClientMultipartLiveTest.java diff --git a/httpclient/src/test/java/com/baeldung/httpclient/HttpClientRedirectLiveTest.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpClientRedirectLiveTest.java similarity index 100% rename from httpclient/src/test/java/com/baeldung/httpclient/HttpClientRedirectLiveTest.java rename to apache-httpclient/src/test/java/com/baeldung/httpclient/HttpClientRedirectLiveTest.java diff --git a/httpclient/src/test/java/com/baeldung/httpclient/ResponseUtil.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/ResponseUtil.java similarity index 100% rename from httpclient/src/test/java/com/baeldung/httpclient/ResponseUtil.java rename to apache-httpclient/src/test/java/com/baeldung/httpclient/ResponseUtil.java diff --git a/httpclient/src/test/java/com/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfigurationIntegrationTest.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfigurationIntegrationTest.java similarity index 100% rename from httpclient/src/test/java/com/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfigurationIntegrationTest.java rename to apache-httpclient/src/test/java/com/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfigurationIntegrationTest.java diff --git a/httpclient/src/test/java/com/baeldung/httpclient/base/HttpClientBasicPostLiveTest.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/base/HttpClientBasicPostLiveTest.java similarity index 100% rename from httpclient/src/test/java/com/baeldung/httpclient/base/HttpClientBasicPostLiveTest.java rename to apache-httpclient/src/test/java/com/baeldung/httpclient/base/HttpClientBasicPostLiveTest.java diff --git a/httpclient/src/test/java/com/baeldung/httpclient/base/HttpClientLiveTest.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/base/HttpClientLiveTest.java similarity index 100% rename from httpclient/src/test/java/com/baeldung/httpclient/base/HttpClientLiveTest.java rename to apache-httpclient/src/test/java/com/baeldung/httpclient/base/HttpClientLiveTest.java diff --git a/httpclient/src/test/java/com/baeldung/httpclient/base/HttpClientSandboxLiveTest.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/base/HttpClientSandboxLiveTest.java similarity index 100% rename from httpclient/src/test/java/com/baeldung/httpclient/base/HttpClientSandboxLiveTest.java rename to apache-httpclient/src/test/java/com/baeldung/httpclient/base/HttpClientSandboxLiveTest.java diff --git a/httpclient/src/test/java/com/baeldung/httpclient/conn/HttpClientConnectionManagementLiveTest.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/conn/HttpClientConnectionManagementLiveTest.java similarity index 100% rename from httpclient/src/test/java/com/baeldung/httpclient/conn/HttpClientConnectionManagementLiveTest.java rename to apache-httpclient/src/test/java/com/baeldung/httpclient/conn/HttpClientConnectionManagementLiveTest.java diff --git a/httpclient/src/test/java/com/baeldung/httpclient/conn/IdleConnectionMonitorThread.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/conn/IdleConnectionMonitorThread.java similarity index 100% rename from httpclient/src/test/java/com/baeldung/httpclient/conn/IdleConnectionMonitorThread.java rename to apache-httpclient/src/test/java/com/baeldung/httpclient/conn/IdleConnectionMonitorThread.java diff --git a/httpclient/src/test/java/com/baeldung/httpclient/conn/MultiHttpClientConnThread.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/conn/MultiHttpClientConnThread.java similarity index 100% rename from httpclient/src/test/java/com/baeldung/httpclient/conn/MultiHttpClientConnThread.java rename to apache-httpclient/src/test/java/com/baeldung/httpclient/conn/MultiHttpClientConnThread.java diff --git a/httpclient/src/test/java/com/baeldung/httpclient/conn/TesterVersion_MultiHttpClientConnThread.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/conn/TesterVersion_MultiHttpClientConnThread.java similarity index 100% rename from httpclient/src/test/java/com/baeldung/httpclient/conn/TesterVersion_MultiHttpClientConnThread.java rename to apache-httpclient/src/test/java/com/baeldung/httpclient/conn/TesterVersion_MultiHttpClientConnThread.java diff --git a/httpclient/src/test/resources/.gitignore b/apache-httpclient/src/test/resources/.gitignore similarity index 100% rename from httpclient/src/test/resources/.gitignore rename to apache-httpclient/src/test/resources/.gitignore diff --git a/httpclient/src/test/resources/test.in b/apache-httpclient/src/test/resources/test.in similarity index 100% rename from httpclient/src/test/resources/test.in rename to apache-httpclient/src/test/resources/test.in diff --git a/httpclient/src/test/resources/uploads/image.jpg b/apache-httpclient/src/test/resources/uploads/image.jpg similarity index 100% rename from httpclient/src/test/resources/uploads/image.jpg rename to apache-httpclient/src/test/resources/uploads/image.jpg diff --git a/httpclient/src/test/resources/uploads/sandbox.txt b/apache-httpclient/src/test/resources/uploads/sandbox.txt similarity index 100% rename from httpclient/src/test/resources/uploads/sandbox.txt rename to apache-httpclient/src/test/resources/uploads/sandbox.txt diff --git a/httpclient/src/test/resources/uploads/temp.txt b/apache-httpclient/src/test/resources/uploads/temp.txt similarity index 100% rename from httpclient/src/test/resources/uploads/temp.txt rename to apache-httpclient/src/test/resources/uploads/temp.txt diff --git a/httpclient/src/test/resources/uploads/zipFile.zip b/apache-httpclient/src/test/resources/uploads/zipFile.zip similarity index 100% rename from httpclient/src/test/resources/uploads/zipFile.zip rename to apache-httpclient/src/test/resources/uploads/zipFile.zip diff --git a/pom.xml b/pom.xml index e47d3aa4dd..25aeebef9d 100644 --- a/pom.xml +++ b/pom.xml @@ -425,7 +425,7 @@ hazelcast helidon - httpclient + apache-httpclient httpclient-simple hystrix @@ -906,7 +906,7 @@ hazelcast helidon - httpclient + apache-httpclient httpclient-simple hystrix @@ -1340,7 +1340,7 @@ core-java-modules/core-java-strings ddd-modules docker - httpclient-2 + apache-httpclient-2 libraries-concurrency persistence-modules/sirix persistence-modules/spring-data-cassandra-2 @@ -1407,7 +1407,7 @@ core-java-modules/core-java-strings ddd-modules docker - httpclient-2 + apache-httpclient-2 libraries-concurrency persistence-modules/sirix persistence-modules/spring-data-cassandra-2 From 686fc5a0e533487af95e7a3753b08c8131336bb4 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Wed, 20 Apr 2022 18:06:56 +0530 Subject: [PATCH 077/278] Update README.md (#12102) --- apache-httpclient/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apache-httpclient/README.md b/apache-httpclient/README.md index d7dddeb907..dda2acdf89 100644 --- a/apache-httpclient/README.md +++ b/apache-httpclient/README.md @@ -1,6 +1,6 @@ -## HttpClient 4.x +## Apache HttpClient -This module contains articles about HttpClient 4.x +This module contains articles about Apache HttpClient ### The Course From 499e248d4c20073d5e3d46a2bc44fbcec256a665 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Wed, 20 Apr 2022 18:07:08 +0530 Subject: [PATCH 078/278] Update README.md (#12103) --- apache-httpclient-2/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apache-httpclient-2/README.md b/apache-httpclient-2/README.md index 338f10d765..45f1e41637 100644 --- a/apache-httpclient-2/README.md +++ b/apache-httpclient-2/README.md @@ -1,6 +1,6 @@ -## HttpClient 4.x +## Apache HttpClient -This module contains articles about HttpClient 4.x +This module contains articles about Apache HttpClient ### The Course From 33f136355578c4566356a1eaceea9e3cdf219098 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Wed, 20 Apr 2022 22:50:27 +0800 Subject: [PATCH 079/278] Update README.md --- libraries-3/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries-3/README.md b/libraries-3/README.md index b267e82ed9..99b1b60a0a 100644 --- a/libraries-3/README.md +++ b/libraries-3/README.md @@ -16,6 +16,6 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m - [Introduction to Takes](https://www.baeldung.com/java-takes) - [Using NullAway to Avoid NullPointerExceptions](https://www.baeldung.com/java-nullaway) - [Introduction to Alibaba Arthas](https://www.baeldung.com/java-alibaba-arthas-intro) -- [Introduction to Structurizr](https://www.baeldung.com/structurizr) +- [Intro to Structurizr](https://www.baeldung.com/structurizr) - [Introduction to Immutables](https://www.baeldung.com/immutables) - More articles [[<-- prev]](../libraries-2) [[next -->]](../libraries-4) From 70b5ee06e0a0088987542a7842ddf3f5ae46a539 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Wed, 20 Apr 2022 22:52:32 +0800 Subject: [PATCH 080/278] Update README.md --- apache-httpclient/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache-httpclient/README.md b/apache-httpclient/README.md index dda2acdf89..338b416df1 100644 --- a/apache-httpclient/README.md +++ b/apache-httpclient/README.md @@ -13,7 +13,7 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Multipart Upload with Apache HttpClient](https://www.baeldung.com/httpclient-multipart-upload) - [Apache HttpAsyncClient Tutorial](https://www.baeldung.com/httpasyncclient-tutorial) - [Apache HttpClient Tutorial](https://www.baeldung.com/httpclient-guide) -- [Advanced HttpClient Configuration](https://www.baeldung.com/httpclient-advanced-config) +- [Advanced Apache HttpClient Configuration](https://www.baeldung.com/httpclient-advanced-config) - [Apache HttpClient – Do Not Follow Redirects](https://www.baeldung.com/httpclient-stop-follow-redirect) - [Custom User-Agent in Apache HttpClient](https://www.baeldung.com/httpclient-user-agent-header) - [Apache HttpClient Connection Management](https://www.baeldung.com/httpclient-connection-management) From 30c3679e4fc8249cfa21a12f84650a68c9b57104 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Wed, 20 Apr 2022 23:32:16 +0800 Subject: [PATCH 081/278] Update README.md --- spring-boot-modules/spring-boot-crud/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-boot-modules/spring-boot-crud/README.md b/spring-boot-modules/spring-boot-crud/README.md index 3d3d8f42d7..6b0032deb3 100644 --- a/spring-boot-modules/spring-boot-crud/README.md +++ b/spring-boot-modules/spring-boot-crud/README.md @@ -5,4 +5,3 @@ This module contains articles about Spring Boot CRUD Operations ### Relevant Articles: - [Spring Boot CRUD Application with Thymeleaf](https://www.baeldung.com/spring-boot-crud-thymeleaf) - [Using a Spring Boot Application as a Dependency](https://www.baeldung.com/spring-boot-dependency) -- [A Guide to Spring in Eclipse STS](https://www.baeldung.com/eclipse-sts-spring) \ No newline at end of file From 320ddd421d14335adf88d278f76681f0aac6137e Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Wed, 20 Apr 2022 23:32:53 +0800 Subject: [PATCH 082/278] Update README.md --- spring-boot-modules/spring-boot-mvc-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-modules/spring-boot-mvc-4/README.md b/spring-boot-modules/spring-boot-mvc-4/README.md index 68fcfa8b6b..a05aa3c7b9 100644 --- a/spring-boot-modules/spring-boot-mvc-4/README.md +++ b/spring-boot-modules/spring-boot-mvc-4/README.md @@ -7,4 +7,5 @@ This module contains articles about Spring Web MVC in Spring Boot projects. - [How to Register a Servlet in Java](https://www.baeldung.com/register-servlet) - [Guide to Spring WebUtils and ServletRequestUtils](https://www.baeldung.com/spring-webutils-servletrequestutils) - [Configure a Spring Boot Web Application](https://www.baeldung.com/spring-boot-application-configuration) +- [A Guide to Spring in Eclipse STS](https://www.baeldung.com/eclipse-sts-spring) - More articles: [[<-- Prev]](/spring-boot-modules/spring-boot-mvc-3) From ce2839b0588d3f3b8a9f51d1fb86bb9abdea7a6c Mon Sep 17 00:00:00 2001 From: Muhammad Abdullah Azam Khan Date: Thu, 21 Apr 2022 16:01:36 +0400 Subject: [PATCH 083/278] Return Map from GraphQL (#11966) * Return Map from GraphQL Three techniques have been used 1. Return as Json String 2. Return Json using GraphQL scalar type 3. Return as list of key-value pair * Adding custom scalar in plugin configuration * Build failure fix 1. Integrating the .graphqls files 2. Updating the respective query resolvers * Build failure Fix 1. Removed the extra .graphql file 2. Added ExtendedGraphQLScalarType class because the parent class didn't have default constructor and the client code generation plugin was requiring it. * Code refactoring * Code refactoring --- graphql/graphql-java/pom.xml | 34 +++++++++++- .../baeldung/graphql/server/GraphQLQuery.java | 9 ++++ .../baeldung/graphqlreturnmap/AppHandler.java | 52 +++++++++++++++++++ .../ExtendedGraphQLScalarType.java | 24 +++++++++ .../graphqlreturnmap/GraphqlReturnMap.java | 12 +++++ .../graphqlreturnmap/entity/Attribute.java | 46 ++++++++++++++++ .../graphqlreturnmap/entity/Product.java | 48 +++++++++++++++++ .../model/AttributeKeyValueModel.java | 30 +++++++++++ .../repository/ProductRepository.java | 12 +++++ .../impl/ProductRepositoryImpl.java | 43 +++++++++++++++ .../resolver/ProductResolver.java | 30 +++++++++++ .../graphqlreturnmap/resolver/Query.java | 33 ++++++++++++ .../src/main/resources/schema.graphqls | 26 ++++++++++ 13 files changed, 398 insertions(+), 1 deletion(-) create mode 100644 graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/AppHandler.java create mode 100644 graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/ExtendedGraphQLScalarType.java create mode 100644 graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/GraphqlReturnMap.java create mode 100644 graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/entity/Attribute.java create mode 100644 graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/entity/Product.java create mode 100644 graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/model/AttributeKeyValueModel.java create mode 100644 graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/repository/ProductRepository.java create mode 100644 graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/repository/impl/ProductRepositoryImpl.java create mode 100644 graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/resolver/ProductResolver.java create mode 100644 graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/resolver/Query.java diff --git a/graphql/graphql-java/pom.xml b/graphql/graphql-java/pom.xml index 5808dd17fb..068cb04ea8 100644 --- a/graphql/graphql-java/pom.xml +++ b/graphql/graphql-java/pom.xml @@ -36,6 +36,21 @@ graphql-java-annotations ${graphql-java-annotations.version} + + io.ratpack + ratpack-core + ${ratpack-core.version} + + + com.github.americanexpress.nodes + nodes + 0.5.0 + + + com.graphql-java + graphql-java + 11.0 + com.graphql-java graphql-java-tools @@ -95,6 +110,14 @@ ${mockserver-client-java.version} test + + + com.graphql-java + graphql-java-extended-scalars + ${graphql-java-extended-scalars.version} + + + @@ -133,6 +156,13 @@ false false true + + + JSON + java.util.Map + com.baeldung.graphqlreturnmap.ExtendedGraphQLScalarType + + @@ -154,6 +184,8 @@ 1.8 1.8 + 1.18 + 2022-04-06T00-10-27-a70541e - \ No newline at end of file + diff --git a/graphql/graphql-java/src/main/java/com/baeldung/graphql/server/GraphQLQuery.java b/graphql/graphql-java/src/main/java/com/baeldung/graphql/server/GraphQLQuery.java index 8ba9fa25c5..f2ac792e80 100644 --- a/graphql/graphql-java/src/main/java/com/baeldung/graphql/server/GraphQLQuery.java +++ b/graphql/graphql-java/src/main/java/com/baeldung/graphql/server/GraphQLQuery.java @@ -2,6 +2,7 @@ package com.baeldung.graphql.server; import com.baeldung.graphql.data.Book; import com.baeldung.graphql.data.BookRepository; +import com.baeldung.graphqlreturnmap.entity.Product; import com.coxautodev.graphql.tools.GraphQLQueryResolver; import java.util.List; @@ -18,4 +19,12 @@ public class GraphQLQuery implements GraphQLQueryResolver { return repository.getAllBooks(); } + public List getProducts(int pageSize, int pageNumber) { + return null; + } + + public Product getProduct(int id) { + return null; + } + } diff --git a/graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/AppHandler.java b/graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/AppHandler.java new file mode 100644 index 0000000000..26ad0eef2c --- /dev/null +++ b/graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/AppHandler.java @@ -0,0 +1,52 @@ +package com.baeldung.graphqlreturnmap; + +import com.baeldung.graphql.utils.SchemaUtils; +import com.baeldung.graphqlreturnmap.resolver.ProductResolver; +import com.baeldung.graphqlreturnmap.resolver.Query; +import com.coxautodev.graphql.tools.SchemaParser; +import graphql.ExecutionResult; +import graphql.GraphQL; +import graphql.scalars.ExtendedScalars; +import graphql.schema.GraphQLSchema; +import ratpack.handling.Context; +import ratpack.handling.Handler; + +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.logging.Logger; + +import static ratpack.jackson.Jackson.json; + +public class AppHandler implements Handler { + private static final Logger LOGGER = Logger.getLogger(AppHandler.class.getSimpleName()); + private GraphQL graphql; + + public AppHandler() throws Exception { + GraphQLSchema schema = SchemaParser.newParser() + .resolvers(new Query(), new ProductResolver()) + .scalars(ExtendedScalars.Json) + .file("schema.graphqls") + .build() + .makeExecutableSchema(); + graphql = GraphQL.newGraphQL(schema).build(); + } + + @Override + public void handle(Context context) throws Exception { + context.parse(Map.class) + .then(payload -> { + ExecutionResult executionResult = graphql.execute(payload.get(SchemaUtils.QUERY) + .toString(), null, this, Collections.emptyMap()); + Map result = new LinkedHashMap<>(); + if (executionResult.getErrors() + .isEmpty()) { + result.put(SchemaUtils.DATA, executionResult.getData()); + } else { + result.put(SchemaUtils.ERRORS, executionResult.getErrors()); + LOGGER.warning("Errors: " + executionResult.getErrors()); + } + context.render(json(result)); + }); + } +} diff --git a/graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/ExtendedGraphQLScalarType.java b/graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/ExtendedGraphQLScalarType.java new file mode 100644 index 0000000000..5cdc72b13d --- /dev/null +++ b/graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/ExtendedGraphQLScalarType.java @@ -0,0 +1,24 @@ +package com.baeldung.graphqlreturnmap; + +import graphql.language.ScalarTypeDefinition; +import graphql.schema.Coercing; +import graphql.schema.GraphQLDirective; +import graphql.schema.GraphQLScalarType; + +import java.util.List; + +public class ExtendedGraphQLScalarType extends GraphQLScalarType { + + public ExtendedGraphQLScalarType(){ + super("","",null); + + } + + public ExtendedGraphQLScalarType(String name, String description, Coercing coercing) { + super(name, description, coercing); + } + + public ExtendedGraphQLScalarType(String name, String description, Coercing coercing, List directives, ScalarTypeDefinition definition) { + super(name, description, coercing, directives, definition); + } +} diff --git a/graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/GraphqlReturnMap.java b/graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/GraphqlReturnMap.java new file mode 100644 index 0000000000..8717fcb722 --- /dev/null +++ b/graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/GraphqlReturnMap.java @@ -0,0 +1,12 @@ +package com.baeldung.graphqlreturnmap; + +import ratpack.server.RatpackServer; + +public class GraphqlReturnMap { + + public static void main(String[] args) throws Exception { + final RatpackServer server = RatpackServer.of(s -> s.handlers(chain -> chain.post("product", new AppHandler()))); + server.start(); + } + +} \ No newline at end of file diff --git a/graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/entity/Attribute.java b/graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/entity/Attribute.java new file mode 100644 index 0000000000..dd2766afa5 --- /dev/null +++ b/graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/entity/Attribute.java @@ -0,0 +1,46 @@ +package com.baeldung.graphqlreturnmap.entity; + +public class Attribute { + private String name; + private String description; + private String unit; + + public Attribute(String name, String description, String unit){ + this.name = name; + this.description = description; + this.unit = unit; + } + + 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; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + @Override + public String toString() { + return "Attribute{" + + "name='" + name + '\'' + + ", description='" + description + '\'' + + ", unit='" + unit + '\'' + + '}'; + } +} diff --git a/graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/entity/Product.java b/graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/entity/Product.java new file mode 100644 index 0000000000..db39d763de --- /dev/null +++ b/graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/entity/Product.java @@ -0,0 +1,48 @@ +package com.baeldung.graphqlreturnmap.entity; + + +import java.util.Map; + +public class Product { + private Integer id; + private String name; + private String description; + private Map attributes; + + + public Product(){ + + } + + public Integer getId() { + return id; + } + + public void setId(Integer 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; + } + + public Map getAttributes() { + return attributes; + } + + public void setAttributes(Map attributes) { + this.attributes = attributes; + } +} diff --git a/graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/model/AttributeKeyValueModel.java b/graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/model/AttributeKeyValueModel.java new file mode 100644 index 0000000000..bb7641143b --- /dev/null +++ b/graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/model/AttributeKeyValueModel.java @@ -0,0 +1,30 @@ +package com.baeldung.graphqlreturnmap.model; + + +import com.baeldung.graphqlreturnmap.entity.Attribute; + +public class AttributeKeyValueModel { + private String key; + private Attribute value; + + public AttributeKeyValueModel(String key, Attribute value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public Attribute getValue() { + return value; + } + + public void setValue(Attribute value) { + this.value = value; + } +} diff --git a/graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/repository/ProductRepository.java b/graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/repository/ProductRepository.java new file mode 100644 index 0000000000..c751efc183 --- /dev/null +++ b/graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/repository/ProductRepository.java @@ -0,0 +1,12 @@ +package com.baeldung.graphqlreturnmap.repository; + + +import com.baeldung.graphqlreturnmap.entity.Product; + +import java.util.List; + +public interface ProductRepository { + List getProducts(Integer pageSize, Integer pageNumber); + Product getProduct(Integer id); + +} diff --git a/graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/repository/impl/ProductRepositoryImpl.java b/graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/repository/impl/ProductRepositoryImpl.java new file mode 100644 index 0000000000..466a2149f4 --- /dev/null +++ b/graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/repository/impl/ProductRepositoryImpl.java @@ -0,0 +1,43 @@ +package com.baeldung.graphqlreturnmap.repository.impl; + +import com.baeldung.graphqlreturnmap.entity.Attribute; +import com.baeldung.graphqlreturnmap.entity.Product; +import com.baeldung.graphqlreturnmap.repository.ProductRepository; +import org.springframework.stereotype.Repository; + +import java.util.*; +import java.util.stream.Collectors; + +@Repository +public class ProductRepositoryImpl implements ProductRepository { + + private static List productList = new ArrayList<>(); + + public ProductRepositoryImpl() { + for (int i = 1; i <= 10; i++){ + Product product = new Product(); + product.setId(i); + product.setName(String.format("Product %d", i)); + product.setDescription(String.format("Product %d description", i)); + product.setAttributes(createAttributes(i)); + productList.add(product); + } + } + + private Map createAttributes(int i) { + Map attributeMap = new HashMap<>(); + attributeMap.put(String.format("attribute_%d",i), new Attribute(String.format("Attribute%d name",i),"This is custom attribute description","This is custom attribute unit")); + attributeMap.put("size", new Attribute((i & 1) == 0 ? "Small" : "Large","This is custom attribute description","This is custom attribute unit")); + return attributeMap; + } + + @Override + public List getProducts(Integer pageSize, Integer pageNumber) { + return productList.stream().skip(pageSize*pageNumber).limit(pageSize).collect(Collectors.toList()); + } + + @Override + public Product getProduct(Integer id) { + return productList.stream().filter(product -> product.getId().equals(id)).findFirst().orElse(null); + } +} diff --git a/graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/resolver/ProductResolver.java b/graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/resolver/ProductResolver.java new file mode 100644 index 0000000000..d9789ea0c6 --- /dev/null +++ b/graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/resolver/ProductResolver.java @@ -0,0 +1,30 @@ +package com.baeldung.graphqlreturnmap.resolver; + +import com.baeldung.graphqlreturnmap.entity.Product; +import com.baeldung.graphqlreturnmap.model.AttributeKeyValueModel; +import com.coxautodev.graphql.tools.GraphQLResolver; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.util.LinkedList; +import java.util.List; + +public class ProductResolver implements GraphQLResolver { + public ProductResolver(){ + } + + public List getAttribute_list(Product product){ + List attributeModelList = new LinkedList<>(); + product.getAttributes().forEach((key, val) -> attributeModelList.add(new AttributeKeyValueModel(key, val))); + return attributeModelList; + } + + public String getAttribute_string(Product product){ + try { + return new ObjectMapper().writeValueAsString(product.getAttributes()); + } catch (JsonProcessingException e) { + e.printStackTrace(); + return ""; + } + } +} diff --git a/graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/resolver/Query.java b/graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/resolver/Query.java new file mode 100644 index 0000000000..cbcff6056b --- /dev/null +++ b/graphql/graphql-java/src/main/java/com/baeldung/graphqlreturnmap/resolver/Query.java @@ -0,0 +1,33 @@ +package com.baeldung.graphqlreturnmap.resolver; + +import com.baeldung.graphql.data.Book; +import com.baeldung.graphqlreturnmap.entity.Product; +import com.baeldung.graphqlreturnmap.repository.ProductRepository; +import com.baeldung.graphqlreturnmap.repository.impl.ProductRepositoryImpl; +import com.coxautodev.graphql.tools.GraphQLQueryResolver; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +public class Query implements GraphQLQueryResolver { + + @Autowired + private ProductRepository productRepository; + public Query(){ + productRepository = new ProductRepositoryImpl(); + } + + public List getProducts(int pageSize, int pageNumber) { + return productRepository.getProducts(pageSize, pageNumber); + } + + public Product getProduct(int id) { + return productRepository.getProduct(id); + } + + public List allBooks() { + return null; + } + + +} diff --git a/graphql/graphql-java/src/main/resources/schema.graphqls b/graphql/graphql-java/src/main/resources/schema.graphqls index b0834e04b7..da10cd18bd 100644 --- a/graphql/graphql-java/src/main/resources/schema.graphqls +++ b/graphql/graphql-java/src/main/resources/schema.graphqls @@ -10,8 +10,34 @@ type Author { type Query { allBooks: [Book] + products(size: Int, page: Int): [Product]! + product(id: Int): Product! } + + +type Product { + id: ID + name: String! + description: String + attribute_string:String + attribute_list:[AttributeKeyValuePair] + attributes: JSON +} + +type AttributeKeyValuePair { + key:String + value:Attribute +} + +type Attribute { + name:String + description:String + unit:String +} +scalar JSON + + schema { query: Query } \ No newline at end of file From 7093bdc456b4932883f2bb5150ec3c297c0ca535 Mon Sep 17 00:00:00 2001 From: Christian Jaimes Date: Thu, 21 Apr 2022 09:29:37 -0400 Subject: [PATCH 084/278] added randomDirection method to Enum. Created RandomEnumGenerator. Added corresponding Unit Tests --- .../java/com/baeldung/enums/Direction.java | 14 ++++++++++ .../baeldung/enums/RandomEnumGenerator.java | 17 ++++++++++++ .../baeldung/enums/RandomEnumUnitTest.java | 27 +++++++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/RandomEnumGenerator.java create mode 100644 core-java-modules/core-java-lang-oop-types-2/src/test/java/com/baeldung/enums/RandomEnumUnitTest.java diff --git a/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/Direction.java b/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/Direction.java index 935aca4d65..76b63bdf50 100644 --- a/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/Direction.java +++ b/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/Direction.java @@ -1,11 +1,25 @@ package com.baeldung.enums; +import java.util.Random; + /** * Represents directions. */ public enum Direction { EAST, WEST, SOUTH, NORTH; + private static final Random PRNG = new Random(); + + /** + * Generate a random direction. + * + * @return a random direction + */ + public static Direction randomDirection() { + Direction[] directions = values(); + return directions[PRNG.nextInt(directions.length)]; + } + /** * Finds direction by name. * diff --git a/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/RandomEnumGenerator.java b/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/RandomEnumGenerator.java new file mode 100644 index 0000000000..ea27286044 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/RandomEnumGenerator.java @@ -0,0 +1,17 @@ +package com.baeldung.enums; + +import java.util.Random; + +public class RandomEnumGenerator> { + + private static final Random PRNG = new Random(); + private final T[] values; + + public RandomEnumGenerator(Class e) { + values = e.getEnumConstants(); + } + + public T randomEnum() { + return values[PRNG.nextInt(values.length)]; + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-oop-types-2/src/test/java/com/baeldung/enums/RandomEnumUnitTest.java b/core-java-modules/core-java-lang-oop-types-2/src/test/java/com/baeldung/enums/RandomEnumUnitTest.java new file mode 100644 index 0000000000..937b376c29 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-types-2/src/test/java/com/baeldung/enums/RandomEnumUnitTest.java @@ -0,0 +1,27 @@ +package com.baeldung.enums; + +import org.assertj.core.api.Assertions; +import org.junit.Test; + +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; + +public class RandomEnumUnitTest { + + @Test + public void givenEnumType_whenUsingStaticMethod_valueIsRandomlyGenerated() { + Direction direction = Direction.randomDirection(); + assertThat(direction).isNotNull(); + assertThat(direction instanceof Direction); + } + + @Test + public void givenEnumType_whenGeneratingRandomValue_valueIsOfClassAndNotNull() { + RandomEnumGenerator reg = new RandomEnumGenerator(Direction.class); + Object direction = reg.randomEnum(); + assertThat(direction).isNotNull(); + assertThat(direction instanceof Direction); + } +} From c05421898ac7f79f95c357acf40e449c65ebba38 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Sat, 23 Apr 2022 16:02:31 +0200 Subject: [PATCH 085/278] listOfLists article (#12078) --- .../list/listoflists/ListOfListsUnitTest.java | 74 +++++++++++++++++++ .../test/resources/listoflists/example.csv | 3 + 2 files changed, 77 insertions(+) create mode 100644 core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/listoflists/ListOfListsUnitTest.java create mode 100644 core-java-modules/core-java-collections-list-3/src/test/resources/listoflists/example.csv diff --git a/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/listoflists/ListOfListsUnitTest.java b/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/listoflists/ListOfListsUnitTest.java new file mode 100644 index 0000000000..321fa475f6 --- /dev/null +++ b/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/listoflists/ListOfListsUnitTest.java @@ -0,0 +1,74 @@ +package com.baeldung.list.listoflists; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.junit.jupiter.api.Test; + +public class ListOfListsUnitTest { + + private List> getListOfListsFromCsv() throws URISyntaxException, IOException { + + List lines = Files.readAllLines(Paths.get(getClass().getResource("/listoflists/example.csv") + .toURI())); + List> listOfLists = new ArrayList<>(); + + lines.forEach(line -> { + List innerList = new ArrayList<>(Arrays.asList(line.split(", "))); + listOfLists.add(innerList); + }); + return listOfLists; + } + + private void printListOfLists(List> listOfLists) { + System.out.println("\n List of Lists "); + System.out.println("-------------------------------------"); + listOfLists.forEach(innerList -> { + String line = String.join(", ", innerList); + System.out.println(line); + }); + } + + @Test + void givenCsv_whenInitListOfLists_thenGetExpectedResults() throws URISyntaxException, IOException { + List> listOfLists = getListOfListsFromCsv(); + assertThat(listOfLists).hasSize(3); + assertThat(listOfLists.stream() + .map(List::size) + .collect(Collectors.toSet())).hasSize(1) + .containsExactly(4); + printListOfLists(listOfLists); + } + + @Test + void givenListOfLists_whenRemoveElementFromInnerLists_thenGetExpectedResults() throws URISyntaxException, IOException { + List> listOfLists = getListOfListsFromCsv(); + + listOfLists.forEach(innerList -> innerList.remove("Delete Me")); + assertThat(listOfLists.stream() + .map(List::size) + .collect(Collectors.toSet())).hasSize(1) + .containsExactly(3); + + printListOfLists(listOfLists); + } + + @Test + void givenListOfLists_whenAddNewInnerList_thenGetExpectedResults() throws URISyntaxException, IOException { + List> listOfLists = getListOfListsFromCsv(); + List newList = new ArrayList<>(Arrays.asList("Slack", "Zoom", "Microsoft Teams", "Telegram")); + listOfLists.add(2, newList); + + assertThat(listOfLists).hasSize(4); + assertThat(listOfLists.get(2)).containsExactly("Slack", "Zoom", "Microsoft Teams", "Telegram"); + printListOfLists(listOfLists); + } +} diff --git a/core-java-modules/core-java-collections-list-3/src/test/resources/listoflists/example.csv b/core-java-modules/core-java-collections-list-3/src/test/resources/listoflists/example.csv new file mode 100644 index 0000000000..e275848e19 --- /dev/null +++ b/core-java-modules/core-java-collections-list-3/src/test/resources/listoflists/example.csv @@ -0,0 +1,3 @@ +Linux, Microsoft Windows, Mac OS, Delete Me +Kotlin, Delete Me, Java, Python +Delete Me, Mercurial, Git, Subversion \ No newline at end of file From 0fc7298473d1e05e891f7dae21852a0b11bcb070 Mon Sep 17 00:00:00 2001 From: ACHRAF TAITAI <43656331+achraftt@users.noreply.github.com> Date: Sun, 24 Apr 2022 14:49:25 +0200 Subject: [PATCH 086/278] BAEL-5381: Java Scanner.skip method with examples (#12083) * BAEL-5381: Java Scanner.skip method with examples * BAEL-5381: Edit unitTest class name --- .../com/baeldung/scanner/ScannerUnitTest.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 core-java-modules/core-java-io-4/src/test/java/com/baeldung/scanner/ScannerUnitTest.java diff --git a/core-java-modules/core-java-io-4/src/test/java/com/baeldung/scanner/ScannerUnitTest.java b/core-java-modules/core-java-io-4/src/test/java/com/baeldung/scanner/ScannerUnitTest.java new file mode 100644 index 0000000000..f11f3d032d --- /dev/null +++ b/core-java-modules/core-java-io-4/src/test/java/com/baeldung/scanner/ScannerUnitTest.java @@ -0,0 +1,34 @@ +package com.baeldung.scanner; + +import org.junit.Test; + +import java.util.*; +import java.util.regex.*; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class ScannerUnitTest { + @Test public void scannerSkipUsingPattern() { + String str = "Java scanner skip tutorial"; + // Instantiates Scanner + Scanner sc = new Scanner(str); + // By using skip(Pattern) method is to skip that meets the given pattern + sc.skip(Pattern.compile(".ava")); + assertEquals(sc.nextLine(), " scanner skip tutorial"); + // Scanner closed + sc.close(); + } + + @Test public void scannerSkipUsingStringPattern() { + String str = "Java scanner skip tutorial"; + // Instantiates Scanner + Scanner sc = new Scanner(str); + // By using skip(String) method is to skip that meets the given + // pattern constructed from the given String + sc.skip("Java"); + assertEquals(sc.nextLine(), " scanner skip tutorial"); + + // Scanner closed + sc.close(); + } +} \ No newline at end of file From 372bfb46a62fd525dba91b86ae82fb7577241e3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Aragon=C3=A9s=20L=C3=B3pez?= Date: Mon, 25 Apr 2022 19:50:22 +0200 Subject: [PATCH 087/278] Exception Handler for Spring Security Resource Server (#12085) * Exception Handler implemented for Spring Security Resource Server * Renamed test class name to solve PMD Failure * Code formatting --- .../exceptionhandler/AppInitializer.java | 11 +++ .../controller/AccessDeniedController.java | 15 +++ .../controller/CustomErrorController.java | 15 +++ .../controller/HomeController.java | 15 +++ .../controller/SecuredResourceController.java | 15 +++ .../security/CustomAccessDeniedHandler.java | 17 ++++ .../CustomAuthenticationFailureHandler.java | 17 ++++ .../CustomAuthenticationSuccessHandler.java | 31 ++++++ .../security/SecurityConfig.java | 98 +++++++++++++++++++ .../src/main/resources/application.properties | 1 + .../src/main/resources/templates/admin.html | 5 + .../src/main/resources/templates/denied.html | 5 + .../src/main/resources/templates/error.html | 5 + .../src/main/resources/templates/index.html | 6 ++ .../SecurityConfigUnitTest.java | 50 ++++++++++ 15 files changed, 306 insertions(+) create mode 100644 spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/AppInitializer.java create mode 100644 spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/controller/AccessDeniedController.java create mode 100644 spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/controller/CustomErrorController.java create mode 100644 spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/controller/HomeController.java create mode 100644 spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/controller/SecuredResourceController.java create mode 100644 spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/security/CustomAccessDeniedHandler.java create mode 100644 spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/security/CustomAuthenticationFailureHandler.java create mode 100644 spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/security/CustomAuthenticationSuccessHandler.java create mode 100644 spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/security/SecurityConfig.java create mode 100644 spring-security-modules/spring-security-core/src/main/resources/application.properties create mode 100644 spring-security-modules/spring-security-core/src/main/resources/templates/admin.html create mode 100644 spring-security-modules/spring-security-core/src/main/resources/templates/denied.html create mode 100644 spring-security-modules/spring-security-core/src/main/resources/templates/error.html create mode 100644 spring-security-modules/spring-security-core/src/main/resources/templates/index.html create mode 100644 spring-security-modules/spring-security-core/src/test/java/com/baeldung/exceptionhandler/SecurityConfigUnitTest.java diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/AppInitializer.java b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/AppInitializer.java new file mode 100644 index 0000000000..43921f71a2 --- /dev/null +++ b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/AppInitializer.java @@ -0,0 +1,11 @@ +package com.baeldung.exceptionhandler; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class AppInitializer { + public static void main(String[] args) { + SpringApplication.run(AppInitializer.class, args); + } +} diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/controller/AccessDeniedController.java b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/controller/AccessDeniedController.java new file mode 100644 index 0000000000..0973fe1ad3 --- /dev/null +++ b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/controller/AccessDeniedController.java @@ -0,0 +1,15 @@ +package com.baeldung.exceptionhandler.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +@RequestMapping("/access-denied") +public class AccessDeniedController { + + @GetMapping + public String accessDenied() { + return "/denied.html"; + } +} diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/controller/CustomErrorController.java b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/controller/CustomErrorController.java new file mode 100644 index 0000000000..8b65a623eb --- /dev/null +++ b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/controller/CustomErrorController.java @@ -0,0 +1,15 @@ +package com.baeldung.exceptionhandler.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +@RequestMapping +public class CustomErrorController { + + @GetMapping("/customError") + public String customErrorController() { + return "/error"; + } +} diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/controller/HomeController.java b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/controller/HomeController.java new file mode 100644 index 0000000000..d64bf7b5f3 --- /dev/null +++ b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/controller/HomeController.java @@ -0,0 +1,15 @@ +package com.baeldung.exceptionhandler.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +@RequestMapping("/home") +public class HomeController { + + @GetMapping + public String home() { + return "/index.html"; + } +} diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/controller/SecuredResourceController.java b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/controller/SecuredResourceController.java new file mode 100644 index 0000000000..a057570e29 --- /dev/null +++ b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/controller/SecuredResourceController.java @@ -0,0 +1,15 @@ +package com.baeldung.exceptionhandler.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +@RequestMapping("/secured") +public class SecuredResourceController { + + @GetMapping + public String secureResource() { + return "/admin.html"; + } +} diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/security/CustomAccessDeniedHandler.java b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/security/CustomAccessDeniedHandler.java new file mode 100644 index 0000000000..a3d6aca9be --- /dev/null +++ b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/security/CustomAccessDeniedHandler.java @@ -0,0 +1,17 @@ +package com.baeldung.exceptionhandler.security; + +import java.io.IOException; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.web.access.AccessDeniedHandler; + +public class CustomAccessDeniedHandler implements AccessDeniedHandler { + + @Override + public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException exc) throws IOException { + response.sendRedirect("/access-denied"); + } +} diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/security/CustomAuthenticationFailureHandler.java b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/security/CustomAuthenticationFailureHandler.java new file mode 100644 index 0000000000..281f9d5289 --- /dev/null +++ b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/security/CustomAuthenticationFailureHandler.java @@ -0,0 +1,17 @@ +package com.baeldung.exceptionhandler.security; + +import java.io.IOException; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.authentication.AuthenticationFailureHandler; + +public class CustomAuthenticationFailureHandler implements AuthenticationFailureHandler { + + @Override + public void onAuthenticationFailure(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException { + httpServletResponse.sendRedirect("/customError"); + } +} diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/security/CustomAuthenticationSuccessHandler.java b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/security/CustomAuthenticationSuccessHandler.java new file mode 100644 index 0000000000..62cbdf8873 --- /dev/null +++ b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/security/CustomAuthenticationSuccessHandler.java @@ -0,0 +1,31 @@ +package com.baeldung.exceptionhandler.security; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.web.authentication.AuthenticationSuccessHandler; + +public class CustomAuthenticationSuccessHandler implements AuthenticationSuccessHandler { + + @Override + public void onAuthenticationSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException { + + HttpSession session = httpServletRequest.getSession(); + User authUser = (User) SecurityContextHolder.getContext() + .getAuthentication() + .getPrincipal(); + session.setAttribute("username", authUser.getUsername()); + session.setAttribute("authorities", authentication.getAuthorities()); + + httpServletResponse.setStatus(HttpServletResponse.SC_OK); + + httpServletResponse.sendRedirect("/home"); + } +} diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/security/SecurityConfig.java b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/security/SecurityConfig.java new file mode 100644 index 0000000000..71ded0f131 --- /dev/null +++ b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/security/SecurityConfig.java @@ -0,0 +1,98 @@ +package com.baeldung.exceptionhandler.security; + +import org.springframework.context.annotation.Bean; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.factory.PasswordEncoderFactories; +import org.springframework.security.provisioning.InMemoryUserDetailsManager; +import org.springframework.security.web.access.AccessDeniedHandler; +import org.springframework.security.web.authentication.AuthenticationFailureHandler; +import org.springframework.security.web.authentication.AuthenticationSuccessHandler; + +@EnableWebSecurity +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + @Bean + public UserDetailsService userDetailsService() { + + UserDetails user = User.withUsername("user") + .passwordEncoder(PasswordEncoderFactories.createDelegatingPasswordEncoder()::encode) + .password("password") + .roles("USER") + .build(); + + UserDetails admin = User.withUsername("admin") + .passwordEncoder(PasswordEncoderFactories.createDelegatingPasswordEncoder()::encode) + .password("password") + .roles("ADMIN") + .build(); + + InMemoryUserDetailsManager userDetailsManager = new InMemoryUserDetailsManager(); + + userDetailsManager.createUser(user); + userDetailsManager.createUser(admin); + + return userDetailsManager; + } + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.inMemoryAuthentication() + .withUser("user") + .password("{noop}password") + .roles("USER") + .and() + .withUser("admin") + .password("{noop}password") + .roles("ADMIN"); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.csrf() + .disable() + .httpBasic() + .disable() + .authorizeRequests() + .antMatchers("/login") + .permitAll() + .antMatchers("/customError") + .permitAll() + .antMatchers("/access-denied") + .permitAll() + .antMatchers("/secured") + .hasRole("ADMIN") + .anyRequest() + .authenticated() + .and() + .formLogin() + .failureHandler(authenticationFailureHandler()) + .successHandler(authenticationSuccessHandler()) + .and() + .exceptionHandling() + .accessDeniedHandler(accessDeniedHandler()) + .and() + .logout(); + } + + @Bean + public AuthenticationFailureHandler authenticationFailureHandler() { + return new CustomAuthenticationFailureHandler(); + } + + @Bean + public AuthenticationSuccessHandler authenticationSuccessHandler() { + return new CustomAuthenticationSuccessHandler(); + } + + @Bean + public AccessDeniedHandler accessDeniedHandler() { + return new CustomAccessDeniedHandler(); + } + +} diff --git a/spring-security-modules/spring-security-core/src/main/resources/application.properties b/spring-security-modules/spring-security-core/src/main/resources/application.properties new file mode 100644 index 0000000000..9d154c9cc0 --- /dev/null +++ b/spring-security-modules/spring-security-core/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.thymeleaf.prefix=classpath:/templates/ \ No newline at end of file diff --git a/spring-security-modules/spring-security-core/src/main/resources/templates/admin.html b/spring-security-modules/spring-security-core/src/main/resources/templates/admin.html new file mode 100644 index 0000000000..d7f7ec232a --- /dev/null +++ b/spring-security-modules/spring-security-core/src/main/resources/templates/admin.html @@ -0,0 +1,5 @@ + + +

    + + diff --git a/spring-security-modules/spring-security-core/src/main/resources/templates/denied.html b/spring-security-modules/spring-security-core/src/main/resources/templates/denied.html new file mode 100644 index 0000000000..b7a8e09309 --- /dev/null +++ b/spring-security-modules/spring-security-core/src/main/resources/templates/denied.html @@ -0,0 +1,5 @@ + + +
    You need permission to perform this action.
    + + diff --git a/spring-security-modules/spring-security-core/src/main/resources/templates/error.html b/spring-security-modules/spring-security-core/src/main/resources/templates/error.html new file mode 100644 index 0000000000..ce74f05d99 --- /dev/null +++ b/spring-security-modules/spring-security-core/src/main/resources/templates/error.html @@ -0,0 +1,5 @@ + + +
    Ups! Wrong credentials
    + + diff --git a/spring-security-modules/spring-security-core/src/main/resources/templates/index.html b/spring-security-modules/spring-security-core/src/main/resources/templates/index.html new file mode 100644 index 0000000000..34d070b37a --- /dev/null +++ b/spring-security-modules/spring-security-core/src/main/resources/templates/index.html @@ -0,0 +1,6 @@ + + +
    Hello User!
    + + + diff --git a/spring-security-modules/spring-security-core/src/test/java/com/baeldung/exceptionhandler/SecurityConfigUnitTest.java b/spring-security-modules/spring-security-core/src/test/java/com/baeldung/exceptionhandler/SecurityConfigUnitTest.java new file mode 100644 index 0000000000..ad35d575a5 --- /dev/null +++ b/spring-security-modules/spring-security-core/src/test/java/com/baeldung/exceptionhandler/SecurityConfigUnitTest.java @@ -0,0 +1,50 @@ +package com.baeldung.exceptionhandler; + +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestBuilders.formLogin; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrl; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; + +import com.baeldung.exceptionhandler.security.SecurityConfig; + +@RunWith(SpringRunner.class) +@WebMvcTest(SecurityConfig.class) +class SecurityConfigUnitTest { + @Autowired + private MockMvc mvc; + + @Test + void whenUserAccessLogin_shouldSucceed() throws Exception { + mvc.perform(get("/login")) + .andExpect(status().isOk()); + } + + @Test + void whenUserAccessWithWrongCredentials_shouldRedirectToCustomErrorPage() throws Exception { + mvc.perform(formLogin("/login").user("username", "wrong") + .password("password", "credentials")) + .andExpect(redirectedUrl("/customError")); + } + + @Test + void whenUserAccessWithCorrectCredentials_shouldRedirectToHome() throws Exception { + mvc.perform(formLogin("/login").user("username", "user") + .password("password", "password")) + .andExpect(redirectedUrl("/home")); + } + + @Test + @WithMockUser(username = "user", roles = { "USER" }) + void whenUserAccessToSecuredPageWithoutUserRole_shouldRedirectToDeniedPage() throws Exception { + mvc.perform(get("/secured")) + .andExpect(redirectedUrl("/access-denied")); + } +} \ No newline at end of file From f429e707ff6778147be5f2aa4ebfa99ff1449f79 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 26 Apr 2022 05:02:53 +0200 Subject: [PATCH 088/278] Added IPAddressLookup (#12097) --- .../baeldung/iplookup/IPAddressLookup.java | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 core-java-modules/core-java-networking-3/src/main/java/com/baeldung/iplookup/IPAddressLookup.java diff --git a/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/iplookup/IPAddressLookup.java b/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/iplookup/IPAddressLookup.java new file mode 100644 index 0000000000..30ad5a503d --- /dev/null +++ b/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/iplookup/IPAddressLookup.java @@ -0,0 +1,50 @@ +package com.baeldung.iplookup; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.net.SocketException; +import java.net.URL; +import java.net.UnknownHostException; + +public class IPAddressLookup { + public static void main(String[] args) { + System.out.println("UDP connection IP lookup: " + getLocalIpAddressUdp()); + System.out.println("Socket connection IP lookup: " + getLocalIpAddressSocket()); + System.out.println("AWS connection IP lookup: " + getPublicIpAddressAws()); + } + + public static String getLocalIpAddressUdp() { + try (final DatagramSocket datagramSocket = new DatagramSocket()) { + datagramSocket.connect(InetAddress.getByName("8.8.8.8"), 12345); + return datagramSocket.getLocalAddress().getHostAddress(); + } catch (SocketException | UnknownHostException exception) { + throw new RuntimeException(exception); + } + } + + public static String getLocalIpAddressSocket() { + try (Socket socket = new Socket()) { + socket.connect(new InetSocketAddress("google.com", 80)); + return socket.getLocalAddress().getHostAddress(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static String getPublicIpAddressAws() { + try { + String urlString = "http://checkip.amazonaws.com/"; + URL url = new URL(urlString); + try (BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()))) { + return br.readLine(); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} From 8735a58dd000e814b6af663102cb53b64fd2225b Mon Sep 17 00:00:00 2001 From: kwoyke Date: Tue, 26 Apr 2022 15:48:09 +0200 Subject: [PATCH 089/278] JAVA-10535: Create parent graphql module (#12112) * JAVA-10535: Create parent graphql module * JAVA-10535: Cleanup * JAVA-10535: pom files cleanup * JAVA-10535: Use parent-boot-2 as a parent module --- graphql/graphql-dgs/pom.xml | 34 +++++---------- graphql/graphql-error-handling/pom.xml | 43 ++++++------------- graphql/graphql-java/pom.xml | 33 +++----------- graphql/graphql-spqr/pom.xml | 26 ++--------- .../java/com/baeldung/spqr/BookService.java | 4 +- graphql/pom.xml | 26 +++++++++++ pom.xml | 6 +-- 7 files changed, 61 insertions(+), 111 deletions(-) create mode 100644 graphql/pom.xml diff --git a/graphql/graphql-dgs/pom.xml b/graphql/graphql-dgs/pom.xml index 6165ae839f..56e261f14d 100644 --- a/graphql/graphql-dgs/pom.xml +++ b/graphql/graphql-dgs/pom.xml @@ -3,16 +3,14 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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.graphql-dgs graphql-dgs 1.0 graphql-dgs - com.baeldung - parent-modules + com.baeldung.graphql + graphql 1.0.0-SNAPSHOT - ../.. @@ -30,39 +28,22 @@ org.springframework.boot - spring-boot-starter - 2.6.2 - - - org.springframework.boot - spring-boot-starter-test - 2.6.2 - test + spring-boot-starter-web com.netflix.graphql.dgs.codegen graphql-dgs-codegen-client-core - 5.1.14 - - - org.springframework.boot - spring-boot-starter-web - 2.6.2 + ${graphql-dgs-codegen-client-core.version} com.netflix.graphql.dgs graphql-dgs-spring-boot-starter - 4.9.15 + ${graphql-dgs-spring-boot-starter.version} - - org.springframework.boot - spring-boot-maven-plugin - 2.6.2 - io.github.deweyjose graphqlcodegen-maven-plugin @@ -84,4 +65,9 @@ + + 5.1.14 + 4.9.15 + + \ No newline at end of file diff --git a/graphql/graphql-error-handling/pom.xml b/graphql/graphql-error-handling/pom.xml index 0cd00df3b9..ea1cf96a0e 100644 --- a/graphql/graphql-error-handling/pom.xml +++ b/graphql/graphql-error-handling/pom.xml @@ -3,24 +3,17 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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.graphql graphql-error-handling 1.0 jar graphql-error-handling - com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../../parent-boot-2 + com.baeldung.graphql + graphql + 1.0.0-SNAPSHOT - - 1.8 - 1.18.18 - - org.springframework.boot @@ -35,13 +28,13 @@ com.graphql-java graphql-spring-boot-starter - 5.0.2 + ${graphql-spring-boot-starter.version} com.graphql-java graphql-java-tools - 5.2.4 + ${graphql-java-tools.version} @@ -60,38 +53,28 @@ org.springframework.boot spring-boot-test test - 2.6.4 com.graphql-java graphql-spring-boot-starter-test test - 5.0.2 - - - - org.assertj - assertj-core - 3.22.0 - test + ${graphql-spring-boot-starter.version} org.skyscreamer jsonassert - 1.5.0 + ${jsonassert.version} test - - - - org.springframework.boot - spring-boot-maven-plugin - - - + + 5.0.2 + 5.2.4 + 1.5.0 + + \ No newline at end of file diff --git a/graphql/graphql-java/pom.xml b/graphql/graphql-java/pom.xml index 068cb04ea8..5e5bc8f648 100644 --- a/graphql/graphql-java/pom.xml +++ b/graphql/graphql-java/pom.xml @@ -3,16 +3,14 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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.graphql graphql-java 1.0 graphql-java - com.baeldung - parent-modules + com.baeldung.graphql + graphql 1.0.0-SNAPSHOT - ../../pom.xml @@ -44,12 +42,12 @@ com.github.americanexpress.nodes nodes - 0.5.0 + ${nodes.version} com.graphql-java graphql-java - 11.0 + ${graphql-java.version} com.graphql-java @@ -77,16 +75,6 @@ jackson-core ${jackson.version} - - io.ratpack - ratpack-core - ${ratpack-core.version} - - - com.github.americanexpress.nodes - nodes - ${nodes.version} - org.apache.commons commons-lang3 @@ -117,20 +105,10 @@ ${graphql-java-extended-scalars.version} - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - ${maven.compiler.source} - ${maven.compiler.target} - - org.eclipse.jetty jetty-maven-plugin @@ -169,6 +147,7 @@ + 11.0 5.2.4 6.1.3 3.0.3 @@ -182,8 +161,6 @@ 10.0.7 - 1.8 - 1.8 1.18 2022-04-06T00-10-27-a70541e diff --git a/graphql/graphql-spqr/pom.xml b/graphql/graphql-spqr/pom.xml index c825be9b79..ad040c1557 100644 --- a/graphql/graphql-spqr/pom.xml +++ b/graphql/graphql-spqr/pom.xml @@ -2,30 +2,21 @@ - 4.0.0 - com.baeldung.graphql graphql-spqr 1.0 - graphql-java + graphql-spqr - com.baeldung - parent-modules + com.baeldung.graphql + graphql 1.0.0-SNAPSHOT - ../.. org.springframework.boot spring-boot-starter-web - ${spring-boot-version} - - - org.springframework.boot - spring-boot-starter - ${spring-boot-version} io.leangen.graphql @@ -34,18 +25,7 @@ - - - - org.springframework.boot - spring-boot-maven-plugin - 2.6.2 - - - - - 2.6.2 0.0.6 \ No newline at end of file diff --git a/graphql/graphql-spqr/src/main/java/com/baeldung/spqr/BookService.java b/graphql/graphql-spqr/src/main/java/com/baeldung/spqr/BookService.java index 7c9b129491..2e9c6d8367 100644 --- a/graphql/graphql-spqr/src/main/java/com/baeldung/spqr/BookService.java +++ b/graphql/graphql-spqr/src/main/java/com/baeldung/spqr/BookService.java @@ -9,6 +9,7 @@ import org.springframework.stereotype.Service; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; @Service @GraphQLApi @@ -27,8 +28,7 @@ public class BookService implements IBookService { @GraphQLQuery(name = "getAllBooks", description = "Get all books") public List getAllBooks() { - return books.stream() - .toList(); + return books.stream().collect(Collectors.toList()); } @GraphQLMutation(name = "addBook") diff --git a/graphql/pom.xml b/graphql/pom.xml new file mode 100644 index 0000000000..aec097752a --- /dev/null +++ b/graphql/pom.xml @@ -0,0 +1,26 @@ + + + 4.0.0 + com.baeldung.graphql + graphql + 1.0.0-SNAPSHOT + graphql + pom + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + + graphql-dgs + graphql-error-handling + graphql-java + graphql-spqr + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 25aeebef9d..10948514d9 100644 --- a/pom.xml +++ b/pom.xml @@ -415,8 +415,7 @@ - graphql/graphql-java - graphql/graphql-dgs + graphql grpc gson guava-modules @@ -896,8 +895,7 @@ - graphql/graphql-java - graphql/graphql-dgs + graphql grpc gson guava-modules From 4553469318fff667885fbfaab4a549c47d6f5545 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Tue, 26 Apr 2022 19:28:06 +0530 Subject: [PATCH 090/278] JAVA-11535 Move spring-data related modules to persistence-modules (#12126) --- persistence-modules/pom.xml | 3 +++ .../spring-data-rest-2}/README.md | 0 .../spring-data-rest-2}/pom.xml | 2 +- .../java/com/baeldung/books/SpringDataRestApplication.java | 0 .../src/main/java/com/baeldung/books/config/DbConfig.java | 0 .../src/main/java/com/baeldung/books/config/RestConfig.java | 0 .../com/baeldung/books/config/ValidatorEventRegister.java | 0 .../handlers/RestResponseEntityExceptionHandler.java | 0 .../main/java/com/baeldung/books/models/WebsiteUser.java | 0 .../com/baeldung/books/repositories/UserRepository.java | 0 .../com/baeldung/books/validators/WebsiteUserValidator.java | 0 .../src/main/java/com/baeldung/halbrowser/App.java | 0 .../main/java/com/baeldung/halbrowser/config/DBLoader.java | 0 .../java/com/baeldung/halbrowser/config/RestConfig.java | 0 .../java/com/baeldung/halbrowser/data/BookRepository.java | 0 .../src/main/java/com/baeldung/halbrowser/model/Book.java | 0 .../springdatawebsupport/application/Application.java | 0 .../application/controllers/UserController.java | 0 .../springdatawebsupport/application/entities/User.java | 0 .../application/repositories/UserRepository.java | 0 .../src/main/resources/application.properties | 0 .../spring-data-rest-2}/src/main/resources/logback.xml | 0 .../src/main/resources/persistence-h2.properties | 0 .../src/test/java/com/baeldung/SpringContextTest.java | 0 .../validator/SpringDataRestValidatorIntegrationTest.java | 0 .../application/test/UserControllerIntegrationTest.java | 0 .../spring-data-rest-querydsl}/README.md | 0 .../spring-data-rest-querydsl}/pom.xml | 2 +- .../src/main/java/com/baeldung/Application.java | 0 .../main/java/com/baeldung/controller/QueryController.java | 0 .../baeldung/controller/repository/AddressRepository.java | 0 .../com/baeldung/controller/repository/UserRepository.java | 0 .../src/main/java/com/baeldung/entity/Address.java | 0 .../src/main/java/com/baeldung/entity/User.java | 0 .../src/main/resources/application.yml | 0 .../src/main/resources/logback.xml | 0 .../src/test/java/com/baeldung/SpringContextTest.java | 0 .../baeldung/springdatarestquerydsl/IntegrationTest.java | 0 .../springdatarestquerydsl/QuerydslIntegrationTest.java | 0 .../src/test/resources/application.yml | 0 .../spring-data-rest}/README.md | 0 .../spring-data-rest}/pom.xml | 2 +- .../java/com/baeldung/books/SpringDataRestApplication.java | 0 .../src/main/java/com/baeldung/books/config/DbConfig.java | 0 .../src/main/java/com/baeldung/books/config/MvcConfig.java | 0 .../src/main/java/com/baeldung/books/config/RestConfig.java | 0 .../main/java/com/baeldung/books/dialect/SQLiteDialect.java | 0 .../baeldung/books/dialect/SQLiteIdentityColumnSupport.java | 0 .../java/com/baeldung/books/events/AuthorEventHandler.java | 0 .../java/com/baeldung/books/events/BookEventHandler.java | 0 .../src/main/java/com/baeldung/books/models/Address.java | 0 .../src/main/java/com/baeldung/books/models/Author.java | 0 .../src/main/java/com/baeldung/books/models/Book.java | 0 .../src/main/java/com/baeldung/books/models/Library.java | 0 .../src/main/java/com/baeldung/books/models/Subject.java | 0 .../java/com/baeldung/books/projections/CustomBook.java | 0 .../com/baeldung/books/repositories/AddressRepository.java | 0 .../com/baeldung/books/repositories/AuthorRepository.java | 0 .../com/baeldung/books/repositories/BookRepository.java | 0 .../com/baeldung/books/repositories/LibraryRepository.java | 0 .../com/baeldung/books/repositories/SubjectRepository.java | 0 .../src/main/resources/application.properties | 0 .../spring-data-rest}/src/main/resources/logback.xml | 0 .../src/main/resources/persistence-derby.properties | 0 .../src/main/resources/persistence-h2.properties | 0 .../src/main/resources/persistence-hsqldb.properties | 0 .../src/main/resources/persistence-sqlite.properties | 0 .../spring-data-rest}/src/main/webapp/users.html | 0 .../spring-data-rest}/src/main/webapp/view/app.js | 0 .../src/test/java/com/baeldung/SpringContextTest.java | 0 .../baeldung/books/events/AuthorEventHandlerUnitTest.java | 0 .../com/baeldung/books/events/BookEventHandlerUnitTest.java | 0 .../books/projections/SpringDataProjectionLiveTest.java | 0 pom.xml | 6 ------ 74 files changed, 6 insertions(+), 9 deletions(-) rename {spring-data-rest-2 => persistence-modules/spring-data-rest-2}/README.md (100%) rename {spring-data-rest-2 => persistence-modules/spring-data-rest-2}/pom.xml (98%) rename {spring-data-rest-2 => persistence-modules/spring-data-rest-2}/src/main/java/com/baeldung/books/SpringDataRestApplication.java (100%) rename {spring-data-rest-2 => persistence-modules/spring-data-rest-2}/src/main/java/com/baeldung/books/config/DbConfig.java (100%) rename {spring-data-rest-2 => persistence-modules/spring-data-rest-2}/src/main/java/com/baeldung/books/config/RestConfig.java (100%) rename {spring-data-rest-2 => persistence-modules/spring-data-rest-2}/src/main/java/com/baeldung/books/config/ValidatorEventRegister.java (100%) rename {spring-data-rest-2 => persistence-modules/spring-data-rest-2}/src/main/java/com/baeldung/books/exception/handlers/RestResponseEntityExceptionHandler.java (100%) rename {spring-data-rest-2 => persistence-modules/spring-data-rest-2}/src/main/java/com/baeldung/books/models/WebsiteUser.java (100%) rename {spring-data-rest-2 => persistence-modules/spring-data-rest-2}/src/main/java/com/baeldung/books/repositories/UserRepository.java (100%) rename {spring-data-rest-2 => persistence-modules/spring-data-rest-2}/src/main/java/com/baeldung/books/validators/WebsiteUserValidator.java (100%) rename {spring-data-rest-2 => persistence-modules/spring-data-rest-2}/src/main/java/com/baeldung/halbrowser/App.java (100%) rename {spring-data-rest-2 => persistence-modules/spring-data-rest-2}/src/main/java/com/baeldung/halbrowser/config/DBLoader.java (100%) rename {spring-data-rest-2 => persistence-modules/spring-data-rest-2}/src/main/java/com/baeldung/halbrowser/config/RestConfig.java (100%) rename {spring-data-rest-2 => persistence-modules/spring-data-rest-2}/src/main/java/com/baeldung/halbrowser/data/BookRepository.java (100%) rename {spring-data-rest-2 => persistence-modules/spring-data-rest-2}/src/main/java/com/baeldung/halbrowser/model/Book.java (100%) rename {spring-data-rest-2 => persistence-modules/spring-data-rest-2}/src/main/java/com/baeldung/springdatawebsupport/application/Application.java (100%) rename {spring-data-rest-2 => persistence-modules/spring-data-rest-2}/src/main/java/com/baeldung/springdatawebsupport/application/controllers/UserController.java (100%) rename {spring-data-rest-2 => persistence-modules/spring-data-rest-2}/src/main/java/com/baeldung/springdatawebsupport/application/entities/User.java (100%) rename {spring-data-rest-2 => persistence-modules/spring-data-rest-2}/src/main/java/com/baeldung/springdatawebsupport/application/repositories/UserRepository.java (100%) rename {spring-data-rest-2 => persistence-modules/spring-data-rest-2}/src/main/resources/application.properties (100%) rename {spring-data-rest-2 => persistence-modules/spring-data-rest-2}/src/main/resources/logback.xml (100%) rename {spring-data-rest-2 => persistence-modules/spring-data-rest-2}/src/main/resources/persistence-h2.properties (100%) rename {spring-data-rest-2 => persistence-modules/spring-data-rest-2}/src/test/java/com/baeldung/SpringContextTest.java (100%) rename {spring-data-rest-2 => persistence-modules/spring-data-rest-2}/src/test/java/com/baeldung/books/validator/SpringDataRestValidatorIntegrationTest.java (100%) rename {spring-data-rest-2 => persistence-modules/spring-data-rest-2}/src/test/java/com/baeldung/springdatawebsupport/application/test/UserControllerIntegrationTest.java (100%) rename {spring-data-rest-querydsl => persistence-modules/spring-data-rest-querydsl}/README.md (100%) rename {spring-data-rest-querydsl => persistence-modules/spring-data-rest-querydsl}/pom.xml (98%) rename {spring-data-rest-querydsl => persistence-modules/spring-data-rest-querydsl}/src/main/java/com/baeldung/Application.java (100%) rename {spring-data-rest-querydsl => persistence-modules/spring-data-rest-querydsl}/src/main/java/com/baeldung/controller/QueryController.java (100%) rename {spring-data-rest-querydsl => persistence-modules/spring-data-rest-querydsl}/src/main/java/com/baeldung/controller/repository/AddressRepository.java (100%) rename {spring-data-rest-querydsl => persistence-modules/spring-data-rest-querydsl}/src/main/java/com/baeldung/controller/repository/UserRepository.java (100%) rename {spring-data-rest-querydsl => persistence-modules/spring-data-rest-querydsl}/src/main/java/com/baeldung/entity/Address.java (100%) rename {spring-data-rest-querydsl => persistence-modules/spring-data-rest-querydsl}/src/main/java/com/baeldung/entity/User.java (100%) rename {spring-data-rest-querydsl => persistence-modules/spring-data-rest-querydsl}/src/main/resources/application.yml (100%) rename {spring-data-rest-querydsl => persistence-modules/spring-data-rest-querydsl}/src/main/resources/logback.xml (100%) rename {spring-data-rest-querydsl => persistence-modules/spring-data-rest-querydsl}/src/test/java/com/baeldung/SpringContextTest.java (100%) rename {spring-data-rest-querydsl => persistence-modules/spring-data-rest-querydsl}/src/test/java/com/baeldung/springdatarestquerydsl/IntegrationTest.java (100%) rename {spring-data-rest-querydsl => persistence-modules/spring-data-rest-querydsl}/src/test/java/com/baeldung/springdatarestquerydsl/QuerydslIntegrationTest.java (100%) rename {spring-data-rest-querydsl => persistence-modules/spring-data-rest-querydsl}/src/test/resources/application.yml (100%) rename {spring-data-rest => persistence-modules/spring-data-rest}/README.md (100%) rename {spring-data-rest => persistence-modules/spring-data-rest}/pom.xml (98%) rename {spring-data-rest => persistence-modules/spring-data-rest}/src/main/java/com/baeldung/books/SpringDataRestApplication.java (100%) rename {spring-data-rest => persistence-modules/spring-data-rest}/src/main/java/com/baeldung/books/config/DbConfig.java (100%) rename {spring-data-rest => persistence-modules/spring-data-rest}/src/main/java/com/baeldung/books/config/MvcConfig.java (100%) rename {spring-data-rest => persistence-modules/spring-data-rest}/src/main/java/com/baeldung/books/config/RestConfig.java (100%) rename {spring-data-rest => persistence-modules/spring-data-rest}/src/main/java/com/baeldung/books/dialect/SQLiteDialect.java (100%) rename {spring-data-rest => persistence-modules/spring-data-rest}/src/main/java/com/baeldung/books/dialect/SQLiteIdentityColumnSupport.java (100%) rename {spring-data-rest => persistence-modules/spring-data-rest}/src/main/java/com/baeldung/books/events/AuthorEventHandler.java (100%) rename {spring-data-rest => persistence-modules/spring-data-rest}/src/main/java/com/baeldung/books/events/BookEventHandler.java (100%) rename {spring-data-rest => persistence-modules/spring-data-rest}/src/main/java/com/baeldung/books/models/Address.java (100%) rename {spring-data-rest => persistence-modules/spring-data-rest}/src/main/java/com/baeldung/books/models/Author.java (100%) rename {spring-data-rest => persistence-modules/spring-data-rest}/src/main/java/com/baeldung/books/models/Book.java (100%) rename {spring-data-rest => persistence-modules/spring-data-rest}/src/main/java/com/baeldung/books/models/Library.java (100%) rename {spring-data-rest => persistence-modules/spring-data-rest}/src/main/java/com/baeldung/books/models/Subject.java (100%) rename {spring-data-rest => persistence-modules/spring-data-rest}/src/main/java/com/baeldung/books/projections/CustomBook.java (100%) rename {spring-data-rest => persistence-modules/spring-data-rest}/src/main/java/com/baeldung/books/repositories/AddressRepository.java (100%) rename {spring-data-rest => persistence-modules/spring-data-rest}/src/main/java/com/baeldung/books/repositories/AuthorRepository.java (100%) rename {spring-data-rest => persistence-modules/spring-data-rest}/src/main/java/com/baeldung/books/repositories/BookRepository.java (100%) rename {spring-data-rest => persistence-modules/spring-data-rest}/src/main/java/com/baeldung/books/repositories/LibraryRepository.java (100%) rename {spring-data-rest => persistence-modules/spring-data-rest}/src/main/java/com/baeldung/books/repositories/SubjectRepository.java (100%) rename {spring-data-rest => persistence-modules/spring-data-rest}/src/main/resources/application.properties (100%) rename {spring-data-rest => persistence-modules/spring-data-rest}/src/main/resources/logback.xml (100%) rename {spring-data-rest => persistence-modules/spring-data-rest}/src/main/resources/persistence-derby.properties (100%) rename {spring-data-rest => persistence-modules/spring-data-rest}/src/main/resources/persistence-h2.properties (100%) rename {spring-data-rest => persistence-modules/spring-data-rest}/src/main/resources/persistence-hsqldb.properties (100%) rename {spring-data-rest => persistence-modules/spring-data-rest}/src/main/resources/persistence-sqlite.properties (100%) rename {spring-data-rest => persistence-modules/spring-data-rest}/src/main/webapp/users.html (100%) rename {spring-data-rest => persistence-modules/spring-data-rest}/src/main/webapp/view/app.js (100%) rename {spring-data-rest => persistence-modules/spring-data-rest}/src/test/java/com/baeldung/SpringContextTest.java (100%) rename {spring-data-rest => persistence-modules/spring-data-rest}/src/test/java/com/baeldung/books/events/AuthorEventHandlerUnitTest.java (100%) rename {spring-data-rest => persistence-modules/spring-data-rest}/src/test/java/com/baeldung/books/events/BookEventHandlerUnitTest.java (100%) rename {spring-data-rest => persistence-modules/spring-data-rest}/src/test/java/com/baeldung/books/projections/SpringDataProjectionLiveTest.java (100%) diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index f8e3cb05e8..132a8b6b20 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -88,6 +88,9 @@ spring-data-mongodb-reactive spring-data-neo4j spring-data-redis + spring-data-rest + spring-data-rest-2 + spring-data-rest-querydsl spring-data-solr spring-hibernate-3 spring-hibernate-5 diff --git a/spring-data-rest-2/README.md b/persistence-modules/spring-data-rest-2/README.md similarity index 100% rename from spring-data-rest-2/README.md rename to persistence-modules/spring-data-rest-2/README.md diff --git a/spring-data-rest-2/pom.xml b/persistence-modules/spring-data-rest-2/pom.xml similarity index 98% rename from spring-data-rest-2/pom.xml rename to persistence-modules/spring-data-rest-2/pom.xml index cf3265c46d..fa328854a2 100644 --- a/spring-data-rest-2/pom.xml +++ b/persistence-modules/spring-data-rest-2/pom.xml @@ -13,7 +13,7 @@ com.baeldung parent-boot-2 0.0.1-SNAPSHOT - ../parent-boot-2 + ../../parent-boot-2 diff --git a/spring-data-rest-2/src/main/java/com/baeldung/books/SpringDataRestApplication.java b/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/books/SpringDataRestApplication.java similarity index 100% rename from spring-data-rest-2/src/main/java/com/baeldung/books/SpringDataRestApplication.java rename to persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/books/SpringDataRestApplication.java diff --git a/spring-data-rest-2/src/main/java/com/baeldung/books/config/DbConfig.java b/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/books/config/DbConfig.java similarity index 100% rename from spring-data-rest-2/src/main/java/com/baeldung/books/config/DbConfig.java rename to persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/books/config/DbConfig.java diff --git a/spring-data-rest-2/src/main/java/com/baeldung/books/config/RestConfig.java b/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/books/config/RestConfig.java similarity index 100% rename from spring-data-rest-2/src/main/java/com/baeldung/books/config/RestConfig.java rename to persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/books/config/RestConfig.java diff --git a/spring-data-rest-2/src/main/java/com/baeldung/books/config/ValidatorEventRegister.java b/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/books/config/ValidatorEventRegister.java similarity index 100% rename from spring-data-rest-2/src/main/java/com/baeldung/books/config/ValidatorEventRegister.java rename to persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/books/config/ValidatorEventRegister.java diff --git a/spring-data-rest-2/src/main/java/com/baeldung/books/exception/handlers/RestResponseEntityExceptionHandler.java b/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/books/exception/handlers/RestResponseEntityExceptionHandler.java similarity index 100% rename from spring-data-rest-2/src/main/java/com/baeldung/books/exception/handlers/RestResponseEntityExceptionHandler.java rename to persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/books/exception/handlers/RestResponseEntityExceptionHandler.java diff --git a/spring-data-rest-2/src/main/java/com/baeldung/books/models/WebsiteUser.java b/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/books/models/WebsiteUser.java similarity index 100% rename from spring-data-rest-2/src/main/java/com/baeldung/books/models/WebsiteUser.java rename to persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/books/models/WebsiteUser.java diff --git a/spring-data-rest-2/src/main/java/com/baeldung/books/repositories/UserRepository.java b/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/books/repositories/UserRepository.java similarity index 100% rename from spring-data-rest-2/src/main/java/com/baeldung/books/repositories/UserRepository.java rename to persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/books/repositories/UserRepository.java diff --git a/spring-data-rest-2/src/main/java/com/baeldung/books/validators/WebsiteUserValidator.java b/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/books/validators/WebsiteUserValidator.java similarity index 100% rename from spring-data-rest-2/src/main/java/com/baeldung/books/validators/WebsiteUserValidator.java rename to persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/books/validators/WebsiteUserValidator.java diff --git a/spring-data-rest-2/src/main/java/com/baeldung/halbrowser/App.java b/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/halbrowser/App.java similarity index 100% rename from spring-data-rest-2/src/main/java/com/baeldung/halbrowser/App.java rename to persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/halbrowser/App.java diff --git a/spring-data-rest-2/src/main/java/com/baeldung/halbrowser/config/DBLoader.java b/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/halbrowser/config/DBLoader.java similarity index 100% rename from spring-data-rest-2/src/main/java/com/baeldung/halbrowser/config/DBLoader.java rename to persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/halbrowser/config/DBLoader.java diff --git a/spring-data-rest-2/src/main/java/com/baeldung/halbrowser/config/RestConfig.java b/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/halbrowser/config/RestConfig.java similarity index 100% rename from spring-data-rest-2/src/main/java/com/baeldung/halbrowser/config/RestConfig.java rename to persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/halbrowser/config/RestConfig.java diff --git a/spring-data-rest-2/src/main/java/com/baeldung/halbrowser/data/BookRepository.java b/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/halbrowser/data/BookRepository.java similarity index 100% rename from spring-data-rest-2/src/main/java/com/baeldung/halbrowser/data/BookRepository.java rename to persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/halbrowser/data/BookRepository.java diff --git a/spring-data-rest-2/src/main/java/com/baeldung/halbrowser/model/Book.java b/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/halbrowser/model/Book.java similarity index 100% rename from spring-data-rest-2/src/main/java/com/baeldung/halbrowser/model/Book.java rename to persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/halbrowser/model/Book.java diff --git a/spring-data-rest-2/src/main/java/com/baeldung/springdatawebsupport/application/Application.java b/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/springdatawebsupport/application/Application.java similarity index 100% rename from spring-data-rest-2/src/main/java/com/baeldung/springdatawebsupport/application/Application.java rename to persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/springdatawebsupport/application/Application.java diff --git a/spring-data-rest-2/src/main/java/com/baeldung/springdatawebsupport/application/controllers/UserController.java b/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/springdatawebsupport/application/controllers/UserController.java similarity index 100% rename from spring-data-rest-2/src/main/java/com/baeldung/springdatawebsupport/application/controllers/UserController.java rename to persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/springdatawebsupport/application/controllers/UserController.java diff --git a/spring-data-rest-2/src/main/java/com/baeldung/springdatawebsupport/application/entities/User.java b/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/springdatawebsupport/application/entities/User.java similarity index 100% rename from spring-data-rest-2/src/main/java/com/baeldung/springdatawebsupport/application/entities/User.java rename to persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/springdatawebsupport/application/entities/User.java diff --git a/spring-data-rest-2/src/main/java/com/baeldung/springdatawebsupport/application/repositories/UserRepository.java b/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/springdatawebsupport/application/repositories/UserRepository.java similarity index 100% rename from spring-data-rest-2/src/main/java/com/baeldung/springdatawebsupport/application/repositories/UserRepository.java rename to persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/springdatawebsupport/application/repositories/UserRepository.java diff --git a/spring-data-rest-2/src/main/resources/application.properties b/persistence-modules/spring-data-rest-2/src/main/resources/application.properties similarity index 100% rename from spring-data-rest-2/src/main/resources/application.properties rename to persistence-modules/spring-data-rest-2/src/main/resources/application.properties diff --git a/spring-data-rest-2/src/main/resources/logback.xml b/persistence-modules/spring-data-rest-2/src/main/resources/logback.xml similarity index 100% rename from spring-data-rest-2/src/main/resources/logback.xml rename to persistence-modules/spring-data-rest-2/src/main/resources/logback.xml diff --git a/spring-data-rest-2/src/main/resources/persistence-h2.properties b/persistence-modules/spring-data-rest-2/src/main/resources/persistence-h2.properties similarity index 100% rename from spring-data-rest-2/src/main/resources/persistence-h2.properties rename to persistence-modules/spring-data-rest-2/src/main/resources/persistence-h2.properties diff --git a/spring-data-rest-2/src/test/java/com/baeldung/SpringContextTest.java b/persistence-modules/spring-data-rest-2/src/test/java/com/baeldung/SpringContextTest.java similarity index 100% rename from spring-data-rest-2/src/test/java/com/baeldung/SpringContextTest.java rename to persistence-modules/spring-data-rest-2/src/test/java/com/baeldung/SpringContextTest.java diff --git a/spring-data-rest-2/src/test/java/com/baeldung/books/validator/SpringDataRestValidatorIntegrationTest.java b/persistence-modules/spring-data-rest-2/src/test/java/com/baeldung/books/validator/SpringDataRestValidatorIntegrationTest.java similarity index 100% rename from spring-data-rest-2/src/test/java/com/baeldung/books/validator/SpringDataRestValidatorIntegrationTest.java rename to persistence-modules/spring-data-rest-2/src/test/java/com/baeldung/books/validator/SpringDataRestValidatorIntegrationTest.java diff --git a/spring-data-rest-2/src/test/java/com/baeldung/springdatawebsupport/application/test/UserControllerIntegrationTest.java b/persistence-modules/spring-data-rest-2/src/test/java/com/baeldung/springdatawebsupport/application/test/UserControllerIntegrationTest.java similarity index 100% rename from spring-data-rest-2/src/test/java/com/baeldung/springdatawebsupport/application/test/UserControllerIntegrationTest.java rename to persistence-modules/spring-data-rest-2/src/test/java/com/baeldung/springdatawebsupport/application/test/UserControllerIntegrationTest.java diff --git a/spring-data-rest-querydsl/README.md b/persistence-modules/spring-data-rest-querydsl/README.md similarity index 100% rename from spring-data-rest-querydsl/README.md rename to persistence-modules/spring-data-rest-querydsl/README.md diff --git a/spring-data-rest-querydsl/pom.xml b/persistence-modules/spring-data-rest-querydsl/pom.xml similarity index 98% rename from spring-data-rest-querydsl/pom.xml rename to persistence-modules/spring-data-rest-querydsl/pom.xml index 0b1cdd8928..dc1cf64006 100644 --- a/spring-data-rest-querydsl/pom.xml +++ b/persistence-modules/spring-data-rest-querydsl/pom.xml @@ -11,7 +11,7 @@ com.baeldung parent-boot-2 0.0.1-SNAPSHOT - ../parent-boot-2 + ../../parent-boot-2 diff --git a/spring-data-rest-querydsl/src/main/java/com/baeldung/Application.java b/persistence-modules/spring-data-rest-querydsl/src/main/java/com/baeldung/Application.java similarity index 100% rename from spring-data-rest-querydsl/src/main/java/com/baeldung/Application.java rename to persistence-modules/spring-data-rest-querydsl/src/main/java/com/baeldung/Application.java diff --git a/spring-data-rest-querydsl/src/main/java/com/baeldung/controller/QueryController.java b/persistence-modules/spring-data-rest-querydsl/src/main/java/com/baeldung/controller/QueryController.java similarity index 100% rename from spring-data-rest-querydsl/src/main/java/com/baeldung/controller/QueryController.java rename to persistence-modules/spring-data-rest-querydsl/src/main/java/com/baeldung/controller/QueryController.java diff --git a/spring-data-rest-querydsl/src/main/java/com/baeldung/controller/repository/AddressRepository.java b/persistence-modules/spring-data-rest-querydsl/src/main/java/com/baeldung/controller/repository/AddressRepository.java similarity index 100% rename from spring-data-rest-querydsl/src/main/java/com/baeldung/controller/repository/AddressRepository.java rename to persistence-modules/spring-data-rest-querydsl/src/main/java/com/baeldung/controller/repository/AddressRepository.java diff --git a/spring-data-rest-querydsl/src/main/java/com/baeldung/controller/repository/UserRepository.java b/persistence-modules/spring-data-rest-querydsl/src/main/java/com/baeldung/controller/repository/UserRepository.java similarity index 100% rename from spring-data-rest-querydsl/src/main/java/com/baeldung/controller/repository/UserRepository.java rename to persistence-modules/spring-data-rest-querydsl/src/main/java/com/baeldung/controller/repository/UserRepository.java diff --git a/spring-data-rest-querydsl/src/main/java/com/baeldung/entity/Address.java b/persistence-modules/spring-data-rest-querydsl/src/main/java/com/baeldung/entity/Address.java similarity index 100% rename from spring-data-rest-querydsl/src/main/java/com/baeldung/entity/Address.java rename to persistence-modules/spring-data-rest-querydsl/src/main/java/com/baeldung/entity/Address.java diff --git a/spring-data-rest-querydsl/src/main/java/com/baeldung/entity/User.java b/persistence-modules/spring-data-rest-querydsl/src/main/java/com/baeldung/entity/User.java similarity index 100% rename from spring-data-rest-querydsl/src/main/java/com/baeldung/entity/User.java rename to persistence-modules/spring-data-rest-querydsl/src/main/java/com/baeldung/entity/User.java diff --git a/spring-data-rest-querydsl/src/main/resources/application.yml b/persistence-modules/spring-data-rest-querydsl/src/main/resources/application.yml similarity index 100% rename from spring-data-rest-querydsl/src/main/resources/application.yml rename to persistence-modules/spring-data-rest-querydsl/src/main/resources/application.yml diff --git a/spring-data-rest-querydsl/src/main/resources/logback.xml b/persistence-modules/spring-data-rest-querydsl/src/main/resources/logback.xml similarity index 100% rename from spring-data-rest-querydsl/src/main/resources/logback.xml rename to persistence-modules/spring-data-rest-querydsl/src/main/resources/logback.xml diff --git a/spring-data-rest-querydsl/src/test/java/com/baeldung/SpringContextTest.java b/persistence-modules/spring-data-rest-querydsl/src/test/java/com/baeldung/SpringContextTest.java similarity index 100% rename from spring-data-rest-querydsl/src/test/java/com/baeldung/SpringContextTest.java rename to persistence-modules/spring-data-rest-querydsl/src/test/java/com/baeldung/SpringContextTest.java diff --git a/spring-data-rest-querydsl/src/test/java/com/baeldung/springdatarestquerydsl/IntegrationTest.java b/persistence-modules/spring-data-rest-querydsl/src/test/java/com/baeldung/springdatarestquerydsl/IntegrationTest.java similarity index 100% rename from spring-data-rest-querydsl/src/test/java/com/baeldung/springdatarestquerydsl/IntegrationTest.java rename to persistence-modules/spring-data-rest-querydsl/src/test/java/com/baeldung/springdatarestquerydsl/IntegrationTest.java diff --git a/spring-data-rest-querydsl/src/test/java/com/baeldung/springdatarestquerydsl/QuerydslIntegrationTest.java b/persistence-modules/spring-data-rest-querydsl/src/test/java/com/baeldung/springdatarestquerydsl/QuerydslIntegrationTest.java similarity index 100% rename from spring-data-rest-querydsl/src/test/java/com/baeldung/springdatarestquerydsl/QuerydslIntegrationTest.java rename to persistence-modules/spring-data-rest-querydsl/src/test/java/com/baeldung/springdatarestquerydsl/QuerydslIntegrationTest.java diff --git a/spring-data-rest-querydsl/src/test/resources/application.yml b/persistence-modules/spring-data-rest-querydsl/src/test/resources/application.yml similarity index 100% rename from spring-data-rest-querydsl/src/test/resources/application.yml rename to persistence-modules/spring-data-rest-querydsl/src/test/resources/application.yml diff --git a/spring-data-rest/README.md b/persistence-modules/spring-data-rest/README.md similarity index 100% rename from spring-data-rest/README.md rename to persistence-modules/spring-data-rest/README.md diff --git a/spring-data-rest/pom.xml b/persistence-modules/spring-data-rest/pom.xml similarity index 98% rename from spring-data-rest/pom.xml rename to persistence-modules/spring-data-rest/pom.xml index e223c0488e..f5601cb7ce 100644 --- a/spring-data-rest/pom.xml +++ b/persistence-modules/spring-data-rest/pom.xml @@ -13,7 +13,7 @@ com.baeldung parent-boot-2 0.0.1-SNAPSHOT - ../parent-boot-2 + ../../parent-boot-2 diff --git a/spring-data-rest/src/main/java/com/baeldung/books/SpringDataRestApplication.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/SpringDataRestApplication.java similarity index 100% rename from spring-data-rest/src/main/java/com/baeldung/books/SpringDataRestApplication.java rename to persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/SpringDataRestApplication.java diff --git a/spring-data-rest/src/main/java/com/baeldung/books/config/DbConfig.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/config/DbConfig.java similarity index 100% rename from spring-data-rest/src/main/java/com/baeldung/books/config/DbConfig.java rename to persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/config/DbConfig.java diff --git a/spring-data-rest/src/main/java/com/baeldung/books/config/MvcConfig.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/config/MvcConfig.java similarity index 100% rename from spring-data-rest/src/main/java/com/baeldung/books/config/MvcConfig.java rename to persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/config/MvcConfig.java diff --git a/spring-data-rest/src/main/java/com/baeldung/books/config/RestConfig.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/config/RestConfig.java similarity index 100% rename from spring-data-rest/src/main/java/com/baeldung/books/config/RestConfig.java rename to persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/config/RestConfig.java diff --git a/spring-data-rest/src/main/java/com/baeldung/books/dialect/SQLiteDialect.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/dialect/SQLiteDialect.java similarity index 100% rename from spring-data-rest/src/main/java/com/baeldung/books/dialect/SQLiteDialect.java rename to persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/dialect/SQLiteDialect.java diff --git a/spring-data-rest/src/main/java/com/baeldung/books/dialect/SQLiteIdentityColumnSupport.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/dialect/SQLiteIdentityColumnSupport.java similarity index 100% rename from spring-data-rest/src/main/java/com/baeldung/books/dialect/SQLiteIdentityColumnSupport.java rename to persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/dialect/SQLiteIdentityColumnSupport.java diff --git a/spring-data-rest/src/main/java/com/baeldung/books/events/AuthorEventHandler.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/events/AuthorEventHandler.java similarity index 100% rename from spring-data-rest/src/main/java/com/baeldung/books/events/AuthorEventHandler.java rename to persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/events/AuthorEventHandler.java diff --git a/spring-data-rest/src/main/java/com/baeldung/books/events/BookEventHandler.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/events/BookEventHandler.java similarity index 100% rename from spring-data-rest/src/main/java/com/baeldung/books/events/BookEventHandler.java rename to persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/events/BookEventHandler.java diff --git a/spring-data-rest/src/main/java/com/baeldung/books/models/Address.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Address.java similarity index 100% rename from spring-data-rest/src/main/java/com/baeldung/books/models/Address.java rename to persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Address.java diff --git a/spring-data-rest/src/main/java/com/baeldung/books/models/Author.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Author.java similarity index 100% rename from spring-data-rest/src/main/java/com/baeldung/books/models/Author.java rename to persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Author.java diff --git a/spring-data-rest/src/main/java/com/baeldung/books/models/Book.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Book.java similarity index 100% rename from spring-data-rest/src/main/java/com/baeldung/books/models/Book.java rename to persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Book.java diff --git a/spring-data-rest/src/main/java/com/baeldung/books/models/Library.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Library.java similarity index 100% rename from spring-data-rest/src/main/java/com/baeldung/books/models/Library.java rename to persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Library.java diff --git a/spring-data-rest/src/main/java/com/baeldung/books/models/Subject.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Subject.java similarity index 100% rename from spring-data-rest/src/main/java/com/baeldung/books/models/Subject.java rename to persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Subject.java diff --git a/spring-data-rest/src/main/java/com/baeldung/books/projections/CustomBook.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/projections/CustomBook.java similarity index 100% rename from spring-data-rest/src/main/java/com/baeldung/books/projections/CustomBook.java rename to persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/projections/CustomBook.java diff --git a/spring-data-rest/src/main/java/com/baeldung/books/repositories/AddressRepository.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/repositories/AddressRepository.java similarity index 100% rename from spring-data-rest/src/main/java/com/baeldung/books/repositories/AddressRepository.java rename to persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/repositories/AddressRepository.java diff --git a/spring-data-rest/src/main/java/com/baeldung/books/repositories/AuthorRepository.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/repositories/AuthorRepository.java similarity index 100% rename from spring-data-rest/src/main/java/com/baeldung/books/repositories/AuthorRepository.java rename to persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/repositories/AuthorRepository.java diff --git a/spring-data-rest/src/main/java/com/baeldung/books/repositories/BookRepository.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/repositories/BookRepository.java similarity index 100% rename from spring-data-rest/src/main/java/com/baeldung/books/repositories/BookRepository.java rename to persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/repositories/BookRepository.java diff --git a/spring-data-rest/src/main/java/com/baeldung/books/repositories/LibraryRepository.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/repositories/LibraryRepository.java similarity index 100% rename from spring-data-rest/src/main/java/com/baeldung/books/repositories/LibraryRepository.java rename to persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/repositories/LibraryRepository.java diff --git a/spring-data-rest/src/main/java/com/baeldung/books/repositories/SubjectRepository.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/repositories/SubjectRepository.java similarity index 100% rename from spring-data-rest/src/main/java/com/baeldung/books/repositories/SubjectRepository.java rename to persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/repositories/SubjectRepository.java diff --git a/spring-data-rest/src/main/resources/application.properties b/persistence-modules/spring-data-rest/src/main/resources/application.properties similarity index 100% rename from spring-data-rest/src/main/resources/application.properties rename to persistence-modules/spring-data-rest/src/main/resources/application.properties diff --git a/spring-data-rest/src/main/resources/logback.xml b/persistence-modules/spring-data-rest/src/main/resources/logback.xml similarity index 100% rename from spring-data-rest/src/main/resources/logback.xml rename to persistence-modules/spring-data-rest/src/main/resources/logback.xml diff --git a/spring-data-rest/src/main/resources/persistence-derby.properties b/persistence-modules/spring-data-rest/src/main/resources/persistence-derby.properties similarity index 100% rename from spring-data-rest/src/main/resources/persistence-derby.properties rename to persistence-modules/spring-data-rest/src/main/resources/persistence-derby.properties diff --git a/spring-data-rest/src/main/resources/persistence-h2.properties b/persistence-modules/spring-data-rest/src/main/resources/persistence-h2.properties similarity index 100% rename from spring-data-rest/src/main/resources/persistence-h2.properties rename to persistence-modules/spring-data-rest/src/main/resources/persistence-h2.properties diff --git a/spring-data-rest/src/main/resources/persistence-hsqldb.properties b/persistence-modules/spring-data-rest/src/main/resources/persistence-hsqldb.properties similarity index 100% rename from spring-data-rest/src/main/resources/persistence-hsqldb.properties rename to persistence-modules/spring-data-rest/src/main/resources/persistence-hsqldb.properties diff --git a/spring-data-rest/src/main/resources/persistence-sqlite.properties b/persistence-modules/spring-data-rest/src/main/resources/persistence-sqlite.properties similarity index 100% rename from spring-data-rest/src/main/resources/persistence-sqlite.properties rename to persistence-modules/spring-data-rest/src/main/resources/persistence-sqlite.properties diff --git a/spring-data-rest/src/main/webapp/users.html b/persistence-modules/spring-data-rest/src/main/webapp/users.html similarity index 100% rename from spring-data-rest/src/main/webapp/users.html rename to persistence-modules/spring-data-rest/src/main/webapp/users.html diff --git a/spring-data-rest/src/main/webapp/view/app.js b/persistence-modules/spring-data-rest/src/main/webapp/view/app.js similarity index 100% rename from spring-data-rest/src/main/webapp/view/app.js rename to persistence-modules/spring-data-rest/src/main/webapp/view/app.js diff --git a/spring-data-rest/src/test/java/com/baeldung/SpringContextTest.java b/persistence-modules/spring-data-rest/src/test/java/com/baeldung/SpringContextTest.java similarity index 100% rename from spring-data-rest/src/test/java/com/baeldung/SpringContextTest.java rename to persistence-modules/spring-data-rest/src/test/java/com/baeldung/SpringContextTest.java diff --git a/spring-data-rest/src/test/java/com/baeldung/books/events/AuthorEventHandlerUnitTest.java b/persistence-modules/spring-data-rest/src/test/java/com/baeldung/books/events/AuthorEventHandlerUnitTest.java similarity index 100% rename from spring-data-rest/src/test/java/com/baeldung/books/events/AuthorEventHandlerUnitTest.java rename to persistence-modules/spring-data-rest/src/test/java/com/baeldung/books/events/AuthorEventHandlerUnitTest.java diff --git a/spring-data-rest/src/test/java/com/baeldung/books/events/BookEventHandlerUnitTest.java b/persistence-modules/spring-data-rest/src/test/java/com/baeldung/books/events/BookEventHandlerUnitTest.java similarity index 100% rename from spring-data-rest/src/test/java/com/baeldung/books/events/BookEventHandlerUnitTest.java rename to persistence-modules/spring-data-rest/src/test/java/com/baeldung/books/events/BookEventHandlerUnitTest.java diff --git a/spring-data-rest/src/test/java/com/baeldung/books/projections/SpringDataProjectionLiveTest.java b/persistence-modules/spring-data-rest/src/test/java/com/baeldung/books/projections/SpringDataProjectionLiveTest.java similarity index 100% rename from spring-data-rest/src/test/java/com/baeldung/books/projections/SpringDataProjectionLiveTest.java rename to persistence-modules/spring-data-rest/src/test/java/com/baeldung/books/projections/SpringDataProjectionLiveTest.java diff --git a/pom.xml b/pom.xml index 10948514d9..802f8ea43c 100644 --- a/pom.xml +++ b/pom.xml @@ -643,9 +643,6 @@ spring-core-5 spring-cucumber - spring-data-rest - spring-data-rest-2 - spring-data-rest-querydsl spring-di spring-di-2 spring-di-3 @@ -1117,9 +1114,6 @@ spring-core-5 spring-cucumber - spring-data-rest - spring-data-rest-2 - spring-data-rest-querydsl spring-di spring-di-2 spring-di-3 From 3cc6b034b8522b67934b4ce9efda17d851f22b32 Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Tue, 26 Apr 2022 20:13:08 +0100 Subject: [PATCH 091/278] [JAVA-11417] Fix log4j2 JSON integration test --- .../tests/JSONLayoutIntegrationTest.java | 63 +++++++++++-------- 1 file changed, 37 insertions(+), 26 deletions(-) diff --git a/logging-modules/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/JSONLayoutIntegrationTest.java b/logging-modules/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/JSONLayoutIntegrationTest.java index e842cda3d6..86cd00c6af 100644 --- a/logging-modules/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/JSONLayoutIntegrationTest.java +++ b/logging-modules/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/JSONLayoutIntegrationTest.java @@ -1,47 +1,58 @@ package com.baeldung.logging.log4j2.tests; -import static org.junit.Assert.assertTrue; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.PrintStream; - +import com.baeldung.logging.log4j2.Log4j2BaseIntegrationTest; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.core.Appender; +import org.apache.logging.log4j.core.appender.WriterAppender; +import org.apache.logging.log4j.core.layout.JsonLayout; +import org.junit.After; import org.junit.Before; import org.junit.Test; -import com.baeldung.logging.log4j2.Log4j2BaseIntegrationTest; -import com.fasterxml.jackson.databind.ObjectMapper; +import java.io.CharArrayWriter; +import java.io.Writer; + +import static org.junit.Assert.assertTrue; public class JSONLayoutIntegrationTest extends Log4j2BaseIntegrationTest { - private static Logger logger; - private ByteArrayOutputStream consoleOutput = new ByteArrayOutputStream(); - private PrintStream ps = new PrintStream(consoleOutput); + private Appender appender; + private Logger logger; + private final Writer writer = new CharArrayWriter(); @Before public void setUp() { - // Redirect console output to our stream - System.setOut(ps); logger = LogManager.getLogger("CONSOLE_JSON_APPENDER"); + + appender = WriterAppender.newBuilder() + .setTarget(writer) + .setLayout(JsonLayout.newBuilder().build()) + .setName("json_layout_for_testing") + .build(); + appender.start(); + + ((org.apache.logging.log4j.core.Logger) logger).addAppender(appender); } @Test - public void whenLogLayoutInJSON_thenOutputIsCorrectJSON() { + public void whenLogLayoutInJSON_thenOutputIsCorrectJSON() throws Exception { logger.debug("Debug message"); - String currentLog = consoleOutput.toString(); - assertTrue(currentLog.isEmpty()); - assertTrue(isValidJSON(currentLog)); + + writer.flush(); + assertTrue(isValidJSON(writer.toString())); } - public static boolean isValidJSON(String jsonInString) { - try { - final ObjectMapper mapper = new ObjectMapper(); - mapper.readTree(jsonInString); - return true; - } catch (IOException e) { - return false; - } + @After + public void cleanup() { + ((org.apache.logging.log4j.core.Logger) logger).removeAppender(appender); } -} \ No newline at end of file + + private static boolean isValidJSON(String jsonInString) throws Exception { + JsonNode jsonNode = new ObjectMapper().readTree(jsonInString); + return jsonNode.get("message").asText().equals("Debug message"); + } + +} From c9a91ca3b1220c0d7c0b4a844fc08629af9345f4 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Wed, 27 Apr 2022 16:36:10 +0800 Subject: [PATCH 092/278] Update README.md --- core-java-modules/core-java-11-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-11-2/README.md b/core-java-modules/core-java-11-2/README.md index 2b0eda8d91..c42b3f0e18 100644 --- a/core-java-modules/core-java-11-2/README.md +++ b/core-java-modules/core-java-11-2/README.md @@ -11,3 +11,4 @@ This module contains articles about Java 11 core features - [Invoking a SOAP Web Service in Java](https://www.baeldung.com/java-soap-web-service) - [Java HTTPS Client Certificate Authentication](https://www.baeldung.com/java-https-client-certificate-authentication) - [Call Methods at Runtime Using Java Reflection](https://www.baeldung.com/java-method-reflection) +- [Java HttpClient Basic Authentication](https://www.baeldung.com/java-httpclient-basic-auth) From 94d3b980dc2d7309e5d14e4bd67901f63e23d7ce Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Wed, 27 Apr 2022 16:40:19 +0800 Subject: [PATCH 093/278] Update README.md --- persistence-modules/java-mongodb-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/java-mongodb-2/README.md b/persistence-modules/java-mongodb-2/README.md index bee5439ab1..10cb935f56 100644 --- a/persistence-modules/java-mongodb-2/README.md +++ b/persistence-modules/java-mongodb-2/README.md @@ -11,4 +11,5 @@ This module contains articles about MongoDB in Java. - [MongoDB Aggregations Using Java](https://www.baeldung.com/java-mongodb-aggregations) - [Retrieve a Value from MongoDB by Its Key Name](https://www.baeldung.com/mongodb-get-value-by-key-name) - [Push and Set Operations in Same MongoDB Update](https://www.baeldung.com/java-mongodb-push-set) +- [Checking Connection to MongoDB](https://www.baeldung.com/mongodb-check-connection) - More articles: [[<-- prev]](../java-mongodb) From 360ca495d482549a4f1006a7864a8180b25acb39 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Wed, 27 Apr 2022 16:47:43 +0800 Subject: [PATCH 094/278] Update README.md --- core-java-modules/core-java-regex-2/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core-java-modules/core-java-regex-2/README.md b/core-java-modules/core-java-regex-2/README.md index 6dafc74d41..453e2cc419 100644 --- a/core-java-modules/core-java-regex-2/README.md +++ b/core-java-modules/core-java-regex-2/README.md @@ -4,4 +4,5 @@ - [Lookahead and Lookbehind in Java Regex](https://www.baeldung.com/java-regex-lookahead-lookbehind) - [Converting Camel Case and Title Case to Words in Java](https://www.baeldung.com/java-camel-case-title-case-to-words) - [How to Use Regular Expressions to Replace Tokens in Strings in Java](https://www.baeldung.com/java-regex-token-replacement) -- More articles: [[<-- prev]](/core-java-modules/core-java-regex) \ No newline at end of file +- [Creating a Java Array from Regular Expression Matches](https://www.baeldung.com/java-array-regex-matches) +- More articles: [[<-- prev]](/core-java-modules/core-java-regex) From 98c27e6b9f682c8044a5d7ab072ce52c40665968 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Wed, 27 Apr 2022 16:53:44 +0800 Subject: [PATCH 095/278] Update README.md --- core-java-modules/core-java-collections-list-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-list-3/README.md b/core-java-modules/core-java-collections-list-3/README.md index bcc8b3f3ed..ecae0dda7d 100644 --- a/core-java-modules/core-java-collections-list-3/README.md +++ b/core-java-modules/core-java-collections-list-3/README.md @@ -12,4 +12,5 @@ This module contains articles about the Java List collection - [How to Count Duplicate Elements in Arraylist](https://www.baeldung.com/java-count-duplicate-elements-arraylist) - [Finding the Differences Between Two Lists in Java](https://www.baeldung.com/java-lists-difference) - [List vs. ArrayList in Java](https://www.baeldung.com/java-list-vs-arraylist) +- [How to Store HashMap Inside a List](https://www.baeldung.com/java-hashmap-inside-list) - [[<-- Prev]](/core-java-modules/core-java-collections-list-2) From fde9ae6880da7c85ea8c31de22bf9dd5ccad2e6c Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Wed, 27 Apr 2022 16:58:57 +0800 Subject: [PATCH 096/278] Update README.md --- graphql/graphql-java/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/graphql/graphql-java/README.md b/graphql/graphql-java/README.md index f37506a9fd..85c1497169 100644 --- a/graphql/graphql-java/README.md +++ b/graphql/graphql-java/README.md @@ -6,3 +6,4 @@ This module contains articles about GraphQL with Java - [Introduction to GraphQL](https://www.baeldung.com/graphql) - [Make a Call to a GraphQL Service from a Java Application](https://www.baeldung.com/java-call-graphql-service) +- [Return Map from GraphQL](https://www.baeldung.com/java-graphql-return-map) From 7f39e139380c4819c802aa10a55e1782542912c9 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Wed, 27 Apr 2022 17:23:04 +0800 Subject: [PATCH 097/278] Update README.md --- jersey/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/jersey/README.md b/jersey/README.md index 366e7665f3..4c8c235be5 100644 --- a/jersey/README.md +++ b/jersey/README.md @@ -10,3 +10,4 @@ This module contains articles about Jersey. - [Exploring the Jersey Test Framework](https://www.baeldung.com/jersey-test) - [Explore Jersey Request Parameters](https://www.baeldung.com/jersey-request-parameters) - [Add a Header to a Jersey SSE Client Request](https://www.baeldung.com/jersey-sse-client-request-headers) +- [Exception Handling With Jersey](https://www.baeldung.com/java-exception-handling-jersey) From f455f0b5a8495d4816edc695e9028f11f62174d2 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Wed, 27 Apr 2022 17:28:08 +0800 Subject: [PATCH 098/278] Update README.md --- core-java-modules/core-java-collections-list-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-list-3/README.md b/core-java-modules/core-java-collections-list-3/README.md index ecae0dda7d..6d0a3c7037 100644 --- a/core-java-modules/core-java-collections-list-3/README.md +++ b/core-java-modules/core-java-collections-list-3/README.md @@ -13,4 +13,5 @@ This module contains articles about the Java List collection - [Finding the Differences Between Two Lists in Java](https://www.baeldung.com/java-lists-difference) - [List vs. ArrayList in Java](https://www.baeldung.com/java-list-vs-arraylist) - [How to Store HashMap Inside a List](https://www.baeldung.com/java-hashmap-inside-list) +- [Working With a List of Lists in Java](https://www.baeldung.com/java-list-of-lists) - [[<-- Prev]](/core-java-modules/core-java-collections-list-2) From d662408b20de4f0c161c9cfa62d6f784609ba884 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Wed, 27 Apr 2022 17:34:34 +0800 Subject: [PATCH 099/278] Update README.md --- spring-security-modules/spring-security-core/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-security-modules/spring-security-core/README.md b/spring-security-modules/spring-security-core/README.md index 9f8e4dda53..1949b5a929 100644 --- a/spring-security-modules/spring-security-core/README.md +++ b/spring-security-modules/spring-security-core/README.md @@ -10,6 +10,7 @@ This module contains articles about core Spring Security - [Deny Access on Missing @PreAuthorize to Spring Controller Methods](https://www.baeldung.com/spring-deny-access) - [Spring Security: Check If a User Has a Role in Java](https://www.baeldung.com/spring-security-check-user-role) - [Filtering Jackson JSON Output Based on Spring Security Role](https://www.baeldung.com/spring-security-role-filter-json) +- [Handle Spring Security Exceptions](https://www.baeldung.com/spring-security-exceptions) ### Build the Project From e81d306a64c61717f08cab20c7c39651b8a77927 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Wed, 27 Apr 2022 17:38:30 +0800 Subject: [PATCH 100/278] Update README.md --- core-java-modules/core-java-networking-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-networking-3/README.md b/core-java-modules/core-java-networking-3/README.md index 82e75820ba..21f939b43e 100644 --- a/core-java-modules/core-java-networking-3/README.md +++ b/core-java-modules/core-java-networking-3/README.md @@ -10,4 +10,5 @@ This module contains articles about networking in Java - [Find Whether an IP Address Is in the Specified Range or Not in Java](https://www.baeldung.com/java-check-ip-address-range) - [Find the IP Address of a Client Connected to a Server](https://www.baeldung.com/java-client-get-ip-address) - [Unix Domain Socket in Java 16](https://www.baeldung.com/java-unix-domain-socket) +- [Get the IP Address of the Current Machine Using Java](https://www.baeldung.com/java-get-ip-address) - [[<-- Prev]](/core-java-modules/core-java-networking-2) From cd78bd7c2a7c19eed229ac5895da4447775d34df Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Wed, 27 Apr 2022 17:43:41 +0800 Subject: [PATCH 101/278] Update README.md --- core-java-modules/core-java/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core-java-modules/core-java/README.md b/core-java-modules/core-java/README.md index a75805e0c2..087c5d356e 100644 --- a/core-java-modules/core-java/README.md +++ b/core-java-modules/core-java/README.md @@ -1,9 +1,11 @@ ## Core Java Cookbooks and Examples ### Relevant Articles: + - [Getting Started with Java Properties](http://www.baeldung.com/java-properties) - [Java Money and the Currency API](http://www.baeldung.com/java-money-and-currency) - [Compiling Java *.class Files with javac](http://www.baeldung.com/javac) - [Introduction to Javadoc](http://www.baeldung.com/javadoc) - [A Guide to the ResourceBundle](http://www.baeldung.com/java-resourcebundle) - [Merging java.util.Properties Objects](https://www.baeldung.com/java-merging-properties) +- [Illegal Character Compilation Error](https://www.baeldung.com/java-illegal-character-error) From 4495b45d0b450d6531bd49d882fc7a5bf26666d3 Mon Sep 17 00:00:00 2001 From: Christian Jaimes Date: Wed, 27 Apr 2022 06:51:13 -0400 Subject: [PATCH 102/278] moved files to article-specific folder --- .../java/com/baeldung/enums/Direction.java | 14 ------------ .../baeldung/enums/randomenum/Direction.java | 22 +++++++++++++++++++ .../enums/randomenum/RandomEnumGenerator.java | 17 ++++++++++++++ .../{ => randomenum}/RandomEnumUnitTest.java | 6 +---- 4 files changed, 40 insertions(+), 19 deletions(-) create mode 100644 core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/randomenum/Direction.java create mode 100644 core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/randomenum/RandomEnumGenerator.java rename core-java-modules/core-java-lang-oop-types-2/src/test/java/com/baeldung/enums/{ => randomenum}/RandomEnumUnitTest.java (79%) diff --git a/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/Direction.java b/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/Direction.java index 76b63bdf50..935aca4d65 100644 --- a/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/Direction.java +++ b/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/Direction.java @@ -1,25 +1,11 @@ package com.baeldung.enums; -import java.util.Random; - /** * Represents directions. */ public enum Direction { EAST, WEST, SOUTH, NORTH; - private static final Random PRNG = new Random(); - - /** - * Generate a random direction. - * - * @return a random direction - */ - public static Direction randomDirection() { - Direction[] directions = values(); - return directions[PRNG.nextInt(directions.length)]; - } - /** * Finds direction by name. * diff --git a/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/randomenum/Direction.java b/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/randomenum/Direction.java new file mode 100644 index 0000000000..05b398371c --- /dev/null +++ b/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/randomenum/Direction.java @@ -0,0 +1,22 @@ +package com.baeldung.enums.randomenum; + +import java.util.Random; + +/** + * Represents directions. + */ +public enum Direction { + EAST, WEST, SOUTH, NORTH; + + private static final Random PRNG = new Random(); + + /** + * Generate a random direction. + * + * @return a random direction + */ + public static Direction randomDirection() { + Direction[] directions = values(); + return directions[PRNG.nextInt(directions.length)]; + } +} diff --git a/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/randomenum/RandomEnumGenerator.java b/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/randomenum/RandomEnumGenerator.java new file mode 100644 index 0000000000..33d793062d --- /dev/null +++ b/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/randomenum/RandomEnumGenerator.java @@ -0,0 +1,17 @@ +package com.baeldung.enums.randomenum; + +import java.util.Random; + +public class RandomEnumGenerator> { + + private static final Random PRNG = new Random(); + private final T[] values; + + public RandomEnumGenerator(Class e) { + values = e.getEnumConstants(); + } + + public T randomEnum() { + return values[PRNG.nextInt(values.length)]; + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-oop-types-2/src/test/java/com/baeldung/enums/RandomEnumUnitTest.java b/core-java-modules/core-java-lang-oop-types-2/src/test/java/com/baeldung/enums/randomenum/RandomEnumUnitTest.java similarity index 79% rename from core-java-modules/core-java-lang-oop-types-2/src/test/java/com/baeldung/enums/RandomEnumUnitTest.java rename to core-java-modules/core-java-lang-oop-types-2/src/test/java/com/baeldung/enums/randomenum/RandomEnumUnitTest.java index 937b376c29..76b4bf1e74 100644 --- a/core-java-modules/core-java-lang-oop-types-2/src/test/java/com/baeldung/enums/RandomEnumUnitTest.java +++ b/core-java-modules/core-java-lang-oop-types-2/src/test/java/com/baeldung/enums/randomenum/RandomEnumUnitTest.java @@ -1,12 +1,8 @@ -package com.baeldung.enums; +package com.baeldung.enums.randomenum; -import org.assertj.core.api.Assertions; import org.junit.Test; -import java.util.Optional; - import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; public class RandomEnumUnitTest { From fdf79fdd879183bc363597d58adcd2460a6959ba Mon Sep 17 00:00:00 2001 From: Christian Jaimes Date: Wed, 27 Apr 2022 06:54:46 -0400 Subject: [PATCH 103/278] removed unnecessary file --- .../com/baeldung/enums/RandomEnumGenerator.java | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/RandomEnumGenerator.java diff --git a/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/RandomEnumGenerator.java b/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/RandomEnumGenerator.java deleted file mode 100644 index ea27286044..0000000000 --- a/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/RandomEnumGenerator.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.enums; - -import java.util.Random; - -public class RandomEnumGenerator> { - - private static final Random PRNG = new Random(); - private final T[] values; - - public RandomEnumGenerator(Class e) { - values = e.getEnumConstants(); - } - - public T randomEnum() { - return values[PRNG.nextInt(values.length)]; - } -} \ No newline at end of file From 7fb15d26dd47e8b07f7947e3ec5f2c2708844a01 Mon Sep 17 00:00:00 2001 From: Mayank Aggarwal Date: Thu, 28 Apr 2022 13:56:16 +0530 Subject: [PATCH 104/278] [BAEL-5438] Added Criteria Queries & Hibernate Queries (#12127) * [BAEL-5438] Added Criteria Queries for Employee * [BAEL-5438] Added tests and entities for named queries and criteria queries * [BAEL-5438] Removed unused sorting files * [BAEL-5438] Ignored spring context test Co-authored-by: Mayank Agarwal --- .../hibernate/criteria/model/Employee.java | 76 +++++++++++++++++++ .../view/EmployeeCriteriaQueries.java | 45 +++++++++++ .../java/com/baeldung/SpringContextTest.java | 2 + .../EmployeeCriteriaIntegrationTest.java | 36 +++++++++ .../hibernate/criteria/model/Employee.hbm.xml | 19 +++++ .../src/test/resources/criteria.cfg.xml | 1 + .../src/test/resources/import-db.sql | 7 ++ .../spring/data/jpa/entity/Employee.java | 18 +++++ .../jpa/repository/EmployeeRepository.java | 37 +++++++++ 9 files changed, 241 insertions(+) create mode 100644 persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/model/Employee.java create mode 100644 persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/view/EmployeeCriteriaQueries.java create mode 100644 persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/criteria/EmployeeCriteriaIntegrationTest.java create mode 100644 persistence-modules/hibernate-queries/src/test/resources/com/baeldung/hibernate/criteria/model/Employee.hbm.xml create mode 100644 persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/entity/Employee.java create mode 100644 persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/repository/EmployeeRepository.java diff --git a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/model/Employee.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/model/Employee.java new file mode 100644 index 0000000000..994d3f3800 --- /dev/null +++ b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/model/Employee.java @@ -0,0 +1,76 @@ +package com.baeldung.hibernate.criteria.model; + +import java.io.Serializable; +import javax.persistence.Entity; + +@org.hibernate.annotations.NamedQueries({ @org.hibernate.annotations.NamedQuery(name = "Employee_findByEmployeeId", query = "from Employee where id = :employeeId"), + @org.hibernate.annotations.NamedQuery(name = "Employee_findAllByEmployeeSalary", query = "from Employee where salary = :employeeSalary")}) +@org.hibernate.annotations.NamedNativeQueries({ @org.hibernate.annotations.NamedNativeQuery(name = "Employee_FindByEmployeeId", query = "select * from employee emp where employeeId=:employeeId", resultClass = Employee.class)}) +@Entity +public class Employee implements Serializable { + + private static final long serialVersionUID = 1L; + private Integer id; + private String name; + private Long salary; + + // constructors + public Employee() { + } + + public Employee(final Integer id, final String name, final Long salary) { + super(); + this.id = id; + this.name = name; + this.salary = salary; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((id == null) ? 0 : id.hashCode()); + return result; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + final Employee other = (Employee) obj; + if (id == null) { + if (other.id != null) + return false; + } else if (!id.equals(other.id)) + return false; + return true; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Long getSalary() { + return salary; + } + + public void setSalary(Long salary) { + this.salary = salary; + } +} diff --git a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/view/EmployeeCriteriaQueries.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/view/EmployeeCriteriaQueries.java new file mode 100644 index 0000000000..04e27d2ec1 --- /dev/null +++ b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/view/EmployeeCriteriaQueries.java @@ -0,0 +1,45 @@ +package com.baeldung.hibernate.criteria.view; + +import com.baeldung.hibernate.criteria.model.Employee; +import com.baeldung.hibernate.criteria.util.HibernateUtil; +import java.util.List; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import org.hibernate.Session; +import org.hibernate.query.Query; + +public class EmployeeCriteriaQueries { + + public List getAllEmployees() { + final Session session = HibernateUtil.getHibernateSession(); + final CriteriaBuilder cb = session.getCriteriaBuilder(); + final CriteriaQuery cr = cb.createQuery(Employee.class); + final Root root = cr.from(Employee.class); + cr.select(root); + Query query = session.createQuery(cr); + List results = query.getResultList(); + session.close(); + return results; + } + + // To get items having salary more than 50000 + public String[] greaterThanCriteria() { + final Session session = HibernateUtil.getHibernateSession(); + final CriteriaBuilder cb = session.getCriteriaBuilder(); + final CriteriaQuery cr = cb.createQuery(Employee.class); + final Root root = cr.from(Employee.class); + cr.select(root) + .where(cb.gt(root.get("salary"), 50000)); + Query query = session.createQuery(cr); + final List greaterThanEmployeeList = query.getResultList(); + final String employeeWithGreaterSalary[] = new String[greaterThanEmployeeList.size()]; + for (int i = 0; i < greaterThanEmployeeList.size(); i++) { + employeeWithGreaterSalary[i] = greaterThanEmployeeList.get(i) + .getName(); + } + session.close(); + return employeeWithGreaterSalary; + } + +} diff --git a/persistence-modules/hibernate-queries/src/test/java/com/baeldung/SpringContextTest.java b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/SpringContextTest.java index 6503454abf..83af0e0be6 100644 --- a/persistence-modules/hibernate-queries/src/test/java/com/baeldung/SpringContextTest.java +++ b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/SpringContextTest.java @@ -1,5 +1,6 @@ package com.baeldung; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; @@ -13,6 +14,7 @@ import com.baeldung.hibernate.criteria.PersistenceConfig; public class SpringContextTest { @Test + @Ignore public void whenSpringContextIsBootstrapped_thenNoExceptions() { } } diff --git a/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/criteria/EmployeeCriteriaIntegrationTest.java b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/criteria/EmployeeCriteriaIntegrationTest.java new file mode 100644 index 0000000000..b2ad4240bf --- /dev/null +++ b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/criteria/EmployeeCriteriaIntegrationTest.java @@ -0,0 +1,36 @@ +package com.baeldung.hibernate.criteria; + +import static org.junit.Assert.assertArrayEquals; + +import com.baeldung.hibernate.criteria.model.Employee; +import com.baeldung.hibernate.criteria.util.HibernateUtil; +import com.baeldung.hibernate.criteria.view.EmployeeCriteriaQueries; +import java.util.List; +import org.hibernate.Session; +import org.junit.Test; + +public class EmployeeCriteriaIntegrationTest { + + final private EmployeeCriteriaQueries employeeCriteriaQueries = new EmployeeCriteriaQueries(); + + @Test + public void testGreaterThanCriteriaQuery() { + final Session session = HibernateUtil.getHibernateSession(); + final List expectedGreaterThanList = session.createQuery("From Employee where salary>50000").list(); + final String expectedGreaterThanEmployees[] = new String[expectedGreaterThanList.size()]; + for (int i = 0; i < expectedGreaterThanList.size(); i++) { + expectedGreaterThanEmployees[i] = expectedGreaterThanList.get(i).getName(); + } + session.close(); + assertArrayEquals(expectedGreaterThanEmployees, employeeCriteriaQueries.greaterThanCriteria()); + } + + @Test + public void testGetAllEmployeesQuery() { + final Session session = HibernateUtil.getHibernateSession(); + final List expectedSortCritEmployeeList = session.createQuery("From Employee").list(); + session.close(); + assertArrayEquals(expectedSortCritEmployeeList.toArray(), employeeCriteriaQueries.getAllEmployees().toArray()); + } + +} diff --git a/persistence-modules/hibernate-queries/src/test/resources/com/baeldung/hibernate/criteria/model/Employee.hbm.xml b/persistence-modules/hibernate-queries/src/test/resources/com/baeldung/hibernate/criteria/model/Employee.hbm.xml new file mode 100644 index 0000000000..90e1c2fefd --- /dev/null +++ b/persistence-modules/hibernate-queries/src/test/resources/com/baeldung/hibernate/criteria/model/Employee.hbm.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/hibernate-queries/src/test/resources/criteria.cfg.xml b/persistence-modules/hibernate-queries/src/test/resources/criteria.cfg.xml index 9ca9836a70..30d8168c5c 100644 --- a/persistence-modules/hibernate-queries/src/test/resources/criteria.cfg.xml +++ b/persistence-modules/hibernate-queries/src/test/resources/criteria.cfg.xml @@ -14,5 +14,6 @@ import-db.sql false + \ No newline at end of file diff --git a/persistence-modules/hibernate-queries/src/test/resources/import-db.sql b/persistence-modules/hibernate-queries/src/test/resources/import-db.sql index 52c800f6b4..7933d280b8 100644 --- a/persistence-modules/hibernate-queries/src/test/resources/import-db.sql +++ b/persistence-modules/hibernate-queries/src/test/resources/import-db.sql @@ -20,3 +20,10 @@ insert into item (item_id, item_name, item_desc, item_price) values(9,'Household insert into item (item_id, item_name, item_desc, item_price) values(10,'Office Chairs', 'Chairs for office', 395.98); insert into item (item_id, item_name, item_desc, item_price) values(11,'Outdoor Chairs', 'Chairs for outdoor activities', 1234.36); + +insert into EMPLOYEE (id, name, salary) values(1,'Steve Jobs', 55000); + +insert into EMPLOYEE (id, name, salary) values(1,'Bill Hages', 45000); + +insert into EMPLOYEE (id, name, salary) values(1,'Mark clinch', 57000); + diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/entity/Employee.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/entity/Employee.java new file mode 100644 index 0000000000..214cb09e57 --- /dev/null +++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/entity/Employee.java @@ -0,0 +1,18 @@ +package com.baeldung.spring.data.jpa.entity; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +@Entity +public class Employee { + + @Id + @GeneratedValue + private Integer id; + + private String name; + + private Long salary; + +} diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/repository/EmployeeRepository.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/repository/EmployeeRepository.java new file mode 100644 index 0000000000..652b7b93d2 --- /dev/null +++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/repository/EmployeeRepository.java @@ -0,0 +1,37 @@ +package com.baeldung.spring.data.jpa.repository; + +import com.baeldung.spring.data.jpa.entity.Employee; +import java.util.List; +import net.bytebuddy.TypeCache.Sort; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +public interface EmployeeRepository extends JpaRepository { + + @Query(value = "SELECT e FROM Employee e") + List findAllEmployees(Sort sort); + + @Query("SELECT e FROM Employee e WHERE e.salary = ?1") + Employee findAllEmployeesWithSalary(Long salary); + + @Query("SELECT e FROM Employee e WHERE e.name = ?1 and e.salary = ?2") + Employee findUserByNameAndSalary(String name, Long salary); + + @Query( + value = "SELECT * FROM Employee e WHERE e.salary = ?1", + nativeQuery = true) + Employee findUserBySalaryNative(Long salary); + + @Query("SELECT e FROM Employee e WHERE e.name = :name and e.salary = :salary") + Employee findUserByEmployeeNameAndSalaryNamedParameters( + @Param("name") String employeeName, + @Param("salary") Long employeeSalary); + + @Query(value = "SELECT * FROM Employee e WHERE e.name = :name and e.salary = :salary", + nativeQuery = true) + Employee findUserByNameAndSalaryNamedParamsNative( + @Param("name") String employeeName, + @Param("salary") Long employeeSalary); + +} From 430bd13ba0a0d90df58cbfad3aae2e7407c41826 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Thu, 28 Apr 2022 18:44:01 +0530 Subject: [PATCH 105/278] JAVA-11532 Move maven related modules to maven-modules (#12133) * JAVA-11532 Move maven related modules to maven-modules * JAVA-11532 Remove moved module from parent pom --- .../animal-sniffer-mvn-plugin}/README.md | 0 .../animal-sniffer-mvn-plugin}/pom.xml | 4 ++-- .../src/main/java/com/baeldung/App.java | 0 .../src/main/resources/logback.xml | 0 .../src/test/java/com/baeldung/AppUnitTest.java | 0 .../maven-archetype}/README.md | 0 {maven-archetype => maven-modules/maven-archetype}/pom.xml | 0 .../main/resources/META-INF/maven/archetype-metadata.xml | 0 .../src/main/resources/archetype-resources/pom.xml | 0 .../archetype-resources/src/main/java/AppConfig.java | 0 .../archetype-resources/src/main/java/PingResource.java | 0 .../archetype-resources/src/main/liberty/config/server.xml | 0 .../maven-archetype}/src/main/resources/logback.xml | 0 {maven-polyglot => maven-modules/maven-polyglot}/README.md | 0 .../maven-polyglot-json-app/.mvn/extensions.xml | 0 .../maven-polyglot}/maven-polyglot-json-app/pom.json | 0 .../baeldung/maven/polyglot/MavenPolyglotApplication.java | 0 .../maven-polyglot-json-app/src/main/resources/model.json | 0 .../maven-polyglot}/maven-polyglot-json-extension/pom.xml | 4 ++-- .../main/java/com/demo/polyglot/CustomModelProcessor.java | 0 .../maven-polyglot-yml-app/.mvn/extensions.xml | 0 .../maven-polyglot}/maven-polyglot-yml-app/pom.yml | 0 .../com/baeldung/maven/polyglot/YamlDemoApplication.java | 0 .../maven-polyglot-yml-app/src/main/resources/model.json | 0 {maven-polyglot => maven-modules/maven-polyglot}/pom.xml | 4 ++-- maven-modules/pom.xml | 3 +++ pom.xml | 6 ------ 27 files changed, 9 insertions(+), 12 deletions(-) rename {animal-sniffer-mvn-plugin => maven-modules/animal-sniffer-mvn-plugin}/README.md (100%) rename {animal-sniffer-mvn-plugin => maven-modules/animal-sniffer-mvn-plugin}/pom.xml (95%) rename {animal-sniffer-mvn-plugin => maven-modules/animal-sniffer-mvn-plugin}/src/main/java/com/baeldung/App.java (100%) rename {animal-sniffer-mvn-plugin => maven-modules/animal-sniffer-mvn-plugin}/src/main/resources/logback.xml (100%) rename {animal-sniffer-mvn-plugin => maven-modules/animal-sniffer-mvn-plugin}/src/test/java/com/baeldung/AppUnitTest.java (100%) rename {maven-archetype => maven-modules/maven-archetype}/README.md (100%) rename {maven-archetype => maven-modules/maven-archetype}/pom.xml (100%) rename {maven-archetype => maven-modules/maven-archetype}/src/main/resources/META-INF/maven/archetype-metadata.xml (100%) rename {maven-archetype => maven-modules/maven-archetype}/src/main/resources/archetype-resources/pom.xml (100%) rename {maven-archetype => maven-modules/maven-archetype}/src/main/resources/archetype-resources/src/main/java/AppConfig.java (100%) rename {maven-archetype => maven-modules/maven-archetype}/src/main/resources/archetype-resources/src/main/java/PingResource.java (100%) rename {maven-archetype => maven-modules/maven-archetype}/src/main/resources/archetype-resources/src/main/liberty/config/server.xml (100%) rename {maven-archetype => maven-modules/maven-archetype}/src/main/resources/logback.xml (100%) rename {maven-polyglot => maven-modules/maven-polyglot}/README.md (100%) rename {maven-polyglot => maven-modules/maven-polyglot}/maven-polyglot-json-app/.mvn/extensions.xml (100%) rename {maven-polyglot => maven-modules/maven-polyglot}/maven-polyglot-json-app/pom.json (100%) rename {maven-polyglot => maven-modules/maven-polyglot}/maven-polyglot-json-app/src/main/java/com/baeldung/maven/polyglot/MavenPolyglotApplication.java (100%) rename {maven-polyglot => maven-modules/maven-polyglot}/maven-polyglot-json-app/src/main/resources/model.json (100%) rename {maven-polyglot => maven-modules/maven-polyglot}/maven-polyglot-json-extension/pom.xml (95%) rename {maven-polyglot => maven-modules/maven-polyglot}/maven-polyglot-json-extension/src/main/java/com/demo/polyglot/CustomModelProcessor.java (100%) rename {maven-polyglot => maven-modules/maven-polyglot}/maven-polyglot-yml-app/.mvn/extensions.xml (100%) rename {maven-polyglot => maven-modules/maven-polyglot}/maven-polyglot-yml-app/pom.yml (100%) rename {maven-polyglot => maven-modules/maven-polyglot}/maven-polyglot-yml-app/src/main/java/com/baeldung/maven/polyglot/YamlDemoApplication.java (100%) rename {maven-polyglot => maven-modules/maven-polyglot}/maven-polyglot-yml-app/src/main/resources/model.json (100%) rename {maven-polyglot => maven-modules/maven-polyglot}/pom.xml (89%) diff --git a/animal-sniffer-mvn-plugin/README.md b/maven-modules/animal-sniffer-mvn-plugin/README.md similarity index 100% rename from animal-sniffer-mvn-plugin/README.md rename to maven-modules/animal-sniffer-mvn-plugin/README.md diff --git a/animal-sniffer-mvn-plugin/pom.xml b/maven-modules/animal-sniffer-mvn-plugin/pom.xml similarity index 95% rename from animal-sniffer-mvn-plugin/pom.xml rename to maven-modules/animal-sniffer-mvn-plugin/pom.xml index 9e4f25c791..1756adc27d 100644 --- a/animal-sniffer-mvn-plugin/pom.xml +++ b/maven-modules/animal-sniffer-mvn-plugin/pom.xml @@ -11,8 +11,8 @@ com.baeldung - parent-modules - 1.0.0-SNAPSHOT + maven-modules + 0.0.1-SNAPSHOT diff --git a/animal-sniffer-mvn-plugin/src/main/java/com/baeldung/App.java b/maven-modules/animal-sniffer-mvn-plugin/src/main/java/com/baeldung/App.java similarity index 100% rename from animal-sniffer-mvn-plugin/src/main/java/com/baeldung/App.java rename to maven-modules/animal-sniffer-mvn-plugin/src/main/java/com/baeldung/App.java diff --git a/animal-sniffer-mvn-plugin/src/main/resources/logback.xml b/maven-modules/animal-sniffer-mvn-plugin/src/main/resources/logback.xml similarity index 100% rename from animal-sniffer-mvn-plugin/src/main/resources/logback.xml rename to maven-modules/animal-sniffer-mvn-plugin/src/main/resources/logback.xml diff --git a/animal-sniffer-mvn-plugin/src/test/java/com/baeldung/AppUnitTest.java b/maven-modules/animal-sniffer-mvn-plugin/src/test/java/com/baeldung/AppUnitTest.java similarity index 100% rename from animal-sniffer-mvn-plugin/src/test/java/com/baeldung/AppUnitTest.java rename to maven-modules/animal-sniffer-mvn-plugin/src/test/java/com/baeldung/AppUnitTest.java diff --git a/maven-archetype/README.md b/maven-modules/maven-archetype/README.md similarity index 100% rename from maven-archetype/README.md rename to maven-modules/maven-archetype/README.md diff --git a/maven-archetype/pom.xml b/maven-modules/maven-archetype/pom.xml similarity index 100% rename from maven-archetype/pom.xml rename to maven-modules/maven-archetype/pom.xml diff --git a/maven-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml b/maven-modules/maven-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml similarity index 100% rename from maven-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml rename to maven-modules/maven-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml diff --git a/maven-archetype/src/main/resources/archetype-resources/pom.xml b/maven-modules/maven-archetype/src/main/resources/archetype-resources/pom.xml similarity index 100% rename from maven-archetype/src/main/resources/archetype-resources/pom.xml rename to maven-modules/maven-archetype/src/main/resources/archetype-resources/pom.xml diff --git a/maven-archetype/src/main/resources/archetype-resources/src/main/java/AppConfig.java b/maven-modules/maven-archetype/src/main/resources/archetype-resources/src/main/java/AppConfig.java similarity index 100% rename from maven-archetype/src/main/resources/archetype-resources/src/main/java/AppConfig.java rename to maven-modules/maven-archetype/src/main/resources/archetype-resources/src/main/java/AppConfig.java diff --git a/maven-archetype/src/main/resources/archetype-resources/src/main/java/PingResource.java b/maven-modules/maven-archetype/src/main/resources/archetype-resources/src/main/java/PingResource.java similarity index 100% rename from maven-archetype/src/main/resources/archetype-resources/src/main/java/PingResource.java rename to maven-modules/maven-archetype/src/main/resources/archetype-resources/src/main/java/PingResource.java diff --git a/maven-archetype/src/main/resources/archetype-resources/src/main/liberty/config/server.xml b/maven-modules/maven-archetype/src/main/resources/archetype-resources/src/main/liberty/config/server.xml similarity index 100% rename from maven-archetype/src/main/resources/archetype-resources/src/main/liberty/config/server.xml rename to maven-modules/maven-archetype/src/main/resources/archetype-resources/src/main/liberty/config/server.xml diff --git a/maven-archetype/src/main/resources/logback.xml b/maven-modules/maven-archetype/src/main/resources/logback.xml similarity index 100% rename from maven-archetype/src/main/resources/logback.xml rename to maven-modules/maven-archetype/src/main/resources/logback.xml diff --git a/maven-polyglot/README.md b/maven-modules/maven-polyglot/README.md similarity index 100% rename from maven-polyglot/README.md rename to maven-modules/maven-polyglot/README.md diff --git a/maven-polyglot/maven-polyglot-json-app/.mvn/extensions.xml b/maven-modules/maven-polyglot/maven-polyglot-json-app/.mvn/extensions.xml similarity index 100% rename from maven-polyglot/maven-polyglot-json-app/.mvn/extensions.xml rename to maven-modules/maven-polyglot/maven-polyglot-json-app/.mvn/extensions.xml diff --git a/maven-polyglot/maven-polyglot-json-app/pom.json b/maven-modules/maven-polyglot/maven-polyglot-json-app/pom.json similarity index 100% rename from maven-polyglot/maven-polyglot-json-app/pom.json rename to maven-modules/maven-polyglot/maven-polyglot-json-app/pom.json diff --git a/maven-polyglot/maven-polyglot-json-app/src/main/java/com/baeldung/maven/polyglot/MavenPolyglotApplication.java b/maven-modules/maven-polyglot/maven-polyglot-json-app/src/main/java/com/baeldung/maven/polyglot/MavenPolyglotApplication.java similarity index 100% rename from maven-polyglot/maven-polyglot-json-app/src/main/java/com/baeldung/maven/polyglot/MavenPolyglotApplication.java rename to maven-modules/maven-polyglot/maven-polyglot-json-app/src/main/java/com/baeldung/maven/polyglot/MavenPolyglotApplication.java diff --git a/maven-polyglot/maven-polyglot-json-app/src/main/resources/model.json b/maven-modules/maven-polyglot/maven-polyglot-json-app/src/main/resources/model.json similarity index 100% rename from maven-polyglot/maven-polyglot-json-app/src/main/resources/model.json rename to maven-modules/maven-polyglot/maven-polyglot-json-app/src/main/resources/model.json diff --git a/maven-polyglot/maven-polyglot-json-extension/pom.xml b/maven-modules/maven-polyglot/maven-polyglot-json-extension/pom.xml similarity index 95% rename from maven-polyglot/maven-polyglot-json-extension/pom.xml rename to maven-modules/maven-polyglot/maven-polyglot-json-extension/pom.xml index 13d0b2099b..ade8974e0e 100644 --- a/maven-polyglot/maven-polyglot-json-extension/pom.xml +++ b/maven-modules/maven-polyglot/maven-polyglot-json-extension/pom.xml @@ -10,8 +10,8 @@ com.baeldung - parent-modules - 1.0.0-SNAPSHOT + maven-modules + 0.0.1-SNAPSHOT ../.. diff --git a/maven-polyglot/maven-polyglot-json-extension/src/main/java/com/demo/polyglot/CustomModelProcessor.java b/maven-modules/maven-polyglot/maven-polyglot-json-extension/src/main/java/com/demo/polyglot/CustomModelProcessor.java similarity index 100% rename from maven-polyglot/maven-polyglot-json-extension/src/main/java/com/demo/polyglot/CustomModelProcessor.java rename to maven-modules/maven-polyglot/maven-polyglot-json-extension/src/main/java/com/demo/polyglot/CustomModelProcessor.java diff --git a/maven-polyglot/maven-polyglot-yml-app/.mvn/extensions.xml b/maven-modules/maven-polyglot/maven-polyglot-yml-app/.mvn/extensions.xml similarity index 100% rename from maven-polyglot/maven-polyglot-yml-app/.mvn/extensions.xml rename to maven-modules/maven-polyglot/maven-polyglot-yml-app/.mvn/extensions.xml diff --git a/maven-polyglot/maven-polyglot-yml-app/pom.yml b/maven-modules/maven-polyglot/maven-polyglot-yml-app/pom.yml similarity index 100% rename from maven-polyglot/maven-polyglot-yml-app/pom.yml rename to maven-modules/maven-polyglot/maven-polyglot-yml-app/pom.yml diff --git a/maven-polyglot/maven-polyglot-yml-app/src/main/java/com/baeldung/maven/polyglot/YamlDemoApplication.java b/maven-modules/maven-polyglot/maven-polyglot-yml-app/src/main/java/com/baeldung/maven/polyglot/YamlDemoApplication.java similarity index 100% rename from maven-polyglot/maven-polyglot-yml-app/src/main/java/com/baeldung/maven/polyglot/YamlDemoApplication.java rename to maven-modules/maven-polyglot/maven-polyglot-yml-app/src/main/java/com/baeldung/maven/polyglot/YamlDemoApplication.java diff --git a/maven-polyglot/maven-polyglot-yml-app/src/main/resources/model.json b/maven-modules/maven-polyglot/maven-polyglot-yml-app/src/main/resources/model.json similarity index 100% rename from maven-polyglot/maven-polyglot-yml-app/src/main/resources/model.json rename to maven-modules/maven-polyglot/maven-polyglot-yml-app/src/main/resources/model.json diff --git a/maven-polyglot/pom.xml b/maven-modules/maven-polyglot/pom.xml similarity index 89% rename from maven-polyglot/pom.xml rename to maven-modules/maven-polyglot/pom.xml index 496ce58bf2..7ff375b9ba 100644 --- a/maven-polyglot/pom.xml +++ b/maven-modules/maven-polyglot/pom.xml @@ -10,8 +10,8 @@ com.baeldung - parent-modules - 1.0.0-SNAPSHOT + maven-modules + 0.0.1-SNAPSHOT diff --git a/maven-modules/pom.xml b/maven-modules/pom.xml index 0d65e5f9f4..a9fefbbf5d 100644 --- a/maven-modules/pom.xml +++ b/maven-modules/pom.xml @@ -15,6 +15,8 @@ + animal-sniffer-mvn-plugin + maven-archetype maven-copy-files maven-custom-plugin @@ -23,6 +25,7 @@ maven-integration-test maven-multi-source maven-plugins + maven-polyglot maven-properties maven-unused-dependencies diff --git a/pom.xml b/pom.xml index 802f8ea43c..9670e57612 100644 --- a/pom.xml +++ b/pom.xml @@ -343,7 +343,6 @@ algorithms-searching algorithms-sorting algorithms-sorting-2 - animal-sniffer-mvn-plugin annotations antlr @@ -502,8 +501,6 @@ mapstruct maven-modules - maven-archetype - maven-polyglot mesos-marathon metrics @@ -820,7 +817,6 @@ algorithms-searching algorithms-sorting algorithms-sorting-2 - animal-sniffer-mvn-plugin annotations antlr @@ -981,8 +977,6 @@ mapstruct maven-modules - maven-archetype - maven-polyglot mesos-marathon metrics From 003d00daa9e5070f5f32bec31f81bc2031249b67 Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Thu, 28 Apr 2022 17:12:20 +0100 Subject: [PATCH 106/278] [JAVA-8148] Fix code so application starts and some clean up --- .../reactive/webflux/EmployeeRepository.java | 44 ++++------- .../annotation/EmployeeSpringApplication.java | 7 ++ .../webflux/annotation/EmployeeWebClient.java | 12 +-- .../EmployeeControllerIntegrationTest.java | 76 ++++++++++++------- 4 files changed, 77 insertions(+), 62 deletions(-) diff --git a/spring-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeRepository.java b/spring-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeRepository.java index 9aebc577b0..01d32ea57a 100644 --- a/spring-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeRepository.java +++ b/spring-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeRepository.java @@ -10,46 +10,32 @@ import java.util.Map; @Repository public class EmployeeRepository { - static Map employeeData; - - static Map employeeAccessData; + private static final Map EMPLOYEE_DATA; static { - employeeData = new HashMap<>(); - employeeData.put("1", new Employee("1", "Employee 1")); - employeeData.put("2", new Employee("2", "Employee 2")); - employeeData.put("3", new Employee("3", "Employee 3")); - employeeData.put("4", new Employee("4", "Employee 4")); - employeeData.put("5", new Employee("5", "Employee 5")); - employeeData.put("6", new Employee("6", "Employee 6")); - employeeData.put("7", new Employee("7", "Employee 7")); - employeeData.put("8", new Employee("8", "Employee 8")); - employeeData.put("9", new Employee("9", "Employee 9")); - employeeData.put("10", new Employee("10", "Employee 10")); - - employeeAccessData = new HashMap<>(); - employeeAccessData.put("1", "Employee 1 Access Key"); - employeeAccessData.put("2", "Employee 2 Access Key"); - employeeAccessData.put("3", "Employee 3 Access Key"); - employeeAccessData.put("4", "Employee 4 Access Key"); - employeeAccessData.put("5", "Employee 5 Access Key"); - employeeAccessData.put("6", "Employee 6 Access Key"); - employeeAccessData.put("7", "Employee 7 Access Key"); - employeeAccessData.put("8", "Employee 8 Access Key"); - employeeAccessData.put("9", "Employee 9 Access Key"); - employeeAccessData.put("10", "Employee 10 Access Key"); + EMPLOYEE_DATA = new HashMap<>(); + EMPLOYEE_DATA.put("1", new Employee("1", "Employee 1")); + EMPLOYEE_DATA.put("2", new Employee("2", "Employee 2")); + EMPLOYEE_DATA.put("3", new Employee("3", "Employee 3")); + EMPLOYEE_DATA.put("4", new Employee("4", "Employee 4")); + EMPLOYEE_DATA.put("5", new Employee("5", "Employee 5")); + EMPLOYEE_DATA.put("6", new Employee("6", "Employee 6")); + EMPLOYEE_DATA.put("7", new Employee("7", "Employee 7")); + EMPLOYEE_DATA.put("8", new Employee("8", "Employee 8")); + EMPLOYEE_DATA.put("9", new Employee("9", "Employee 9")); + EMPLOYEE_DATA.put("10", new Employee("10", "Employee 10")); } public Mono findEmployeeById(String id) { - return Mono.just(employeeData.get(id)); + return Mono.just(EMPLOYEE_DATA.get(id)); } public Flux findAllEmployees() { - return Flux.fromIterable(employeeData.values()); + return Flux.fromIterable(EMPLOYEE_DATA.values()); } public Mono updateEmployee(Employee employee) { - Employee existingEmployee = employeeData.get(employee.getId()); + Employee existingEmployee = EMPLOYEE_DATA.get(employee.getId()); if (existingEmployee != null) { existingEmployee.setName(employee.getName()); } diff --git a/spring-reactive/src/main/java/com/baeldung/reactive/webflux/annotation/EmployeeSpringApplication.java b/spring-reactive/src/main/java/com/baeldung/reactive/webflux/annotation/EmployeeSpringApplication.java index f1d21bdc77..0e3cc6bf99 100644 --- a/spring-reactive/src/main/java/com/baeldung/reactive/webflux/annotation/EmployeeSpringApplication.java +++ b/spring-reactive/src/main/java/com/baeldung/reactive/webflux/annotation/EmployeeSpringApplication.java @@ -1,12 +1,19 @@ package com.baeldung.reactive.webflux.annotation; +import com.baeldung.reactive.webflux.EmployeeRepository; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration; +import org.springframework.context.annotation.Bean; @SpringBootApplication(exclude = MongoReactiveAutoConfiguration.class) public class EmployeeSpringApplication { + @Bean + EmployeeRepository employeeRepository() { + return new EmployeeRepository(); + } + public static void main(String[] args) { SpringApplication.run(EmployeeSpringApplication.class, args); diff --git a/spring-reactive/src/main/java/com/baeldung/reactive/webflux/annotation/EmployeeWebClient.java b/spring-reactive/src/main/java/com/baeldung/reactive/webflux/annotation/EmployeeWebClient.java index 611a261a1b..62978e1f58 100644 --- a/spring-reactive/src/main/java/com/baeldung/reactive/webflux/annotation/EmployeeWebClient.java +++ b/spring-reactive/src/main/java/com/baeldung/reactive/webflux/annotation/EmployeeWebClient.java @@ -10,9 +10,9 @@ import reactor.core.publisher.Mono; public class EmployeeWebClient { private static final Logger LOGGER = LoggerFactory.getLogger(EmployeeWebClient.class); - + WebClient client = WebClient.create("http://localhost:8080"); - + public void consume() { Mono employeeMono = client.get() @@ -20,13 +20,13 @@ public class EmployeeWebClient { .retrieve() .bodyToMono(Employee.class); - employeeMono.subscribe(employee -> LOGGER.debug("Employee: {}", employee)); - + employeeMono.subscribe(employee -> LOGGER.info("Employee: {}", employee)); + Flux employeeFlux = client.get() .uri("/employees") .retrieve() .bodyToFlux(Employee.class); - - employeeFlux.subscribe(employee -> LOGGER.debug("Employee: {}", employee)); + + employeeFlux.subscribe(employee -> LOGGER.info("Employee: {}", employee)); } } \ No newline at end of file diff --git a/spring-reactive/src/test/java/com/baeldung/reactive/webflux/annotation/EmployeeControllerIntegrationTest.java b/spring-reactive/src/test/java/com/baeldung/reactive/webflux/annotation/EmployeeControllerIntegrationTest.java index 24c4303e83..c4a11e7f3b 100644 --- a/spring-reactive/src/test/java/com/baeldung/reactive/webflux/annotation/EmployeeControllerIntegrationTest.java +++ b/spring-reactive/src/test/java/com/baeldung/reactive/webflux/annotation/EmployeeControllerIntegrationTest.java @@ -2,27 +2,27 @@ package com.baeldung.reactive.webflux.annotation; import com.baeldung.reactive.webflux.Employee; import com.baeldung.reactive.webflux.EmployeeRepository; -import com.baeldung.reactive.webflux.annotation.EmployeeSpringApplication; -import org.junit.FixMethodOrder; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.MethodSorters; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.reactive.server.WebTestClient; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoInteractions; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; @RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes= EmployeeSpringApplication.class) -@FixMethodOrder(MethodSorters.NAME_ASCENDING) +@SpringBootTest(webEnvironment = RANDOM_PORT, classes= EmployeeSpringApplication.class) public class EmployeeControllerIntegrationTest { @Autowired @@ -35,40 +35,62 @@ public class EmployeeControllerIntegrationTest { public void givenEmployeeId_whenGetEmployeeById_thenCorrectEmployee() { Employee employee = new Employee("1", "Employee 1 Name"); - + given(employeeRepository.findEmployeeById("1")).willReturn(Mono.just(employee)); + testClient.get() .uri("/employees/1") .exchange() - .expectStatus() - .isOk() - .expectBody(Employee.class) - .isEqualTo(employee); + .expectStatus().isOk() + .expectBody(Employee.class).isEqualTo(employee); } @Test public void whenGetAllEmployees_thenCorrectEmployees() { - - List employeeList = new ArrayList<>(); - - Employee employee1 = new Employee("1", "Employee 1 Name"); - Employee employee2 = new Employee("2", "Employee 2 Name"); - Employee employee3 = new Employee("3", "Employee 3 Name"); - - employeeList.add(employee1); - employeeList.add(employee2); - employeeList.add(employee3); - + List employeeList = Arrays.asList( + new Employee("1", "Employee 1 Name"), + new Employee("2", "Employee 2 Name"), + new Employee("3", "Employee 3 Name") + ); Flux employeeFlux = Flux.fromIterable(employeeList); given(employeeRepository.findAllEmployees()).willReturn(employeeFlux); + testClient.get() .uri("/employees") .exchange() - .expectStatus() - .isOk() - .expectBodyList(Employee.class) - .hasSize(3) - .isEqualTo(employeeList); + .expectStatus().isOk() + .expectBodyList(Employee.class).isEqualTo(employeeList); + } + + @Test + @WithMockUser(username = "admin", roles = {"ADMIN"}) + public void givenValidUser_whenUpdateEmployee_thenEmployeeUpdated() { + Employee employee = new Employee("10", "Employee 10 Updated"); + + given(employeeRepository.updateEmployee(employee)).willReturn(Mono.just(employee)); + + testClient.post() + .uri("/employees/update") + .body(Mono.just(employee), Employee.class) + .exchange() + .expectStatus().isOk() + .expectBody(Employee.class).isEqualTo(employee); + + verify(employeeRepository).updateEmployee(employee); + } + + @Test + @WithMockUser + public void givenInvalidUser_whenUpdateEmployee_thenForbidden() { + Employee employee = new Employee("10", "Employee 10 Updated"); + + testClient.post() + .uri("/employees/update") + .body(Mono.just(employee), Employee.class) + .exchange() + .expectStatus().isForbidden(); + + verifyNoInteractions(employeeRepository); } } From 39f17dd3d13ffe470e4c0e48961761427dadaa03 Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Thu, 28 Apr 2022 17:20:37 +0100 Subject: [PATCH 107/278] [JAVA-8148] Code clean up --- .../baeldung/reactive/webflux/Employee.java | 4 +- .../webflux/annotation/EmployeeWebClient.java | 14 ++--- .../annotation/EmployeeWebSecurityConfig.java | 30 +++++------ .../functional/EmployeeFunctionalConfig.java | 51 +++++++++--------- .../EmployeeControllerIntegrationTest.java | 20 +++---- ...ployeeSpringFunctionalIntegrationTest.java | 52 ++++++++----------- 6 files changed, 80 insertions(+), 91 deletions(-) diff --git a/spring-reactive/src/main/java/com/baeldung/reactive/webflux/Employee.java b/spring-reactive/src/main/java/com/baeldung/reactive/webflux/Employee.java index d41a4f2791..dd88dcb668 100644 --- a/spring-reactive/src/main/java/com/baeldung/reactive/webflux/Employee.java +++ b/spring-reactive/src/main/java/com/baeldung/reactive/webflux/Employee.java @@ -11,7 +11,5 @@ public class Employee { private String id; private String name; - - // standard getters and setters - + } diff --git a/spring-reactive/src/main/java/com/baeldung/reactive/webflux/annotation/EmployeeWebClient.java b/spring-reactive/src/main/java/com/baeldung/reactive/webflux/annotation/EmployeeWebClient.java index 62978e1f58..5ae193dc7c 100644 --- a/spring-reactive/src/main/java/com/baeldung/reactive/webflux/annotation/EmployeeWebClient.java +++ b/spring-reactive/src/main/java/com/baeldung/reactive/webflux/annotation/EmployeeWebClient.java @@ -16,17 +16,17 @@ public class EmployeeWebClient { public void consume() { Mono employeeMono = client.get() - .uri("/employees/{id}", "1") - .retrieve() - .bodyToMono(Employee.class); + .uri("/employees/{id}", "1") + .retrieve() + .bodyToMono(Employee.class); employeeMono.subscribe(employee -> LOGGER.info("Employee: {}", employee)); Flux employeeFlux = client.get() - .uri("/employees") - .retrieve() - .bodyToFlux(Employee.class); + .uri("/employees") + .retrieve() + .bodyToFlux(Employee.class); employeeFlux.subscribe(employee -> LOGGER.info("Employee: {}", employee)); } -} \ No newline at end of file +} diff --git a/spring-reactive/src/main/java/com/baeldung/reactive/webflux/annotation/EmployeeWebSecurityConfig.java b/spring-reactive/src/main/java/com/baeldung/reactive/webflux/annotation/EmployeeWebSecurityConfig.java index 8dfa455ce3..fc98b70c0f 100644 --- a/spring-reactive/src/main/java/com/baeldung/reactive/webflux/annotation/EmployeeWebSecurityConfig.java +++ b/spring-reactive/src/main/java/com/baeldung/reactive/webflux/annotation/EmployeeWebSecurityConfig.java @@ -13,33 +13,31 @@ import org.springframework.security.web.server.SecurityWebFilterChain; @EnableWebFluxSecurity public class EmployeeWebSecurityConfig { - + @Bean public MapReactiveUserDetailsService userDetailsService() { UserDetails user = User - .withUsername("admin") - .password(passwordEncoder().encode("password")) - .roles("ADMIN") - .build(); + .withUsername("admin") + .password(passwordEncoder().encode("password")) + .roles("ADMIN") + .build(); return new MapReactiveUserDetailsService(user); } @Bean public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { - http.csrf() - .disable() - .authorizeExchange() - .pathMatchers(HttpMethod.POST, "/employees/update") - .hasRole("ADMIN") - .pathMatchers("/**") - .permitAll() - .and() - .httpBasic(); + http + .csrf().disable() + .authorizeExchange() + .pathMatchers(HttpMethod.POST, "/employees/update").hasRole("ADMIN") + .pathMatchers("/**").permitAll() + .and() + .httpBasic(); return http.build(); } - + @Bean public PasswordEncoder passwordEncoder() { - return new BCryptPasswordEncoder(); + return new BCryptPasswordEncoder(); } } diff --git a/spring-reactive/src/main/java/com/baeldung/reactive/webflux/functional/EmployeeFunctionalConfig.java b/spring-reactive/src/main/java/com/baeldung/reactive/webflux/functional/EmployeeFunctionalConfig.java index f97d40e4e7..8b5c7233d6 100644 --- a/spring-reactive/src/main/java/com/baeldung/reactive/webflux/functional/EmployeeFunctionalConfig.java +++ b/spring-reactive/src/main/java/com/baeldung/reactive/webflux/functional/EmployeeFunctionalConfig.java @@ -25,50 +25,49 @@ public class EmployeeFunctionalConfig { @Bean RouterFunction getAllEmployeesRoute() { - return route(GET("/employees"), - req -> ok().body( - employeeRepository().findAllEmployees(), Employee.class)); + return route(GET("/employees"), + req -> ok().body( + employeeRepository().findAllEmployees(), Employee.class)); } @Bean RouterFunction getEmployeeByIdRoute() { - return route(GET("/employees/{id}"), - req -> ok().body( - employeeRepository().findEmployeeById(req.pathVariable("id")), Employee.class)); + return route(GET("/employees/{id}"), + req -> ok().body( + employeeRepository().findEmployeeById(req.pathVariable("id")), Employee.class)); } @Bean RouterFunction updateEmployeeRoute() { - return route(POST("/employees/update"), - req -> req.body(toMono(Employee.class)) - .doOnNext(employeeRepository()::updateEmployee) - .then(ok().build())); + return route(POST("/employees/update"), + req -> req.body(toMono(Employee.class)) + .doOnNext(employeeRepository()::updateEmployee) + .then(ok().build())); } @Bean RouterFunction composedRoutes() { - return - route(GET("/employees"), + return + route(GET("/employees"), req -> ok().body( employeeRepository().findAllEmployees(), Employee.class)) - - .and(route(GET("/employees/{id}"), - req -> ok().body( - employeeRepository().findEmployeeById(req.pathVariable("id")), Employee.class))) - - .and(route(POST("/employees/update"), - req -> req.body(toMono(Employee.class)) - .doOnNext(employeeRepository()::updateEmployee) - .then(ok().build()))); + + .and(route(GET("/employees/{id}"), + req -> ok().body( + employeeRepository().findEmployeeById(req.pathVariable("id")), Employee.class))) + + .and(route(POST("/employees/update"), + req -> req.body(toMono(Employee.class)) + .doOnNext(employeeRepository()::updateEmployee) + .then(ok().build()))); } @Bean public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { - http.csrf() - .disable() - .authorizeExchange() - .anyExchange() - .permitAll(); + http + .csrf().disable() + .authorizeExchange() + .anyExchange().permitAll(); return http.build(); } } diff --git a/spring-reactive/src/test/java/com/baeldung/reactive/webflux/annotation/EmployeeControllerIntegrationTest.java b/spring-reactive/src/test/java/com/baeldung/reactive/webflux/annotation/EmployeeControllerIntegrationTest.java index c4a11e7f3b..699bc9c154 100644 --- a/spring-reactive/src/test/java/com/baeldung/reactive/webflux/annotation/EmployeeControllerIntegrationTest.java +++ b/spring-reactive/src/test/java/com/baeldung/reactive/webflux/annotation/EmployeeControllerIntegrationTest.java @@ -22,7 +22,7 @@ import static org.mockito.Mockito.verifyNoInteractions; import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; @RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = RANDOM_PORT, classes= EmployeeSpringApplication.class) +@SpringBootTest(webEnvironment = RANDOM_PORT, classes = EmployeeSpringApplication.class) public class EmployeeControllerIntegrationTest { @Autowired @@ -39,10 +39,10 @@ public class EmployeeControllerIntegrationTest { given(employeeRepository.findEmployeeById("1")).willReturn(Mono.just(employee)); testClient.get() - .uri("/employees/1") - .exchange() - .expectStatus().isOk() - .expectBody(Employee.class).isEqualTo(employee); + .uri("/employees/1") + .exchange() + .expectStatus().isOk() + .expectBody(Employee.class).isEqualTo(employee); } @Test @@ -57,14 +57,14 @@ public class EmployeeControllerIntegrationTest { given(employeeRepository.findAllEmployees()).willReturn(employeeFlux); testClient.get() - .uri("/employees") - .exchange() - .expectStatus().isOk() - .expectBodyList(Employee.class).isEqualTo(employeeList); + .uri("/employees") + .exchange() + .expectStatus().isOk() + .expectBodyList(Employee.class).isEqualTo(employeeList); } @Test - @WithMockUser(username = "admin", roles = {"ADMIN"}) + @WithMockUser(username = "admin", roles = { "ADMIN" }) public void givenValidUser_whenUpdateEmployee_thenEmployeeUpdated() { Employee employee = new Employee("10", "Employee 10 Updated"); diff --git a/spring-reactive/src/test/java/com/baeldung/reactive/webflux/functional/EmployeeSpringFunctionalIntegrationTest.java b/spring-reactive/src/test/java/com/baeldung/reactive/webflux/functional/EmployeeSpringFunctionalIntegrationTest.java index da866724cc..198ec0d081 100644 --- a/spring-reactive/src/test/java/com/baeldung/reactive/webflux/functional/EmployeeSpringFunctionalIntegrationTest.java +++ b/spring-reactive/src/test/java/com/baeldung/reactive/webflux/functional/EmployeeSpringFunctionalIntegrationTest.java @@ -2,10 +2,8 @@ package com.baeldung.reactive.webflux.functional; import com.baeldung.reactive.webflux.Employee; import com.baeldung.reactive.webflux.EmployeeRepository; -import org.junit.FixMethodOrder; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.MethodSorters; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; @@ -19,10 +17,10 @@ import java.util.List; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.verify; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; @RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = EmployeeSpringFunctionalApplication.class) -@FixMethodOrder(MethodSorters.NAME_ASCENDING) +@SpringBootTest(webEnvironment = RANDOM_PORT, classes = EmployeeSpringFunctionalApplication.class) public class EmployeeSpringFunctionalIntegrationTest { @Autowired @@ -34,58 +32,54 @@ public class EmployeeSpringFunctionalIntegrationTest { @Test public void givenEmployeeId_whenGetEmployeeById_thenCorrectEmployee() { WebTestClient client = WebTestClient - .bindToRouterFunction(config.getEmployeeByIdRoute()) - .build(); + .bindToRouterFunction(config.getEmployeeByIdRoute()) + .build(); Employee employee = new Employee("1", "Employee 1"); given(employeeRepository.findEmployeeById("1")).willReturn(Mono.just(employee)); client.get() - .uri("/employees/1") - .exchange() - .expectStatus() - .isOk() - .expectBody(Employee.class) - .isEqualTo(employee); + .uri("/employees/1") + .exchange() + .expectStatus().isOk() + .expectBody(Employee.class).isEqualTo(employee); } @Test public void whenGetAllEmployees_thenCorrectEmployees() { WebTestClient client = WebTestClient - .bindToRouterFunction(config.getAllEmployeesRoute()) - .build(); + .bindToRouterFunction(config.getAllEmployeesRoute()) + .build(); List employees = Arrays.asList( - new Employee("1", "Employee 1"), - new Employee("2", "Employee 2")); + new Employee("1", "Employee 1"), + new Employee("2", "Employee 2") + ); Flux employeeFlux = Flux.fromIterable(employees); given(employeeRepository.findAllEmployees()).willReturn(employeeFlux); client.get() - .uri("/employees") - .exchange() - .expectStatus() - .isOk() - .expectBodyList(Employee.class) - .isEqualTo(employees); + .uri("/employees") + .exchange() + .expectStatus().isOk() + .expectBodyList(Employee.class).isEqualTo(employees); } @Test public void whenUpdateEmployee_thenEmployeeUpdated() { WebTestClient client = WebTestClient - .bindToRouterFunction(config.updateEmployeeRoute()) - .build(); + .bindToRouterFunction(config.updateEmployeeRoute()) + .build(); Employee employee = new Employee("1", "Employee 1 Updated"); client.post() - .uri("/employees/update") - .body(Mono.just(employee), Employee.class) - .exchange() - .expectStatus() - .isOk(); + .uri("/employees/update") + .body(Mono.just(employee), Employee.class) + .exchange() + .expectStatus().isOk(); verify(employeeRepository).updateEmployee(employee); } From 4690807a092e40d216c4e1083961120712966a28 Mon Sep 17 00:00:00 2001 From: freelansam <79205526+freelansam@users.noreply.github.com> Date: Thu, 28 Apr 2022 22:45:45 +0530 Subject: [PATCH 108/278] JAVA-11420: Dissolve spring-boot-1 and spring-boot-2 inside (#12122) spring-boot-modules --- spring-4/README.md | 1 + spring-4/pom.xml | 4 + .../com/baeldung/actuator/CustomEndpoint.java | 0 .../com/baeldung/actuator/HealthCheck.java | 0 .../baeldung/actuator/LoginServiceImpl.java | 0 .../com/baeldung/actuator/SpringBoot.java | 0 .../src/main/resources/application.properties | 21 ++ .../CustomEndpointIntegrationTest.java | 0 .../actuator/HealthCheckIntegrationTest.java | 0 .../actuator/HealthCheckUnitTest.java | 0 .../actuator/LoginServiceIntegrationTest.java | 0 .../actuator/LoginServiceUnitTest.java | 0 spring-boot-modules/pom.xml | 2 - .../.mvn/wrapper/maven-wrapper.properties | 1 - spring-boot-modules/spring-boot-1/README.md | 11 - spring-boot-modules/spring-boot-1/mvnw | 234 ------------- spring-boot-modules/spring-boot-1/mvnw.cmd | 143 -------- spring-boot-modules/spring-boot-1/pom.xml | 74 ----- .../src/main/resources/application.properties | 19 -- .../src/main/resources/logback.xml | 13 - .../src/test/resources/logback-test.xml | 12 - .../.mvn/wrapper/MavenWrapperDownloader.java | 117 ------- .../.mvn/wrapper/maven-wrapper.properties | 2 - spring-boot-modules/spring-boot-2/README.md | 3 - spring-boot-modules/spring-boot-2/mvnw | 310 ------------------ spring-boot-modules/spring-boot-2/mvnw.cmd | 182 ---------- spring-boot-modules/spring-boot-2/pom.xml | 71 ---- .../src/main/resources/application.properties | 3 - .../README.md | 3 +- .../spring-boot-basic-customization-2/pom.xml | 28 +- .../springStart/SpringStartApplication.java | 0 .../src/main/resources/application.properties | 7 +- .../spring-boot-data-2/README.md | 2 + .../spring-boot-data-2/pom.xml | 10 +- .../dynamicvalidation/ContactInfo.java | 0 .../ContactInfoValidator.java | 0 .../DynamicValidationApp.java | 0 .../config/CustomerController.java | 0 .../config/PersistenceConfig.java | 0 .../dao/ContactInfoExpressionRepository.java | 0 .../model/ContactInfoExpression.java | 0 .../dynamicvalidation/model/Customer.java | 0 .../src/main/resources/data-expressions.sql | 6 + .../src/main/resources/schema-expressions.sql | 5 + .../main/resources/templates/customer.html | 0 .../src/test/resources/application.properties | 0 .../spring-boot-deployment/README.md | 1 + .../ShutdownHookApplication.java | 0 .../baeldung/shutdownhooks/beans/Bean1.java | 0 .../baeldung/shutdownhooks/beans/Bean2.java | 0 .../baeldung/shutdownhooks/beans/Bean3.java | 0 .../config/ExampleServletContextListener.java | 0 .../config/ShutdownHookConfiguration.java | 0 .../spring-boot-mvc-4/README.md | 1 + .../WarInitializerApplication.java | 2 +- ...InitializerApplicationIntegrationTest.java | 0 56 files changed, 85 insertions(+), 1203 deletions(-) rename {spring-boot-modules/spring-boot-1 => spring-4}/src/main/java/com/baeldung/actuator/CustomEndpoint.java (100%) rename {spring-boot-modules/spring-boot-1 => spring-4}/src/main/java/com/baeldung/actuator/HealthCheck.java (100%) rename {spring-boot-modules/spring-boot-1 => spring-4}/src/main/java/com/baeldung/actuator/LoginServiceImpl.java (100%) rename {spring-boot-modules/spring-boot-1 => spring-4}/src/main/java/com/baeldung/actuator/SpringBoot.java (100%) rename {spring-boot-modules/spring-boot-1 => spring-4}/src/test/java/com/baeldung/actuator/CustomEndpointIntegrationTest.java (100%) rename {spring-boot-modules/spring-boot-1 => spring-4}/src/test/java/com/baeldung/actuator/HealthCheckIntegrationTest.java (100%) rename {spring-boot-modules/spring-boot-1 => spring-4}/src/test/java/com/baeldung/actuator/HealthCheckUnitTest.java (100%) rename {spring-boot-modules/spring-boot-1 => spring-4}/src/test/java/com/baeldung/actuator/LoginServiceIntegrationTest.java (100%) rename {spring-boot-modules/spring-boot-1 => spring-4}/src/test/java/com/baeldung/actuator/LoginServiceUnitTest.java (100%) delete mode 100644 spring-boot-modules/spring-boot-1/.mvn/wrapper/maven-wrapper.properties delete mode 100644 spring-boot-modules/spring-boot-1/README.md delete mode 100755 spring-boot-modules/spring-boot-1/mvnw delete mode 100644 spring-boot-modules/spring-boot-1/mvnw.cmd delete mode 100644 spring-boot-modules/spring-boot-1/pom.xml delete mode 100644 spring-boot-modules/spring-boot-1/src/main/resources/application.properties delete mode 100644 spring-boot-modules/spring-boot-1/src/main/resources/logback.xml delete mode 100644 spring-boot-modules/spring-boot-1/src/test/resources/logback-test.xml delete mode 100644 spring-boot-modules/spring-boot-2/.mvn/wrapper/MavenWrapperDownloader.java delete mode 100644 spring-boot-modules/spring-boot-2/.mvn/wrapper/maven-wrapper.properties delete mode 100644 spring-boot-modules/spring-boot-2/README.md delete mode 100644 spring-boot-modules/spring-boot-2/mvnw delete mode 100644 spring-boot-modules/spring-boot-2/mvnw.cmd delete mode 100644 spring-boot-modules/spring-boot-2/pom.xml delete mode 100644 spring-boot-modules/spring-boot-2/src/main/resources/application.properties rename spring-boot-modules/{spring-boot-2 => spring-boot-basic-customization-2}/src/main/java/com/baeldung/springStart/SpringStartApplication.java (100%) rename spring-boot-modules/{spring-boot-1 => spring-boot-data-2}/src/main/java/com/baeldung/dynamicvalidation/ContactInfo.java (100%) rename spring-boot-modules/{spring-boot-1 => spring-boot-data-2}/src/main/java/com/baeldung/dynamicvalidation/ContactInfoValidator.java (100%) rename spring-boot-modules/{spring-boot-1 => spring-boot-data-2}/src/main/java/com/baeldung/dynamicvalidation/DynamicValidationApp.java (100%) rename spring-boot-modules/{spring-boot-1 => spring-boot-data-2}/src/main/java/com/baeldung/dynamicvalidation/config/CustomerController.java (100%) rename spring-boot-modules/{spring-boot-1 => spring-boot-data-2}/src/main/java/com/baeldung/dynamicvalidation/config/PersistenceConfig.java (100%) rename spring-boot-modules/{spring-boot-1 => spring-boot-data-2}/src/main/java/com/baeldung/dynamicvalidation/dao/ContactInfoExpressionRepository.java (100%) rename spring-boot-modules/{spring-boot-1 => spring-boot-data-2}/src/main/java/com/baeldung/dynamicvalidation/model/ContactInfoExpression.java (100%) rename spring-boot-modules/{spring-boot-1 => spring-boot-data-2}/src/main/java/com/baeldung/dynamicvalidation/model/Customer.java (100%) create mode 100644 spring-boot-modules/spring-boot-data-2/src/main/resources/data-expressions.sql create mode 100644 spring-boot-modules/spring-boot-data-2/src/main/resources/schema-expressions.sql rename spring-boot-modules/{spring-boot-1 => spring-boot-data-2}/src/main/resources/templates/customer.html (100%) rename spring-boot-modules/{spring-boot-1 => spring-boot-data-2}/src/test/resources/application.properties (100%) rename spring-boot-modules/{spring-boot-1 => spring-boot-deployment}/src/main/java/com/baeldung/shutdownhooks/ShutdownHookApplication.java (100%) rename spring-boot-modules/{spring-boot-1 => spring-boot-deployment}/src/main/java/com/baeldung/shutdownhooks/beans/Bean1.java (100%) rename spring-boot-modules/{spring-boot-1 => spring-boot-deployment}/src/main/java/com/baeldung/shutdownhooks/beans/Bean2.java (100%) rename spring-boot-modules/{spring-boot-1 => spring-boot-deployment}/src/main/java/com/baeldung/shutdownhooks/beans/Bean3.java (100%) rename spring-boot-modules/{spring-boot-1 => spring-boot-deployment}/src/main/java/com/baeldung/shutdownhooks/config/ExampleServletContextListener.java (100%) rename spring-boot-modules/{spring-boot-1 => spring-boot-deployment}/src/main/java/com/baeldung/shutdownhooks/config/ShutdownHookConfiguration.java (100%) rename spring-boot-modules/{spring-boot-1 => spring-boot-mvc-4}/src/main/java/com/baeldung/servletinitializer/WarInitializerApplication.java (93%) rename spring-boot-modules/{spring-boot-1 => spring-boot-mvc-4}/src/test/java/com/baeldung/servletinitializer/WarInitializerApplicationIntegrationTest.java (100%) diff --git a/spring-4/README.md b/spring-4/README.md index 46d9b71e5c..add82c7e00 100644 --- a/spring-4/README.md +++ b/spring-4/README.md @@ -7,3 +7,4 @@ This module contains articles about Spring 4 - [Configuring a Hikari Connection Pool with Spring Boot](https://www.baeldung.com/spring-boot-hikari) - [Spring JSON-P with Jackson](https://www.baeldung.com/spring-jackson-jsonp) - [What’s New in Spring 4.3?](https://www.baeldung.com/whats-new-in-spring-4-3) +- [Spring Boot Actuator](https://www.baeldung.com/spring-boot-actuators) diff --git a/spring-4/pom.xml b/spring-4/pom.xml index 5887bd43e2..681747c1f6 100644 --- a/spring-4/pom.xml +++ b/spring-4/pom.xml @@ -31,6 +31,10 @@ + + org.springframework.boot + spring-boot-starter-actuator + com.h2database h2 diff --git a/spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/actuator/CustomEndpoint.java b/spring-4/src/main/java/com/baeldung/actuator/CustomEndpoint.java similarity index 100% rename from spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/actuator/CustomEndpoint.java rename to spring-4/src/main/java/com/baeldung/actuator/CustomEndpoint.java diff --git a/spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/actuator/HealthCheck.java b/spring-4/src/main/java/com/baeldung/actuator/HealthCheck.java similarity index 100% rename from spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/actuator/HealthCheck.java rename to spring-4/src/main/java/com/baeldung/actuator/HealthCheck.java diff --git a/spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/actuator/LoginServiceImpl.java b/spring-4/src/main/java/com/baeldung/actuator/LoginServiceImpl.java similarity index 100% rename from spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/actuator/LoginServiceImpl.java rename to spring-4/src/main/java/com/baeldung/actuator/LoginServiceImpl.java diff --git a/spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/actuator/SpringBoot.java b/spring-4/src/main/java/com/baeldung/actuator/SpringBoot.java similarity index 100% rename from spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/actuator/SpringBoot.java rename to spring-4/src/main/java/com/baeldung/actuator/SpringBoot.java diff --git a/spring-4/src/main/resources/application.properties b/spring-4/src/main/resources/application.properties index e67700b7be..ca6dbb5580 100644 --- a/spring-4/src/main/resources/application.properties +++ b/spring-4/src/main/resources/application.properties @@ -3,3 +3,24 @@ feature.new.foo=Y last.active.after=2018-03-14T00:00:00Z first.active.after=2999-03-15T00:00:00Z logging.level.org.flips=info + +#actuator properties +### server port +server.port=8080 +#port used to expose actuator +management.port=8081 +#CIDR allowed to hit actuator +management.address=127.0.0.1 +# Actuator Configuration +# customize /beans endpoint +endpoints.beans.id=springbeans +endpoints.beans.sensitive=false +endpoints.beans.enabled=true +# for the Spring Boot version 1.5.0 and above, we have to disable security to expose the health endpoint fully for unauthorized access. +# see: https://docs.spring.io/spring-boot/docs/1.5.x/reference/html/production-ready-monitoring.html +management.security.enabled=false +endpoints.health.sensitive=false +# customize /info endpoint +info.app.name=Spring Sample Application +info.app.description=This is my first spring boot application +info.app.version=1.0.0 \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-1/src/test/java/com/baeldung/actuator/CustomEndpointIntegrationTest.java b/spring-4/src/test/java/com/baeldung/actuator/CustomEndpointIntegrationTest.java similarity index 100% rename from spring-boot-modules/spring-boot-1/src/test/java/com/baeldung/actuator/CustomEndpointIntegrationTest.java rename to spring-4/src/test/java/com/baeldung/actuator/CustomEndpointIntegrationTest.java diff --git a/spring-boot-modules/spring-boot-1/src/test/java/com/baeldung/actuator/HealthCheckIntegrationTest.java b/spring-4/src/test/java/com/baeldung/actuator/HealthCheckIntegrationTest.java similarity index 100% rename from spring-boot-modules/spring-boot-1/src/test/java/com/baeldung/actuator/HealthCheckIntegrationTest.java rename to spring-4/src/test/java/com/baeldung/actuator/HealthCheckIntegrationTest.java diff --git a/spring-boot-modules/spring-boot-1/src/test/java/com/baeldung/actuator/HealthCheckUnitTest.java b/spring-4/src/test/java/com/baeldung/actuator/HealthCheckUnitTest.java similarity index 100% rename from spring-boot-modules/spring-boot-1/src/test/java/com/baeldung/actuator/HealthCheckUnitTest.java rename to spring-4/src/test/java/com/baeldung/actuator/HealthCheckUnitTest.java diff --git a/spring-boot-modules/spring-boot-1/src/test/java/com/baeldung/actuator/LoginServiceIntegrationTest.java b/spring-4/src/test/java/com/baeldung/actuator/LoginServiceIntegrationTest.java similarity index 100% rename from spring-boot-modules/spring-boot-1/src/test/java/com/baeldung/actuator/LoginServiceIntegrationTest.java rename to spring-4/src/test/java/com/baeldung/actuator/LoginServiceIntegrationTest.java diff --git a/spring-boot-modules/spring-boot-1/src/test/java/com/baeldung/actuator/LoginServiceUnitTest.java b/spring-4/src/test/java/com/baeldung/actuator/LoginServiceUnitTest.java similarity index 100% rename from spring-boot-modules/spring-boot-1/src/test/java/com/baeldung/actuator/LoginServiceUnitTest.java rename to spring-4/src/test/java/com/baeldung/actuator/LoginServiceUnitTest.java diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index 939add1147..003a52db13 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -17,8 +17,6 @@ - spring-boot-1 - spring-boot-2 spring-boot-admin spring-boot-angular spring-boot-annotations diff --git a/spring-boot-modules/spring-boot-1/.mvn/wrapper/maven-wrapper.properties b/spring-boot-modules/spring-boot-1/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index 9dda3b659b..0000000000 --- a/spring-boot-modules/spring-boot-1/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1 +0,0 @@ -distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.2/apache-maven-3.5.2-bin.zip diff --git a/spring-boot-modules/spring-boot-1/README.md b/spring-boot-modules/spring-boot-1/README.md deleted file mode 100644 index 8e5214c69a..0000000000 --- a/spring-boot-modules/spring-boot-1/README.md +++ /dev/null @@ -1,11 +0,0 @@ -## Spring Boot 1.x Actuator - -This module contains articles about Spring Boot Actuator in Spring Boot version 1.x. - -## Relevant articles: -- [Spring Boot Actuator](https://www.baeldung.com/spring-boot-actuators) -- [A Quick Intro to the SpringBootServletInitializer](https://www.baeldung.com/spring-boot-servlet-initializer) -- [Spring Shutdown Callbacks](https://www.baeldung.com/spring-shutdown-callbacks) -- [Dynamic DTO Validation Config Retrieved from the Database](https://www.baeldung.com/spring-dynamic-dto-validation) - - diff --git a/spring-boot-modules/spring-boot-1/mvnw b/spring-boot-modules/spring-boot-1/mvnw deleted file mode 100755 index b74391fdf4..0000000000 --- a/spring-boot-modules/spring-boot-1/mvnw +++ /dev/null @@ -1,234 +0,0 @@ -#!/bin/sh -# ---------------------------------------------------------------------------- -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# ---------------------------------------------------------------------------- - -# ---------------------------------------------------------------------------- -# Maven2 Start Up Batch script -# -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir -# -# Optional ENV vars -# ----------------- -# M2_HOME - location of maven2's installed home dir -# MAVEN_OPTS - parameters passed to the Java VM when running Maven -# e.g. to debug Maven itself, use -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files -# ---------------------------------------------------------------------------- - -if [ -z "$MAVEN_SKIP_RC" ]; then - - if [ -f /etc/mavenrc ]; then - . /etc/mavenrc - fi - - if [ -f "$HOME/.mavenrc" ]; then - . "$HOME/.mavenrc" - fi - -fi - -# OS specific support. $var _must_ be set to either true or false. -cygwin=false -darwin=false -mingw=false -case "$(uname)" in -CYGWIN*) cygwin=true ;; -MINGW*) mingw=true ;; -Darwin*) - darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - export JAVA_HOME="$(/usr/libexec/java_home)" - else - export JAVA_HOME="/Library/Java/Home" - fi - fi - ;; -esac - -if [ -z "$JAVA_HOME" ]; then - if [ -r /etc/gentoo-release ]; then - JAVA_HOME=$(java-config --jre-home) - fi -fi - -if [ -z "$M2_HOME" ]; then - ## resolve links - $0 may be a link to maven's home - PRG="$0" - - # need this for relative symlinks - while [ -h "$PRG" ]; do - ls=$(ls -ld "$PRG") - link=$(expr "$ls" : '.*-> \(.*\)$') - if expr "$link" : '/.*' >/dev/null; then - PRG="$link" - else - PRG="$(dirname "$PRG")/$link" - fi - done - - saveddir=$(pwd) - - M2_HOME=$(dirname "$PRG")/.. - - # make it fully qualified - M2_HOME=$(cd "$M2_HOME" && pwd) - - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi - -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=$(cygpath --unix "$M2_HOME") - [ -n "$JAVA_HOME" ] && - JAVA_HOME=$(cygpath --unix "$JAVA_HOME") - [ -n "$CLASSPATH" ] && - CLASSPATH=$(cygpath --path --unix "$CLASSPATH") -fi - -# For Migwn, ensure paths are in UNIX format before anything is touched -if $mingw; then - [ -n "$M2_HOME" ] && - M2_HOME="$( ( - cd "$M2_HOME" - pwd - ))" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="$( ( - cd "$JAVA_HOME" - pwd - ))" - # TODO classpath? -fi - -if [ -z "$JAVA_HOME" ]; then - javaExecutable="$(which javac)" - if [ -n "$javaExecutable" ] && ! [ "$(expr \"$javaExecutable\" : '\([^ ]*\)')" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=$(which readlink) - if [ ! $(expr "$readLink" : '\([^ ]*\)') = "no" ]; then - if $darwin; then - javaHome="$(dirname \"$javaExecutable\")" - javaExecutable="$(cd \"$javaHome\" && pwd -P)/javac" - else - javaExecutable="$(readlink -f \"$javaExecutable\")" - fi - javaHome="$(dirname \"$javaExecutable\")" - javaHome=$(expr "$javaHome" : '\(.*\)/bin') - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi - -if [ -z "$JAVACMD" ]; then - if [ -n "$JAVA_HOME" ]; then - if [ -x "$JAVA_HOME/jre/sh/java" ]; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD="$(which java)" - fi -fi - -if [ ! -x "$JAVACMD" ]; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi - -if [ -z "$JAVA_HOME" ]; then - echo "Warning: JAVA_HOME environment variable is not set." -fi - -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher - -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { - - if [ -z "$1" ]; then - echo "Path not specified to find_maven_basedir" - return 1 - fi - - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ]; do - if [ -d "$wdir"/.mvn ]; then - basedir=$wdir - break - fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=$( - cd "$wdir/.." - pwd - ) - fi - # end of workaround - done - echo "${basedir}" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' <"$1")" - fi -} - -BASE_DIR=$(find_maven_basedir "$(pwd)") -if [ -z "$BASE_DIR" ]; then - exit 1 -fi - -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -echo $MAVEN_PROJECTBASEDIR -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=$(cygpath --path --windows "$M2_HOME") - [ -n "$JAVA_HOME" ] && - JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME") - [ -n "$CLASSPATH" ] && - CLASSPATH=$(cygpath --path --windows "$CLASSPATH") - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR") -fi - -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -exec "$JAVACMD" \ - $MAVEN_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/spring-boot-modules/spring-boot-1/mvnw.cmd b/spring-boot-modules/spring-boot-1/mvnw.cmd deleted file mode 100644 index 019bd74d76..0000000000 --- a/spring-boot-modules/spring-boot-1/mvnw.cmd +++ /dev/null @@ -1,143 +0,0 @@ -@REM ---------------------------------------------------------------------------- -@REM Licensed to the Apache Software Foundation (ASF) under one -@REM or more contributor license agreements. See the NOTICE file -@REM distributed with this work for additional information -@REM regarding copyright ownership. The ASF licenses this file -@REM to you under the Apache License, Version 2.0 (the -@REM "License"); you may not use this file except in compliance -@REM with the License. You may obtain a copy of the License at -@REM -@REM http://www.apache.org/licenses/LICENSE-2.0 -@REM -@REM Unless required by applicable law or agreed to in writing, -@REM software distributed under the License is distributed on an -@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -@REM KIND, either express or implied. See the License for the -@REM specific language governing permissions and limitations -@REM under the License. -@REM ---------------------------------------------------------------------------- - -@REM ---------------------------------------------------------------------------- -@REM Maven2 Start Up Batch script -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir -@REM -@REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files -@REM ---------------------------------------------------------------------------- - -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" - -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%" == "on" pause - -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% - -exit /B %ERROR_CODE% diff --git a/spring-boot-modules/spring-boot-1/pom.xml b/spring-boot-modules/spring-boot-1/pom.xml deleted file mode 100644 index 594e6459a4..0000000000 --- a/spring-boot-modules/spring-boot-1/pom.xml +++ /dev/null @@ -1,74 +0,0 @@ - - - 4.0.0 - spring-boot-1 - jar - Module for Spring Boot version 1.x - - - - com.baeldung - parent-boot-1 - 0.0.1-SNAPSHOT - ../../parent-boot-1 - - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-tomcat - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.apache.logging.log4j - log4j-core - ${log4j2.version} - - - com.h2database - h2 - test - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - ${spring-boot.version} - - - - - - 2.17.1 - - - \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-1/src/main/resources/application.properties b/spring-boot-modules/spring-boot-1/src/main/resources/application.properties deleted file mode 100644 index ac095e1cab..0000000000 --- a/spring-boot-modules/spring-boot-1/src/main/resources/application.properties +++ /dev/null @@ -1,19 +0,0 @@ -### server port -server.port=8080 -#port used to expose actuator -management.port=8081 -#CIDR allowed to hit actuator -management.address=127.0.0.1 -# Actuator Configuration -# customize /beans endpoint -endpoints.beans.id=springbeans -endpoints.beans.sensitive=false -endpoints.beans.enabled=true -# for the Spring Boot version 1.5.0 and above, we have to disable security to expose the health endpoint fully for unauthorized access. -# see: https://docs.spring.io/spring-boot/docs/1.5.x/reference/html/production-ready-monitoring.html -management.security.enabled=false -endpoints.health.sensitive=false -# customize /info endpoint -info.app.name=Spring Sample Application -info.app.description=This is my first spring boot application -info.app.version=1.0.0 \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-1/src/main/resources/logback.xml b/spring-boot-modules/spring-boot-1/src/main/resources/logback.xml deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/spring-boot-modules/spring-boot-1/src/main/resources/logback.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - - \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-1/src/test/resources/logback-test.xml b/spring-boot-modules/spring-boot-1/src/test/resources/logback-test.xml deleted file mode 100644 index 8d4771e308..0000000000 --- a/spring-boot-modules/spring-boot-1/src/test/resources/logback-test.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - [%d{ISO8601}]-[%thread] %-5level %logger - %msg%n - - - - - - - \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-2/.mvn/wrapper/MavenWrapperDownloader.java b/spring-boot-modules/spring-boot-2/.mvn/wrapper/MavenWrapperDownloader.java deleted file mode 100644 index b901097f2d..0000000000 --- a/spring-boot-modules/spring-boot-2/.mvn/wrapper/MavenWrapperDownloader.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2007-present the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import java.net.*; -import java.io.*; -import java.nio.channels.*; -import java.util.Properties; - -public class MavenWrapperDownloader { - - private static final String WRAPPER_VERSION = "0.5.6"; - /** - * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. - */ - private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" - + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; - - /** - * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to - * use instead of the default one. - */ - private static final String MAVEN_WRAPPER_PROPERTIES_PATH = - ".mvn/wrapper/maven-wrapper.properties"; - - /** - * Path where the maven-wrapper.jar will be saved to. - */ - private static final String MAVEN_WRAPPER_JAR_PATH = - ".mvn/wrapper/maven-wrapper.jar"; - - /** - * Name of the property which should be used to override the default download url for the wrapper. - */ - private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; - - public static void main(String args[]) { - System.out.println("- Downloader started"); - File baseDirectory = new File(args[0]); - System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); - - // If the maven-wrapper.properties exists, read it and check if it contains a custom - // wrapperUrl parameter. - File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); - String url = DEFAULT_DOWNLOAD_URL; - if(mavenWrapperPropertyFile.exists()) { - FileInputStream mavenWrapperPropertyFileInputStream = null; - try { - mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); - Properties mavenWrapperProperties = new Properties(); - mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); - url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); - } catch (IOException e) { - System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); - } finally { - try { - if(mavenWrapperPropertyFileInputStream != null) { - mavenWrapperPropertyFileInputStream.close(); - } - } catch (IOException e) { - // Ignore ... - } - } - } - System.out.println("- Downloading from: " + url); - - File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); - if(!outputFile.getParentFile().exists()) { - if(!outputFile.getParentFile().mkdirs()) { - System.out.println( - "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); - } - } - System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); - try { - downloadFileFromURL(url, outputFile); - System.out.println("Done"); - System.exit(0); - } catch (Throwable e) { - System.out.println("- Error downloading"); - e.printStackTrace(); - System.exit(1); - } - } - - private static void downloadFileFromURL(String urlString, File destination) throws Exception { - if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { - String username = System.getenv("MVNW_USERNAME"); - char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); - Authenticator.setDefault(new Authenticator() { - @Override - protected PasswordAuthentication getPasswordAuthentication() { - return new PasswordAuthentication(username, password); - } - }); - } - URL website = new URL(urlString); - ReadableByteChannel rbc; - rbc = Channels.newChannel(website.openStream()); - FileOutputStream fos = new FileOutputStream(destination); - fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); - fos.close(); - rbc.close(); - } - -} diff --git a/spring-boot-modules/spring-boot-2/.mvn/wrapper/maven-wrapper.properties b/spring-boot-modules/spring-boot-2/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index 642d572ce9..0000000000 --- a/spring-boot-modules/spring-boot-2/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,2 +0,0 @@ -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/spring-boot-modules/spring-boot-2/README.md b/spring-boot-modules/spring-boot-2/README.md deleted file mode 100644 index 7ea97f80c5..0000000000 --- a/spring-boot-modules/spring-boot-2/README.md +++ /dev/null @@ -1,3 +0,0 @@ -### Relevant Articles: - -- [Speed up Spring Boot Startup Time](https://www.baeldung.com/spring-boot-startup-speed) diff --git a/spring-boot-modules/spring-boot-2/mvnw b/spring-boot-modules/spring-boot-2/mvnw deleted file mode 100644 index 41c0f0c23d..0000000000 --- a/spring-boot-modules/spring-boot-2/mvnw +++ /dev/null @@ -1,310 +0,0 @@ -#!/bin/sh -# ---------------------------------------------------------------------------- -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# ---------------------------------------------------------------------------- - -# ---------------------------------------------------------------------------- -# Maven Start Up Batch script -# -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir -# -# Optional ENV vars -# ----------------- -# M2_HOME - location of maven2's installed home dir -# MAVEN_OPTS - parameters passed to the Java VM when running Maven -# e.g. to debug Maven itself, use -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files -# ---------------------------------------------------------------------------- - -if [ -z "$MAVEN_SKIP_RC" ] ; then - - if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc - fi - - if [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" - fi - -fi - -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -mingw=false -case "`uname`" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - export JAVA_HOME="`/usr/libexec/java_home`" - else - export JAVA_HOME="/Library/Java/Home" - fi - fi - ;; -esac - -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=`java-config --jre-home` - fi -fi - -if [ -z "$M2_HOME" ] ; then - ## resolve links - $0 may be a link to maven's home - PRG="$0" - - # need this for relative symlinks - while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi - done - - saveddir=`pwd` - - M2_HOME=`dirname "$PRG"`/.. - - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` - - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi - -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` -fi - -# For Mingw, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" -fi - -if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then - if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" - else - javaExecutable="`readlink -f \"$javaExecutable\"`" - fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi - -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD="`which java`" - fi -fi - -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi - -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." -fi - -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher - -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { - - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 - fi - - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break - fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=`cd "$wdir/.."; pwd` - fi - # end of workaround - done - echo "${basedir}" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" - fi -} - -BASE_DIR=`find_maven_basedir "$(pwd)"` -if [ -z "$BASE_DIR" ]; then - exit 1; -fi - -########################################################################################## -# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -# This allows using the maven wrapper in projects that prohibit checking in binary data. -########################################################################################## -if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found .mvn/wrapper/maven-wrapper.jar" - fi -else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." - fi - if [ -n "$MVNW_REPOURL" ]; then - jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - else - jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - fi - while IFS="=" read key value; do - case "$key" in (wrapperUrl) jarUrl="$value"; break ;; - esac - done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" - if [ "$MVNW_VERBOSE" = true ]; then - echo "Downloading from: $jarUrl" - fi - wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" - if $cygwin; then - wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` - fi - - if command -v wget > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found wget ... using wget" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - wget "$jarUrl" -O "$wrapperJarPath" - else - wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" - fi - elif command -v curl > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found curl ... using curl" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - curl -o "$wrapperJarPath" "$jarUrl" -f - else - curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f - fi - - else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Falling back to using Java to download" - fi - javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" - # For Cygwin, switch paths to Windows format before running javac - if $cygwin; then - javaClass=`cygpath --path --windows "$javaClass"` - fi - if [ -e "$javaClass" ]; then - if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Compiling MavenWrapperDownloader.java ..." - fi - # Compiling the Java class - ("$JAVA_HOME/bin/javac" "$javaClass") - fi - if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - # Running the downloader - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Running MavenWrapperDownloader.java ..." - fi - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") - fi - fi - fi -fi -########################################################################################## -# End of extension -########################################################################################## - -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -if [ "$MVNW_VERBOSE" = true ]; then - echo $MAVEN_PROJECTBASEDIR -fi -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` -fi - -# Provide a "standardized" way to retrieve the CLI args that will -# work with both Windows and non-Windows executions. -MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" -export MAVEN_CMD_LINE_ARGS - -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -exec "$JAVACMD" \ - $MAVEN_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/spring-boot-modules/spring-boot-2/mvnw.cmd b/spring-boot-modules/spring-boot-2/mvnw.cmd deleted file mode 100644 index 86115719e5..0000000000 --- a/spring-boot-modules/spring-boot-2/mvnw.cmd +++ /dev/null @@ -1,182 +0,0 @@ -@REM ---------------------------------------------------------------------------- -@REM Licensed to the Apache Software Foundation (ASF) under one -@REM or more contributor license agreements. See the NOTICE file -@REM distributed with this work for additional information -@REM regarding copyright ownership. The ASF licenses this file -@REM to you under the Apache License, Version 2.0 (the -@REM "License"); you may not use this file except in compliance -@REM with the License. You may obtain a copy of the License at -@REM -@REM http://www.apache.org/licenses/LICENSE-2.0 -@REM -@REM Unless required by applicable law or agreed to in writing, -@REM software distributed under the License is distributed on an -@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -@REM KIND, either express or implied. See the License for the -@REM specific language governing permissions and limitations -@REM under the License. -@REM ---------------------------------------------------------------------------- - -@REM ---------------------------------------------------------------------------- -@REM Maven Start Up Batch script -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir -@REM -@REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files -@REM ---------------------------------------------------------------------------- - -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM set title of command window -title %0 -@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - -FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B -) - -@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -@REM This allows using the maven wrapper in projects that prohibit checking in binary data. -if exist %WRAPPER_JAR% ( - if "%MVNW_VERBOSE%" == "true" ( - echo Found %WRAPPER_JAR% - ) -) else ( - if not "%MVNW_REPOURL%" == "" ( - SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - ) - if "%MVNW_VERBOSE%" == "true" ( - echo Couldn't find %WRAPPER_JAR%, downloading it ... - echo Downloading from: %DOWNLOAD_URL% - ) - - powershell -Command "&{"^ - "$webclient = new-object System.Net.WebClient;"^ - "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ - "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ - "}"^ - "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ - "}" - if "%MVNW_VERBOSE%" == "true" ( - echo Finished downloading %WRAPPER_JAR% - ) -) -@REM End of extension - -@REM Provide a "standardized" way to retrieve the CLI args that will -@REM work with both Windows and non-Windows executions. -set MAVEN_CMD_LINE_ARGS=%* - -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%" == "on" pause - -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% - -exit /B %ERROR_CODE% diff --git a/spring-boot-modules/spring-boot-2/pom.xml b/spring-boot-modules/spring-boot-2/pom.xml deleted file mode 100644 index 0da07eaf00..0000000000 --- a/spring-boot-modules/spring-boot-2/pom.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - 4.0.0 - spring-boot-2 - jar - Module for Spring Boot version 2.x - - - com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../../parent-boot-2 - - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-starter-security - - - org.apache.logging.log4j - log4j-core - ${log4j2.version} - - - org.springframework - spring-context-indexer - ${spring-core.version} - true - - - - - - - org.springframework.boot - spring-boot-maven-plugin - ${spring-boot.version} - - springStartupApp - com.baeldung.springStart.SpringStartApplication - - - - - repackage - - - - - - - - - 2.17.1 - 5.3.15 - 11 - 11 - - - \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-2/src/main/resources/application.properties b/spring-boot-modules/spring-boot-2/src/main/resources/application.properties deleted file mode 100644 index 4a5f46a7b1..0000000000 --- a/spring-boot-modules/spring-boot-2/src/main/resources/application.properties +++ /dev/null @@ -1,3 +0,0 @@ -spring.main.lazy-initialization=true -logging.level.org.springframework.boot.autoconfigure=DEBUG -spring.jmx.enabled=false \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-basic-customization-2/README.md b/spring-boot-modules/spring-boot-basic-customization-2/README.md index bfd24a0475..0f4167d25b 100644 --- a/spring-boot-modules/spring-boot-basic-customization-2/README.md +++ b/spring-boot-modules/spring-boot-basic-customization-2/README.md @@ -9,4 +9,5 @@ This module contains articles about Spring Boot customization 2 - [What Is OncePerRequestFilter?](https://www.baeldung.com/spring-onceperrequestfilter) - [Spring Boot Exit Codes](https://www.baeldung.com/spring-boot-exit-codes) - [Guide to Spring Type Conversions](https://www.baeldung.com/spring-type-conversions) - - [Container Configuration in Spring Boot 2](https://www.baeldung.com/embeddedservletcontainercustomizer-configurableembeddedservletcontainer-spring-boot) \ No newline at end of file + - [Container Configuration in Spring Boot 2](https://www.baeldung.com/embeddedservletcontainercustomizer-configurableembeddedservletcontainer-spring-boot) + - [Speed up Spring Boot Startup Time](https://www.baeldung.com/spring-boot-startup-speed) \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-basic-customization-2/pom.xml b/spring-boot-modules/spring-boot-basic-customization-2/pom.xml index b537f43c23..439051c7e6 100644 --- a/spring-boot-modules/spring-boot-basic-customization-2/pom.xml +++ b/spring-boot-modules/spring-boot-basic-customization-2/pom.xml @@ -23,7 +23,11 @@ org.springframework.boot spring-boot-starter-data-jpa - + + org.springframework.boot + spring-boot-starter-actuator + + com.h2database h2 @@ -31,11 +35,31 @@ org.springframework.boot spring-boot-starter-test - + com.google.guava guava ${guava.version} + + + + org.springframework.boot + spring-boot-maven-plugin + + springStartupApp + com.baeldung.springStart.SpringStartApplication + + + + + repackage + + + + + + + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-2/src/main/java/com/baeldung/springStart/SpringStartApplication.java b/spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/springStart/SpringStartApplication.java similarity index 100% rename from spring-boot-modules/spring-boot-2/src/main/java/com/baeldung/springStart/SpringStartApplication.java rename to spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/springStart/SpringStartApplication.java diff --git a/spring-boot-modules/spring-boot-basic-customization-2/src/main/resources/application.properties b/spring-boot-modules/spring-boot-basic-customization-2/src/main/resources/application.properties index ab9de92c82..370ea40d73 100644 --- a/spring-boot-modules/spring-boot-basic-customization-2/src/main/resources/application.properties +++ b/spring-boot-modules/spring-boot-basic-customization-2/src/main/resources/application.properties @@ -1 +1,6 @@ -sample=string loaded from properties! \ No newline at end of file +sample=string loaded from properties! + +#startup time properties +spring.main.lazy-initialization=true +logging.level.org.springframework.boot.autoconfigure=DEBUG +spring.jmx.enabled=false \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-data-2/README.md b/spring-boot-modules/spring-boot-data-2/README.md index fd9d034f8a..e7d39a78e9 100644 --- a/spring-boot-modules/spring-boot-data-2/README.md +++ b/spring-boot-modules/spring-boot-data-2/README.md @@ -6,3 +6,5 @@ - [Creating a Read-Only Repository with Spring Data](https://www.baeldung.com/spring-data-read-only-repository) - [Using JaVers for Data Model Auditing in Spring Data](https://www.baeldung.com/spring-data-javers-audit) - [BootstrapMode for JPA Repositories](https://github.com/eugenp/tutorials/tree/master/spring-boot-modules/spring-boot-data-2) +- [Dynamic DTO Validation Config Retrieved from the Database](https://www.baeldung.com/spring-dynamic-dto-validation) + diff --git a/spring-boot-modules/spring-boot-data-2/pom.xml b/spring-boot-modules/spring-boot-data-2/pom.xml index ea5de6d4b5..cd03d1b9b1 100644 --- a/spring-boot-modules/spring-boot-data-2/pom.xml +++ b/spring-boot-modules/spring-boot-data-2/pom.xml @@ -16,6 +16,14 @@ org.springframework.boot spring-boot-starter-web + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-validation + org.springframework.boot spring-boot-starter-data-jpa @@ -31,7 +39,7 @@ runtime - + 6.5.3 diff --git a/spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/dynamicvalidation/ContactInfo.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/dynamicvalidation/ContactInfo.java similarity index 100% rename from spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/dynamicvalidation/ContactInfo.java rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/dynamicvalidation/ContactInfo.java diff --git a/spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/dynamicvalidation/ContactInfoValidator.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/dynamicvalidation/ContactInfoValidator.java similarity index 100% rename from spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/dynamicvalidation/ContactInfoValidator.java rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/dynamicvalidation/ContactInfoValidator.java diff --git a/spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/dynamicvalidation/DynamicValidationApp.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/dynamicvalidation/DynamicValidationApp.java similarity index 100% rename from spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/dynamicvalidation/DynamicValidationApp.java rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/dynamicvalidation/DynamicValidationApp.java diff --git a/spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/dynamicvalidation/config/CustomerController.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/dynamicvalidation/config/CustomerController.java similarity index 100% rename from spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/dynamicvalidation/config/CustomerController.java rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/dynamicvalidation/config/CustomerController.java diff --git a/spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/dynamicvalidation/config/PersistenceConfig.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/dynamicvalidation/config/PersistenceConfig.java similarity index 100% rename from spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/dynamicvalidation/config/PersistenceConfig.java rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/dynamicvalidation/config/PersistenceConfig.java diff --git a/spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/dynamicvalidation/dao/ContactInfoExpressionRepository.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/dynamicvalidation/dao/ContactInfoExpressionRepository.java similarity index 100% rename from spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/dynamicvalidation/dao/ContactInfoExpressionRepository.java rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/dynamicvalidation/dao/ContactInfoExpressionRepository.java diff --git a/spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/dynamicvalidation/model/ContactInfoExpression.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/dynamicvalidation/model/ContactInfoExpression.java similarity index 100% rename from spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/dynamicvalidation/model/ContactInfoExpression.java rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/dynamicvalidation/model/ContactInfoExpression.java diff --git a/spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/dynamicvalidation/model/Customer.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/dynamicvalidation/model/Customer.java similarity index 100% rename from spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/dynamicvalidation/model/Customer.java rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/dynamicvalidation/model/Customer.java diff --git a/spring-boot-modules/spring-boot-data-2/src/main/resources/data-expressions.sql b/spring-boot-modules/spring-boot-data-2/src/main/resources/data-expressions.sql new file mode 100644 index 0000000000..5a16ceceb9 --- /dev/null +++ b/spring-boot-modules/spring-boot-data-2/src/main/resources/data-expressions.sql @@ -0,0 +1,6 @@ +insert into contact_info_expression values ('email', + '[a-z0-9!#$%&*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?') +insert into contact_info_expression values ('phone', + '^([0-9]( |-)?)?(\(?[0-9]{3}\)?|[0-9]{3})( |-)?([0-9]{3}( |-)?[0-9]{4}|[a-zA-Z0-9]{7})$') +insert into contact_info_expression values ('website', + '^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$') \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-data-2/src/main/resources/schema-expressions.sql b/spring-boot-modules/spring-boot-data-2/src/main/resources/schema-expressions.sql new file mode 100644 index 0000000000..532faefde1 --- /dev/null +++ b/spring-boot-modules/spring-boot-data-2/src/main/resources/schema-expressions.sql @@ -0,0 +1,5 @@ +CREATE TABLE contact_info_expression( + expression_type varchar(50) not null, + pattern varchar(500) not null, + PRIMARY KEY ( expression_type ) +); \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-1/src/main/resources/templates/customer.html b/spring-boot-modules/spring-boot-data-2/src/main/resources/templates/customer.html similarity index 100% rename from spring-boot-modules/spring-boot-1/src/main/resources/templates/customer.html rename to spring-boot-modules/spring-boot-data-2/src/main/resources/templates/customer.html diff --git a/spring-boot-modules/spring-boot-1/src/test/resources/application.properties b/spring-boot-modules/spring-boot-data-2/src/test/resources/application.properties similarity index 100% rename from spring-boot-modules/spring-boot-1/src/test/resources/application.properties rename to spring-boot-modules/spring-boot-data-2/src/test/resources/application.properties diff --git a/spring-boot-modules/spring-boot-deployment/README.md b/spring-boot-modules/spring-boot-deployment/README.md index 85f288d33b..125de43a88 100644 --- a/spring-boot-modules/spring-boot-deployment/README.md +++ b/spring-boot-modules/spring-boot-deployment/README.md @@ -7,3 +7,4 @@ This module contains articles about deployment of a Spring Boot Application - [Spring Boot Console Application](https://www.baeldung.com/spring-boot-console-app) - [Comparing Embedded Servlet Containers in Spring Boot](https://www.baeldung.com/spring-boot-servlet-containers) - [Graceful Shutdown of a Spring Boot Application](https://www.baeldung.com/spring-boot-graceful-shutdown) + - [Spring Shutdown Callbacks](https://www.baeldung.com/spring-shutdown-callbacks) diff --git a/spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/shutdownhooks/ShutdownHookApplication.java b/spring-boot-modules/spring-boot-deployment/src/main/java/com/baeldung/shutdownhooks/ShutdownHookApplication.java similarity index 100% rename from spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/shutdownhooks/ShutdownHookApplication.java rename to spring-boot-modules/spring-boot-deployment/src/main/java/com/baeldung/shutdownhooks/ShutdownHookApplication.java diff --git a/spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/shutdownhooks/beans/Bean1.java b/spring-boot-modules/spring-boot-deployment/src/main/java/com/baeldung/shutdownhooks/beans/Bean1.java similarity index 100% rename from spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/shutdownhooks/beans/Bean1.java rename to spring-boot-modules/spring-boot-deployment/src/main/java/com/baeldung/shutdownhooks/beans/Bean1.java diff --git a/spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/shutdownhooks/beans/Bean2.java b/spring-boot-modules/spring-boot-deployment/src/main/java/com/baeldung/shutdownhooks/beans/Bean2.java similarity index 100% rename from spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/shutdownhooks/beans/Bean2.java rename to spring-boot-modules/spring-boot-deployment/src/main/java/com/baeldung/shutdownhooks/beans/Bean2.java diff --git a/spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/shutdownhooks/beans/Bean3.java b/spring-boot-modules/spring-boot-deployment/src/main/java/com/baeldung/shutdownhooks/beans/Bean3.java similarity index 100% rename from spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/shutdownhooks/beans/Bean3.java rename to spring-boot-modules/spring-boot-deployment/src/main/java/com/baeldung/shutdownhooks/beans/Bean3.java diff --git a/spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/shutdownhooks/config/ExampleServletContextListener.java b/spring-boot-modules/spring-boot-deployment/src/main/java/com/baeldung/shutdownhooks/config/ExampleServletContextListener.java similarity index 100% rename from spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/shutdownhooks/config/ExampleServletContextListener.java rename to spring-boot-modules/spring-boot-deployment/src/main/java/com/baeldung/shutdownhooks/config/ExampleServletContextListener.java diff --git a/spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/shutdownhooks/config/ShutdownHookConfiguration.java b/spring-boot-modules/spring-boot-deployment/src/main/java/com/baeldung/shutdownhooks/config/ShutdownHookConfiguration.java similarity index 100% rename from spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/shutdownhooks/config/ShutdownHookConfiguration.java rename to spring-boot-modules/spring-boot-deployment/src/main/java/com/baeldung/shutdownhooks/config/ShutdownHookConfiguration.java diff --git a/spring-boot-modules/spring-boot-mvc-4/README.md b/spring-boot-modules/spring-boot-mvc-4/README.md index c6820ce930..d215525ab5 100644 --- a/spring-boot-modules/spring-boot-mvc-4/README.md +++ b/spring-boot-modules/spring-boot-mvc-4/README.md @@ -7,4 +7,5 @@ This module contains articles about Spring Web MVC in Spring Boot projects. - [How to Register a Servlet in Java](https://www.baeldung.com/register-servlet) - [Guide to Spring WebUtils and ServletRequestUtils](https://www.baeldung.com/spring-webutils-servletrequestutils) - [Configure a Spring Boot Web Application](https://www.baeldung.com/spring-boot-application-configuration) +- [A Quick Intro to the SpringBootServletInitializer](https://www.baeldung.com/spring-boot-servlet-initializer) - [A Guide to Spring in Eclipse STS](https://www.baeldung.com/eclipse-sts-spring) diff --git a/spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/servletinitializer/WarInitializerApplication.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/servletinitializer/WarInitializerApplication.java similarity index 93% rename from spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/servletinitializer/WarInitializerApplication.java rename to spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/servletinitializer/WarInitializerApplication.java index 0aa0f0ae0b..5b9ce1271e 100644 --- a/spring-boot-modules/spring-boot-1/src/main/java/com/baeldung/servletinitializer/WarInitializerApplication.java +++ b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/servletinitializer/WarInitializerApplication.java @@ -5,7 +5,7 @@ import java.time.LocalDateTime; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; diff --git a/spring-boot-modules/spring-boot-1/src/test/java/com/baeldung/servletinitializer/WarInitializerApplicationIntegrationTest.java b/spring-boot-modules/spring-boot-mvc-4/src/test/java/com/baeldung/servletinitializer/WarInitializerApplicationIntegrationTest.java similarity index 100% rename from spring-boot-modules/spring-boot-1/src/test/java/com/baeldung/servletinitializer/WarInitializerApplicationIntegrationTest.java rename to spring-boot-modules/spring-boot-mvc-4/src/test/java/com/baeldung/servletinitializer/WarInitializerApplicationIntegrationTest.java From 31a903b5522175518788c56c7952a8ac3f37fba5 Mon Sep 17 00:00:00 2001 From: lucaCambi77 Date: Fri, 29 Apr 2022 01:20:55 +0200 Subject: [PATCH 109/278] fix: move to spring-data-mongodb (#12089) --- .../spring-data-mongodb/pom.xml | 7 +++ .../baeldung/projection/model/InStock.java | 0 .../baeldung/projection/model/Inventory.java | 3 +- .../com/baeldung/projection/model/Size.java | 0 .../repository/InventoryRepository.java | 0 .../projection/AbstractTestProjection.java | 39 ----------------- .../MongoTemplateProjectionUnitTest.java | 17 +++++--- .../RepositoryProjectionUnitTest.java | 12 +++--- .../projection/config/ProjectionConfig.java | 43 +++++++++++++++++++ 9 files changed, 71 insertions(+), 50 deletions(-) rename persistence-modules/{spring-boot-persistence-mongodb => spring-data-mongodb}/src/main/java/com/baeldung/projection/model/InStock.java (100%) rename persistence-modules/{spring-boot-persistence-mongodb => spring-data-mongodb}/src/main/java/com/baeldung/projection/model/Inventory.java (96%) rename persistence-modules/{spring-boot-persistence-mongodb => spring-data-mongodb}/src/main/java/com/baeldung/projection/model/Size.java (100%) rename persistence-modules/{spring-boot-persistence-mongodb => spring-data-mongodb}/src/main/java/com/baeldung/projection/repository/InventoryRepository.java (100%) rename persistence-modules/{spring-boot-persistence-mongodb => spring-data-mongodb}/src/test/java/com/baeldung/projection/AbstractTestProjection.java (54%) rename persistence-modules/{spring-boot-persistence-mongodb => spring-data-mongodb}/src/test/java/com/baeldung/projection/MongoTemplateProjectionUnitTest.java (92%) rename persistence-modules/{spring-boot-persistence-mongodb => spring-data-mongodb}/src/test/java/com/baeldung/projection/RepositoryProjectionUnitTest.java (94%) create mode 100644 persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/projection/config/ProjectionConfig.java diff --git a/persistence-modules/spring-data-mongodb/pom.xml b/persistence-modules/spring-data-mongodb/pom.xml index ef5a0f0550..afb5e8b9c1 100644 --- a/persistence-modules/spring-data-mongodb/pom.xml +++ b/persistence-modules/spring-data-mongodb/pom.xml @@ -73,6 +73,12 @@ querydsl-apt ${querydsl.version} + + de.flapdoodle.embed + de.flapdoodle.embed.mongo + ${embed.mongo.version} + test + @@ -103,6 +109,7 @@ 4.1.0 3.2.0.RELEASE 4.0.5 + 3.2.6 \ No newline at end of file diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/projection/model/InStock.java b/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/projection/model/InStock.java similarity index 100% rename from persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/projection/model/InStock.java rename to persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/projection/model/InStock.java diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/projection/model/Inventory.java b/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/projection/model/Inventory.java similarity index 96% rename from persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/projection/model/Inventory.java rename to persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/projection/model/Inventory.java index 28e6607dc9..0f4cf6b814 100644 --- a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/projection/model/Inventory.java +++ b/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/projection/model/Inventory.java @@ -3,13 +3,14 @@ package com.baeldung.projection.model; import java.util.List; import java.util.Objects; +import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.MongoId; @Document(collection = "inventory") public class Inventory { - @MongoId + @Id private String id; private String item; private String status; diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/projection/model/Size.java b/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/projection/model/Size.java similarity index 100% rename from persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/projection/model/Size.java rename to persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/projection/model/Size.java diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/projection/repository/InventoryRepository.java b/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/projection/repository/InventoryRepository.java similarity index 100% rename from persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/projection/repository/InventoryRepository.java rename to persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/projection/repository/InventoryRepository.java diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/projection/AbstractTestProjection.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/projection/AbstractTestProjection.java similarity index 54% rename from persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/projection/AbstractTestProjection.java rename to persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/projection/AbstractTestProjection.java index c86d8c170e..b197ada7aa 100644 --- a/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/projection/AbstractTestProjection.java +++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/projection/AbstractTestProjection.java @@ -1,54 +1,15 @@ package com.baeldung.projection; -import java.io.IOException; import java.util.Arrays; import java.util.Collections; import java.util.List; -import org.junit.jupiter.api.AfterEach; -import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.util.SocketUtils; - import com.baeldung.projection.model.InStock; import com.baeldung.projection.model.Inventory; import com.baeldung.projection.model.Size; -import com.mongodb.client.MongoClients; - -import de.flapdoodle.embed.mongo.MongodExecutable; -import de.flapdoodle.embed.mongo.MongodStarter; -import de.flapdoodle.embed.mongo.config.ImmutableMongodConfig; -import de.flapdoodle.embed.mongo.config.MongodConfig; -import de.flapdoodle.embed.mongo.config.Net; -import de.flapdoodle.embed.mongo.distribution.Version; -import de.flapdoodle.embed.process.runtime.Network; abstract class AbstractTestProjection { - private static final String CONNECTION_STRING = "mongodb://%s:%d"; - - protected MongodExecutable mongodExecutable; - protected MongoTemplate mongoTemplate; - - @AfterEach - void clean() { - mongodExecutable.stop(); - } - - void setUp() throws IOException { - String ip = "localhost"; - int port = SocketUtils.findAvailableTcpPort(); - - ImmutableMongodConfig mongodbConfig = MongodConfig.builder() - .version(Version.Main.PRODUCTION) - .net(new Net(ip, port, Network.localhostIsIPv6())) - .build(); - - MongodStarter starter = MongodStarter.getDefaultInstance(); - mongodExecutable = starter.prepare(mongodbConfig); - mongodExecutable.start(); - mongoTemplate = new MongoTemplate(MongoClients.create(String.format(CONNECTION_STRING, ip, port)), "test"); - } - public List getInventories() { Inventory journal = new Inventory(); journal.setItem("journal"); diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/projection/MongoTemplateProjectionUnitTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/projection/MongoTemplateProjectionUnitTest.java similarity index 92% rename from persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/projection/MongoTemplateProjectionUnitTest.java rename to persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/projection/MongoTemplateProjectionUnitTest.java index a174b73f2c..1cd6415a1b 100644 --- a/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/projection/MongoTemplateProjectionUnitTest.java +++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/projection/MongoTemplateProjectionUnitTest.java @@ -10,20 +10,27 @@ import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Query; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import com.baeldung.projection.config.ProjectionConfig; import com.baeldung.projection.model.InStock; import com.baeldung.projection.model.Inventory; import com.baeldung.projection.model.Size; -@SpringBootTest +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = ProjectionConfig.class) public class MongoTemplateProjectionUnitTest extends AbstractTestProjection { - @BeforeEach - void setup() throws Exception { - super.setUp(); + @Autowired + private MongoTemplate mongoTemplate; + @BeforeEach + void setup() { List inventoryList = getInventories(); mongoTemplate.insert(inventoryList, Inventory.class); diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/projection/RepositoryProjectionUnitTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/projection/RepositoryProjectionUnitTest.java similarity index 94% rename from persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/projection/RepositoryProjectionUnitTest.java rename to persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/projection/RepositoryProjectionUnitTest.java index 6b0fa7f7fd..e8f2d4bf7d 100644 --- a/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/projection/RepositoryProjectionUnitTest.java +++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/projection/RepositoryProjectionUnitTest.java @@ -10,24 +10,26 @@ import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import com.baeldung.projection.config.ProjectionConfig; import com.baeldung.projection.model.InStock; import com.baeldung.projection.model.Inventory; import com.baeldung.projection.model.Size; import com.baeldung.projection.repository.InventoryRepository; -@SpringBootTest +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = ProjectionConfig.class) public class RepositoryProjectionUnitTest extends AbstractTestProjection { @Autowired private InventoryRepository inventoryRepository; @BeforeEach - void setup() throws Exception { - super.setUp(); - + void setup() { List inventoryList = getInventories(); inventoryRepository.saveAll(inventoryList); diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/projection/config/ProjectionConfig.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/projection/config/ProjectionConfig.java new file mode 100644 index 0000000000..06260c0295 --- /dev/null +++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/projection/config/ProjectionConfig.java @@ -0,0 +1,43 @@ +package com.baeldung.projection.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; +import org.springframework.util.SocketUtils; + +import com.mongodb.client.MongoClients; + +import de.flapdoodle.embed.mongo.MongodExecutable; +import de.flapdoodle.embed.mongo.MongodStarter; +import de.flapdoodle.embed.mongo.config.ImmutableMongodConfig; +import de.flapdoodle.embed.mongo.config.MongodConfig; +import de.flapdoodle.embed.mongo.config.Net; +import de.flapdoodle.embed.mongo.distribution.Version; +import de.flapdoodle.embed.process.runtime.Network; + +@Configuration +@ComponentScan(basePackages = "com.baeldung.projection") +@EnableMongoRepositories(basePackages = "com.baeldung.projection.repository") +public class ProjectionConfig { + + private static final String CONNECTION_STRING = "mongodb://%s:%d"; + private static final String HOST = "localhost"; + + @Bean + public MongoTemplate mongoTemplate() throws Exception { + int randomPort = SocketUtils.findAvailableTcpPort(); + + ImmutableMongodConfig mongoDbConfig = MongodConfig.builder() + .version(Version.Main.PRODUCTION) + .net(new Net(HOST, randomPort, Network.localhostIsIPv6())) + .build(); + + MongodStarter starter = MongodStarter.getDefaultInstance(); + MongodExecutable mongodExecutable = starter.prepare(mongoDbConfig); + mongodExecutable.start(); + + return new MongoTemplate(MongoClients.create(String.format(CONNECTION_STRING, HOST, randomPort)), "mongo_auth"); + } +} From 45085ce61ca5797c998fafc669cc6c6407a0ad5c Mon Sep 17 00:00:00 2001 From: Shaun Phillips <61982125+ShaPhi7@users.noreply.github.com> Date: Fri, 29 Apr 2022 04:34:58 +0100 Subject: [PATCH 110/278] BAEL-4356 add disable-plugins-examples (#12121) * BAEL-4356 add disable-plugins-examples * GTSIS-4356 change tabs to four spaces --- .../empty-phase/pom.xml | 31 +++++++++++ .../phase-none/pom.xml | 31 +++++++++++ .../plugin-enabled/pom.xml | 17 ++++++ .../src/file-that-must-exist.txt | 1 + .../disable-plugin-examples/pom.xml | 55 +++++++++++++++++++ .../skip-parameter/pom.xml | 28 ++++++++++ .../src/file-that-must-exist.txt | 1 + .../maven-parent-pom-resolution/pom.xml | 1 + 8 files changed, 165 insertions(+) create mode 100644 maven-modules/maven-parent-pom-resolution/disable-plugin-examples/empty-phase/pom.xml create mode 100644 maven-modules/maven-parent-pom-resolution/disable-plugin-examples/phase-none/pom.xml create mode 100644 maven-modules/maven-parent-pom-resolution/disable-plugin-examples/plugin-enabled/pom.xml create mode 100644 maven-modules/maven-parent-pom-resolution/disable-plugin-examples/plugin-enabled/src/file-that-must-exist.txt create mode 100644 maven-modules/maven-parent-pom-resolution/disable-plugin-examples/pom.xml create mode 100644 maven-modules/maven-parent-pom-resolution/disable-plugin-examples/skip-parameter/pom.xml create mode 100644 maven-modules/maven-parent-pom-resolution/disable-plugin-examples/src/file-that-must-exist.txt diff --git a/maven-modules/maven-parent-pom-resolution/disable-plugin-examples/empty-phase/pom.xml b/maven-modules/maven-parent-pom-resolution/disable-plugin-examples/empty-phase/pom.xml new file mode 100644 index 0000000000..28ea8b6359 --- /dev/null +++ b/maven-modules/maven-parent-pom-resolution/disable-plugin-examples/empty-phase/pom.xml @@ -0,0 +1,31 @@ + + + 4.0.0 + com.baeldung.maven-parent-pom-resolution + empty-phase + 1.0.0-SNAPSHOT + pom + + + com.baeldung.maven-parent-pom-resolution + disable-plugin-examples + 1.0.0-SNAPSHOT + + + + + + maven-enforcer-plugin + + + enforce-file-exists + + + + + + + + \ No newline at end of file diff --git a/maven-modules/maven-parent-pom-resolution/disable-plugin-examples/phase-none/pom.xml b/maven-modules/maven-parent-pom-resolution/disable-plugin-examples/phase-none/pom.xml new file mode 100644 index 0000000000..8870f28fd2 --- /dev/null +++ b/maven-modules/maven-parent-pom-resolution/disable-plugin-examples/phase-none/pom.xml @@ -0,0 +1,31 @@ + + + 4.0.0 + com.baeldung.maven-parent-pom-resolution + phase-none + 1.0.0-SNAPSHOT + pom + + + com.baeldung.maven-parent-pom-resolution + disable-plugin-examples + 1.0.0-SNAPSHOT + + + + + + maven-enforcer-plugin + + + enforce-file-exists + any-value-that-is-not-a-phase + + + + + + + \ No newline at end of file diff --git a/maven-modules/maven-parent-pom-resolution/disable-plugin-examples/plugin-enabled/pom.xml b/maven-modules/maven-parent-pom-resolution/disable-plugin-examples/plugin-enabled/pom.xml new file mode 100644 index 0000000000..e3ff22aaf7 --- /dev/null +++ b/maven-modules/maven-parent-pom-resolution/disable-plugin-examples/plugin-enabled/pom.xml @@ -0,0 +1,17 @@ + + + 4.0.0 + com.baeldung.maven-parent-pom-resolution + plugin-enabled + 1.0.0-SNAPSHOT + pom + + + com.baeldung.maven-parent-pom-resolution + disable-plugin-examples + 1.0.0-SNAPSHOT + + + \ No newline at end of file diff --git a/maven-modules/maven-parent-pom-resolution/disable-plugin-examples/plugin-enabled/src/file-that-must-exist.txt b/maven-modules/maven-parent-pom-resolution/disable-plugin-examples/plugin-enabled/src/file-that-must-exist.txt new file mode 100644 index 0000000000..2a6fae012f --- /dev/null +++ b/maven-modules/maven-parent-pom-resolution/disable-plugin-examples/plugin-enabled/src/file-that-must-exist.txt @@ -0,0 +1 @@ +Example source file \ No newline at end of file diff --git a/maven-modules/maven-parent-pom-resolution/disable-plugin-examples/pom.xml b/maven-modules/maven-parent-pom-resolution/disable-plugin-examples/pom.xml new file mode 100644 index 0000000000..2a2e5b00ea --- /dev/null +++ b/maven-modules/maven-parent-pom-resolution/disable-plugin-examples/pom.xml @@ -0,0 +1,55 @@ + + + 4.0.0 + com.baeldung.maven-parent-pom-resolution + disable-plugin-examples + 1.0.0-SNAPSHOT + pom + + + com.baeldung + maven-parent-pom-resolution + 1.0.0-SNAPSHOT + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + 3.0.0 + + + enforce-file-exists + + enforce + + + + + + ${project.basedir}/src/file-that-must-exist.txt + + + + + + + + + + + + plugin-enabled + skip-parameter + phase-none + empty-phase + + + + UTF-8 + + + \ No newline at end of file diff --git a/maven-modules/maven-parent-pom-resolution/disable-plugin-examples/skip-parameter/pom.xml b/maven-modules/maven-parent-pom-resolution/disable-plugin-examples/skip-parameter/pom.xml new file mode 100644 index 0000000000..31415bec24 --- /dev/null +++ b/maven-modules/maven-parent-pom-resolution/disable-plugin-examples/skip-parameter/pom.xml @@ -0,0 +1,28 @@ + + + 4.0.0 + com.baeldung.maven-parent-pom-resolution + skip-parameter + 1.0.0-SNAPSHOT + pom + + + com.baeldung.maven-parent-pom-resolution + disable-plugin-examples + 1.0.0-SNAPSHOT + + + + + + maven-enforcer-plugin + + true + + + + + + \ No newline at end of file diff --git a/maven-modules/maven-parent-pom-resolution/disable-plugin-examples/src/file-that-must-exist.txt b/maven-modules/maven-parent-pom-resolution/disable-plugin-examples/src/file-that-must-exist.txt new file mode 100644 index 0000000000..2a6fae012f --- /dev/null +++ b/maven-modules/maven-parent-pom-resolution/disable-plugin-examples/src/file-that-must-exist.txt @@ -0,0 +1 @@ +Example source file \ No newline at end of file diff --git a/maven-modules/maven-parent-pom-resolution/pom.xml b/maven-modules/maven-parent-pom-resolution/pom.xml index e5340032b7..8506f1c5fa 100644 --- a/maven-modules/maven-parent-pom-resolution/pom.xml +++ b/maven-modules/maven-parent-pom-resolution/pom.xml @@ -10,6 +10,7 @@ aggregator + disable-plugin-examples From bce3dd832d7ec9cde67c0adad7dd071fd1582385 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Fri, 29 Apr 2022 11:53:35 +0200 Subject: [PATCH 111/278] JAVA-10839: Update md5 hash of the sample file --- .../java/com/baeldung/download/FileDownloadIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/download/FileDownloadIntegrationTest.java b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/download/FileDownloadIntegrationTest.java index 987a69582f..0aba09a539 100644 --- a/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/download/FileDownloadIntegrationTest.java +++ b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/download/FileDownloadIntegrationTest.java @@ -19,7 +19,7 @@ public class FileDownloadIntegrationTest { static String FILE_URL = "https://s3.amazonaws.com/baeldung.com/Do+JSON+with+Jackson+by+Baeldung.pdf"; static String FILE_NAME = "file.dat"; - static String FILE_MD5_HASH = "c959feb066b37f5c4f0e0f45bbbb4f86"; + static String FILE_MD5_HASH = "753197aa27f162faa3e3c2e48ee5eb07"; @Test public void givenJavaIO_whenDownloadingFile_thenDownloadShouldBeCorrect() throws NoSuchAlgorithmException, IOException { From ec0b628fb40376285315f55be22458a2a68b9feb Mon Sep 17 00:00:00 2001 From: Amitabh Tiwari Date: Fri, 29 Apr 2022 18:42:53 +0530 Subject: [PATCH 112/278] Initial Changes for RequestLine --- .../openfeign/client/EmployeeClient.java | 13 +++++++++++ .../controller/EmployeeController.java | 22 +++++++++++++++++++ .../cloud/openfeign/model/Employee.java | 15 +++++++++++++ 3 files changed, 50 insertions(+) create mode 100644 spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/client/EmployeeClient.java create mode 100644 spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/controller/EmployeeController.java create mode 100644 spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/model/Employee.java diff --git a/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/client/EmployeeClient.java b/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/client/EmployeeClient.java new file mode 100644 index 0000000000..67ff8b4f9a --- /dev/null +++ b/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/client/EmployeeClient.java @@ -0,0 +1,13 @@ +package com.baeldung.cloud.openfeign.client; + +import com.baeldung.cloud.openfeign.model.Employee; +import feign.Headers; +import feign.Param; +import feign.RequestLine; + +public interface EmployeeClient { + + @RequestLine("GET /empployee/{id}?active={isActive}") + @Headers("Content-Type: application/json") + Employee getEmployee(@Param long id, @Param boolean isActive); +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/controller/EmployeeController.java b/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/controller/EmployeeController.java new file mode 100644 index 0000000000..65897ad48e --- /dev/null +++ b/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/controller/EmployeeController.java @@ -0,0 +1,22 @@ +package com.baeldung.cloud.openfeign.controller; + +import com.baeldung.cloud.openfeign.client.EmployeeClient; +import com.baeldung.cloud.openfeign.model.Employee; +import feign.Feign; +import feign.form.spring.SpringFormEncoder; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class EmployeeController { + + private static final String HTTP_FILE_EMPLOYEE_URL = "http://localhost:8081"; + + @GetMapping("/employee/{id}") + public Employee getEmployee(@RequestParam("id") long id) { + EmployeeClient employeeResource = Feign.builder().encoder(new SpringFormEncoder()) + .target(EmployeeClient.class, HTTP_FILE_EMPLOYEE_URL); + return employeeResource.getEmployee(id, true); + } +} diff --git a/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/model/Employee.java b/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/model/Employee.java new file mode 100644 index 0000000000..7b8ed1232b --- /dev/null +++ b/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/model/Employee.java @@ -0,0 +1,15 @@ +package com.baeldung.cloud.openfeign.model; + +public class Employee { + + private Long id; + private String name; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } +} From 05cdb533d7db91d486209ae5a91050909b0c364c Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Fri, 29 Apr 2022 23:19:37 +0530 Subject: [PATCH 113/278] JAVA-8271 Uncommenting spring-boot-keycloak module --- spring-boot-modules/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index 003a52db13..999c006f5e 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -44,7 +44,7 @@ spring-boot-groovy spring-boot-jasypt - + spring-boot-keycloak spring-boot-libraries spring-boot-libraries-2 spring-boot-libraries-comparison From a9eba4ed49e0754609dc39c39e8da8375c355010 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sat, 30 Apr 2022 14:09:10 +0530 Subject: [PATCH 114/278] JAVA-11775 Remove usage of deprecated JUnitPlatform.class in junit-5-basics module --- testing-modules/junit-5-basics/pom.xml | 10 +++++----- .../src/test/java/com/baeldung/GreetingsUnitTest.java | 3 --- .../java/com/baeldung/JUnit5NewFeaturesUnitTest.java | 1 - .../junit5/AnnotationTestExampleUnitTest.java | 3 --- .../migration/junit5/AssertionsExampleUnitTest.java | 3 --- .../BeforeAllAndAfterAllAnnotationsUnitTest.java | 3 --- .../BeforeEachAndAfterEachAnnotationsUnitTest.java | 3 --- .../baeldung/migration/junit5/RuleExampleUnitTest.java | 6 ++---- .../src/test/java/com/baeldung/suites/AllUnitTest.java | 9 +++++---- .../java/com/baeldung/tags/EmployeeDAOTestSuite.java | 3 --- 10 files changed, 12 insertions(+), 32 deletions(-) diff --git a/testing-modules/junit-5-basics/pom.xml b/testing-modules/junit-5-basics/pom.xml index e6636e3239..e240efe514 100644 --- a/testing-modules/junit-5-basics/pom.xml +++ b/testing-modules/junit-5-basics/pom.xml @@ -15,12 +15,12 @@ - - org.junit.platform - junit-platform-runner - ${junit-platform.version} + + org.junit.platform + junit-platform-suite + ${junit-platform.version} test - + org.junit.jupiter junit-jupiter-migrationsupport diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/GreetingsUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/GreetingsUnitTest.java index a07162ceed..1ff21548b8 100644 --- a/testing-modules/junit-5-basics/src/test/java/com/baeldung/GreetingsUnitTest.java +++ b/testing-modules/junit-5-basics/src/test/java/com/baeldung/GreetingsUnitTest.java @@ -3,12 +3,9 @@ package com.baeldung; import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.Test; -import org.junit.platform.runner.JUnitPlatform; -import org.junit.runner.RunWith; import com.baeldung.junit5.Greetings; -@RunWith(JUnitPlatform.class) public class GreetingsUnitTest { @Test diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/JUnit5NewFeaturesUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/JUnit5NewFeaturesUnitTest.java index 311c62f425..252bbdb2ce 100644 --- a/testing-modules/junit-5-basics/src/test/java/com/baeldung/JUnit5NewFeaturesUnitTest.java +++ b/testing-modules/junit-5-basics/src/test/java/com/baeldung/JUnit5NewFeaturesUnitTest.java @@ -10,7 +10,6 @@ import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -//@RunWith(JUnitPlatform.class) public class JUnit5NewFeaturesUnitTest { private static final Logger log = Logger.getLogger(JUnit5NewFeaturesUnitTest.class.getName()); diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AnnotationTestExampleUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AnnotationTestExampleUnitTest.java index c2bbfd4d07..b324910ab7 100644 --- a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AnnotationTestExampleUnitTest.java +++ b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AnnotationTestExampleUnitTest.java @@ -6,12 +6,9 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; -import org.junit.platform.runner.JUnitPlatform; -import org.junit.runner.RunWith; @Tag("annotations") @Tag("junit5") -@RunWith(JUnitPlatform.class) public class AnnotationTestExampleUnitTest { @Test public void shouldRaiseAnException() throws Exception { diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AssertionsExampleUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AssertionsExampleUnitTest.java index c35611aad1..14b1162ecf 100644 --- a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AssertionsExampleUnitTest.java +++ b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AssertionsExampleUnitTest.java @@ -6,10 +6,7 @@ import java.util.List; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; -import org.junit.platform.runner.JUnitPlatform; -import org.junit.runner.RunWith; -@RunWith(JUnitPlatform.class) public class AssertionsExampleUnitTest { @Test @Disabled diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeAllAndAfterAllAnnotationsUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeAllAndAfterAllAnnotationsUnitTest.java index 5181d54a46..68bb66657e 100644 --- a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeAllAndAfterAllAnnotationsUnitTest.java +++ b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeAllAndAfterAllAnnotationsUnitTest.java @@ -3,12 +3,9 @@ package com.baeldung.migration.junit5; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.junit.platform.runner.JUnitPlatform; -import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@RunWith(JUnitPlatform.class) public class BeforeAllAndAfterAllAnnotationsUnitTest { private static final Logger LOG = LoggerFactory.getLogger(BeforeAllAndAfterAllAnnotationsUnitTest.class); diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeEachAndAfterEachAnnotationsUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeEachAndAfterEachAnnotationsUnitTest.java index b2112ef2c3..283665798d 100644 --- a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeEachAndAfterEachAnnotationsUnitTest.java +++ b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeEachAndAfterEachAnnotationsUnitTest.java @@ -9,12 +9,9 @@ import java.util.List; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.platform.runner.JUnitPlatform; -import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@RunWith(JUnitPlatform.class) public class BeforeEachAndAfterEachAnnotationsUnitTest { private static final Logger LOG = LoggerFactory.getLogger(BeforeEachAndAfterEachAnnotationsUnitTest.class); diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/RuleExampleUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/RuleExampleUnitTest.java index c67a57dcbd..5c878ef7d3 100644 --- a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/RuleExampleUnitTest.java +++ b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/RuleExampleUnitTest.java @@ -1,14 +1,12 @@ package com.baeldung.migration.junit5; -import com.baeldung.migration.junit5.extensions.TraceUnitExtension; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.junit.platform.runner.JUnitPlatform; -import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@RunWith(JUnitPlatform.class) +import com.baeldung.migration.junit5.extensions.TraceUnitExtension; + @ExtendWith(TraceUnitExtension.class) public class RuleExampleUnitTest { diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/suites/AllUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/suites/AllUnitTest.java index 30b92ad428..b14440f1f2 100644 --- a/testing-modules/junit-5-basics/src/test/java/com/baeldung/suites/AllUnitTest.java +++ b/testing-modules/junit-5-basics/src/test/java/com/baeldung/suites/AllUnitTest.java @@ -1,12 +1,13 @@ package com.baeldung.suites; -import org.junit.platform.runner.JUnitPlatform; +import org.junit.platform.suite.api.ExcludePackages; import org.junit.platform.suite.api.SelectPackages; -import org.junit.runner.RunWith; +import org.junit.platform.suite.api.Suite; -@RunWith(JUnitPlatform.class) +@Suite @SelectPackages("com.baeldung") -// @SelectClasses({AssertionTest.class, AssumptionTest.class, ExceptionTest.class}) +@ExcludePackages("com.baeldung.suites") public class AllUnitTest { } + \ No newline at end of file diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/tags/EmployeeDAOTestSuite.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/tags/EmployeeDAOTestSuite.java index 783e5a81a2..cddb76381f 100644 --- a/testing-modules/junit-5-basics/src/test/java/com/baeldung/tags/EmployeeDAOTestSuite.java +++ b/testing-modules/junit-5-basics/src/test/java/com/baeldung/tags/EmployeeDAOTestSuite.java @@ -1,11 +1,8 @@ package com.baeldung.tags; -import org.junit.platform.runner.JUnitPlatform; import org.junit.platform.suite.api.IncludeTags; import org.junit.platform.suite.api.SelectPackages; -import org.junit.runner.RunWith; -@RunWith(JUnitPlatform.class) @SelectPackages("com.baeldung.tags") @IncludeTags("UnitTest") public class EmployeeDAOTestSuite { From b64024d0039ac143fd2deeb495eb07a7446040f2 Mon Sep 17 00:00:00 2001 From: ACHRAF TAITAI <43656331+achraftt@users.noreply.github.com> Date: Sat, 30 Apr 2022 11:40:27 +0200 Subject: [PATCH 115/278] Bael 5381 update (#12142) * BAEL-5381: Java Scanner.skip method with examples * BAEL-5381: Edit unitTest class name * BAEL-5381: update code after review --- .../test/java/com/baeldung/scanner/ScannerUnitTest.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/core-java-modules/core-java-io-4/src/test/java/com/baeldung/scanner/ScannerUnitTest.java b/core-java-modules/core-java-io-4/src/test/java/com/baeldung/scanner/ScannerUnitTest.java index f11f3d032d..cb6ce5fb2d 100644 --- a/core-java-modules/core-java-io-4/src/test/java/com/baeldung/scanner/ScannerUnitTest.java +++ b/core-java-modules/core-java-io-4/src/test/java/com/baeldung/scanner/ScannerUnitTest.java @@ -8,26 +8,27 @@ import java.util.regex.*; import static org.junit.jupiter.api.Assertions.assertEquals; public class ScannerUnitTest { - @Test public void scannerSkipUsingPattern() { + @Test public void givenScannerWithPattern_thenSkipUsingPattern() { String str = "Java scanner skip tutorial"; // Instantiates Scanner Scanner sc = new Scanner(str); // By using skip(Pattern) method is to skip that meets the given pattern sc.skip(Pattern.compile(".ava")); - assertEquals(sc.nextLine(), " scanner skip tutorial"); + + assertEquals(" scanner skip tutorial", sc.nextLine()); // Scanner closed sc.close(); } - @Test public void scannerSkipUsingStringPattern() { + @Test public void givenScannerWithString_thenSkipUsingStringPattern() { String str = "Java scanner skip tutorial"; // Instantiates Scanner Scanner sc = new Scanner(str); // By using skip(String) method is to skip that meets the given // pattern constructed from the given String sc.skip("Java"); - assertEquals(sc.nextLine(), " scanner skip tutorial"); + assertEquals(" scanner skip tutorial", sc.nextLine()); // Scanner closed sc.close(); } From ab97eda9d93eb1e63495ebe9bdff01026acf1e20 Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Sat, 30 Apr 2022 12:26:59 +0100 Subject: [PATCH 116/278] [JAVA-8145] Fix formatting --- .../webclient/WebClientIntegrationTest.java | 235 +++++++++--------- 1 file changed, 120 insertions(+), 115 deletions(-) diff --git a/spring-reactive/src/test/java/com/baeldung/reactive/webclient/WebClientIntegrationTest.java b/spring-reactive/src/test/java/com/baeldung/reactive/webclient/WebClientIntegrationTest.java index 28b4c19a10..22c545c362 100644 --- a/spring-reactive/src/test/java/com/baeldung/reactive/webclient/WebClientIntegrationTest.java +++ b/spring-reactive/src/test/java/com/baeldung/reactive/webclient/WebClientIntegrationTest.java @@ -45,41 +45,41 @@ import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest(classes = WebClientApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT) public class WebClientIntegrationTest { - @LocalServerPort - private int port; - private static final String BODY_VALUE = "bodyValue"; private static final ParameterizedTypeReference> MAP_RESPONSE_REF = new ParameterizedTypeReference>() { }; + @LocalServerPort + private int port; + @Test public void givenDifferentWebClientCreationMethods_whenUsed_thenObtainExpectedResponse() { // WebClient creation WebClient client1 = WebClient.create(); WebClient client2 = WebClient.create("http://localhost:" + port); WebClient client3 = WebClient.builder() - .baseUrl("http://localhost:" + port) - .defaultCookie("cookieKey", "cookieValue") - .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .defaultUriVariables(Collections.singletonMap("url", "http://localhost:8080")) - .build(); + .baseUrl("http://localhost:" + port) + .defaultCookie("cookieKey", "cookieValue") + .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .defaultUriVariables(Collections.singletonMap("url", "http://localhost:8080")) + .build(); // response assertions StepVerifier.create(retrieveResponse(client1.post() .uri("http://localhost:" + port + "/resource"))) - .expectNext("processed-bodyValue") - .verifyComplete(); + .expectNext("processed-bodyValue") + .verifyComplete(); StepVerifier.create(retrieveResponse(client2)) - .expectNext("processed-bodyValue") - .verifyComplete(); + .expectNext("processed-bodyValue") + .verifyComplete(); StepVerifier.create(retrieveResponse(client3)) - .expectNext("processed-bodyValue") - .verifyComplete(); + .expectNext("processed-bodyValue") + .verifyComplete(); // assert response without specifying URI StepVerifier.create(retrieveResponse(client1)) - .expectErrorMatches(ex -> WebClientRequestException.class.isAssignableFrom(ex.getClass()) && ex.getMessage() - .contains("Connection refused")) - .verify(); + .expectErrorMatches(ex -> WebClientRequestException.class.isAssignableFrom(ex.getClass()) && ex.getMessage() + .contains("Connection refused")) + .verify(); } @Test @@ -91,60 +91,64 @@ public class WebClientIntegrationTest { // response assertions StepVerifier.create(retrieveResponse(uriSpecPost1)) - .expectNext("processed-bodyValue") - .verifyComplete(); + .expectNext("processed-bodyValue") + .verifyComplete(); StepVerifier.create(retrieveResponse(uriSpecPost2)) - .expectNext("processed-bodyValue") - .verifyComplete(); + .expectNext("processed-bodyValue") + .verifyComplete(); StepVerifier.create(retrieveGetResponse(requestGet)) - .expectNextMatches(nextMap -> nextMap.get("field") - .equals("value")) - .verifyComplete(); + .expectNextMatches(nextMap -> nextMap.get("field") + .equals("value")) + .verifyComplete(); } @Test public void givenDifferentUriSpecifications_whenUsed_thenObtainExpectedResponse() { // uri specification RequestBodySpec bodySpecUsingString = createDefaultPostRequest().uri("/resource"); - RequestBodySpec bodySpecUsingUriBuilder = createDefaultPostRequest().uri(uriBuilder -> uriBuilder.pathSegment("resource") + RequestBodySpec bodySpecUsingUriBuilder = createDefaultPostRequest().uri( + uriBuilder -> uriBuilder.pathSegment("resource") .build()); - RequestBodySpec bodySpecusingURI = createDefaultPostRequest().uri(URI.create("http://localhost:" + port + "/resource")); + RequestBodySpec bodySpecusingURI = createDefaultPostRequest().uri( + URI.create("http://localhost:" + port + "/resource")); RequestBodySpec bodySpecOverridenBaseUri = createDefaultPostRequest().uri(URI.create("/resource")); RequestBodySpec bodySpecOverridenBaseUri2 = WebClient.builder() - .baseUrl("http://localhost:" + port) - .build() - .post() - .uri(URI.create("/resource")); + .baseUrl("http://localhost:" + port) + .build() + .post() + .uri(URI.create("/resource")); // response assertions StepVerifier.create(retrieveResponse(bodySpecUsingString)) - .expectNext("processed-bodyValue") - .verifyComplete(); + .expectNext("processed-bodyValue") + .verifyComplete(); StepVerifier.create(retrieveResponse(bodySpecUsingUriBuilder)) - .expectNext("processed-bodyValue") - .verifyComplete(); + .expectNext("processed-bodyValue") + .verifyComplete(); StepVerifier.create(retrieveResponse(bodySpecusingURI)) - .expectNext("processed-bodyValue") - .verifyComplete(); + .expectNext("processed-bodyValue") + .verifyComplete(); // assert sending request overriding base URI StepVerifier.create(retrieveResponse(bodySpecOverridenBaseUri)) - .expectErrorMatches(ex -> WebClientRequestException.class.isAssignableFrom(ex.getClass()) && ex.getMessage() - .contains("Connection refused")) - .verify(); + .expectErrorMatches(ex -> WebClientRequestException.class.isAssignableFrom(ex.getClass()) && ex.getMessage() + .contains("Connection refused")) + .verify(); StepVerifier.create(retrieveResponse(bodySpecOverridenBaseUri2)) - .expectErrorMatches(ex -> WebClientRequestException.class.isAssignableFrom(ex.getClass()) && ex.getMessage() - .contains("Connection refused")) - .verify(); + .expectErrorMatches(ex -> WebClientRequestException.class.isAssignableFrom(ex.getClass()) && ex.getMessage() + .contains("Connection refused")) + .verify(); } @Test public void givenDifferentBodySpecifications_whenUsed_thenObtainExpectedResponse() { // request body specifications - RequestHeadersSpec headersSpecPost1 = createDefaultPostResourceRequest().body(BodyInserters.fromPublisher(Mono.just(BODY_VALUE), String.class)); - RequestHeadersSpec headersSpecPost2 = createDefaultPostResourceRequest().body(BodyInserters.fromValue(BODY_VALUE)); + RequestHeadersSpec headersSpecPost1 = createDefaultPostResourceRequest().body( + BodyInserters.fromPublisher(Mono.just(BODY_VALUE), String.class)); + RequestHeadersSpec headersSpecPost2 = createDefaultPostResourceRequest().body( + BodyInserters.fromValue(BODY_VALUE)); RequestHeadersSpec headersSpecPost3 = createDefaultPostResourceRequest().bodyValue(BODY_VALUE); RequestHeadersSpec headersSpecFooPost = createDefaultPostRequest().uri("/resource-foo") - .body(Mono.just(new Foo("fooName")), Foo.class); + .body(Mono.just(new Foo("fooName")), Foo.class); BodyInserter inserterPlainObject = BodyInserters.fromValue(new Object()); RequestHeadersSpec headersSpecPlainObject = createDefaultPostResourceRequest().body(inserterPlainObject); @@ -152,54 +156,57 @@ public class WebClientIntegrationTest { LinkedMultiValueMap map = new LinkedMultiValueMap<>(); map.add("key1", "multipartValue1"); map.add("key2", "multipartValue2"); - BodyInserter, ClientHttpRequest> inserterMultipart = BodyInserters.fromMultipartData(map); + BodyInserter, ClientHttpRequest> inserterMultipart = BodyInserters.fromMultipartData( + map); RequestHeadersSpec headersSpecInserterMultipart = createDefaultPostRequest().uri("/resource-multipart") - .body(inserterMultipart); + .body(inserterMultipart); // response assertions StepVerifier.create(retrieveResponse(headersSpecPost1)) - .expectNext("processed-bodyValue") - .verifyComplete(); + .expectNext("processed-bodyValue") + .verifyComplete(); StepVerifier.create(retrieveResponse(headersSpecPost2)) - .expectNext("processed-bodyValue") - .verifyComplete(); + .expectNext("processed-bodyValue") + .verifyComplete(); StepVerifier.create(retrieveResponse(headersSpecPost3)) - .expectNext("processed-bodyValue") - .verifyComplete(); + .expectNext("processed-bodyValue") + .verifyComplete(); StepVerifier.create(retrieveResponse(headersSpecFooPost)) - .expectNext("processedFoo-fooName") - .verifyComplete(); + .expectNext("processedFoo-fooName") + .verifyComplete(); StepVerifier.create(retrieveResponse(headersSpecInserterMultipart)) - .expectNext("processed-multipartValue1-multipartValue2") - .verifyComplete(); + .expectNext("processed-multipartValue1-multipartValue2") + .verifyComplete(); // assert error plain `new Object()` as request body StepVerifier.create(retrieveResponse(headersSpecPlainObject)) - .expectError(CodecException.class) - .verify(); + .expectError(CodecException.class) + .verify(); // assert response for request with no body - Mono> responsePostWithNoBody = createDefaultPostResourceRequest().exchangeToMono(responseHandler -> { - assertThat(responseHandler.statusCode()).isEqualTo(HttpStatus.BAD_REQUEST); - return responseHandler.bodyToMono(MAP_RESPONSE_REF); - }); + Mono> responsePostWithNoBody = createDefaultPostResourceRequest().exchangeToMono( + responseHandler -> { + assertThat(responseHandler.statusCode()).isEqualTo(HttpStatus.BAD_REQUEST); + return responseHandler.bodyToMono(MAP_RESPONSE_REF); + }); StepVerifier.create(responsePostWithNoBody) - .expectNextMatches(nextMap -> nextMap.get("error") - .equals("Bad Request")) - .verifyComplete(); + .expectNextMatches(nextMap -> nextMap.get("error") + .equals("Bad Request")) + .verifyComplete(); } @Test public void givenPostSpecifications_whenHeadersAdded_thenObtainExpectedResponse() { // request header specification - RequestHeadersSpec headersSpecInserterStringWithHeaders = createDefaultPostResourceRequestResponse().header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .accept(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML) - .acceptCharset(StandardCharsets.UTF_8) - .ifNoneMatch("*") - .ifModifiedSince(ZonedDateTime.now()); + RequestHeadersSpec headersSpecInserterStringWithHeaders = createDefaultPostResourceRequestResponse().header( + HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .accept(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML) + .acceptCharset(StandardCharsets.UTF_8) + .ifNoneMatch("*") + .ifModifiedSince(ZonedDateTime.now()); // response assertions StepVerifier.create(retrieveResponse(headersSpecInserterStringWithHeaders)) - .expectNext("processed-bodyValue") - .verifyComplete(); + .expectNext("processed-bodyValue") + .verifyComplete(); } @Test @@ -209,68 +216,66 @@ public class WebClientIntegrationTest { Mono responsePostString2 = createDefaultPostResourceRequestResponse().exchangeToMono(response -> { if (response.statusCode() == HttpStatus.OK) { return response.bodyToMono(String.class); - } else if (response.statusCode() - .is4xxClientError()) { + } else if (response.statusCode().is4xxClientError()) { return Mono.just("Error response"); } else { return response.createException() - .flatMap(Mono::error); + .flatMap(Mono::error); } }); Mono responsePostNoBody = createDefaultPostResourceRequest().exchangeToMono(response -> { if (response.statusCode() == HttpStatus.OK) { return response.bodyToMono(String.class); - } else if (response.statusCode() - .is4xxClientError()) { + } else if (response.statusCode().is4xxClientError()) { return Mono.just("Error response"); } else { return response.createException() - .flatMap(Mono::error); + .flatMap(Mono::error); } }); Mono> responseGet = createDefaultClient().get() - .uri("/resource") - .retrieve() - .bodyToMono(MAP_RESPONSE_REF); + .uri("/resource") + .retrieve() + .bodyToMono(MAP_RESPONSE_REF); // response assertions StepVerifier.create(responsePostString) - .expectNext("processed-bodyValue") - .verifyComplete(); + .expectNext("processed-bodyValue") + .verifyComplete(); StepVerifier.create(responsePostString2) - .expectNext("processed-bodyValue") - .verifyComplete(); + .expectNext("processed-bodyValue") + .verifyComplete(); StepVerifier.create(responsePostNoBody) - .expectNext("Error response") - .verifyComplete(); + .expectNext("Error response") + .verifyComplete(); StepVerifier.create(responseGet) - .expectNextMatches(nextMap -> nextMap.get("field") - .equals("value")) - .verifyComplete(); + .expectNextMatches(nextMap -> nextMap.get("field") + .equals("value")) + .verifyComplete(); } @Test public void givenWebClientWithTimeoutConfigurations_whenRequestUsingWronglyConfiguredPublisher_thenObtainTimeout() { HttpClient httpClient = HttpClient.create() - .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 1000) - .responseTimeout(Duration.ofMillis(1000)) - .doOnConnected(conn -> conn.addHandlerLast(new ReadTimeoutHandler(1000, TimeUnit.MILLISECONDS)) - .addHandlerLast(new WriteTimeoutHandler(1000, TimeUnit.MILLISECONDS))); + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 1000) + .responseTimeout(Duration.ofMillis(1000)) + .doOnConnected(conn -> conn.addHandlerLast(new ReadTimeoutHandler(1000, TimeUnit.MILLISECONDS)) + .addHandlerLast(new WriteTimeoutHandler(1000, TimeUnit.MILLISECONDS))); WebClient timeoutClient = WebClient.builder() - .baseUrl("http://localhost:" + port) - .clientConnector(new ReactorClientHttpConnector(httpClient)) - .build(); + .baseUrl("http://localhost:" + port) + .clientConnector(new ReactorClientHttpConnector(httpClient)) + .build(); RequestHeadersSpec neverendingMonoBodyRequest = timeoutClient.post() - .uri("/resource") - .body(Mono.never(), String.class); + .uri("/resource") + .body(Mono.never(), String.class); StepVerifier.create(neverendingMonoBodyRequest.retrieve() .bodyToMono(String.class)) - .expectErrorMatches(ex -> WebClientRequestException.class.isAssignableFrom(ex.getClass()) && ReadTimeoutException.class.isAssignableFrom(ex.getCause() - .getClass())) - .verify(); + .expectErrorMatches(ex -> WebClientRequestException.class.isAssignableFrom(ex.getClass()) + && ReadTimeoutException.class.isAssignableFrom(ex.getCause().getClass())) + .verify(); } // helper methods to create default instances @@ -293,33 +298,33 @@ public class WebClientIntegrationTest { // helper methods to retrieve a response based on different steps of the process (specs) private Mono retrieveResponse(WebClient client) { return client.post() - .uri("/resource") - .bodyValue(BODY_VALUE) - .retrieve() - .bodyToMono(String.class); + .uri("/resource") + .bodyValue(BODY_VALUE) + .retrieve() + .bodyToMono(String.class); } private Mono retrieveResponse(RequestBodyUriSpec spec) { return spec.uri("/resource") - .bodyValue(BODY_VALUE) - .retrieve() - .bodyToMono(String.class); + .bodyValue(BODY_VALUE) + .retrieve() + .bodyToMono(String.class); } private Mono> retrieveGetResponse(RequestHeadersUriSpec spec) { return spec.uri("/resource") - .retrieve() - .bodyToMono(MAP_RESPONSE_REF); + .retrieve() + .bodyToMono(MAP_RESPONSE_REF); } private Mono retrieveResponse(RequestBodySpec spec) { return spec.bodyValue(BODY_VALUE) - .retrieve() - .bodyToMono(String.class); + .retrieve() + .bodyToMono(String.class); } private Mono retrieveResponse(RequestHeadersSpec spec) { return spec.retrieve() - .bodyToMono(String.class); + .bodyToMono(String.class); } } From 6df424bff4fe1dc87f1fca183181a402aa27e061 Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Sat, 30 Apr 2022 12:27:13 +0100 Subject: [PATCH 117/278] [JAVA-8145] Update and cleanup code --- .../com/baeldung/reactive/webclient/Foo.java | 24 ++--- .../webclient/WebClientApplication.java | 9 +- .../WebControllerIntegrationTest.java | 36 ++++---- .../WebTestClientIntegrationTest.java | 91 ++++++++----------- 4 files changed, 67 insertions(+), 93 deletions(-) diff --git a/spring-reactive/src/main/java/com/baeldung/reactive/webclient/Foo.java b/spring-reactive/src/main/java/com/baeldung/reactive/webclient/Foo.java index a58d672686..246ba30667 100644 --- a/spring-reactive/src/main/java/com/baeldung/reactive/webclient/Foo.java +++ b/spring-reactive/src/main/java/com/baeldung/reactive/webclient/Foo.java @@ -1,24 +1,14 @@ package com.baeldung.reactive.webclient; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor public class Foo { private String name; - public Foo() { - super(); - } - - public Foo(String name) { - super(); - this.name = name; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - } diff --git a/spring-reactive/src/main/java/com/baeldung/reactive/webclient/WebClientApplication.java b/spring-reactive/src/main/java/com/baeldung/reactive/webclient/WebClientApplication.java index fd1cb8aff1..3a62e7b8a5 100644 --- a/spring-reactive/src/main/java/com/baeldung/reactive/webclient/WebClientApplication.java +++ b/spring-reactive/src/main/java/com/baeldung/reactive/webclient/WebClientApplication.java @@ -15,11 +15,10 @@ public class WebClientApplication { } @Bean - public SecurityWebFilterChain functionalValidationsSpringSecurityFilterChain(ServerHttpSecurity http) { - http.authorizeExchange() - .anyExchange() - .permitAll(); - http.csrf().disable(); + public SecurityWebFilterChain filterChain(ServerHttpSecurity http) { + http.csrf().disable() + .authorizeExchange() + .anyExchange().permitAll(); return http.build(); } } diff --git a/spring-reactive/src/test/java/com/baeldung/reactive/webclient/WebControllerIntegrationTest.java b/spring-reactive/src/test/java/com/baeldung/reactive/webclient/WebControllerIntegrationTest.java index 3ab687bb41..22bd2829d3 100644 --- a/spring-reactive/src/test/java/com/baeldung/reactive/webclient/WebControllerIntegrationTest.java +++ b/spring-reactive/src/test/java/com/baeldung/reactive/webclient/WebControllerIntegrationTest.java @@ -1,22 +1,22 @@ package com.baeldung.reactive.webclient; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.web.server.LocalServerPort; import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.reactive.server.WebTestClient; -@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS) -@RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = WebClientApplication.class) +import static org.springframework.test.annotation.DirtiesContext.ClassMode.BEFORE_CLASS; + +@DirtiesContext(classMode = BEFORE_CLASS) +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, classes = WebClientApplication.class) public class WebControllerIntegrationTest { @LocalServerPort - int randomServerPort; + private int randomServerPort; @Autowired private WebTestClient testClient; @@ -24,30 +24,26 @@ public class WebControllerIntegrationTest { @Autowired private WebController webController; - @Before - public void setup() { + @BeforeEach + void setup() { webController.setServerPort(randomServerPort); } @Test - public void whenEndpointWithBlockingClientIsCalled_thenThreeTweetsAreReceived() { + void whenEndpointWithBlockingClientIsCalled_thenThreeTweetsAreReceived() { testClient.get() .uri("/tweets-blocking") .exchange() - .expectStatus() - .isOk() - .expectBodyList(Tweet.class) - .hasSize(3); + .expectStatus().isOk() + .expectBodyList(Tweet.class).hasSize(3); } @Test - public void whenEndpointWithNonBlockingClientIsCalled_thenThreeTweetsAreReceived() { + void whenEndpointWithNonBlockingClientIsCalled_thenThreeTweetsAreReceived() { testClient.get() .uri("/tweets-non-blocking") .exchange() - .expectStatus() - .isOk() - .expectBodyList(Tweet.class) - .hasSize(3); + .expectStatus().isOk() + .expectBodyList(Tweet.class).hasSize(3); } } \ No newline at end of file diff --git a/spring-reactive/src/test/java/com/baeldung/reactive/webclient/WebTestClientIntegrationTest.java b/spring-reactive/src/test/java/com/baeldung/reactive/webclient/WebTestClientIntegrationTest.java index 90f4a0eca2..dc2a2a30b9 100644 --- a/spring-reactive/src/test/java/com/baeldung/reactive/webclient/WebTestClientIntegrationTest.java +++ b/spring-reactive/src/test/java/com/baeldung/reactive/webclient/WebTestClientIntegrationTest.java @@ -3,6 +3,7 @@ package com.baeldung.reactive.webclient; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.web.server.LocalServerPort; import org.springframework.context.ApplicationContext; import org.springframework.security.test.context.support.WithMockUser; @@ -14,7 +15,7 @@ import org.springframework.web.reactive.function.server.ServerResponse; import org.springframework.web.server.WebHandler; import reactor.core.publisher.Mono; -@SpringBootTest(classes = WebClientApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@SpringBootTest(classes = WebClientApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT) public class WebTestClientIntegrationTest { @LocalServerPort @@ -26,73 +27,61 @@ public class WebTestClientIntegrationTest { @Autowired private WebClientController controller; - private final RouterFunction ROUTER_FUNCTION = RouterFunctions.route(RequestPredicates.GET("/resource"), request -> ServerResponse.ok() - .build()); - private final WebHandler WEB_HANDLER = exchange -> Mono.empty(); - @Test - public void testWebTestClientWithServerWebHandler() { - WebTestClient.bindToWebHandler(WEB_HANDLER) - .build(); + public void whenBindToWebHandler_thenRequestProcessed() { + WebHandler webHandler = exchange -> Mono.empty(); + + WebTestClient.bindToWebHandler(webHandler) + .build() + .get() + .exchange() + .expectBody().isEmpty(); } @Test - public void testWebTestClientWithRouterFunction() { - WebTestClient.bindToRouterFunction(ROUTER_FUNCTION) - .build() - .get() - .uri("/resource") - .exchange() - .expectStatus() - .isOk() - .expectBody() - .isEmpty(); + public void whenBindToRouter_thenRequestProcessed() { + RouterFunction routerFunction = RouterFunctions.route( + RequestPredicates.GET("/resource"), + request -> ServerResponse.ok().build() + ); + + WebTestClient.bindToRouterFunction(routerFunction) + .build() + .get().uri("/resource") + .exchange() + .expectStatus().isOk() + .expectBody().isEmpty(); } @Test @WithMockUser - public void testWebTestClientWithServerURL() { + public void whenBindToServer_thenRequestProcessed() { WebTestClient.bindToServer() - .baseUrl("http://localhost:" + port) - .build() - .get() - .uri("/resource") - .exchange() - .expectStatus() - .isOk() - .expectBody() - .jsonPath("field") - .isEqualTo("value"); - ; + .baseUrl("http://localhost:" + port).build() + .get().uri("/resource") + .exchange() + .expectStatus().isOk() + .expectBody().jsonPath("field").isEqualTo("value"); } @Test @WithMockUser - public void testWebTestClientWithApplicationContext() { + public void whenBindToApplicationContext_thenRequestProcessed() { WebTestClient.bindToApplicationContext(context) - .build() - .get() - .uri("/resource") - .exchange() - .expectStatus() - .isOk() - .expectBody() - .jsonPath("field") - .isEqualTo("value"); + .build() + .get().uri("/resource") + .exchange() + .expectStatus().isOk() + .expectBody().jsonPath("field").isEqualTo("value"); } @Test - public void testWebTestClientWithController() { + public void whenBindToController_thenRequestProcessed() { WebTestClient.bindToController(controller) - .build() - .get() - .uri("/resource") - .exchange() - .expectStatus() - .isOk() - .expectBody() - .jsonPath("field") - .isEqualTo("value"); + .build() + .get().uri("/resource") + .exchange() + .expectStatus().isOk() + .expectBody().jsonPath("field").isEqualTo("value"); } - } From 4c7406b65c42920b417d5822a711721234ad6dfa Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sat, 30 Apr 2022 21:49:57 +0530 Subject: [PATCH 118/278] JAVA-11775 Remove usage of deprecated JUnitPlatform.class in junit-5-basics module --- testing-modules/junit-5/pom.xml | 6 ------ .../com/baeldung/junit5/mockito/UserServiceUnitTest.java | 8 ++++---- .../java/com/baeldung/param/PersonValidatorUnitTest.java | 3 --- 3 files changed, 4 insertions(+), 13 deletions(-) diff --git a/testing-modules/junit-5/pom.xml b/testing-modules/junit-5/pom.xml index f794c3990f..047eddcbcb 100644 --- a/testing-modules/junit-5/pom.xml +++ b/testing-modules/junit-5/pom.xml @@ -32,12 +32,6 @@ junit-platform-engine ${junit-platform.version} - - org.junit.platform - junit-platform-runner - ${junit-platform.version} - test - org.junit.platform junit-platform-console-standalone diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5/mockito/UserServiceUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit5/mockito/UserServiceUnitTest.java index e13b4e24be..6aa3dd4a7f 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/junit5/mockito/UserServiceUnitTest.java +++ b/testing-modules/junit-5/src/test/java/com/baeldung/junit5/mockito/UserServiceUnitTest.java @@ -3,14 +3,15 @@ package com.baeldung.junit5.mockito; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.lenient; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.junit.platform.runner.JUnitPlatform; -import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; @@ -25,7 +26,6 @@ import com.baeldung.junit5.mockito.service.Errors; import com.baeldung.junit5.mockito.service.UserService; @ExtendWith(MockitoExtension.class) -@RunWith(JUnitPlatform.class) public class UserServiceUnitTest { UserService userService; diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/param/PersonValidatorUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/param/PersonValidatorUnitTest.java index 3db44c9d63..ce9b188afa 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/param/PersonValidatorUnitTest.java +++ b/testing-modules/junit-5/src/test/java/com/baeldung/param/PersonValidatorUnitTest.java @@ -8,10 +8,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.RepeatedTest; import org.junit.jupiter.api.extension.ExtendWith; -import org.junit.platform.runner.JUnitPlatform; -import org.junit.runner.RunWith; -@RunWith(JUnitPlatform.class) @DisplayName("Testing PersonValidator") public class PersonValidatorUnitTest { From d105d1f34767e4329ca7ec9c26ccdc48f453ee58 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sat, 30 Apr 2022 22:18:43 +0530 Subject: [PATCH 119/278] JAVA-11777 Remove usage of deprecated JUnitPlatform.class in junit5-migration module --- testing-modules/junit5-migration/pom.xml | 2 +- .../com/baeldung/junit5/AnnotationTestExampleUnitTest.java | 7 ++----- .../test/java/com/baeldung/junit5/RuleExampleUnitTest.java | 3 --- .../junit5vstestng/SelectClassesSuiteUnitTest.java | 5 ++--- .../junit5vstestng/SelectPackagesSuiteUnitTest.java | 5 ++--- 5 files changed, 7 insertions(+), 15 deletions(-) diff --git a/testing-modules/junit5-migration/pom.xml b/testing-modules/junit5-migration/pom.xml index 3ea035c4f9..3720c1dc4a 100644 --- a/testing-modules/junit5-migration/pom.xml +++ b/testing-modules/junit5-migration/pom.xml @@ -22,7 +22,7 @@ org.junit.platform - junit-platform-runner + junit-platform-suite ${junit-platform.version} test diff --git a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/AnnotationTestExampleUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/AnnotationTestExampleUnitTest.java index 16de0be9d8..52d8f8f60a 100644 --- a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/AnnotationTestExampleUnitTest.java +++ b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/AnnotationTestExampleUnitTest.java @@ -1,17 +1,14 @@ package com.baeldung.junit5; +import java.time.Duration; + import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; -import org.junit.platform.runner.JUnitPlatform; -import org.junit.runner.RunWith; - -import java.time.Duration; @Tag("annotations") @Tag("junit5") -@RunWith(JUnitPlatform.class) public class AnnotationTestExampleUnitTest { @Test public void shouldRaiseAnException() throws Exception { diff --git a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/RuleExampleUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/RuleExampleUnitTest.java index 297d0f1730..df509f561a 100644 --- a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/RuleExampleUnitTest.java +++ b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/RuleExampleUnitTest.java @@ -2,10 +2,7 @@ package com.baeldung.junit5; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.junit.platform.runner.JUnitPlatform; -import org.junit.runner.RunWith; -@RunWith(JUnitPlatform.class) @ExtendWith(TraceUnitExtension.class) public class RuleExampleUnitTest { diff --git a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/SelectClassesSuiteUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/SelectClassesSuiteUnitTest.java index 7b4bd746bf..f307a75274 100644 --- a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/SelectClassesSuiteUnitTest.java +++ b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/SelectClassesSuiteUnitTest.java @@ -1,10 +1,9 @@ package com.baeldung.junit5vstestng; -import org.junit.platform.runner.JUnitPlatform; import org.junit.platform.suite.api.SelectClasses; -import org.junit.runner.RunWith; +import org.junit.platform.suite.api.Suite; -@RunWith(JUnitPlatform.class) +@Suite @SelectClasses({Class1UnitTest.class, Class2UnitTest.class}) public class SelectClassesSuiteUnitTest { diff --git a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java index 7378eafaa7..ef8756a2bb 100644 --- a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java +++ b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java @@ -1,10 +1,9 @@ package com.baeldung.junit5vstestng; -import org.junit.platform.runner.JUnitPlatform; import org.junit.platform.suite.api.SelectPackages; -import org.junit.runner.RunWith; +import org.junit.platform.suite.api.Suite; -@RunWith(JUnitPlatform.class) +@Suite @SelectPackages({ "com.baeldung.java.suite.childpackage1", "com.baeldung.java.suite.childpackage2" }) public class SelectPackagesSuiteUnitTest { From 47adb0759dd52d864368aad437f803988d60a4b2 Mon Sep 17 00:00:00 2001 From: 515882294 <515882294@qq.com> Date: Sun, 1 May 2022 11:18:18 +0800 Subject: [PATCH 120/278] BAEL-5283: fix unit test failed --- .../java8/lambda/serialization/LambdaSerializationUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/lambda/serialization/LambdaSerializationUnitTest.java b/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/lambda/serialization/LambdaSerializationUnitTest.java index 580319c92e..bb71e3bdb9 100644 --- a/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/lambda/serialization/LambdaSerializationUnitTest.java +++ b/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/lambda/serialization/LambdaSerializationUnitTest.java @@ -36,7 +36,7 @@ public class LambdaSerializationUnitTest { @Test public void givenSerializableConsumer_whenNoCapturing_thenSerializationSuccess() throws IOException, ClassNotFoundException { - SerializableConsumer obj = System.out::println; + SerializableConsumer obj = message -> System.out.println(message); writeAndReadObject(obj, SerializableConsumer.class); } From e4f84e6aa16e2d4faed23a629dfe7f560e251f7f Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Mon, 2 May 2022 13:47:08 +0200 Subject: [PATCH 121/278] JAVA-11524: Disable failing spring-cloud-security module --- spring-cloud/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud/pom.xml b/spring-cloud/pom.xml index 9205416cd5..cac7453b0d 100644 --- a/spring-cloud/pom.xml +++ b/spring-cloud/pom.xml @@ -38,7 +38,7 @@ spring-cloud-archaius spring-cloud-functions spring-cloud-vault - spring-cloud-security + spring-cloud-task spring-cloud-zuul spring-cloud-zuul-fallback From c2cceb1d7ee88cf93931db4f25bfdb3e94d1fef8 Mon Sep 17 00:00:00 2001 From: Dmytry Kovalenko Date: Mon, 2 May 2022 19:11:24 +0300 Subject: [PATCH 122/278] [BAEL-5553] Check whether a string is valid JSON in Java (#12136) * [BAEL-5553] Check whether a string is valid JSON in Java * [BAEL-5553] Move implementation to json-2 package * [BAEL-5553] Move mapper creation outside method --- json-2/pom.xml | 6 ++++ .../jsonvalidation/GsonValidator.java | 32 +++++++++++++++++ .../jsonvalidation/JacksonValidator.java | 18 ++++++++++ .../jsonvalidation/JsonValidator.java | 30 ++++++++++++++++ .../jsonvalidation/GsonValidatorUnitTest.java | 35 +++++++++++++++++++ .../JacksonValidatorUnitTest.java | 29 +++++++++++++++ .../jsonvalidation/JsonValidatorUnitTest.java | 35 +++++++++++++++++++ 7 files changed, 185 insertions(+) create mode 100644 json-2/src/main/java/com/baeldung/jsonvalidation/GsonValidator.java create mode 100644 json-2/src/main/java/com/baeldung/jsonvalidation/JacksonValidator.java create mode 100644 json-2/src/main/java/com/baeldung/jsonvalidation/JsonValidator.java create mode 100644 json-2/src/test/java/com/baeldung/jsonvalidation/GsonValidatorUnitTest.java create mode 100644 json-2/src/test/java/com/baeldung/jsonvalidation/JacksonValidatorUnitTest.java create mode 100644 json-2/src/test/java/com/baeldung/jsonvalidation/JsonValidatorUnitTest.java diff --git a/json-2/pom.xml b/json-2/pom.xml index 751199d394..3e12fccc29 100644 --- a/json-2/pom.xml +++ b/json-2/pom.xml @@ -14,6 +14,11 @@ + + org.json + json + ${json.version} + com.alibaba fastjson @@ -148,6 +153,7 @@ 0.9.23 1.9.2 1.2.21 + 20211205 \ No newline at end of file diff --git a/json-2/src/main/java/com/baeldung/jsonvalidation/GsonValidator.java b/json-2/src/main/java/com/baeldung/jsonvalidation/GsonValidator.java new file mode 100644 index 0000000000..841513fc28 --- /dev/null +++ b/json-2/src/main/java/com/baeldung/jsonvalidation/GsonValidator.java @@ -0,0 +1,32 @@ +package com.baeldung.jsonvalidation; + +import java.io.IOException; + +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; +import com.google.gson.JsonSyntaxException; +import com.google.gson.TypeAdapter; + +public class GsonValidator { + + final TypeAdapter strictAdapter = new Gson().getAdapter(JsonElement.class); + + public boolean isValid(String json) { + try { + JsonParser.parseString(json); + } catch (JsonSyntaxException e) { + return false; + } + return true; + } + + public boolean isValidStrict(String json) { + try { + strictAdapter.fromJson(json); + } catch (JsonSyntaxException | IOException e) { + return false; + } + return true; + } +} diff --git a/json-2/src/main/java/com/baeldung/jsonvalidation/JacksonValidator.java b/json-2/src/main/java/com/baeldung/jsonvalidation/JacksonValidator.java new file mode 100644 index 0000000000..8c339f46c8 --- /dev/null +++ b/json-2/src/main/java/com/baeldung/jsonvalidation/JacksonValidator.java @@ -0,0 +1,18 @@ +package com.baeldung.jsonvalidation; + +import com.fasterxml.jackson.core.JacksonException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class JacksonValidator { + + final ObjectMapper mapper = new ObjectMapper(); + + public boolean isValid(String json) { + try { + mapper.readTree(json); + } catch (JacksonException e) { + return false; + } + return true; + } +} diff --git a/json-2/src/main/java/com/baeldung/jsonvalidation/JsonValidator.java b/json-2/src/main/java/com/baeldung/jsonvalidation/JsonValidator.java new file mode 100644 index 0000000000..e4183e2322 --- /dev/null +++ b/json-2/src/main/java/com/baeldung/jsonvalidation/JsonValidator.java @@ -0,0 +1,30 @@ +package com.baeldung.jsonvalidation; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +public class JsonValidator { + + public boolean isValidObject(String json) { + try { + new JSONObject(json); + } catch (JSONException e) { + return false; + } + return true; + } + + public boolean isValidJson(String json) { + try { + new JSONObject(json); + } catch (JSONException e) { + try { + new JSONArray(json); + } catch (JSONException ne) { + return false; + } + } + return true; + } +} diff --git a/json-2/src/test/java/com/baeldung/jsonvalidation/GsonValidatorUnitTest.java b/json-2/src/test/java/com/baeldung/jsonvalidation/GsonValidatorUnitTest.java new file mode 100644 index 0000000000..3b8989bdb5 --- /dev/null +++ b/json-2/src/test/java/com/baeldung/jsonvalidation/GsonValidatorUnitTest.java @@ -0,0 +1,35 @@ +package com.baeldung.jsonvalidation; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +public class GsonValidatorUnitTest { + + private final GsonValidator validator = new GsonValidator(); + + @Test + public void givenValidObjectJson_whenValidatingNonStrict_thenValid() { + String json = "{\"email\": \"example@com\", \"name\": \"John\"}"; + assertTrue(validator.isValid(json)); + } + + @Test + public void givenValidArrayJson_whenValidatingNonStrict_thenValid() { + String json = "[{\"email\": \"example@com\", \"name\": \"John\"},{\"email\": \"example1@com\", \"name\": \"Bob\"}]"; + assertTrue(validator.isValid(json)); + } + + @Test + public void givenInvalidJson_whenValidatingNonStrict_thenValid() { + String json = "Invalid_Json"; + assertTrue(validator.isValid(json)); + } + + @Test + public void givenInvalidJson_whenValidatingStrict_thenInvalid() { + String json = "Invalid_Json"; + assertFalse(validator.isValidStrict(json)); + } +} diff --git a/json-2/src/test/java/com/baeldung/jsonvalidation/JacksonValidatorUnitTest.java b/json-2/src/test/java/com/baeldung/jsonvalidation/JacksonValidatorUnitTest.java new file mode 100644 index 0000000000..b633af7fdc --- /dev/null +++ b/json-2/src/test/java/com/baeldung/jsonvalidation/JacksonValidatorUnitTest.java @@ -0,0 +1,29 @@ +package com.baeldung.jsonvalidation; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +public class JacksonValidatorUnitTest { + + private final JacksonValidator validator = new JacksonValidator(); + + @Test + public void givenValidObjectJson_whenValidating_thenValid() { + String json = "{\"email\": \"example@com\", \"name\": \"John\"}"; + assertTrue(validator.isValid(json)); + } + + @Test + public void givenValidArrayJson_whenValidating_thenValid() { + String json = "[{\"email\": \"example@com\", \"name\": \"John\"},{\"email\": \"example1@com\", \"name\": \"Bob\"}]"; + assertTrue(validator.isValid(json)); + } + + @Test + public void givenInvalidJson_whenValidating_thenInvalid() { + String json = "Invalid_Json"; + assertFalse(validator.isValid(json)); + } +} diff --git a/json-2/src/test/java/com/baeldung/jsonvalidation/JsonValidatorUnitTest.java b/json-2/src/test/java/com/baeldung/jsonvalidation/JsonValidatorUnitTest.java new file mode 100644 index 0000000000..a590b3f709 --- /dev/null +++ b/json-2/src/test/java/com/baeldung/jsonvalidation/JsonValidatorUnitTest.java @@ -0,0 +1,35 @@ +package com.baeldung.jsonvalidation; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +public class JsonValidatorUnitTest { + + private final JsonValidator validator = new JsonValidator(); + + @Test + public void givenValidObjectJson_whenValidatingObject_thenValid() { + String json = "{\"email\": \"example@com\", \"name\": \"John\"}"; + assertTrue(validator.isValidObject(json)); + } + + @Test + public void givenInvalidJson_whenValidating_thenInvalid() { + String json = "Invalid_Json"; + assertFalse(validator.isValidObject(json)); + } + + @Test + public void givenValidArrayJson_whenValidatingObject_thenInvalid() { + String json = "[{\"email\": \"example@com\", \"name\": \"John\"},{\"email\": \"example1@com\", \"name\": \"Bob\"}]"; + assertFalse(validator.isValidObject(json)); + } + + @Test + public void givenValidJson_whenValidatingJson_thenValid() { + String json = "[{\"email\": \"example@com\", \"name\": \"John\"},{\"email\": \"example1@com\", \"name\": \"Bob\"}]"; + assertTrue(validator.isValidJson(json)); + } +} From 833e3f9e9f470e8704d9357a701d3f32fbc2d091 Mon Sep 17 00:00:00 2001 From: sebx59 Date: Mon, 2 May 2022 18:29:06 +0200 Subject: [PATCH 123/278] BAEL-5559 - Swap two variables using Java (#12113) * BAEL-5559 - Swap two variables using Java initial commit * Updating tests names Co-authored-by: HARDEMAN Sebastien --- .../math/swap/SwappingVariablesUnitTest.java | 157 ++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 core-java-modules/core-java-lang-math-3/src/test/java/com/baeldung/math/swap/SwappingVariablesUnitTest.java diff --git a/core-java-modules/core-java-lang-math-3/src/test/java/com/baeldung/math/swap/SwappingVariablesUnitTest.java b/core-java-modules/core-java-lang-math-3/src/test/java/com/baeldung/math/swap/SwappingVariablesUnitTest.java new file mode 100644 index 0000000000..bbfa0ee4f1 --- /dev/null +++ b/core-java-modules/core-java-lang-math-3/src/test/java/com/baeldung/math/swap/SwappingVariablesUnitTest.java @@ -0,0 +1,157 @@ +package com.baeldung.math.swap; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class SwappingVariablesUnitTest { + + @Test + public void givenTwoStrings_whenSwappingInMethod_thenFails() { + + String a = "a"; + String b = "b"; + + swap(a, b); + + Assertions.assertFalse(a.equals("b")); + Assertions.assertFalse(b.equals("a")); + } + + @Test + public void givenTwoWrappers_whenSwappingInMethod_thenSuccess() { + + Wrapper a = new Wrapper("a"); + Wrapper b = new Wrapper("b"); + + swap(a, b); + + Assertions.assertTrue(a.string.equals("b")); + Assertions.assertTrue(b.string.equals("a")); + } + + @Test + public void givenTwoIntegers_whenSwappingUsingAdditionSubstraction_thenSuccess() { + + int a = 5; + int b = 10; + + a = a + b; + b = a - b; + a = a - b; + + Assertions.assertTrue(a == 10); + Assertions.assertTrue(b == 5); + } + + @Test + public void givenTwoIntegers_whenSwappingUsingMultiplicationDivision_thenSuccess() { + + int a = 5; + int b = 10; + + a = a * b; + b = a / b; + a = a / b; + + Assertions.assertTrue(a == 10); + Assertions.assertTrue(b == 5); + } + + @Test + public void givenTwoIntegers_whenSwappingWithOverflow_thenFails() { + + int a = Integer.MAX_VALUE; + int b = 10; + + a = a * b; + b = a / b; + a = a / b; + + Assertions.assertTrue(a == 10); + Assertions.assertFalse(b == Integer.MAX_VALUE); + } + + @Test + public void givenTwoChars_whenSwappingWithCast_thenSuccess() { + + char a = 'a'; + char b = 'b'; + + a = (char)(a * b); + b = (char)(a / b); + a = (char)(a / b); + + Assertions.assertTrue(a == 'b'); + Assertions.assertTrue(b == 'a'); + } + + @Test + public void givenTwoIntegers_whenSwappingUsingXor_thenSuccess() { + + int a = 5; + int b = 10; + + a = a ^ b; + b = a ^ b; + a = a ^ b; + + Assertions.assertTrue(a == 10); + Assertions.assertTrue(b == 5); + } + + @Test + public void givenTwoIntegers_whenSwappingUsingSingleLineXor_thenSuccess() { + + int a = 5; + int b = 10; + + a = a ^ b ^ (b = a); + + Assertions.assertTrue(a == 10); + Assertions.assertTrue(b == 5); + } + + @Test + public void givenTwoIntegers_whenSwappingUsingAdditionSubstractionSingleLine_thenSuccess() { + + int a = 5; + int b = 10; + + b = (a + b) - (a = b); + + Assertions.assertTrue(a == 10); + Assertions.assertTrue(b == 5); + } + + /** + * Illustrates that swapping in a method doesn't work + */ + private void swap(String a, String b) { + + String temp = b; + b = a; + a = temp; + } + + /** + * Illustrates swapping in a method with Wrapper class + */ + private void swap(Wrapper a, Wrapper b) { + + String temp = b.string; + b.string = a.string; + a.string = temp; + } + + class Wrapper { + + public String string; + + public Wrapper(String string) { + + this.string = string; + } + + + } +} From c1cb62d793e60dd8170b38e54cd13fb2da67a751 Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Mon, 2 May 2022 22:37:59 +0100 Subject: [PATCH 124/278] [JAVA-11827] Fix groupId reference in pom files --- spring-cloud/pom.xml | 2 +- spring-cloud/spring-cloud-security/auth-client/pom.xml | 2 +- spring-cloud/spring-cloud-security/auth-resource/pom.xml | 2 +- spring-cloud/spring-cloud-security/auth-server/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-cloud/pom.xml b/spring-cloud/pom.xml index cac7453b0d..9205416cd5 100644 --- a/spring-cloud/pom.xml +++ b/spring-cloud/pom.xml @@ -38,7 +38,7 @@ spring-cloud-archaius spring-cloud-functions spring-cloud-vault - + spring-cloud-security spring-cloud-task spring-cloud-zuul spring-cloud-zuul-fallback diff --git a/spring-cloud/spring-cloud-security/auth-client/pom.xml b/spring-cloud/spring-cloud-security/auth-client/pom.xml index cdbb056a45..1ec56ce9ef 100644 --- a/spring-cloud/spring-cloud-security/auth-client/pom.xml +++ b/spring-cloud/spring-cloud-security/auth-client/pom.xml @@ -9,7 +9,7 @@ Spring Cloud Security APP Client Module - com.baeldung + com.baeldung.spring.cloud spring-cloud-security 1.0.0-SNAPSHOT diff --git a/spring-cloud/spring-cloud-security/auth-resource/pom.xml b/spring-cloud/spring-cloud-security/auth-resource/pom.xml index c999030c07..9362a71931 100644 --- a/spring-cloud/spring-cloud-security/auth-resource/pom.xml +++ b/spring-cloud/spring-cloud-security/auth-resource/pom.xml @@ -9,7 +9,7 @@ Spring Cloud Security APP Resource Module - com.baeldung + com.baeldung.spring.cloud spring-cloud-security 1.0.0-SNAPSHOT diff --git a/spring-cloud/spring-cloud-security/auth-server/pom.xml b/spring-cloud/spring-cloud-security/auth-server/pom.xml index c0330aad43..234d9cde78 100644 --- a/spring-cloud/spring-cloud-security/auth-server/pom.xml +++ b/spring-cloud/spring-cloud-security/auth-server/pom.xml @@ -8,7 +8,7 @@ Spring Cloud Security APP Server Module - com.baeldung + com.baeldung.spring.cloud spring-cloud-security 1.0.0-SNAPSHOT From 26d944ceaada03dff29a0b0da62e53b2c8f69ee7 Mon Sep 17 00:00:00 2001 From: psevestre Date: Tue, 3 May 2022 02:42:41 -0300 Subject: [PATCH 125/278] [BAEL-5584] Article code (#12157) --- spring-security-modules/pom.xml | 1 + .../spring-security-opa/pom.xml | 49 ++++++++ .../baeldung/security/opa/Application.java | 13 +++ .../security/opa/config/OpaConfiguration.java | 25 ++++ .../security/opa/config/OpaProperties.java | 14 +++ .../opa/config/SecurityConfiguration.java | 110 ++++++++++++++++++ .../opa/controller/AccountController.java | 23 ++++ .../baeldung/security/opa/domain/Account.java | 25 ++++ .../security/opa/service/AccountService.java | 37 ++++++ .../src/main/resources/application.yaml | 3 + .../controller/AccountControllerLiveTest.java | 67 +++++++++++ .../src/test/rego/account.rego | 43 +++++++ 12 files changed, 410 insertions(+) create mode 100644 spring-security-modules/spring-security-opa/pom.xml create mode 100644 spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/Application.java create mode 100644 spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/config/OpaConfiguration.java create mode 100644 spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/config/OpaProperties.java create mode 100644 spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/config/SecurityConfiguration.java create mode 100644 spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/controller/AccountController.java create mode 100644 spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/domain/Account.java create mode 100644 spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/service/AccountService.java create mode 100644 spring-security-modules/spring-security-opa/src/main/resources/application.yaml create mode 100644 spring-security-modules/spring-security-opa/src/test/java/com/baeldung/security/opa/controller/AccountControllerLiveTest.java create mode 100644 spring-security-modules/spring-security-opa/src/test/rego/account.rego diff --git a/spring-security-modules/pom.xml b/spring-security-modules/pom.xml index 9fdfde282d..bb36909c79 100644 --- a/spring-security-modules/pom.xml +++ b/spring-security-modules/pom.xml @@ -46,6 +46,7 @@ spring-security-web-x509 spring-session spring-social-login + spring-security-opa \ No newline at end of file diff --git a/spring-security-modules/spring-security-opa/pom.xml b/spring-security-modules/spring-security-opa/pom.xml new file mode 100644 index 0000000000..6665c33db3 --- /dev/null +++ b/spring-security-modules/spring-security-opa/pom.xml @@ -0,0 +1,49 @@ + + 4.0.0 + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 + + spring-security-opa + Spring Security with OPA authorization + + + + org.springframework.boot + spring-boot-starter-webflux + + + + org.springframework.boot + spring-boot-starter-security + + + + org.projectlombok + lombok + + + + com.google.guava + guava + 31.0.1-jre + + + + org.springframework.boot + spring-boot-devtools + + + + org.springframework.security + spring-security-test + + + org.springframework.boot + spring-boot-configuration-processor + true + + + \ No newline at end of file diff --git a/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/Application.java b/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/Application.java new file mode 100644 index 0000000000..789a1f803f --- /dev/null +++ b/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/Application.java @@ -0,0 +1,13 @@ +package com.baeldung.security.opa; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/config/OpaConfiguration.java b/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/config/OpaConfiguration.java new file mode 100644 index 0000000000..e24fdbcf35 --- /dev/null +++ b/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/config/OpaConfiguration.java @@ -0,0 +1,25 @@ +package com.baeldung.security.opa.config; + +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.reactive.function.client.WebClient; + +import lombok.RequiredArgsConstructor; + +@Configuration +@RequiredArgsConstructor +@EnableConfigurationProperties(OpaProperties.class) +public class OpaConfiguration { + + private final OpaProperties opaProperties; + + @Bean + public WebClient opaWebClient(WebClient.Builder builder) { + + return builder + .baseUrl(opaProperties.getEndpoint()) + .build(); + } + +} diff --git a/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/config/OpaProperties.java b/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/config/OpaProperties.java new file mode 100644 index 0000000000..acc23a2fd2 --- /dev/null +++ b/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/config/OpaProperties.java @@ -0,0 +1,14 @@ +package com.baeldung.security.opa.config; + +import javax.annotation.Nonnull; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +import lombok.Data; + +@ConfigurationProperties(prefix = "opa") +@Data +public class OpaProperties { + @Nonnull + private String endpoint = "http://localhost:8181"; +} diff --git a/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/config/SecurityConfiguration.java b/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/config/SecurityConfiguration.java new file mode 100644 index 0000000000..7e10cb2e8a --- /dev/null +++ b/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/config/SecurityConfiguration.java @@ -0,0 +1,110 @@ +package com.baeldung.security.opa.config; + +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; + +import org.reactivestreams.Publisher; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.MediaType; +import org.springframework.http.client.reactive.ClientHttpRequest; +import org.springframework.security.authentication.AnonymousAuthenticationToken; +import org.springframework.security.authorization.AuthorizationDecision; +import org.springframework.security.authorization.ReactiveAuthorizationManager; +import org.springframework.security.config.web.server.ServerHttpSecurity; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.web.server.SecurityWebFilterChain; +import org.springframework.security.web.server.authorization.AuthorizationContext; +import org.springframework.web.reactive.function.BodyInserter; +import org.springframework.web.reactive.function.BodyInserters; +import org.springframework.web.reactive.function.client.ClientResponse; +import org.springframework.web.reactive.function.client.WebClient; + +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.google.common.collect.ImmutableMap; + +import reactor.core.publisher.Mono; + +@Configuration +public class SecurityConfiguration { + + + @Bean + public SecurityWebFilterChain accountAuthorization(ServerHttpSecurity http, @Qualifier("opaWebClient")WebClient opaWebClient) { + + // @formatter:on + return http + .httpBasic() + .and() + .authorizeExchange(exchanges -> { + exchanges + .pathMatchers("/account/*") + .access(opaAuthManager(opaWebClient)); + }) + .build(); + // @formatter:on + + } + + @Bean + public ReactiveAuthorizationManager opaAuthManager(WebClient opaWebClient) { + + return (auth, context) -> { + return opaWebClient.post() + .accept(MediaType.APPLICATION_JSON) + .contentType(MediaType.APPLICATION_JSON) + .body(toAuthorizationPayload(auth,context), Map.class) + .exchangeToMono(this::toDecision); + }; + } + + private Mono toDecision(ClientResponse response) { + + if ( !response.statusCode().is2xxSuccessful()) { + return Mono.just(new AuthorizationDecision(false)); + } + + return response + .bodyToMono(ObjectNode.class) + .map(node -> { + boolean authorized = node.path("result").path("authorized").asBoolean(false); + return new AuthorizationDecision(authorized); + }); + + } + + private Publisher> toAuthorizationPayload(Mono auth, AuthorizationContext context) { + // @formatter:off + return auth + .defaultIfEmpty(new AnonymousAuthenticationToken("**ANONYMOUS**", new Object(), Arrays.asList(new SimpleGrantedAuthority("ANONYMOUS")))) + .map( a -> { + + Map headers = context.getExchange().getRequest() + .getHeaders() + .toSingleValueMap(); + + Map attributes = ImmutableMap.builder() + .put("principal",a.getName()) + .put("authorities", + a.getAuthorities() + .stream() + .map(g -> g.getAuthority()) + .collect(Collectors.toList())) + .put("uri", context.getExchange().getRequest().getURI().getPath()) + .put("headers",headers) + .build(); + + Map input = ImmutableMap.builder() + .put("input",attributes) + .build(); + + return input; + }); + // @formatter:on + } +} diff --git a/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/controller/AccountController.java b/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/controller/AccountController.java new file mode 100644 index 0000000000..ba0ff61554 --- /dev/null +++ b/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/controller/AccountController.java @@ -0,0 +1,23 @@ +package com.baeldung.security.opa.controller; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.security.opa.domain.Account; +import com.baeldung.security.opa.service.AccountService; + +import lombok.RequiredArgsConstructor; +import reactor.core.publisher.Mono; + +@RestController +@RequiredArgsConstructor +public class AccountController { + + private final AccountService accountService; + + @GetMapping("/account/{accountId}") + public Mono getAccount(@PathVariable("accountId") String accountId) { + return accountService.findByAccountId(accountId); + } +} diff --git a/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/domain/Account.java b/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/domain/Account.java new file mode 100644 index 0000000000..db494627a8 --- /dev/null +++ b/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/domain/Account.java @@ -0,0 +1,25 @@ +package com.baeldung.security.opa.domain; + +import java.math.BigDecimal; + +import lombok.Data; + +@Data +public class Account { + + private String id; + private BigDecimal balance; + private String currency; + + + public static Account of(String id, BigDecimal balance, String currency) { + Account acc = new Account(); + acc.setId(id); + acc.setBalance(balance); + acc.setCurrency(currency); + + return acc; + } + + +} diff --git a/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/service/AccountService.java b/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/service/AccountService.java new file mode 100644 index 0000000000..18968019f9 --- /dev/null +++ b/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/service/AccountService.java @@ -0,0 +1,37 @@ +/** + * + */ +package com.baeldung.security.opa.service; + +import java.math.BigDecimal; +import java.util.Map; + +import org.springframework.stereotype.Service; + +import com.baeldung.security.opa.domain.Account; +import com.google.common.collect.ImmutableMap; + +import reactor.core.publisher.Mono; + +/** + * @author Philippe + * + */ +@Service +public class AccountService { + + private Map accounts = ImmutableMap.builder() + .put("0001", Account.of("0001", BigDecimal.valueOf(100.00), "USD")) + .put("0002", Account.of("0002", BigDecimal.valueOf(101.00), "EUR")) + .put("0003", Account.of("0003", BigDecimal.valueOf(102.00), "BRL")) + .put("0004", Account.of("0004", BigDecimal.valueOf(103.00), "AUD")) + .put("0005", Account.of("0005", BigDecimal.valueOf(10400.00), "JPY")) + .build(); + + + public Mono findByAccountId(String accountId) { + return Mono.just(accounts.get(accountId)) + .switchIfEmpty(Mono.error(new IllegalArgumentException("invalid.account"))); + } + +} diff --git a/spring-security-modules/spring-security-opa/src/main/resources/application.yaml b/spring-security-modules/spring-security-opa/src/main/resources/application.yaml new file mode 100644 index 0000000000..6fb9200277 --- /dev/null +++ b/spring-security-modules/spring-security-opa/src/main/resources/application.yaml @@ -0,0 +1,3 @@ +# OPA configuration properties +opa: + endpoint: http://localhost:8181/v1/data/baeldung/auth/account \ No newline at end of file diff --git a/spring-security-modules/spring-security-opa/src/test/java/com/baeldung/security/opa/controller/AccountControllerLiveTest.java b/spring-security-modules/spring-security-opa/src/test/java/com/baeldung/security/opa/controller/AccountControllerLiveTest.java new file mode 100644 index 0000000000..7469fd327c --- /dev/null +++ b/spring-security-modules/spring-security-opa/src/test/java/com/baeldung/security/opa/controller/AccountControllerLiveTest.java @@ -0,0 +1,67 @@ +package com.baeldung.security.opa.controller; + +import static org.springframework.security.test.web.reactive.server.SecurityMockServerConfigurers.springSecurity; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.ApplicationContext; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.web.reactive.server.WebTestClient; + +// !!! NOTICE: Start OPA server before running this test class !!! +@SpringBootTest +@ActiveProfiles("test") +class AccountControllerLiveTest { + + @Autowired + ApplicationContext context; + WebTestClient rest; + + @BeforeEach + public void setup() { + this.rest = WebTestClient.bindToApplicationContext(this.context) + .apply(springSecurity()) + .configureClient() + .build(); + } + + + @Test + @WithMockUser(username = "user1", roles = { "account:read:0001"} ) + void testGivenValidUser_thenSuccess() { + rest.get() + .uri("/account/0001") + .accept(MediaType.APPLICATION_JSON) + .exchange() + .expectStatus() + .is2xxSuccessful(); + } + + @Test + @WithMockUser(username = "user1", roles = { "account:read:0002"} ) + void testGivenValidUser_thenUnauthorized() { + rest.get() + .uri("/account/0001") + .accept(MediaType.APPLICATION_JSON) + .exchange() + .expectStatus() + .isForbidden(); + } + + @Test + @WithMockUser(username = "user1", roles = {} ) + void testGivenNoAuthorities_thenForbidden() { + rest.get() + .uri("/account/0001") + .accept(MediaType.APPLICATION_JSON) + .exchange() + .expectStatus() + .isForbidden(); + } + + +} diff --git a/spring-security-modules/spring-security-opa/src/test/rego/account.rego b/spring-security-modules/spring-security-opa/src/test/rego/account.rego new file mode 100644 index 0000000000..567d531bb4 --- /dev/null +++ b/spring-security-modules/spring-security-opa/src/test/rego/account.rego @@ -0,0 +1,43 @@ +# +# Simple authorization rule for accounts +# +# Assumes an input document with the following properties: +# +# resource: requested resource +# method: request method +# authorities: Granted authorities +# headers: Request headers +# +package baeldung.auth.account + +# Not authorized by default +default authorized = false + +# Authorize when there are no rules that deny access to the resource and +# there's at least one rule allowing +authorized = true { + count(deny) == 0 + count(allow) > 0 +} + +# Allow access to /public +allow["public"] { + regex.match("^/public/.*",input.uri) +} + +# Account API requires authenticated user +deny["account_api_authenticated"] { + regex.match("^/account/.*",input.uri) + regex.match("ANONYMOUS",input.principal) +} + +# Authorize access to account if principal has +# matching authority +allow["account_api_authorized"] { + regex.match("^/account/.+",input.uri) + parts := split(input.uri,"/") + account := parts[2] + role := concat(":",[ "ROLE_account", "read", account] ) + role == input.authorities[i] +} + From 15867c393d7b0f36d19d27daba9b60a6b9861012 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Tue, 3 May 2022 10:38:57 +0200 Subject: [PATCH 126/278] Revert "JAVA-8271 Uncommenting spring-boot-keycloak module" This reverts commit 05cdb533d7db91d486209ae5a91050909b0c364c. --- spring-boot-modules/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index 999c006f5e..003a52db13 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -44,7 +44,7 @@ spring-boot-groovy spring-boot-jasypt - spring-boot-keycloak + spring-boot-libraries spring-boot-libraries-2 spring-boot-libraries-comparison From b4b9ba8b32d71b5439c60af7ffd5968eda6174e4 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Tue, 3 May 2022 15:31:32 +0530 Subject: [PATCH 127/278] JAVA-8271 Lets try different jaxb2-maven-plugin version --- spring-boot-modules/pom.xml | 2 +- spring-boot-modules/spring-boot-keycloak/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index 003a52db13..dd81072ad1 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -44,7 +44,7 @@ spring-boot-groovy spring-boot-jasypt - + spring-boot-keycloak spring-boot-libraries spring-boot-libraries-2 spring-boot-libraries-comparison diff --git a/spring-boot-modules/spring-boot-keycloak/pom.xml b/spring-boot-modules/spring-boot-keycloak/pom.xml index 09ddcaa724..9e39176765 100644 --- a/spring-boot-modules/spring-boot-keycloak/pom.xml +++ b/spring-boot-modules/spring-boot-keycloak/pom.xml @@ -89,7 +89,7 @@ org.codehaus.mojo jaxb2-maven-plugin - 2.5.0 + 2.3.1 xjc From 02cd7a1aafa8898319057a91fe7c506aad0adba7 Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Tue, 3 May 2022 15:06:06 +0500 Subject: [PATCH 128/278] Updated README.md added a link back to the article: https://www.baeldung.com/java-enum-random-value --- java-numbers-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/java-numbers-4/README.md b/java-numbers-4/README.md index 267639a829..c18a5ebe6f 100644 --- a/java-numbers-4/README.md +++ b/java-numbers-4/README.md @@ -7,3 +7,4 @@ - [Automorphic Numbers in Java](https://www.baeldung.com/java-automorphic-numbers) - [Convert Byte Size Into a Human-Readable Format in Java](https://www.baeldung.com/java-human-readable-byte-size) - [Convert boolean to int in Java](https://www.baeldung.com/java-boolean-to-int) +- [Generate a Random Value From an Enum](https://www.baeldung.com/java-enum-random-value) From 592bcb1da494ec3e52b6a9f00b880a8004f1d9a8 Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Tue, 3 May 2022 15:11:53 +0500 Subject: [PATCH 129/278] Updated README.md added link back to the article: https://www.baeldung.com/maven-disable-parent-pom-plugin --- maven-modules/maven-parent-pom-resolution/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/maven-modules/maven-parent-pom-resolution/README.md b/maven-modules/maven-parent-pom-resolution/README.md index b315b2f626..ec4ef41149 100644 --- a/maven-modules/maven-parent-pom-resolution/README.md +++ b/maven-modules/maven-parent-pom-resolution/README.md @@ -1,3 +1,4 @@ ### Relevant Articles: - [Understanding Maven’s “relativePath” Tag for a Parent POM](https://www.baeldung.com/maven-relativepath) +- [How to Disable a Maven Plugin Defined in a Parent POM](https://www.baeldung.com/maven-disable-parent-pom-plugin) From afb318fab4aba50364daf43d31037dd55dcdf838 Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Tue, 3 May 2022 15:18:37 +0500 Subject: [PATCH 130/278] Updated README.md added a link back to the article: https://www.baeldung.com/java-scanner-skip --- core-java-modules/core-java-io-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-io-4/README.md b/core-java-modules/core-java-io-4/README.md index 65a46eeed3..c05618afbd 100644 --- a/core-java-modules/core-java-io-4/README.md +++ b/core-java-modules/core-java-io-4/README.md @@ -9,4 +9,5 @@ This module contains articles about core Java input and output (IO) - [SequenceInputStream Class in Java](https://www.baeldung.com/java-sequenceinputstream) - [Read a File Into a Map in Java](https://www.baeldung.com/java-read-file-into-map) - [Read User Input Until a Condition is Met](https://www.baeldung.com/java-read-input-until-condition) +- [Java Scanner.skip method with examples](https://www.baeldung.com/java-scanner-skip) - [[<-- Prev]](/core-java-modules/core-java-io-3) From 44361faa48560b5bb5ea37690c17901a79263896 Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Tue, 3 May 2022 15:27:08 +0500 Subject: [PATCH 131/278] Updated README.md added link back to the article: https://www.baeldung.com/java-serialize-lambda --- core-java-modules/core-java-lambdas/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core-java-modules/core-java-lambdas/README.md b/core-java-modules/core-java-lambdas/README.md index 832d4783f2..53414eb14c 100644 --- a/core-java-modules/core-java-lambdas/README.md +++ b/core-java-modules/core-java-lambdas/README.md @@ -6,4 +6,5 @@ - [Lambda Expressions and Functional Interfaces: Tips and Best Practices](http://www.baeldung.com/java-8-lambda-expressions-tips) - [Exceptions in Java 8 Lambda Expressions](http://www.baeldung.com/java-lambda-exceptions) - [Method References in Java](https://www.baeldung.com/java-method-references) -- [The Double Colon Operator in Java 8](https://www.baeldung.com/java-8-double-colon-operator) \ No newline at end of file +- [The Double Colon Operator in Java 8](https://www.baeldung.com/java-8-double-colon-operator) +- [Serialize a Lambda in Java](https://www.baeldung.com/java-serialize-lambda) From 518ffde6294223a7ae71422ff13f48fc3762fbef Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Tue, 3 May 2022 15:33:04 +0500 Subject: [PATCH 132/278] Updated README.md added link back to the article: https://www.baeldung.com/java-validate-json-string --- json-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/json-2/README.md b/json-2/README.md index ed5a79dd3d..b3e7fb0b94 100644 --- a/json-2/README.md +++ b/json-2/README.md @@ -9,4 +9,5 @@ This module contains articles about JSON. - [Hypermedia Serialization With JSON-LD](https://www.baeldung.com/json-linked-data) - [Generate a Java Class From JSON](https://www.baeldung.com/java-generate-class-from-json) - [A Guide to FastJson](https://www.baeldung.com/fastjson) +- [Check Whether a String is Valid JSON in Java](https://www.baeldung.com/java-validate-json-string) - More Articles: [[<-- prev]](/json) From 511416d22b62c54c5d1ab29919e9525fac641c28 Mon Sep 17 00:00:00 2001 From: panagiotiskakos Date: Tue, 3 May 2022 16:23:08 +0300 Subject: [PATCH 133/278] Changed properties to oracleucp from ucp --- .../application-oracle-pooling-basic.properties | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/persistence-modules/spring-boot-persistence-2/src/main/resources/application-oracle-pooling-basic.properties b/persistence-modules/spring-boot-persistence-2/src/main/resources/application-oracle-pooling-basic.properties index 9de2ee476b..39872e9a00 100644 --- a/persistence-modules/spring-boot-persistence-2/src/main/resources/application-oracle-pooling-basic.properties +++ b/persistence-modules/spring-boot-persistence-2/src/main/resources/application-oracle-pooling-basic.properties @@ -23,12 +23,12 @@ spring.datasource.tomcat.minIdle=5 # UCP settings #Note: These properties require JDBC version 21.0.0.0 -spring.datasource.ucp.connection-factory-class-name=oracle.jdbc.pool.OracleDataSource -spring.datasource.ucp.sql-for-validate-connection=select * from dual -spring.datasource.ucp.connection-pool-name=UcpPoolBooks -spring.datasource.ucp.initial-pool-size=5 -spring.datasource.ucp.min-pool-size=5 -spring.datasource.ucp.max-pool-size=10 +spring.datasource.oracleucp.connection-factory-class-name=oracle.jdbc.pool.OracleDataSource +spring.datasource.oracleucp.sql-for-validate-connection=select * from dual +spring.datasource.oracleucp.connection-pool-name=UcpPoolBooks +spring.datasource.oracleucp.initial-pool-size=5 +spring.datasource.oracleucp.min-pool-size=5 +spring.datasource.oracleucp.max-pool-size=10 # JPA settings spring.jpa.database-platform=org.hibernate.dialect.Oracle12cDialect From da3f8ad4a06720592457b730a040be401d9e3933 Mon Sep 17 00:00:00 2001 From: sharifi Date: Tue, 3 May 2022 17:54:14 +0430 Subject: [PATCH 134/278] bael-5249: add application-properties --- .../src/main/resources/application-embedded.properties | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 spring-boot-modules/spring-boot-keycloak/src/main/resources/application-embedded.properties diff --git a/spring-boot-modules/spring-boot-keycloak/src/main/resources/application-embedded.properties b/spring-boot-modules/spring-boot-keycloak/src/main/resources/application-embedded.properties new file mode 100644 index 0000000000..7e1985f0ad --- /dev/null +++ b/spring-boot-modules/spring-boot-keycloak/src/main/resources/application-embedded.properties @@ -0,0 +1,9 @@ +### server port +server.port=8080 + +#Keycloak Configuration +keycloak.auth-server-url=http://localhost:8083/auth +keycloak.realm=baeldung +keycloak.resource=customerClient +keycloak.public-client=true +keycloak.principal-attribute=preferred_username \ No newline at end of file From b9da120df02930c2d5a1ba0ff8ffc35faf7aa284 Mon Sep 17 00:00:00 2001 From: sharifi Date: Tue, 3 May 2022 17:55:30 +0430 Subject: [PATCH 135/278] bael-5249: add User ID --- .../com/baeldung/keycloak/CustomUserAttrController.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/CustomUserAttrController.java b/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/CustomUserAttrController.java index 1959590e5a..5b267ae19e 100644 --- a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/CustomUserAttrController.java +++ b/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/CustomUserAttrController.java @@ -24,6 +24,8 @@ public class CustomUserAttrController { final Principal principal = (Principal) authentication.getPrincipal(); String dob = ""; + String userIdByToken = ""; + String userIdByMapper = ""; if (principal instanceof KeycloakPrincipal) { @@ -31,6 +33,9 @@ public class CustomUserAttrController { IDToken token = kPrincipal.getKeycloakSecurityContext() .getIdToken(); + userIdByToken = token.getSubject(); + userIdByMapper = token.getOtherClaims().get("user_id").toString(); + Map customClaims = token.getOtherClaims(); if (customClaims.containsKey("DOB")) { @@ -39,6 +44,8 @@ public class CustomUserAttrController { } model.addAttribute("username", principal.getName()); + model.addAttribute("userIDByToken", userIdByToken); + model.addAttribute("userIDByMapper", userIdByMapper); model.addAttribute("dob", dob); return "userInfo"; } From 23e2df0c99aaed57d8eb602ba4e0b129f9823983 Mon Sep 17 00:00:00 2001 From: sharifi Date: Tue, 3 May 2022 17:55:48 +0430 Subject: [PATCH 136/278] bael-5249: add User ID to view --- .../src/main/resources/templates/userInfo.html | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/spring-boot-modules/spring-boot-keycloak/src/main/resources/templates/userInfo.html b/spring-boot-modules/spring-boot-keycloak/src/main/resources/templates/userInfo.html index 1446fe2124..7f772398c1 100644 --- a/spring-boot-modules/spring-boot-keycloak/src/main/resources/templates/userInfo.html +++ b/spring-boot-modules/spring-boot-keycloak/src/main/resources/templates/userInfo.html @@ -7,6 +7,12 @@

    Hello, --name--.

    +

    + User ID By Token: --userID--. +

    +

    + User ID By Mapper: --userID--. +

    Your Date of Birth as per our records is .

    From b5cfb729e7d85931da24c4d5fc844f6512978737 Mon Sep 17 00:00:00 2001 From: panagiotiskakos Date: Tue, 3 May 2022 17:02:25 +0300 Subject: [PATCH 137/278] Changed properties to oracleucp from ucp --- .../pooling/SpringOraclePoolingApplicationOracleUCPLiveTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplicationOracleUCPLiveTest.java b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplicationOracleUCPLiveTest.java index cf418b2cf4..aa448bc44a 100644 --- a/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplicationOracleUCPLiveTest.java +++ b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplicationOracleUCPLiveTest.java @@ -26,4 +26,5 @@ public class SpringOraclePoolingApplicationOracleUCPLiveTest { assertTrue(dataSource instanceof oracle.ucp.jdbc.UCPDataSource); } + } From 744f71356bebf05d658a4333697baaae10226587 Mon Sep 17 00:00:00 2001 From: chrisjaimes <45322800+chrisjaimes@users.noreply.github.com> Date: Tue, 3 May 2022 15:18:18 -0400 Subject: [PATCH 138/278] added Student API Collection json file (#12161) Co-authored-by: Christian Jaimes --- ...ent_API_Collection.postman_collection.json | 101 ++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 spring-boot-modules/spring-boot-mvc-2/src/main/resources/Student_API_Collection.postman_collection.json diff --git a/spring-boot-modules/spring-boot-mvc-2/src/main/resources/Student_API_Collection.postman_collection.json b/spring-boot-modules/spring-boot-mvc-2/src/main/resources/Student_API_Collection.postman_collection.json new file mode 100644 index 0000000000..1cce92b7dc --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-2/src/main/resources/Student_API_Collection.postman_collection.json @@ -0,0 +1,101 @@ +{ + "info": { + "_postman_id": "2dd2d46e-cb0a-4fcd-a1a3-461930df0c38", + "name": "Student API Collection", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" + }, + "item": [ + { + "name": "http://localhost:8080/students/", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "", + "" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "disabledSystemHeaders": {} + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "image/*", + "type": "text", + "disabled": true + }, + { + "key": "Accept", + "value": "application/json", + "type": "text", + "disabled": true + } + ], + "url": { + "raw": "http://localhost:8080/students/", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8080", + "path": [ + "students", + "" + ] + } + }, + "response": [] + }, + { + "name": "http://localhost:8080/students/2", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "http://localhost:8080/students/3", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8080", + "path": [ + "students", + "3" + ] + } + }, + "response": [] + } + ], + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "exec": [ + "pm.request.headers.add({ ", + " key: \"Accept\",", + " value: \"application/json\" ", + "});", + "" + ] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + } + ] +} \ No newline at end of file From 728b3c91326111023d2047bcc0dfc8aa7c99a2cc Mon Sep 17 00:00:00 2001 From: ukhan1980 <82222767+ukhan1980@users.noreply.github.com> Date: Tue, 3 May 2022 20:47:17 +0100 Subject: [PATCH 139/278] [BAEL-3634] Code for Spark DataFrame article (#12039) * [BAEL-3634] Code for Spark DataFrame article * [BAEL-3634] Improve example data sample and sort aggregations * [BAEL-3634] change column name for clarity * [BAEL-3634] Update method name with U.S english standard Co-authored-by: uzma khan --- apache-spark/data/customerData.csv | 9 ++ apache-spark/data/customerData.json | 114 ++++++++++++++++ apache-spark/data/minCustomerData.json | 20 +++ apache-spark/docker/docker-compose.yaml | 33 +++++ apache-spark/docker/init.sql | 1 + apache-spark/pom.xml | 12 +- .../com/baeldung/dataframes/Customer.java | 52 +++++++ .../CustomerDataAggregationPipeline.java | 129 ++++++++++++++++++ .../CustomerToDataFrameConverterApp.java | 46 +++++++ .../dataframes/CustomerToRowMapper.java | 18 +++ .../DataFrameToCustomerConverterApp.java | 21 +++ .../DataSetToDataFrameConverterApp.java | 57 ++++++++ .../dataframes/RowToCustomerMapper.java | 19 +++ .../baeldung/dataframes/SchemaFactory.java | 31 +++++ .../com/baeldung/dataframes/SparkDriver.java | 16 +++ ...stomerDataAggregationPipelineLiveTest.java | 52 +++++++ ...stomerToDataFrameConverterAppUnitTest.java | 62 +++++++++ 17 files changed, 686 insertions(+), 6 deletions(-) create mode 100644 apache-spark/data/customerData.csv create mode 100644 apache-spark/data/customerData.json create mode 100644 apache-spark/data/minCustomerData.json create mode 100644 apache-spark/docker/docker-compose.yaml create mode 100755 apache-spark/docker/init.sql create mode 100644 apache-spark/src/main/java/com/baeldung/dataframes/Customer.java create mode 100644 apache-spark/src/main/java/com/baeldung/dataframes/CustomerDataAggregationPipeline.java create mode 100644 apache-spark/src/main/java/com/baeldung/dataframes/CustomerToDataFrameConverterApp.java create mode 100644 apache-spark/src/main/java/com/baeldung/dataframes/CustomerToRowMapper.java create mode 100644 apache-spark/src/main/java/com/baeldung/dataframes/DataFrameToCustomerConverterApp.java create mode 100644 apache-spark/src/main/java/com/baeldung/dataframes/DataSetToDataFrameConverterApp.java create mode 100644 apache-spark/src/main/java/com/baeldung/dataframes/RowToCustomerMapper.java create mode 100644 apache-spark/src/main/java/com/baeldung/dataframes/SchemaFactory.java create mode 100644 apache-spark/src/main/java/com/baeldung/dataframes/SparkDriver.java create mode 100644 apache-spark/src/test/java/com/baeldung/dataframes/CustomerDataAggregationPipelineLiveTest.java create mode 100644 apache-spark/src/test/java/com/baeldung/dataframes/CustomerToDataFrameConverterAppUnitTest.java diff --git a/apache-spark/data/customerData.csv b/apache-spark/data/customerData.csv new file mode 100644 index 0000000000..8661bcb352 --- /dev/null +++ b/apache-spark/data/customerData.csv @@ -0,0 +1,9 @@ +id,zoneId,FIRST_NAME,MIDDLE_NAME,LAST_NAME,CITY,gender,transaction_date,transaction_amount +1,EU11,Ana1,A,MN, London,Female,1/2/2018,5200 +2,EU12,Ana2,A,MN, London,Female,29/3/2018,1000 +3,EU13,Jack1,Josh,MN, London,Male,19/6/2018,9600 +4,EU14,Jack2,Josh,MN, London,Male,9/9/2018,1000 +5,EU15,Nick1,H,Dee,London,Male,9/6/2021,3000 +6,EU16,Nick2,H,Dee,London,Male,27/9/2021,500 +7,EU17,Nick3,H,Dee,London,Male,8/12/2021,500 +8,EU18,Sara1,H,Dee,London,Female,7/4/2021,2000 \ No newline at end of file diff --git a/apache-spark/data/customerData.json b/apache-spark/data/customerData.json new file mode 100644 index 0000000000..d713d75678 --- /dev/null +++ b/apache-spark/data/customerData.json @@ -0,0 +1,114 @@ +[ + { + "zoneId": "LONDON", + "customerId": 1, + "gender": "Female", + "name": "jane austin", + "contact": { + "street_Address": "XYZ Road", + "address2": "house 47", + "zipcode": "MK1110", + "county": "DCounty", + "phone_number": "(919) 403-0025", + "customer_city": "CityA" + }, + "transaction_date": "2021-02-05", + "transaction_amount": 15000 + }, + { + "zoneId": "LONDON", + "customerId": 2, + "gender": "Male", + "name": "Jack Trevor", + "contact": { + "street_Address": " kingfisher road", + "address2": "SUITE 110", + "zipcode": "HM1190", + "county": "CCounty", + "phone_number": "(919) 403-0025", + "customer_city": "CityB" + }, + "transaction_date": "2021-02-05", + "transaction_amount": 12000 + }, + { + "zoneId": "LONDON", + "customerId": 11, + "gender": "Female", + "name": "jane1 austin", + "contact": { + "street_Address": "B Road", + "address2": "house 47", + "zipcode": "MK1110", + "county": "BCounty", + "phone_number": "(919) 403-0025", + "customer_city": "CityA" + }, + "transaction_date": "2021-02-05", + "transaction_amount": 1000 + }, + { + "zoneId": "LONDON", + "customerId": 21, + "gender": "Male", + "name": "Jack1 Trevor", + "contact": { + "street_Address": " A road", + "address2": "SUITE 777", + "zipcode": "AZ890", + "county": "ACounty", + "phone_number": "(919) 403-0025", + "customer_city": "CityB" + }, + "transaction_date": "2021-02-05", + "transaction_amount": 1000 + }, + { + "zoneId": "Wales", + "customerId": 3, + "gender": "Male", + "name": "John Jack", + "contact": { + "street_Address": "sunny croft", + "address2": "SUITE 1", + "zipcode": "SN1030", + "county": "bucks", + "phone_number": "(919) 403-0025", + "customer_city": "Cardiff" + }, + "transaction_date": "2018-02-05", + "transaction_amount": 5000 + }, + { + "zoneId": "LONDON", + "customerId": 4, + "gender": "Male", + "name": "Jack Trevor", + "contact": { + "street_Address": " kingfisher road", + "address2": "SUITE 110", + "zipcode": "HM1190", + "county": "Hampshire", + "phone_number": "(919) 403-0025", + "customer_city": "CityB" + }, + "transaction_date": "2021-02-05", + "transaction_amount": 500 + }, + { + "zoneId": "Wales", + "customerId": 5, + "gender": "Male", + "name": "John Jack", + "contact": { + "street_Address": "sunny croft", + "address2": "SUITE 1", + "zipcode": "SN1030", + "county": "ECounty", + "phone_number": "(919) 403-0025", + "customer_city": "Cardiff" + }, + "transaction_date": "2018-01-25", + "transaction_amount": 500 + } +] diff --git a/apache-spark/data/minCustomerData.json b/apache-spark/data/minCustomerData.json new file mode 100644 index 0000000000..a47a739d51 --- /dev/null +++ b/apache-spark/data/minCustomerData.json @@ -0,0 +1,20 @@ +[ + { + "id": "1", + "gender": "Female", + "name": "Jo", + "transaction_amount": 200 + }, + { + "id":"2", + "gender": "Male", + "name": "Mike", + "transaction_amount": 500 + }, + { + "id": "3", + "gender": "Male", + "name": "Dave", + "transaction_amount": 5000 + } +] \ No newline at end of file diff --git a/apache-spark/docker/docker-compose.yaml b/apache-spark/docker/docker-compose.yaml new file mode 100644 index 0000000000..960e543229 --- /dev/null +++ b/apache-spark/docker/docker-compose.yaml @@ -0,0 +1,33 @@ +version: "3" + +services: + postgres: + image: postgres:12.3-alpine + restart: always + environment: + POSTGRES_PASSWORD: postgres + POSTGRES_USER: postgres + expose: + - 5432 + ports: + - 5432:5432 + command: -p 5432 + volumes: + - ./init.sql:/docker-entrypoint-initdb.d/init.sql +# - postgres:/var/lib/postgresql/data + + pgadmin: + image: dpage/pgadmin4:4.23 + environment: + PGADMIN_DEFAULT_EMAIL: admin@pgadmin.com + PGADMIN_DEFAULT_PASSWORD: password + PGADMIN_LISTEN_PORT: 80 + ports: + - 15432:80 + volumes: + - pgadmin:/var/lib/pgadmin + depends_on: + - postgres + +volumes: + pgadmin: \ No newline at end of file diff --git a/apache-spark/docker/init.sql b/apache-spark/docker/init.sql new file mode 100755 index 0000000000..371135faa3 --- /dev/null +++ b/apache-spark/docker/init.sql @@ -0,0 +1 @@ +CREATE DATABASE customerdb; \ No newline at end of file diff --git a/apache-spark/pom.xml b/apache-spark/pom.xml index 05c5088662..b86e99433a 100644 --- a/apache-spark/pom.xml +++ b/apache-spark/pom.xml @@ -20,37 +20,31 @@ org.apache.spark spark-core_2.11 ${org.apache.spark.spark-core.version} - provided
    org.apache.spark spark-sql_2.11 ${org.apache.spark.spark-sql.version} - provided org.apache.spark spark-graphx_2.11 ${org.apache.spark.spark-graphx.version} - provided graphframes graphframes ${graphframes.version} - provided org.apache.spark spark-streaming_2.11 ${org.apache.spark.spark-streaming.version} - provided org.apache.spark spark-mllib_2.11 ${org.apache.spark.spark-mllib.version} - provided org.apache.spark @@ -67,6 +61,11 @@ spark-cassandra-connector-java_2.11 ${com.datastax.spark.spark-cassandra-connector-java.version} + + org.postgresql + postgresql + ${postgres.version} +
    @@ -108,6 +107,7 @@ 2.4.8 2.5.2 1.6.0-M1 + 42.3.3 \ No newline at end of file diff --git a/apache-spark/src/main/java/com/baeldung/dataframes/Customer.java b/apache-spark/src/main/java/com/baeldung/dataframes/Customer.java new file mode 100644 index 0000000000..97fa160872 --- /dev/null +++ b/apache-spark/src/main/java/com/baeldung/dataframes/Customer.java @@ -0,0 +1,52 @@ +package com.baeldung.dataframes; + +public class Customer { + String id; + String name; + String gender; + int transaction_amount; + + public Customer() { + + } + + public Customer(String id, String name, String gender, int transaction_amount) { + this.id = id; + this.name = name; + this.gender = gender; + this.transaction_amount = transaction_amount; + } + + 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 getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public int getTransaction_amount() { + return transaction_amount; + } + + public void setTransaction_amount(int transaction_amount) { + this.transaction_amount = transaction_amount; + } + +} diff --git a/apache-spark/src/main/java/com/baeldung/dataframes/CustomerDataAggregationPipeline.java b/apache-spark/src/main/java/com/baeldung/dataframes/CustomerDataAggregationPipeline.java new file mode 100644 index 0000000000..869645624a --- /dev/null +++ b/apache-spark/src/main/java/com/baeldung/dataframes/CustomerDataAggregationPipeline.java @@ -0,0 +1,129 @@ +package com.baeldung.dataframes; + +import static org.apache.spark.sql.functions.col; +import static org.apache.spark.sql.functions.column; +import static org.apache.spark.sql.functions.concat; +import static org.apache.spark.sql.functions.lit; + +import java.util.Properties; + +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; +import org.apache.spark.sql.SaveMode; +import org.apache.spark.sql.SparkSession; +import org.apache.spark.sql.functions; + +public class CustomerDataAggregationPipeline { + private static final SparkSession SPARK_SESSION = SparkDriver.getSparkSession(); + + private final Properties dbProperties; + + public CustomerDataAggregationPipeline(Properties properties) { + dbProperties = properties; + } + + public static void main(String[] args) { + // replace with actual DB properties + Properties dbProps = new Properties(); + dbProps.setProperty("connectionURL", "jdbc:postgresql://localhost:5432/customerdb"); + dbProps.setProperty("driver", "org.postgresql.Driver"); + dbProps.setProperty("user", "postgres"); + dbProps.setProperty("password", "postgres"); + + new CustomerDataAggregationPipeline(dbProps).run(); + } + + public void run() { + Dataset ebayDFRaw = ingestCustomerDataFromEbay(); + Dataset ebayDf = normalizeCustomerDataFromEbay(ebayDFRaw); + + Dataset amazonDFRaw = ingestCustomerDataFromAmazon(); + Dataset amazonDf = normalizeCustomerDataFromAmazon(amazonDFRaw); + + Dataset combineDataframes = combineDataframes(ebayDf, amazonDf); + + Dataset rowDataset = aggregateYearlySalesByGender(combineDataframes); + + exportData(rowDataset); + } + + private static Dataset ingestCustomerDataFromAmazon() { + return SPARK_SESSION.read() + .format("csv") + .option("header", "true") + .schema(SchemaFactory.customerSchema()) + .option("dateFormat", "m/d/YYYY") + .load("data/customerData.csv"); + } + + private static Dataset ingestCustomerDataFromEbay() { + return SPARK_SESSION.read() + .format("org.apache.spark.sql.execution.datasources.json.JsonFileFormat") + .option("multiline", true) + .load("data/customerData.json"); + } + + private static Dataset combineDataframes(Dataset df1, Dataset df2) { + return df1.unionByName(df2); + } + + private static Dataset normalizeCustomerDataFromEbay(Dataset rawDataset) { + Dataset transformedDF = rawDataset.withColumn("id", concat(rawDataset.col("zoneId"), lit("-"), rawDataset.col("customerId"))) + .drop(column("customerId")) + .withColumn("source", lit("ebay")) + .withColumn("city", rawDataset.col("contact.customer_city")) + .drop(column("contact")) + .drop(column("zoneId")) + .withColumn("year", functions.year(col("transaction_date"))) + .drop("transaction_date") + .withColumn("firstName", functions.split(column("name"), " ") + .getItem(0)) + .withColumn("lastName", functions.split(column("name"), " ") + .getItem(1)) + .drop(column("name")); + + print(transformedDF); + return transformedDF; + } + + private static Dataset normalizeCustomerDataFromAmazon(Dataset rawDataset) { + + Dataset transformedDF = rawDataset.withColumn("id", concat(rawDataset.col("zoneId"), lit("-"), rawDataset.col("id"))) + .withColumn("source", lit("amazon")) + .withColumnRenamed("CITY", "city") + .withColumnRenamed("PHONE_NO", "contactNo") + .withColumnRenamed("POSTCODE", "postCode") + .withColumnRenamed("FIRST_NAME", "firstName") + .drop(column("MIDDLE_NAME")) + .drop(column("zoneId")) + .withColumnRenamed("LAST_NAME", "lastName") + .withColumn("year", functions.year(col("transaction_date"))) + .drop("transaction_date"); + + print(transformedDF); + return transformedDF; + } + + private static Dataset aggregateYearlySalesByGender(Dataset dataset) { + + Dataset aggDF = dataset.groupBy(column("year"), column("source"), column("gender")) + .sum("transaction_amount") + .withColumnRenamed("sum(transaction_amount)", "annual_spending") + .orderBy(col("year").asc(), col("annual_spending").desc()); + + print(aggDF); + return aggDF; + } + + private static void print(Dataset aggDs) { + aggDs.show(); + aggDs.printSchema(); + } + + private void exportData(Dataset dataset) { + String connectionURL = dbProperties.getProperty("connectionURL"); + dataset.write() + .mode(SaveMode.Overwrite) + .jdbc(connectionURL, "customer", dbProperties); + } +} diff --git a/apache-spark/src/main/java/com/baeldung/dataframes/CustomerToDataFrameConverterApp.java b/apache-spark/src/main/java/com/baeldung/dataframes/CustomerToDataFrameConverterApp.java new file mode 100644 index 0000000000..53799c1079 --- /dev/null +++ b/apache-spark/src/main/java/com/baeldung/dataframes/CustomerToDataFrameConverterApp.java @@ -0,0 +1,46 @@ +package com.baeldung.dataframes; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; + +public class CustomerToDataFrameConverterApp { + + private static final List CUSTOMERS = Arrays.asList( + aCustomerWith("01", "jo", "Female", 2000), + aCustomerWith("02", "jack", "Male", 1200) + ); + + public static void main(String[] args) { + Dataset dataFrame = convertAfterMappingRows(CUSTOMERS); + print(dataFrame); + Dataset customerDF = convertToDataFrameWithNoChange(); + print(customerDF); + } + + public static Dataset convertToDataFrameWithNoChange() { + return SparkDriver.getSparkSession().createDataFrame(CUSTOMERS, Customer.class); + } + + public static Dataset convertAfterMappingRows(List customer) { + List rows = customer.stream() + .map(c -> new CustomerToRowMapper().call(c)) + .collect(Collectors.toList()); + + return SparkDriver.getSparkSession() + .createDataFrame(rows, SchemaFactory.minimumCustomerDataSchema()); + } + + private static Customer aCustomerWith(String id, String name, String gender, int amount) { + return new Customer(id, name, gender, amount); + } + + private static void print(Dataset dataFrame) { + dataFrame.printSchema(); + dataFrame.show(); + } + +} diff --git a/apache-spark/src/main/java/com/baeldung/dataframes/CustomerToRowMapper.java b/apache-spark/src/main/java/com/baeldung/dataframes/CustomerToRowMapper.java new file mode 100644 index 0000000000..e54bceb3ad --- /dev/null +++ b/apache-spark/src/main/java/com/baeldung/dataframes/CustomerToRowMapper.java @@ -0,0 +1,18 @@ +package com.baeldung.dataframes; + +import org.apache.commons.lang3.StringUtils; +import org.apache.spark.api.java.function.MapFunction; +import org.apache.spark.sql.Row; +import org.apache.spark.sql.RowFactory; + +public class CustomerToRowMapper implements MapFunction { + + @Override + public Row call(Customer customer) { + Row row = RowFactory.create( + customer.getId(), customer.getName().toUpperCase(), + StringUtils.substring(customer.getGender(),0, 1), + customer.getTransaction_amount()); + return row; + } +} \ No newline at end of file diff --git a/apache-spark/src/main/java/com/baeldung/dataframes/DataFrameToCustomerConverterApp.java b/apache-spark/src/main/java/com/baeldung/dataframes/DataFrameToCustomerConverterApp.java new file mode 100644 index 0000000000..31ad8de12b --- /dev/null +++ b/apache-spark/src/main/java/com/baeldung/dataframes/DataFrameToCustomerConverterApp.java @@ -0,0 +1,21 @@ +package com.baeldung.dataframes; + +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Encoders; +import org.apache.spark.sql.Row; + +public class DataFrameToCustomerConverterApp { + + public static void main(String[] args) { + Dataset df = SparkDriver.getSparkSession() + .read() + .format("org.apache.spark.sql.execution.datasources.json.JsonFileFormat") + .option("multiline", true) + .load("data/minCustomerData.json"); + df.show(); + df.printSchema(); + Dataset customerDS = df.map(new RowToCustomerMapper(), Encoders.bean(Customer. class)); + customerDS.show(); + customerDS.printSchema(); + } +} diff --git a/apache-spark/src/main/java/com/baeldung/dataframes/DataSetToDataFrameConverterApp.java b/apache-spark/src/main/java/com/baeldung/dataframes/DataSetToDataFrameConverterApp.java new file mode 100644 index 0000000000..23db18dddf --- /dev/null +++ b/apache-spark/src/main/java/com/baeldung/dataframes/DataSetToDataFrameConverterApp.java @@ -0,0 +1,57 @@ +package com.baeldung.dataframes; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Encoders; +import org.apache.spark.sql.Row; +import org.apache.spark.sql.SparkSession; + +public class DataSetToDataFrameConverterApp { + + private static final SparkSession SPARK_SESSION = SparkDriver.getSparkSession(); + + public static void main(String[] args) { + + Dataset customerDataset = convertToDataSetFromPOJO(); + Dataset customerDataFrame = customerDataset.toDF(); + print(customerDataFrame); + + List names = getNames(); + Dataset namesDataset = convertToDataSetFromStrings(names); + Dataset namesDataFrame = namesDataset.toDF(); + print(namesDataFrame); + } + + private static Dataset convertToDataSetFromStrings(List names) { + return SPARK_SESSION.createDataset(names, Encoders.STRING()); + } + + private static Dataset convertToDataSetFromPOJO() { + return SPARK_SESSION.createDataset(CUSTOMERS, Encoders.bean(Customer.class)); + } + + private static final List CUSTOMERS = Arrays.asList( + aCustomerWith("01", "jo", "Female", 2000), + aCustomerWith("02", "jack", "Female", 1200), + aCustomerWith("03", "ash", "male", 2000), + aCustomerWith("04", "emma", "Female", 2000) + ); + + private static List getNames() { + return CUSTOMERS.stream() + .map(Customer::getName) + .collect(Collectors.toList()); + } + + private static void print(Dataset df) { + df.show(); + df.printSchema(); + } + + private static Customer aCustomerWith(String id, String name, String gender, int amount) { + return new Customer(id, name, gender, amount); + } +} diff --git a/apache-spark/src/main/java/com/baeldung/dataframes/RowToCustomerMapper.java b/apache-spark/src/main/java/com/baeldung/dataframes/RowToCustomerMapper.java new file mode 100644 index 0000000000..02fde539c8 --- /dev/null +++ b/apache-spark/src/main/java/com/baeldung/dataframes/RowToCustomerMapper.java @@ -0,0 +1,19 @@ +package com.baeldung.dataframes; + +import org.apache.spark.api.java.function.MapFunction; +import org.apache.spark.sql.Row; + +class RowToCustomerMapper implements MapFunction { + + @Override + public Customer call(Row row) { + + Customer customer = new Customer(); + customer.setId(row.getAs("id")); + customer.setName(row.getAs("name")); + customer.setGender(row.getAs("gender")); + customer.setTransaction_amount(Math.toIntExact(row.getAs("transaction_amount"))); + + return customer; + } +} diff --git a/apache-spark/src/main/java/com/baeldung/dataframes/SchemaFactory.java b/apache-spark/src/main/java/com/baeldung/dataframes/SchemaFactory.java new file mode 100644 index 0000000000..6c298e4829 --- /dev/null +++ b/apache-spark/src/main/java/com/baeldung/dataframes/SchemaFactory.java @@ -0,0 +1,31 @@ +package com.baeldung.dataframes; + +import org.apache.spark.sql.types.DataTypes; +import org.apache.spark.sql.types.StructField; +import org.apache.spark.sql.types.StructType; + +public class SchemaFactory { + + public static StructType customerSchema() { + return DataTypes.createStructType( + new StructField[] { DataTypes.createStructField("id", DataTypes.IntegerType, false), + DataTypes.createStructField("zoneId", DataTypes.StringType, false), + DataTypes.createStructField("FIRST_NAME", DataTypes.StringType, false), + DataTypes.createStructField("MIDDLE_NAME", DataTypes.StringType, false), + DataTypes.createStructField("LAST_NAME", DataTypes.StringType, false), + DataTypes.createStructField("CITY", DataTypes.StringType, false), + DataTypes.createStructField("gender", DataTypes.StringType, false), + DataTypes.createStructField("transaction_date", DataTypes.DateType, false), + DataTypes.createStructField("transaction_amount", DataTypes.IntegerType, false) + }); + } + + public static StructType minimumCustomerDataSchema() { + return DataTypes.createStructType(new StructField[] { + DataTypes.createStructField("id", DataTypes.StringType, true), + DataTypes.createStructField("name", DataTypes.StringType, true), + DataTypes.createStructField("gender", DataTypes.StringType, true), + DataTypes.createStructField("transaction_amount", DataTypes.IntegerType, true) + }); + } +} diff --git a/apache-spark/src/main/java/com/baeldung/dataframes/SparkDriver.java b/apache-spark/src/main/java/com/baeldung/dataframes/SparkDriver.java new file mode 100644 index 0000000000..adc25170a7 --- /dev/null +++ b/apache-spark/src/main/java/com/baeldung/dataframes/SparkDriver.java @@ -0,0 +1,16 @@ +package com.baeldung.dataframes; + +import java.io.Serializable; + +import org.apache.spark.sql.SparkSession; + +public class SparkDriver implements Serializable { + + public static SparkSession getSparkSession() { + return SparkSession.builder() + .appName("Customer Aggregation pipeline") + .master("local") + .getOrCreate(); + + } +} diff --git a/apache-spark/src/test/java/com/baeldung/dataframes/CustomerDataAggregationPipelineLiveTest.java b/apache-spark/src/test/java/com/baeldung/dataframes/CustomerDataAggregationPipelineLiveTest.java new file mode 100644 index 0000000000..52a7b1451f --- /dev/null +++ b/apache-spark/src/test/java/com/baeldung/dataframes/CustomerDataAggregationPipelineLiveTest.java @@ -0,0 +1,52 @@ +package com.baeldung.dataframes; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.Properties; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +class CustomerDataAggregationPipelineLiveTest { + + private static Connection conn; + + @BeforeAll + static void beforeAll() throws SQLException { + DriverManager.registerDriver(new org.postgresql.Driver()); + String dbURL1 = "jdbc:postgresql://localhost:5432/customerdb"; + conn = DriverManager.getConnection(dbURL1, "postgres", "postgres"); + + String sql = "drop table if exists customer"; + + PreparedStatement statement = conn.prepareStatement(sql); + statement.executeUpdate(); + } + + @Test + void givenCSVAndJSON_whenRun_thenStoresAggregatedDataFrameInDB() throws Exception { + Properties dbProps = new Properties(); + dbProps.setProperty("connectionURL", "jdbc:postgresql://localhost:5432/customerdb"); + dbProps.setProperty("driver", "org.postgresql.Driver"); + dbProps.setProperty("user", "postgres"); + dbProps.setProperty("password", "postgres"); + + CustomerDataAggregationPipeline pipeline = new CustomerDataAggregationPipeline(dbProps); + pipeline.run(); + + String allCustomersSql = "Select count(*) from customer"; + + Statement statement = conn.createStatement(); + ResultSet resultSet = statement.executeQuery(allCustomersSql); + resultSet.next(); + int count = resultSet.getInt(1); + assertEquals(7, count); + } + +} diff --git a/apache-spark/src/test/java/com/baeldung/dataframes/CustomerToDataFrameConverterAppUnitTest.java b/apache-spark/src/test/java/com/baeldung/dataframes/CustomerToDataFrameConverterAppUnitTest.java new file mode 100644 index 0000000000..06c8f66bcd --- /dev/null +++ b/apache-spark/src/test/java/com/baeldung/dataframes/CustomerToDataFrameConverterAppUnitTest.java @@ -0,0 +1,62 @@ +package com.baeldung.dataframes; + +import static com.baeldung.dataframes.CustomerToDataFrameConverterApp.convertAfterMappingRows; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Arrays; +import java.util.List; + +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; +import org.junit.jupiter.api.Test; + +class CustomerToDataFrameConverterAppUnitTest { + + @Test + void givenCustomers_whenConvertAfterMappingRows_thenConvertsToDataSet() { + + List customers = Arrays.asList( + new Customer("01", "jo", "Female", 2000), + new Customer("02", "jack", "Male", 1200) + ); + + Dataset customerDF = convertAfterMappingRows(customers); + List rows = customerDF.collectAsList(); + Row row1 = rows.get(0); + Row row2 = rows.get(1); + + assertEquals("01", row1.get(0)); + assertEquals( "JO", row1.get(1)); + assertEquals( "F", row1.get(2)); + assertEquals( 2000, row1.get(3)); + + assertEquals("02", row2.get(0)); + assertEquals( "JACK", row2.get(1)); + assertEquals( "M", row2.get(2)); + assertEquals( 1200, row2.get(3)); + } + + @Test + void givenCustomers_whenConvertWithNoChange_thenConvertsToDataSet() { + + List customers = Arrays.asList( + new Customer("01", "jo", "Female", 2000), + new Customer("02", "jack", "Male", 1200) + ); + + Dataset customerDF = CustomerToDataFrameConverterApp.convertToDataFrameWithNoChange(); + List rows = customerDF.collectAsList(); + Row row1 = rows.get(0); + Row row2 = rows.get(1); + + assertEquals("01", row1.getAs("id")); + assertEquals( "jo", row1.getAs("name")); + assertEquals( "Female", row1.getAs("gender")); + assertEquals( 2000, (int)row1.getAs("transaction_amount")); + + assertEquals("02", row2.getAs("id")); + assertEquals( "jack", row2.getAs("name")); + assertEquals( "Male", row2.getAs("gender")); + assertEquals( 1200, (int)row2.getAs("transaction_amount")); + } +} From b5e698d26a8a32822820bd133d3dd96f38e84c65 Mon Sep 17 00:00:00 2001 From: Amitabh Tiwari Date: Wed, 4 May 2022 07:16:31 +0530 Subject: [PATCH 140/278] Update EmployeeClient.java --- .../baeldung/cloud/openfeign/client/EmployeeClient.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/client/EmployeeClient.java b/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/client/EmployeeClient.java index 67ff8b4f9a..569401bdcf 100644 --- a/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/client/EmployeeClient.java +++ b/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/client/EmployeeClient.java @@ -6,8 +6,7 @@ import feign.Param; import feign.RequestLine; public interface EmployeeClient { - - @RequestLine("GET /empployee/{id}?active={isActive}") - @Headers("Content-Type: application/json") - Employee getEmployee(@Param long id, @Param boolean isActive); + @RequestLine("GET /empployee/{id}?active={isActive}") + @Headers("Content-Type: application/json") + Employee getEmployee(@Param long id, @Param boolean isActive); } \ No newline at end of file From 8a8408e91a597d00b6d2c5a606d8c7edbce11f38 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Wed, 4 May 2022 09:28:41 +0200 Subject: [PATCH 141/278] Disable failing modules --- persistence-modules/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 132a8b6b20..2e7dafb472 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -20,7 +20,7 @@ apache-derby core-java-persistence core-java-persistence-2 - deltaspike + elasticsearch flyway flyway-repair @@ -69,7 +69,7 @@ spring-data-dynamodb spring-data-eclipselink spring-data-elasticsearch - spring-data-gemfire + spring-data-geode spring-data-jpa-annotations spring-data-jpa-crud From 6805cd573edb357c52155de190ef0ee2d0788909 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Wed, 4 May 2022 12:30:35 +0200 Subject: [PATCH 142/278] JAVA-11853: Fix jandex dependency issue --- persistence-modules/deltaspike/pom.xml | 9 +-------- persistence-modules/pom.xml | 2 +- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/persistence-modules/deltaspike/pom.xml b/persistence-modules/deltaspike/pom.xml index f151255948..0142e746a1 100644 --- a/persistence-modules/deltaspike/pom.xml +++ b/persistence-modules/deltaspike/pom.xml @@ -278,13 +278,6 @@ - - - redhat-repository-techpreview - https://maven.repository.redhat.com/techpreview/all/ - - - 3.7.4 1.8.2 @@ -296,7 +289,7 @@ 2.6 1.1.3 - 1.2.5.Final-redhat-1 + 1.2.4.Final \ No newline at end of file diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 2e7dafb472..3f4e906348 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -20,7 +20,7 @@ apache-derby core-java-persistence core-java-persistence-2 - + deltaspike elasticsearch flyway flyway-repair From 9990d103cd5c286f89d77e9c6c4725288cb9dbb4 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Wed, 4 May 2022 20:15:22 +0530 Subject: [PATCH 143/278] JAVA-11533 Move core-java related modules to core-java-modules (#12119) * JAVA-11533 Move core-java related modules to core-java-modules * JAVA-11533 Remove moved modules from old parent pom * JAVA-11533 Updated Readme and pom of parent module * JAVA-11533 Revert changes made to Readme of parent module * JAVA-11533 Moved articles to respective submouldes --- core-java-modules/README.md | 4 ++-- core-java-modules/core-java-exceptions/README.md | 1 + .../java-collections-conversions-2}/README.md | 0 .../java-collections-conversions-2}/pom.xml | 5 ++--- .../com/baeldung/convertlisttomap/ListToMapConverter.java | 0 .../src/main/java/com/baeldung/modelmapper/MapperUtil.java | 0 .../src/main/java/com/baeldung/modelmapper/User.java | 0 .../src/main/java/com/baeldung/modelmapper/UserDTO.java | 0 .../src/main/java/com/baeldung/modelmapper/UserList.java | 0 .../src/main/java/com/baeldung/modelmapper/UserListDTO.java | 0 .../java/com/baeldung/modelmapper/UsersListConverter.java | 0 .../arrayconversion/ArrayToListConversionUnitTest.java | 0 .../convertarraytostring/ArrayToStringUnitTest.java | 0 .../com/baeldung/convertlisttomap/ListToMapUnitTest.java | 0 .../com/baeldung/modelmapper/UsersListMappingUnitTest.java | 0 .../test/java/com/baeldung/setiteration/SetIteration.java | 0 .../java-collections-conversions}/README.md | 0 .../java-collections-conversions}/pom.xml | 5 ++--- .../src/main/java/com/baeldung/convertToMap/Book.java | 0 .../main/java/com/baeldung/convertToMap/ConvertToMap.java | 0 .../java/com/baeldung/convertcollectiontoarraylist/Foo.java | 0 .../src/main/java/com/baeldung/convertlisttomap/Animal.java | 0 .../baeldung/convertlisttomap/ConvertListToMapService.java | 0 .../src/main/resources/logback.xml | 0 .../com/baeldung/convertToMap/ConvertToMapUnitTest.java | 0 .../CollectionToArrayListUnitTest.java | 0 .../ConvertIteratorToListServiceUnitTest.java | 0 .../convertlisttomap/ConvertListToMapServiceUnitTest.java | 0 .../ConvertListWithDuplicatedIdToMapServiceUnitTest.java | 0 .../java/collections/IterableToCollectionUnitTest.java | 0 .../java/collections/JavaCollectionConversionUnitTest.java | 0 .../java/com/baeldung/java/lists/ListToStringUnitTest.java | 0 .../java-collections-maps-3}/README.md | 0 .../java-collections-maps-3}/pom.xml | 5 ++--- .../src/main/java/com/baeldung/map/bytearrays/BytesKey.java | 0 .../src/main/java/com/baeldung/map/entry/Book.java | 0 .../com/baeldung/map/entry/MapEntryEfficiencyExample.java | 0 .../java/com/baeldung/map/entry/MapEntryTupleExample.java | 0 .../src/main/java/com/baeldung/map/hashing/Member.java | 0 .../java/com/baeldung/map/hashing/MemberWithBadHashing.java | 0 .../com/baeldung/map/hashing/MemberWithGuavaHashing.java | 0 .../main/java/com/baeldung/map/hashing/MemberWithId.java | 0 .../java/com/baeldung/map/hashing/MemberWithIdAndName.java | 0 .../java/com/baeldung/map/hashing/MemberWithObjects.java | 0 .../baeldung/map/identity/IdentityHashMapDemonstrator.java | 0 .../java/com/baeldung/map/invert/InvertHashMapExample.java | 0 .../com/baeldung/map/bytearrays/ByteArrayKeyUnitTest.java | 0 .../map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java | 0 .../test/java/com/baeldung/map/entry/MapEntryUnitTest.java | 0 .../com/baeldung/map/hashing/HashMapUpdateUnitTest.java | 0 .../test/java/com/baeldung/map/hashing/HashingUnitTest.java | 0 .../map/identity/IdentityHashMapDemonstratorUnitTest.java | 0 .../java/com/baeldung/map/invert/InvertHashMapUnitTest.java | 0 .../map/keysetValuesEntrySet/EntrySetExampleUnitTest.java | 0 .../map/keysetValuesEntrySet/KeySetExampleUnitTest.java | 0 .../map/keysetValuesEntrySet/ValuesExampleUnitTest.java | 0 core-java-modules/pom.xml | 3 +++ pom.xml | 6 ------ 58 files changed, 12 insertions(+), 17 deletions(-) rename {java-collections-conversions-2 => core-java-modules/java-collections-conversions-2}/README.md (100%) rename {java-collections-conversions-2 => core-java-modules/java-collections-conversions-2}/pom.xml (91%) rename {java-collections-conversions-2 => core-java-modules/java-collections-conversions-2}/src/main/java/com/baeldung/convertlisttomap/ListToMapConverter.java (100%) rename {java-collections-conversions-2 => core-java-modules/java-collections-conversions-2}/src/main/java/com/baeldung/modelmapper/MapperUtil.java (100%) rename {java-collections-conversions-2 => core-java-modules/java-collections-conversions-2}/src/main/java/com/baeldung/modelmapper/User.java (100%) rename {java-collections-conversions-2 => core-java-modules/java-collections-conversions-2}/src/main/java/com/baeldung/modelmapper/UserDTO.java (100%) rename {java-collections-conversions-2 => core-java-modules/java-collections-conversions-2}/src/main/java/com/baeldung/modelmapper/UserList.java (100%) rename {java-collections-conversions-2 => core-java-modules/java-collections-conversions-2}/src/main/java/com/baeldung/modelmapper/UserListDTO.java (100%) rename {java-collections-conversions-2 => core-java-modules/java-collections-conversions-2}/src/main/java/com/baeldung/modelmapper/UsersListConverter.java (100%) rename {java-collections-conversions-2 => core-java-modules/java-collections-conversions-2}/src/test/java/com/baeldung/arrayconversion/ArrayToListConversionUnitTest.java (100%) rename {java-collections-conversions-2 => core-java-modules/java-collections-conversions-2}/src/test/java/com/baeldung/convertarraytostring/ArrayToStringUnitTest.java (100%) rename {java-collections-conversions-2 => core-java-modules/java-collections-conversions-2}/src/test/java/com/baeldung/convertlisttomap/ListToMapUnitTest.java (100%) rename {java-collections-conversions-2 => core-java-modules/java-collections-conversions-2}/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java (100%) rename {java-collections-conversions-2 => core-java-modules/java-collections-conversions-2}/src/test/java/com/baeldung/setiteration/SetIteration.java (100%) rename {java-collections-conversions => core-java-modules/java-collections-conversions}/README.md (100%) rename {java-collections-conversions => core-java-modules/java-collections-conversions}/pom.xml (90%) rename {java-collections-conversions => core-java-modules/java-collections-conversions}/src/main/java/com/baeldung/convertToMap/Book.java (100%) rename {java-collections-conversions => core-java-modules/java-collections-conversions}/src/main/java/com/baeldung/convertToMap/ConvertToMap.java (100%) rename {java-collections-conversions => core-java-modules/java-collections-conversions}/src/main/java/com/baeldung/convertcollectiontoarraylist/Foo.java (100%) rename {java-collections-conversions => core-java-modules/java-collections-conversions}/src/main/java/com/baeldung/convertlisttomap/Animal.java (100%) rename {java-collections-conversions => core-java-modules/java-collections-conversions}/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java (100%) rename {java-collections-conversions => core-java-modules/java-collections-conversions}/src/main/resources/logback.xml (100%) rename {java-collections-conversions => core-java-modules/java-collections-conversions}/src/test/java/com/baeldung/convertToMap/ConvertToMapUnitTest.java (100%) rename {java-collections-conversions => core-java-modules/java-collections-conversions}/src/test/java/com/baeldung/convertcollectiontoarraylist/CollectionToArrayListUnitTest.java (100%) rename {java-collections-conversions => core-java-modules/java-collections-conversions}/src/test/java/com/baeldung/convertiteratortolist/ConvertIteratorToListServiceUnitTest.java (100%) rename {java-collections-conversions => core-java-modules/java-collections-conversions}/src/test/java/com/baeldung/convertlisttomap/ConvertListToMapServiceUnitTest.java (100%) rename {java-collections-conversions => core-java-modules/java-collections-conversions}/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDuplicatedIdToMapServiceUnitTest.java (100%) rename {java-collections-conversions => core-java-modules/java-collections-conversions}/src/test/java/com/baeldung/java/collections/IterableToCollectionUnitTest.java (100%) rename {java-collections-conversions => core-java-modules/java-collections-conversions}/src/test/java/com/baeldung/java/collections/JavaCollectionConversionUnitTest.java (100%) rename {java-collections-conversions => core-java-modules/java-collections-conversions}/src/test/java/com/baeldung/java/lists/ListToStringUnitTest.java (100%) rename {java-collections-maps-3 => core-java-modules/java-collections-maps-3}/README.md (100%) rename {java-collections-maps-3 => core-java-modules/java-collections-maps-3}/pom.xml (90%) rename {java-collections-maps-3 => core-java-modules/java-collections-maps-3}/src/main/java/com/baeldung/map/bytearrays/BytesKey.java (100%) rename {java-collections-maps-3 => core-java-modules/java-collections-maps-3}/src/main/java/com/baeldung/map/entry/Book.java (100%) rename {java-collections-maps-3 => core-java-modules/java-collections-maps-3}/src/main/java/com/baeldung/map/entry/MapEntryEfficiencyExample.java (100%) rename {java-collections-maps-3 => core-java-modules/java-collections-maps-3}/src/main/java/com/baeldung/map/entry/MapEntryTupleExample.java (100%) rename {java-collections-maps-3 => core-java-modules/java-collections-maps-3}/src/main/java/com/baeldung/map/hashing/Member.java (100%) rename {java-collections-maps-3 => core-java-modules/java-collections-maps-3}/src/main/java/com/baeldung/map/hashing/MemberWithBadHashing.java (100%) rename {java-collections-maps-3 => core-java-modules/java-collections-maps-3}/src/main/java/com/baeldung/map/hashing/MemberWithGuavaHashing.java (100%) rename {java-collections-maps-3 => core-java-modules/java-collections-maps-3}/src/main/java/com/baeldung/map/hashing/MemberWithId.java (100%) rename {java-collections-maps-3 => core-java-modules/java-collections-maps-3}/src/main/java/com/baeldung/map/hashing/MemberWithIdAndName.java (100%) rename {java-collections-maps-3 => core-java-modules/java-collections-maps-3}/src/main/java/com/baeldung/map/hashing/MemberWithObjects.java (100%) rename {java-collections-maps-3 => core-java-modules/java-collections-maps-3}/src/main/java/com/baeldung/map/identity/IdentityHashMapDemonstrator.java (100%) rename {java-collections-maps-3 => core-java-modules/java-collections-maps-3}/src/main/java/com/baeldung/map/invert/InvertHashMapExample.java (100%) rename {java-collections-maps-3 => core-java-modules/java-collections-maps-3}/src/test/java/com/baeldung/map/bytearrays/ByteArrayKeyUnitTest.java (100%) rename {java-collections-maps-3 => core-java-modules/java-collections-maps-3}/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java (100%) rename {java-collections-maps-3 => core-java-modules/java-collections-maps-3}/src/test/java/com/baeldung/map/entry/MapEntryUnitTest.java (100%) rename {java-collections-maps-3 => core-java-modules/java-collections-maps-3}/src/test/java/com/baeldung/map/hashing/HashMapUpdateUnitTest.java (100%) rename {java-collections-maps-3 => core-java-modules/java-collections-maps-3}/src/test/java/com/baeldung/map/hashing/HashingUnitTest.java (100%) rename {java-collections-maps-3 => core-java-modules/java-collections-maps-3}/src/test/java/com/baeldung/map/identity/IdentityHashMapDemonstratorUnitTest.java (100%) rename {java-collections-maps-3 => core-java-modules/java-collections-maps-3}/src/test/java/com/baeldung/map/invert/InvertHashMapUnitTest.java (100%) rename {java-collections-maps-3 => core-java-modules/java-collections-maps-3}/src/test/java/com/baeldung/map/keysetValuesEntrySet/EntrySetExampleUnitTest.java (100%) rename {java-collections-maps-3 => core-java-modules/java-collections-maps-3}/src/test/java/com/baeldung/map/keysetValuesEntrySet/KeySetExampleUnitTest.java (100%) rename {java-collections-maps-3 => core-java-modules/java-collections-maps-3}/src/test/java/com/baeldung/map/keysetValuesEntrySet/ValuesExampleUnitTest.java (100%) diff --git a/core-java-modules/README.md b/core-java-modules/README.md index fa77846b45..d07dff8751 100644 --- a/core-java-modules/README.md +++ b/core-java-modules/README.md @@ -4,6 +4,6 @@ This module contains modules about core Java ## Relevant articles: -- [Multi-Module Maven Application with Java Modules](https://www.baeldung.com/maven-multi-module-project-java-jpms) - [Understanding the NumberFormatException in Java](https://www.baeldung.com/java-number-format-exception) -- [Will an Error Be Caught by Catch Block in Java?](https://www.baeldung.com/java-error-catch) + + diff --git a/core-java-modules/core-java-exceptions/README.md b/core-java-modules/core-java-exceptions/README.md index 5f47aa69fb..b74ede51e8 100644 --- a/core-java-modules/core-java-exceptions/README.md +++ b/core-java-modules/core-java-exceptions/README.md @@ -13,4 +13,5 @@ This module contains articles about core java exceptions - [The StackOverflowError in Java](https://www.baeldung.com/java-stack-overflow-error) - [Checked and Unchecked Exceptions in Java](https://www.baeldung.com/java-checked-unchecked-exceptions) - [Common Java Exceptions](https://www.baeldung.com/java-common-exceptions) +- [Will an Error Be Caught by Catch Block in Java?](https://www.baeldung.com/java-error-catch) - [[Next -->]](/core-java-modules/core-java-exceptions-2) \ No newline at end of file diff --git a/java-collections-conversions-2/README.md b/core-java-modules/java-collections-conversions-2/README.md similarity index 100% rename from java-collections-conversions-2/README.md rename to core-java-modules/java-collections-conversions-2/README.md diff --git a/java-collections-conversions-2/pom.xml b/core-java-modules/java-collections-conversions-2/pom.xml similarity index 91% rename from java-collections-conversions-2/pom.xml rename to core-java-modules/java-collections-conversions-2/pom.xml index 9f8ef7addc..0f8e80fdbf 100644 --- a/java-collections-conversions-2/pom.xml +++ b/core-java-modules/java-collections-conversions-2/pom.xml @@ -9,10 +9,9 @@ jar - com.baeldung - parent-java + com.baeldung.core-java-modules + core-java-modules 0.0.1-SNAPSHOT - ../parent-java diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/convertlisttomap/ListToMapConverter.java b/core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/convertlisttomap/ListToMapConverter.java similarity index 100% rename from java-collections-conversions-2/src/main/java/com/baeldung/convertlisttomap/ListToMapConverter.java rename to core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/convertlisttomap/ListToMapConverter.java diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java b/core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java similarity index 100% rename from java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java rename to core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java b/core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java similarity index 100% rename from java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java rename to core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java b/core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java similarity index 100% rename from java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java rename to core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java b/core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java similarity index 100% rename from java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java rename to core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserListDTO.java b/core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserListDTO.java similarity index 100% rename from java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserListDTO.java rename to core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserListDTO.java diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UsersListConverter.java b/core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UsersListConverter.java similarity index 100% rename from java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UsersListConverter.java rename to core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UsersListConverter.java diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/arrayconversion/ArrayToListConversionUnitTest.java b/core-java-modules/java-collections-conversions-2/src/test/java/com/baeldung/arrayconversion/ArrayToListConversionUnitTest.java similarity index 100% rename from java-collections-conversions-2/src/test/java/com/baeldung/arrayconversion/ArrayToListConversionUnitTest.java rename to core-java-modules/java-collections-conversions-2/src/test/java/com/baeldung/arrayconversion/ArrayToListConversionUnitTest.java diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/convertarraytostring/ArrayToStringUnitTest.java b/core-java-modules/java-collections-conversions-2/src/test/java/com/baeldung/convertarraytostring/ArrayToStringUnitTest.java similarity index 100% rename from java-collections-conversions-2/src/test/java/com/baeldung/convertarraytostring/ArrayToStringUnitTest.java rename to core-java-modules/java-collections-conversions-2/src/test/java/com/baeldung/convertarraytostring/ArrayToStringUnitTest.java diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/convertlisttomap/ListToMapUnitTest.java b/core-java-modules/java-collections-conversions-2/src/test/java/com/baeldung/convertlisttomap/ListToMapUnitTest.java similarity index 100% rename from java-collections-conversions-2/src/test/java/com/baeldung/convertlisttomap/ListToMapUnitTest.java rename to core-java-modules/java-collections-conversions-2/src/test/java/com/baeldung/convertlisttomap/ListToMapUnitTest.java diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java b/core-java-modules/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java similarity index 100% rename from java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java rename to core-java-modules/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/setiteration/SetIteration.java b/core-java-modules/java-collections-conversions-2/src/test/java/com/baeldung/setiteration/SetIteration.java similarity index 100% rename from java-collections-conversions-2/src/test/java/com/baeldung/setiteration/SetIteration.java rename to core-java-modules/java-collections-conversions-2/src/test/java/com/baeldung/setiteration/SetIteration.java diff --git a/java-collections-conversions/README.md b/core-java-modules/java-collections-conversions/README.md similarity index 100% rename from java-collections-conversions/README.md rename to core-java-modules/java-collections-conversions/README.md diff --git a/java-collections-conversions/pom.xml b/core-java-modules/java-collections-conversions/pom.xml similarity index 90% rename from java-collections-conversions/pom.xml rename to core-java-modules/java-collections-conversions/pom.xml index 7f5ba38e3e..2751e0100a 100644 --- a/java-collections-conversions/pom.xml +++ b/core-java-modules/java-collections-conversions/pom.xml @@ -9,10 +9,9 @@ jar - com.baeldung - parent-java + com.baeldung.core-java-modules + core-java-modules 0.0.1-SNAPSHOT - ../parent-java diff --git a/java-collections-conversions/src/main/java/com/baeldung/convertToMap/Book.java b/core-java-modules/java-collections-conversions/src/main/java/com/baeldung/convertToMap/Book.java similarity index 100% rename from java-collections-conversions/src/main/java/com/baeldung/convertToMap/Book.java rename to core-java-modules/java-collections-conversions/src/main/java/com/baeldung/convertToMap/Book.java diff --git a/java-collections-conversions/src/main/java/com/baeldung/convertToMap/ConvertToMap.java b/core-java-modules/java-collections-conversions/src/main/java/com/baeldung/convertToMap/ConvertToMap.java similarity index 100% rename from java-collections-conversions/src/main/java/com/baeldung/convertToMap/ConvertToMap.java rename to core-java-modules/java-collections-conversions/src/main/java/com/baeldung/convertToMap/ConvertToMap.java diff --git a/java-collections-conversions/src/main/java/com/baeldung/convertcollectiontoarraylist/Foo.java b/core-java-modules/java-collections-conversions/src/main/java/com/baeldung/convertcollectiontoarraylist/Foo.java similarity index 100% rename from java-collections-conversions/src/main/java/com/baeldung/convertcollectiontoarraylist/Foo.java rename to core-java-modules/java-collections-conversions/src/main/java/com/baeldung/convertcollectiontoarraylist/Foo.java diff --git a/java-collections-conversions/src/main/java/com/baeldung/convertlisttomap/Animal.java b/core-java-modules/java-collections-conversions/src/main/java/com/baeldung/convertlisttomap/Animal.java similarity index 100% rename from java-collections-conversions/src/main/java/com/baeldung/convertlisttomap/Animal.java rename to core-java-modules/java-collections-conversions/src/main/java/com/baeldung/convertlisttomap/Animal.java diff --git a/java-collections-conversions/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java b/core-java-modules/java-collections-conversions/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java similarity index 100% rename from java-collections-conversions/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java rename to core-java-modules/java-collections-conversions/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java diff --git a/java-collections-conversions/src/main/resources/logback.xml b/core-java-modules/java-collections-conversions/src/main/resources/logback.xml similarity index 100% rename from java-collections-conversions/src/main/resources/logback.xml rename to core-java-modules/java-collections-conversions/src/main/resources/logback.xml diff --git a/java-collections-conversions/src/test/java/com/baeldung/convertToMap/ConvertToMapUnitTest.java b/core-java-modules/java-collections-conversions/src/test/java/com/baeldung/convertToMap/ConvertToMapUnitTest.java similarity index 100% rename from java-collections-conversions/src/test/java/com/baeldung/convertToMap/ConvertToMapUnitTest.java rename to core-java-modules/java-collections-conversions/src/test/java/com/baeldung/convertToMap/ConvertToMapUnitTest.java diff --git a/java-collections-conversions/src/test/java/com/baeldung/convertcollectiontoarraylist/CollectionToArrayListUnitTest.java b/core-java-modules/java-collections-conversions/src/test/java/com/baeldung/convertcollectiontoarraylist/CollectionToArrayListUnitTest.java similarity index 100% rename from java-collections-conversions/src/test/java/com/baeldung/convertcollectiontoarraylist/CollectionToArrayListUnitTest.java rename to core-java-modules/java-collections-conversions/src/test/java/com/baeldung/convertcollectiontoarraylist/CollectionToArrayListUnitTest.java diff --git a/java-collections-conversions/src/test/java/com/baeldung/convertiteratortolist/ConvertIteratorToListServiceUnitTest.java b/core-java-modules/java-collections-conversions/src/test/java/com/baeldung/convertiteratortolist/ConvertIteratorToListServiceUnitTest.java similarity index 100% rename from java-collections-conversions/src/test/java/com/baeldung/convertiteratortolist/ConvertIteratorToListServiceUnitTest.java rename to core-java-modules/java-collections-conversions/src/test/java/com/baeldung/convertiteratortolist/ConvertIteratorToListServiceUnitTest.java diff --git a/java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListToMapServiceUnitTest.java b/core-java-modules/java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListToMapServiceUnitTest.java similarity index 100% rename from java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListToMapServiceUnitTest.java rename to core-java-modules/java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListToMapServiceUnitTest.java diff --git a/java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDuplicatedIdToMapServiceUnitTest.java b/core-java-modules/java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDuplicatedIdToMapServiceUnitTest.java similarity index 100% rename from java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDuplicatedIdToMapServiceUnitTest.java rename to core-java-modules/java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDuplicatedIdToMapServiceUnitTest.java diff --git a/java-collections-conversions/src/test/java/com/baeldung/java/collections/IterableToCollectionUnitTest.java b/core-java-modules/java-collections-conversions/src/test/java/com/baeldung/java/collections/IterableToCollectionUnitTest.java similarity index 100% rename from java-collections-conversions/src/test/java/com/baeldung/java/collections/IterableToCollectionUnitTest.java rename to core-java-modules/java-collections-conversions/src/test/java/com/baeldung/java/collections/IterableToCollectionUnitTest.java diff --git a/java-collections-conversions/src/test/java/com/baeldung/java/collections/JavaCollectionConversionUnitTest.java b/core-java-modules/java-collections-conversions/src/test/java/com/baeldung/java/collections/JavaCollectionConversionUnitTest.java similarity index 100% rename from java-collections-conversions/src/test/java/com/baeldung/java/collections/JavaCollectionConversionUnitTest.java rename to core-java-modules/java-collections-conversions/src/test/java/com/baeldung/java/collections/JavaCollectionConversionUnitTest.java diff --git a/java-collections-conversions/src/test/java/com/baeldung/java/lists/ListToStringUnitTest.java b/core-java-modules/java-collections-conversions/src/test/java/com/baeldung/java/lists/ListToStringUnitTest.java similarity index 100% rename from java-collections-conversions/src/test/java/com/baeldung/java/lists/ListToStringUnitTest.java rename to core-java-modules/java-collections-conversions/src/test/java/com/baeldung/java/lists/ListToStringUnitTest.java diff --git a/java-collections-maps-3/README.md b/core-java-modules/java-collections-maps-3/README.md similarity index 100% rename from java-collections-maps-3/README.md rename to core-java-modules/java-collections-maps-3/README.md diff --git a/java-collections-maps-3/pom.xml b/core-java-modules/java-collections-maps-3/pom.xml similarity index 90% rename from java-collections-maps-3/pom.xml rename to core-java-modules/java-collections-maps-3/pom.xml index 729b357b76..db56550d10 100644 --- a/java-collections-maps-3/pom.xml +++ b/core-java-modules/java-collections-maps-3/pom.xml @@ -9,10 +9,9 @@ jar - com.baeldung - parent-java + com.baeldung.core-java-modules + core-java-modules 0.0.1-SNAPSHOT - ../parent-java diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/bytearrays/BytesKey.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/bytearrays/BytesKey.java similarity index 100% rename from java-collections-maps-3/src/main/java/com/baeldung/map/bytearrays/BytesKey.java rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/bytearrays/BytesKey.java diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/entry/Book.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/entry/Book.java similarity index 100% rename from java-collections-maps-3/src/main/java/com/baeldung/map/entry/Book.java rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/entry/Book.java diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/entry/MapEntryEfficiencyExample.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/entry/MapEntryEfficiencyExample.java similarity index 100% rename from java-collections-maps-3/src/main/java/com/baeldung/map/entry/MapEntryEfficiencyExample.java rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/entry/MapEntryEfficiencyExample.java diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/entry/MapEntryTupleExample.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/entry/MapEntryTupleExample.java similarity index 100% rename from java-collections-maps-3/src/main/java/com/baeldung/map/entry/MapEntryTupleExample.java rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/entry/MapEntryTupleExample.java diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/Member.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/Member.java similarity index 100% rename from java-collections-maps-3/src/main/java/com/baeldung/map/hashing/Member.java rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/Member.java diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithBadHashing.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithBadHashing.java similarity index 100% rename from java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithBadHashing.java rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithBadHashing.java diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithGuavaHashing.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithGuavaHashing.java similarity index 100% rename from java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithGuavaHashing.java rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithGuavaHashing.java diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithId.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithId.java similarity index 100% rename from java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithId.java rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithId.java diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithIdAndName.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithIdAndName.java similarity index 100% rename from java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithIdAndName.java rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithIdAndName.java diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithObjects.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithObjects.java similarity index 100% rename from java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithObjects.java rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithObjects.java diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/identity/IdentityHashMapDemonstrator.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/identity/IdentityHashMapDemonstrator.java similarity index 100% rename from java-collections-maps-3/src/main/java/com/baeldung/map/identity/IdentityHashMapDemonstrator.java rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/identity/IdentityHashMapDemonstrator.java diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/invert/InvertHashMapExample.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/invert/InvertHashMapExample.java similarity index 100% rename from java-collections-maps-3/src/main/java/com/baeldung/map/invert/InvertHashMapExample.java rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/invert/InvertHashMapExample.java diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/bytearrays/ByteArrayKeyUnitTest.java b/core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/bytearrays/ByteArrayKeyUnitTest.java similarity index 100% rename from java-collections-maps-3/src/test/java/com/baeldung/map/bytearrays/ByteArrayKeyUnitTest.java rename to core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/bytearrays/ByteArrayKeyUnitTest.java diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java b/core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java similarity index 100% rename from java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java rename to core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/entry/MapEntryUnitTest.java b/core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/entry/MapEntryUnitTest.java similarity index 100% rename from java-collections-maps-3/src/test/java/com/baeldung/map/entry/MapEntryUnitTest.java rename to core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/entry/MapEntryUnitTest.java diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/hashing/HashMapUpdateUnitTest.java b/core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/hashing/HashMapUpdateUnitTest.java similarity index 100% rename from java-collections-maps-3/src/test/java/com/baeldung/map/hashing/HashMapUpdateUnitTest.java rename to core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/hashing/HashMapUpdateUnitTest.java diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/hashing/HashingUnitTest.java b/core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/hashing/HashingUnitTest.java similarity index 100% rename from java-collections-maps-3/src/test/java/com/baeldung/map/hashing/HashingUnitTest.java rename to core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/hashing/HashingUnitTest.java diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/identity/IdentityHashMapDemonstratorUnitTest.java b/core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/identity/IdentityHashMapDemonstratorUnitTest.java similarity index 100% rename from java-collections-maps-3/src/test/java/com/baeldung/map/identity/IdentityHashMapDemonstratorUnitTest.java rename to core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/identity/IdentityHashMapDemonstratorUnitTest.java diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/invert/InvertHashMapUnitTest.java b/core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/invert/InvertHashMapUnitTest.java similarity index 100% rename from java-collections-maps-3/src/test/java/com/baeldung/map/invert/InvertHashMapUnitTest.java rename to core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/invert/InvertHashMapUnitTest.java diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/EntrySetExampleUnitTest.java b/core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/EntrySetExampleUnitTest.java similarity index 100% rename from java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/EntrySetExampleUnitTest.java rename to core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/EntrySetExampleUnitTest.java diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/KeySetExampleUnitTest.java b/core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/KeySetExampleUnitTest.java similarity index 100% rename from java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/KeySetExampleUnitTest.java rename to core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/KeySetExampleUnitTest.java diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/ValuesExampleUnitTest.java b/core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/ValuesExampleUnitTest.java similarity index 100% rename from java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/ValuesExampleUnitTest.java rename to core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/ValuesExampleUnitTest.java diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 2f684beea0..257616de8d 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -117,6 +117,9 @@ core-java-regex core-java-regex-2 core-java-uuid + java-collections-conversions + java-collections-conversions-2 + java-collections-maps-3 pre-jpms diff --git a/pom.xml b/pom.xml index 9670e57612..f06c75b3be 100644 --- a/pom.xml +++ b/pom.xml @@ -431,9 +431,6 @@ jackson-simple java-blockchain - java-collections-conversions - java-collections-conversions-2 - java-collections-maps-3 javafx @@ -905,9 +902,6 @@ jackson-simple java-blockchain - java-collections-conversions - java-collections-conversions-2 - java-collections-maps-3 javafx From b03e1b3216700a890cdd8bba8cf5d6e294bb4a28 Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Wed, 4 May 2022 18:15:23 +0100 Subject: [PATCH 144/278] [JAVA-11332] Upgrade H2 version and fix tests (#12056) * [JAVA-11332] Upgrade H2 version and fix tests * [JAVA-11332] Revert formatting changes * [JAVA-11332] Remove config files and code clean up --- .../hibernate-annotations/pom.xml | 2 +- .../com/baeldung/hibernate/HibernateUtil.java | 75 ++++++++----------- .../hibernate/customtypes/OfficeEmployee.java | 1 - .../config/HibernateAnnotationUtil.java | 58 +++++++------- .../hibernate/wherejointable/User.java | 2 +- .../resources/hibernate-annotation.cfg.xml | 18 ----- ... HibernateCustomTypesIntegrationTest.java} | 56 ++++++++++---- .../joincolumn/JoinColumnIntegrationTest.java | 50 +++++++++++-- .../resources/hibernate-spatial.properties | 14 ---- 9 files changed, 150 insertions(+), 126 deletions(-) delete mode 100644 persistence-modules/hibernate-annotations/src/main/resources/hibernate-annotation.cfg.xml rename persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/customtypes/{HibernateCustomTypesManualTest.java => HibernateCustomTypesIntegrationTest.java} (52%) delete mode 100644 persistence-modules/hibernate-annotations/src/test/resources/hibernate-spatial.properties diff --git a/persistence-modules/hibernate-annotations/pom.xml b/persistence-modules/hibernate-annotations/pom.xml index 023e5aa30f..dc5f245f22 100644 --- a/persistence-modules/hibernate-annotations/pom.xml +++ b/persistence-modules/hibernate-annotations/pom.xml @@ -85,7 +85,7 @@ 5.6.7.Final true 2.1.7.RELEASE - 1.4.200 + 2.1.212 9.0.0.M26 2.3.4 diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/HibernateUtil.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/HibernateUtil.java index afe2aeac89..65d9f249fa 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/HibernateUtil.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/HibernateUtil.java @@ -1,10 +1,5 @@ package com.baeldung.hibernate; -import java.io.FileInputStream; -import java.io.IOException; -import java.net.URL; -import java.util.Properties; - import org.apache.commons.lang3.StringUtils; import org.hibernate.SessionFactory; import org.hibernate.boot.Metadata; @@ -12,62 +7,58 @@ import org.hibernate.boot.MetadataSources; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.service.ServiceRegistry; -import com.baeldung.hibernate.joincolumn.Email; -import com.baeldung.hibernate.joincolumn.Office; -import com.baeldung.hibernate.joincolumn.OfficeAddress; +import java.io.FileInputStream; +import java.io.IOException; +import java.net.URL; +import java.util.List; +import java.util.Properties; + +import static java.util.Objects.requireNonNull; public class HibernateUtil { - private static String PROPERTY_FILE_NAME; - public static SessionFactory getSessionFactory() throws IOException { - return getSessionFactory(null); + public static SessionFactory getSessionFactory(String propertyFileName, List> classes) throws IOException { + ServiceRegistry serviceRegistry = configureServiceRegistry(propertyFileName); + return makeSessionFactory(serviceRegistry, classes); } - public static SessionFactory getSessionFactory(String propertyFileName) throws IOException { - PROPERTY_FILE_NAME = propertyFileName; - ServiceRegistry serviceRegistry = configureServiceRegistry(); - return makeSessionFactory(serviceRegistry); - } - - public static SessionFactory getSessionFactoryByProperties(Properties properties) throws IOException { - ServiceRegistry serviceRegistry = configureServiceRegistry(properties); - return makeSessionFactory(serviceRegistry); - } - - private static SessionFactory makeSessionFactory(ServiceRegistry serviceRegistry) { + private static SessionFactory makeSessionFactory(ServiceRegistry serviceRegistry, List> classes) { MetadataSources metadataSources = new MetadataSources(serviceRegistry); + for (Class clazz: classes) { + metadataSources = metadataSources.addAnnotatedClass(clazz); + } - metadataSources.addPackage("com.baeldung.hibernate.pojo"); - metadataSources.addAnnotatedClass(com.baeldung.hibernate.joincolumn.OfficialEmployee.class); - metadataSources.addAnnotatedClass(Email.class); - metadataSources.addAnnotatedClass(Office.class); - metadataSources.addAnnotatedClass(OfficeAddress.class); - - Metadata metadata = metadataSources.getMetadataBuilder() - .build(); - - return metadata.getSessionFactoryBuilder() - .build(); + Metadata metadata = metadataSources + .getMetadataBuilder() + .build(); + return metadata.getSessionFactoryBuilder().build(); } - private static ServiceRegistry configureServiceRegistry() throws IOException { - return configureServiceRegistry(getProperties()); + private static ServiceRegistry configureServiceRegistry(String propertyFileName) throws IOException { + return configureServiceRegistry(getProperties(propertyFileName)); } - private static ServiceRegistry configureServiceRegistry(Properties properties) throws IOException { + private static ServiceRegistry configureServiceRegistry(Properties properties) { return new StandardServiceRegistryBuilder().applySettings(properties) .build(); } - public static Properties getProperties() throws IOException { + public static Properties getProperties(String propertyFileName) throws IOException { Properties properties = new Properties(); - URL propertiesURL = Thread.currentThread() - .getContextClassLoader() - .getResource(StringUtils.defaultString(PROPERTY_FILE_NAME, "hibernate.properties")); - try (FileInputStream inputStream = new FileInputStream(propertiesURL.getFile())) { + + String file = getResourceURL(propertyFileName).getFile(); + + try (FileInputStream inputStream = new FileInputStream(file)) { properties.load(inputStream); } + return properties; } + + private static URL getResourceURL(String propertyFileName) { + return requireNonNull(Thread.currentThread() + .getContextClassLoader() + .getResource(StringUtils.defaultString(propertyFileName, "hibernate.properties"))); + } } \ No newline at end of file diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/OfficeEmployee.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/OfficeEmployee.java index 3ca06e4316..1ffeb0b99d 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/OfficeEmployee.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/OfficeEmployee.java @@ -1,6 +1,5 @@ package com.baeldung.hibernate.customtypes; -import com.baeldung.hibernate.pojo.Phone; import org.hibernate.annotations.Columns; import org.hibernate.annotations.Parameter; import org.hibernate.annotations.Type; diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java index 6c94d34339..ef82c1c9ad 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java @@ -7,45 +7,51 @@ import com.baeldung.hibernate.oneToMany.model.ItemOIO; import org.hibernate.SessionFactory; import org.hibernate.boot.Metadata; import org.hibernate.boot.MetadataSources; -import org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.cfg.Environment; import org.hibernate.service.ServiceRegistry; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; + +import java.util.HashMap; +import java.util.Map; public class HibernateAnnotationUtil { - private static final Logger LOGGER = LoggerFactory.getLogger(HibernateAnnotationUtil.class); + private static final SessionFactory SESSION_FACTORY = buildSessionFactory(); - private static SessionFactory sessionFactory; + /** + * Utility class + */ + private HibernateAnnotationUtil() { + } public static SessionFactory getSessionFactory() { - if (sessionFactory == null) { - sessionFactory = buildSessionFactory(); - } - return sessionFactory; + return SESSION_FACTORY; } private static SessionFactory buildSessionFactory() { - try { - ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() - .configure("hibernate-annotation.cfg.xml") - .build(); + ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() + .applySettings(dbSettings()) + .build(); - Metadata metadata = new MetadataSources(serviceRegistry) - .addAnnotatedClass(Cart.class) - .addAnnotatedClass(CartOIO.class) - .addAnnotatedClass(Item.class) - .addAnnotatedClass(ItemOIO.class) - .getMetadataBuilder() - .applyImplicitNamingStrategy(ImplicitNamingStrategyJpaCompliantImpl.INSTANCE) - .build(); + Metadata metadata = new MetadataSources(serviceRegistry) + .addAnnotatedClass(Cart.class) + .addAnnotatedClass(CartOIO.class) + .addAnnotatedClass(Item.class) + .addAnnotatedClass(ItemOIO.class) + .buildMetadata(); - return metadata.getSessionFactoryBuilder().build(); + return metadata.buildSessionFactory(); + } - } catch (Throwable ex) { - LOGGER.error("Initial SessionFactory creation failed.", ex); - throw new ExceptionInInitializerError(ex); - } + private static Map dbSettings() { + Map dbSettings = new HashMap<>(); + dbSettings.put(Environment.URL, "jdbc:h2:mem:spring_hibernate_one_to_many"); + dbSettings.put(Environment.USER, "sa"); + dbSettings.put(Environment.PASS, ""); + dbSettings.put(Environment.DRIVER, "org.h2.Driver"); + dbSettings.put(Environment.CURRENT_SESSION_CONTEXT_CLASS, "thread"); + dbSettings.put(Environment.SHOW_SQL, "true"); + dbSettings.put(Environment.HBM2DDL_AUTO, "create"); + return dbSettings; } } diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/User.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/User.java index 7fc077eeb2..3029aae640 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/User.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/User.java @@ -12,7 +12,7 @@ import javax.persistence.ManyToMany; import org.hibernate.annotations.WhereJoinTable; -@Entity +@Entity(name = "users") public class User { @Id diff --git a/persistence-modules/hibernate-annotations/src/main/resources/hibernate-annotation.cfg.xml b/persistence-modules/hibernate-annotations/src/main/resources/hibernate-annotation.cfg.xml deleted file mode 100644 index 6e845b3781..0000000000 --- a/persistence-modules/hibernate-annotations/src/main/resources/hibernate-annotation.cfg.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - org.h2.Driver - sa - - jdbc:h2:mem:spring_hibernate_one_to_many - - org.hibernate.dialect.H2Dialect - thread - true - create - - diff --git a/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesManualTest.java b/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesIntegrationTest.java similarity index 52% rename from persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesManualTest.java rename to persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesIntegrationTest.java index 63dc6330be..460b65ee12 100644 --- a/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesManualTest.java +++ b/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesIntegrationTest.java @@ -1,20 +1,27 @@ package com.baeldung.hibernate.customtypes; -import com.baeldung.hibernate.HibernateUtil; import org.hibernate.SessionFactory; -import org.hibernate.query.Query; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.cfg.Environment; +import org.hibernate.service.ServiceRegistry; import org.junit.Assert; import org.junit.Test; -import java.io.IOException; +import javax.persistence.TypedQuery; import java.time.LocalDate; +import java.util.HashMap; +import java.util.Map; import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; -public class HibernateCustomTypesManualTest { +public class HibernateCustomTypesIntegrationTest { @Test - public void givenEmployee_whenSavedWithCustomTypes_thenEntityIsSaved() throws IOException { + public void givenEmployee_whenSavedWithCustomTypes_thenEntityIsSaved() { final OfficeEmployee e = new OfficeEmployee(); e.setDateOfJoining(LocalDate.now()); @@ -39,13 +46,13 @@ public class HibernateCustomTypesManualTest { doInHibernate(this::sessionFactory, session -> { session.save(e); boolean contains = session.contains(e); - Assert.assertTrue(contains); + assertTrue(contains); }); } @Test - public void givenEmployee_whenCustomTypeInQuery_thenReturnEntity() throws IOException { + public void givenEmployee_whenCustomTypeInQuery_thenReturnEntity() { final OfficeEmployee e = new OfficeEmployee(); e.setDateOfJoining(LocalDate.now()); @@ -69,22 +76,39 @@ public class HibernateCustomTypesManualTest { doInHibernate(this::sessionFactory, session -> { session.save(e); - Query query = session.createQuery("FROM OfficeEmployee OE WHERE OE.empAddress.zipcode = :pinCode"); + TypedQuery query = session.createQuery("FROM OfficeEmployee OE WHERE OE.empAddress.zipcode = :pinCode", OfficeEmployee.class); query.setParameter("pinCode",100); - int size = query.list().size(); + int size = query.getResultList().size(); - Assert.assertEquals(1, size); + assertEquals(1, size); }); } private SessionFactory sessionFactory() { - try { - return HibernateUtil.getSessionFactory("hibernate-customtypes.properties"); - } catch (IOException e) { - e.printStackTrace(); - } + ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() + .applySettings(getProperties()) + .build(); - return null; + MetadataSources metadataSources = new MetadataSources(serviceRegistry); + Metadata metadata = metadataSources + .addAnnotatedClass(OfficeEmployee.class) + .getMetadataBuilder() + .applyBasicType(LocalDateStringType.INSTANCE) + .build(); + + return metadata.buildSessionFactory(); + } + + private static Map getProperties() { + Map dbSettings = new HashMap<>(); + dbSettings.put(Environment.URL, "jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1"); + dbSettings.put(Environment.USER, "sa"); + dbSettings.put(Environment.PASS, ""); + dbSettings.put(Environment.DRIVER, "org.h2.Driver"); + dbSettings.put(Environment.CURRENT_SESSION_CONTEXT_CLASS, "thread"); + dbSettings.put(Environment.SHOW_SQL, "true"); + dbSettings.put(Environment.HBM2DDL_AUTO, "create"); + return dbSettings; } } diff --git a/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest.java b/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest.java index 0998ff1d90..37125e8b15 100644 --- a/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest.java +++ b/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest.java @@ -1,14 +1,21 @@ package com.baeldung.hibernate.joincolumn; -import com.baeldung.hibernate.HibernateUtil; -import java.io.IOException; +import com.baeldung.hibernate.customtypes.LocalDateStringType; import org.hibernate.Session; +import org.hibernate.SessionFactory; import org.hibernate.Transaction; - +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.cfg.Configuration; +import org.hibernate.cfg.Environment; +import org.hibernate.service.ServiceRegistry; import org.junit.After; import org.junit.Before; import org.junit.Test; +import java.util.HashMap; +import java.util.Map; public class JoinColumnIntegrationTest { @@ -16,9 +23,8 @@ public class JoinColumnIntegrationTest { private Transaction transaction; @Before - public void setUp() throws IOException { - session = HibernateUtil.getSessionFactory("hibernate-spatial.properties") - .openSession(); + public void setUp() { + session = sessionFactory().openSession(); transaction = session.beginTransaction(); } @@ -54,4 +60,34 @@ public class JoinColumnIntegrationTest { session.clear(); } -} \ No newline at end of file + private SessionFactory sessionFactory() { + ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() + .applySettings(getProperties()) + .build(); + + MetadataSources metadataSources = new MetadataSources(serviceRegistry); + Metadata metadata = metadataSources + .addAnnotatedClass(Email.class) + .addAnnotatedClass(Office.class) + .addAnnotatedClass(OfficeAddress.class) + .addAnnotatedClass(OfficialEmployee.class) + .getMetadataBuilder() + .applyBasicType(LocalDateStringType.INSTANCE) + .build(); + + return metadata.buildSessionFactory(); + } + + private static Map getProperties() { + Map dbSettings = new HashMap<>(); + dbSettings.put(Environment.URL, "jdbc:h2:mem:mydbJoinColumn;DB_CLOSE_DELAY=-1"); + dbSettings.put(Environment.USER, "sa"); + dbSettings.put(Environment.PASS, ""); + dbSettings.put(Environment.DRIVER, "org.h2.Driver"); + dbSettings.put(Environment.CURRENT_SESSION_CONTEXT_CLASS, "thread"); + dbSettings.put(Environment.SHOW_SQL, "true"); + dbSettings.put(Environment.HBM2DDL_AUTO, "create"); + return dbSettings; + } + +} diff --git a/persistence-modules/hibernate-annotations/src/test/resources/hibernate-spatial.properties b/persistence-modules/hibernate-annotations/src/test/resources/hibernate-spatial.properties deleted file mode 100644 index 1657c838e3..0000000000 --- a/persistence-modules/hibernate-annotations/src/test/resources/hibernate-spatial.properties +++ /dev/null @@ -1,14 +0,0 @@ -hibernate.connection.driver_class=org.h2.Driver -hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1 -hibernate.connection.username=sa -hibernate.connection.autocommit=true -jdbc.password= - -hibernate.dialect=org.hibernate.spatial.dialect.h2geodb.GeoDBDialect -hibernate.show_sql=true -hibernate.hbm2ddl.auto=create-drop - -hibernate.c3p0.min_size=5 -hibernate.c3p0.max_size=20 -hibernate.c3p0.acquire_increment=5 -hibernate.c3p0.timeout=1800 From 7e5463390b4cb14ebf591df60061a8c56a6868fd Mon Sep 17 00:00:00 2001 From: Mateusz Szablak Date: Thu, 5 May 2022 05:20:19 +0200 Subject: [PATCH 145/278] BAEL 5414 - Java null check why use == instead of .equals() (#12124) --- core-java-modules/core-java-lang-5/README.md | 5 + core-java-modules/core-java-lang-5/pom.xml | 27 ++++ .../nullchecks/NullChecksUnitTest.java | 125 ++++++++++++++++++ core-java-modules/pom.xml | 1 + 4 files changed, 158 insertions(+) create mode 100644 core-java-modules/core-java-lang-5/README.md create mode 100644 core-java-modules/core-java-lang-5/pom.xml create mode 100644 core-java-modules/core-java-lang-5/src/test/java/com/baeldung/nullchecks/NullChecksUnitTest.java diff --git a/core-java-modules/core-java-lang-5/README.md b/core-java-modules/core-java-lang-5/README.md new file mode 100644 index 0000000000..012f4edc51 --- /dev/null +++ b/core-java-modules/core-java-lang-5/README.md @@ -0,0 +1,5 @@ +## Core Java Lang (Part 5) + +This module contains articles about core features in the Java language + +## TODO ## diff --git a/core-java-modules/core-java-lang-5/pom.xml b/core-java-modules/core-java-lang-5/pom.xml new file mode 100644 index 0000000000..6d3771bd31 --- /dev/null +++ b/core-java-modules/core-java-lang-5/pom.xml @@ -0,0 +1,27 @@ + + + 4.0.0 + core-java-lang-5 + 0.1.0-SNAPSHOT + core-java-lang-5 + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + + core-java-lang-5 + + + src/main/resources + true + + + + + \ No newline at end of file diff --git a/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/nullchecks/NullChecksUnitTest.java b/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/nullchecks/NullChecksUnitTest.java new file mode 100644 index 0000000000..12b3db734d --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/nullchecks/NullChecksUnitTest.java @@ -0,0 +1,125 @@ +package com.baeldung.nullchecks; + +import org.junit.Test; + +import java.util.Objects; + +import static org.junit.jupiter.api.Assertions.*; + +public class NullChecksUnitTest { + + @Test + public void whenReferenceEqualityOnPrimitives_thenCompareValues() { + int a = 10; + int b = 15; + int c = 10; + int d = a; + + // different values check + assertFalse(a == b); + + // same values check + assertTrue(a == c); + + // same references check + assertTrue(a == d); + } + + @Test + public void whenReferenceEqualityOnObjects_thenCompareReferences() { + Person a = new Person("Bob", 20); + Person b = new Person("Mike", 40); + Person c = new Person("Bob", 20); + Person d = a; + Person e = null; + + // different values check + assertFalse(a == b); + + // same values check + assertFalse(a == c); + + // same references check + assertTrue(a == d); + + // same references check - for nulls + assertTrue(e == null); + } + + @Test + public void whenValueEqualityOnPrimitives_thenCompareValues() { + int a = 10; + Integer b = a; + + assertTrue(b.equals(10)); + } + + @Test + public void whenValueEqualityOnObjects_thenCompareValues() { + Person a = new Person("Bob", 20); + Person b = new Person("Mike", 40); + Person c = new Person("Bob", 20); + Person d = a; + Person e = null; + + // different values check + assertFalse(a.equals(b)); + + // same values check + assertTrue(a.equals(c)); + + // same references check + assertTrue(a.equals(d)); + + // null checks + assertFalse(a.equals(e)); + assertThrows(NullPointerException.class, () -> e.equals(a)); + + // null checks fixed + assertFalse(e != null && e.equals(a)); + + // using Objects.equals + assertFalse(Objects.equals(e, a)); + assertTrue(Objects.equals(null, e)); + + } + + private class Person { + private String name; + private int age; + + public Person(String name, int age) { + this.name = name; + this.age = age; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Person person = (Person) o; + return age == person.age && Objects.equals(name, person.name); + } + + @Override + public int hashCode() { + return Objects.hash(name, age); + } + } +} diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 257616de8d..04b46e3740 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -73,6 +73,7 @@ core-java-lang-2 core-java-lang-3 core-java-lang-4 + core-java-lang-5 core-java-lang-math core-java-lang-math-2 core-java-lang-math-3 From bfbcabada0f10e01b0d79f358cfb7e9e2fcd4fe0 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Thu, 5 May 2022 18:49:26 +0800 Subject: [PATCH 146/278] Update README.md --- spring-security-modules/spring-security-web-rest/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-security-modules/spring-security-web-rest/README.md b/spring-security-modules/spring-security-web-rest/README.md index fd1f86f6b8..5a94504762 100644 --- a/spring-security-modules/spring-security-web-rest/README.md +++ b/spring-security-modules/spring-security-web-rest/README.md @@ -9,7 +9,7 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com ### Relevant Articles: -- [Setting Up Swagger 2 with a Spring REST API](https://www.baeldung.com/swagger-2-documentation-for-spring-rest-api) +- [Setting Up Swagger 2 with a Spring REST API Using Springfox](https://www.baeldung.com/swagger-2-documentation-for-spring-rest-api) - [Custom Error Message Handling for REST API](https://www.baeldung.com/global-error-handler-in-a-spring-rest-api) - [Spring Security Context Propagation with @Async](https://www.baeldung.com/spring-security-async-principal-propagation) - [Servlet 3 Async Support with Spring MVC and Spring Security](https://www.baeldung.com/spring-mvc-async-security) From 8dbffdcd8b9bbf929986968d3c4fab3bd04b7c92 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Thu, 5 May 2022 18:51:06 +0800 Subject: [PATCH 147/278] Update README.md --- spring-boot-modules/spring-boot-mvc/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-modules/spring-boot-mvc/README.md b/spring-boot-modules/spring-boot-mvc/README.md index cdb2bd0fce..fdd7c70af2 100644 --- a/spring-boot-modules/spring-boot-mvc/README.md +++ b/spring-boot-modules/spring-boot-mvc/README.md @@ -7,7 +7,7 @@ This module contains articles about Spring Web MVC in Spring Boot projects. - [Custom Validation MessageSource in Spring Boot](https://www.baeldung.com/spring-custom-validation-message-source) - [Display RSS Feed with Spring MVC](https://www.baeldung.com/spring-mvc-rss-feed) - [A Controller, Service and DAO Example with Spring Boot and JSF](https://www.baeldung.com/jsf-spring-boot-controller-service-dao) -- [Setting Up Swagger 2 with a Spring REST API](https://www.baeldung.com/swagger-2-documentation-for-spring-rest-api) +- [Setting Up Swagger 2 with a Spring REST API Using Springfox](https://www.baeldung.com/swagger-2-documentation-for-spring-rest-api) - [Using Spring ResponseEntity to Manipulate the HTTP Response](https://www.baeldung.com/spring-response-entity) - [The @ServletComponentScan Annotation in Spring Boot](https://www.baeldung.com/spring-servletcomponentscan) - [Guide to Internationalization in Spring Boot](https://www.baeldung.com/spring-boot-internationalization) From 6c0561e0e3539395b4325e194b0288b0dac8f055 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Thu, 5 May 2022 20:22:08 +0800 Subject: [PATCH 148/278] Update README.md --- spring-boot-modules/spring-boot-springdoc/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-modules/spring-boot-springdoc/README.md b/spring-boot-modules/spring-boot-springdoc/README.md index 4ac4147da6..5daca79bd2 100644 --- a/spring-boot-modules/spring-boot-springdoc/README.md +++ b/spring-boot-modules/spring-boot-springdoc/README.md @@ -4,3 +4,4 @@ - [Spring REST Docs vs OpenAPI](https://www.baeldung.com/spring-rest-docs-vs-openapi) - [Hiding Endpoints From Swagger Documentation in Spring Boot](https://www.baeldung.com/spring-swagger-hiding-endpoints) - [Swagger @Api Description Is Deprecated](https://www.baeldung.com/java-swagger-api-description-deprecated) +- [Set List of Objects in Swagger API Response](https://www.baeldung.com/java-swagger-set-list-response) From d953a9f5179ab434e5ee65cbce918fa4c758e0de Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Thu, 5 May 2022 20:49:20 +0800 Subject: [PATCH 149/278] Update README.md --- persistence-modules/spring-data-mongodb/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/spring-data-mongodb/README.md b/persistence-modules/spring-data-mongodb/README.md index acc978c68e..7dd0a82def 100644 --- a/persistence-modules/spring-data-mongodb/README.md +++ b/persistence-modules/spring-data-mongodb/README.md @@ -11,6 +11,7 @@ - [Spring Data MongoDB: Projections and Aggregations](http://www.baeldung.com/spring-data-mongodb-projections-aggregations) - [Spring Data Annotations](http://www.baeldung.com/spring-data-annotations) - [Spring Data MongoDB Transactions](https://www.baeldung.com/spring-data-mongodb-transactions) +- [Return Only Specific Fields for a Query in Spring Data MongoDB](https://www.baeldung.com/mongodb-return-specific-fields) ## Spring Data MongoDB Live Testing From be54650992661ff2504ae1cd640792d043ad3841 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Thu, 5 May 2022 20:52:49 +0800 Subject: [PATCH 150/278] Update README.md --- spring-boot-modules/spring-boot-mvc-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-modules/spring-boot-mvc-4/README.md b/spring-boot-modules/spring-boot-mvc-4/README.md index d215525ab5..a7a341deee 100644 --- a/spring-boot-modules/spring-boot-mvc-4/README.md +++ b/spring-boot-modules/spring-boot-mvc-4/README.md @@ -9,3 +9,4 @@ This module contains articles about Spring Web MVC in Spring Boot projects. - [Configure a Spring Boot Web Application](https://www.baeldung.com/spring-boot-application-configuration) - [A Quick Intro to the SpringBootServletInitializer](https://www.baeldung.com/spring-boot-servlet-initializer) - [A Guide to Spring in Eclipse STS](https://www.baeldung.com/eclipse-sts-spring) +- [Hide a Request Field in Swagger API](https://www.baeldung.com/spring-swagger-hide-field) From cf74afc3954bb3ea5b401eabc47095d9fd70b297 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Thu, 5 May 2022 20:55:35 +0800 Subject: [PATCH 151/278] Update README.md --- spring-boot-modules/spring-boot-data-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-modules/spring-boot-data-2/README.md b/spring-boot-modules/spring-boot-data-2/README.md index e7d39a78e9..9ff2b2caf8 100644 --- a/spring-boot-modules/spring-boot-data-2/README.md +++ b/spring-boot-modules/spring-boot-data-2/README.md @@ -5,6 +5,6 @@ - [“HttpMessageNotWritableException: No converter found for return value of type”](https://www.baeldung.com/spring-no-converter-found) - [Creating a Read-Only Repository with Spring Data](https://www.baeldung.com/spring-data-read-only-repository) - [Using JaVers for Data Model Auditing in Spring Data](https://www.baeldung.com/spring-data-javers-audit) -- [BootstrapMode for JPA Repositories](https://github.com/eugenp/tutorials/tree/master/spring-boot-modules/spring-boot-data-2) +- [BootstrapMode for JPA Repositories](https://www.baeldung.com/jpa-bootstrap-mode) - [Dynamic DTO Validation Config Retrieved from the Database](https://www.baeldung.com/spring-dynamic-dto-validation) From 72b8e53e59a73942295e1dd2bc4a80a0ad6e3ae9 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Thu, 5 May 2022 21:59:31 +0800 Subject: [PATCH 152/278] Update README.md --- spring-boot-rest/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-rest/README.md b/spring-boot-rest/README.md index 365a21781c..ece6c5ab63 100644 --- a/spring-boot-rest/README.md +++ b/spring-boot-rest/README.md @@ -5,6 +5,7 @@ This module contains articles about Spring Boot RESTful APIs. ### Relevant Articles - [Versioning a REST API](https://www.baeldung.com/rest-versioning) +- [REST Pagination in Spring](https://www.baeldung.com/rest-api-pagination-in-spring) ### E-book From de2964e2bd86cb36b8a0adae39ffa746821b3c4f Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Thu, 5 May 2022 22:00:02 +0800 Subject: [PATCH 153/278] Update README.md --- spring-boot-rest/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-boot-rest/README.md b/spring-boot-rest/README.md index ece6c5ab63..365a21781c 100644 --- a/spring-boot-rest/README.md +++ b/spring-boot-rest/README.md @@ -5,7 +5,6 @@ This module contains articles about Spring Boot RESTful APIs. ### Relevant Articles - [Versioning a REST API](https://www.baeldung.com/rest-versioning) -- [REST Pagination in Spring](https://www.baeldung.com/rest-api-pagination-in-spring) ### E-book From 56f41f1485af9ae33c8892ebaa946c77fc2cd28e Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Thu, 5 May 2022 22:59:48 +0800 Subject: [PATCH 154/278] Update README.md --- persistence-modules/spring-boot-persistence-mongodb/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/persistence-modules/spring-boot-persistence-mongodb/README.md b/persistence-modules/spring-boot-persistence-mongodb/README.md index 6659e82677..91dd8718e1 100644 --- a/persistence-modules/spring-boot-persistence-mongodb/README.md +++ b/persistence-modules/spring-boot-persistence-mongodb/README.md @@ -8,4 +8,3 @@ - [A Guide to @DBRef in MongoDB](https://www.baeldung.com/spring-mongodb-dbref-annotation) - [Import Data to MongoDB From JSON File Using Java](https://www.baeldung.com/java-import-json-mongodb) - [Logging MongoDB Queries with Spring Boot](https://www.baeldung.com/spring-boot-mongodb-logging) -- [Return Only Specific Fields for a Query in Spring Data MongoDB](https://www.baeldung.com/mongodb-return-specific-fields) From 10c1ce6cd2038e1faaaba9f326757fbaa9669a5a Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Thu, 5 May 2022 23:03:28 +0800 Subject: [PATCH 155/278] Delete README.md --- .../src/main/java/com/baeldung/swaggerresponseapi/README.md | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/swaggerresponseapi/README.md diff --git a/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/swaggerresponseapi/README.md b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/swaggerresponseapi/README.md deleted file mode 100644 index a7ff3285ee..0000000000 --- a/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/swaggerresponseapi/README.md +++ /dev/null @@ -1,3 +0,0 @@ -### Relevant Articles: - -- [Set List of Objects in Swagger API Response](https://www.baeldung.com/java-swagger-set-list-response) From 078f635c45fe5bedd608f1c6bd625de5583490ea Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Thu, 5 May 2022 16:59:28 +0100 Subject: [PATCH 156/278] [JAVA-10384] Amendment to cover all cases + Added Unit tests (#12169) Co-authored-by: panagiotiskakos --- .../balancedbrackets/BalancedBracketsUsingDeque.java | 2 +- .../BalancedBracketsUsingDequeUnitTest.java | 6 ++++++ .../BalancedBracketsUsingStringUnitTest.java | 6 ++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDeque.java b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDeque.java index 4c220b4047..45ef842670 100644 --- a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDeque.java +++ b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDeque.java @@ -31,6 +31,6 @@ public class BalancedBracketsUsingDeque { } } - return true; + return deque.isEmpty(); } } \ No newline at end of file diff --git a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java b/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java index 964c1ce11a..4c0a56dabc 100644 --- a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java +++ b/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java @@ -49,6 +49,12 @@ public class BalancedBracketsUsingDequeUnitTest { assertThat(result).isFalse(); } + @Test + public void givenAnotherEvenLengthUnbalancedString_whenCheckingForBalance_shouldReturnFalse() { + boolean result = balancedBracketsUsingDeque.isBalanced("{{}("); + assertThat(result).isFalse(); + } + @Test public void givenEvenLengthBalancedString_whenCheckingForBalance_shouldReturnTrue() { boolean result = balancedBracketsUsingDeque.isBalanced("{[()]}"); diff --git a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java b/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java index 69ce42b0f1..bda85a75ce 100644 --- a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java +++ b/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java @@ -49,6 +49,12 @@ public class BalancedBracketsUsingStringUnitTest { assertThat(result).isFalse(); } + @Test + public void givenAnotherEvenLengthUnbalancedString_whenCheckingForBalance_shouldReturnFalse() { + boolean result = balancedBracketsUsingString.isBalanced("{{}("); + assertThat(result).isFalse(); + } + @Test public void givenEvenLengthBalancedString_whenCheckingForBalance_shouldReturnTrue() { boolean result = balancedBracketsUsingString.isBalanced("{[()]}"); From 67db9161fa301a6f41c2315648ca2c03297be5ed Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Thu, 5 May 2022 23:06:57 +0300 Subject: [PATCH 157/278] Create GraphQL collection.postman_collection.json --- ...GraphQL collection.postman_collection.json | 169 ++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 spring-boot-modules/spring-boot-libraries/src/test/resources/GraphQL collection.postman_collection.json diff --git a/spring-boot-modules/spring-boot-libraries/src/test/resources/GraphQL collection.postman_collection.json b/spring-boot-modules/spring-boot-libraries/src/test/resources/GraphQL collection.postman_collection.json new file mode 100644 index 0000000000..8245152bdd --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries/src/test/resources/GraphQL collection.postman_collection.json @@ -0,0 +1,169 @@ +{ + "info": { + "_postman_id": "910d9690-f629-4491-bbbd-adb30982a386", + "name": "GraphQL collection", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" + }, + "item": [ + { + "name": "mutations", + "item": [ + { + "name": "writePost", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "graphql", + "graphql": { + "query": "mutation writePost ($title: String!, $text: String!, $category: String) {\n writePost (title: $title, text: $text, category: $category) {\n id\n title\n text\n category\n }\n}", + "variables": "{\n \"title\": \"\",\n \"text\": \"\",\n \"category\": \"\"\n}" + }, + "options": { + "graphql": {} + } + }, + "url": { + "raw": "http://localhost:9090/springbootapp/graphql", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "springbootapp", + "graphql" + ] + } + }, + "response": [] + } + ], + "protocolProfileBehavior": {} + }, + { + "name": "queries", + "item": [ + { + "name": "get recent posts", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "graphql", + "graphql": { + "query": "{\r\n recentPosts(count: 10, offset: 0) {\r\n id\r\n title\r\n category\r\n text\r\n author {\r\n id\r\n name\r\n thumbnail\r\n }\r\n }\r\n}", + "variables": "" + } + }, + "url": { + "raw": "http://localhost:9090/springbootapp/graphql", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "springbootapp", + "graphql" + ] + } + }, + "response": [] + }, + { + "name": "recentPosts - variables", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "graphql", + "graphql": { + "query": "query recentPosts ($count: Int, $offset: Int) {\n recentPosts (count: $count, offset: $offset) {\n id\n title\n text\n category\n }\n}", + "variables": "{\n \"count\": 1,\n \"offset\": 0\n}" + }, + "options": { + "graphql": {} + } + }, + "url": { + "raw": "http://localhost:9090/springbootapp/graphql", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "springbootapp", + "graphql" + ] + } + }, + "response": [] + }, + { + "name": "get recent posts - raw", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/graphql", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "query {\r\n recentPosts(count: 10, offset: 0) {\r\n id\r\n title\r\n category\r\n author {\r\n id\r\n name\r\n thumbnail\r\n }\r\n }\r\n}" + }, + "url": { + "raw": "http://localhost:9090/springbootapp/graphql", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "springbootapp", + "graphql" + ] + } + }, + "response": [] + } + ], + "protocolProfileBehavior": {} + } + ], + "event": [ + { + "listen": "prerequest", + "script": { + "id": "b54f267b-c450-4f2d-8105-2f23bab4c922", + "type": "text/javascript", + "exec": [ + "" + ] + } + }, + { + "listen": "test", + "script": { + "id": "00b575be-03d4-4b29-b137-733ead139638", + "type": "text/javascript", + "exec": [ + "" + ] + } + } + ], + "variable": [ + { + "id": "20a274e5-6d51-40d6-81cb-af9eb115b21b", + "key": "url", + "value": "", + "type": "string" + } + ], + "protocolProfileBehavior": {} +} From fdacc2cf6cb5fc3d1630efbcccc34d87fc595285 Mon Sep 17 00:00:00 2001 From: dholde Date: Fri, 6 May 2022 00:53:59 +0200 Subject: [PATCH 158/278] BAEL-5479 Pushing a Docker Image to a Private Repository (#12108) * Add sample application * Add Dockerfile * Format * Add README.md --- docker/docker-push-to-private-repo/.gitignore | 33 ++++++++++++++ docker/docker-push-to-private-repo/Dockerfile | 4 ++ docker/docker-push-to-private-repo/README.md | 1 + docker/docker-push-to-private-repo/pom.xml | 43 +++++++++++++++++++ .../docker/push/HelloWorldController.java | 12 ++++++ .../push/PushToPrivateRepoApplication.java | 13 ++++++ .../src/main/resources/application.properties | 1 + docker/pom.xml | 1 + 8 files changed, 108 insertions(+) create mode 100644 docker/docker-push-to-private-repo/.gitignore create mode 100644 docker/docker-push-to-private-repo/Dockerfile create mode 100644 docker/docker-push-to-private-repo/README.md create mode 100644 docker/docker-push-to-private-repo/pom.xml create mode 100644 docker/docker-push-to-private-repo/src/main/java/com/baeldung/docker/push/HelloWorldController.java create mode 100644 docker/docker-push-to-private-repo/src/main/java/com/baeldung/docker/push/PushToPrivateRepoApplication.java create mode 100644 docker/docker-push-to-private-repo/src/main/resources/application.properties diff --git a/docker/docker-push-to-private-repo/.gitignore b/docker/docker-push-to-private-repo/.gitignore new file mode 100644 index 0000000000..549e00a2a9 --- /dev/null +++ b/docker/docker-push-to-private-repo/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/docker/docker-push-to-private-repo/Dockerfile b/docker/docker-push-to-private-repo/Dockerfile new file mode 100644 index 0000000000..42a13e2a93 --- /dev/null +++ b/docker/docker-push-to-private-repo/Dockerfile @@ -0,0 +1,4 @@ +FROM openjdk:11 +ARG JAR_FILE=target/*.jar +COPY ${JAR_FILE} app.jar +ENTRYPOINT ["java","-jar","/app.jar"] \ No newline at end of file diff --git a/docker/docker-push-to-private-repo/README.md b/docker/docker-push-to-private-repo/README.md new file mode 100644 index 0000000000..e320af31b4 --- /dev/null +++ b/docker/docker-push-to-private-repo/README.md @@ -0,0 +1 @@ +### Relevant Articles: \ No newline at end of file diff --git a/docker/docker-push-to-private-repo/pom.xml b/docker/docker-push-to-private-repo/pom.xml new file mode 100644 index 0000000000..59a909ff07 --- /dev/null +++ b/docker/docker-push-to-private-repo/pom.xml @@ -0,0 +1,43 @@ + + + 4.0.0 + + com.baeldung.docker + docker + 0.0.1 + + push-to-private-repo + 0.0.1-SNAPSHOT + push-to-private-repo + Example application to showcase how to push a docker image to a private repository + + 11 + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/docker/docker-push-to-private-repo/src/main/java/com/baeldung/docker/push/HelloWorldController.java b/docker/docker-push-to-private-repo/src/main/java/com/baeldung/docker/push/HelloWorldController.java new file mode 100644 index 0000000000..58486c3086 --- /dev/null +++ b/docker/docker-push-to-private-repo/src/main/java/com/baeldung/docker/push/HelloWorldController.java @@ -0,0 +1,12 @@ +package com.baeldung.docker.push; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class HelloWorldController { + @GetMapping("/helloworld") + String helloWorld() { + return "Hello World!"; + } +} \ No newline at end of file diff --git a/docker/docker-push-to-private-repo/src/main/java/com/baeldung/docker/push/PushToPrivateRepoApplication.java b/docker/docker-push-to-private-repo/src/main/java/com/baeldung/docker/push/PushToPrivateRepoApplication.java new file mode 100644 index 0000000000..7f516b3158 --- /dev/null +++ b/docker/docker-push-to-private-repo/src/main/java/com/baeldung/docker/push/PushToPrivateRepoApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.docker.push; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class PushToPrivateRepoApplication { + + public static void main(String[] args) { + SpringApplication.run(PushToPrivateRepoApplication.class, args); + } + +} diff --git a/docker/docker-push-to-private-repo/src/main/resources/application.properties b/docker/docker-push-to-private-repo/src/main/resources/application.properties new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/docker/docker-push-to-private-repo/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/docker/pom.xml b/docker/pom.xml index 5c6267c6dd..67f9a5b3bd 100644 --- a/docker/pom.xml +++ b/docker/pom.xml @@ -28,6 +28,7 @@ docker-sample-app docker-caching/single-module-caching docker-caching/multi-module-caching + docker-push-to-private-repo From 7ac41c7736eb151f9852443ac448d448ad6db601 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 6 May 2022 14:09:49 +0800 Subject: [PATCH 159/278] Create README.md --- graphql/graphql-error-handling/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 graphql/graphql-error-handling/README.md diff --git a/graphql/graphql-error-handling/README.md b/graphql/graphql-error-handling/README.md new file mode 100644 index 0000000000..06a2957ac1 --- /dev/null +++ b/graphql/graphql-error-handling/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [Error Handling in GraphQL With Spring Boot](https://www.baeldung.com/spring-graphql-error-handling) From 44bb0319336e2e1637db3c319f5e51c8adc7b928 Mon Sep 17 00:00:00 2001 From: kpentaris Date: Sat, 7 May 2022 06:27:31 +0300 Subject: [PATCH 160/278] Add AtomicInteger.set() and .lazySet() usage example (#12099) --- .../baeldung/setvslazyset/Application.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/setvslazyset/Application.java diff --git a/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/setvslazyset/Application.java b/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/setvslazyset/Application.java new file mode 100644 index 0000000000..37424147a7 --- /dev/null +++ b/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/setvslazyset/Application.java @@ -0,0 +1,35 @@ +package com.baeldung.setvslazyset; + +import java.util.concurrent.atomic.AtomicInteger; + +public class Application { + + AtomicInteger atomic = new AtomicInteger(0); + + public static void main(String[] args) { + Application app = new Application(); + new Thread(() -> { + for (int i = 0; i < 10; i++) { + //app.atomic.set(i); + app.atomic.lazySet(i); + System.out.println("Set: " + i); + try { + Thread.sleep(100); + } catch (InterruptedException e) {} + } + }).start(); + + new Thread(() -> { + for (int i = 0; i < 10; i++) { + synchronized (app.atomic) { + int counter = app.atomic.get(); + System.out.println("Get: " + counter); + } + try { + Thread.sleep(100); + } catch (InterruptedException e) {} + } + }).start(); + } + +} From c9b2e65561e3a5fbc151477ed931176876d9acea Mon Sep 17 00:00:00 2001 From: panagiotiskakos Date: Sat, 7 May 2022 10:40:06 +0300 Subject: [PATCH 161/278] [JAVA-11770] Added build step to copy native libraries into a specific folder --- aws-modules/aws-miscellaneous/pom.xml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/aws-modules/aws-miscellaneous/pom.xml b/aws-modules/aws-miscellaneous/pom.xml index f05764f10a..08e4e36c73 100644 --- a/aws-modules/aws-miscellaneous/pom.xml +++ b/aws-modules/aws-miscellaneous/pom.xml @@ -78,6 +78,25 @@ + + org.apache.maven.plugins + maven-dependency-plugin + 3.1.1 + + + copy + compile + + copy-dependencies + + + + so,dll,dylib + native-libs + + + + From 1ce88958918aa490c1643bf80cc416b7ade79eef Mon Sep 17 00:00:00 2001 From: Mayank Aggarwal Date: Sat, 7 May 2022 17:52:36 +0530 Subject: [PATCH 162/278] Bael 5438 (#12176) * [BAEL-5438] Added Criteria Queries for Employee * [BAEL-5438] Added tests and entities for named queries and criteria queries * [BAEL-5438] Removed unused sorting files * [BAEL-5438] Ignored spring context test * BAEL-5438 Indented with 4 spaces Co-authored-by: Mayank Agarwal --- .../hibernate/criteria/model/Employee.java | 121 +++++++++--------- .../view/EmployeeCriteriaQueries.java | 57 ++++----- .../EmployeeCriteriaIntegrationTest.java | 36 +++--- .../hibernate/criteria/model/Employee.hbm.xml | 28 ++-- .../spring/data/jpa/entity/Employee.java | 10 +- .../jpa/repository/EmployeeRepository.java | 41 +++--- 6 files changed, 151 insertions(+), 142 deletions(-) diff --git a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/model/Employee.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/model/Employee.java index 994d3f3800..8771e02e0b 100644 --- a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/model/Employee.java +++ b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/model/Employee.java @@ -3,74 +3,81 @@ package com.baeldung.hibernate.criteria.model; import java.io.Serializable; import javax.persistence.Entity; -@org.hibernate.annotations.NamedQueries({ @org.hibernate.annotations.NamedQuery(name = "Employee_findByEmployeeId", query = "from Employee where id = :employeeId"), - @org.hibernate.annotations.NamedQuery(name = "Employee_findAllByEmployeeSalary", query = "from Employee where salary = :employeeSalary")}) -@org.hibernate.annotations.NamedNativeQueries({ @org.hibernate.annotations.NamedNativeQuery(name = "Employee_FindByEmployeeId", query = "select * from employee emp where employeeId=:employeeId", resultClass = Employee.class)}) +@org.hibernate.annotations.NamedQueries({ + @org.hibernate.annotations.NamedQuery(name = "Employee_findByEmployeeId", query = "from Employee where id = :employeeId"), + @org.hibernate.annotations.NamedQuery(name = "Employee_findAllByEmployeeSalary", query = "from Employee where salary = :employeeSalary")}) +@org.hibernate.annotations.NamedNativeQueries({ + @org.hibernate.annotations.NamedNativeQuery(name = "Employee_FindByEmployeeId", query = "select * from employee emp where employeeId=:employeeId", resultClass = Employee.class)}) @Entity public class Employee implements Serializable { - private static final long serialVersionUID = 1L; - private Integer id; - private String name; - private Long salary; + private static final long serialVersionUID = 1L; + private Integer id; + private String name; + private Long salary; - // constructors - public Employee() { - } + // constructors + public Employee() { + } - public Employee(final Integer id, final String name, final Long salary) { - super(); - this.id = id; - this.name = name; - this.salary = salary; - } + public Employee(final Integer id, final String name, final Long salary) { + super(); + this.id = id; + this.name = name; + this.salary = salary; + } - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((id == null) ? 0 : id.hashCode()); - return result; - } + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((id == null) ? 0 : id.hashCode()); + return result; + } - @Override - public boolean equals(final Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - final Employee other = (Employee) obj; - if (id == null) { - if (other.id != null) - return false; - } else if (!id.equals(other.id)) - return false; - return true; - } + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final Employee other = (Employee) obj; + if (id == null) { + if (other.id != null) { + return false; + } + } else if (!id.equals(other.id)) { + return false; + } + return true; + } - public Integer getId() { - return id; - } + public Integer getId() { + return id; + } - public void setId(Integer id) { - this.id = id; - } + public void setId(Integer id) { + this.id = id; + } - public String getName() { - return name; - } + public String getName() { + return name; + } - public void setName(String name) { - this.name = name; - } + public void setName(String name) { + this.name = name; + } - public Long getSalary() { - return salary; - } + public Long getSalary() { + return salary; + } - public void setSalary(Long salary) { - this.salary = salary; - } + public void setSalary(Long salary) { + this.salary = salary; + } } diff --git a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/view/EmployeeCriteriaQueries.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/view/EmployeeCriteriaQueries.java index 04e27d2ec1..f8c525611b 100644 --- a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/view/EmployeeCriteriaQueries.java +++ b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/view/EmployeeCriteriaQueries.java @@ -11,35 +11,34 @@ import org.hibernate.query.Query; public class EmployeeCriteriaQueries { - public List getAllEmployees() { - final Session session = HibernateUtil.getHibernateSession(); - final CriteriaBuilder cb = session.getCriteriaBuilder(); - final CriteriaQuery cr = cb.createQuery(Employee.class); - final Root root = cr.from(Employee.class); - cr.select(root); - Query query = session.createQuery(cr); - List results = query.getResultList(); - session.close(); - return results; - } - - // To get items having salary more than 50000 - public String[] greaterThanCriteria() { - final Session session = HibernateUtil.getHibernateSession(); - final CriteriaBuilder cb = session.getCriteriaBuilder(); - final CriteriaQuery cr = cb.createQuery(Employee.class); - final Root root = cr.from(Employee.class); - cr.select(root) - .where(cb.gt(root.get("salary"), 50000)); - Query query = session.createQuery(cr); - final List greaterThanEmployeeList = query.getResultList(); - final String employeeWithGreaterSalary[] = new String[greaterThanEmployeeList.size()]; - for (int i = 0; i < greaterThanEmployeeList.size(); i++) { - employeeWithGreaterSalary[i] = greaterThanEmployeeList.get(i) - .getName(); + public List getAllEmployees() { + final Session session = HibernateUtil.getHibernateSession(); + final CriteriaBuilder cb = session.getCriteriaBuilder(); + final CriteriaQuery cr = cb.createQuery(Employee.class); + final Root root = cr.from(Employee.class); + cr.select(root); + Query query = session.createQuery(cr); + List results = query.getResultList(); + session.close(); + return results; } - session.close(); - return employeeWithGreaterSalary; - } + // To get items having salary more than 50000 + public String[] greaterThanCriteria() { + final Session session = HibernateUtil.getHibernateSession(); + final CriteriaBuilder cb = session.getCriteriaBuilder(); + final CriteriaQuery cr = cb.createQuery(Employee.class); + final Root root = cr.from(Employee.class); + cr.select(root) + .where(cb.gt(root.get("salary"), 50000)); + Query query = session.createQuery(cr); + final List greaterThanEmployeeList = query.getResultList(); + final String employeeWithGreaterSalary[] = new String[greaterThanEmployeeList.size()]; + for (int i = 0; i < greaterThanEmployeeList.size(); i++) { + employeeWithGreaterSalary[i] = greaterThanEmployeeList.get(i) + .getName(); + } + session.close(); + return employeeWithGreaterSalary; + } } diff --git a/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/criteria/EmployeeCriteriaIntegrationTest.java b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/criteria/EmployeeCriteriaIntegrationTest.java index b2ad4240bf..61f54aaea8 100644 --- a/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/criteria/EmployeeCriteriaIntegrationTest.java +++ b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/criteria/EmployeeCriteriaIntegrationTest.java @@ -11,26 +11,26 @@ import org.junit.Test; public class EmployeeCriteriaIntegrationTest { - final private EmployeeCriteriaQueries employeeCriteriaQueries = new EmployeeCriteriaQueries(); + final private EmployeeCriteriaQueries employeeCriteriaQueries = new EmployeeCriteriaQueries(); - @Test - public void testGreaterThanCriteriaQuery() { - final Session session = HibernateUtil.getHibernateSession(); - final List expectedGreaterThanList = session.createQuery("From Employee where salary>50000").list(); - final String expectedGreaterThanEmployees[] = new String[expectedGreaterThanList.size()]; - for (int i = 0; i < expectedGreaterThanList.size(); i++) { - expectedGreaterThanEmployees[i] = expectedGreaterThanList.get(i).getName(); + @Test + public void testGreaterThanCriteriaQuery() { + final Session session = HibernateUtil.getHibernateSession(); + final List expectedGreaterThanList = session.createQuery("From Employee where salary>50000").list(); + final String expectedGreaterThanEmployees[] = new String[expectedGreaterThanList.size()]; + for (int i = 0; i < expectedGreaterThanList.size(); i++) { + expectedGreaterThanEmployees[i] = expectedGreaterThanList.get(i).getName(); + } + session.close(); + assertArrayEquals(expectedGreaterThanEmployees, employeeCriteriaQueries.greaterThanCriteria()); } - session.close(); - assertArrayEquals(expectedGreaterThanEmployees, employeeCriteriaQueries.greaterThanCriteria()); - } - @Test - public void testGetAllEmployeesQuery() { - final Session session = HibernateUtil.getHibernateSession(); - final List expectedSortCritEmployeeList = session.createQuery("From Employee").list(); - session.close(); - assertArrayEquals(expectedSortCritEmployeeList.toArray(), employeeCriteriaQueries.getAllEmployees().toArray()); - } + @Test + public void testGetAllEmployeesQuery() { + final Session session = HibernateUtil.getHibernateSession(); + final List expectedSortCritEmployeeList = session.createQuery("From Employee").list(); + session.close(); + assertArrayEquals(expectedSortCritEmployeeList.toArray(), employeeCriteriaQueries.getAllEmployees().toArray()); + } } diff --git a/persistence-modules/hibernate-queries/src/test/resources/com/baeldung/hibernate/criteria/model/Employee.hbm.xml b/persistence-modules/hibernate-queries/src/test/resources/com/baeldung/hibernate/criteria/model/Employee.hbm.xml index 90e1c2fefd..0cc1c54680 100644 --- a/persistence-modules/hibernate-queries/src/test/resources/com/baeldung/hibernate/criteria/model/Employee.hbm.xml +++ b/persistence-modules/hibernate-queries/src/test/resources/com/baeldung/hibernate/criteria/model/Employee.hbm.xml @@ -1,19 +1,19 @@ + "-//Hibernate/Hibernate Mapping DTD 3.0//EN" + "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> - - - - - - - - - - - - + + + + + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/entity/Employee.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/entity/Employee.java index 214cb09e57..a511686f1b 100644 --- a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/entity/Employee.java +++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/entity/Employee.java @@ -7,12 +7,12 @@ import javax.persistence.Id; @Entity public class Employee { - @Id - @GeneratedValue - private Integer id; + @Id + @GeneratedValue + private Integer id; - private String name; + private String name; - private Long salary; + private Long salary; } diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/repository/EmployeeRepository.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/repository/EmployeeRepository.java index 652b7b93d2..85d1a1b324 100644 --- a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/repository/EmployeeRepository.java +++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/repository/EmployeeRepository.java @@ -9,29 +9,32 @@ import org.springframework.data.repository.query.Param; public interface EmployeeRepository extends JpaRepository { - @Query(value = "SELECT e FROM Employee e") - List findAllEmployees(Sort sort); + @Query(value = "SELECT e FROM Employee e") + List findAllEmployees(Sort sort); - @Query("SELECT e FROM Employee e WHERE e.salary = ?1") - Employee findAllEmployeesWithSalary(Long salary); + @Query("SELECT e FROM Employee e WHERE e.salary = ?1") + Employee findAllEmployeesWithSalary(Long salary); - @Query("SELECT e FROM Employee e WHERE e.name = ?1 and e.salary = ?2") - Employee findUserByNameAndSalary(String name, Long salary); + @Query("SELECT e FROM Employee e WHERE e.name = ?1 and e.salary = ?2") + Employee findUserByNameAndSalary(String name, Long salary); - @Query( - value = "SELECT * FROM Employee e WHERE e.salary = ?1", - nativeQuery = true) - Employee findUserBySalaryNative(Long salary); + @Query( + value = "SELECT * FROM Employee e WHERE e.salary = ?1", + nativeQuery = true + ) + Employee findUserBySalaryNative(Long salary); - @Query("SELECT e FROM Employee e WHERE e.name = :name and e.salary = :salary") - Employee findUserByEmployeeNameAndSalaryNamedParameters( - @Param("name") String employeeName, - @Param("salary") Long employeeSalary); + @Query("SELECT e FROM Employee e WHERE e.name = :name and e.salary = :salary") + Employee findUserByEmployeeNameAndSalaryNamedParameters( + @Param("name") String employeeName, + @Param("salary") Long employeeSalary); - @Query(value = "SELECT * FROM Employee e WHERE e.name = :name and e.salary = :salary", - nativeQuery = true) - Employee findUserByNameAndSalaryNamedParamsNative( - @Param("name") String employeeName, - @Param("salary") Long employeeSalary); + @Query( + value = "SELECT * FROM Employee e WHERE e.name = :name and e.salary = :salary", + nativeQuery = true + ) + Employee findUserByNameAndSalaryNamedParamsNative( + @Param("name") String employeeName, + @Param("salary") Long employeeSalary); } From c69f4d207f19190213f6fd857c977ebfb9f4a593 Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Sat, 7 May 2022 17:24:56 -0300 Subject: [PATCH 163/278] BAEL-5396 - Configure MongoDB Collection Name for a Class in Spring Data First Draft. --- .../baeldung/boot/collection/name/Naming.java | 35 ++++++++ .../SpringBootCollectionNameApplication.java | 19 +++++ .../name/dao/CompilationRepository.java | 9 +++ .../name/dao/MusicAlbumRepository.java | 9 +++ .../name/dao/MusicTrackRepository.java | 9 +++ .../collection/name/dao/StoreRepository.java | 9 +++ .../collection/name/data/Compilation.java | 36 +++++++++ .../boot/collection/name/data/MusicAlbum.java | 48 +++++++++++ .../boot/collection/name/data/MusicTrack.java | 50 ++++++++++++ .../boot/collection/name/data/Store.java | 36 +++++++++ .../name/service/MusicStoreService.java | 62 ++++++++++++++ .../name/web/CollectionController.java | 24 ++++++ .../name/web/MusicStoreController.java | 63 +++++++++++++++ .../boot.collection.name/app.properties | 1 + .../MusicStoreServiceIntegrationTest.java | 81 +++++++++++++++++++ 15 files changed, 491 insertions(+) create mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/Naming.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/SpringBootCollectionNameApplication.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/dao/CompilationRepository.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/dao/MusicAlbumRepository.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/dao/MusicTrackRepository.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/dao/StoreRepository.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/data/Compilation.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/data/MusicAlbum.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/data/MusicTrack.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/data/Store.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/service/MusicStoreService.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/web/CollectionController.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/web/MusicStoreController.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/resources/boot.collection.name/app.properties create mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/boot/collection/name/service/MusicStoreServiceIntegrationTest.java diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/Naming.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/Naming.java new file mode 100644 index 0000000000..9808ecccb6 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/Naming.java @@ -0,0 +1,35 @@ +package com.baeldung.boot.collection.name; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.data.util.ParsingUtils; +import org.springframework.util.StringUtils; + +public class Naming { + public static void main(String[] args) { + String r = new Naming().fix(args[0]); + System.out.println(r); + } + + public String fix(String name) { + List parts = ParsingUtils.splitCamelCaseToLower(name); + List result = new ArrayList<>(); + + for (String part : parts) { + if (StringUtils.hasText(part)) { + result.add(part); + } + } + + return StringUtils.collectionToDelimitedString(result, "_"); + } + + public String convert(Class type) { + return fix(type.getSimpleName()); + } + + public String convert(Object instance) { + return convert(instance.getClass()); + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/SpringBootCollectionNameApplication.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/SpringBootCollectionNameApplication.java new file mode 100644 index 0000000000..0a5c36db29 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/SpringBootCollectionNameApplication.java @@ -0,0 +1,19 @@ +package com.baeldung.boot.collection.name; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.PropertySource; + +@SpringBootApplication +@PropertySource("classpath:boot.collection.name/app.properties") +public class SpringBootCollectionNameApplication { + public static void main(String... args) { + SpringApplication.run(SpringBootCollectionNameApplication.class, args); + } + + @Bean + public Naming naming() { + return new Naming(); + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/dao/CompilationRepository.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/dao/CompilationRepository.java new file mode 100644 index 0000000000..3f83ad4548 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/dao/CompilationRepository.java @@ -0,0 +1,9 @@ +package com.baeldung.boot.collection.name.dao; + +import org.springframework.data.mongodb.repository.MongoRepository; + +import com.baeldung.boot.collection.name.data.Compilation; + +public interface CompilationRepository extends MongoRepository { + +} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/dao/MusicAlbumRepository.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/dao/MusicAlbumRepository.java new file mode 100644 index 0000000000..98709361d7 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/dao/MusicAlbumRepository.java @@ -0,0 +1,9 @@ +package com.baeldung.boot.collection.name.dao; + +import org.springframework.data.mongodb.repository.MongoRepository; + +import com.baeldung.boot.collection.name.data.MusicAlbum; + +public interface MusicAlbumRepository extends MongoRepository { + +} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/dao/MusicTrackRepository.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/dao/MusicTrackRepository.java new file mode 100644 index 0000000000..0964a8de00 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/dao/MusicTrackRepository.java @@ -0,0 +1,9 @@ +package com.baeldung.boot.collection.name.dao; + +import org.springframework.data.mongodb.repository.MongoRepository; + +import com.baeldung.boot.collection.name.data.MusicTrack; + +public interface MusicTrackRepository extends MongoRepository { + +} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/dao/StoreRepository.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/dao/StoreRepository.java new file mode 100644 index 0000000000..b446a7d98d --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/dao/StoreRepository.java @@ -0,0 +1,9 @@ +package com.baeldung.boot.collection.name.dao; + +import org.springframework.data.mongodb.repository.MongoRepository; + +import com.baeldung.boot.collection.name.data.Store; + +public interface StoreRepository extends MongoRepository { + +} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/data/Compilation.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/data/Compilation.java new file mode 100644 index 0000000000..ce081acf25 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/data/Compilation.java @@ -0,0 +1,36 @@ +package com.baeldung.boot.collection.name.data; + +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +@Document +public class Compilation { + @Id + private String id; + + private String name; + + public Compilation() { + } + + public Compilation(String name) { + super(); + this.name = name; + } + + 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; + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/data/MusicAlbum.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/data/MusicAlbum.java new file mode 100644 index 0000000000..ce2e084504 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/data/MusicAlbum.java @@ -0,0 +1,48 @@ +package com.baeldung.boot.collection.name.data; + +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +@Document("albums") +public class MusicAlbum { + @Id + private String id; + + private String name; + + private String artist; + + public MusicAlbum() { + + } + + public MusicAlbum(String name, String artist) { + super(); + this.name = name; + this.artist = artist; + } + + 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 getArtist() { + return artist; + } + + public void setArtist(String artist) { + this.artist = artist; + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/data/MusicTrack.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/data/MusicTrack.java new file mode 100644 index 0000000000..39ce3994bb --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/data/MusicTrack.java @@ -0,0 +1,50 @@ +package com.baeldung.boot.collection.name.data; + +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +@Document("#{@naming.fix('MusicTrack')}") +public class MusicTrack { + @Id + private String id; + + private String name; + + private String artist; + + public MusicTrack() { + } + + public MusicTrack(String name, String artist) { + this.name = name; + this.artist = artist; + } + + public MusicTrack(String name) { + this.name = name; + } + + 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 getArtist() { + return artist; + } + + public void setArtist(String artist) { + this.artist = artist; + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/data/Store.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/data/Store.java new file mode 100644 index 0000000000..83f5017a13 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/data/Store.java @@ -0,0 +1,36 @@ +package com.baeldung.boot.collection.name.data; + +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +@Document("store-#{@environment.getProperty('collection.suffix')}") +public class Store { + @Id + private String id; + + private String name; + + public Store() { + } + + public Store(String name) { + super(); + this.name = name; + } + + 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; + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/service/MusicStoreService.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/service/MusicStoreService.java new file mode 100644 index 0000000000..6083e3d0c3 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/service/MusicStoreService.java @@ -0,0 +1,62 @@ +package com.baeldung.boot.collection.name.service; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baeldung.boot.collection.name.dao.CompilationRepository; +import com.baeldung.boot.collection.name.dao.MusicAlbumRepository; +import com.baeldung.boot.collection.name.dao.MusicTrackRepository; +import com.baeldung.boot.collection.name.dao.StoreRepository; +import com.baeldung.boot.collection.name.data.Compilation; +import com.baeldung.boot.collection.name.data.MusicAlbum; +import com.baeldung.boot.collection.name.data.MusicTrack; +import com.baeldung.boot.collection.name.data.Store; + +@Service +public class MusicStoreService { + @Autowired + private MusicAlbumRepository albumRepository; + + @Autowired + private CompilationRepository compilationRepository; + + @Autowired + private StoreRepository storeRepository; + + @Autowired + private MusicTrackRepository trackRepository; + + public MusicAlbum add(MusicAlbum item) { + return albumRepository.save(item); + } + + public List getAlbumList() { + return albumRepository.findAll(); + } + + public Compilation add(Compilation item) { + return compilationRepository.save(item); + } + + public List getCompilationList() { + return compilationRepository.findAll(); + } + + public Store add(Store item) { + return storeRepository.save(item); + } + + public List getStoreList() { + return storeRepository.findAll(); + } + + public MusicTrack add(MusicTrack item) { + return trackRepository.save(item); + } + + public List getTrackList() { + return trackRepository.findAll(); + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/web/CollectionController.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/web/CollectionController.java new file mode 100644 index 0000000000..2efca361b9 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/web/CollectionController.java @@ -0,0 +1,24 @@ +package com.baeldung.boot.collection.name.web; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.mongodb.DBObject; + +@RestController +@RequestMapping("/collection") +public class CollectionController { + @Autowired + private MongoTemplate mongo; + + @GetMapping("/{name}") + public List get(@PathVariable String name) { + return mongo.findAll(DBObject.class, name); + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/web/MusicStoreController.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/web/MusicStoreController.java new file mode 100644 index 0000000000..8c510121c2 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/web/MusicStoreController.java @@ -0,0 +1,63 @@ +package com.baeldung.boot.collection.name.web; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.boot.collection.name.data.Compilation; +import com.baeldung.boot.collection.name.data.MusicAlbum; +import com.baeldung.boot.collection.name.data.MusicTrack; +import com.baeldung.boot.collection.name.data.Store; +import com.baeldung.boot.collection.name.service.MusicStoreService; + +@RestController +@RequestMapping("/music") +public class MusicStoreController { + @Autowired + private MusicStoreService service; + + @PostMapping("/album") + public MusicAlbum post(@RequestBody MusicAlbum item) { + return service.add(item); + } + + @GetMapping("/album") + public List getAlbumList() { + return service.getAlbumList(); + } + + @PostMapping("/compilation") + public Compilation post(@RequestBody Compilation item) { + return service.add(item); + } + + @GetMapping("/compilation") + public List getCompilationList() { + return service.getCompilationList(); + } + + @PostMapping("/store") + public Store post(@RequestBody Store item) { + return service.add(item); + } + + @GetMapping("/store") + public List getStoreList() { + return service.getStoreList(); + } + + @PostMapping("/track") + public MusicTrack post(@RequestBody MusicTrack item) { + return service.add(item); + } + + @GetMapping("/track") + public List getTrackList() { + return service.getTrackList(); + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/resources/boot.collection.name/app.properties b/persistence-modules/spring-boot-persistence-mongodb/src/main/resources/boot.collection.name/app.properties new file mode 100644 index 0000000000..98945a76e1 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb/src/main/resources/boot.collection.name/app.properties @@ -0,0 +1 @@ +collection.suffix=db diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/boot/collection/name/service/MusicStoreServiceIntegrationTest.java b/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/boot/collection/name/service/MusicStoreServiceIntegrationTest.java new file mode 100644 index 0000000000..eda8b8aafb --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/boot/collection/name/service/MusicStoreServiceIntegrationTest.java @@ -0,0 +1,81 @@ +package com.baeldung.boot.collection.name.service; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.junit4.SpringRunner; + +import com.baeldung.boot.collection.name.data.Compilation; +import com.baeldung.boot.collection.name.data.MusicAlbum; +import com.baeldung.boot.collection.name.data.MusicTrack; +import com.baeldung.boot.collection.name.data.Store; + +@SpringBootTest +@DirtiesContext +@RunWith(SpringRunner.class) +public class MusicStoreServiceIntegrationTest { + @Autowired + private MusicStoreService service; + + @Autowired + private MongoTemplate mongoDb; + + @Test + public void givenAnnotation_whenSearchingByCollectionName_thenFound() { + List list = service.getCompilationList(); + int sizeBefore = list.size(); + + service.add(new Compilation("Spring Hits")); + + list = mongoDb.findAll(Compilation.class, "compilation"); + int sizeAfter = list.size(); + + assertThat(sizeAfter - sizeBefore).isEqualTo(1); + } + + @Test + public void givenAnnotationWithValue_whenSearchingByCollectionName_thenFound() { + List list = service.getAlbumList(); + int sizeBefore = list.size(); + + service.add(new MusicAlbum("Album 1", "Artist A")); + + list = mongoDb.findAll(MusicAlbum.class, "albums"); + int sizeAfter = list.size(); + + assertThat(sizeAfter - sizeBefore).isEqualTo(1); + } + + @Test + public void givenAnnotationWithSpELEnvironment_whenSearchingByCollectionName_thenFound() { + List list = service.getStoreList(); + int sizeBefore = list.size(); + + service.add(new Store("Store A")); + + list = mongoDb.findAll(Store.class, "store-db"); + int sizeAfter = list.size(); + + assertThat(sizeAfter - sizeBefore).isEqualTo(1); + } + + @Test + public void givenAnnotationWithSpELBean_whenSearchingByCollectionName_thenFound() { + List list = service.getTrackList(); + int sizeBefore = list.size(); + + service.add(new MusicTrack("Track 1")); + + list = mongoDb.findAll(MusicTrack.class, "music_track"); + int sizeAfter = list.size(); + + assertThat(sizeAfter - sizeBefore).isEqualTo(1); + } +} From d8b4f64525240e94269e5e0f78cdd3bc1dc2ac68 Mon Sep 17 00:00:00 2001 From: Abhinav Pandey Date: Sun, 8 May 2022 10:41:49 +0530 Subject: [PATCH 164/278] BAEL-5483 - Java HttpClient with SSL (#12144) * BAEL-5483 - Java HttpClient with SSL * BAEL-5483 - Java HttpClient with SSL * BAEL-5483 - Java HttpClient with SSL - changing test case url * BAEL-5483 - Two space indentation for line continuation Co-authored-by: Abhinav Pandey --- .../ssl/HttpClientSSLBypassUnitTest.java | 32 +++++++++++++++ .../httpclient/ssl/HttpClientSSLUnitTest.java | 41 +++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 core-java-modules/core-java-11-2/src/test/java/com/baeldung/httpclient/ssl/HttpClientSSLBypassUnitTest.java create mode 100644 core-java-modules/core-java-11-2/src/test/java/com/baeldung/httpclient/ssl/HttpClientSSLUnitTest.java diff --git a/core-java-modules/core-java-11-2/src/test/java/com/baeldung/httpclient/ssl/HttpClientSSLBypassUnitTest.java b/core-java-modules/core-java-11-2/src/test/java/com/baeldung/httpclient/ssl/HttpClientSSLBypassUnitTest.java new file mode 100644 index 0000000000..29c1538c85 --- /dev/null +++ b/core-java-modules/core-java-11-2/src/test/java/com/baeldung/httpclient/ssl/HttpClientSSLBypassUnitTest.java @@ -0,0 +1,32 @@ +package com.baeldung.httpclient.ssl; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.util.Properties; + +public class HttpClientSSLBypassUnitTest { + + @Test + public void whenHttpsRequest_thenCorrect() throws IOException, InterruptedException { + final Properties props = System.getProperties(); + props.setProperty("jdk.internal.httpclient.disableHostnameVerification", Boolean.TRUE.toString()); + + HttpClient httpClient = HttpClient.newBuilder() + .build(); + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create("https://www.testingmcafeesites.com/")) + .build(); + + HttpResponse response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); + props.setProperty("jdk.internal.httpclient.disableHostnameVerification", Boolean.FALSE.toString()); + + Assertions.assertEquals(200, response.statusCode()); + } +} diff --git a/core-java-modules/core-java-11-2/src/test/java/com/baeldung/httpclient/ssl/HttpClientSSLUnitTest.java b/core-java-modules/core-java-11-2/src/test/java/com/baeldung/httpclient/ssl/HttpClientSSLUnitTest.java new file mode 100644 index 0000000000..8eddd2d329 --- /dev/null +++ b/core-java-modules/core-java-11-2/src/test/java/com/baeldung/httpclient/ssl/HttpClientSSLUnitTest.java @@ -0,0 +1,41 @@ +package com.baeldung.httpclient.ssl; + +import org.junit.Test; + +import javax.net.ssl.SSLHandshakeException; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; + +import static org.junit.Assert.assertEquals; + +public class HttpClientSSLUnitTest { + + @Test + public void whenValidHttpsRequest_thenCorrect() throws URISyntaxException, IOException, InterruptedException { + HttpClient httpClient = HttpClient.newHttpClient(); + HttpRequest request = HttpRequest.newBuilder() + .uri(new URI("https://www.google.com/")) + .build(); + + HttpResponse response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); + + assertEquals(200, response.statusCode()); + } + + @Test(expected = SSLHandshakeException.class) + public void whenInvalidHttpsRequest_thenInCorrect() throws IOException, InterruptedException { + HttpClient httpClient = HttpClient.newHttpClient(); + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create("https://expired.badssl.com/")) + .build(); + + HttpResponse response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); + + assertEquals(200, response.statusCode()); + } + +} From 0ffd9d81b0b49d4435a6ad3933d5614232dc6cf4 Mon Sep 17 00:00:00 2001 From: ACHRAF TAITAI <43656331+achraftt@users.noreply.github.com> Date: Sun, 8 May 2022 08:35:16 +0200 Subject: [PATCH 165/278] BAEL-5432: Update spring-statemachine-core version 1.2.3.RELEASE to 3.1.0 (#12154) * BAEL-5432: Update spring-statemachine-core version 1.2.3.RELEASE to 3.1.0 * BAEL-5432: Update spring-statemachine-core version 1.2.3.RELEASE to 3.2.0 --- spring-state-machine/pom.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/spring-state-machine/pom.xml b/spring-state-machine/pom.xml index bc2b67cc38..741361b3fa 100644 --- a/spring-state-machine/pom.xml +++ b/spring-state-machine/pom.xml @@ -18,6 +18,11 @@ spring-statemachine-core ${spring-statemachine-core.version} + + org.springframework + spring-context + ${spring-context.version} + org.springframework spring-test @@ -32,7 +37,8 @@
    - 1.2.3.RELEASE + 3.2.0 + 5.3.19 4.3.7.RELEASE 1.7.0 From fa471700258ecc5ec946b360751d86eb48ff913e Mon Sep 17 00:00:00 2001 From: apeterlic Date: Sun, 8 May 2022 08:38:49 +0200 Subject: [PATCH 166/278] Difference between Iterable and Iterator (#12079) * Difference between Iterable and Iterator Add examples of the Iterable and the Iterator usage. * Minor changes Add UnitTests for Iterable examples * Fix iterable example Add Custom collection for the Iterable implementation example. * Fix iterable example Change the example for the Iterable interface implementation * Revert "Fix iterable example" This reverts commit 4015cbc038b1b657c54fa666193c0c7019a474ad. * Minor changes --- .../iterable/CustomIterableClient.java | 17 +++++ .../collections/iterable/IterableExample.java | 32 +++++++++ .../collections/iterable/Product.java | 28 ++++++++ .../collections/iterable/ShoppingCart.java | 72 +++++++++++++++++++ .../iterator/CustomIteratorClient.java | 14 ++++ .../collections/iterator/Numbers.java | 60 ++++++++++++++++ .../iterable/IterableUnitTest.java | 54 ++++++++++++++ 7 files changed, 277 insertions(+) create mode 100644 core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterable/CustomIterableClient.java create mode 100644 core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterable/IterableExample.java create mode 100644 core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterable/Product.java create mode 100644 core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterable/ShoppingCart.java create mode 100644 core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterator/CustomIteratorClient.java create mode 100644 core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterator/Numbers.java create mode 100644 core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/iterable/IterableUnitTest.java diff --git a/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterable/CustomIterableClient.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterable/CustomIterableClient.java new file mode 100644 index 0000000000..14f7b18014 --- /dev/null +++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterable/CustomIterableClient.java @@ -0,0 +1,17 @@ +package com.baeldung.collections.iterable; + +class CustomIterableClient { + + public static void main(String[] args) { + + ShoppingCart shoppingCart = new ShoppingCart<>(); + shoppingCart.add(new Product("Tuna", 42)); + shoppingCart.add(new Product("Eggplant", 65)); + shoppingCart.add(new Product("Salad", 45)); + shoppingCart.add(new Product("Banana", 29)); + + for (Product product : shoppingCart) { + System.out.println(product.getName()); + } + } +} diff --git a/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterable/IterableExample.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterable/IterableExample.java new file mode 100644 index 0000000000..9110d6a15f --- /dev/null +++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterable/IterableExample.java @@ -0,0 +1,32 @@ +package com.baeldung.collections.iterable; + +import java.util.Iterator; +import java.util.List; + +public class IterableExample { + + public void iterateUsingIterator(List numbers) { + Iterator iterator = numbers.iterator(); + while (iterator.hasNext()) { + System.out.println(iterator.next()); + } + } + + public void iterateUsingEnhancedForLoop(List numbers) { + for (Integer number : numbers) { + System.out.println(number); + } + } + + public void iterateUsingForEachLoop(List numbers) { + numbers.forEach(System.out::println); + } + + public void removeElementsUsingIterator(List numbers) { + Iterator iterator = numbers.iterator(); + while (iterator.hasNext()) { + iterator.next(); + iterator.remove(); + } + } +} diff --git a/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterable/Product.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterable/Product.java new file mode 100644 index 0000000000..b29088f6f0 --- /dev/null +++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterable/Product.java @@ -0,0 +1,28 @@ +package com.baeldung.collections.iterable; + +class Product { + + private String name; + private double price; + + public Product(String code, double price) { + this.name = code; + this.price = price; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public double getPrice() { + return price; + } + + public void setPrice(double price) { + this.price = price; + } +} diff --git a/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterable/ShoppingCart.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterable/ShoppingCart.java new file mode 100644 index 0000000000..f1b481da08 --- /dev/null +++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterable/ShoppingCart.java @@ -0,0 +1,72 @@ +package com.baeldung.collections.iterable; + +import java.util.Arrays; +import java.util.ConcurrentModificationException; +import java.util.Iterator; +import java.util.NoSuchElementException; + +public class ShoppingCart implements Iterable { + + private E[] elementData; + private int size; + + public ShoppingCart() { + this.elementData = (E[]) new Object[]{}; + } + + public void add(E element) { + ensureCapacity(size + 1); + elementData[size++] = element; + } + + private void ensureCapacity(int minCapacity) { + int oldCapacity = elementData.length; + int newCapacity = oldCapacity + (oldCapacity >> 1); + if (newCapacity - minCapacity < 0) { + newCapacity = minCapacity; + } + elementData = Arrays.copyOf(elementData, newCapacity); + } + + @Override + public Iterator iterator() { + return new ShoppingCartIterator(); + } + + public class ShoppingCartIterator implements Iterator { + int cursor; + int lastReturned = -1; + + public boolean hasNext() { + return cursor != size; + } + + public E next() { + return getNextElement(); + } + + private E getNextElement() { + int current = cursor; + exist(current); + + E[] elements = ShoppingCart.this.elementData; + validate(elements, current); + + cursor = current + 1; + lastReturned = current; + return elements[lastReturned]; + } + + private void exist(int current) { + if (current >= size) { + throw new NoSuchElementException(); + } + } + + private void validate(E[] elements, int current) { + if (current >= elements.length) { + throw new ConcurrentModificationException(); + } + } + } +} diff --git a/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterator/CustomIteratorClient.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterator/CustomIteratorClient.java new file mode 100644 index 0000000000..30c8f57c0b --- /dev/null +++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterator/CustomIteratorClient.java @@ -0,0 +1,14 @@ +package com.baeldung.collections.iterator; + +import java.util.Iterator; + +class CustomIteratorClient { + + public static void main(String[] args) { + Iterator iterator = Numbers.iterator(); + + while (iterator.hasNext()) { + System.out.println(iterator.next()); + } + } +} diff --git a/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterator/Numbers.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterator/Numbers.java new file mode 100644 index 0000000000..23b3344c08 --- /dev/null +++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterator/Numbers.java @@ -0,0 +1,60 @@ +package com.baeldung.collections.iterator; + +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; + +class Numbers { + + private static final List NUMBER_LIST = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + + private Numbers() { + } + + public static Iterator iterator() { + return new PrimeIterator(); + } + + private static class PrimeIterator implements Iterator { + + private int cursor; + + @Override + public Integer next() { + exist(cursor); + return NUMBER_LIST.get(cursor++); + } + + private void exist(int current) { + if (current >= NUMBER_LIST.size()) { + throw new NoSuchElementException(); + } + } + + @Override + public boolean hasNext() { + if (cursor > NUMBER_LIST.size()) { + return false; + } + + for (int i = cursor; i < NUMBER_LIST.size(); i++) { + if (isPrime(NUMBER_LIST.get(i))) { + cursor = i; + return true; + } + } + + return false; + } + + private boolean isPrime(int number) { + for (int i = 2; i <= number / 2; ++i) { + if (number % i == 0) { + return false; + } + } + return true; + } + } +} diff --git a/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/iterable/IterableUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/iterable/IterableUnitTest.java new file mode 100644 index 0000000000..745dcf52b7 --- /dev/null +++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/iterable/IterableUnitTest.java @@ -0,0 +1,54 @@ +package com.baeldung.collections.iterable; + +import com.baeldung.collections.iterable.IterableExample; + +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class IterableUnitTest { + + private static List getNumbers() { + List numbers = new ArrayList<>(); + numbers.add(10); + numbers.add(20); + numbers.add(30); + numbers.add(40); + return numbers; + } + + @Test + void givenNumbers_whenUsingIterator_thenCorrectSize() { + List numbers = getNumbers(); + IterableExample iterableExample = new IterableExample(); + iterableExample.iterateUsingIterator(numbers); + assertEquals(4, numbers.size()); + } + + @Test + void givenNumbers_whenRemoveElements_thenEmptyList() { + List numbers = getNumbers(); + IterableExample iterableExample = new IterableExample(); + iterableExample.removeElementsUsingIterator(numbers); + assertEquals(0, numbers.size()); + } + + @Test + void givenNumbers_whenIterateUsingEnhancedForLoop_thenCorrectSize() { + List numbers = getNumbers(); + IterableExample iterableExample = new IterableExample(); + iterableExample.iterateUsingEnhancedForLoop(numbers); + assertEquals(4, numbers.size()); + } + + @Test + void givenNumbers_whenIterateUsingForEachLoop_thenCorrectSize() { + List numbers = getNumbers(); + IterableExample iterableExample = new IterableExample(); + iterableExample.iterateUsingForEachLoop(numbers); + assertEquals(4, numbers.size()); + } +} From 9a1d66f85251d8f3ec698df2be08baaf49fed5e3 Mon Sep 17 00:00:00 2001 From: 515882294 <515882294@qq.com> Date: Sun, 8 May 2022 16:00:41 +0800 Subject: [PATCH 167/278] BAEL-4463: What is com.sun.proxy.$Proxy --- .../reflection/proxy/AdvancedOperation.java | 7 ++++ .../reflection/proxy/BasicOperation.java | 7 ++++ .../reflection/proxy/DollarProxyUnitTest.java | 35 +++++++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/proxy/AdvancedOperation.java create mode 100644 core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/proxy/BasicOperation.java create mode 100644 core-java-modules/core-java-reflection-2/src/test/java/com/baeldung/reflection/proxy/DollarProxyUnitTest.java diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/proxy/AdvancedOperation.java b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/proxy/AdvancedOperation.java new file mode 100644 index 0000000000..3262b255f0 --- /dev/null +++ b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/proxy/AdvancedOperation.java @@ -0,0 +1,7 @@ +package com.baeldung.reflection.proxy; + +public interface AdvancedOperation { + int multiple(int a, int b); + + int divide(int a, int b); +} \ No newline at end of file diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/proxy/BasicOperation.java b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/proxy/BasicOperation.java new file mode 100644 index 0000000000..b39eb0118e --- /dev/null +++ b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/proxy/BasicOperation.java @@ -0,0 +1,7 @@ +package com.baeldung.reflection.proxy; + +public interface BasicOperation { + int add(int a, int b); + + int sub(int a, int b); +} \ No newline at end of file diff --git a/core-java-modules/core-java-reflection-2/src/test/java/com/baeldung/reflection/proxy/DollarProxyUnitTest.java b/core-java-modules/core-java-reflection-2/src/test/java/com/baeldung/reflection/proxy/DollarProxyUnitTest.java new file mode 100644 index 0000000000..ef6c481778 --- /dev/null +++ b/core-java-modules/core-java-reflection-2/src/test/java/com/baeldung/reflection/proxy/DollarProxyUnitTest.java @@ -0,0 +1,35 @@ +package com.baeldung.reflection.proxy; + +import org.junit.Test; + +import java.lang.reflect.Proxy; +import java.util.function.Consumer; + +import static org.junit.Assert.assertTrue; + +public class DollarProxyUnitTest { + @Test + public void givenProxy_whenInvokingGetProxyClass_thenGeneratingProxyClass() { + // Java 8: -Dsun.misc.ProxyGenerator.saveGeneratedFiles=true + // Java 9 or later: -Djdk.proxy.ProxyGenerator.saveGeneratedFiles=true + // Note: System.setProperty() doesn't work here + // because ProxyGenerator.saveGeneratedFiles read its property only once. + // The @Test annotation in this method will generate a $Proxy class. + + ClassLoader classLoader = ClassLoader.getSystemClassLoader(); + Class[] interfaces = {BasicOperation.class, AdvancedOperation.class}; + Class proxyClass = Proxy.getProxyClass(classLoader, interfaces); + + boolean isProxyClass = Proxy.isProxyClass(proxyClass); + assertTrue(isProxyClass); + } + + @Test + public void givenReflection_whenReadingAnnotation_thenGeneratingProxyClass() { + FunctionalInterface instance = Consumer.class.getDeclaredAnnotation(FunctionalInterface.class); + Class clazz = instance.getClass(); + + boolean isProxyClass = Proxy.isProxyClass(clazz); + assertTrue(isProxyClass); + } +} From aed8f9100b83c37221c966dc235cd49a9fd7ff6a Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sun, 8 May 2022 16:36:25 +0530 Subject: [PATCH 168/278] JAVA-11792: Fix formatting of POMs --- apache-poi-2/pom.xml | 7 +- aws-modules/aws-s3/pom.xml | 3 +- aws-modules/pom.xml | 2 +- .../core-java-exceptions-3/pom.xml | 4 +- .../core-java-exceptions-4/pom.xml | 4 +- core-java-modules/core-java-uuid/pom.xml | 1 - .../multi-module-caching/core/pom.xml | 5 +- .../multi-module-caching/pom.xml | 16 +- .../multi-module-caching/runner/pom.xml | 5 +- .../single-module-caching/pom.xml | 6 +- docker/docker-internal-dto/pom.xml | 6 +- docker/docker-sample-app/pom.xml | 23 +- docker/docker-spring-boot-postgres/pom.xml | 68 ++-- docker/docker-spring-boot/pom.xml | 21 +- docker/heap-sizing/pom.xml | 3 +- docker/pom.xml | 13 +- feign/pom.xml | 10 +- graphql/graphql-error-handling/pom.xml | 15 +- graphql/graphql-java/pom.xml | 8 +- graphql/graphql-spqr/pom.xml | 1 + jakarta-ee/pom.xml | 5 - jib/pom.xml | 1 + libraries-3/pom.xml | 6 +- .../empty-phase/pom.xml | 2 +- .../disable-plugin-examples/pom.xml | 30 +- .../maven-simple/parent-project/core/pom.xml | 1 + .../maven-simple/parent-project/pom.xml | 1 + .../parent-project/webapp/pom.xml | 2 +- maven-modules/pom.xml | 4 +- muleesb/pom.xml | 7 +- .../hibernate-annotations/pom.xml | 4 +- persistence-modules/hibernate-queries/pom.xml | 9 +- persistence-modules/java-mongodb-2/pom.xml | 2 +- persistence-modules/pom.xml | 2 +- spring-boot-modules/pom.xml | 6 +- .../spring-boot-artifacts/pom.xml | 6 +- spring-boot-modules/spring-boot-mvc-4/pom.xml | 8 +- .../pom.xml | 31 +- .../spring-boot-validation/pom.xml | 2 +- spring-cloud/pom.xml | 2 +- spring-reactive/pom.xml | 2 - spring-roo/pom.xml | 368 +++++++++--------- .../spring-security-opa/pom.xml | 93 +++-- .../spring-security-web-boot-3/pom.xml | 6 +- .../spring-security-web-login/pom.xml | 12 +- .../pom.xml | 1 - .../pom.xml | 1 - .../pom.xml | 3 - .../spring-swagger-codegen-api-client/pom.xml | 3 - .../spring-resttemplate/pom.xml | 14 +- testing-modules/junit-5-basics/pom.xml | 10 +- testing-modules/testng-command-line/pom.xml | 5 +- 52 files changed, 418 insertions(+), 452 deletions(-) diff --git a/apache-poi-2/pom.xml b/apache-poi-2/pom.xml index 30270cd7be..af959292fa 100644 --- a/apache-poi-2/pom.xml +++ b/apache-poi-2/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 apache-poi-2 0.0.1-SNAPSHOT @@ -25,5 +25,4 @@ 5.2.0 - - + \ No newline at end of file diff --git a/aws-modules/aws-s3/pom.xml b/aws-modules/aws-s3/pom.xml index 65ad6f27f8..e7e04782b1 100644 --- a/aws-modules/aws-s3/pom.xml +++ b/aws-modules/aws-s3/pom.xml @@ -20,7 +20,6 @@ aws-java-sdk ${aws-java-sdk.version} - commons-io commons-io @@ -58,7 +57,7 @@ -
    + 1.11.290 diff --git a/aws-modules/pom.xml b/aws-modules/pom.xml index 4bdffa789a..3c5459d46c 100644 --- a/aws-modules/pom.xml +++ b/aws-modules/pom.xml @@ -19,6 +19,6 @@ aws-miscellaneous aws-reactive aws-s3 - + \ No newline at end of file diff --git a/core-java-modules/core-java-exceptions-3/pom.xml b/core-java-modules/core-java-exceptions-3/pom.xml index 455f769757..7eaa57edf1 100644 --- a/core-java-modules/core-java-exceptions-3/pom.xml +++ b/core-java-modules/core-java-exceptions-3/pom.xml @@ -32,8 +32,8 @@ 3.8.1 - - + + diff --git a/core-java-modules/core-java-exceptions-4/pom.xml b/core-java-modules/core-java-exceptions-4/pom.xml index cc81fdc40b..e9a2d05180 100644 --- a/core-java-modules/core-java-exceptions-4/pom.xml +++ b/core-java-modules/core-java-exceptions-4/pom.xml @@ -32,8 +32,8 @@ 3.8.1 - - + + diff --git a/core-java-modules/core-java-uuid/pom.xml b/core-java-modules/core-java-uuid/pom.xml index 28519a1a68..7d851292f5 100644 --- a/core-java-modules/core-java-uuid/pom.xml +++ b/core-java-modules/core-java-uuid/pom.xml @@ -35,7 +35,6 @@ true - org.apache.maven.plugins diff --git a/docker/docker-caching/multi-module-caching/core/pom.xml b/docker/docker-caching/multi-module-caching/core/pom.xml index eeeb5a6e5b..bcfc4b5783 100644 --- a/docker/docker-caching/multi-module-caching/core/pom.xml +++ b/docker/docker-caching/multi-module-caching/core/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 core @@ -22,4 +22,5 @@ 8 8 + \ No newline at end of file diff --git a/docker/docker-caching/multi-module-caching/pom.xml b/docker/docker-caching/multi-module-caching/pom.xml index 7968114385..e02ced2dca 100644 --- a/docker/docker-caching/multi-module-caching/pom.xml +++ b/docker/docker-caching/multi-module-caching/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung multi-module-caching @@ -8,6 +9,11 @@ Multi-module Maven caching example pom + + runner + core + + @@ -22,8 +28,4 @@ 1.8 - - runner - core - - + \ No newline at end of file diff --git a/docker/docker-caching/multi-module-caching/runner/pom.xml b/docker/docker-caching/multi-module-caching/runner/pom.xml index e3654bff17..e3f234bac0 100644 --- a/docker/docker-caching/multi-module-caching/runner/pom.xml +++ b/docker/docker-caching/multi-module-caching/runner/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 runner @@ -53,4 +53,5 @@ 8 8 + \ No newline at end of file diff --git a/docker/docker-caching/single-module-caching/pom.xml b/docker/docker-caching/single-module-caching/pom.xml index 386b040138..74bb477fb2 100644 --- a/docker/docker-caching/single-module-caching/pom.xml +++ b/docker/docker-caching/single-module-caching/pom.xml @@ -1,9 +1,8 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + 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 single-module-caching 1.0-SNAPSHOT @@ -50,4 +49,5 @@ 8 8 + \ No newline at end of file diff --git a/docker/docker-internal-dto/pom.xml b/docker/docker-internal-dto/pom.xml index 55cef257fe..09013d2fc3 100644 --- a/docker/docker-internal-dto/pom.xml +++ b/docker/docker-internal-dto/pom.xml @@ -3,13 +3,13 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 + docker-internal-dto + docker-internal-dto + com.baeldung.docker docker 0.0.1 - docker-internal-dto - docker-internal-dto - diff --git a/docker/docker-sample-app/pom.xml b/docker/docker-sample-app/pom.xml index 6841fabcee..24fede56fd 100644 --- a/docker/docker-sample-app/pom.xml +++ b/docker/docker-sample-app/pom.xml @@ -1,21 +1,18 @@ - + 4.0.0 + docker-sample-app + docker-sample-app + Demo project for Spring Boot and Docker + com.baeldung.docker docker 0.0.1 - docker-sample-app - docker-sample-app - Demo project for Spring Boot and Docker - - - 11 - - org.springframework.boot @@ -42,4 +39,8 @@ - + + 11 + + + \ No newline at end of file diff --git a/docker/docker-spring-boot-postgres/pom.xml b/docker/docker-spring-boot-postgres/pom.xml index d08ae130db..7a4ed1db3c 100644 --- a/docker/docker-spring-boot-postgres/pom.xml +++ b/docker/docker-spring-boot-postgres/pom.xml @@ -1,13 +1,14 @@ - - 4.0.0 - com.baeldung.docker - docker-spring-boot-postgres - 0.0.1-SNAPSHOT - docker-spring-boot-postgres - Demo project showing Spring Boot, PostgreSQL, and Docker - + + 4.0.0 + com.baeldung.docker + docker-spring-boot-postgres + 0.0.1-SNAPSHOT + docker-spring-boot-postgres + Demo project showing Spring Boot, PostgreSQL, and Docker + com.baeldung parent-boot-2 @@ -15,33 +16,32 @@ ../../parent-boot-2 - - - org.springframework.boot - spring-boot-starter-data-jpa - + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.postgresql + postgresql + runtime + + + org.springframework.boot + spring-boot-starter-test + test + + - - org.postgresql - postgresql - runtime - - - org.springframework.boot - spring-boot-starter-test - test - - + + + + org.springframework.boot + spring-boot-maven-plugin + + + - - - - org.springframework.boot - spring-boot-maven-plugin - - - - 11 diff --git a/docker/docker-spring-boot/pom.xml b/docker/docker-spring-boot/pom.xml index 74bd1561cf..fbc891ca2c 100644 --- a/docker/docker-spring-boot/pom.xml +++ b/docker/docker-spring-boot/pom.xml @@ -3,33 +3,26 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 + docker-spring-boot + docker-spring-boot + Demo project showing Spring Boot and Docker + com.baeldung.docker docker 0.0.1 - docker-spring-boot - - docker-spring-boot - Demo project showing Spring Boot and Docker - - - 11 - - org.springframework.boot spring-boot-starter-web - com.baeldung.docker docker-internal-dto 0.0.1 - org.springframework.boot spring-boot-starter-test @@ -58,4 +51,8 @@ - + + 11 + + + \ No newline at end of file diff --git a/docker/heap-sizing/pom.xml b/docker/heap-sizing/pom.xml index 2cc354f6cf..32c200c1c0 100644 --- a/docker/heap-sizing/pom.xml +++ b/docker/heap-sizing/pom.xml @@ -48,7 +48,6 @@ com.google.cloud.tools jib-maven-plugin 2.7.1 - heapsizing-demo-jib @@ -62,4 +61,4 @@ 11 - + \ No newline at end of file diff --git a/docker/pom.xml b/docker/pom.xml index 5c6267c6dd..d4fa8d46d7 100644 --- a/docker/pom.xml +++ b/docker/pom.xml @@ -3,14 +3,13 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.baeldung.docker docker 0.0.1 docker Demo project showing Spring Boot and Docker pom - + com.baeldung parent-boot-2 @@ -18,10 +17,6 @@ ../parent-boot-2 - - 11 - - docker-internal-dto docker-spring-boot @@ -30,4 +25,8 @@ docker-caching/multi-module-caching - + + 11 + + + \ No newline at end of file diff --git a/feign/pom.xml b/feign/pom.xml index 026afdfc7a..8fa864fa46 100644 --- a/feign/pom.xml +++ b/feign/pom.xml @@ -1,5 +1,7 @@ - + 4.0.0 com.baeldung.feign feign @@ -69,6 +71,7 @@ test + @@ -92,10 +95,8 @@ src/main/resources/users.xsd - - org.jvnet.jaxb2.maven2 maven-jaxb2-plugin @@ -111,7 +112,6 @@ *.xsd - com.baeldung.feign.soap target/generated-sources/jaxb @@ -119,6 +119,6 @@ - + \ No newline at end of file diff --git a/graphql/graphql-error-handling/pom.xml b/graphql/graphql-error-handling/pom.xml index ea1cf96a0e..92696d8ed7 100644 --- a/graphql/graphql-error-handling/pom.xml +++ b/graphql/graphql-error-handling/pom.xml @@ -1,12 +1,12 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 graphql-error-handling 1.0 - jar graphql-error-handling + jar com.baeldung.graphql @@ -19,56 +19,47 @@ org.springframework.boot spring-boot-starter-data-jpa - org.springframework.boot spring-boot-starter-web - com.graphql-java graphql-spring-boot-starter ${graphql-spring-boot-starter.version} - com.graphql-java graphql-java-tools ${graphql-java-tools.version} - org.projectlombok lombok ${lombok.version} - com.h2database h2 ${h2.version} - org.springframework.boot spring-boot-test test - com.graphql-java graphql-spring-boot-starter-test test ${graphql-spring-boot-starter.version} - org.skyscreamer jsonassert ${jsonassert.version} test - diff --git a/graphql/graphql-java/pom.xml b/graphql/graphql-java/pom.xml index 5e5bc8f648..b0b2c15359 100644 --- a/graphql/graphql-java/pom.xml +++ b/graphql/graphql-java/pom.xml @@ -85,7 +85,6 @@ httpclient ${httpclient.version} - org.mock-server mockserver-netty @@ -98,13 +97,11 @@ ${mockserver-client-java.version} test - com.graphql-java graphql-java-extended-scalars ${graphql-java-extended-scalars.version} - @@ -155,14 +152,11 @@ 1.9.0 0.5.0 4.5.13 - 5.13.2 5.13.2 - 10.0.7 - 1.18 2022-04-06T00-10-27-a70541e - + \ No newline at end of file diff --git a/graphql/graphql-spqr/pom.xml b/graphql/graphql-spqr/pom.xml index ad040c1557..75a1b5d79b 100644 --- a/graphql/graphql-spqr/pom.xml +++ b/graphql/graphql-spqr/pom.xml @@ -28,4 +28,5 @@ 0.0.6 + \ No newline at end of file diff --git a/jakarta-ee/pom.xml b/jakarta-ee/pom.xml index dea4437345..afd31d7ece 100644 --- a/jakarta-ee/pom.xml +++ b/jakarta-ee/pom.xml @@ -51,25 +51,20 @@ admin password - ${local.glassfish.domain} 8080 4848 - ${project.artifactId} target/${project.build.finalName}.war - true false true - - diff --git a/jib/pom.xml b/jib/pom.xml index 8208eebdf7..bbc9a3c623 100644 --- a/jib/pom.xml +++ b/jib/pom.xml @@ -43,4 +43,5 @@ 2.5.0 + \ No newline at end of file diff --git a/libraries-3/pom.xml b/libraries-3/pom.xml index c51b264e83..d68a9e0703 100644 --- a/libraries-3/pom.xml +++ b/libraries-3/pom.xml @@ -112,7 +112,7 @@ structurizr-plantuml ${structurizr.version} - + org.immutables value ${immutables.version} @@ -177,7 +177,7 @@ - -XepExcludedPaths:(.*)/test/.*|(.*)/jcabi/.* @@ -190,7 +190,7 @@ plexus-compiler-javac-errorprone 2.8 - com.google.errorprone diff --git a/maven-modules/maven-parent-pom-resolution/disable-plugin-examples/empty-phase/pom.xml b/maven-modules/maven-parent-pom-resolution/disable-plugin-examples/empty-phase/pom.xml index 28ea8b6359..2dfa34568e 100644 --- a/maven-modules/maven-parent-pom-resolution/disable-plugin-examples/empty-phase/pom.xml +++ b/maven-modules/maven-parent-pom-resolution/disable-plugin-examples/empty-phase/pom.xml @@ -21,7 +21,7 @@ enforce-file-exists - + diff --git a/maven-modules/maven-parent-pom-resolution/disable-plugin-examples/pom.xml b/maven-modules/maven-parent-pom-resolution/disable-plugin-examples/pom.xml index 2a2e5b00ea..4d16a94838 100644 --- a/maven-modules/maven-parent-pom-resolution/disable-plugin-examples/pom.xml +++ b/maven-modules/maven-parent-pom-resolution/disable-plugin-examples/pom.xml @@ -13,7 +13,14 @@ maven-parent-pom-resolution 1.0.0-SNAPSHOT - + + + plugin-enabled + skip-parameter + phase-none + empty-phase + + @@ -27,26 +34,19 @@ enforce - - - - ${project.basedir}/src/file-that-must-exist.txt - - - + + + + ${project.basedir}/src/file-that-must-exist.txt + + + - - - plugin-enabled - skip-parameter - phase-none - empty-phase - UTF-8 diff --git a/maven-modules/maven-simple/parent-project/core/pom.xml b/maven-modules/maven-simple/parent-project/core/pom.xml index 6553889c24..2e3a6eee7d 100644 --- a/maven-modules/maven-simple/parent-project/core/pom.xml +++ b/maven-modules/maven-simple/parent-project/core/pom.xml @@ -23,4 +23,5 @@ 4.3.30.RELEASE + \ No newline at end of file diff --git a/maven-modules/maven-simple/parent-project/pom.xml b/maven-modules/maven-simple/parent-project/pom.xml index bde903b1b5..2f28eff49f 100644 --- a/maven-modules/maven-simple/parent-project/pom.xml +++ b/maven-modules/maven-simple/parent-project/pom.xml @@ -33,4 +33,5 @@ 5.3.16 + \ No newline at end of file diff --git a/maven-modules/maven-simple/parent-project/webapp/pom.xml b/maven-modules/maven-simple/parent-project/webapp/pom.xml index f6cee60cbf..ce964c222f 100644 --- a/maven-modules/maven-simple/parent-project/webapp/pom.xml +++ b/maven-modules/maven-simple/parent-project/webapp/pom.xml @@ -5,7 +5,6 @@ 4.0.0 webapp webapp - war @@ -30,4 +29,5 @@ 3.3.2 + \ No newline at end of file diff --git a/maven-modules/pom.xml b/maven-modules/pom.xml index a9fefbbf5d..253f5d9fa0 100644 --- a/maven-modules/pom.xml +++ b/maven-modules/pom.xml @@ -15,8 +15,8 @@ - animal-sniffer-mvn-plugin - maven-archetype + animal-sniffer-mvn-plugin + maven-archetype maven-copy-files maven-custom-plugin diff --git a/muleesb/pom.xml b/muleesb/pom.xml index d78cebada2..a2204c15b7 100644 --- a/muleesb/pom.xml +++ b/muleesb/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.mycompany muleesb @@ -218,4 +219,4 @@ 2.2.1 - + \ No newline at end of file diff --git a/persistence-modules/hibernate-annotations/pom.xml b/persistence-modules/hibernate-annotations/pom.xml index 023e5aa30f..48e678af43 100644 --- a/persistence-modules/hibernate-annotations/pom.xml +++ b/persistence-modules/hibernate-annotations/pom.xml @@ -16,7 +16,7 @@ - + org.springframework spring-context @@ -32,7 +32,7 @@ hibernate-core ${hibernate-core.version} - + org.hsqldb hsqldb ${hsqldb.version} diff --git a/persistence-modules/hibernate-queries/pom.xml b/persistence-modules/hibernate-queries/pom.xml index 4f5de5c06e..ff5a9fe221 100644 --- a/persistence-modules/hibernate-queries/pom.xml +++ b/persistence-modules/hibernate-queries/pom.xml @@ -14,7 +14,7 @@ - + org.springframework spring-context @@ -30,8 +30,7 @@ tomcat-dbcp ${tomcat-dbcp.version} - - + com.google.guava @@ -45,7 +44,6 @@ ${org.springframework.version} test - org.hibernate hibernate-core @@ -81,8 +79,7 @@ jmh-generator-annprocess ${jmh-generator.version} - - + 5.0.2.RELEASE diff --git a/persistence-modules/java-mongodb-2/pom.xml b/persistence-modules/java-mongodb-2/pom.xml index ffc8da0b64..9475a86bee 100644 --- a/persistence-modules/java-mongodb-2/pom.xml +++ b/persistence-modules/java-mongodb-2/pom.xml @@ -50,4 +50,4 @@ 1.5.3 - + \ No newline at end of file diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 2e7dafb472..3f9f3068b4 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -108,4 +108,4 @@ 42.2.20 - + \ No newline at end of file diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index 003a52db13..b96384e6f8 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -6,8 +6,8 @@ com.baeldung.spring-boot-modules spring-boot-modules 1.0.0-SNAPSHOT - pom spring-boot-modules + pom com.baeldung @@ -16,7 +16,7 @@ ../parent-boot-2 - + spring-boot-admin spring-boot-angular spring-boot-annotations @@ -98,4 +98,4 @@
    - + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-artifacts/pom.xml b/spring-boot-modules/spring-boot-artifacts/pom.xml index 0292dc95cf..7709c6a316 100644 --- a/spring-boot-modules/spring-boot-artifacts/pom.xml +++ b/spring-boot-modules/spring-boot-artifacts/pom.xml @@ -101,7 +101,7 @@ maven-failsafe-plugin 2.18 - integration-tests @@ -110,7 +110,7 @@ verify - **/ExternalPropertyFileLoaderIntegrationTest.java @@ -195,4 +195,4 @@ 4.5.8 - + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc-4/pom.xml b/spring-boot-modules/spring-boot-mvc-4/pom.xml index 5b58b326ab..b1c079b715 100644 --- a/spring-boot-modules/spring-boot-mvc-4/pom.xml +++ b/spring-boot-modules/spring-boot-mvc-4/pom.xml @@ -1,14 +1,13 @@ - + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-boot-mvc-4 spring-boot-mvc-4 jar Module For Spring Boot MVC Web - + com.baeldung.spring-boot-modules spring-boot-modules @@ -70,7 +69,6 @@ - 3.0.0 com.baeldung.springboot.swagger.ArticleApplication diff --git a/spring-boot-modules/spring-boot-properties-migrator-demo/pom.xml b/spring-boot-modules/spring-boot-properties-migrator-demo/pom.xml index d44a8ce6f1..95dc06b155 100644 --- a/spring-boot-modules/spring-boot-properties-migrator-demo/pom.xml +++ b/spring-boot-modules/spring-boot-properties-migrator-demo/pom.xml @@ -1,9 +1,8 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - spring-boot-properties-migrator-demo 1.0-SNAPSHOT @@ -13,18 +12,13 @@ 1.0.0-SNAPSHOT ../pom.xml - - - - - - - - - - 8 - 8 - + + + + + + + @@ -54,4 +48,9 @@ - + + 8 + 8 + + + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-validation/pom.xml b/spring-boot-modules/spring-boot-validation/pom.xml index 639a62059d..1412a57e2a 100644 --- a/spring-boot-modules/spring-boot-validation/pom.xml +++ b/spring-boot-modules/spring-boot-validation/pom.xml @@ -22,7 +22,7 @@ org.hibernate.validator hibernate-validator - + org.springframework.boot spring-boot-starter-data-jpa diff --git a/spring-cloud/pom.xml b/spring-cloud/pom.xml index 9205416cd5..f58e1aec5c 100644 --- a/spring-cloud/pom.xml +++ b/spring-cloud/pom.xml @@ -92,4 +92,4 @@ 3.1.3 - + \ No newline at end of file diff --git a/spring-reactive/pom.xml b/spring-reactive/pom.xml index 37df1a820d..396fa3ee4a 100644 --- a/spring-reactive/pom.xml +++ b/spring-reactive/pom.xml @@ -59,7 +59,6 @@ integration-lite-first - @@ -76,7 +75,6 @@ integration-lite-second - diff --git a/spring-roo/pom.xml b/spring-roo/pom.xml index ea42095d92..fa84ec9558 100644 --- a/spring-roo/pom.xml +++ b/spring-roo/pom.xml @@ -18,6 +18,190 @@ + + + + + org.springframework.roo + org.springframework.roo.annotations + ${roo.version} + pom + provided + + + io.springlets + springlets-data-jpa + ${springlets.version} + + + io.springlets + springlets-data-commons + ${springlets.version} + + + io.springlets + springlets-context + ${springlets.version} + + + org.springframework.roo + org.springframework.roo.querydsl.processor + ${querydsl-processor.version} + + + io.tracee.binding + tracee-springmvc + ${tracee.version} + + + io.springlets + springlets-boot-starter-web + ${springlets.version} + + + com.github.mxab.thymeleaf.extras + thymeleaf-extras-data-attribute + ${thymeleaf-data-dialect.version} + + + ar.com.fdvs + DynamicJasper + ${dynamicjasper.version} + + + ar.com.fdvs + DynamicJasper-core-fonts + ${dynamicjasper-fonts.version} + + + org.webjars.bower + bootstrap + ${bootstrap.version} + + + org.webjars.bower + datatables + ${datatables.version} + + + org.webjars.bower + datatables.net-bs + ${datatables-bs.version} + + + org.webjars.bower + datatables.net-buttons + ${datatables-buttons.version} + + + org.webjars.bower + datatables.net-buttons-bs + ${datatables-buttons-bs.version} + + + org.webjars.bower + datatables.net-responsive + ${datatables-responsive.version} + + + org.webjars.bower + datatables.net-responsive-bs + ${datatables-responsive-bs.version} + + + org.webjars.bower + datatables.net-select + ${datatables-select.version} + + + org.webjars.bower + datatables.net-select-bs + ${datatables-select-bs.version} + + + org.webjars.npm + jquery-datatables-checkboxes + ${datatables-checkboxes.version} + + + org.webjars.npm + jquery + + + org.webjars.npm + datatables.net + + + + + org.webjars.bower + github-com-julmot-datatables-mark-js + ${datatables-mark.version} + + + org.webjars.bower + datetimepicker + ${datetimepicker.version} + + + org.webjars.bower + font-awesome + ${fontawesome.version} + + + org.webjars.bower + jquery + ${jquery.version} + + + org.webjars + jquery.inputmask + ${jquery-inputmask.version} + + + org.webjars + jquery + + + + + org.webjars.bower + jquery-validation + ${jquery-validation.version} + + + org.webjars.bower + momentjs + ${momentjs.version} + + + org.webjars.bower + select2 + ${select2.version} + + + org.webjars.bower + select2-bootstrap-theme + ${select2-bootstrap-theme.version} + + + org.webjars + respond + ${respond.version} + + + org.webjars + html5shiv + ${html5shiv.version} + + + org.webjars.bower + ie10-viewport-bug-workaround + ${bootstrap.ie10-viewport-bug-workaround.version} + + + + @@ -404,190 +588,6 @@ - - - - - org.springframework.roo - org.springframework.roo.annotations - ${roo.version} - pom - provided - - - io.springlets - springlets-data-jpa - ${springlets.version} - - - io.springlets - springlets-data-commons - ${springlets.version} - - - io.springlets - springlets-context - ${springlets.version} - - - org.springframework.roo - org.springframework.roo.querydsl.processor - ${querydsl-processor.version} - - - io.tracee.binding - tracee-springmvc - ${tracee.version} - - - io.springlets - springlets-boot-starter-web - ${springlets.version} - - - com.github.mxab.thymeleaf.extras - thymeleaf-extras-data-attribute - ${thymeleaf-data-dialect.version} - - - ar.com.fdvs - DynamicJasper - ${dynamicjasper.version} - - - ar.com.fdvs - DynamicJasper-core-fonts - ${dynamicjasper-fonts.version} - - - org.webjars.bower - bootstrap - ${bootstrap.version} - - - org.webjars.bower - datatables - ${datatables.version} - - - org.webjars.bower - datatables.net-bs - ${datatables-bs.version} - - - org.webjars.bower - datatables.net-buttons - ${datatables-buttons.version} - - - org.webjars.bower - datatables.net-buttons-bs - ${datatables-buttons-bs.version} - - - org.webjars.bower - datatables.net-responsive - ${datatables-responsive.version} - - - org.webjars.bower - datatables.net-responsive-bs - ${datatables-responsive-bs.version} - - - org.webjars.bower - datatables.net-select - ${datatables-select.version} - - - org.webjars.bower - datatables.net-select-bs - ${datatables-select-bs.version} - - - org.webjars.npm - jquery-datatables-checkboxes - ${datatables-checkboxes.version} - - - org.webjars.npm - jquery - - - org.webjars.npm - datatables.net - - - - - org.webjars.bower - github-com-julmot-datatables-mark-js - ${datatables-mark.version} - - - org.webjars.bower - datetimepicker - ${datetimepicker.version} - - - org.webjars.bower - font-awesome - ${fontawesome.version} - - - org.webjars.bower - jquery - ${jquery.version} - - - org.webjars - jquery.inputmask - ${jquery-inputmask.version} - - - org.webjars - jquery - - - - - org.webjars.bower - jquery-validation - ${jquery-validation.version} - - - org.webjars.bower - momentjs - ${momentjs.version} - - - org.webjars.bower - select2 - ${select2.version} - - - org.webjars.bower - select2-bootstrap-theme - ${select2-bootstrap-theme.version} - - - org.webjars - respond - ${respond.version} - - - org.webjars - html5shiv - ${html5shiv.version} - - - org.webjars.bower - ie10-viewport-bug-workaround - ${bootstrap.ie10-viewport-bug-workaround.version} - - - - 2.0.0.RELEASE 8 diff --git a/spring-security-modules/spring-security-opa/pom.xml b/spring-security-modules/spring-security-opa/pom.xml index 6665c33db3..72b0574253 100644 --- a/spring-security-modules/spring-security-opa/pom.xml +++ b/spring-security-modules/spring-security-opa/pom.xml @@ -1,49 +1,48 @@ - - 4.0.0 - - com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../../parent-boot-2 - - spring-security-opa - Spring Security with OPA authorization + + 4.0.0 + spring-security-opa + Spring Security with OPA authorization + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 + + + + + org.springframework.boot + spring-boot-starter-webflux + + + org.springframework.boot + spring-boot-starter-security + + + org.projectlombok + lombok + + + com.google.guava + guava + 31.0.1-jre + + + org.springframework.boot + spring-boot-devtools + + + org.springframework.security + spring-security-test + + + org.springframework.boot + spring-boot-configuration-processor + true + + - - - org.springframework.boot - spring-boot-starter-webflux - - - - org.springframework.boot - spring-boot-starter-security - - - - org.projectlombok - lombok - - - - com.google.guava - guava - 31.0.1-jre - - - - org.springframework.boot - spring-boot-devtools - - - - org.springframework.security - spring-security-test - - - org.springframework.boot - spring-boot-configuration-processor - true - - \ No newline at end of file diff --git a/spring-security-modules/spring-security-web-boot-3/pom.xml b/spring-security-modules/spring-security-web-boot-3/pom.xml index 5da993acd9..0984c25e07 100644 --- a/spring-security-modules/spring-security-web-boot-3/pom.xml +++ b/spring-security-modules/spring-security-web-boot-3/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-security-web-boot-3 0.0.1-SNAPSHOT @@ -73,5 +74,4 @@ 3.6.0 - \ No newline at end of file diff --git a/spring-security-modules/spring-security-web-login/pom.xml b/spring-security-modules/spring-security-web-login/pom.xml index 346338cbcd..c2369abc14 100644 --- a/spring-security-modules/spring-security-web-login/pom.xml +++ b/spring-security-modules/spring-security-web-login/pom.xml @@ -118,7 +118,7 @@ runtime - + org.springframework.boot spring-boot-starter-test ${spring-boot.version} @@ -136,11 +136,11 @@ ${spring-security.version} test - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + diff --git a/spring-security-modules/spring-security-web-x509/spring-security-web-x509-basic-auth/pom.xml b/spring-security-modules/spring-security-web-x509/spring-security-web-x509-basic-auth/pom.xml index 9598843b63..12153c91f2 100644 --- a/spring-security-modules/spring-security-web-x509/spring-security-web-x509-basic-auth/pom.xml +++ b/spring-security-modules/spring-security-web-x509/spring-security-web-x509-basic-auth/pom.xml @@ -21,7 +21,6 @@ org.springframework.boot spring-boot-maven-plugin - org.apache.maven.plugins maven-surefire-plugin diff --git a/spring-security-modules/spring-security-web-x509/spring-security-web-x509-client-auth/pom.xml b/spring-security-modules/spring-security-web-x509/spring-security-web-x509-client-auth/pom.xml index f310ab1e5c..f3ea2728f2 100644 --- a/spring-security-modules/spring-security-web-x509/spring-security-web-x509-client-auth/pom.xml +++ b/spring-security-modules/spring-security-web-x509/spring-security-web-x509-client-auth/pom.xml @@ -21,7 +21,6 @@ org.springframework.boot spring-boot-maven-plugin - org.apache.maven.plugins maven-surefire-plugin diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/pom.xml b/spring-swagger-codegen/spring-openapi-generator-api-client/pom.xml index 2afde0b07d..f125018fb0 100644 --- a/spring-swagger-codegen/spring-openapi-generator-api-client/pom.xml +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/pom.xml @@ -9,13 +9,11 @@ jar https://github.com/openapitools/openapi-generator OpenAPI Java - scm:git:git@github.com:openapitools/openapi-generator.git scm:git:git@github.com:openapitools/openapi-generator.git https://github.com/openapitools/openapi-generator - Unlicense @@ -23,7 +21,6 @@ repo - OpenAPI-Generator Contributors diff --git a/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml b/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml index 66e9d1dda2..c9ba912feb 100644 --- a/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml +++ b/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml @@ -8,13 +8,11 @@ jar https://github.com/swagger-api/swagger-codegen Swagger Java - scm:git:git@github.com:swagger-api/swagger-codegen.git scm:git:git@github.com:swagger-api/swagger-codegen.git https://github.com/swagger-api/swagger-codegen - Unlicense @@ -22,7 +20,6 @@ repo - Swagger diff --git a/spring-web-modules/spring-resttemplate/pom.xml b/spring-web-modules/spring-resttemplate/pom.xml index e5a8ba5ea9..4abaac5628 100644 --- a/spring-web-modules/spring-resttemplate/pom.xml +++ b/spring-web-modules/spring-resttemplate/pom.xml @@ -37,12 +37,12 @@ org.springframework.boot spring-boot-starter-test - + au.com.dius pact-jvm-provider-junit5_2.12 ${pact.version} - - + + au.com.dius pact-jvm-consumer-junit5_2.12 ${pact.version} @@ -119,10 +119,10 @@ spring-test - org.mockito - mockito-junit-jupiter - ${mockito.version} - test + org.mockito + mockito-junit-jupiter + ${mockito.version} + test diff --git a/testing-modules/junit-5-basics/pom.xml b/testing-modules/junit-5-basics/pom.xml index e240efe514..a758d79069 100644 --- a/testing-modules/junit-5-basics/pom.xml +++ b/testing-modules/junit-5-basics/pom.xml @@ -15,12 +15,12 @@ - - org.junit.platform - junit-platform-suite - ${junit-platform.version} + + org.junit.platform + junit-platform-suite + ${junit-platform.version} test - + org.junit.jupiter junit-jupiter-migrationsupport diff --git a/testing-modules/testng-command-line/pom.xml b/testing-modules/testng-command-line/pom.xml index efc49b187d..a71238f4fb 100644 --- a/testing-modules/testng-command-line/pom.xml +++ b/testing-modules/testng-command-line/pom.xml @@ -78,7 +78,6 @@ - ExecuteTestSuite @@ -101,6 +100,7 @@ + UTF-8 1.8 @@ -112,4 +112,5 @@ 3.8.0 2.22.1 - + + \ No newline at end of file From 22d59b01933a34fb12eaa9be4cd28850982a3d6a Mon Sep 17 00:00:00 2001 From: panagiotiskakos Date: Mon, 9 May 2022 09:45:22 +0300 Subject: [PATCH 169/278] [JAVA-10597] Increased JOOQ version --- persistence-modules/spring-jooq/pom.xml | 2 +- .../jooq/introduction/CountQueryIntegrationTest.java | 9 +-------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/persistence-modules/spring-jooq/pom.xml b/persistence-modules/spring-jooq/pom.xml index c842922fe5..6a9fb0ef06 100644 --- a/persistence-modules/spring-jooq/pom.xml +++ b/persistence-modules/spring-jooq/pom.xml @@ -195,7 +195,7 @@ - 3.12.4 + 3.14.15 1.0.0 1.5 1.0.0 diff --git a/persistence-modules/spring-jooq/src/test/java/com/baeldung/jooq/introduction/CountQueryIntegrationTest.java b/persistence-modules/spring-jooq/src/test/java/com/baeldung/jooq/introduction/CountQueryIntegrationTest.java index 7edcc2cd4b..361569554c 100644 --- a/persistence-modules/spring-jooq/src/test/java/com/baeldung/jooq/introduction/CountQueryIntegrationTest.java +++ b/persistence-modules/spring-jooq/src/test/java/com/baeldung/jooq/introduction/CountQueryIntegrationTest.java @@ -2,8 +2,6 @@ package com.baeldung.jooq.introduction; import static com.baeldung.jooq.introduction.db.public_.tables.Author.AUTHOR; -import java.util.ArrayList; -import java.util.List; import org.jooq.Condition; import org.jooq.DSLContext; @@ -68,12 +66,7 @@ public class CountQueryIntegrationTest { @Test public void givenValidData_whenFetchCountWithMultipleConditions_thenSucceed() { - Condition firstCond = AUTHOR.FIRST_NAME.equalIgnoreCase("Bryan"); - Condition secondCond = AUTHOR.ID.notEqual(1); - List conditions = new ArrayList<>(); - conditions.add(firstCond); - conditions.add(secondCond); - int count = dsl.fetchCount(AUTHOR, conditions); + int count = dsl.fetchCount(AUTHOR, AUTHOR.FIRST_NAME.equalIgnoreCase("Bryan").and(AUTHOR.ID.notEqual(1))); Assert.assertEquals(1, count); } From 1cc8a0a4d1088f779c2282150f9b87a7cce55531 Mon Sep 17 00:00:00 2001 From: panagiotiskakos Date: Mon, 9 May 2022 12:26:15 +0300 Subject: [PATCH 170/278] [JAVA-11770] Using properties for maven plugin --- aws-modules/aws-miscellaneous/pom.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/aws-modules/aws-miscellaneous/pom.xml b/aws-modules/aws-miscellaneous/pom.xml index 08e4e36c73..888a2a561f 100644 --- a/aws-modules/aws-miscellaneous/pom.xml +++ b/aws-modules/aws-miscellaneous/pom.xml @@ -81,7 +81,7 @@ org.apache.maven.plugins maven-dependency-plugin - 3.1.1 + ${maven-plugins-version} copy @@ -118,6 +118,7 @@ 1.10.L001 0.9.4.0006L 3.0.0 + 3.1.1 \ No newline at end of file From 78807f6d1a82fa5336140e20157f1b9b60b5f826 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Mon, 9 May 2022 20:56:15 +0530 Subject: [PATCH 171/278] JAVA-11367 Update article - Setting the MySQL JDBC Timezone --- persistence-modules/spring-boot-mysql/pom.xml | 2 +- .../spring-boot-mysql/src/main/resources/application.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/spring-boot-mysql/pom.xml b/persistence-modules/spring-boot-mysql/pom.xml index ed3f7d9279..239378c7b1 100644 --- a/persistence-modules/spring-boot-mysql/pom.xml +++ b/persistence-modules/spring-boot-mysql/pom.xml @@ -39,7 +39,7 @@ - 8.0.12 + 8.0.23 \ No newline at end of file diff --git a/persistence-modules/spring-boot-mysql/src/main/resources/application.yml b/persistence-modules/spring-boot-mysql/src/main/resources/application.yml index 5404555d49..f660ab4759 100644 --- a/persistence-modules/spring-boot-mysql/src/main/resources/application.yml +++ b/persistence-modules/spring-boot-mysql/src/main/resources/application.yml @@ -1,6 +1,6 @@ spring: datasource: - url: jdbc:mysql://localhost:3306/test?useLegacyDatetimeCode=false + url: jdbc:mysql://localhost:3306/test? username: root password: @@ -9,6 +9,6 @@ spring: ddl-auto: update properties: hibernate: - dialect: org.hibernate.dialect.MySQL5Dialect + dialect: org.hibernate.dialect.MySQL8Dialect jdbc: time_zone: UTC \ No newline at end of file From 81b95583428d4f8b8b508e269e6c76d8c14fd65d Mon Sep 17 00:00:00 2001 From: Mayank Aggarwal Date: Tue, 10 May 2022 00:34:56 +0530 Subject: [PATCH 172/278] BAEL-5558: Sorting By Date in Java (#12132) * [BAEL-5438] Added Criteria Queries for Employee * [BAEL-5558] Sorting By Date in Java * BAEL-5558: Added and refactored tests name * [BAEL-5558] Refactored the code. * [BAEL-5558] Resolved PMD violation. Co-authored-by: Mayank Agarwal --- .../core-java-collections-4/pom.xml | 8 + .../collections/sorting/Employee.java | 72 +++++++++ .../EmployeeSortingByDateUnitTest.java | 146 ++++++++++++++++++ .../EmployeeCriteriaIntegrationTest.java | 1 - 4 files changed, 226 insertions(+), 1 deletion(-) create mode 100644 core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/Employee.java create mode 100644 core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/sorting/EmployeeSortingByDateUnitTest.java diff --git a/core-java-modules/core-java-collections-4/pom.xml b/core-java-modules/core-java-collections-4/pom.xml index 2193b5118a..68d7df66d0 100644 --- a/core-java-modules/core-java-collections-4/pom.xml +++ b/core-java-modules/core-java-collections-4/pom.xml @@ -14,4 +14,12 @@ 0.0.1-SNAPSHOT + + + commons-lang + commons-lang + 2.2 + + + \ No newline at end of file diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/Employee.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/Employee.java new file mode 100644 index 0000000000..d41ad54295 --- /dev/null +++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/Employee.java @@ -0,0 +1,72 @@ +package com.baeldung.collections.sorting; + +import java.util.Date; + +public class Employee implements Comparable{ + + private String name; + private int age; + private double salary; + private Date joiningDate; + + public Employee(String name, int age, double salary, Date joiningDate) { + this.name = name; + this.age = age; + this.salary = salary; + this.joiningDate = joiningDate; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public double getSalary() { + return salary; + } + + public void setSalary(double salary) { + this.salary = salary; + } + + public Date getJoiningDate() { + return joiningDate; + } + + public void setJoiningDate(Date joiningDate) { + this.joiningDate = joiningDate; + } + + @Override + public boolean equals(Object obj) { + return ((Employee) obj).getName() + .equals(getName()); + } + + @Override + public String toString() { + return new StringBuffer().append("(") + .append(getName()).append(",") + .append(getAge()) + .append(",") + .append(getSalary()).append(",").append(getJoiningDate()) + .append(")") + .toString(); + } + + @Override + public int compareTo(Employee employee) { + return getJoiningDate().compareTo(employee.getJoiningDate()); + } +} diff --git a/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/sorting/EmployeeSortingByDateUnitTest.java b/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/sorting/EmployeeSortingByDateUnitTest.java new file mode 100644 index 0000000000..b8acb789a6 --- /dev/null +++ b/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/sorting/EmployeeSortingByDateUnitTest.java @@ -0,0 +1,146 @@ +package com.baeldung.collections.sorting; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.List; +import org.apache.commons.lang.time.DateUtils; +import org.junit.Before; +import org.junit.Test; + +public class EmployeeSortingByDateUnitTest { + + private List employees = new ArrayList<>(); + private List employeesSortedByDateAsc = new ArrayList<>(); + private List employeesSortedByDateDesc = new ArrayList<>(); + + @Before + public void initVariables() { + + Collections.addAll(employees, + new Employee("Earl", 43, 10000, DateUtils.addMonths(new Date(), -2)), + new Employee("Frank", 33, 7000, DateUtils.addDays(new Date(), -20)), + new Employee("Steve", 26, 6000, DateUtils.addDays(new Date(), -10)), + new Employee("Jessica", 23, 4000, DateUtils.addMonths(new Date(), -6)), + new Employee("Pearl", 33, 6000, DateUtils.addYears(new Date(), -1)), + new Employee("John", 23, 5000, new Date()) + ); + + Collections.addAll(employeesSortedByDateDesc, + new Employee("John", 23, 5000, new Date()), + new Employee("Steve", 26, 6000, DateUtils.addDays(new Date(), -10)), + new Employee("Frank", 33, 7000, DateUtils.addDays(new Date(), -20)), + new Employee("Earl", 43, 10000, DateUtils.addMonths(new Date(), -2)), + new Employee("Jessica", 23, 4000, DateUtils.addMonths(new Date(), -6)), + new Employee("Pearl", 33, 6000, DateUtils.addYears(new Date(), -1)) + ); + + Collections.addAll(employeesSortedByDateAsc, + new Employee("Pearl", 33, 6000, DateUtils.addYears(new Date(), -1)), + new Employee("Jessica", 23, 4000, DateUtils.addMonths(new Date(), -6)), + new Employee("Earl", 43, 10000, DateUtils.addMonths(new Date(), -2)), + new Employee("Frank", 33, 7000, DateUtils.addDays(new Date(), -20)), + new Employee("Steve", 26, 6000, DateUtils.addDays(new Date(), -10)), + new Employee("John", 23, 5000, new Date()) + ); + } + + @Test + public void givenEmpList_SortEmpList_thenSortedListinNaturalOrder() { + Collections.sort(employees); + + assertEquals(employees, employeesSortedByDateAsc); + } + + @Test + public void givenEmpList_SortEmpList_thenCheckSortedList() { + + Collections.sort(employees, new Comparator() { + public int compare(Employee o1, Employee o2) { + return o1.getJoiningDate().compareTo(o2.getJoiningDate()); + } + }); + + assertEquals(employees, employeesSortedByDateAsc); + } + + @Test + public void givenEmpList_SortEmpList_thenCheckSortedListV1() { + + Collections.sort(employees, new Comparator() { + public int compare(Employee emp1, Employee emp2) { + if (emp1.getJoiningDate() == null || emp2.getJoiningDate() == null) + return 0; + return emp1.getJoiningDate().compareTo(emp2.getJoiningDate()); + } + }); + + assertEquals(employees, employeesSortedByDateAsc); + } + + @Test + public void givenEmpList_SortEmpList_thenSortedListinAscOrder() { + Collections.sort(employees, Collections.reverseOrder()); + + assertEquals(employees, employeesSortedByDateDesc); + } + + @Test + public void givenEmpList_SortEmpList_thenCheckSortedListAsc() { + + Collections.sort(employees, new Comparator() { + public int compare(Employee emp1, Employee emp2) { + return emp2.getJoiningDate().compareTo(emp1.getJoiningDate()); + } + }); + + assertEquals(employees, employeesSortedByDateDesc); + } + + @Test + public void givenEmpList_SortEmpList_thenCheckSortedListAscV1() { + + Collections.sort(employees, new Comparator() { + public int compare(Employee emp1, Employee emp2) { + if (emp1.getJoiningDate() == null || emp2.getJoiningDate() == null) + return 0; + return emp2.getJoiningDate().compareTo(emp1.getJoiningDate()); + } + }); + + assertEquals(employees, employeesSortedByDateDesc); + } + + @Test + public void givenEmpList_SortEmpList_thenCheckSortedListDescLambda() { + + Collections.sort(employees, + (emp1, emp2) -> emp2.getJoiningDate().compareTo(emp1.getJoiningDate())); + + assertEquals(employees, employeesSortedByDateDesc); + } + + @Test + public void givenEmpList_SortEmpList_thenCheckSortedListDescLambdaV1() { + + Collections.sort(employees, (emp1, emp2) -> { + if (emp1.getJoiningDate() == null || emp2.getJoiningDate() == null) + return 0; + return emp2.getJoiningDate().compareTo(emp1.getJoiningDate()); + }); + + assertEquals(employees, employeesSortedByDateDesc); + } + + @Test + public void givenEmpList_SortEmpList_thenCheckSortedListAscLambda() { + Collections.sort(employees, + Comparator.comparing(Employee::getJoiningDate)); + assertEquals(employees, employeesSortedByDateAsc); + } + +} diff --git a/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/criteria/EmployeeCriteriaIntegrationTest.java b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/criteria/EmployeeCriteriaIntegrationTest.java index 61f54aaea8..4553bf398c 100644 --- a/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/criteria/EmployeeCriteriaIntegrationTest.java +++ b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/criteria/EmployeeCriteriaIntegrationTest.java @@ -32,5 +32,4 @@ public class EmployeeCriteriaIntegrationTest { session.close(); assertArrayEquals(expectedSortCritEmployeeList.toArray(), employeeCriteriaQueries.getAllEmployees().toArray()); } - } From 6de9954c286432753edf96163af781aeb79fac92 Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Tue, 10 May 2022 05:47:26 +0500 Subject: [PATCH 173/278] Updated README.md added link back to the article: https://www.baeldung.com/spring-injecting-all-annotated-beans --- spring-di-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-di-3/README.md b/spring-di-3/README.md index 4246069616..3ddd720af5 100644 --- a/spring-di-3/README.md +++ b/spring-di-3/README.md @@ -6,4 +6,5 @@ This module contains articles about dependency injection with Spring - [@Lookup Annotation in Spring](https://www.baeldung.com/spring-lookup) - [Spring @Autowired Field Null – Common Causes and Solutions](https://www.baeldung.com/spring-autowired-field-null) +- [Finding All Beans with a Custom Annotation](https://www.baeldung.com/spring-injecting-all-annotated-beans) - More articles: [[<-- prev]](../spring-di-2) From 17106eb651c263c205096bc5708c90f0068821ab Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Tue, 10 May 2022 05:54:15 +0500 Subject: [PATCH 174/278] Updated README.md added link back to the article: https://www.baeldung.com/spark-dataframes --- apache-spark/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apache-spark/README.md b/apache-spark/README.md index 3a2d2f4e15..862626988b 100644 --- a/apache-spark/README.md +++ b/apache-spark/README.md @@ -9,3 +9,4 @@ This module contains articles about Apache Spark - [Machine Learning with Spark MLlib](https://www.baeldung.com/spark-mlib-machine-learning) - [Introduction to Spark Graph Processing with GraphFrames](https://www.baeldung.com/spark-graph-graphframes) - [Apache Spark: Differences between Dataframes, Datasets and RDDs](https://www.baeldung.com/java-spark-dataframe-dataset-rdd) +- [Spark DataFrame](https://www.baeldung.com/spark-dataframes) From e4271c648b2583eb138ba70ecef398339d9373fe Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Tue, 10 May 2022 06:00:05 +0500 Subject: [PATCH 175/278] Updated README.md added link back to the article: https://www.baeldung.com/ops/docker-push-image-to-private-repository --- docker/docker-push-to-private-repo/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docker/docker-push-to-private-repo/README.md b/docker/docker-push-to-private-repo/README.md index e320af31b4..61fe00e016 100644 --- a/docker/docker-push-to-private-repo/README.md +++ b/docker/docker-push-to-private-repo/README.md @@ -1 +1,3 @@ -### Relevant Articles: \ No newline at end of file +### Relevant Articles: + +- [Pushing a Docker Image to a Private Repository](https://www.baeldung.com/ops/docker-push-image-to-private-repository) From 05772eb51928f2b0b48523add5b4b704d4865111 Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Tue, 10 May 2022 06:12:49 +0500 Subject: [PATCH 176/278] Updated README.md added a link back to the article: https://www.baeldung.com/java-equals-method-operator-difference --- core-java-modules/core-java-lang-5/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core-java-modules/core-java-lang-5/README.md b/core-java-modules/core-java-lang-5/README.md index 012f4edc51..8920e9c231 100644 --- a/core-java-modules/core-java-lang-5/README.md +++ b/core-java-modules/core-java-lang-5/README.md @@ -2,4 +2,6 @@ This module contains articles about core features in the Java language -## TODO ## +### Relevant Articles: + +- [Difference Between == and equals() in Java](https://www.baeldung.com/java-equals-method-operator-difference) From 0fce3b833a9069273ed6851db913908bdf4ec28b Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Tue, 10 May 2022 06:19:26 +0500 Subject: [PATCH 177/278] Updated README.md added link back to the article: https://www.baeldung.com/java-swap-two-variables --- core-java-modules/core-java-lang-math-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-lang-math-3/README.md b/core-java-modules/core-java-lang-math-3/README.md index 1dd3a3c7e0..3ddaddae39 100644 --- a/core-java-modules/core-java-lang-math-3/README.md +++ b/core-java-modules/core-java-lang-math-3/README.md @@ -5,4 +5,5 @@ ### Relevant articles: - [Evaluating a Math Expression in Java](https://www.baeldung.com/java-evaluate-math-expression-string) +- [Swap Two Variables in Java](https://www.baeldung.com/java-swap-two-variables) - More articles: [[<-- Prev]](/core-java-modules/core-java-lang-math-2) From fd426982798ee88f7c35a0296522dc22c2dfcc02 Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Tue, 10 May 2022 06:27:02 +0500 Subject: [PATCH 178/278] Created/Updated README.md added link back to the article: https://www.baeldung.com/spring-security-authorization-opa --- spring-security-modules/spring-security-opa/README.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 spring-security-modules/spring-security-opa/README.md diff --git a/spring-security-modules/spring-security-opa/README.md b/spring-security-modules/spring-security-opa/README.md new file mode 100644 index 0000000000..d2c1652edb --- /dev/null +++ b/spring-security-modules/spring-security-opa/README.md @@ -0,0 +1,4 @@ + +### Relevant Articles: + +- [Spring Security Authorization with OPA](https://www.baeldung.com/spring-security-authorization-opa) From 1e2b926b8e623f07da543bae32cce54bf225fa0f Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Tue, 10 May 2022 06:36:05 +0500 Subject: [PATCH 179/278] Updated README.md added link back to the article: https://www.baeldung.com/postman-add-headers-pre-request --- spring-boot-modules/spring-boot-mvc-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-modules/spring-boot-mvc-2/README.md b/spring-boot-modules/spring-boot-mvc-2/README.md index 0d0e05daf0..30e6d71a30 100644 --- a/spring-boot-modules/spring-boot-mvc-2/README.md +++ b/spring-boot-modules/spring-boot-mvc-2/README.md @@ -11,4 +11,5 @@ This module contains articles about Spring Web MVC in Spring Boot projects. - [Testing Web APIs with Postman Collections](https://www.baeldung.com/postman-testing-collections) - [Spring Boot Consuming and Producing JSON](https://www.baeldung.com/spring-boot-json) - [Serve Static Resources with Spring](https://www.baeldung.com/spring-mvc-static-resources) +- [Add Header to Every Request in Postman](https://www.baeldung.com/postman-add-headers-pre-request) - More articles: [[prev -->]](/spring-boot-modules/spring-boot-mvc) From 4a8826ae78c4e07b0ec784dc7157eb3a1eeda0ad Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Tue, 10 May 2022 06:40:56 +0500 Subject: [PATCH 180/278] Updated README.md added link back to the article: https://www.baeldung.com/java-atomic-set-vs-lazyset --- core-java-modules/core-java-concurrency-advanced-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-concurrency-advanced-4/README.md b/core-java-modules/core-java-concurrency-advanced-4/README.md index 808db89b12..d9207644b3 100644 --- a/core-java-modules/core-java-concurrency-advanced-4/README.md +++ b/core-java-modules/core-java-concurrency-advanced-4/README.md @@ -6,3 +6,4 @@ - [Volatile Variables and Thread Safety](https://www.baeldung.com/java-volatile-variables-thread-safety) - [Producer-Consumer Problem With Example in Java](https://www.baeldung.com/java-producer-consumer-problem) - [Acquire a Lock by a Key in Java](https://www.baeldung.com/java-acquire-lock-by-key) +- [Differences Between set() and lazySet() in Java Atomic Variables](https://www.baeldung.com/java-atomic-set-vs-lazyset) From 3ba1e439cfabc5802bae54259da73a3ec29b6386 Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Tue, 10 May 2022 06:49:34 +0500 Subject: [PATCH 181/278] Updated README.md added link back to the article: https://www.baeldung.com/jpql-hql-criteria-query --- persistence-modules/spring-data-jpa-query-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/spring-data-jpa-query-3/README.md b/persistence-modules/spring-data-jpa-query-3/README.md index 246b6ebf3d..920ec40965 100644 --- a/persistence-modules/spring-data-jpa-query-3/README.md +++ b/persistence-modules/spring-data-jpa-query-3/README.md @@ -4,6 +4,7 @@ This module contains articles about querying data using Spring Data JPA. ### Relevant Articles: - [Query Entities by Dates and Times with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-query-by-date) +- [JPA and Hibernate – Criteria vs. JPQL vs. HQL Query](https://www.baeldung.com/jpql-hql-criteria-query) - More articles: [[<-- prev]](../spring-data-jpa-query-2) ### Eclipse Config From b05960761dbe50ea7dba1e2c81871451ff7a5550 Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Tue, 10 May 2022 06:49:43 +0500 Subject: [PATCH 182/278] Updated README.md added link back to the article: https://www.baeldung.com/jpql-hql-criteria-query --- persistence-modules/hibernate-queries/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/hibernate-queries/README.md b/persistence-modules/hibernate-queries/README.md index ac52e73abf..f5cba1aa6f 100644 --- a/persistence-modules/hibernate-queries/README.md +++ b/persistence-modules/hibernate-queries/README.md @@ -11,3 +11,4 @@ This module contains articles about use of Queries in Hibernate. - [Hibernate Query Plan Cache](https://www.baeldung.com/hibernate-query-plan-cache) - [Hibernate’s addScalar() Method](https://www.baeldung.com/hibernate-addscalar) - [Distinct Queries in HQL](https://www.baeldung.com/java-hql-distinct) +- [JPA and Hibernate – Criteria vs. JPQL vs. HQL Query](https://www.baeldung.com/jpql-hql-criteria-query) From d33c2ea16fa93d32fa1d0a9ac34f96944741ce3d Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Tue, 10 May 2022 06:53:47 +0500 Subject: [PATCH 183/278] Updated README.md added link back to the article: https://www.baeldung.com/java-httpclient-ssl --- core-java-modules/core-java-11-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-11-2/README.md b/core-java-modules/core-java-11-2/README.md index c42b3f0e18..ebd857886d 100644 --- a/core-java-modules/core-java-11-2/README.md +++ b/core-java-modules/core-java-11-2/README.md @@ -12,3 +12,4 @@ This module contains articles about Java 11 core features - [Java HTTPS Client Certificate Authentication](https://www.baeldung.com/java-https-client-certificate-authentication) - [Call Methods at Runtime Using Java Reflection](https://www.baeldung.com/java-method-reflection) - [Java HttpClient Basic Authentication](https://www.baeldung.com/java-httpclient-basic-auth) +- [Java HttpClient With SSL](https://www.baeldung.com/java-httpclient-ssl) From 35ba3dcd90b015fd092cc0f1847eb8a996ba8c0c Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Tue, 10 May 2022 06:57:31 +0500 Subject: [PATCH 184/278] Updated README.md added link back to the article: https://www.baeldung.com/java-iterator-vs-iterable --- core-java-modules/core-java-collections-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-2/README.md b/core-java-modules/core-java-collections-2/README.md index e5f6126811..d482ed7773 100644 --- a/core-java-modules/core-java-collections-2/README.md +++ b/core-java-modules/core-java-collections-2/README.md @@ -12,3 +12,4 @@ - [Sorting in Java](https://www.baeldung.com/java-sorting) - [Getting the Size of an Iterable in Java](https://www.baeldung.com/java-iterable-size) - [Java Null-Safe Streams from Collections](https://www.baeldung.com/java-null-safe-streams-from-collections) +- [Differences Between Iterator and Iterable and How to Use Them?](https://www.baeldung.com/java-iterator-vs-iterable) From f1008e4fe54c4c3850b0ab498a3bb58a5f8dbc5a Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Tue, 10 May 2022 07:01:26 +0500 Subject: [PATCH 185/278] Updated README.md added link back to the article: https://www.baeldung.com/spring-boot-docker-start-with-profile --- docker/docker-spring-boot/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/docker-spring-boot/README.md b/docker/docker-spring-boot/README.md index 4af9378290..0fc9d2b6b5 100644 --- a/docker/docker-spring-boot/README.md +++ b/docker/docker-spring-boot/README.md @@ -1,3 +1,4 @@ ### Relevant Articles: - [Creating Docker Images with Spring Boot](https://www.baeldung.com/spring-boot-docker-images) +- [Starting Spring Boot Application in Docker With Profile](https://www.baeldung.com/spring-boot-docker-start-with-profile) From 635f834aeaab755db99339042cdf0e582d011d06 Mon Sep 17 00:00:00 2001 From: panagiotiskakos Date: Tue, 10 May 2022 10:45:49 +0300 Subject: [PATCH 186/278] [JAVA-10597] Reverted + Enhanced test cases --- .../introduction/CountQueryIntegrationTest.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/persistence-modules/spring-jooq/src/test/java/com/baeldung/jooq/introduction/CountQueryIntegrationTest.java b/persistence-modules/spring-jooq/src/test/java/com/baeldung/jooq/introduction/CountQueryIntegrationTest.java index 361569554c..9765a26a2b 100644 --- a/persistence-modules/spring-jooq/src/test/java/com/baeldung/jooq/introduction/CountQueryIntegrationTest.java +++ b/persistence-modules/spring-jooq/src/test/java/com/baeldung/jooq/introduction/CountQueryIntegrationTest.java @@ -2,6 +2,8 @@ package com.baeldung.jooq.introduction; import static com.baeldung.jooq.introduction.db.public_.tables.Author.AUTHOR; +import java.util.ArrayList; +import java.util.List; import org.jooq.Condition; import org.jooq.DSLContext; @@ -66,10 +68,22 @@ public class CountQueryIntegrationTest { @Test public void givenValidData_whenFetchCountWithMultipleConditions_thenSucceed() { + Condition firstCond = AUTHOR.FIRST_NAME.equalIgnoreCase("Bryan"); + Condition secondCond = AUTHOR.ID.notEqual(1); + List conditions = new ArrayList<>(); + conditions.add(firstCond); + conditions.add(secondCond); + int count = dsl.fetchCount(AUTHOR, conditions); + Assert.assertEquals(1, count); + } + + + @Test + public void givenValidData_whenFetchCountWithMultipleConditionsUsingAndOperator_thenSucceed() { int count = dsl.fetchCount(AUTHOR, AUTHOR.FIRST_NAME.equalIgnoreCase("Bryan").and(AUTHOR.ID.notEqual(1))); Assert.assertEquals(1, count); } - + @Test public void givenValidData_whenFetchCountWithConditionsInVarargs_thenSucceed() { Condition firstCond = AUTHOR.FIRST_NAME.equalIgnoreCase("Bryan"); From 8e3fcaaa39b1571129629b246cc686b74e1aa710 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Tue, 10 May 2022 11:57:13 +0300 Subject: [PATCH 187/278] remove unnecesary dependency --- docker/docker-spring-boot/mvnw | 310 ----------------------------- docker/docker-spring-boot/mvnw.cmd | 182 ----------------- docker/docker-spring-boot/pom.xml | 5 - 3 files changed, 497 deletions(-) delete mode 100755 docker/docker-spring-boot/mvnw delete mode 100644 docker/docker-spring-boot/mvnw.cmd diff --git a/docker/docker-spring-boot/mvnw b/docker/docker-spring-boot/mvnw deleted file mode 100755 index a16b5431b4..0000000000 --- a/docker/docker-spring-boot/mvnw +++ /dev/null @@ -1,310 +0,0 @@ -#!/bin/sh -# ---------------------------------------------------------------------------- -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# ---------------------------------------------------------------------------- - -# ---------------------------------------------------------------------------- -# Maven Start Up Batch script -# -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir -# -# Optional ENV vars -# ----------------- -# M2_HOME - location of maven2's installed home dir -# MAVEN_OPTS - parameters passed to the Java VM when running Maven -# e.g. to debug Maven itself, use -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files -# ---------------------------------------------------------------------------- - -if [ -z "$MAVEN_SKIP_RC" ] ; then - - if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc - fi - - if [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" - fi - -fi - -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -mingw=false -case "`uname`" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - export JAVA_HOME="`/usr/libexec/java_home`" - else - export JAVA_HOME="/Library/Java/Home" - fi - fi - ;; -esac - -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=`java-config --jre-home` - fi -fi - -if [ -z "$M2_HOME" ] ; then - ## resolve links - $0 may be a link to maven's home - PRG="$0" - - # need this for relative symlinks - while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi - done - - saveddir=`pwd` - - M2_HOME=`dirname "$PRG"`/.. - - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` - - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi - -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` -fi - -# For Mingw, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" -fi - -if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then - if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" - else - javaExecutable="`readlink -f \"$javaExecutable\"`" - fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi - -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD="`which java`" - fi -fi - -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi - -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." -fi - -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher - -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { - - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 - fi - - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break - fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=`cd "$wdir/.."; pwd` - fi - # end of workaround - done - echo "${basedir}" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" - fi -} - -BASE_DIR=`find_maven_basedir "$(pwd)"` -if [ -z "$BASE_DIR" ]; then - exit 1; -fi - -########################################################################################## -# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -# This allows using the maven wrapper in projects that prohibit checking in binary data. -########################################################################################## -if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found .mvn/wrapper/maven-wrapper.jar" - fi -else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." - fi - if [ -n "$MVNW_REPOURL" ]; then - jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - else - jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - fi - while IFS="=" read key value; do - case "$key" in (wrapperUrl) jarUrl="$value"; break ;; - esac - done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" - if [ "$MVNW_VERBOSE" = true ]; then - echo "Downloading from: $jarUrl" - fi - wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" - if $cygwin; then - wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` - fi - - if command -v wget > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found wget ... using wget" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - wget "$jarUrl" -O "$wrapperJarPath" - else - wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" - fi - elif command -v curl > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found curl ... using curl" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - curl -o "$wrapperJarPath" "$jarUrl" -f - else - curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f - fi - - else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Falling back to using Java to download" - fi - javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" - # For Cygwin, switch paths to Windows format before running javac - if $cygwin; then - javaClass=`cygpath --path --windows "$javaClass"` - fi - if [ -e "$javaClass" ]; then - if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Compiling MavenWrapperDownloader.java ..." - fi - # Compiling the Java class - ("$JAVA_HOME/bin/javac" "$javaClass") - fi - if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - # Running the downloader - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Running MavenWrapperDownloader.java ..." - fi - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") - fi - fi - fi -fi -########################################################################################## -# End of extension -########################################################################################## - -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -if [ "$MVNW_VERBOSE" = true ]; then - echo $MAVEN_PROJECTBASEDIR -fi -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` -fi - -# Provide a "standardized" way to retrieve the CLI args that will -# work with both Windows and non-Windows executions. -MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" -export MAVEN_CMD_LINE_ARGS - -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -exec "$JAVACMD" \ - $MAVEN_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/docker/docker-spring-boot/mvnw.cmd b/docker/docker-spring-boot/mvnw.cmd deleted file mode 100644 index c8d43372c9..0000000000 --- a/docker/docker-spring-boot/mvnw.cmd +++ /dev/null @@ -1,182 +0,0 @@ -@REM ---------------------------------------------------------------------------- -@REM Licensed to the Apache Software Foundation (ASF) under one -@REM or more contributor license agreements. See the NOTICE file -@REM distributed with this work for additional information -@REM regarding copyright ownership. The ASF licenses this file -@REM to you under the Apache License, Version 2.0 (the -@REM "License"); you may not use this file except in compliance -@REM with the License. You may obtain a copy of the License at -@REM -@REM https://www.apache.org/licenses/LICENSE-2.0 -@REM -@REM Unless required by applicable law or agreed to in writing, -@REM software distributed under the License is distributed on an -@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -@REM KIND, either express or implied. See the License for the -@REM specific language governing permissions and limitations -@REM under the License. -@REM ---------------------------------------------------------------------------- - -@REM ---------------------------------------------------------------------------- -@REM Maven Start Up Batch script -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir -@REM -@REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files -@REM ---------------------------------------------------------------------------- - -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM set title of command window -title %0 -@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - -FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B -) - -@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -@REM This allows using the maven wrapper in projects that prohibit checking in binary data. -if exist %WRAPPER_JAR% ( - if "%MVNW_VERBOSE%" == "true" ( - echo Found %WRAPPER_JAR% - ) -) else ( - if not "%MVNW_REPOURL%" == "" ( - SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - ) - if "%MVNW_VERBOSE%" == "true" ( - echo Couldn't find %WRAPPER_JAR%, downloading it ... - echo Downloading from: %DOWNLOAD_URL% - ) - - powershell -Command "&{"^ - "$webclient = new-object System.Net.WebClient;"^ - "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ - "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ - "}"^ - "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ - "}" - if "%MVNW_VERBOSE%" == "true" ( - echo Finished downloading %WRAPPER_JAR% - ) -) -@REM End of extension - -@REM Provide a "standardized" way to retrieve the CLI args that will -@REM work with both Windows and non-Windows executions. -set MAVEN_CMD_LINE_ARGS=%* - -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%" == "on" pause - -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% - -exit /B %ERROR_CODE% diff --git a/docker/docker-spring-boot/pom.xml b/docker/docker-spring-boot/pom.xml index fbc891ca2c..c42f7602b4 100644 --- a/docker/docker-spring-boot/pom.xml +++ b/docker/docker-spring-boot/pom.xml @@ -18,11 +18,6 @@ org.springframework.boot spring-boot-starter-web - - com.baeldung.docker - docker-internal-dto - 0.0.1 - org.springframework.boot spring-boot-starter-test From 32f4f7d81dc1ef4ba015cbb556f051bc0ea36291 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Tue, 10 May 2022 20:13:31 +0530 Subject: [PATCH 188/278] Update README.md (#12194) --- reactive-systems/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactive-systems/README.md b/reactive-systems/README.md index b23f4e4dc4..65d4b0a919 100644 --- a/reactive-systems/README.md +++ b/reactive-systems/README.md @@ -1,6 +1,6 @@ ## Reactive Systems in Java -This module contains services for article about reactive systems in Java. Please note that these secrives comprise parts of a full stack application to demonstrate the capabilities of a reactive system. Unless there is an article which extends on this concept, this is probably not a suitable module to add other code. +This module contains services for article about reactive systems in Java. Please note that these services comprise parts of a full stack application to demonstrate the capabilities of a reactive system. Unless there is an article which extends on this concept, this is probably not a suitable module to add other code. ### Relevant Articles From 40214dbc4d513db321d692fb904c646890774918 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Tue, 10 May 2022 15:44:57 +0100 Subject: [PATCH 189/278] [JAVA-10581] Changed PII data to placeholders (#12174) * [JAVA-10581] Changed PII data to placeholders * [JAVA-10581] More intuitive properties * [JAVA-10581] More intuitive properties Co-authored-by: panagiotiskakos --- maven-modules/host-maven-repo-example/pom.xml | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/maven-modules/host-maven-repo-example/pom.xml b/maven-modules/host-maven-repo-example/pom.xml index bd58dddeda..ee6929de91 100644 --- a/maven-modules/host-maven-repo-example/pom.xml +++ b/maven-modules/host-maven-repo-example/pom.xml @@ -6,11 +6,11 @@ com.baeldung.maven.plugin host-maven-repo-example 1.0-SNAPSHOT - https://github.com/sgrverma23/host-maven-repo-example.git + https://github.com/${repository-owner}/${repository-name}.git - https://github.com/sgrverma23/host-maven-repo-example.git - scm:git:git@github.com:sgrverma23/host-maven-repo-example.git - scm:git:git@github.com:sgrverma23/host-maven-repo-example.git + https://github.com/${repository-owner}/${repository-name}.git + scm:git:git@github.com:${repository-owner}/${repository-name}.git + scm:git:git@github.com:${repository-owner}/${repository-name}.git @@ -43,13 +43,13 @@ Maven artifacts for ${project.version} true ${project.build.directory} - refs/heads/main + refs/heads/${branch-name} **/* true - host-maven-repo-example - sgrverma23 + ${repository-name} + ${repository-owner} github @@ -89,7 +89,7 @@ PROJECT-REPO-URL - https://github.com/sgrverma23/host-maven-repo-example/main + https://github.com/{repository-owner}/${repository-name}/${branch-name} true always @@ -98,6 +98,10 @@ + + Put-repo-owner + Put-repository-name + Put-branch-name github 8 8 From fe96f9747f884a2b60e0152fcf519cda08adbf4f Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Tue, 10 May 2022 22:50:02 +0530 Subject: [PATCH 190/278] Update pom.xml (#12196) --- maven-modules/host-maven-repo-example/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/maven-modules/host-maven-repo-example/pom.xml b/maven-modules/host-maven-repo-example/pom.xml index ee6929de91..20528853cd 100644 --- a/maven-modules/host-maven-repo-example/pom.xml +++ b/maven-modules/host-maven-repo-example/pom.xml @@ -89,7 +89,7 @@ PROJECT-REPO-URL - https://github.com/{repository-owner}/${repository-name}/${branch-name} + https://github.com/${repository-owner}/${repository-name}/${branch-name} true always @@ -107,4 +107,4 @@ 8 - \ No newline at end of file + From f24b9af096aa74ca2a6bc816400f90f33174ad6a Mon Sep 17 00:00:00 2001 From: Daniel Strmecki Date: Wed, 11 May 2022 09:57:02 +0200 Subject: [PATCH 191/278] Bael 5481 java httpclient post (#12118) * BAEL-5481: Create new module * BAEL-5481: Sync and async example * BAEL-5481: Concurrent example * BAEL-5481: Concurrent example * BAEL-5481: JSON body example * BAEL-5481: Form data example * BAEL-5481: File upload example * BAEL-5481: PR comments + Jenkins * BAEL-5481: Update aftifact ID * BAEL-5481: Spaces --- .../core-java-httpclient/README.md | 6 + .../core-java-httpclient/pom.xml | 58 +++++++ .../baeldung/httpclient/HttpClientPost.java | 162 ++++++++++++++++++ .../httpclient/HttpClientPostUnitTest.java | 99 +++++++++++ .../httpclient/PostRequestMockServer.java | 61 +++++++ pom.xml | 1 + 6 files changed, 387 insertions(+) create mode 100644 core-java-modules/core-java-httpclient/README.md create mode 100644 core-java-modules/core-java-httpclient/pom.xml create mode 100644 core-java-modules/core-java-httpclient/src/main/java/com/baeldung/httpclient/HttpClientPost.java create mode 100644 core-java-modules/core-java-httpclient/src/test/java/com/baeldung/httpclient/HttpClientPostUnitTest.java create mode 100644 core-java-modules/core-java-httpclient/src/test/java/com/baeldung/httpclient/PostRequestMockServer.java diff --git a/core-java-modules/core-java-httpclient/README.md b/core-java-modules/core-java-httpclient/README.md new file mode 100644 index 0000000000..24ff7d9941 --- /dev/null +++ b/core-java-modules/core-java-httpclient/README.md @@ -0,0 +1,6 @@ +## Java HttpClient + +This module contains articles about Java HttpClient + +### Relevant articles +- TODO diff --git a/core-java-modules/core-java-httpclient/pom.xml b/core-java-modules/core-java-httpclient/pom.xml new file mode 100644 index 0000000000..57b23e96c1 --- /dev/null +++ b/core-java-modules/core-java-httpclient/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + core-java-httpclient + 0.1.0-SNAPSHOT + core-java-httpclient + jar + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + ../../pom.xml + + + + + org.mock-server + mockserver-netty + ${mockserver.version} + + + org.mock-server + mockserver-client-java + ${mockserver.version} + + + org.assertj + assertj-core + ${assertj.version} + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${maven.compiler.source.version} + ${maven.compiler.target.version} + + + + + + + 11 + 11 + 3.22.0 + 5.11.2 + + + \ No newline at end of file diff --git a/core-java-modules/core-java-httpclient/src/main/java/com/baeldung/httpclient/HttpClientPost.java b/core-java-modules/core-java-httpclient/src/main/java/com/baeldung/httpclient/HttpClientPost.java new file mode 100644 index 0000000000..d08a7bf183 --- /dev/null +++ b/core-java-modules/core-java-httpclient/src/main/java/com/baeldung/httpclient/HttpClientPost.java @@ -0,0 +1,162 @@ +package com.baeldung.httpclient; + +import java.io.IOException; +import java.net.Authenticator; +import java.net.PasswordAuthentication; +import java.net.URI; +import java.net.URLEncoder; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.nio.charset.StandardCharsets; +import java.nio.file.Path; +import java.util.Base64; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; + +public class HttpClientPost { + + public static HttpResponse sendSynchronousPost(String serviceUrl) throws IOException, InterruptedException { + HttpClient client = HttpClient.newHttpClient(); + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(serviceUrl)) + .POST(HttpRequest.BodyPublishers.noBody()) + .build(); + + HttpResponse response = client + .send(request, HttpResponse.BodyHandlers.ofString()); + + return response; + } + + public static CompletableFuture> sendAsynchronousPost(String serviceUrl) { + HttpClient client = HttpClient.newHttpClient(); + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(serviceUrl)) + .POST(HttpRequest.BodyPublishers.noBody()) + .build(); + + CompletableFuture> futureResponse = client + .sendAsync(request, HttpResponse.BodyHandlers.ofString()); + + return futureResponse; + } + + public static List>> sendConcurrentPost(List serviceUrls) { + HttpClient client = HttpClient.newHttpClient(); + + List>> completableFutures = serviceUrls.stream() + .map(URI::create) + .map(HttpRequest::newBuilder) + .map(builder -> builder.POST(HttpRequest.BodyPublishers.noBody())) + .map(HttpRequest.Builder::build) + .map(request -> client.sendAsync(request, HttpResponse.BodyHandlers.ofString())) + .collect(Collectors.toList()); + + return completableFutures; + } + + public static HttpResponse sendPostWithAuthHeader(String serviceUrl) throws IOException, InterruptedException { + HttpClient client = HttpClient.newHttpClient(); + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(serviceUrl)) + .POST(HttpRequest.BodyPublishers.noBody()) + .header("Authorization", "Basic " + Base64.getEncoder() + .encodeToString(("baeldung:123456").getBytes())) + .build(); + + HttpResponse response = client + .send(request, HttpResponse.BodyHandlers.ofString()); + + return response; + } + + public static HttpResponse sendPostWithAuthClient(String serviceUrl) throws IOException, InterruptedException { + HttpClient client = HttpClient.newBuilder() + .authenticator(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication( + "baeldung", + "123456".toCharArray()); + } + }) + .build(); + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(serviceUrl)) + .POST(HttpRequest.BodyPublishers.noBody()) + .build(); + + HttpResponse response = client + .send(request, HttpResponse.BodyHandlers.ofString()); + + return response; + } + + public static HttpResponse sendPostWithJsonBody(String serviceUrl) throws IOException, InterruptedException { + HttpClient client = HttpClient.newHttpClient(); + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(serviceUrl)) + .POST(HttpRequest.BodyPublishers.ofString("{\"action\":\"hello\"}")) + .build(); + + HttpResponse response = client + .send(request, HttpResponse.BodyHandlers.ofString()); + + return response; + } + + public static HttpResponse sendPostWithFormData(String serviceUrl) throws IOException, InterruptedException { + HttpClient client = HttpClient.newHttpClient(); + + Map formData = new HashMap<>(); + formData.put("username", "baeldung"); + formData.put("message", "hello"); + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(serviceUrl)) + .POST(HttpRequest.BodyPublishers.ofString(getFormDataAsString(formData))) + .build(); + + HttpResponse response = client + .send(request, HttpResponse.BodyHandlers.ofString()); + + return response; + } + + public static HttpResponse sendPostWithFileData(String serviceUrl, Path file) throws IOException, InterruptedException { + HttpClient client = HttpClient.newHttpClient(); + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(serviceUrl)) + .POST(HttpRequest.BodyPublishers.ofFile(file)) + .build(); + + HttpResponse response = client + .send(request, HttpResponse.BodyHandlers.ofString()); + + return response; + } + + private static String getFormDataAsString(Map formData) { + StringBuilder formBodyBuilder = new StringBuilder(); + for (Map.Entry singleEntry : formData.entrySet()) { + if (formBodyBuilder.length() > 0) { + formBodyBuilder.append("&"); + } + formBodyBuilder.append(URLEncoder.encode(singleEntry.getKey(), StandardCharsets.UTF_8)); + formBodyBuilder.append("="); + formBodyBuilder.append(URLEncoder.encode(singleEntry.getValue(), StandardCharsets.UTF_8)); + } + return formBodyBuilder.toString(); + } + +} diff --git a/core-java-modules/core-java-httpclient/src/test/java/com/baeldung/httpclient/HttpClientPostUnitTest.java b/core-java-modules/core-java-httpclient/src/test/java/com/baeldung/httpclient/HttpClientPostUnitTest.java new file mode 100644 index 0000000000..b43cf08649 --- /dev/null +++ b/core-java-modules/core-java-httpclient/src/test/java/com/baeldung/httpclient/HttpClientPostUnitTest.java @@ -0,0 +1,99 @@ +package com.baeldung.httpclient; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.io.IOException; +import java.net.http.HttpResponse; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.stream.Collectors; + +import static org.assertj.core.api.Assertions.*; + +class HttpClientPostUnitTest extends PostRequestMockServer { + + @Test + void givenSyncPostRequest_whenServerIsAvailable_thenOkStatusIsReceived() throws IOException, InterruptedException { + HttpResponse response = HttpClientPost.sendSynchronousPost(serviceUrl); + assertThat(response.statusCode()).isEqualTo(200); + assertThat(response.body()).isEqualTo("{\"message\":\"ok\"}"); + } + + @Test + void givenAsyncPostRequest_whenServerIsAvailable_thenOkStatusIsReceived() throws ExecutionException, InterruptedException { + CompletableFuture> futureResponse = HttpClientPost.sendAsynchronousPost(serviceUrl); + HttpResponse response = futureResponse.get(); + + assertThat(response.statusCode()).isEqualTo(200); + assertThat(response.body()).isEqualTo("{\"message\":\"ok\"}"); + } + + @Test + void givenConcurrentPostRequests_whenServerIsAvailable_thenOkStatusIsReceived() throws ExecutionException, InterruptedException { + List>> completableFutures = HttpClientPost + .sendConcurrentPost(List.of(serviceUrl, serviceUrl)); + + CompletableFuture>> combinedFutures = CompletableFuture + .allOf(completableFutures.toArray(new CompletableFuture[0])) + .thenApply(future -> + completableFutures.stream() + .map(CompletableFuture::join) + .collect(Collectors.toList())); + + List> responses = combinedFutures.get(); + responses.forEach((response) -> { + assertThat(response.statusCode()).isEqualTo(200); + assertThat(response.body()).isEqualTo("{\"message\":\"ok\"}"); + }); + } + + @Test + void givenPostRequestWithAuthClient_whenServerIsAvailable_thenOkStatusIsReceived() throws IOException, InterruptedException { + HttpResponse response = HttpClientPost.sendPostWithAuthClient(serviceUrl); + + assertThat(response.statusCode()).isEqualTo(200); + assertThat(response.body()).isEqualTo("{\"message\":\"ok\"}"); + } + + @Test + void givenPostRequestWithAuthHeader_whenServerIsAvailable_thenOkStatusIsReceived() throws IOException, InterruptedException { + HttpResponse response = HttpClientPost.sendPostWithAuthHeader(serviceUrl); + + assertThat(response.statusCode()).isEqualTo(200); + assertThat(response.body()).isEqualTo("{\"message\":\"ok\"}"); + } + + @Test + void givenPostRequestWithJsonBody_whenServerIsAvailable_thenOkStatusIsReceived() throws IOException, InterruptedException { + HttpResponse response = HttpClientPost.sendPostWithJsonBody(serviceUrl); + + assertThat(response.statusCode()).isEqualTo(200); + assertThat(response.body()).isEqualTo("{\"message\":\"ok\"}"); + } + + @Test + void givenPostRequestWithFormData_whenServerIsAvailable_thenOkStatusIsReceived() throws IOException, InterruptedException { + HttpResponse response = HttpClientPost.sendPostWithFormData(serviceUrl); + + assertThat(response.statusCode()).isEqualTo(200); + assertThat(response.body()).isEqualTo("{\"message\":\"ok\"}"); + } + + @Test + void givenPostRequestWithFileData_whenServerIsAvailable_thenOkStatusIsReceived(@TempDir Path tempDir) throws IOException, InterruptedException { + Path file = tempDir.resolve("temp.txt"); + List lines = Arrays.asList("1", "2", "3"); + Files.write(file, lines); + + HttpResponse response = HttpClientPost.sendPostWithFileData(serviceUrl, file); + + assertThat(response.statusCode()).isEqualTo(200); + assertThat(response.body()).isEqualTo("{\"message\":\"ok\"}"); + } + +} diff --git a/core-java-modules/core-java-httpclient/src/test/java/com/baeldung/httpclient/PostRequestMockServer.java b/core-java-modules/core-java-httpclient/src/test/java/com/baeldung/httpclient/PostRequestMockServer.java new file mode 100644 index 0000000000..fa594897a3 --- /dev/null +++ b/core-java-modules/core-java-httpclient/src/test/java/com/baeldung/httpclient/PostRequestMockServer.java @@ -0,0 +1,61 @@ +package com.baeldung.httpclient; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.mockserver.client.MockServerClient; +import org.mockserver.integration.ClientAndServer; +import org.mockserver.model.HttpStatusCode; + +import java.io.IOException; +import java.net.ServerSocket; +import java.net.URISyntaxException; + +import static org.mockserver.integration.ClientAndServer.startClientAndServer; +import static org.mockserver.model.HttpRequest.request; +import static org.mockserver.model.HttpResponse.response; + +public abstract class PostRequestMockServer { + + public static ClientAndServer mockServer; + public static String serviceUrl; + + private static int serverPort; + + public static final String SERVER_ADDRESS = "127.0.0.1"; + public static final String PATH = "/test1"; + public static final String METHOD = "POST"; + + @BeforeAll + static void startServer() throws IOException, URISyntaxException { + serverPort = getFreePort(); + serviceUrl = "http://" + SERVER_ADDRESS + ":" + serverPort + PATH; + mockServer = startClientAndServer(serverPort); + mockBasicPostRequest(); + } + + @AfterAll + static void stopServer() { + mockServer.stop(); + } + + private static void mockBasicPostRequest() { + new MockServerClient(SERVER_ADDRESS, serverPort) + .when( + request() + .withPath(PATH) + .withMethod(METHOD) + ) + .respond( + response() + .withStatusCode(HttpStatusCode.OK_200.code()) + .withBody("{\"message\":\"ok\"}") + ); + } + + private static int getFreePort () throws IOException { + try (ServerSocket serverSocket = new ServerSocket(0)) { + return serverSocket.getLocalPort(); + } + } + +} diff --git a/pom.xml b/pom.xml index f06c75b3be..5b64baac7f 100644 --- a/pom.xml +++ b/pom.xml @@ -1318,6 +1318,7 @@ core-java-modules/core-java-networking-3 core-java-modules/multimodulemavenproject core-java-modules/core-java-strings + core-java-modules/core-java-httpclient ddd-modules docker apache-httpclient-2 From f5380f98f6f73caaeb616c620d36ba72ebdcfdda Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Wed, 11 May 2022 12:52:41 +0300 Subject: [PATCH 192/278] BAEL-5420 fix equals method --- .../main/java/com/baeldung/employee/EmployeeVO.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/employee/EmployeeVO.java b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/employee/EmployeeVO.java index 7a1775f79d..3d2c61aa3d 100644 --- a/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/employee/EmployeeVO.java +++ b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/employee/EmployeeVO.java @@ -28,9 +28,15 @@ public class EmployeeVO { @Override public boolean equals(Object obj) { - return Objects.equals(firstName, this.firstName) - && Objects.equals(lastName, this.lastName) - && Objects.equals(startDate, this.startDate); + + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + + EmployeeVO emp = (EmployeeVO) obj; + + return Objects.equals(firstName, emp.firstName) + && Objects.equals(lastName, emp.lastName) + && Objects.equals(startDate, emp.startDate); } @Override From 1b1a411770cf0a899e42d7094f120045834a9e4e Mon Sep 17 00:00:00 2001 From: panagiotiskakos Date: Wed, 11 May 2022 13:53:42 +0300 Subject: [PATCH 193/278] [JAVA-8688] Added tomcat dependecy --- spring-boot-modules/spring-boot-deployment/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/spring-boot-modules/spring-boot-deployment/pom.xml b/spring-boot-modules/spring-boot-deployment/pom.xml index 7a9c2096f1..47b1a0f0d5 100644 --- a/spring-boot-modules/spring-boot-deployment/pom.xml +++ b/spring-boot-modules/spring-boot-deployment/pom.xml @@ -41,6 +41,11 @@ org.springframework.boot spring-boot-starter-actuator + + org.springframework.boot + spring-boot-starter-tomcat + provided + com.h2database h2 From 39e01903c24b3005e88bdd22c7133120dbd1c6c1 Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Wed, 11 May 2022 12:28:14 +0100 Subject: [PATCH 194/278] [JAVA-11122] Logging clean up --- .../differences/rdd/ActionsUnitTest.java | 25 ++++++---- .../differences/rdd/DataFrameUnitTest.java | 22 +++++---- .../differences/rdd/DatasetUnitTest.java | 46 +++++++++++++------ .../baeldung/graphql/GraphQLMockServer.java | 19 ++++---- 4 files changed, 72 insertions(+), 40 deletions(-) diff --git a/apache-spark/src/test/java/com/baeldung/differences/rdd/ActionsUnitTest.java b/apache-spark/src/test/java/com/baeldung/differences/rdd/ActionsUnitTest.java index a3e1811e6f..6d6a1394c5 100644 --- a/apache-spark/src/test/java/com/baeldung/differences/rdd/ActionsUnitTest.java +++ b/apache-spark/src/test/java/com/baeldung/differences/rdd/ActionsUnitTest.java @@ -12,13 +12,18 @@ import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import scala.Tuple2; public class ActionsUnitTest { + + public static final Logger LOG = LoggerFactory.getLogger(ActionsUnitTest.class); + private static JavaRDD tourists; private static JavaSparkContext sc; public static final String COMMA_DELIMITER = ",(?=([^\"]*\"[^\"]*\")*[^\"]*$)"; - + @BeforeClass public static void init() { SparkConf conf = new SparkConf().setAppName("reduce") @@ -26,7 +31,7 @@ public class ActionsUnitTest { sc = new JavaSparkContext(conf); tourists = sc.textFile("data/Tourist.csv").filter(line -> !line.startsWith("Region")); } - + @AfterClass public static void cleanup() { sc.close(); @@ -40,11 +45,11 @@ public class ActionsUnitTest { }) .distinct(); Long numberOfCountries = countries.count(); - System.out.println("Count: " + numberOfCountries); - + LOG.debug("Count: {}", numberOfCountries); + assertEquals(Long.valueOf(220), numberOfCountries); } - + @Test public void whenReduceByKeySum_thenTotalValuePerKey() { JavaRDD touristsExpenditure = tourists.filter(line -> line.split(COMMA_DELIMITER)[3].contains("expenditure")); @@ -53,10 +58,12 @@ public class ActionsUnitTest { String[] columns = line.split(COMMA_DELIMITER); return new Tuple2<>(columns[1], Double.valueOf(columns[6])); }); - List> totalByCountry = expenditurePairRdd.reduceByKey((x, y) -> x + y) - .collect(); - System.out.println("Total per Country: " + totalByCountry); - + List> totalByCountry = expenditurePairRdd + .reduceByKey(Double::sum) + .collect(); + + LOG.debug("Total per Country: {}", totalByCountry); + for(Tuple2 tuple : totalByCountry) { if (tuple._1.equals("Mexico")) { assertEquals(Double.valueOf(99164), tuple._2); diff --git a/apache-spark/src/test/java/com/baeldung/differences/rdd/DataFrameUnitTest.java b/apache-spark/src/test/java/com/baeldung/differences/rdd/DataFrameUnitTest.java index f294e5bc66..621e589fb6 100644 --- a/apache-spark/src/test/java/com/baeldung/differences/rdd/DataFrameUnitTest.java +++ b/apache-spark/src/test/java/com/baeldung/differences/rdd/DataFrameUnitTest.java @@ -39,8 +39,10 @@ public class DataFrameUnitTest { @Test public void whenSelectSpecificColumns_thenColumnsFiltered() { Dataset selectedData = data.select(col("country"), col("year"), col("value")); - selectedData.show(); - + + // uncomment to see table + // selectedData.show(); + List resultList = Arrays.asList(selectedData.columns()); assertTrue(resultList.contains("country")); assertTrue(resultList.contains("year")); @@ -52,22 +54,26 @@ public class DataFrameUnitTest { @Test public void whenFilteringByCountry_thenCountryRecordsSelected() { Dataset filteredData = data.filter(col("country").equalTo("Mexico")); - filteredData.show(); - + + // uncomment to see table + // filteredData.show(); + filteredData.foreach(record -> { assertEquals("Mexico", record.get(1)); }); - + } @Test public void whenGroupCountByCountry_thenContryTotalRecords() { Dataset recordsPerCountry = data.groupBy(col("country")) .count(); - recordsPerCountry.show(); - + + // uncomment to see table + // recordsPerCountry.show(); + Dataset filteredData = recordsPerCountry.filter(col("country").equalTo("Sweden")); - assertEquals(new Long(12), filteredData.first() + assertEquals(12L, filteredData.first() .get(1)); } diff --git a/apache-spark/src/test/java/com/baeldung/differences/rdd/DatasetUnitTest.java b/apache-spark/src/test/java/com/baeldung/differences/rdd/DatasetUnitTest.java index 1d83505812..4fde933a3b 100644 --- a/apache-spark/src/test/java/com/baeldung/differences/rdd/DatasetUnitTest.java +++ b/apache-spark/src/test/java/com/baeldung/differences/rdd/DatasetUnitTest.java @@ -3,6 +3,7 @@ package com.baeldung.differences.rdd; import static org.apache.spark.sql.functions.col; import static org.apache.spark.sql.functions.sum; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import org.apache.spark.api.java.function.FilterFunction; import org.apache.spark.sql.DataFrameReader; @@ -29,8 +30,8 @@ public class DatasetUnitTest { DataFrameReader dataFrameReader = session.read(); Dataset data = dataFrameReader.option("header", "true") .csv("data/Tourist.csv"); - Dataset responseWithSelectedColumns = data.select(col("region"), - col("country"), col("year"), col("series"), col("value").cast("double"), + Dataset responseWithSelectedColumns = data.select(col("region"), + col("country"), col("year"), col("series"), col("value").cast("double"), col("footnotes"), col("source")); typedDataset = responseWithSelectedColumns.as(Encoders.bean(TouristData.class)); } @@ -45,7 +46,9 @@ public class DatasetUnitTest { Dataset selectedData = typedDataset .filter((FilterFunction) record -> record.getCountry() .equals("Norway")); - selectedData.show(); + + // uncomment to see output + // selectedData.show(); selectedData.foreach(record -> { assertEquals("Norway", record.getCountry()); @@ -56,28 +59,41 @@ public class DatasetUnitTest { public void whenGroupCountByCountry_thenContryTotalRecords() { Dataset countriesCount = typedDataset.groupBy(typedDataset.col("country")) .count(); - countriesCount.show(); - assertEquals(Long.valueOf(220), Long.valueOf(countriesCount.count())); + // uncomment to see output + // countriesCount.show(); + + assertEquals(220, countriesCount.count()); } @Test public void whenFilteredByPropertyRange_thenRetreiveValidRecords() { // Filter records with existing data for years between 2010 and 2017 - typedDataset.filter((FilterFunction) record -> record.getYear() != null - && (Long.valueOf(record.getYear()) > 2010 && Long.valueOf(record.getYear()) < 2017)) - .show(); + Dataset filteredData = typedDataset.filter( + (FilterFunction) record -> record.getYear() != null + && (Long.parseLong(record.getYear()) > 2010 && Long.parseLong(record.getYear()) < 2017)); + + // uncomment to see output + // filteredData.show(); + + assertEquals(394, filteredData.count()); + filteredData.foreach(record -> { + assertTrue(Integer.parseInt(record.getYear()) > 2010 && Integer.parseInt(record.getYear()) < 2017); + }); } - + @Test public void whenSumValue_thenRetreiveTotalValue() { // Total tourist expenditure by country - typedDataset.filter((FilterFunction) record -> record.getValue() != null - && record.getSeries() - .contains("expenditure")) - .groupBy("country") - .agg(sum("value")) - .show(); + Dataset filteredData = typedDataset.filter((FilterFunction) record -> record.getValue() != null + && record.getSeries().contains("expenditure")) + .groupBy("country") + .agg(sum("value")); + + // uncomment to see output + // filteredData.show(); + + assertEquals(212, filteredData.count()); } } diff --git a/graphql/graphql-java/src/test/java/com/baeldung/graphql/GraphQLMockServer.java b/graphql/graphql-java/src/test/java/com/baeldung/graphql/GraphQLMockServer.java index fb5a789428..e72f6a38b9 100644 --- a/graphql/graphql-java/src/test/java/com/baeldung/graphql/GraphQLMockServer.java +++ b/graphql/graphql-java/src/test/java/com/baeldung/graphql/GraphQLMockServer.java @@ -3,12 +3,13 @@ package com.baeldung.graphql; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.mockserver.client.MockServerClient; +import org.mockserver.configuration.Configuration; import org.mockserver.integration.ClientAndServer; import org.mockserver.model.HttpStatusCode; +import org.slf4j.event.Level; import java.io.IOException; import java.net.ServerSocket; -import java.net.URISyntaxException; import static org.mockserver.integration.ClientAndServer.startClientAndServer; import static org.mockserver.matchers.Times.exactly; @@ -17,20 +18,22 @@ import static org.mockserver.model.HttpResponse.response; public class GraphQLMockServer { - public static ClientAndServer mockServer; + private static final String SERVER_ADDRESS = "127.0.0.1"; + private static final String PATH = "/graphql"; + public static String serviceUrl; + private static ClientAndServer mockServer; private static int serverPort; - public static final String SERVER_ADDRESS = "127.0.0.1"; - public static final String HTTP_GET_POST = "GET"; - public static final String PATH = "/graphql"; - @BeforeAll - static void startServer() throws IOException, URISyntaxException { + static void startServer() throws IOException { serverPort = getFreePort(); serviceUrl = "http://" + SERVER_ADDRESS + ":" + serverPort + PATH; - mockServer = startClientAndServer(serverPort); + + Configuration config = Configuration.configuration().logLevel(Level.WARN); + mockServer = startClientAndServer(config, serverPort); + mockAllBooksTitleRequest(); mockAllBooksTitleAuthorRequest(); } From 3aacf5a5a807c071260ab52c436d688bf8b4fb89 Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Wed, 11 May 2022 12:59:11 +0100 Subject: [PATCH 195/278] [JAVA-11122] Allow multiple contexts to prevent failing tests --- .../java/com/baeldung/differences/rdd/ActionsUnitTest.java | 7 +++++-- .../baeldung/differences/rdd/TransformationsUnitTest.java | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/apache-spark/src/test/java/com/baeldung/differences/rdd/ActionsUnitTest.java b/apache-spark/src/test/java/com/baeldung/differences/rdd/ActionsUnitTest.java index 6d6a1394c5..b1083021a9 100644 --- a/apache-spark/src/test/java/com/baeldung/differences/rdd/ActionsUnitTest.java +++ b/apache-spark/src/test/java/com/baeldung/differences/rdd/ActionsUnitTest.java @@ -26,8 +26,11 @@ public class ActionsUnitTest { @BeforeClass public static void init() { - SparkConf conf = new SparkConf().setAppName("reduce") - .setMaster("local[*]"); + SparkConf conf = new SparkConf() + .setAppName("reduce") + .setMaster("local[*]") + .set("spark.driver.allowMultipleContexts", "true"); + sc = new JavaSparkContext(conf); tourists = sc.textFile("data/Tourist.csv").filter(line -> !line.startsWith("Region")); } diff --git a/apache-spark/src/test/java/com/baeldung/differences/rdd/TransformationsUnitTest.java b/apache-spark/src/test/java/com/baeldung/differences/rdd/TransformationsUnitTest.java index 01e7d3adfc..6de407f3b4 100644 --- a/apache-spark/src/test/java/com/baeldung/differences/rdd/TransformationsUnitTest.java +++ b/apache-spark/src/test/java/com/baeldung/differences/rdd/TransformationsUnitTest.java @@ -23,8 +23,11 @@ public class TransformationsUnitTest { @BeforeClass public static void init() { - SparkConf conf = new SparkConf().setAppName("uppercaseCountries") - .setMaster("local[*]"); + SparkConf conf = new SparkConf() + .setAppName("uppercaseCountries") + .setMaster("local[*]") + .set("spark.driver.allowMultipleContexts", "true"); + sc = new JavaSparkContext(conf); tourists = sc.textFile("data/Tourist.csv") .filter(line -> !line.startsWith("Region")); //filter header row From 9727e555ce3f24466aaccd90fa135f34b350552d Mon Sep 17 00:00:00 2001 From: Timothy Kruger Date: Thu, 12 May 2022 13:52:54 +0200 Subject: [PATCH 196/278] BAEL-5563 Reversing a number (#12153) * BAEL-5563 Reverse a number initial commit * BAEL-5563 Final improvements before PR * BAEL-5563 Reverse a number - Draft improvements * BAEL-5563 Reverse a number - Recursive method improvements * BAEL-5563 Reverse a number - Recursive method improvements * BAEL-5563 Reverse a number - Remove unused imports Co-authored-by: Timothy Kruger - Lenny Co-authored-by: claud <180181@virtualwindow.co.za> --- .../baeldung/reversenumber/ReverseNumber.java | 45 +++++++++++++++++++ .../reversenumber/ReverseNumberUnitTest.java | 34 ++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 java-numbers-4/src/main/java/com/baeldung/reversenumber/ReverseNumber.java create mode 100644 java-numbers-4/src/test/java/com/baeldung/reversenumber/ReverseNumberUnitTest.java diff --git a/java-numbers-4/src/main/java/com/baeldung/reversenumber/ReverseNumber.java b/java-numbers-4/src/main/java/com/baeldung/reversenumber/ReverseNumber.java new file mode 100644 index 0000000000..04865a8d52 --- /dev/null +++ b/java-numbers-4/src/main/java/com/baeldung/reversenumber/ReverseNumber.java @@ -0,0 +1,45 @@ +package com.baeldung.reversenumber; + +public class ReverseNumber { + + public static int reverseNumberWhileLoop(int number) { + int reversedNumber = 0; + int numberToReverse = Math.abs(number); + + while (numberToReverse > 0) { + int mod = numberToReverse % 10; + reversedNumber = reversedNumber * 10 + mod; + numberToReverse /= 10; + } + + return number < 0 ? reversedNumber * -1 : reversedNumber; + } + + public static int reverseNumberForLoop(int number) { + int reversedNumber = 0; + int numberToReverse = Math.abs(number); + + for (; numberToReverse > 0; numberToReverse /= 10) { + int mod = numberToReverse % 10; + reversedNumber = reversedNumber * 10 + mod; + } + + return number < 0 ? reversedNumber * -1 : reversedNumber; + } + + public static int reverseNumberRecWrapper(int number) { + int output = reverseNumberRec(Math.abs(number), 0); + return number < 0 ? output * -1 : output; + } + private static int reverseNumberRec(int numberToReverse, int recursiveReversedNumber) { + + if (numberToReverse > 0) { + int mod = numberToReverse % 10; + recursiveReversedNumber = recursiveReversedNumber * 10 + mod; + numberToReverse /= 10; + return reverseNumberRec(numberToReverse, recursiveReversedNumber); + } + + return recursiveReversedNumber; + } +} diff --git a/java-numbers-4/src/test/java/com/baeldung/reversenumber/ReverseNumberUnitTest.java b/java-numbers-4/src/test/java/com/baeldung/reversenumber/ReverseNumberUnitTest.java new file mode 100644 index 0000000000..2c55bcc539 --- /dev/null +++ b/java-numbers-4/src/test/java/com/baeldung/reversenumber/ReverseNumberUnitTest.java @@ -0,0 +1,34 @@ +package com.baeldung.reversenumber; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class ReverseNumberUnitTest { + + private static final int ORIGINAL_NUMBER = 123456789; + private static final int REVERSED_NUMBER = 987654321; + + @Test + void whenReverseNumberWhileLoop_thenOriginalEqualToReverse() { + Assertions.assertThat(ReverseNumber.reverseNumberWhileLoop(ORIGINAL_NUMBER)).isEqualTo(REVERSED_NUMBER); + } + + @Test + void whenReverseNumberForLoop_thenOriginalEqualToReverse() { + Assertions.assertThat(ReverseNumber.reverseNumberForLoop(ORIGINAL_NUMBER)).isEqualTo(REVERSED_NUMBER); + } + + @Test + void whenReverseNumberRec_thenOriginalEqualToReverse() { + Assertions.assertThat(ReverseNumber.reverseNumberRecWrapper(ORIGINAL_NUMBER)).isEqualTo(REVERSED_NUMBER); + } + + @Test + void whenReverseNegativeNumber_thenNumberShouldReverse() { + Assertions.assertThat(ReverseNumber.reverseNumberWhileLoop(ORIGINAL_NUMBER * -1)).isEqualTo(REVERSED_NUMBER * -1); + Assertions.assertThat(ReverseNumber.reverseNumberForLoop(ORIGINAL_NUMBER * -1)).isEqualTo(REVERSED_NUMBER * -1); + Assertions.assertThat(ReverseNumber.reverseNumberRecWrapper(ORIGINAL_NUMBER * -1)).isEqualTo(REVERSED_NUMBER * -1); + } +} \ No newline at end of file From 870dc43c9daaec2ab38ac5976a5f6e11914046db Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Thu, 12 May 2022 18:59:40 +0100 Subject: [PATCH 197/278] [JAVA-11876] Split spring-boot-mongodb module --- persistence-modules/pom.xml | 1 + .../.gitignore | 2 ++ .../README.md | 4 +++ .../spring-boot-persistence-mongodb-2/pom.xml | 35 +++++++++++++++++++ .../SpringBootPersistenceApplication.java | 13 +++++++ .../java/com/baeldung/logging/model/Book.java | 0 .../src/main/resources/application.properties | 1 + .../com/baeldung/logging/GroupByAuthor.java | 0 .../com/baeldung/logging/LoggingUnitTest.java | 4 +-- .../src/test/resources/application.properties | 1 + .../src/test/resources/logback-test.xml | 12 +++++++ .../spring-boot-persistence-mongodb/README.md | 2 +- 12 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 persistence-modules/spring-boot-persistence-mongodb-2/.gitignore create mode 100644 persistence-modules/spring-boot-persistence-mongodb-2/README.md create mode 100644 persistence-modules/spring-boot-persistence-mongodb-2/pom.xml create mode 100644 persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/SpringBootPersistenceApplication.java rename persistence-modules/{spring-boot-persistence-mongodb => spring-boot-persistence-mongodb-2}/src/main/java/com/baeldung/logging/model/Book.java (100%) create mode 100644 persistence-modules/spring-boot-persistence-mongodb-2/src/main/resources/application.properties rename persistence-modules/{spring-boot-persistence-mongodb => spring-boot-persistence-mongodb-2}/src/test/java/com/baeldung/logging/GroupByAuthor.java (100%) rename persistence-modules/{spring-boot-persistence-mongodb => spring-boot-persistence-mongodb-2}/src/test/java/com/baeldung/logging/LoggingUnitTest.java (97%) create mode 100644 persistence-modules/spring-boot-persistence-mongodb-2/src/test/resources/application.properties create mode 100644 persistence-modules/spring-boot-persistence-mongodb-2/src/test/resources/logback-test.xml diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 988bb46575..7be71ad215 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -60,6 +60,7 @@ spring-boot-persistence spring-boot-persistence-h2 spring-boot-persistence-mongodb + spring-boot-persistence-mongodb-2 spring-data-arangodb spring-data-cassandra spring-data-cassandra-test diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/.gitignore b/persistence-modules/spring-boot-persistence-mongodb-2/.gitignore new file mode 100644 index 0000000000..2d513a0101 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-2/.gitignore @@ -0,0 +1,2 @@ +/.idea/ +/target/ diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/README.md b/persistence-modules/spring-boot-persistence-mongodb-2/README.md new file mode 100644 index 0000000000..9169e09813 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-2/README.md @@ -0,0 +1,4 @@ +# Relevant Articles + +- [Logging MongoDB Queries with Spring Boot](https://www.baeldung.com/spring-boot-mongodb-logging) +- More articles: [[<--prev]](../spring-boot-persistence-mongodb) \ No newline at end of file diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/pom.xml b/persistence-modules/spring-boot-persistence-mongodb-2/pom.xml new file mode 100644 index 0000000000..a6ac4987a1 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-2/pom.xml @@ -0,0 +1,35 @@ + + + 4.0.0 + spring-boot-persistence-mongodb-2 + spring-boot-persistence-mongodb-2 + war + This is simple boot application for Spring boot persistence mongodb test + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 + + + + + org.springframework.boot + spring-boot-starter-data-mongodb + + + de.flapdoodle.embed + de.flapdoodle.embed.mongo + ${embed.mongo.version} + test + + + + + 3.2.6 + + + diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/SpringBootPersistenceApplication.java b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/SpringBootPersistenceApplication.java new file mode 100644 index 0000000000..2dff3f37df --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/SpringBootPersistenceApplication.java @@ -0,0 +1,13 @@ +package com.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringBootPersistenceApplication { + + public static void main(String ... args) { + SpringApplication.run(SpringBootPersistenceApplication.class, args); + } + +} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/logging/model/Book.java b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/logging/model/Book.java similarity index 100% rename from persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/logging/model/Book.java rename to persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/logging/model/Book.java diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/src/main/resources/application.properties b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/resources/application.properties new file mode 100644 index 0000000000..9dbc261896 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.application.name=spring-boot-persistence-mongodb-2 diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/logging/GroupByAuthor.java b/persistence-modules/spring-boot-persistence-mongodb-2/src/test/java/com/baeldung/logging/GroupByAuthor.java similarity index 100% rename from persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/logging/GroupByAuthor.java rename to persistence-modules/spring-boot-persistence-mongodb-2/src/test/java/com/baeldung/logging/GroupByAuthor.java diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/logging/LoggingUnitTest.java b/persistence-modules/spring-boot-persistence-mongodb-2/src/test/java/com/baeldung/logging/LoggingUnitTest.java similarity index 97% rename from persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/logging/LoggingUnitTest.java rename to persistence-modules/spring-boot-persistence-mongodb-2/src/test/java/com/baeldung/logging/LoggingUnitTest.java index 1c59dcb5ac..00def53566 100644 --- a/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/logging/LoggingUnitTest.java +++ b/persistence-modules/spring-boot-persistence-mongodb-2/src/test/java/com/baeldung/logging/LoggingUnitTest.java @@ -35,7 +35,7 @@ import de.flapdoodle.embed.mongo.distribution.Version; import de.flapdoodle.embed.process.runtime.Network; @SpringBootTest -@TestPropertySource(properties = { "logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG" }) +@TestPropertySource(properties = { "logging.level.org.springframework.data.mongodb.core.MongoTemplate=INFO" }) public class LoggingUnitTest { private static final String CONNECTION_STRING = "mongodb://%s:%d"; @@ -51,7 +51,7 @@ public class LoggingUnitTest { @BeforeEach void setup() throws Exception { String ip = "localhost"; - int port = SocketUtils.findAvailableTcpPort(); + int port = Network.freeServerPort(Network.getLocalHost()); ImmutableMongodConfig mongodConfig = MongodConfig.builder() .version(Version.Main.PRODUCTION) diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/src/test/resources/application.properties b/persistence-modules/spring-boot-persistence-mongodb-2/src/test/resources/application.properties new file mode 100644 index 0000000000..a5b5fb9804 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-2/src/test/resources/application.properties @@ -0,0 +1 @@ +spring.mongodb.embedded.version=4.4.9 \ No newline at end of file diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/src/test/resources/logback-test.xml b/persistence-modules/spring-boot-persistence-mongodb-2/src/test/resources/logback-test.xml new file mode 100644 index 0000000000..8d4771e308 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-2/src/test/resources/logback-test.xml @@ -0,0 +1,12 @@ + + + + + [%d{ISO8601}]-[%thread] %-5level %logger - %msg%n + + + + + + + \ No newline at end of file diff --git a/persistence-modules/spring-boot-persistence-mongodb/README.md b/persistence-modules/spring-boot-persistence-mongodb/README.md index 91dd8718e1..8e9399f076 100644 --- a/persistence-modules/spring-boot-persistence-mongodb/README.md +++ b/persistence-modules/spring-boot-persistence-mongodb/README.md @@ -7,4 +7,4 @@ - [ZonedDateTime with Spring Data MongoDB](https://www.baeldung.com/spring-data-mongodb-zoneddatetime) - [A Guide to @DBRef in MongoDB](https://www.baeldung.com/spring-mongodb-dbref-annotation) - [Import Data to MongoDB From JSON File Using Java](https://www.baeldung.com/java-import-json-mongodb) -- [Logging MongoDB Queries with Spring Boot](https://www.baeldung.com/spring-boot-mongodb-logging) +- More articles: [[next-->]](../spring-boot-persistence-mongodb-2) From efd9a398a13c04dd496f0bef00021304c846e7de Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Thu, 12 May 2022 19:36:01 +0100 Subject: [PATCH 198/278] [JAVA-11979] Rename Keycloak server Integration test to Live test --- ...rationTest.java => KeycloakSoapLiveTest.java} | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) rename spring-boot-modules/spring-boot-keycloak/src/test/java/com/baeldung/keycloaksoap/{KeycloakSoapIntegrationTest.java => KeycloakSoapLiveTest.java} (96%) diff --git a/spring-boot-modules/spring-boot-keycloak/src/test/java/com/baeldung/keycloaksoap/KeycloakSoapIntegrationTest.java b/spring-boot-modules/spring-boot-keycloak/src/test/java/com/baeldung/keycloaksoap/KeycloakSoapLiveTest.java similarity index 96% rename from spring-boot-modules/spring-boot-keycloak/src/test/java/com/baeldung/keycloaksoap/KeycloakSoapIntegrationTest.java rename to spring-boot-modules/spring-boot-keycloak/src/test/java/com/baeldung/keycloaksoap/KeycloakSoapLiveTest.java index e0de897044..0327915399 100644 --- a/spring-boot-modules/spring-boot-keycloak/src/test/java/com/baeldung/keycloaksoap/KeycloakSoapIntegrationTest.java +++ b/spring-boot-modules/spring-boot-keycloak/src/test/java/com/baeldung/keycloaksoap/KeycloakSoapLiveTest.java @@ -26,29 +26,35 @@ import java.util.Objects; import static org.assertj.core.api.Assertions.assertThat; /** - * The class contains Live/Integration tests. + * The class contains Live tests. * These tests expect that the Keycloak server is up and running on port 8080. - * The tests may fail without a Keycloak server. */ -@DisplayName("Keycloak SOAP Webservice Unit Tests") +@DisplayName("Keycloak SOAP Webservice Live Tests") @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @ActiveProfiles("test") @AutoConfigureMockMvc -class KeycloakSoapIntegrationTest { +class KeycloakSoapLiveTest { + + private static final Logger logger = LoggerFactory.getLogger(KeycloakSoapLiveTest.class); - private static final Logger logger = LoggerFactory.getLogger(KeycloakSoapIntegrationTest.class); @LocalServerPort private int port; + @Autowired private TestRestTemplate restTemplate; + @Autowired private ObjectMapper objectMapper; + @Value("${grant.type}") private String grantType; + @Value("${client.id}") private String clientId; + @Value("${client.secret}") private String clientSecret; + @Value("${url}") private String keycloakUrl; From 557dba376b6af21318c429375dd3a16b9656d51d Mon Sep 17 00:00:00 2001 From: freelansam <79205526+freelansam@users.noreply.github.com> Date: Fri, 13 May 2022 16:14:49 +0530 Subject: [PATCH 199/278] JAVA-11765: Dissolve spring-boot-rest-2 and distribute its articles (#12195) * JAVA-11765: Dissolve spring-boot-rest-2 and distribute its articles spring-boot-modules * JAVA-11765: removed module from main pom --- pom.xml | 2 - spring-boot-rest-2/README.md | 5 -- spring-boot-rest-2/pom.xml | 57 ------------------- .../src/main/resources/application.properties | 2 - .../spring-rest-http-2/README.md | 3 + .../endpoint/SpringBootRestApplication.java | 0 .../endpoint/controller/HelloController.java | 0 .../AnnotationDrivenEndpointsListener.java | 0 .../endpoint/listener/EndpointsListener.java | 0 .../endpoint/swagger/SpringFoxConfig.java | 0 .../java/com/baeldung/putvspost/Address.java | 0 .../baeldung/putvspost/AddressController.java | 0 .../baeldung/putvspost/AddressRepository.java | 0 .../putvspost/PutVsPostApplication.java | 0 .../UnsupportedMediaTypeApplication.java | 0 .../baeldung/unsupportedmediatype/User.java | 0 .../unsupportedmediatype/UserController.java | 0 .../src/main/resources/application.properties | 3 +- .../ApplicationUnitTest.java | 0 .../src/test/resources/application.properties | 3 +- 20 files changed, 7 insertions(+), 68 deletions(-) delete mode 100644 spring-boot-rest-2/README.md delete mode 100644 spring-boot-rest-2/pom.xml delete mode 100644 spring-boot-rest-2/src/main/resources/application.properties rename {spring-boot-rest-2 => spring-web-modules/spring-rest-http-2}/src/main/java/com/baeldung/endpoint/SpringBootRestApplication.java (100%) rename {spring-boot-rest-2 => spring-web-modules/spring-rest-http-2}/src/main/java/com/baeldung/endpoint/controller/HelloController.java (100%) rename {spring-boot-rest-2 => spring-web-modules/spring-rest-http-2}/src/main/java/com/baeldung/endpoint/listener/AnnotationDrivenEndpointsListener.java (100%) rename {spring-boot-rest-2 => spring-web-modules/spring-rest-http-2}/src/main/java/com/baeldung/endpoint/listener/EndpointsListener.java (100%) rename {spring-boot-rest-2 => spring-web-modules/spring-rest-http-2}/src/main/java/com/baeldung/endpoint/swagger/SpringFoxConfig.java (100%) rename {spring-boot-rest-2 => spring-web-modules/spring-rest-http-2}/src/main/java/com/baeldung/putvspost/Address.java (100%) rename {spring-boot-rest-2 => spring-web-modules/spring-rest-http-2}/src/main/java/com/baeldung/putvspost/AddressController.java (100%) rename {spring-boot-rest-2 => spring-web-modules/spring-rest-http-2}/src/main/java/com/baeldung/putvspost/AddressRepository.java (100%) rename {spring-boot-rest-2 => spring-web-modules/spring-rest-http-2}/src/main/java/com/baeldung/putvspost/PutVsPostApplication.java (100%) rename {spring-boot-rest-2 => spring-web-modules/spring-rest-http-2}/src/main/java/com/baeldung/unsupportedmediatype/UnsupportedMediaTypeApplication.java (100%) rename {spring-boot-rest-2 => spring-web-modules/spring-rest-http-2}/src/main/java/com/baeldung/unsupportedmediatype/User.java (100%) rename {spring-boot-rest-2 => spring-web-modules/spring-rest-http-2}/src/main/java/com/baeldung/unsupportedmediatype/UserController.java (100%) rename {spring-boot-rest-2 => spring-web-modules/spring-rest-http-2}/src/test/java/com/baeldung/unsupportedmediatype/ApplicationUnitTest.java (100%) diff --git a/pom.xml b/pom.xml index 5b64baac7f..106bb7516a 100644 --- a/pom.xml +++ b/pom.xml @@ -620,7 +620,6 @@ spring-bom spring-boot-modules spring-boot-rest - spring-boot-rest-2 spring-caching spring-caching-2 @@ -1085,7 +1084,6 @@ spring-bom spring-boot-modules spring-boot-rest - spring-boot-rest-2 spring-caching spring-caching-2 diff --git a/spring-boot-rest-2/README.md b/spring-boot-rest-2/README.md deleted file mode 100644 index 985aa97a86..0000000000 --- a/spring-boot-rest-2/README.md +++ /dev/null @@ -1,5 +0,0 @@ -### Relevant Article: - -- [Get All Endpoints in Spring Boot](https://www.baeldung.com/spring-boot-get-all-endpoints) -- [HTTP PUT vs. POST in REST API](https://www.baeldung.com/rest-http-put-vs-post) -- [415 Unsupported MediaType in Spring Application](https://www.baeldung.com/spring-415-unsupported-mediatype) diff --git a/spring-boot-rest-2/pom.xml b/spring-boot-rest-2/pom.xml deleted file mode 100644 index b75e93577a..0000000000 --- a/spring-boot-rest-2/pom.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - 4.0.0 - com.baeldung.web - spring-boot-rest-2 - spring-boot-rest-2 - war - Spring Boot Rest Module - - - com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../parent-boot-2 - - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-actuator - - - io.springfox - springfox-boot-starter - ${springfox.version} - - - org.springframework.boot - spring-boot-starter-data-jpa - - - com.h2database - h2 - runtime - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - - 3.0.0 - - - \ No newline at end of file diff --git a/spring-boot-rest-2/src/main/resources/application.properties b/spring-boot-rest-2/src/main/resources/application.properties deleted file mode 100644 index 5046c9660f..0000000000 --- a/spring-boot-rest-2/src/main/resources/application.properties +++ /dev/null @@ -1,2 +0,0 @@ - -management.endpoints.web.exposure.include=mappings diff --git a/spring-web-modules/spring-rest-http-2/README.md b/spring-web-modules/spring-rest-http-2/README.md index bb9175db8c..2c1b1f76f7 100644 --- a/spring-web-modules/spring-rest-http-2/README.md +++ b/spring-web-modules/spring-rest-http-2/README.md @@ -11,4 +11,7 @@ The "REST With Spring 2" Classes: http://bit.ly/restwithspring - [Setting a Request Timeout for a Spring REST API](https://www.baeldung.com/spring-rest-timeout) - [Long Polling in Spring MVC](https://www.baeldung.com/spring-mvc-long-polling) - [Guide to UriComponentsBuilder in Spring](https://www.baeldung.com/spring-uricomponentsbuilder) +- [Get All Endpoints in Spring Boot](https://www.baeldung.com/spring-boot-get-all-endpoints) +- [HTTP PUT vs. POST in REST API](https://www.baeldung.com/rest-http-put-vs-post) +- [415 Unsupported MediaType in Spring Application](https://www.baeldung.com/spring-415-unsupported-mediatype) - More articles: [[<-- prev]](../spring-rest-http) diff --git a/spring-boot-rest-2/src/main/java/com/baeldung/endpoint/SpringBootRestApplication.java b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/endpoint/SpringBootRestApplication.java similarity index 100% rename from spring-boot-rest-2/src/main/java/com/baeldung/endpoint/SpringBootRestApplication.java rename to spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/endpoint/SpringBootRestApplication.java diff --git a/spring-boot-rest-2/src/main/java/com/baeldung/endpoint/controller/HelloController.java b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/endpoint/controller/HelloController.java similarity index 100% rename from spring-boot-rest-2/src/main/java/com/baeldung/endpoint/controller/HelloController.java rename to spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/endpoint/controller/HelloController.java diff --git a/spring-boot-rest-2/src/main/java/com/baeldung/endpoint/listener/AnnotationDrivenEndpointsListener.java b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/endpoint/listener/AnnotationDrivenEndpointsListener.java similarity index 100% rename from spring-boot-rest-2/src/main/java/com/baeldung/endpoint/listener/AnnotationDrivenEndpointsListener.java rename to spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/endpoint/listener/AnnotationDrivenEndpointsListener.java diff --git a/spring-boot-rest-2/src/main/java/com/baeldung/endpoint/listener/EndpointsListener.java b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/endpoint/listener/EndpointsListener.java similarity index 100% rename from spring-boot-rest-2/src/main/java/com/baeldung/endpoint/listener/EndpointsListener.java rename to spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/endpoint/listener/EndpointsListener.java diff --git a/spring-boot-rest-2/src/main/java/com/baeldung/endpoint/swagger/SpringFoxConfig.java b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/endpoint/swagger/SpringFoxConfig.java similarity index 100% rename from spring-boot-rest-2/src/main/java/com/baeldung/endpoint/swagger/SpringFoxConfig.java rename to spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/endpoint/swagger/SpringFoxConfig.java diff --git a/spring-boot-rest-2/src/main/java/com/baeldung/putvspost/Address.java b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/putvspost/Address.java similarity index 100% rename from spring-boot-rest-2/src/main/java/com/baeldung/putvspost/Address.java rename to spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/putvspost/Address.java diff --git a/spring-boot-rest-2/src/main/java/com/baeldung/putvspost/AddressController.java b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/putvspost/AddressController.java similarity index 100% rename from spring-boot-rest-2/src/main/java/com/baeldung/putvspost/AddressController.java rename to spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/putvspost/AddressController.java diff --git a/spring-boot-rest-2/src/main/java/com/baeldung/putvspost/AddressRepository.java b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/putvspost/AddressRepository.java similarity index 100% rename from spring-boot-rest-2/src/main/java/com/baeldung/putvspost/AddressRepository.java rename to spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/putvspost/AddressRepository.java diff --git a/spring-boot-rest-2/src/main/java/com/baeldung/putvspost/PutVsPostApplication.java b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/putvspost/PutVsPostApplication.java similarity index 100% rename from spring-boot-rest-2/src/main/java/com/baeldung/putvspost/PutVsPostApplication.java rename to spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/putvspost/PutVsPostApplication.java diff --git a/spring-boot-rest-2/src/main/java/com/baeldung/unsupportedmediatype/UnsupportedMediaTypeApplication.java b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/unsupportedmediatype/UnsupportedMediaTypeApplication.java similarity index 100% rename from spring-boot-rest-2/src/main/java/com/baeldung/unsupportedmediatype/UnsupportedMediaTypeApplication.java rename to spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/unsupportedmediatype/UnsupportedMediaTypeApplication.java diff --git a/spring-boot-rest-2/src/main/java/com/baeldung/unsupportedmediatype/User.java b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/unsupportedmediatype/User.java similarity index 100% rename from spring-boot-rest-2/src/main/java/com/baeldung/unsupportedmediatype/User.java rename to spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/unsupportedmediatype/User.java diff --git a/spring-boot-rest-2/src/main/java/com/baeldung/unsupportedmediatype/UserController.java b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/unsupportedmediatype/UserController.java similarity index 100% rename from spring-boot-rest-2/src/main/java/com/baeldung/unsupportedmediatype/UserController.java rename to spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/unsupportedmediatype/UserController.java diff --git a/spring-web-modules/spring-rest-http-2/src/main/resources/application.properties b/spring-web-modules/spring-rest-http-2/src/main/resources/application.properties index ff4af943ec..3119ad188a 100644 --- a/spring-web-modules/spring-rest-http-2/src/main/resources/application.properties +++ b/spring-web-modules/spring-rest-http-2/src/main/resources/application.properties @@ -1 +1,2 @@ -spring.mvc.async.request-timeout=750 \ No newline at end of file +spring.mvc.async.request-timeout=750 +management.endpoints.web.exposure.include=mappings \ No newline at end of file diff --git a/spring-boot-rest-2/src/test/java/com/baeldung/unsupportedmediatype/ApplicationUnitTest.java b/spring-web-modules/spring-rest-http-2/src/test/java/com/baeldung/unsupportedmediatype/ApplicationUnitTest.java similarity index 100% rename from spring-boot-rest-2/src/test/java/com/baeldung/unsupportedmediatype/ApplicationUnitTest.java rename to spring-web-modules/spring-rest-http-2/src/test/java/com/baeldung/unsupportedmediatype/ApplicationUnitTest.java diff --git a/spring-web-modules/spring-rest-http-2/src/test/resources/application.properties b/spring-web-modules/spring-rest-http-2/src/test/resources/application.properties index ff4af943ec..10ac1ab5fa 100644 --- a/spring-web-modules/spring-rest-http-2/src/test/resources/application.properties +++ b/spring-web-modules/spring-rest-http-2/src/test/resources/application.properties @@ -1 +1,2 @@ -spring.mvc.async.request-timeout=750 \ No newline at end of file +spring.mvc.async.request-timeout=750 +spring.main.allow-bean-definition-overriding=true From 538c116302454fe251b66773e3741a808fcb9185 Mon Sep 17 00:00:00 2001 From: chrisjaimes <45322800+chrisjaimes@users.noreply.github.com> Date: Sat, 14 May 2022 05:29:19 -0400 Subject: [PATCH 200/278] BAEL-5521 Convert boolean to int in Java (#12017) * added class for Article examples, created unit tests and modified pom in order to call Apache Commons outside test * changed parameter to prevent NPE Co-authored-by: Christian Jaimes --- java-numbers-4/pom.xml | 1 - .../baeldung/booleantoint/BooleanToInt.java | 42 ++++++++++++++ .../booleantoint/BooleanToIntUnitTest.java | 55 +++++++++++++++++++ 3 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 java-numbers-4/src/main/java/com/baeldung/booleantoint/BooleanToInt.java create mode 100644 java-numbers-4/src/test/java/com/baeldung/booleantoint/BooleanToIntUnitTest.java diff --git a/java-numbers-4/pom.xml b/java-numbers-4/pom.xml index 40fe17cc0d..4750b58511 100644 --- a/java-numbers-4/pom.xml +++ b/java-numbers-4/pom.xml @@ -23,7 +23,6 @@ org.apache.commons commons-lang3 ${commons-lang3.version} - test com.google.guava diff --git a/java-numbers-4/src/main/java/com/baeldung/booleantoint/BooleanToInt.java b/java-numbers-4/src/main/java/com/baeldung/booleantoint/BooleanToInt.java new file mode 100644 index 0000000000..3cca1592fb --- /dev/null +++ b/java-numbers-4/src/main/java/com/baeldung/booleantoint/BooleanToInt.java @@ -0,0 +1,42 @@ +package com.baeldung.booleantoint; + +import org.apache.commons.lang3.BooleanUtils; + +public class BooleanToInt { + public static int booleanPrimitiveToInt(boolean foo) { + int bar = 0; + if (foo) { + bar = 1; + } + return bar; + } + + public static int booleanPrimitiveToIntTernary(boolean foo) { + return (foo) ? 1 : 0; + } + + public static int booleanObjectToInt(boolean foo) { + return Boolean.compare(foo, false); + } + + public static int booleanObjectToIntInverse(boolean foo) { + return Boolean.compare(foo, true) + 1; + } + + public static int booleanObjectMethodToInt(Boolean foo) { + return foo.compareTo(false); + } + + public static int booleanObjectMethodToIntInverse(Boolean foo) { + return foo.compareTo(true) + 1; + } + + public static int booleanUtilsToInt(Boolean foo) { + return BooleanUtils.toInteger(foo); + } + + public static int bitwiseBooleanToInt(Boolean foo) { + return (Boolean.hashCode(foo) >> 1) & 1; + } +} + diff --git a/java-numbers-4/src/test/java/com/baeldung/booleantoint/BooleanToIntUnitTest.java b/java-numbers-4/src/test/java/com/baeldung/booleantoint/BooleanToIntUnitTest.java new file mode 100644 index 0000000000..032eb1d28c --- /dev/null +++ b/java-numbers-4/src/test/java/com/baeldung/booleantoint/BooleanToIntUnitTest.java @@ -0,0 +1,55 @@ +package com.baeldung.booleantoint; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class BooleanToIntUnitTest { + @Test + void givenBooleanPrimitiveValue_ThenReturnInt() { + assertEquals(1, BooleanToInt.booleanPrimitiveToInt(true)); + assertEquals(0, BooleanToInt.booleanPrimitiveToInt(false)); + } + + @Test + void givenBooleanPrimitiveValue_ThenReturnIntTernary() { + assertEquals(1, BooleanToInt.booleanPrimitiveToIntTernary(true)); + assertEquals(0, BooleanToInt.booleanPrimitiveToIntTernary(false)); + } + + @Test + void givenBooleanObject_ThenReturnInt() { + assertEquals(0, BooleanToInt.booleanObjectToInt(false)); + assertEquals(1, BooleanToInt.booleanObjectToInt(true)); + } + + @Test + void givenBooleanObject_ThenReturnIntInverse() { + assertEquals(0, BooleanToInt.booleanObjectToIntInverse(false)); + assertEquals(1, BooleanToInt.booleanObjectToIntInverse(true)); + } + + @Test + void givenBooleanObject_ThenReturnIntUsingClassMethod() { + assertEquals(0, BooleanToInt.booleanObjectMethodToInt(false)); + assertEquals(1, BooleanToInt.booleanObjectMethodToInt(true)); + } + + @Test + void givenBooleanObject_ThenReturnIntUsingClassMethodInverse() { + assertEquals(0, BooleanToInt.booleanObjectMethodToIntInverse(false)); + assertEquals(1, BooleanToInt.booleanObjectMethodToIntInverse(true)); + } + + @Test + void givenBoolean_ThenReturnIntUsingBooleanUtils() { + assertEquals(0, BooleanToInt.booleanUtilsToInt(false)); + assertEquals(1, BooleanToInt.booleanUtilsToInt(true)); + } + + @Test + void givenBoolean_ThenReturnIntUsingBitwiseOperators() { + assertEquals(0, BooleanToInt.bitwiseBooleanToInt(false)); + assertEquals(1, BooleanToInt.bitwiseBooleanToInt(true)); + } +} From 4f8d67b7c1cecade87c5ea879354372bcf47fbd0 Mon Sep 17 00:00:00 2001 From: Eric Martin Date: Sat, 14 May 2022 11:17:48 -0500 Subject: [PATCH 201/278] BAEL-5577: Moving code to core-java-collections-4 (#12210) Co-authored-by: martine --- .../core-java-collections-list-4/README.md | 7 +++ .../core-java-collections-list-4/pom.xml | 56 +++++++++++++++++++ .../list/listoflists/ListOfListsUnitTest.java | 0 .../test/resources/listoflists/example.csv | 0 core-java-modules/pom.xml | 1 + 5 files changed, 64 insertions(+) create mode 100644 core-java-modules/core-java-collections-list-4/README.md create mode 100644 core-java-modules/core-java-collections-list-4/pom.xml rename core-java-modules/{core-java-collections-list-3 => core-java-collections-list-4}/src/test/java/com/baeldung/list/listoflists/ListOfListsUnitTest.java (100%) rename core-java-modules/{core-java-collections-list-3 => core-java-collections-list-4}/src/test/resources/listoflists/example.csv (100%) diff --git a/core-java-modules/core-java-collections-list-4/README.md b/core-java-modules/core-java-collections-list-4/README.md new file mode 100644 index 0000000000..3a90b3d813 --- /dev/null +++ b/core-java-modules/core-java-collections-list-4/README.md @@ -0,0 +1,7 @@ +## Core Java Collections List (Part 4) + +This module contains articles about the Java List collection + +### Relevant Articles: +- [Working With a List of Lists in Java](https://www.baeldung.com/java-list-of-lists) +- [[<-- Prev]](/core-java-modules/core-java-collections-list-3) diff --git a/core-java-modules/core-java-collections-list-4/pom.xml b/core-java-modules/core-java-collections-list-4/pom.xml new file mode 100644 index 0000000000..8c1d3a881e --- /dev/null +++ b/core-java-modules/core-java-collections-list-4/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + core-java-collections-list-4 + 0.1.0-SNAPSHOT + core-java-collections-list-4 + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + + net.sf.trove4j + trove4j + ${trove4j.version} + + + it.unimi.dsi + fastutil + ${fastutil.version} + + + colt + colt + ${colt.version} + + + org.openjdk.jmh + jmh-core + ${jmh-core.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh-generator.version} + + + + + 3.0.2 + 8.1.0 + 1.2.0 + + + \ No newline at end of file diff --git a/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/listoflists/ListOfListsUnitTest.java b/core-java-modules/core-java-collections-list-4/src/test/java/com/baeldung/list/listoflists/ListOfListsUnitTest.java similarity index 100% rename from core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/listoflists/ListOfListsUnitTest.java rename to core-java-modules/core-java-collections-list-4/src/test/java/com/baeldung/list/listoflists/ListOfListsUnitTest.java diff --git a/core-java-modules/core-java-collections-list-3/src/test/resources/listoflists/example.csv b/core-java-modules/core-java-collections-list-4/src/test/resources/listoflists/example.csv similarity index 100% rename from core-java-modules/core-java-collections-list-3/src/test/resources/listoflists/example.csv rename to core-java-modules/core-java-collections-list-4/src/test/resources/listoflists/example.csv diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 04b46e3740..15347d0fe9 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -35,6 +35,7 @@ core-java-collections-list core-java-collections-list-2 core-java-collections-list-3 + core-java-collections-list-4 core-java-collections-maps core-java-collections-maps-2 core-java-collections-maps-3 From 8eadd920467ffea5e7e2975bbb0cb7c789bf8ccf Mon Sep 17 00:00:00 2001 From: Luis Javier Peris Morillo Date: Sat, 14 May 2022 18:33:51 +0200 Subject: [PATCH 202/278] refactor: split spring security module (#12211) Refs #BAEL-5339 --- spring-security-modules/pom.xml | 1 + .../spring-security-core-2/.gitignore | 1 + .../spring-security-core-2/README.md | 10 ++ .../spring-security-core-2/pom.xml | 103 ++++++++++++++++++ .../exceptionhandler/AppInitializer.java | 0 .../controller/AccessDeniedController.java | 0 .../controller/CustomErrorController.java | 0 .../controller/HomeController.java | 0 .../controller/SecuredResourceController.java | 0 .../security/CustomAccessDeniedHandler.java | 0 .../CustomAuthenticationFailureHandler.java | 0 .../CustomAuthenticationSuccessHandler.java | 0 .../security/SecurityConfig.java | 0 .../src/main/resources/application.properties | 0 .../src/main/resources/templates/admin.html | 0 .../src/main/resources/templates/denied.html | 0 .../src/main/resources/templates/error.html | 0 .../src/main/resources/templates/index.html | 0 .../SecurityConfigUnitTest.java | 0 19 files changed, 115 insertions(+) create mode 100644 spring-security-modules/spring-security-core-2/.gitignore create mode 100644 spring-security-modules/spring-security-core-2/README.md create mode 100644 spring-security-modules/spring-security-core-2/pom.xml rename spring-security-modules/{spring-security-core => spring-security-core-2}/src/main/java/com/baeldung/exceptionhandler/AppInitializer.java (100%) rename spring-security-modules/{spring-security-core => spring-security-core-2}/src/main/java/com/baeldung/exceptionhandler/controller/AccessDeniedController.java (100%) rename spring-security-modules/{spring-security-core => spring-security-core-2}/src/main/java/com/baeldung/exceptionhandler/controller/CustomErrorController.java (100%) rename spring-security-modules/{spring-security-core => spring-security-core-2}/src/main/java/com/baeldung/exceptionhandler/controller/HomeController.java (100%) rename spring-security-modules/{spring-security-core => spring-security-core-2}/src/main/java/com/baeldung/exceptionhandler/controller/SecuredResourceController.java (100%) rename spring-security-modules/{spring-security-core => spring-security-core-2}/src/main/java/com/baeldung/exceptionhandler/security/CustomAccessDeniedHandler.java (100%) rename spring-security-modules/{spring-security-core => spring-security-core-2}/src/main/java/com/baeldung/exceptionhandler/security/CustomAuthenticationFailureHandler.java (100%) rename spring-security-modules/{spring-security-core => spring-security-core-2}/src/main/java/com/baeldung/exceptionhandler/security/CustomAuthenticationSuccessHandler.java (100%) rename spring-security-modules/{spring-security-core => spring-security-core-2}/src/main/java/com/baeldung/exceptionhandler/security/SecurityConfig.java (100%) rename spring-security-modules/{spring-security-core => spring-security-core-2}/src/main/resources/application.properties (100%) rename spring-security-modules/{spring-security-core => spring-security-core-2}/src/main/resources/templates/admin.html (100%) rename spring-security-modules/{spring-security-core => spring-security-core-2}/src/main/resources/templates/denied.html (100%) rename spring-security-modules/{spring-security-core => spring-security-core-2}/src/main/resources/templates/error.html (100%) rename spring-security-modules/{spring-security-core => spring-security-core-2}/src/main/resources/templates/index.html (100%) rename spring-security-modules/{spring-security-core => spring-security-core-2}/src/test/java/com/baeldung/exceptionhandler/SecurityConfigUnitTest.java (100%) diff --git a/spring-security-modules/pom.xml b/spring-security-modules/pom.xml index bb36909c79..eb643c78c7 100644 --- a/spring-security-modules/pom.xml +++ b/spring-security-modules/pom.xml @@ -22,6 +22,7 @@ spring-security-acl spring-security-auth0 spring-security-core + spring-security-core-2 spring-security-ldap spring-security-legacy-oidc spring-security-oauth2-sso diff --git a/spring-security-modules/spring-security-core-2/.gitignore b/spring-security-modules/spring-security-core-2/.gitignore new file mode 100644 index 0000000000..9f970225ad --- /dev/null +++ b/spring-security-modules/spring-security-core-2/.gitignore @@ -0,0 +1 @@ +target/ \ No newline at end of file diff --git a/spring-security-modules/spring-security-core-2/README.md b/spring-security-modules/spring-security-core-2/README.md new file mode 100644 index 0000000000..9ce12af8ef --- /dev/null +++ b/spring-security-modules/spring-security-core-2/README.md @@ -0,0 +1,10 @@ +## Spring Security Core + +This module contains articles about core Spring Security + +### Relevant Articles: +- [Handle Spring Security Exceptions](https://www.baeldung.com/spring-security-exceptions) + +### Build the Project + +`mvn clean install` diff --git a/spring-security-modules/spring-security-core-2/pom.xml b/spring-security-modules/spring-security-core-2/pom.xml new file mode 100644 index 0000000000..cf150bfd42 --- /dev/null +++ b/spring-security-modules/spring-security-core-2/pom.xml @@ -0,0 +1,103 @@ + + + 4.0.0 + spring-security-core-2 + 0.1-SNAPSHOT + spring-security-core-2 + war + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-devtools + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-web + + + com.h2database + h2 + runtime + + + org.springframework.security + spring-security-test + + + + + spring-security-core + + + src/main/resources + true + + + + + org.apache.maven.plugins + maven-war-plugin + + + + + + + live + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + none + + + **/*LiveTest.java + + + cargo + + + + + + + + + + + \ No newline at end of file diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/AppInitializer.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/exceptionhandler/AppInitializer.java similarity index 100% rename from spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/AppInitializer.java rename to spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/exceptionhandler/AppInitializer.java diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/controller/AccessDeniedController.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/exceptionhandler/controller/AccessDeniedController.java similarity index 100% rename from spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/controller/AccessDeniedController.java rename to spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/exceptionhandler/controller/AccessDeniedController.java diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/controller/CustomErrorController.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/exceptionhandler/controller/CustomErrorController.java similarity index 100% rename from spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/controller/CustomErrorController.java rename to spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/exceptionhandler/controller/CustomErrorController.java diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/controller/HomeController.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/exceptionhandler/controller/HomeController.java similarity index 100% rename from spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/controller/HomeController.java rename to spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/exceptionhandler/controller/HomeController.java diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/controller/SecuredResourceController.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/exceptionhandler/controller/SecuredResourceController.java similarity index 100% rename from spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/controller/SecuredResourceController.java rename to spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/exceptionhandler/controller/SecuredResourceController.java diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/security/CustomAccessDeniedHandler.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/exceptionhandler/security/CustomAccessDeniedHandler.java similarity index 100% rename from spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/security/CustomAccessDeniedHandler.java rename to spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/exceptionhandler/security/CustomAccessDeniedHandler.java diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/security/CustomAuthenticationFailureHandler.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/exceptionhandler/security/CustomAuthenticationFailureHandler.java similarity index 100% rename from spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/security/CustomAuthenticationFailureHandler.java rename to spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/exceptionhandler/security/CustomAuthenticationFailureHandler.java diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/security/CustomAuthenticationSuccessHandler.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/exceptionhandler/security/CustomAuthenticationSuccessHandler.java similarity index 100% rename from spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/security/CustomAuthenticationSuccessHandler.java rename to spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/exceptionhandler/security/CustomAuthenticationSuccessHandler.java diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/security/SecurityConfig.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/exceptionhandler/security/SecurityConfig.java similarity index 100% rename from spring-security-modules/spring-security-core/src/main/java/com/baeldung/exceptionhandler/security/SecurityConfig.java rename to spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/exceptionhandler/security/SecurityConfig.java diff --git a/spring-security-modules/spring-security-core/src/main/resources/application.properties b/spring-security-modules/spring-security-core-2/src/main/resources/application.properties similarity index 100% rename from spring-security-modules/spring-security-core/src/main/resources/application.properties rename to spring-security-modules/spring-security-core-2/src/main/resources/application.properties diff --git a/spring-security-modules/spring-security-core/src/main/resources/templates/admin.html b/spring-security-modules/spring-security-core-2/src/main/resources/templates/admin.html similarity index 100% rename from spring-security-modules/spring-security-core/src/main/resources/templates/admin.html rename to spring-security-modules/spring-security-core-2/src/main/resources/templates/admin.html diff --git a/spring-security-modules/spring-security-core/src/main/resources/templates/denied.html b/spring-security-modules/spring-security-core-2/src/main/resources/templates/denied.html similarity index 100% rename from spring-security-modules/spring-security-core/src/main/resources/templates/denied.html rename to spring-security-modules/spring-security-core-2/src/main/resources/templates/denied.html diff --git a/spring-security-modules/spring-security-core/src/main/resources/templates/error.html b/spring-security-modules/spring-security-core-2/src/main/resources/templates/error.html similarity index 100% rename from spring-security-modules/spring-security-core/src/main/resources/templates/error.html rename to spring-security-modules/spring-security-core-2/src/main/resources/templates/error.html diff --git a/spring-security-modules/spring-security-core/src/main/resources/templates/index.html b/spring-security-modules/spring-security-core-2/src/main/resources/templates/index.html similarity index 100% rename from spring-security-modules/spring-security-core/src/main/resources/templates/index.html rename to spring-security-modules/spring-security-core-2/src/main/resources/templates/index.html diff --git a/spring-security-modules/spring-security-core/src/test/java/com/baeldung/exceptionhandler/SecurityConfigUnitTest.java b/spring-security-modules/spring-security-core-2/src/test/java/com/baeldung/exceptionhandler/SecurityConfigUnitTest.java similarity index 100% rename from spring-security-modules/spring-security-core/src/test/java/com/baeldung/exceptionhandler/SecurityConfigUnitTest.java rename to spring-security-modules/spring-security-core-2/src/test/java/com/baeldung/exceptionhandler/SecurityConfigUnitTest.java From f16942b0c172f099aa7c54c197c26fe52d5753f8 Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Sun, 15 May 2022 00:04:42 +0100 Subject: [PATCH 203/278] [JAVA-8150] Update webclient to use retrieve() method instead of deprecated API --- .../WebClientRequestsUnitTest.java | 176 ---------------- ...bClientRequestsWithParametersUnitTest.java | 194 ++++++++++++++++++ 2 files changed, 194 insertions(+), 176 deletions(-) delete mode 100644 spring-reactive/src/test/java/com/baeldung/reactive/webclientrequests/WebClientRequestsUnitTest.java create mode 100644 spring-reactive/src/test/java/com/baeldung/reactive/webclientrequests/WebClientRequestsWithParametersUnitTest.java diff --git a/spring-reactive/src/test/java/com/baeldung/reactive/webclientrequests/WebClientRequestsUnitTest.java b/spring-reactive/src/test/java/com/baeldung/reactive/webclientrequests/WebClientRequestsUnitTest.java deleted file mode 100644 index ff59f12391..0000000000 --- a/spring-reactive/src/test/java/com/baeldung/reactive/webclientrequests/WebClientRequestsUnitTest.java +++ /dev/null @@ -1,176 +0,0 @@ -package com.baeldung.reactive.webclientrequests; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; -import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.web.reactive.function.client.ClientRequest; -import org.springframework.web.reactive.function.client.ClientResponse; -import org.springframework.web.reactive.function.client.ExchangeFunction; -import org.springframework.web.reactive.function.client.WebClient; -import org.springframework.web.util.DefaultUriBuilderFactory; -import reactor.core.publisher.Mono; - -import java.time.Duration; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verifyNoMoreInteractions; -import static org.mockito.Mockito.when; - -@RunWith(SpringRunner.class) -@WebFluxTest -public class WebClientRequestsUnitTest { - - private static final String BASE_URL = "https://example.com"; - - private WebClient webClient; - - @Captor - private ArgumentCaptor argumentCaptor; - - private ExchangeFunction exchangeFunction; - - @Before - public void init() { - MockitoAnnotations.initMocks(this); - this.exchangeFunction = mock(ExchangeFunction.class); - ClientResponse mockResponse = mock(ClientResponse.class); - when(this.exchangeFunction.exchange(this.argumentCaptor.capture())).thenReturn(Mono.just(mockResponse)); - this.webClient = WebClient - .builder() - .baseUrl(BASE_URL) - .exchangeFunction(exchangeFunction) - .build(); - } - - @Test - public void whenCallSimpleURI_thenURIMatched() { - this.webClient.get() - .uri("/products") - .exchange() - .block(Duration.ofSeconds(1)); - verifyCalledUrl("/products"); - } - - @Test - public void whenCallSinglePathSegmentUri_thenURIMatched() { - this.webClient.get() - .uri(uriBuilder -> uriBuilder - .path("/products/{id}") - .build(2)) - .exchange() - .block(Duration.ofSeconds(1)); - verifyCalledUrl("/products/2"); - } - - @Test - public void whenCallMultiplePathSegmentsUri_thenURIMatched() { - this.webClient.get() - .uri(uriBuilder -> uriBuilder - .path("/products/{id}/attributes/{attributeId}") - .build(2, 13)) - .exchange() - .block(Duration.ofSeconds(1)); - verifyCalledUrl("/products/2/attributes/13"); - } - - @Test - public void whenCallSingleQueryParams_thenURIMatched() { - this.webClient.get() - .uri(uriBuilder -> uriBuilder - .path("/products/") - .queryParam("name", "AndroidPhone") - .queryParam("color", "black") - .queryParam("deliveryDate", "13/04/2019") - .build()) - .exchange() - .block(Duration.ofSeconds(1)); - verifyCalledUrl("/products/?name=AndroidPhone&color=black&deliveryDate=13/04/2019"); - } - - @Test - public void whenCallSingleQueryParamsPlaceholders_thenURIMatched() { - this.webClient.get() - .uri(uriBuilder -> uriBuilder - .path("/products/") - .queryParam("name", "{title}") - .queryParam("color", "{authorId}") - .queryParam("deliveryDate", "{date}") - .build("AndroidPhone", "black", "13/04/2019")) - .exchange() - .block(Duration.ofSeconds(1)); - verifyCalledUrl("/products/?name=AndroidPhone&color=black&deliveryDate=13%2F04%2F2019"); - } - - @Test - public void whenCallArrayQueryParamsBrackets_thenURIMatched() { - this.webClient.get() - .uri(uriBuilder -> uriBuilder - .path("/products/") - .queryParam("tag[]", "Snapdragon", "NFC") - .build()) - .exchange() - .block(Duration.ofSeconds(1)); - verifyCalledUrl("/products/?tag%5B%5D=Snapdragon&tag%5B%5D=NFC"); - } - - - @Test - public void whenCallArrayQueryParams_thenURIMatched() { - this.webClient.get() - .uri(uriBuilder -> uriBuilder - .path("/products/") - .queryParam("category", "Phones", "Tablets") - .build()) - .exchange() - .block(Duration.ofSeconds(1)); - verifyCalledUrl("/products/?category=Phones&category=Tablets"); - } - - @Test - public void whenCallArrayQueryParamsComma_thenURIMatched() { - this.webClient.get() - .uri(uriBuilder -> uriBuilder - .path("/products/") - .queryParam("category", String.join(",", "Phones", "Tablets")) - .build()) - .exchange() - .block(Duration.ofSeconds(1)); - verifyCalledUrl("/products/?category=Phones,Tablets"); - } - - @Test - public void whenUriComponentEncoding_thenQueryParamsNotEscaped() { - DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory(BASE_URL); - factory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.URI_COMPONENT); - this.webClient = WebClient - .builder() - .uriBuilderFactory(factory) - .baseUrl(BASE_URL) - .exchangeFunction(exchangeFunction) - .build(); - this.webClient.get() - .uri(uriBuilder -> uriBuilder - .path("/products/") - .queryParam("name", "AndroidPhone") - .queryParam("color", "black") - .queryParam("deliveryDate", "13/04/2019") - .build()) - .exchange() - .block(Duration.ofSeconds(1)); - verifyCalledUrl("/products/?name=AndroidPhone&color=black&deliveryDate=13/04/2019"); - } - - private void verifyCalledUrl(String relativeUrl) { - ClientRequest request = this.argumentCaptor.getValue(); - Assert.assertEquals(String.format("%s%s", BASE_URL, relativeUrl), request.url().toString()); - Mockito.verify(this.exchangeFunction).exchange(request); - verifyNoMoreInteractions(this.exchangeFunction); - } -} diff --git a/spring-reactive/src/test/java/com/baeldung/reactive/webclientrequests/WebClientRequestsWithParametersUnitTest.java b/spring-reactive/src/test/java/com/baeldung/reactive/webclientrequests/WebClientRequestsWithParametersUnitTest.java new file mode 100644 index 0000000000..eefde078e1 --- /dev/null +++ b/spring-reactive/src/test/java/com/baeldung/reactive/webclientrequests/WebClientRequestsWithParametersUnitTest.java @@ -0,0 +1,194 @@ +package com.baeldung.reactive.webclientrequests; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.Mock; +import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.web.reactive.function.client.ClientRequest; +import org.springframework.web.reactive.function.client.ClientResponse; +import org.springframework.web.reactive.function.client.ExchangeFunction; +import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.util.DefaultUriBuilderFactory; +import reactor.core.publisher.Mono; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.when; + +@RunWith(SpringRunner.class) +@WebFluxTest +public class WebClientRequestsWithParametersUnitTest { + + private static final String BASE_URL = "https://example.com"; + + private WebClient webClient; + + @Captor + private ArgumentCaptor argumentCaptor; + + @Mock + private ExchangeFunction exchangeFunction; + + @Before + public void init() { + ClientResponse mockResponse = mock(ClientResponse.class); + when(mockResponse.bodyToMono(String.class)).thenReturn(Mono.just("test")); + when(exchangeFunction.exchange(argumentCaptor.capture())).thenReturn(Mono.just(mockResponse)); + + webClient = WebClient + .builder() + .baseUrl(BASE_URL) + .exchangeFunction(exchangeFunction) + .build(); + } + + @Test + public void whenCallSimpleURI_thenURIMatched() { + webClient.get() + .uri("/products") + .retrieve() + .bodyToMono(String.class) + .block(); + + verifyCalledUrl("/products"); + } + + @Test + public void whenCallSinglePathSegmentUri_thenURIMatched() { + webClient.get() + .uri(uriBuilder -> uriBuilder + .path("/products/{id}") + .build(2)) + .retrieve() + .bodyToMono(String.class) + .block(); + + verifyCalledUrl("/products/2"); + } + + @Test + public void whenCallMultiplePathSegmentsUri_thenURIMatched() { + webClient.get() + .uri(uriBuilder -> uriBuilder + .path("/products/{id}/attributes/{attributeId}") + .build(2, 13)) + .retrieve() + .bodyToMono(String.class) + .block(); + + verifyCalledUrl("/products/2/attributes/13"); + } + + @Test + public void whenCallSingleQueryParams_thenURIMatched() { + webClient.get() + .uri(uriBuilder -> uriBuilder + .path("/products/") + .queryParam("name", "AndroidPhone") + .queryParam("color", "black") + .queryParam("deliveryDate", "13/04/2019") + .build()) + .retrieve() + .bodyToMono(String.class) + .block(); + + verifyCalledUrl("/products/?name=AndroidPhone&color=black&deliveryDate=13/04/2019"); + } + + @Test + public void whenCallSingleQueryParamsPlaceholders_thenURIMatched() { + webClient.get() + .uri(uriBuilder -> uriBuilder + .path("/products/") + .queryParam("name", "{title}") + .queryParam("color", "{authorId}") + .queryParam("deliveryDate", "{date}") + .build("AndroidPhone", "black", "13/04/2019")) + .retrieve() + .bodyToMono(String.class) + .block(); + + verifyCalledUrl("/products/?name=AndroidPhone&color=black&deliveryDate=13%2F04%2F2019"); + } + + @Test + public void whenCallArrayQueryParamsBrackets_thenURIMatched() { + webClient.get() + .uri(uriBuilder -> uriBuilder + .path("/products/") + .queryParam("tag[]", "Snapdragon", "NFC") + .build()) + .retrieve() + .bodyToMono(String.class) + .block(); + + verifyCalledUrl("/products/?tag%5B%5D=Snapdragon&tag%5B%5D=NFC"); + } + + @Test + public void whenCallArrayQueryParams_thenURIMatched() { + webClient.get() + .uri(uriBuilder -> uriBuilder + .path("/products/") + .queryParam("category", "Phones", "Tablets") + .build()) + .retrieve() + .bodyToMono(String.class) + .block(); + + verifyCalledUrl("/products/?category=Phones&category=Tablets"); + } + + @Test + public void whenCallArrayQueryParamsComma_thenURIMatched() { + webClient.get() + .uri(uriBuilder -> uriBuilder + .path("/products/") + .queryParam("category", String.join(",", "Phones", "Tablets")) + .build()) + .retrieve() + .bodyToMono(String.class) + .block(); + + verifyCalledUrl("/products/?category=Phones,Tablets"); + } + + @Test + public void whenUriComponentEncoding_thenQueryParamsNotEscaped() { + DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory(BASE_URL); + factory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.URI_COMPONENT); + webClient = WebClient + .builder() + .uriBuilderFactory(factory) + .baseUrl(BASE_URL) + .exchangeFunction(exchangeFunction) + .build(); + + webClient.get() + .uri(uriBuilder -> uriBuilder + .path("/products/") + .queryParam("name", "AndroidPhone") + .queryParam("color", "black") + .queryParam("deliveryDate", "13/04/2019") + .build()) + .retrieve() + .bodyToMono(String.class) + .block(); + + verifyCalledUrl("/products/?name=AndroidPhone&color=black&deliveryDate=13/04/2019"); + } + + private void verifyCalledUrl(String relativeUrl) { + ClientRequest request = argumentCaptor.getValue(); + assertEquals(String.format("%s%s", BASE_URL, relativeUrl), request.url().toString()); + + verify(exchangeFunction).exchange(request); + verifyNoMoreInteractions(exchangeFunction); + } +} From be944bc3010042e28d5aa8ecf650a32c13634500 Mon Sep 17 00:00:00 2001 From: ACHRAF TAITAI <43656331+achraftt@users.noreply.github.com> Date: Sun, 15 May 2022 07:12:48 +0200 Subject: [PATCH 204/278] Upgrade JCache article (#12213) --- libraries-data/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries-data/pom.xml b/libraries-data/pom.xml index dd48453a8c..c33be5b192 100644 --- a/libraries-data/pom.xml +++ b/libraries-data/pom.xml @@ -172,9 +172,9 @@ 1.0.0 2.4.0 2.8.2 - 1.1.0 + 1.1.1 1.5.0 - 3.8.4 + 5.1.1 0.15.0 2.2.0 1.6.0.1 From 8e7dc50c0e4ba9df54189f2be798134ff961ee42 Mon Sep 17 00:00:00 2001 From: kwoyke Date: Sun, 15 May 2022 08:53:05 +0200 Subject: [PATCH 205/278] Java 11788 (#12204) * JAVA-11788: Cleanup pom properties in core-java-modules * JAVA-11788: Cleanup pom properties --- core-java-modules/core-java-collections-4/pom.xml | 6 +++++- core-java-modules/core-java/pom.xml | 3 ++- .../java-collections-conversions-2/pom.xml | 6 +++++- core-java-modules/java-collections-maps-3/pom.xml | 2 +- docker/docker-caching/multi-module-caching/pom.xml | 3 ++- docker/docker-caching/single-module-caching/pom.xml | 3 ++- grpc/pom.xml | 3 ++- json-2/pom.xml | 12 ++++++++---- kubernetes/k8s-intro/pom.xml | 6 +++++- 9 files changed, 32 insertions(+), 12 deletions(-) diff --git a/core-java-modules/core-java-collections-4/pom.xml b/core-java-modules/core-java-collections-4/pom.xml index 68d7df66d0..aaf63a2b2a 100644 --- a/core-java-modules/core-java-collections-4/pom.xml +++ b/core-java-modules/core-java-collections-4/pom.xml @@ -18,8 +18,12 @@ commons-lang commons-lang - 2.2 + ${commons-lang.version} + + 2.2 + + \ No newline at end of file diff --git a/core-java-modules/core-java/pom.xml b/core-java-modules/core-java/pom.xml index 786ee91192..87abe6c007 100644 --- a/core-java-modules/core-java/pom.xml +++ b/core-java-modules/core-java/pom.xml @@ -67,7 +67,7 @@ com.google.gdata core - 1.47.1 + ${gdata.version} @@ -193,6 +193,7 @@ 1.8 1.8 4.3.20.RELEASE + 1.47.1 \ No newline at end of file diff --git a/core-java-modules/java-collections-conversions-2/pom.xml b/core-java-modules/java-collections-conversions-2/pom.xml index 0f8e80fdbf..510921c35e 100644 --- a/core-java-modules/java-collections-conversions-2/pom.xml +++ b/core-java-modules/java-collections-conversions-2/pom.xml @@ -28,7 +28,7 @@ io.vavr vavr - 0.10.3 + ${vavr.version} @@ -42,4 +42,8 @@ + + 0.10.3 + + \ No newline at end of file diff --git a/core-java-modules/java-collections-maps-3/pom.xml b/core-java-modules/java-collections-maps-3/pom.xml index db56550d10..ab80a9e2fd 100644 --- a/core-java-modules/java-collections-maps-3/pom.xml +++ b/core-java-modules/java-collections-maps-3/pom.xml @@ -19,7 +19,7 @@ org.junit.jupiter junit-jupiter-api - 5.8.1 + ${junit-jupiter.version} org.springframework diff --git a/docker/docker-caching/multi-module-caching/pom.xml b/docker/docker-caching/multi-module-caching/pom.xml index e02ced2dca..7e279dc334 100644 --- a/docker/docker-caching/multi-module-caching/pom.xml +++ b/docker/docker-caching/multi-module-caching/pom.xml @@ -19,13 +19,14 @@ com.google.guava guava - 31.0.1-jre + ${guava.version} 1.8 + 31.0.1-jre \ No newline at end of file diff --git a/docker/docker-caching/single-module-caching/pom.xml b/docker/docker-caching/single-module-caching/pom.xml index 74bb477fb2..d7f96e1e7e 100644 --- a/docker/docker-caching/single-module-caching/pom.xml +++ b/docker/docker-caching/single-module-caching/pom.xml @@ -11,7 +11,7 @@ com.google.guava guava - 31.0.1-jre + ${guava.version} @@ -48,6 +48,7 @@ 8 8 + 31.0.1-jre \ No newline at end of file diff --git a/grpc/pom.xml b/grpc/pom.xml index 40284c90fe..40d35183dc 100644 --- a/grpc/pom.xml +++ b/grpc/pom.xml @@ -40,7 +40,7 @@ javax.annotation javax.annotation-api - 1.2 + ${annotation-api.version} @@ -79,6 +79,7 @@ 3.17.2 1.6.2 0.6.1 + 1.2 \ No newline at end of file diff --git a/json-2/pom.xml b/json-2/pom.xml index 3e12fccc29..6fbdebc953 100644 --- a/json-2/pom.xml +++ b/json-2/pom.xml @@ -27,7 +27,7 @@ org.jsonschema2pojo jsonschema2pojo-core - 1.1.1 + ${jsonschema2pojo-core.version} com.jsoniter @@ -62,7 +62,7 @@ com.io-informatics.oss jackson-jsonld - 0.1.1 + ${jackson-jsonld.version} jackson-databind @@ -85,7 +85,7 @@ de.escalon.hypermedia hydra-jsonld - 0.4.2 + ${hydra-jsonld.version} jackson-databind @@ -96,7 +96,7 @@ com.github.jsonld-java jsonld-java - 0.13.0 + ${jsonld-java.version} jackson-core @@ -154,6 +154,10 @@ 1.9.2 1.2.21 20211205 + 1.1.1 + 0.1.1 + 0.4.2 + 0.13.0 \ No newline at end of file diff --git a/kubernetes/k8s-intro/pom.xml b/kubernetes/k8s-intro/pom.xml index 6d1cec9971..067700bdad 100644 --- a/kubernetes/k8s-intro/pom.xml +++ b/kubernetes/k8s-intro/pom.xml @@ -15,7 +15,7 @@ io.kubernetes client-java - 11.0.0 + ${client-java.version} ch.qos.logback @@ -39,4 +39,8 @@ + + 11.0.0 + + \ No newline at end of file From 93b3264964f888c211933a0dc9934636011c9148 Mon Sep 17 00:00:00 2001 From: etrandafir93 <75391049+etrandafir93@users.noreply.github.com> Date: Sun, 15 May 2022 17:35:01 +0300 Subject: [PATCH 206/278] BAEL-5547: added code for specifications join (#12212) * BAEL-5547: added code for specifications join * BAEL-5547: renamed test class and formatted the code --- .../jpa/query/specifications/join/Author.java | 57 +++++++++++++ .../join/AuthorSpecifications.java | 24 ++++++ .../join/AuthorsRepository.java | 9 +++ .../jpa/query/specifications/join/Book.java | 37 +++++++++ .../SpecificationsJoinIntegrationTest.java | 80 +++++++++++++++++++ 5 files changed, 207 insertions(+) create mode 100644 persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/query/specifications/join/Author.java create mode 100644 persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/query/specifications/join/AuthorSpecifications.java create mode 100644 persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/query/specifications/join/AuthorsRepository.java create mode 100644 persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/query/specifications/join/Book.java create mode 100644 persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/query/specifications/join/SpecificationsJoinIntegrationTest.java diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/query/specifications/join/Author.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/query/specifications/join/Author.java new file mode 100644 index 0000000000..70e699ebeb --- /dev/null +++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/query/specifications/join/Author.java @@ -0,0 +1,57 @@ +package com.baeldung.spring.data.jpa.query.specifications.join; + +import javax.persistence.*; + +import java.util.List; + +@Entity +public class Author { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String firstName; + + private String lastName; + + @OneToMany(cascade = CascadeType.ALL) + private List books; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public List getBooks() { + return books; + } + + public void setBooks(List books) { + this.books = books; + } + + @Override + public String toString() { + return "Author{" + "id=" + id + ", firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' + ", books=" + books + '}'; + } +} diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/query/specifications/join/AuthorSpecifications.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/query/specifications/join/AuthorSpecifications.java new file mode 100644 index 0000000000..73d0cd6c01 --- /dev/null +++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/query/specifications/join/AuthorSpecifications.java @@ -0,0 +1,24 @@ +package com.baeldung.spring.data.jpa.query.specifications.join; + +import org.springframework.data.jpa.domain.Specification; + +import javax.persistence.criteria.*; + +public class AuthorSpecifications { + + public static Specification hasFirstNameLike(String name) { + return (root, query, criteriaBuilder) -> criteriaBuilder.like(root.get("firstName"), "%" + name + "%"); + } + + public static Specification hasLastName(String name) { + return (root, query, cb) -> cb.equal(root.get("lastName"), name); + } + + public static Specification hasBookWithTitle(String bookTitle) { + return (root, query, criteriaBuilder) -> { + Join authorsBook = root.join("books"); + return criteriaBuilder.equal(authorsBook.get("title"), bookTitle); + }; + } + +} \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/query/specifications/join/AuthorsRepository.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/query/specifications/join/AuthorsRepository.java new file mode 100644 index 0000000000..67fe86b8b3 --- /dev/null +++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/query/specifications/join/AuthorsRepository.java @@ -0,0 +1,9 @@ +package com.baeldung.spring.data.jpa.query.specifications.join; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.stereotype.Repository; + +@Repository +public interface AuthorsRepository extends JpaRepository, JpaSpecificationExecutor { +} \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/query/specifications/join/Book.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/query/specifications/join/Book.java new file mode 100644 index 0000000000..3d658ca107 --- /dev/null +++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/query/specifications/join/Book.java @@ -0,0 +1,37 @@ +package com.baeldung.spring.data.jpa.query.specifications.join; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Book { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String title; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + @Override + public String toString() { + return "Book{" + "id=" + id + ", title='" + title + '\'' + '}'; + } +} diff --git a/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/query/specifications/join/SpecificationsJoinIntegrationTest.java b/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/query/specifications/join/SpecificationsJoinIntegrationTest.java new file mode 100644 index 0000000000..27db09d11c --- /dev/null +++ b/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/query/specifications/join/SpecificationsJoinIntegrationTest.java @@ -0,0 +1,80 @@ +package com.baeldung.spring.data.jpa.query.specifications.join; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.Arrays; +import java.util.List; + +import static com.baeldung.spring.data.jpa.query.specifications.join.AuthorSpecifications.*; +import static org.assertj.core.api.Assertions.assertThat; + +@RunWith(SpringRunner.class) +@DataJpaTest +public class SpecificationsJoinIntegrationTest { + + @Autowired + private AuthorsRepository repository; + + @Before + public void beforeEach() { + saveTestData(); + } + + @Test + public void whenSearchingByLastName_thenOneAuthorIsReturned() { + + List authors = repository.findAll(hasLastName("Martin")); + + assertThat(authors).hasSize(1); + } + + @Test + public void whenSearchingByLastNameAndFirstNameLike_thenOneAuthorIsReturned() { + + Specification specification = hasLastName("Martin").and(hasFirstNameLike("Robert")); + + List authors = repository.findAll(specification); + + assertThat(authors).hasSize(1); + } + + @Test + public void whenSearchingByBookTitle_thenOneAuthorIsReturned() { + + Specification specification = hasBookWithTitle("Clean Code"); + + List authors = repository.findAll(specification); + + assertThat(authors).hasSize(1); + } + + @Test + public void whenSearchingByBookTitleAndAuthorName_thenOneAuthorIsReturned() { + + Specification specification = hasLastName("Martin").and(hasBookWithTitle("Clean Code")); + + List authors = repository.findAll(specification); + + assertThat(authors).hasSize(1); + } + + private void saveTestData() { + Author uncleBob = new Author(); + uncleBob.setFirstName("Robert"); + uncleBob.setLastName("Martin"); + + Book book1 = new Book(); + book1.setTitle("Clean Code"); + Book book2 = new Book(); + book2.setTitle("Clean Architecture"); + + uncleBob.setBooks(Arrays.asList(book1, book2)); + repository.save(uncleBob); + } +} From 386707c24f7edfeca9bf9c2bf32051cc2f3495dd Mon Sep 17 00:00:00 2001 From: panagiotiskakos Date: Sun, 15 May 2022 18:28:33 +0300 Subject: [PATCH 207/278] [JAVA-10577] workaround for circular dependencies --- .../src/main/resources/application.properties | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/spring-security-modules/spring-security-saml/src/main/resources/application.properties b/spring-security-modules/spring-security-saml/src/main/resources/application.properties index 1d93a12737..fd7798dda9 100644 --- a/spring-security-modules/spring-security-saml/src/main/resources/application.properties +++ b/spring-security-modules/spring-security-saml/src/main/resources/application.properties @@ -1,8 +1,9 @@ -saml.keystore.location=classpath:/saml/samlKeystore.jks +saml.keystore.location=classpath:/saml/saml-keystore # Password for Java keystore and item therein saml.keystore.password= saml.keystore.alias= # SAML Entity ID extracted from top of SAML metadata file saml.idp= -saml.sp=http://localhost:8080/saml/metadata \ No newline at end of file +saml.sp=http://localhost:8080/saml/metadata +spring.main.allow-circular-references=true \ No newline at end of file From 0e501405a4a1f1589c918450f95cab7be90e2a30 Mon Sep 17 00:00:00 2001 From: Azhwani Date: Sun, 15 May 2022 19:20:04 +0200 Subject: [PATCH 208/278] init commit --- .../componentscan/springapp/SpringComponentScanApp.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/springapp/SpringComponentScanApp.java b/spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/springapp/SpringComponentScanApp.java index 8873f1214c..5d3cbe35cb 100644 --- a/spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/springapp/SpringComponentScanApp.java +++ b/spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/springapp/SpringComponentScanApp.java @@ -13,6 +13,10 @@ import org.springframework.context.annotation.Configuration; // @ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = Rose.class)) // @ComponentScan(basePackages = "com.baeldung.componentscan.springapp") // @ComponentScan(basePackages = "com.baeldung.componentscan.springapp.animals") +// @ComponentScan(basePackages = {"com.baeldung.componentscan.springapp.animals","com.baeldung.componentscan.springapp.flowers"}) +// @ComponentScan(basePackages = "com.baeldung.componentscan.springapp.animals;com.baeldung.componentscan.springapp.flowers") +// @ComponentScan(basePackages = "com.baeldung.componentscan.springapp.animals,com.baeldung.componentscan.springapp.flowers") +// @ComponentScan(basePackages = "com.baeldung.componentscan.springapp.animals com.baeldung.componentscan.springapp.flowers") // @ComponentScan (excludeFilters = @ComponentScan.Filter(type=FilterType.REGEX,pattern="com\\.baeldung\\.componentscan\\.springapp\\.flowers\\..*")) public class SpringComponentScanApp { From 8fc971657a6a7017fb0f78a4efe4b762acb979bd Mon Sep 17 00:00:00 2001 From: Thibault Faure Date: Fri, 29 Apr 2022 22:13:19 +0200 Subject: [PATCH 209/278] BAEL-5383 code for the use delimiters article --- .../java9/delimiters/DelimiterDemo.java | 36 ++++++++++ .../delimiters/DelimiterDemoUnitTest.java | 67 +++++++++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 core-java-modules/core-java-9/src/main/java/com/baeldung/java9/delimiters/DelimiterDemo.java create mode 100644 core-java-modules/core-java-9/src/test/java/com/baeldung/java9/delimiters/DelimiterDemoUnitTest.java diff --git a/core-java-modules/core-java-9/src/main/java/com/baeldung/java9/delimiters/DelimiterDemo.java b/core-java-modules/core-java-9/src/main/java/com/baeldung/java9/delimiters/DelimiterDemo.java new file mode 100644 index 0000000000..edc0b91d02 --- /dev/null +++ b/core-java-modules/core-java-9/src/main/java/com/baeldung/java9/delimiters/DelimiterDemo.java @@ -0,0 +1,36 @@ +package com.baeldung.java9.delimiters; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; +import java.util.regex.Pattern; + +public class DelimiterDemo { + + public static List scannerWithDelimiter(String input, String delimiter) { + try (Scanner scan = new Scanner(input)) { + scan.useDelimiter(delimiter); + List result = new ArrayList(); + scan.forEachRemaining(result::add); + return result; + } + } + + public static List scannerWithDelimiterUsingPattern(String input, Pattern delimiter) { + try (Scanner scan = new Scanner(input)) { + scan.useDelimiter(delimiter); + List result = new ArrayList(); + scan.forEachRemaining(result::add); + return result; + } + } + + public static List baseScanner(String input) { + try (Scanner scan = new Scanner(input)) { + List result = new ArrayList(); + scan.forEachRemaining(result::add); + return result; + } + } + +} diff --git a/core-java-modules/core-java-9/src/test/java/com/baeldung/java9/delimiters/DelimiterDemoUnitTest.java b/core-java-modules/core-java-9/src/test/java/com/baeldung/java9/delimiters/DelimiterDemoUnitTest.java new file mode 100644 index 0000000000..1c1fffe362 --- /dev/null +++ b/core-java-modules/core-java-9/src/test/java/com/baeldung/java9/delimiters/DelimiterDemoUnitTest.java @@ -0,0 +1,67 @@ +package com.baeldung.java9.delimiters; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Arrays; +import java.util.List; +import java.util.function.BiFunction; +import java.util.regex.Pattern; + +import org.junit.jupiter.api.Test; + +class DelimiterDemoUnitTest { + + @Test + void givenSimpleCharacterDelimiter_whenScannerWithDelimiter_ThenInputIsCorrectlyParsed() { + checkOutput(DelimiterDemo::scannerWithDelimiter, "Welcome to Baeldung", "\\s", Arrays.asList("Welcome", "to", "Baeldung")); + } + + @Test + void givenStringDelimiter_whenScannerWithDelimiter_ThenInputIsCorrectlyParsed() { + checkOutput(DelimiterDemo::scannerWithDelimiter, "HelloBaeldungHelloWorld", "Hello", Arrays.asList("Baeldung", "World")); + } + + @Test + void givenVariousPossibleDelimiters_whenScannerWithDelimiter_ThenInputIsCorrectlyParsed() { + checkOutput(DelimiterDemo::scannerWithDelimiter, "Welcome to Baeldung.\nThank you for reading.\nThe team", "\n|\\s", Arrays.asList("Welcome", "to", "Baeldung.", "Thank", "you", "for", "reading.", "The", "team")); + } + + @Test + void givenWildcardRegexDelimiter_whenScannerWithDelimiter_ThenInputIsCorrectlyParsed() { + checkOutput(DelimiterDemo::scannerWithDelimiter, "1aaaaaaa2aa3aaa4", "a+", Arrays.asList("1", "2", "3", "4")); + } + + @Test + void givenSimpleCharacterDelimiter_whenScannerWithDelimiterUsingPattern_ThenInputIsCorrectlyParsed() { + checkOutput(DelimiterDemo::scannerWithDelimiterUsingPattern, "Welcome to Baeldung", Pattern.compile("\\s"), Arrays.asList("Welcome", "to", "Baeldung")); + } + + @Test + void givenStringDelimiter_whenScannerWithDelimiterUsingPattern_ThenInputIsCorrectlyParsed() { + checkOutput(DelimiterDemo::scannerWithDelimiterUsingPattern, "HelloBaeldungHelloWorld", Pattern.compile("Hello"), Arrays.asList("Baeldung", "World")); + } + + @Test + void givenVariousPossibleDelimiters_whenScannerWithDelimiterUsingPattern_ThenInputIsCorrectlyParsed() { + checkOutput(DelimiterDemo::scannerWithDelimiterUsingPattern, "Welcome to Baeldung.\nThank you for reading.\nThe team", Pattern.compile("\n|\\s"), Arrays.asList("Welcome", "to", "Baeldung.", "Thank", "you", "for", "reading.", "The", "team")); + } + + @Test + void givenWildcardRegexDelimiters_whenScannerWithDelimiterUsingPattern_ThenInputIsCorrectlyParsed() { + checkOutput(DelimiterDemo::scannerWithDelimiterUsingPattern, "1aaaaaaa2aa3aaa4", Pattern.compile("a*"), Arrays.asList("1", "2", "3", "4")); + } + + void checkOutput(BiFunction> function, String input, String delimiter, List expectedOutput) { + assertEquals(expectedOutput, function.apply(input, delimiter)); + } + + void checkOutput(BiFunction> function, String input, Pattern delimiter, List expectedOutput) { + assertEquals(expectedOutput, function.apply(input, delimiter)); + } + + @Test + void whenBaseScanner_ThenWhitespacesAreUsedAsDelimiters() { + assertEquals(List.of("Welcome", "at", "Baeldung"), DelimiterDemo.baseScanner("Welcome at Baeldung")); + } + +} From f5f6459f566eb58c6fcf66f43623d217648fd733 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Mon, 16 May 2022 15:04:10 +0300 Subject: [PATCH 210/278] BAEL-5342 fix live test --- resteasy/pom.xml | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/resteasy/pom.xml b/resteasy/pom.xml index e4ab6d84b2..a8c1f2815c 100644 --- a/resteasy/pom.xml +++ b/resteasy/pom.xml @@ -20,12 +20,6 @@ org.jboss.resteasy resteasy-servlet-initializer ${resteasy.version} - - - commons-logging - commons-logging - - org.jboss.resteasy @@ -44,10 +38,11 @@ ${resteasy.version} - commons-io - commons-io - ${commons-io.version} + javax.servlet + javax.servlet-api + 4.0.1 + From 365f029e3a3fa5b22fd89c47d8b87254e0ccaf8a Mon Sep 17 00:00:00 2001 From: Alireza Ghasemi Date: Mon, 16 May 2022 17:34:55 +0200 Subject: [PATCH 211/278] Add tutorial files for ResultSet2JSON Article (#11912) * Add tutorial files * Move script to new folder * Use Maven/H2 instead of JBang/DuckDB * Use Java 8 * Usen an older versio of JOOQ * Format according to Beldung Intellij guide * Remove dangling commit * Use 2-space indentation * Apply formatting from Eclipse * Add unit test * Add assertion * Change test names * Change method names Co-authored-by: root Co-authored-by: Alireza Ghasemi --- .../core-java-persistence-2/example.csv | 4 + .../core-java-persistence-2/pom.xml | 18 ++- .../resultset2json/ResultSet2JSON.java | 137 ++++++++++++++++++ .../ResultSet2JSONUnitTest.java | 75 ++++++++++ 4 files changed, 231 insertions(+), 3 deletions(-) create mode 100644 persistence-modules/core-java-persistence-2/example.csv create mode 100755 persistence-modules/core-java-persistence-2/src/main/java/com/baeldung/resultset2json/ResultSet2JSON.java create mode 100644 persistence-modules/core-java-persistence-2/src/test/java/com/baeldung/resultset2json/ResultSet2JSONUnitTest.java diff --git a/persistence-modules/core-java-persistence-2/example.csv b/persistence-modules/core-java-persistence-2/example.csv new file mode 100644 index 0000000000..d7715864d1 --- /dev/null +++ b/persistence-modules/core-java-persistence-2/example.csv @@ -0,0 +1,4 @@ +Username,Id,First name,Last name +doe1,7173,John,Doe +smith3,3722,Dana,Smith +john22,5490,John,Wang \ No newline at end of file diff --git a/persistence-modules/core-java-persistence-2/pom.xml b/persistence-modules/core-java-persistence-2/pom.xml index 780c1fcfca..c7547e1c46 100644 --- a/persistence-modules/core-java-persistence-2/pom.xml +++ b/persistence-modules/core-java-persistence-2/pom.xml @@ -1,7 +1,5 @@ - + 4.0.0 com.baeldung.core-java-persistence-2 core-java-persistence-2 @@ -41,6 +39,20 @@ mssql-jdbc ${mssql.driver.version} + + + + org.jooq + jooq + 3.11.11 + + + + org.json + json + 20220320 + + diff --git a/persistence-modules/core-java-persistence-2/src/main/java/com/baeldung/resultset2json/ResultSet2JSON.java b/persistence-modules/core-java-persistence-2/src/main/java/com/baeldung/resultset2json/ResultSet2JSON.java new file mode 100755 index 0000000000..bbe3ccf9a0 --- /dev/null +++ b/persistence-modules/core-java-persistence-2/src/main/java/com/baeldung/resultset2json/ResultSet2JSON.java @@ -0,0 +1,137 @@ +package com.baeldung.resultset2json; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.jooq.Record; +import org.jooq.RecordMapper; +import org.jooq.impl.DSL; +import org.json.JSONException; +import org.json.JSONObject; +import org.json.JSONArray; + +public class ResultSet2JSON { + + public static void main(String... args) throws ClassNotFoundException, SQLException { + + ResultSet2JSON testClass = new ResultSet2JSON(); + testClass.convertWithoutJOOQ(); + } + + public void convertWithoutJOOQ() throws ClassNotFoundException, SQLException { + Class.forName("org.h2.Driver"); + Connection dbConnection = DriverManager.getConnection("jdbc:h2:mem:rs2jdbc", "user", "password"); + + // Create a table + Statement stmt = dbConnection.createStatement(); + stmt.execute("CREATE TABLE words AS SELECT * FROM CSVREAD('./example.csv')"); + ResultSet resultSet = stmt.executeQuery("SELECT * FROM words"); + + JSONArray result1 = resultSet2JdbcWithoutJOOQ(resultSet); + System.out.println(result1); + + resultSet.close(); + } + + public void convertUsingJOOQDefaultApproach() throws ClassNotFoundException, SQLException { + Class.forName("org.h2.Driver"); + Connection dbConnection = DriverManager.getConnection("jdbc:h2:mem:rs2jdbc", "user", "password"); + // Create a table + Statement stmt = dbConnection.createStatement(); + stmt.execute("CREATE TABLE words AS SELECT * FROM CSVREAD('./example.csv')"); + ResultSet resultSet = stmt.executeQuery("SELECT * FROM words"); + + JSONObject result1 = resultSet2JdbcUsingJOOQDefaultApproach(resultSet, dbConnection); + System.out.println(result1); + + resultSet.close(); + } + + public void convertUsingCustomisedJOOQ() throws ClassNotFoundException, SQLException { + Class.forName("org.h2.Driver"); + Connection dbConnection = DriverManager.getConnection("jdbc:h2:mem:rs2jdbc", "user", "password"); + // Create a table + Statement stmt = dbConnection.createStatement(); + stmt.execute("CREATE TABLE words AS SELECT * FROM CSVREAD('./example.csv')"); + ResultSet resultSet = stmt.executeQuery("SELECT * FROM words"); + + JSONArray result1 = resultSet2JdbcUsingCustomisedJOOQ(resultSet, dbConnection); + System.out.println(result1); + + resultSet.close(); + } + + public static JSONArray resultSet2JdbcWithoutJOOQ(ResultSet resultSet) throws SQLException { + ResultSetMetaData md = resultSet.getMetaData(); + int numCols = md.getColumnCount(); + List colNames = IntStream.range(0, numCols) + .mapToObj(i -> { + try { + return md.getColumnName(i + 1); + } catch (SQLException e) { + + e.printStackTrace(); + return "?"; + } + }) + .collect(Collectors.toList()); + + JSONArray result = new JSONArray(); + while (resultSet.next()) { + JSONObject row = new JSONObject(); + colNames.forEach(cn -> { + try { + row.put(cn, resultSet.getObject(cn)); + } catch (JSONException | SQLException e) { + + e.printStackTrace(); + } + }); + result.put(row); + } + return result; + } + + public static JSONObject resultSet2JdbcUsingJOOQDefaultApproach(ResultSet resultSet, Connection dbConnection) throws SQLException { + JSONObject result = new JSONObject(DSL.using(dbConnection) + .fetch(resultSet) + .formatJSON()); + return result; + } + + public static JSONArray resultSet2JdbcUsingCustomisedJOOQ(ResultSet resultSet, Connection dbConnection) throws SQLException { + ResultSetMetaData md = resultSet.getMetaData(); + int numCols = md.getColumnCount(); + List colNames = IntStream.range(0, numCols) + .mapToObj(i -> { + try { + return md.getColumnName(i + 1); + } catch (SQLException e) { + + e.printStackTrace(); + return "?"; + } + }) + .collect(Collectors.toList()); + + List json = DSL.using(dbConnection) + .fetch(resultSet) + .map(new RecordMapper() { + + @Override + public JSONObject map(Record r) { + JSONObject obj = new JSONObject(); + colNames.forEach(cn -> obj.put(cn, r.get(cn))); + return obj; + } + }); + return new JSONArray(json); + } +} diff --git a/persistence-modules/core-java-persistence-2/src/test/java/com/baeldung/resultset2json/ResultSet2JSONUnitTest.java b/persistence-modules/core-java-persistence-2/src/test/java/com/baeldung/resultset2json/ResultSet2JSONUnitTest.java new file mode 100644 index 0000000000..f3dd8350fa --- /dev/null +++ b/persistence-modules/core-java-persistence-2/src/test/java/com/baeldung/resultset2json/ResultSet2JSONUnitTest.java @@ -0,0 +1,75 @@ +package com.baeldung.resultset2json; + +import static com.baeldung.resultset2json.ResultSet2JSON.resultSet2JdbcWithoutJOOQ; +import static com.baeldung.resultset2json.ResultSet2JSON.resultSet2JdbcUsingJOOQDefaultApproach; +import static com.baeldung.resultset2json.ResultSet2JSON.resultSet2JdbcUsingCustomisedJOOQ; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +import org.json.JSONArray; +import org.json.JSONObject; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class ResultSet2JSONUnitTest { + JSONObject object = new JSONObject( + "{\"records\":[[\"doe1\",\"7173\",\"John\",\"Doe\"],[\"smith3\",\"3722\",\"Dana\",\"Smith\"],[\"john22\",\"5490\",\"John\",\"Wang\"]],\"fields\":[{\"schema\":\"PUBLIC\",\"name\":\"USERNAME\",\"type\":\"VARCHAR\",\"table\":\"WORDS\"},{\"schema\":\"PUBLIC\",\"name\":\"ID\",\"type\":\"VARCHAR\",\"table\":\"WORDS\"},{\"schema\":\"PUBLIC\",\"name\":\"First name\",\"type\":\"VARCHAR\",\"table\":\"WORDS\"},{\"schema\":\"PUBLIC\",\"name\":\"Last name\",\"type\":\"VARCHAR\",\"table\":\"WORDS\"}]}"); + + JSONArray array = new JSONArray( + "[{\"USERNAME\":\"doe1\",\"First name\":\"John\",\"ID\":\"7173\",\"Last name\":\"Doe\"},{\"USERNAME\":\"smith3\",\"First name\":\"Dana\",\"ID\":\"3722\",\"Last name\":\"Smith\"},{\"USERNAME\":\"john22\",\"First name\":\"John\",\"ID\":\"5490\",\"Last name\":\"Wang\"}]"); + + @Test + void whenResultSetConvertedWithoutJOOQ_shouldMatchJSON() throws SQLException, ClassNotFoundException { + Class.forName("org.h2.Driver"); + Connection dbConnection = DriverManager.getConnection("jdbc:h2:mem:rs2jdbc1", "user", "password"); + + // Create a table + Statement stmt = dbConnection.createStatement(); + stmt.execute("CREATE TABLE words AS SELECT * FROM CSVREAD('./example.csv')"); + ResultSet resultSet = stmt.executeQuery("SELECT * FROM words"); + + JSONArray result1 = resultSet2JdbcWithoutJOOQ(resultSet); + + resultSet.close(); + + assertTrue(array.similar(result1)); + } + + @Test + void whenResultSetConvertedUsingJOOQDefaultApproach_shouldMatchJSON() throws SQLException, ClassNotFoundException { + Class.forName("org.h2.Driver"); + Connection dbConnection = DriverManager.getConnection("jdbc:h2:mem:rs2jdbc2", "user", "password"); + // Create a table + Statement stmt = dbConnection.createStatement(); + stmt.execute("CREATE TABLE words AS SELECT * FROM CSVREAD('./example.csv')"); + ResultSet resultSet = stmt.executeQuery("SELECT * FROM words"); + + JSONObject result2 = resultSet2JdbcUsingJOOQDefaultApproach(resultSet, dbConnection); + + resultSet.close(); + + assertTrue(object.similar(result2)); + } + + @Test + void whenResultSetConvertedUsingCustomisedJOOQ_shouldMatchJSON() throws SQLException, ClassNotFoundException { + Class.forName("org.h2.Driver"); + Connection dbConnection = DriverManager.getConnection("jdbc:h2:mem:rs2jdbc3", "user", "password"); + // Create a table + Statement stmt = dbConnection.createStatement(); + stmt.execute("CREATE TABLE words AS SELECT * FROM CSVREAD('./example.csv')"); + ResultSet resultSet = stmt.executeQuery("SELECT * FROM words"); + + JSONArray result3 = resultSet2JdbcUsingCustomisedJOOQ(resultSet, dbConnection); + + resultSet.close(); + + assertTrue(array.similar(result3)); + } + +} From 2065e6b624b9ed69868a2a8df321c252dadc7a90 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Mon, 16 May 2022 22:25:29 +0530 Subject: [PATCH 212/278] JAVA-11790: Fix references to parents --- apache-tapestry/pom.xml | 7 ++++++- .../aws-lambda/shipping-tracker/ShippingFunction/pom.xml | 7 +++++++ libraries-primitive/pom.xml | 6 ++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/apache-tapestry/pom.xml b/apache-tapestry/pom.xml index 7a4c2b53b5..201b807d9f 100644 --- a/apache-tapestry/pom.xml +++ b/apache-tapestry/pom.xml @@ -3,12 +3,17 @@ xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 - com.baeldung apache-tapestry 0.0.1-SNAPSHOT apache-tapestry war + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + From 18237d20979d94f3868e0053c8348366373cd562 Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Mon, 16 May 2022 23:23:26 -0300 Subject: [PATCH 213/278] removing from the old module --- .../baeldung/boot/collection/name/Naming.java | 35 -------- .../SpringBootCollectionNameApplication.java | 19 ----- .../name/dao/CompilationRepository.java | 9 --- .../name/dao/MusicAlbumRepository.java | 9 --- .../name/dao/MusicTrackRepository.java | 9 --- .../collection/name/dao/StoreRepository.java | 9 --- .../collection/name/data/Compilation.java | 36 --------- .../boot/collection/name/data/MusicAlbum.java | 48 ----------- .../boot/collection/name/data/MusicTrack.java | 50 ------------ .../boot/collection/name/data/Store.java | 36 --------- .../name/service/MusicStoreService.java | 62 -------------- .../name/web/CollectionController.java | 24 ------ .../name/web/MusicStoreController.java | 63 --------------- .../boot.collection.name/app.properties | 1 - .../MusicStoreServiceIntegrationTest.java | 81 ------------------- 15 files changed, 491 deletions(-) delete mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/Naming.java delete mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/SpringBootCollectionNameApplication.java delete mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/dao/CompilationRepository.java delete mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/dao/MusicAlbumRepository.java delete mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/dao/MusicTrackRepository.java delete mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/dao/StoreRepository.java delete mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/data/Compilation.java delete mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/data/MusicAlbum.java delete mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/data/MusicTrack.java delete mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/data/Store.java delete mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/service/MusicStoreService.java delete mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/web/CollectionController.java delete mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/web/MusicStoreController.java delete mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/resources/boot.collection.name/app.properties delete mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/boot/collection/name/service/MusicStoreServiceIntegrationTest.java diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/Naming.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/Naming.java deleted file mode 100644 index 9808ecccb6..0000000000 --- a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/Naming.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.baeldung.boot.collection.name; - -import java.util.ArrayList; -import java.util.List; - -import org.springframework.data.util.ParsingUtils; -import org.springframework.util.StringUtils; - -public class Naming { - public static void main(String[] args) { - String r = new Naming().fix(args[0]); - System.out.println(r); - } - - public String fix(String name) { - List parts = ParsingUtils.splitCamelCaseToLower(name); - List result = new ArrayList<>(); - - for (String part : parts) { - if (StringUtils.hasText(part)) { - result.add(part); - } - } - - return StringUtils.collectionToDelimitedString(result, "_"); - } - - public String convert(Class type) { - return fix(type.getSimpleName()); - } - - public String convert(Object instance) { - return convert(instance.getClass()); - } -} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/SpringBootCollectionNameApplication.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/SpringBootCollectionNameApplication.java deleted file mode 100644 index 0a5c36db29..0000000000 --- a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/SpringBootCollectionNameApplication.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.baeldung.boot.collection.name; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.PropertySource; - -@SpringBootApplication -@PropertySource("classpath:boot.collection.name/app.properties") -public class SpringBootCollectionNameApplication { - public static void main(String... args) { - SpringApplication.run(SpringBootCollectionNameApplication.class, args); - } - - @Bean - public Naming naming() { - return new Naming(); - } -} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/dao/CompilationRepository.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/dao/CompilationRepository.java deleted file mode 100644 index 3f83ad4548..0000000000 --- a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/dao/CompilationRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.baeldung.boot.collection.name.dao; - -import org.springframework.data.mongodb.repository.MongoRepository; - -import com.baeldung.boot.collection.name.data.Compilation; - -public interface CompilationRepository extends MongoRepository { - -} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/dao/MusicAlbumRepository.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/dao/MusicAlbumRepository.java deleted file mode 100644 index 98709361d7..0000000000 --- a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/dao/MusicAlbumRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.baeldung.boot.collection.name.dao; - -import org.springframework.data.mongodb.repository.MongoRepository; - -import com.baeldung.boot.collection.name.data.MusicAlbum; - -public interface MusicAlbumRepository extends MongoRepository { - -} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/dao/MusicTrackRepository.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/dao/MusicTrackRepository.java deleted file mode 100644 index 0964a8de00..0000000000 --- a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/dao/MusicTrackRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.baeldung.boot.collection.name.dao; - -import org.springframework.data.mongodb.repository.MongoRepository; - -import com.baeldung.boot.collection.name.data.MusicTrack; - -public interface MusicTrackRepository extends MongoRepository { - -} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/dao/StoreRepository.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/dao/StoreRepository.java deleted file mode 100644 index b446a7d98d..0000000000 --- a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/dao/StoreRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.baeldung.boot.collection.name.dao; - -import org.springframework.data.mongodb.repository.MongoRepository; - -import com.baeldung.boot.collection.name.data.Store; - -public interface StoreRepository extends MongoRepository { - -} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/data/Compilation.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/data/Compilation.java deleted file mode 100644 index ce081acf25..0000000000 --- a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/data/Compilation.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.baeldung.boot.collection.name.data; - -import org.springframework.data.annotation.Id; -import org.springframework.data.mongodb.core.mapping.Document; - -@Document -public class Compilation { - @Id - private String id; - - private String name; - - public Compilation() { - } - - public Compilation(String name) { - super(); - this.name = name; - } - - 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; - } -} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/data/MusicAlbum.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/data/MusicAlbum.java deleted file mode 100644 index ce2e084504..0000000000 --- a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/data/MusicAlbum.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.baeldung.boot.collection.name.data; - -import org.springframework.data.annotation.Id; -import org.springframework.data.mongodb.core.mapping.Document; - -@Document("albums") -public class MusicAlbum { - @Id - private String id; - - private String name; - - private String artist; - - public MusicAlbum() { - - } - - public MusicAlbum(String name, String artist) { - super(); - this.name = name; - this.artist = artist; - } - - 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 getArtist() { - return artist; - } - - public void setArtist(String artist) { - this.artist = artist; - } -} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/data/MusicTrack.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/data/MusicTrack.java deleted file mode 100644 index 39ce3994bb..0000000000 --- a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/data/MusicTrack.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.baeldung.boot.collection.name.data; - -import org.springframework.data.annotation.Id; -import org.springframework.data.mongodb.core.mapping.Document; - -@Document("#{@naming.fix('MusicTrack')}") -public class MusicTrack { - @Id - private String id; - - private String name; - - private String artist; - - public MusicTrack() { - } - - public MusicTrack(String name, String artist) { - this.name = name; - this.artist = artist; - } - - public MusicTrack(String name) { - this.name = name; - } - - 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 getArtist() { - return artist; - } - - public void setArtist(String artist) { - this.artist = artist; - } -} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/data/Store.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/data/Store.java deleted file mode 100644 index 83f5017a13..0000000000 --- a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/data/Store.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.baeldung.boot.collection.name.data; - -import org.springframework.data.annotation.Id; -import org.springframework.data.mongodb.core.mapping.Document; - -@Document("store-#{@environment.getProperty('collection.suffix')}") -public class Store { - @Id - private String id; - - private String name; - - public Store() { - } - - public Store(String name) { - super(); - this.name = name; - } - - 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; - } -} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/service/MusicStoreService.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/service/MusicStoreService.java deleted file mode 100644 index 6083e3d0c3..0000000000 --- a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/service/MusicStoreService.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.baeldung.boot.collection.name.service; - -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import com.baeldung.boot.collection.name.dao.CompilationRepository; -import com.baeldung.boot.collection.name.dao.MusicAlbumRepository; -import com.baeldung.boot.collection.name.dao.MusicTrackRepository; -import com.baeldung.boot.collection.name.dao.StoreRepository; -import com.baeldung.boot.collection.name.data.Compilation; -import com.baeldung.boot.collection.name.data.MusicAlbum; -import com.baeldung.boot.collection.name.data.MusicTrack; -import com.baeldung.boot.collection.name.data.Store; - -@Service -public class MusicStoreService { - @Autowired - private MusicAlbumRepository albumRepository; - - @Autowired - private CompilationRepository compilationRepository; - - @Autowired - private StoreRepository storeRepository; - - @Autowired - private MusicTrackRepository trackRepository; - - public MusicAlbum add(MusicAlbum item) { - return albumRepository.save(item); - } - - public List getAlbumList() { - return albumRepository.findAll(); - } - - public Compilation add(Compilation item) { - return compilationRepository.save(item); - } - - public List getCompilationList() { - return compilationRepository.findAll(); - } - - public Store add(Store item) { - return storeRepository.save(item); - } - - public List getStoreList() { - return storeRepository.findAll(); - } - - public MusicTrack add(MusicTrack item) { - return trackRepository.save(item); - } - - public List getTrackList() { - return trackRepository.findAll(); - } -} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/web/CollectionController.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/web/CollectionController.java deleted file mode 100644 index 2efca361b9..0000000000 --- a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/web/CollectionController.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.baeldung.boot.collection.name.web; - -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.mongodb.DBObject; - -@RestController -@RequestMapping("/collection") -public class CollectionController { - @Autowired - private MongoTemplate mongo; - - @GetMapping("/{name}") - public List get(@PathVariable String name) { - return mongo.findAll(DBObject.class, name); - } -} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/web/MusicStoreController.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/web/MusicStoreController.java deleted file mode 100644 index 8c510121c2..0000000000 --- a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/boot/collection/name/web/MusicStoreController.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.baeldung.boot.collection.name.web; - -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.baeldung.boot.collection.name.data.Compilation; -import com.baeldung.boot.collection.name.data.MusicAlbum; -import com.baeldung.boot.collection.name.data.MusicTrack; -import com.baeldung.boot.collection.name.data.Store; -import com.baeldung.boot.collection.name.service.MusicStoreService; - -@RestController -@RequestMapping("/music") -public class MusicStoreController { - @Autowired - private MusicStoreService service; - - @PostMapping("/album") - public MusicAlbum post(@RequestBody MusicAlbum item) { - return service.add(item); - } - - @GetMapping("/album") - public List getAlbumList() { - return service.getAlbumList(); - } - - @PostMapping("/compilation") - public Compilation post(@RequestBody Compilation item) { - return service.add(item); - } - - @GetMapping("/compilation") - public List getCompilationList() { - return service.getCompilationList(); - } - - @PostMapping("/store") - public Store post(@RequestBody Store item) { - return service.add(item); - } - - @GetMapping("/store") - public List getStoreList() { - return service.getStoreList(); - } - - @PostMapping("/track") - public MusicTrack post(@RequestBody MusicTrack item) { - return service.add(item); - } - - @GetMapping("/track") - public List getTrackList() { - return service.getTrackList(); - } -} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/resources/boot.collection.name/app.properties b/persistence-modules/spring-boot-persistence-mongodb/src/main/resources/boot.collection.name/app.properties deleted file mode 100644 index 98945a76e1..0000000000 --- a/persistence-modules/spring-boot-persistence-mongodb/src/main/resources/boot.collection.name/app.properties +++ /dev/null @@ -1 +0,0 @@ -collection.suffix=db diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/boot/collection/name/service/MusicStoreServiceIntegrationTest.java b/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/boot/collection/name/service/MusicStoreServiceIntegrationTest.java deleted file mode 100644 index eda8b8aafb..0000000000 --- a/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/boot/collection/name/service/MusicStoreServiceIntegrationTest.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.baeldung.boot.collection.name.service; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.util.List; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.junit4.SpringRunner; - -import com.baeldung.boot.collection.name.data.Compilation; -import com.baeldung.boot.collection.name.data.MusicAlbum; -import com.baeldung.boot.collection.name.data.MusicTrack; -import com.baeldung.boot.collection.name.data.Store; - -@SpringBootTest -@DirtiesContext -@RunWith(SpringRunner.class) -public class MusicStoreServiceIntegrationTest { - @Autowired - private MusicStoreService service; - - @Autowired - private MongoTemplate mongoDb; - - @Test - public void givenAnnotation_whenSearchingByCollectionName_thenFound() { - List list = service.getCompilationList(); - int sizeBefore = list.size(); - - service.add(new Compilation("Spring Hits")); - - list = mongoDb.findAll(Compilation.class, "compilation"); - int sizeAfter = list.size(); - - assertThat(sizeAfter - sizeBefore).isEqualTo(1); - } - - @Test - public void givenAnnotationWithValue_whenSearchingByCollectionName_thenFound() { - List list = service.getAlbumList(); - int sizeBefore = list.size(); - - service.add(new MusicAlbum("Album 1", "Artist A")); - - list = mongoDb.findAll(MusicAlbum.class, "albums"); - int sizeAfter = list.size(); - - assertThat(sizeAfter - sizeBefore).isEqualTo(1); - } - - @Test - public void givenAnnotationWithSpELEnvironment_whenSearchingByCollectionName_thenFound() { - List list = service.getStoreList(); - int sizeBefore = list.size(); - - service.add(new Store("Store A")); - - list = mongoDb.findAll(Store.class, "store-db"); - int sizeAfter = list.size(); - - assertThat(sizeAfter - sizeBefore).isEqualTo(1); - } - - @Test - public void givenAnnotationWithSpELBean_whenSearchingByCollectionName_thenFound() { - List list = service.getTrackList(); - int sizeBefore = list.size(); - - service.add(new MusicTrack("Track 1")); - - list = mongoDb.findAll(MusicTrack.class, "music_track"); - int sizeAfter = list.size(); - - assertThat(sizeAfter - sizeBefore).isEqualTo(1); - } -} From 16bb4772ec608cd91845274dac5eb1671f89de18 Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Mon, 16 May 2022 23:24:46 -0300 Subject: [PATCH 214/278] moved code to spring-boot-persistence-mongodb-2 --- .../spring-boot-persistence-mongodb-2/pom.xml | 4 + .../baeldung/boot/collection/name/Naming.java | 35 ++++++++ .../SpringBootCollectionNameApplication.java | 19 +++++ .../name/dao/CompilationRepository.java | 9 +++ .../name/dao/MusicAlbumRepository.java | 9 +++ .../name/dao/MusicTrackRepository.java | 9 +++ .../collection/name/dao/StoreRepository.java | 9 +++ .../collection/name/data/Compilation.java | 36 +++++++++ .../boot/collection/name/data/MusicAlbum.java | 48 +++++++++++ .../boot/collection/name/data/MusicTrack.java | 50 ++++++++++++ .../boot/collection/name/data/Store.java | 36 +++++++++ .../name/service/MusicStoreService.java | 62 ++++++++++++++ .../name/web/CollectionController.java | 24 ++++++ .../name/web/MusicStoreController.java | 63 +++++++++++++++ .../boot.collection.name/app.properties | 1 + .../MusicStoreServiceIntegrationTest.java | 81 +++++++++++++++++++ 16 files changed, 495 insertions(+) create mode 100644 persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/Naming.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/SpringBootCollectionNameApplication.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/dao/CompilationRepository.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/dao/MusicAlbumRepository.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/dao/MusicTrackRepository.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/dao/StoreRepository.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/data/Compilation.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/data/MusicAlbum.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/data/MusicTrack.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/data/Store.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/service/MusicStoreService.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/web/CollectionController.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/web/MusicStoreController.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb-2/src/main/resources/boot.collection.name/app.properties create mode 100644 persistence-modules/spring-boot-persistence-mongodb-2/src/test/java/com/baeldung/boot/collection/name/service/MusicStoreServiceIntegrationTest.java diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/pom.xml b/persistence-modules/spring-boot-persistence-mongodb-2/pom.xml index a6ac4987a1..a172c28a80 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-2/pom.xml +++ b/persistence-modules/spring-boot-persistence-mongodb-2/pom.xml @@ -16,6 +16,10 @@ + + org.springframework.boot + spring-boot-starter-web + org.springframework.boot spring-boot-starter-data-mongodb diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/Naming.java b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/Naming.java new file mode 100644 index 0000000000..9808ecccb6 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/Naming.java @@ -0,0 +1,35 @@ +package com.baeldung.boot.collection.name; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.data.util.ParsingUtils; +import org.springframework.util.StringUtils; + +public class Naming { + public static void main(String[] args) { + String r = new Naming().fix(args[0]); + System.out.println(r); + } + + public String fix(String name) { + List parts = ParsingUtils.splitCamelCaseToLower(name); + List result = new ArrayList<>(); + + for (String part : parts) { + if (StringUtils.hasText(part)) { + result.add(part); + } + } + + return StringUtils.collectionToDelimitedString(result, "_"); + } + + public String convert(Class type) { + return fix(type.getSimpleName()); + } + + public String convert(Object instance) { + return convert(instance.getClass()); + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/SpringBootCollectionNameApplication.java b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/SpringBootCollectionNameApplication.java new file mode 100644 index 0000000000..0a5c36db29 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/SpringBootCollectionNameApplication.java @@ -0,0 +1,19 @@ +package com.baeldung.boot.collection.name; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.PropertySource; + +@SpringBootApplication +@PropertySource("classpath:boot.collection.name/app.properties") +public class SpringBootCollectionNameApplication { + public static void main(String... args) { + SpringApplication.run(SpringBootCollectionNameApplication.class, args); + } + + @Bean + public Naming naming() { + return new Naming(); + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/dao/CompilationRepository.java b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/dao/CompilationRepository.java new file mode 100644 index 0000000000..3f83ad4548 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/dao/CompilationRepository.java @@ -0,0 +1,9 @@ +package com.baeldung.boot.collection.name.dao; + +import org.springframework.data.mongodb.repository.MongoRepository; + +import com.baeldung.boot.collection.name.data.Compilation; + +public interface CompilationRepository extends MongoRepository { + +} diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/dao/MusicAlbumRepository.java b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/dao/MusicAlbumRepository.java new file mode 100644 index 0000000000..98709361d7 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/dao/MusicAlbumRepository.java @@ -0,0 +1,9 @@ +package com.baeldung.boot.collection.name.dao; + +import org.springframework.data.mongodb.repository.MongoRepository; + +import com.baeldung.boot.collection.name.data.MusicAlbum; + +public interface MusicAlbumRepository extends MongoRepository { + +} diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/dao/MusicTrackRepository.java b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/dao/MusicTrackRepository.java new file mode 100644 index 0000000000..0964a8de00 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/dao/MusicTrackRepository.java @@ -0,0 +1,9 @@ +package com.baeldung.boot.collection.name.dao; + +import org.springframework.data.mongodb.repository.MongoRepository; + +import com.baeldung.boot.collection.name.data.MusicTrack; + +public interface MusicTrackRepository extends MongoRepository { + +} diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/dao/StoreRepository.java b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/dao/StoreRepository.java new file mode 100644 index 0000000000..b446a7d98d --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/dao/StoreRepository.java @@ -0,0 +1,9 @@ +package com.baeldung.boot.collection.name.dao; + +import org.springframework.data.mongodb.repository.MongoRepository; + +import com.baeldung.boot.collection.name.data.Store; + +public interface StoreRepository extends MongoRepository { + +} diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/data/Compilation.java b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/data/Compilation.java new file mode 100644 index 0000000000..ce081acf25 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/data/Compilation.java @@ -0,0 +1,36 @@ +package com.baeldung.boot.collection.name.data; + +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +@Document +public class Compilation { + @Id + private String id; + + private String name; + + public Compilation() { + } + + public Compilation(String name) { + super(); + this.name = name; + } + + 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; + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/data/MusicAlbum.java b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/data/MusicAlbum.java new file mode 100644 index 0000000000..ce2e084504 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/data/MusicAlbum.java @@ -0,0 +1,48 @@ +package com.baeldung.boot.collection.name.data; + +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +@Document("albums") +public class MusicAlbum { + @Id + private String id; + + private String name; + + private String artist; + + public MusicAlbum() { + + } + + public MusicAlbum(String name, String artist) { + super(); + this.name = name; + this.artist = artist; + } + + 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 getArtist() { + return artist; + } + + public void setArtist(String artist) { + this.artist = artist; + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/data/MusicTrack.java b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/data/MusicTrack.java new file mode 100644 index 0000000000..39ce3994bb --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/data/MusicTrack.java @@ -0,0 +1,50 @@ +package com.baeldung.boot.collection.name.data; + +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +@Document("#{@naming.fix('MusicTrack')}") +public class MusicTrack { + @Id + private String id; + + private String name; + + private String artist; + + public MusicTrack() { + } + + public MusicTrack(String name, String artist) { + this.name = name; + this.artist = artist; + } + + public MusicTrack(String name) { + this.name = name; + } + + 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 getArtist() { + return artist; + } + + public void setArtist(String artist) { + this.artist = artist; + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/data/Store.java b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/data/Store.java new file mode 100644 index 0000000000..83f5017a13 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/data/Store.java @@ -0,0 +1,36 @@ +package com.baeldung.boot.collection.name.data; + +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +@Document("store-#{@environment.getProperty('collection.suffix')}") +public class Store { + @Id + private String id; + + private String name; + + public Store() { + } + + public Store(String name) { + super(); + this.name = name; + } + + 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; + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/service/MusicStoreService.java b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/service/MusicStoreService.java new file mode 100644 index 0000000000..6083e3d0c3 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/service/MusicStoreService.java @@ -0,0 +1,62 @@ +package com.baeldung.boot.collection.name.service; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baeldung.boot.collection.name.dao.CompilationRepository; +import com.baeldung.boot.collection.name.dao.MusicAlbumRepository; +import com.baeldung.boot.collection.name.dao.MusicTrackRepository; +import com.baeldung.boot.collection.name.dao.StoreRepository; +import com.baeldung.boot.collection.name.data.Compilation; +import com.baeldung.boot.collection.name.data.MusicAlbum; +import com.baeldung.boot.collection.name.data.MusicTrack; +import com.baeldung.boot.collection.name.data.Store; + +@Service +public class MusicStoreService { + @Autowired + private MusicAlbumRepository albumRepository; + + @Autowired + private CompilationRepository compilationRepository; + + @Autowired + private StoreRepository storeRepository; + + @Autowired + private MusicTrackRepository trackRepository; + + public MusicAlbum add(MusicAlbum item) { + return albumRepository.save(item); + } + + public List getAlbumList() { + return albumRepository.findAll(); + } + + public Compilation add(Compilation item) { + return compilationRepository.save(item); + } + + public List getCompilationList() { + return compilationRepository.findAll(); + } + + public Store add(Store item) { + return storeRepository.save(item); + } + + public List getStoreList() { + return storeRepository.findAll(); + } + + public MusicTrack add(MusicTrack item) { + return trackRepository.save(item); + } + + public List getTrackList() { + return trackRepository.findAll(); + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/web/CollectionController.java b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/web/CollectionController.java new file mode 100644 index 0000000000..2efca361b9 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/web/CollectionController.java @@ -0,0 +1,24 @@ +package com.baeldung.boot.collection.name.web; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.mongodb.DBObject; + +@RestController +@RequestMapping("/collection") +public class CollectionController { + @Autowired + private MongoTemplate mongo; + + @GetMapping("/{name}") + public List get(@PathVariable String name) { + return mongo.findAll(DBObject.class, name); + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/web/MusicStoreController.java b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/web/MusicStoreController.java new file mode 100644 index 0000000000..8c510121c2 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/web/MusicStoreController.java @@ -0,0 +1,63 @@ +package com.baeldung.boot.collection.name.web; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.boot.collection.name.data.Compilation; +import com.baeldung.boot.collection.name.data.MusicAlbum; +import com.baeldung.boot.collection.name.data.MusicTrack; +import com.baeldung.boot.collection.name.data.Store; +import com.baeldung.boot.collection.name.service.MusicStoreService; + +@RestController +@RequestMapping("/music") +public class MusicStoreController { + @Autowired + private MusicStoreService service; + + @PostMapping("/album") + public MusicAlbum post(@RequestBody MusicAlbum item) { + return service.add(item); + } + + @GetMapping("/album") + public List getAlbumList() { + return service.getAlbumList(); + } + + @PostMapping("/compilation") + public Compilation post(@RequestBody Compilation item) { + return service.add(item); + } + + @GetMapping("/compilation") + public List getCompilationList() { + return service.getCompilationList(); + } + + @PostMapping("/store") + public Store post(@RequestBody Store item) { + return service.add(item); + } + + @GetMapping("/store") + public List getStoreList() { + return service.getStoreList(); + } + + @PostMapping("/track") + public MusicTrack post(@RequestBody MusicTrack item) { + return service.add(item); + } + + @GetMapping("/track") + public List getTrackList() { + return service.getTrackList(); + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/src/main/resources/boot.collection.name/app.properties b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/resources/boot.collection.name/app.properties new file mode 100644 index 0000000000..98945a76e1 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/resources/boot.collection.name/app.properties @@ -0,0 +1 @@ +collection.suffix=db diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/src/test/java/com/baeldung/boot/collection/name/service/MusicStoreServiceIntegrationTest.java b/persistence-modules/spring-boot-persistence-mongodb-2/src/test/java/com/baeldung/boot/collection/name/service/MusicStoreServiceIntegrationTest.java new file mode 100644 index 0000000000..eda8b8aafb --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-2/src/test/java/com/baeldung/boot/collection/name/service/MusicStoreServiceIntegrationTest.java @@ -0,0 +1,81 @@ +package com.baeldung.boot.collection.name.service; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.junit4.SpringRunner; + +import com.baeldung.boot.collection.name.data.Compilation; +import com.baeldung.boot.collection.name.data.MusicAlbum; +import com.baeldung.boot.collection.name.data.MusicTrack; +import com.baeldung.boot.collection.name.data.Store; + +@SpringBootTest +@DirtiesContext +@RunWith(SpringRunner.class) +public class MusicStoreServiceIntegrationTest { + @Autowired + private MusicStoreService service; + + @Autowired + private MongoTemplate mongoDb; + + @Test + public void givenAnnotation_whenSearchingByCollectionName_thenFound() { + List list = service.getCompilationList(); + int sizeBefore = list.size(); + + service.add(new Compilation("Spring Hits")); + + list = mongoDb.findAll(Compilation.class, "compilation"); + int sizeAfter = list.size(); + + assertThat(sizeAfter - sizeBefore).isEqualTo(1); + } + + @Test + public void givenAnnotationWithValue_whenSearchingByCollectionName_thenFound() { + List list = service.getAlbumList(); + int sizeBefore = list.size(); + + service.add(new MusicAlbum("Album 1", "Artist A")); + + list = mongoDb.findAll(MusicAlbum.class, "albums"); + int sizeAfter = list.size(); + + assertThat(sizeAfter - sizeBefore).isEqualTo(1); + } + + @Test + public void givenAnnotationWithSpELEnvironment_whenSearchingByCollectionName_thenFound() { + List list = service.getStoreList(); + int sizeBefore = list.size(); + + service.add(new Store("Store A")); + + list = mongoDb.findAll(Store.class, "store-db"); + int sizeAfter = list.size(); + + assertThat(sizeAfter - sizeBefore).isEqualTo(1); + } + + @Test + public void givenAnnotationWithSpELBean_whenSearchingByCollectionName_thenFound() { + List list = service.getTrackList(); + int sizeBefore = list.size(); + + service.add(new MusicTrack("Track 1")); + + list = mongoDb.findAll(MusicTrack.class, "music_track"); + int sizeAfter = list.size(); + + assertThat(sizeAfter - sizeBefore).isEqualTo(1); + } +} From d848af386a0cc984ed2fe596b590301fd252e364 Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Tue, 17 May 2022 09:44:35 +0500 Subject: [PATCH 215/278] Updated README.md added link back to the article: https://www.baeldung.com/java-httpclient-post --- core-java-modules/core-java-httpclient/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-httpclient/README.md b/core-java-modules/core-java-httpclient/README.md index 24ff7d9941..712328a123 100644 --- a/core-java-modules/core-java-httpclient/README.md +++ b/core-java-modules/core-java-httpclient/README.md @@ -3,4 +3,4 @@ This module contains articles about Java HttpClient ### Relevant articles -- TODO +- [Posting with Java HttpClient](https://www.baeldung.com/java-httpclient-post) From bb7edc30e4f1644dc412c6a4aa493b8f200f7f14 Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Tue, 17 May 2022 09:58:36 +0500 Subject: [PATCH 216/278] Updated README.md added link back to the article: https://www.baeldung.com/java-reverse-number --- java-numbers-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/java-numbers-4/README.md b/java-numbers-4/README.md index c18a5ebe6f..2a77992c8f 100644 --- a/java-numbers-4/README.md +++ b/java-numbers-4/README.md @@ -8,3 +8,4 @@ - [Convert Byte Size Into a Human-Readable Format in Java](https://www.baeldung.com/java-human-readable-byte-size) - [Convert boolean to int in Java](https://www.baeldung.com/java-boolean-to-int) - [Generate a Random Value From an Enum](https://www.baeldung.com/java-enum-random-value) +- [Reverse a Number in Java](https://www.baeldung.com/java-reverse-number) From 177f912393c0e0110a9b9b01862d7a5ff053508a Mon Sep 17 00:00:00 2001 From: Graham Cox Date: Tue, 17 May 2022 16:07:21 +0100 Subject: [PATCH 217/278] Source code for Lightrun articles --- lightrun/README.md | 29 +++++++ lightrun/api-service/.gitignore | 33 +++++++ lightrun/api-service/pom.xml | 45 ++++++++++ .../apiservice/ApiServiceApplication.java | 13 +++ .../apiservice/RequestIdGenerator.java | 33 +++++++ .../apiservice/RestTemplateConfig.java | 20 +++++ .../com/baeldung/apiservice/WebConfig.java | 17 ++++ .../adapters/http/TaskResponse.java | 11 +++ .../adapters/http/TasksController.java | 54 ++++++++++++ .../adapters/http/UnknownTaskException.java | 4 + .../adapters/http/UserResponse.java | 4 + .../apiservice/adapters/tasks/Task.java | 11 +++ .../adapters/tasks/TaskRepository.java | 30 +++++++ .../apiservice/adapters/users/User.java | 4 + .../adapters/users/UserRepository.java | 31 +++++++ .../src/main/resources/application.properties | 2 + lightrun/pom.xml | 17 ++++ lightrun/tasks-service/.gitignore | 33 +++++++ lightrun/tasks-service/pom.xml | 67 +++++++++++++++ .../baeldung/tasksservice/ArtemisConfig.java | 23 +++++ .../tasksservice/TasksServiceApplication.java | 13 +++ .../adapters/http/CreateTaskRequest.java | 15 ++++ .../adapters/http/PatchTaskRequest.java | 17 ++++ .../adapters/http/TaskResponse.java | 22 +++++ .../adapters/http/TasksController.java | 86 +++++++++++++++++++ .../adapters/http/http-client.env.json | 5 ++ .../tasksservice/adapters/http/tasks.http | 35 ++++++++ .../adapters/jms/JmsConsumer.java | 18 ++++ .../adapters/repository/TaskRecord.java | 80 +++++++++++++++++ .../adapters/repository/TasksRepository.java | 28 ++++++ .../service/DeletedUserService.java | 27 ++++++ .../tasksservice/service/TasksService.java | 72 ++++++++++++++++ .../service/UnknownTaskException.java | 24 ++++++ .../src/main/resources/application.properties | 13 +++ .../migration/V1_0_0__create-tasks-table.sql | 13 +++ lightrun/users-service/.gitignore | 33 +++++++ lightrun/users-service/README.md | 29 +++++++ lightrun/users-service/pom.xml | 63 ++++++++++++++ .../com/baeldung/usersservice/JmsConfig.java | 29 +++++++ .../usersservice/UsersServiceApplication.java | 13 +++ .../adapters/http/CreateUserRequest.java | 15 ++++ .../adapters/http/PatchUserRequest.java | 17 ++++ .../adapters/http/UserResponse.java | 16 ++++ .../adapters/http/UsersController.java | 69 +++++++++++++++ .../adapters/http/http-client.env.json | 5 ++ .../usersservice/adapters/http/users.http | 25 ++++++ .../usersservice/adapters/jms/JmsSender.java | 26 ++++++ .../adapters/repository/UserRecord.java | 47 ++++++++++ .../adapters/repository/UsersRepository.java | 19 ++++ .../service/UnknownUserException.java | 24 ++++++ .../usersservice/service/UsersService.java | 61 +++++++++++++ .../src/main/resources/application.properties | 10 +++ .../migration/V1_0_0__create-users-table.sql | 8 ++ pom.xml | 2 + 54 files changed, 1460 insertions(+) create mode 100644 lightrun/README.md create mode 100644 lightrun/api-service/.gitignore create mode 100644 lightrun/api-service/pom.xml create mode 100644 lightrun/api-service/src/main/java/com/baeldung/apiservice/ApiServiceApplication.java create mode 100644 lightrun/api-service/src/main/java/com/baeldung/apiservice/RequestIdGenerator.java create mode 100644 lightrun/api-service/src/main/java/com/baeldung/apiservice/RestTemplateConfig.java create mode 100644 lightrun/api-service/src/main/java/com/baeldung/apiservice/WebConfig.java create mode 100644 lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/http/TaskResponse.java create mode 100644 lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/http/TasksController.java create mode 100644 lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/http/UnknownTaskException.java create mode 100644 lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/http/UserResponse.java create mode 100644 lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/tasks/Task.java create mode 100644 lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/tasks/TaskRepository.java create mode 100644 lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/users/User.java create mode 100644 lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/users/UserRepository.java create mode 100644 lightrun/api-service/src/main/resources/application.properties create mode 100644 lightrun/pom.xml create mode 100644 lightrun/tasks-service/.gitignore create mode 100644 lightrun/tasks-service/pom.xml create mode 100644 lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/ArtemisConfig.java create mode 100644 lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/TasksServiceApplication.java create mode 100644 lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/CreateTaskRequest.java create mode 100644 lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/PatchTaskRequest.java create mode 100644 lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/TaskResponse.java create mode 100644 lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/TasksController.java create mode 100644 lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/http-client.env.json create mode 100644 lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/tasks.http create mode 100644 lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/jms/JmsConsumer.java create mode 100644 lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/repository/TaskRecord.java create mode 100644 lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/repository/TasksRepository.java create mode 100644 lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/service/DeletedUserService.java create mode 100644 lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/service/TasksService.java create mode 100644 lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/service/UnknownTaskException.java create mode 100644 lightrun/tasks-service/src/main/resources/application.properties create mode 100644 lightrun/tasks-service/src/main/resources/db/migration/V1_0_0__create-tasks-table.sql create mode 100644 lightrun/users-service/.gitignore create mode 100644 lightrun/users-service/README.md create mode 100644 lightrun/users-service/pom.xml create mode 100644 lightrun/users-service/src/main/java/com/baeldung/usersservice/JmsConfig.java create mode 100644 lightrun/users-service/src/main/java/com/baeldung/usersservice/UsersServiceApplication.java create mode 100644 lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/CreateUserRequest.java create mode 100644 lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/PatchUserRequest.java create mode 100644 lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/UserResponse.java create mode 100644 lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/UsersController.java create mode 100644 lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/http-client.env.json create mode 100644 lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/users.http create mode 100644 lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/jms/JmsSender.java create mode 100644 lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/repository/UserRecord.java create mode 100644 lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/repository/UsersRepository.java create mode 100644 lightrun/users-service/src/main/java/com/baeldung/usersservice/service/UnknownUserException.java create mode 100644 lightrun/users-service/src/main/java/com/baeldung/usersservice/service/UsersService.java create mode 100644 lightrun/users-service/src/main/resources/application.properties create mode 100644 lightrun/users-service/src/main/resources/db/migration/V1_0_0__create-users-table.sql diff --git a/lightrun/README.md b/lightrun/README.md new file mode 100644 index 0000000000..732d9b03cd --- /dev/null +++ b/lightrun/README.md @@ -0,0 +1,29 @@ +# Lightrun Example Application - Tasks Management + +This application exists as an example for the Lightrun series of articles. + +## Building +This application requires [Apache Maven](https://maven.apache.org/) and [Java 17+](https://www.oracle.com/java/technologies/downloads/). + +Building the code is done by executing: +``` +$ mvn install +``` +from the top level. + +## Running +The application consists of three services: +* Tasks +* Users +* API + +These are all Spring Boot applications. + +The Tasks and Users services exist as microservices for managing one facet of data. Each uses a database, and utilise a JMS queue between them as well. For convenience this infrastructure is all embedded in the applications. + +This does mean that the startup order is important. The JMS queue exists within the Tasks service and is connected to from the Users service. As such, the Tasks service must be started before the others. + +Each service can be started either by executing `mvn spring-boot:run` from within the appropriate directory. Alternatively, as Spring Boot applications, the build will produce an executable JAR file within the `target` directory that can be executed as, for example: +``` +$ java -jar ./target/tasks-service-0.0.1-SNAPSHOT.jar +``` diff --git a/lightrun/api-service/.gitignore b/lightrun/api-service/.gitignore new file mode 100644 index 0000000000..549e00a2a9 --- /dev/null +++ b/lightrun/api-service/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/lightrun/api-service/pom.xml b/lightrun/api-service/pom.xml new file mode 100644 index 0000000000..c72d66748c --- /dev/null +++ b/lightrun/api-service/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.6.7 + + + com.baeldung + api-service + 0.0.1-SNAPSHOT + api-service + Aggregator Service for LightRun Article + + 17 + + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/lightrun/api-service/src/main/java/com/baeldung/apiservice/ApiServiceApplication.java b/lightrun/api-service/src/main/java/com/baeldung/apiservice/ApiServiceApplication.java new file mode 100644 index 0000000000..4d7e2f3ff7 --- /dev/null +++ b/lightrun/api-service/src/main/java/com/baeldung/apiservice/ApiServiceApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.apiservice; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ApiServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(ApiServiceApplication.class, args); + } + +} diff --git a/lightrun/api-service/src/main/java/com/baeldung/apiservice/RequestIdGenerator.java b/lightrun/api-service/src/main/java/com/baeldung/apiservice/RequestIdGenerator.java new file mode 100644 index 0000000000..3ad137ca4d --- /dev/null +++ b/lightrun/api-service/src/main/java/com/baeldung/apiservice/RequestIdGenerator.java @@ -0,0 +1,33 @@ +package com.baeldung.apiservice; + +import org.slf4j.MDC; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.UUID; + +@Component +public class RequestIdGenerator implements HandlerInterceptor { + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + String requestId = UUID.randomUUID().toString(); + + MDC.put(RequestIdGenerator.class.getCanonicalName(), requestId); + response.addHeader("X-Request-Id", requestId); + + return true; + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + MDC.remove(RequestIdGenerator.class.getCanonicalName()); + } + + public static String getRequestId() { + return MDC.get(RequestIdGenerator.class.getCanonicalName()); + } +} diff --git a/lightrun/api-service/src/main/java/com/baeldung/apiservice/RestTemplateConfig.java b/lightrun/api-service/src/main/java/com/baeldung/apiservice/RestTemplateConfig.java new file mode 100644 index 0000000000..278e1520c4 --- /dev/null +++ b/lightrun/api-service/src/main/java/com/baeldung/apiservice/RestTemplateConfig.java @@ -0,0 +1,20 @@ +package com.baeldung.apiservice; + +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class RestTemplateConfig { + @Bean + public RestTemplate restTemplate(RestTemplateBuilder builder) { + return builder + .additionalInterceptors((request, body, execution) -> { + request.getHeaders().add("X-Request-Id", RequestIdGenerator.getRequestId()); + + return execution.execute(request, body); + }) + .build(); + } +} diff --git a/lightrun/api-service/src/main/java/com/baeldung/apiservice/WebConfig.java b/lightrun/api-service/src/main/java/com/baeldung/apiservice/WebConfig.java new file mode 100644 index 0000000000..9edfcff6f6 --- /dev/null +++ b/lightrun/api-service/src/main/java/com/baeldung/apiservice/WebConfig.java @@ -0,0 +1,17 @@ +package com.baeldung.apiservice; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + @Autowired + private RequestIdGenerator requestIdGenerator; + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(requestIdGenerator); + } +} diff --git a/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/http/TaskResponse.java b/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/http/TaskResponse.java new file mode 100644 index 0000000000..cec3105c04 --- /dev/null +++ b/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/http/TaskResponse.java @@ -0,0 +1,11 @@ +package com.baeldung.apiservice.adapters.http; + +import java.time.Instant; + +public record TaskResponse(String id, + String title, + Instant created, + UserResponse createdBy, + UserResponse assignedTo, + String status) { +} diff --git a/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/http/TasksController.java b/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/http/TasksController.java new file mode 100644 index 0000000000..e11eaac35f --- /dev/null +++ b/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/http/TasksController.java @@ -0,0 +1,54 @@ +package com.baeldung.apiservice.adapters.http; + +import com.baeldung.apiservice.adapters.tasks.Task; +import com.baeldung.apiservice.adapters.tasks.TaskRepository; +import com.baeldung.apiservice.adapters.users.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; + +@RequestMapping("/") +@RestController +public class TasksController { + @Autowired + private TaskRepository taskRepository; + @Autowired + private UserRepository userRepository; + + @GetMapping("/{id}") + public TaskResponse getTaskById(@PathVariable("id") String id) { + Task task = taskRepository.getTaskById(id); + + if (task == null) { + throw new UnknownTaskException(); + } + + return buildResponse(task); + } + + private TaskResponse buildResponse(Task task) { + return new TaskResponse(task.id(), + task.title(), + task.created(), + getUser(task.createdBy()), + getUser(task.assignedTo()), + task.status()); + } + + private UserResponse getUser(String userId) { + if (userId == null) { + return null; + } + + var user = userRepository.getUserById(userId); + if (user == null) { + return null; + } + + return new UserResponse(user.id(), user.name()); + } + @ExceptionHandler(UnknownTaskException.class) + @ResponseStatus(HttpStatus.NOT_FOUND) + public void handleUnknownTask() { + } +} diff --git a/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/http/UnknownTaskException.java b/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/http/UnknownTaskException.java new file mode 100644 index 0000000000..1635ca8796 --- /dev/null +++ b/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/http/UnknownTaskException.java @@ -0,0 +1,4 @@ +package com.baeldung.apiservice.adapters.http; + +public class UnknownTaskException extends RuntimeException { +} diff --git a/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/http/UserResponse.java b/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/http/UserResponse.java new file mode 100644 index 0000000000..f311b895a8 --- /dev/null +++ b/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/http/UserResponse.java @@ -0,0 +1,4 @@ +package com.baeldung.apiservice.adapters.http; + +public record UserResponse(String id, String name) { +} diff --git a/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/tasks/Task.java b/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/tasks/Task.java new file mode 100644 index 0000000000..a83192f188 --- /dev/null +++ b/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/tasks/Task.java @@ -0,0 +1,11 @@ +package com.baeldung.apiservice.adapters.tasks; + +import java.time.Instant; + +public record Task(String id, + String title, + Instant created, + String createdBy, + String assignedTo, + String status) { +} diff --git a/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/tasks/TaskRepository.java b/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/tasks/TaskRepository.java new file mode 100644 index 0000000000..49ffa51818 --- /dev/null +++ b/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/tasks/TaskRepository.java @@ -0,0 +1,30 @@ +package com.baeldung.apiservice.adapters.tasks; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Repository; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; + +@Repository +public class TaskRepository { + @Autowired + private RestTemplate restTemplate; + + @Value("${tasks-service.url}") + private String tasksService; + + public Task getTaskById(String id) { + var uri = UriComponentsBuilder.fromUriString(tasksService) + .path(id) + .build() + .toUri(); + + try { + return restTemplate.getForObject(uri, Task.class); + } catch (HttpClientErrorException.NotFound e) { + return null; + } + } +} diff --git a/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/users/User.java b/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/users/User.java new file mode 100644 index 0000000000..a3a53c0805 --- /dev/null +++ b/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/users/User.java @@ -0,0 +1,4 @@ +package com.baeldung.apiservice.adapters.users; + +public record User(String id, String name) { +} diff --git a/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/users/UserRepository.java b/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/users/UserRepository.java new file mode 100644 index 0000000000..5a0e4eb64f --- /dev/null +++ b/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/users/UserRepository.java @@ -0,0 +1,31 @@ +package com.baeldung.apiservice.adapters.users; + +import com.baeldung.apiservice.adapters.users.User; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Repository; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; + +@Repository +public class UserRepository { + @Autowired + private RestTemplate restTemplate; + + @Value("${users-service.url}") + private String usersService; + + public User getUserById(String id) { + var uri = UriComponentsBuilder.fromUriString(usersService) + .path(id) + .build() + .toUri(); + + try { + return restTemplate.getForObject(uri, User.class); + } catch (HttpClientErrorException.NotFound e) { + return null; + } + } +} diff --git a/lightrun/api-service/src/main/resources/application.properties b/lightrun/api-service/src/main/resources/application.properties new file mode 100644 index 0000000000..f3f227f46f --- /dev/null +++ b/lightrun/api-service/src/main/resources/application.properties @@ -0,0 +1,2 @@ +users-service.url=http://localhost:8081 +tasks-service.url=http://localhost:8082 \ No newline at end of file diff --git a/lightrun/pom.xml b/lightrun/pom.xml new file mode 100644 index 0000000000..cfe275848f --- /dev/null +++ b/lightrun/pom.xml @@ -0,0 +1,17 @@ + + + 4.0.0 + com.baelduung + lightrun-demo + 0.0.1-SNAPSHOT + pom + lightrun + Services for LightRun Article + + + tasks-service + users-service + api-service + + diff --git a/lightrun/tasks-service/.gitignore b/lightrun/tasks-service/.gitignore new file mode 100644 index 0000000000..549e00a2a9 --- /dev/null +++ b/lightrun/tasks-service/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/lightrun/tasks-service/pom.xml b/lightrun/tasks-service/pom.xml new file mode 100644 index 0000000000..e56a3a9edf --- /dev/null +++ b/lightrun/tasks-service/pom.xml @@ -0,0 +1,67 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.6.7 + + + com.baeldung + tasks-service + 0.0.1-SNAPSHOT + tasks-service + Tasks Service for LightRun Article + + 17 + + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-artemis + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-web + + + org.flywaydb + flyway-core + + + + com.h2database + h2 + runtime + + + org.apache.activemq + artemis-jms-server + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/ArtemisConfig.java b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/ArtemisConfig.java new file mode 100644 index 0000000000..56ee3bbc93 --- /dev/null +++ b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/ArtemisConfig.java @@ -0,0 +1,23 @@ +package com.baeldung.tasksservice; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.jms.artemis.ArtemisConfigurationCustomizer; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class ArtemisConfig implements ArtemisConfigurationCustomizer { + @Value("${spring.artemis.host}") + private String hostname; + + @Value("${spring.artemis.port}") + private int port; + + @Override + public void customize(org.apache.activemq.artemis.core.config.Configuration configuration) { + try { + configuration.addAcceptorConfiguration("remote", "tcp://" + hostname + ":" + port); + } catch (Exception e) { + throw new RuntimeException("Failed to configure Artemis listener", e); + } + } +} diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/TasksServiceApplication.java b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/TasksServiceApplication.java new file mode 100644 index 0000000000..f8e0d64c0c --- /dev/null +++ b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/TasksServiceApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.tasksservice; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class TasksServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(TasksServiceApplication.class, args); + } + +} diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/CreateTaskRequest.java b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/CreateTaskRequest.java new file mode 100644 index 0000000000..64acea8b1b --- /dev/null +++ b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/CreateTaskRequest.java @@ -0,0 +1,15 @@ +/**************************************************************************************************************** + * + * Copyright (c) 2022 OCLC, Inc. All Rights Reserved. + * + * OCLC proprietary information: the enclosed materials contain + * proprietary information of OCLC, Inc. and shall not be disclosed in whole or in + * any part to any third party or used by any person for any purpose, without written + * consent of OCLC, Inc. Duplication of any portion of these materials shall include this notice. + * + ******************************************************************************************************************/ + +package com.baeldung.tasksservice.adapters.http; + +public record CreateTaskRequest(String title, String createdBy) { +} diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/PatchTaskRequest.java b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/PatchTaskRequest.java new file mode 100644 index 0000000000..20974b1c1d --- /dev/null +++ b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/PatchTaskRequest.java @@ -0,0 +1,17 @@ +/**************************************************************************************************************** + * + * Copyright (c) 2022 OCLC, Inc. All Rights Reserved. + * + * OCLC proprietary information: the enclosed materials contain + * proprietary information of OCLC, Inc. and shall not be disclosed in whole or in + * any part to any third party or used by any person for any purpose, without written + * consent of OCLC, Inc. Duplication of any portion of these materials shall include this notice. + * + ******************************************************************************************************************/ + +package com.baeldung.tasksservice.adapters.http; + +import java.util.Optional; + +public record PatchTaskRequest(Optional status, Optional assignedTo) { +} diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/TaskResponse.java b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/TaskResponse.java new file mode 100644 index 0000000000..ca13b2ee3d --- /dev/null +++ b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/TaskResponse.java @@ -0,0 +1,22 @@ +/**************************************************************************************************************** + * + * Copyright (c) 2022 OCLC, Inc. All Rights Reserved. + * + * OCLC proprietary information: the enclosed materials contain + * proprietary information of OCLC, Inc. and shall not be disclosed in whole or in + * any part to any third party or used by any person for any purpose, without written + * consent of OCLC, Inc. Duplication of any portion of these materials shall include this notice. + * + ******************************************************************************************************************/ + +package com.baeldung.tasksservice.adapters.http; + +import java.time.Instant; + +public record TaskResponse(String id, + String title, + Instant created, + String createdBy, + String assignedTo, + String status) { +} diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/TasksController.java b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/TasksController.java new file mode 100644 index 0000000000..6502e43883 --- /dev/null +++ b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/TasksController.java @@ -0,0 +1,86 @@ +/**************************************************************************************************************** + * + * Copyright (c) 2022 OCLC, Inc. All Rights Reserved. + * + * OCLC proprietary information: the enclosed materials contain + * proprietary information of OCLC, Inc. and shall not be disclosed in whole or in + * any part to any third party or used by any person for any purpose, without written + * consent of OCLC, Inc. Duplication of any portion of these materials shall include this notice. + * + ******************************************************************************************************************/ + +package com.baeldung.tasksservice.adapters.http; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.baeldung.tasksservice.adapters.repository.TaskRecord; +import com.baeldung.tasksservice.service.TasksService; +import com.baeldung.tasksservice.service.UnknownTaskException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/") +class TasksController { + @Autowired + private TasksService tasksService; + + @PostMapping + @ResponseStatus(HttpStatus.CREATED) + public TaskResponse createTask(@RequestBody CreateTaskRequest body) { + var task = tasksService.createTask(body.title(), body.createdBy()); + return buildResponse(task); + } + + @GetMapping + public List searchTasks(@RequestParam("status") Optional status, + @RequestParam("createdBy") Optional createdBy) { + var tasks = tasksService.search(status, createdBy); + + return tasks.stream() + .map(this::buildResponse) + .collect(Collectors.toList()); + } + + @GetMapping("/{id}") + public TaskResponse getTask(@PathVariable("id") String id) { + var task = tasksService.getTaskById(id); + return buildResponse(task); + } + + @DeleteMapping("/{id}") + public void deleteTask(@PathVariable("id") String id) { + tasksService.deleteTaskById(id); + } + + @PatchMapping("/{id}") + public TaskResponse patchTask(@PathVariable("id") String id, + @RequestBody PatchTaskRequest body) { + var task = tasksService.updateTask(id, body.status(), body.assignedTo()); + + return buildResponse(task); + } + + private TaskResponse buildResponse(final TaskRecord task) { + return new TaskResponse(task.getId(), task.getTitle(), task.getCreated(), task.getCreatedBy(), + task.getAssignedTo(), task.getStatus()); + } + + @ExceptionHandler(UnknownTaskException.class) + @ResponseStatus(HttpStatus.NOT_FOUND) + public void handleUnknownTask() { + } +} diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/http-client.env.json b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/http-client.env.json new file mode 100644 index 0000000000..f27fc4325b --- /dev/null +++ b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/http-client.env.json @@ -0,0 +1,5 @@ +{ + "local-tasks": { + "host": "localhost:8082" + } +} \ No newline at end of file diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/tasks.http b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/tasks.http new file mode 100644 index 0000000000..eb7d578ac9 --- /dev/null +++ b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/tasks.http @@ -0,0 +1,35 @@ +GET http://{{host}}/createdemoapplication1 HTTP/1.1 + +### +GET http://{{host}}/unknown HTTP/1.1 + +### +GET http://{{host}}?status=PENDING + +### +GET http://{{host}}?createdBy=baeldung + +### +GET http://{{host}}?createdBy=baeldung&status=COMPLETE + +### +DELETE http://{{host}}/createdemoapplication1 HTTP/1.1 + +### +DELETE http://{{host}}/unknown HTTP/1.1 + +### +POST http://{{host}} HTTP/1.1 +Content-Type: application/json + +{ + "title": "My Task", + "createdBy": "graham" +} +### +PATCH http://{{host}}/createdemoapplication1 HTTP/1.1 +Content-Type: application/json + +{ + "status": "COMPLETE" +} diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/jms/JmsConsumer.java b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/jms/JmsConsumer.java new file mode 100644 index 0000000000..d5a705f56f --- /dev/null +++ b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/jms/JmsConsumer.java @@ -0,0 +1,18 @@ +package com.baeldung.tasksservice.adapters.jms; + +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jms.annotation.JmsListener; + +import com.baeldung.tasksservice.service.DeletedUserService; + +@Service +public class JmsConsumer { + @Autowired + private DeletedUserService deletedUserService; + + @JmsListener(destination = "deleted_user") + public void receive(String user) { + deletedUserService.handleDeletedUser(user); + } +} diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/repository/TaskRecord.java b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/repository/TaskRecord.java new file mode 100644 index 0000000000..6646258c22 --- /dev/null +++ b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/repository/TaskRecord.java @@ -0,0 +1,80 @@ +/**************************************************************************************************************** + * + * Copyright (c) 2022 OCLC, Inc. All Rights Reserved. + * + * OCLC proprietary information: the enclosed materials contain + * proprietary information of OCLC, Inc. and shall not be disclosed in whole or in + * any part to any third party or used by any person for any purpose, without written + * consent of OCLC, Inc. Duplication of any portion of these materials shall include this notice. + * + ******************************************************************************************************************/ + +package com.baeldung.tasksservice.adapters.repository; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import java.time.Instant; + +@Entity +@Table(name = "tasks") +public class TaskRecord { + @Id + @Column(name = "task_id") + private String id; + private String title; + @Column(name = "created_at") + private Instant created; + @Column(name = "created_by") + private String createdBy; + @Column(name = "assigned_to") + private String assignedTo; + private String status; + + public TaskRecord(final String id, final String title, final Instant created, final String createdBy, + final String assignedTo, final String status) { + this.id = id; + this.title = title; + this.created = created; + this.createdBy = createdBy; + this.assignedTo = assignedTo; + this.status = status; + } + + private TaskRecord() { + // Needed for JPA + } + + public String getId() { + return id; + } + + public String getTitle() { + return title; + } + + public Instant getCreated() { + return created; + } + + public String getCreatedBy() { + return createdBy; + } + + public String getAssignedTo() { + return assignedTo; + } + + public String getStatus() { + return status; + } + + public void setAssignedTo(final String assignedTo) { + this.assignedTo = assignedTo; + } + + public void setStatus(final String status) { + this.status = status; + } +} \ No newline at end of file diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/repository/TasksRepository.java b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/repository/TasksRepository.java new file mode 100644 index 0000000000..9b6f041fd2 --- /dev/null +++ b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/repository/TasksRepository.java @@ -0,0 +1,28 @@ +/**************************************************************************************************************** + * + * Copyright (c) 2022 OCLC, Inc. All Rights Reserved. + * + * OCLC proprietary information: the enclosed materials contain + * proprietary information of OCLC, Inc. and shall not be disclosed in whole or in + * any part to any third party or used by any person for any purpose, without written + * consent of OCLC, Inc. Duplication of any portion of these materials shall include this notice. + * + ******************************************************************************************************************/ + +package com.baeldung.tasksservice.adapters.repository; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface TasksRepository extends JpaRepository { + List findByStatus(String status); + + List findByCreatedBy(String createdBy); + + List findByStatusAndCreatedBy(String status, String createdBy); + + List findByAssignedTo(String assignedTo); +} diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/service/DeletedUserService.java b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/service/DeletedUserService.java new file mode 100644 index 0000000000..50d35d3f93 --- /dev/null +++ b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/service/DeletedUserService.java @@ -0,0 +1,27 @@ +package com.baeldung.tasksservice.service; + +import javax.transaction.Transactional; + +import com.baeldung.tasksservice.adapters.repository.TaskRecord; +import com.baeldung.tasksservice.adapters.repository.TasksRepository; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class DeletedUserService { + @Autowired + private TasksRepository tasksRepository; + + @Transactional + public void handleDeletedUser(String user) { + var ownedByUser = tasksRepository.findByCreatedBy(user); + tasksRepository.deleteAll(ownedByUser); + + var assignedToUser = tasksRepository.findByAssignedTo(user); + for (TaskRecord record : assignedToUser) { + record.setAssignedTo(null); + record.setStatus("PENDING"); + } + } +} diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/service/TasksService.java b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/service/TasksService.java new file mode 100644 index 0000000000..e9ba1a9f70 --- /dev/null +++ b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/service/TasksService.java @@ -0,0 +1,72 @@ +/**************************************************************************************************************** + * + * Copyright (c) 2022 OCLC, Inc. All Rights Reserved. + * + * OCLC proprietary information: the enclosed materials contain + * proprietary information of OCLC, Inc. and shall not be disclosed in whole or in + * any part to any third party or used by any person for any purpose, without written + * consent of OCLC, Inc. Duplication of any portion of these materials shall include this notice. + * + ******************************************************************************************************************/ + +package com.baeldung.tasksservice.service; + +import javax.transaction.Transactional; +import java.time.Instant; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import com.baeldung.tasksservice.adapters.repository.TaskRecord; +import com.baeldung.tasksservice.adapters.repository.TasksRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class TasksService { + @Autowired + private TasksRepository tasksRepository; + + public TaskRecord getTaskById(String id) { + return tasksRepository.findById(id).orElseThrow(() -> new UnknownTaskException(id)); + } + + @Transactional + public void deleteTaskById(String id) { + var task = tasksRepository.findById(id).orElseThrow(() -> new UnknownTaskException(id)); + tasksRepository.delete(task); + } + + public List search(Optional createdBy, Optional status) { + if (createdBy.isPresent() && status.isPresent()) { + return tasksRepository.findByStatusAndCreatedBy(status.get(), createdBy.get()); + } else if (createdBy.isPresent()) { + return tasksRepository.findByCreatedBy(createdBy.get()); + } else if (status.isPresent()) { + return tasksRepository.findByStatus(status.get()); + } else { + return tasksRepository.findAll(); + } + } + + @Transactional + public TaskRecord updateTask(String id, Optional newStatus, Optional newAssignedTo) { + var task = tasksRepository.findById(id).orElseThrow(() -> new UnknownTaskException(id)); + + newStatus.ifPresent(task::setStatus); + newAssignedTo.ifPresent(task::setAssignedTo); + + return task; + } + + public TaskRecord createTask(String title, String createdBy) { + var task = new TaskRecord(UUID.randomUUID().toString(), + title, + Instant.now(), + createdBy, + null, + "PENDING"); + tasksRepository.save(task); + return task; + } +} diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/service/UnknownTaskException.java b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/service/UnknownTaskException.java new file mode 100644 index 0000000000..fd9fce4d16 --- /dev/null +++ b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/service/UnknownTaskException.java @@ -0,0 +1,24 @@ +/**************************************************************************************************************** + * + * Copyright (c) 2022 OCLC, Inc. All Rights Reserved. + * + * OCLC proprietary information: the enclosed materials contain + * proprietary information of OCLC, Inc. and shall not be disclosed in whole or in + * any part to any third party or used by any person for any purpose, without written + * consent of OCLC, Inc. Duplication of any portion of these materials shall include this notice. + * + ******************************************************************************************************************/ + +package com.baeldung.tasksservice.service; + +public class UnknownTaskException extends RuntimeException { + private final String id; + + public UnknownTaskException(final String id) { + this.id = id; + } + + public String getId() { + return id; + } +} diff --git a/lightrun/tasks-service/src/main/resources/application.properties b/lightrun/tasks-service/src/main/resources/application.properties new file mode 100644 index 0000000000..83bbf1a1b8 --- /dev/null +++ b/lightrun/tasks-service/src/main/resources/application.properties @@ -0,0 +1,13 @@ +server.port=8082 + +spring.artemis.mode=EMBEDDED +spring.artemis.host=localhost +spring.artemis.port=61616 + +spring.artemis.embedded.enabled=true + +spring.jms.template.default-destination=my-queue-1 + +logging.level.org.apache.activemq.audit.base=WARN +logging.level.org.apache.activemq.audit.message=WARN + diff --git a/lightrun/tasks-service/src/main/resources/db/migration/V1_0_0__create-tasks-table.sql b/lightrun/tasks-service/src/main/resources/db/migration/V1_0_0__create-tasks-table.sql new file mode 100644 index 0000000000..f2365c2687 --- /dev/null +++ b/lightrun/tasks-service/src/main/resources/db/migration/V1_0_0__create-tasks-table.sql @@ -0,0 +1,13 @@ +CREATE TABLE tasks ( + task_id VARCHAR(36) PRIMARY KEY, + title VARCHAR(100) NOT NULL, + created_at DATETIME NOT NULL, + created_by VARCHAR(36) NOT NULL, + assigned_to VARCHAR(36) NULL, + status VARCHAR(20) NOT NULL +); + +INSERT INTO tasks(task_id, title, created_at, created_by, assigned_to, status) VALUES + ('createdemoapplication1', 'Create demo applications - Tasks', '2022-05-05 12:34:56', 'baeldung', 'coxg', 'IN_PROGRESS'), + ('createdemoapplication2', 'Create demo applications - Users', '2022-05-05 12:34:56', 'baeldung', NULL, 'PENDING'), + ('createdemoapplication3', 'Create demo applications - API', '2022-05-05 12:34:56', 'baeldung', NULL, 'PENDING'); \ No newline at end of file diff --git a/lightrun/users-service/.gitignore b/lightrun/users-service/.gitignore new file mode 100644 index 0000000000..549e00a2a9 --- /dev/null +++ b/lightrun/users-service/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/lightrun/users-service/README.md b/lightrun/users-service/README.md new file mode 100644 index 0000000000..7c713e6638 --- /dev/null +++ b/lightrun/users-service/README.md @@ -0,0 +1,29 @@ +# Lightrun Example Application - Tasks Management + +This application exists as an example for the Lightrun series of articles. + +## Building +This application requires [Apache Maven](https://maven.apache.org/) and [Java 17+](https://www.oracle.com/java/technologies/downloads/). It does use the Maven Wrapper, so it can be built with only Java available on the path. + +As such, building the code is done by executing: +``` +$ ./mvnw install +``` +from the top level. + +## Running +The application consists of three services: +* Tasks +* Users +* API + +These are all Spring Boot applications. + +The Tasks and Users services exist as microservices for managing one facet of data. Each uses a database, and utilise a JMS queue between them as well. For convenience this infrastructure is all embedded in the applications. + +This does mean that the startup order is important. The JMS queue exists within the Tasks service and is connected to from the Users service. As such, the Tasks service must be started before the others. + +Each service can be started either by executing `mvn spring-boot:run` from within the appropriate directory. Alternatively, as Spring Boot applications, the build will produce an executable JAR file within the `target` directory that can be executed as, for example: +``` +$ java -jar ./target/tasks-service-0.0.1-SNAPSHOT.jar +``` diff --git a/lightrun/users-service/pom.xml b/lightrun/users-service/pom.xml new file mode 100644 index 0000000000..a961e4093b --- /dev/null +++ b/lightrun/users-service/pom.xml @@ -0,0 +1,63 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.6.7 + + + com.baeldung + users-service + 0.0.1-SNAPSHOT + users-service + Users Service for LightRun Article + + 17 + + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-artemis + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-web + + + org.flywaydb + flyway-core + + + + com.h2database + h2 + runtime + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/lightrun/users-service/src/main/java/com/baeldung/usersservice/JmsConfig.java b/lightrun/users-service/src/main/java/com/baeldung/usersservice/JmsConfig.java new file mode 100644 index 0000000000..c803c9af13 --- /dev/null +++ b/lightrun/users-service/src/main/java/com/baeldung/usersservice/JmsConfig.java @@ -0,0 +1,29 @@ +/**************************************************************************************************************** + * + * Copyright (c) 2022 OCLC, Inc. All Rights Reserved. + * + * OCLC proprietary information: the enclosed materials contain + * proprietary information of OCLC, Inc. and shall not be disclosed in whole or in + * any part to any third party or used by any person for any purpose, without written + * consent of OCLC, Inc. Duplication of any portion of these materials shall include this notice. + * + ******************************************************************************************************************/ + +package com.baeldung.usersservice; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.jms.support.converter.MappingJackson2MessageConverter; +import org.springframework.jms.support.converter.MessageConverter; +import org.springframework.jms.support.converter.MessageType; + +@Configuration +public class JmsConfig { + @Bean + public MessageConverter jacksonJmsMessageConverter() { + MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter(); + converter.setTargetType(MessageType.TEXT); + converter.setTypeIdPropertyName("_type"); + return converter; + } +} diff --git a/lightrun/users-service/src/main/java/com/baeldung/usersservice/UsersServiceApplication.java b/lightrun/users-service/src/main/java/com/baeldung/usersservice/UsersServiceApplication.java new file mode 100644 index 0000000000..487e8de45b --- /dev/null +++ b/lightrun/users-service/src/main/java/com/baeldung/usersservice/UsersServiceApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.usersservice; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class UsersServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(UsersServiceApplication.class, args); + } + +} diff --git a/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/CreateUserRequest.java b/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/CreateUserRequest.java new file mode 100644 index 0000000000..c3dfc8d068 --- /dev/null +++ b/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/CreateUserRequest.java @@ -0,0 +1,15 @@ +/**************************************************************************************************************** + * + * Copyright (c) 2022 OCLC, Inc. All Rights Reserved. + * + * OCLC proprietary information: the enclosed materials contain + * proprietary information of OCLC, Inc. and shall not be disclosed in whole or in + * any part to any third party or used by any person for any purpose, without written + * consent of OCLC, Inc. Duplication of any portion of these materials shall include this notice. + * + ******************************************************************************************************************/ + +package com.baeldung.usersservice.adapters.http; + +public record CreateUserRequest(String name) { +} diff --git a/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/PatchUserRequest.java b/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/PatchUserRequest.java new file mode 100644 index 0000000000..acaf7e635f --- /dev/null +++ b/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/PatchUserRequest.java @@ -0,0 +1,17 @@ +/**************************************************************************************************************** + * + * Copyright (c) 2022 OCLC, Inc. All Rights Reserved. + * + * OCLC proprietary information: the enclosed materials contain + * proprietary information of OCLC, Inc. and shall not be disclosed in whole or in + * any part to any third party or used by any person for any purpose, without written + * consent of OCLC, Inc. Duplication of any portion of these materials shall include this notice. + * + ******************************************************************************************************************/ + +package com.baeldung.usersservice.adapters.http; + +import java.util.Optional; + +public record PatchUserRequest(Optional name) { +} diff --git a/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/UserResponse.java b/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/UserResponse.java new file mode 100644 index 0000000000..b9a20c415b --- /dev/null +++ b/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/UserResponse.java @@ -0,0 +1,16 @@ +/**************************************************************************************************************** + * + * Copyright (c) 2022 OCLC, Inc. All Rights Reserved. + * + * OCLC proprietary information: the enclosed materials contain + * proprietary information of OCLC, Inc. and shall not be disclosed in whole or in + * any part to any third party or used by any person for any purpose, without written + * consent of OCLC, Inc. Duplication of any portion of these materials shall include this notice. + * + ******************************************************************************************************************/ + +package com.baeldung.usersservice.adapters.http; + +public record UserResponse(String id, + String name) { +} diff --git a/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/UsersController.java b/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/UsersController.java new file mode 100644 index 0000000000..a5138e31d6 --- /dev/null +++ b/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/UsersController.java @@ -0,0 +1,69 @@ +/**************************************************************************************************************** + * + * Copyright (c) 2022 OCLC, Inc. All Rights Reserved. + * + * OCLC proprietary information: the enclosed materials contain + * proprietary information of OCLC, Inc. and shall not be disclosed in whole or in + * any part to any third party or used by any person for any purpose, without written + * consent of OCLC, Inc. Duplication of any portion of these materials shall include this notice. + * + ******************************************************************************************************************/ + +package com.baeldung.usersservice.adapters.http; + +import com.baeldung.usersservice.adapters.repository.UserRecord; +import com.baeldung.usersservice.service.UsersService; +import com.baeldung.usersservice.service.UnknownUserException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/") +class UsersController { + @Autowired + private UsersService usersService; + + @GetMapping("/{id}") + public UserResponse getUser(@PathVariable("id") String id) { + var user = usersService.getUserById(id); + return buildResponse(user); + } + + @DeleteMapping("/{id}") + public void deleteUser(@PathVariable("id") String id) { + usersService.deleteUserById(id); + } + + @PostMapping + @ResponseStatus(HttpStatus.CREATED) + public UserResponse createUser(@RequestBody CreateUserRequest body) { + var user = usersService.createUser(body.name()); + return buildResponse(user); + } + + @PatchMapping("/{id}") + public UserResponse patchUser(@PathVariable("id") String id, + @RequestBody PatchUserRequest body) { + var user = usersService.updateUser(id, body.name()); + + return buildResponse(user); + } + private UserResponse buildResponse(final UserRecord user) { + return new UserResponse(user.getId(), user.getName()); + } + + @ExceptionHandler(UnknownUserException.class) + @ResponseStatus(HttpStatus.NOT_FOUND) + public void handleUnknownUser() { + } +} diff --git a/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/http-client.env.json b/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/http-client.env.json new file mode 100644 index 0000000000..3be2f710ff --- /dev/null +++ b/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/http-client.env.json @@ -0,0 +1,5 @@ +{ + "local-users": { + "host": "localhost:8081" + } +} \ No newline at end of file diff --git a/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/users.http b/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/users.http new file mode 100644 index 0000000000..904c5f1cf1 --- /dev/null +++ b/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/users.http @@ -0,0 +1,25 @@ +GET http://{{host}}/baeldung HTTP/1.1 + +### +GET http://{{host}}/unknown HTTP/1.1 + +### +DELETE http://{{host}}/baeldung HTTP/1.1 + +### +DELETE http://{{host}}/unknown HTTP/1.1 + +### +POST http://{{host}} HTTP/1.1 +Content-Type: application/json + +{ + "name": "Testing" +} +### +PATCH http://{{host}}/coxg HTTP/1.1 +Content-Type: application/json + +{ + "name": "Test Name" +} diff --git a/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/jms/JmsSender.java b/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/jms/JmsSender.java new file mode 100644 index 0000000000..f5d5d7900f --- /dev/null +++ b/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/jms/JmsSender.java @@ -0,0 +1,26 @@ +/**************************************************************************************************************** + * + * Copyright (c) 2022 OCLC, Inc. All Rights Reserved. + * + * OCLC proprietary information: the enclosed materials contain + * proprietary information of OCLC, Inc. and shall not be disclosed in whole or in + * any part to any third party or used by any person for any purpose, without written + * consent of OCLC, Inc. Duplication of any portion of these materials shall include this notice. + * + ******************************************************************************************************************/ + +package com.baeldung.usersservice.adapters.jms; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jms.core.JmsTemplate; +import org.springframework.stereotype.Repository; + +@Repository +public class JmsSender { + @Autowired + private JmsTemplate jmsTemplate; + + public void sendDeleteUserMessage(String userId) { + jmsTemplate.convertAndSend("deleted_user", userId); + } +} diff --git a/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/repository/UserRecord.java b/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/repository/UserRecord.java new file mode 100644 index 0000000000..fe87ac3ffe --- /dev/null +++ b/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/repository/UserRecord.java @@ -0,0 +1,47 @@ +/**************************************************************************************************************** + * + * Copyright (c) 2022 OCLC, Inc. All Rights Reserved. + * + * OCLC proprietary information: the enclosed materials contain + * proprietary information of OCLC, Inc. and shall not be disclosed in whole or in + * any part to any third party or used by any person for any purpose, without written + * consent of OCLC, Inc. Duplication of any portion of these materials shall include this notice. + * + ******************************************************************************************************************/ + +package com.baeldung.usersservice.adapters.repository; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "users") +public class UserRecord { + @Id + @Column(name = "user_id") + private String id; + private String name; + + public UserRecord(final String id, final String name) { + this.id = id; + this.name = name; + } + + private UserRecord() { + // Needed for JPA + } + + public String getId() { + return id; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } +} \ No newline at end of file diff --git a/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/repository/UsersRepository.java b/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/repository/UsersRepository.java new file mode 100644 index 0000000000..ed193a4955 --- /dev/null +++ b/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/repository/UsersRepository.java @@ -0,0 +1,19 @@ +/**************************************************************************************************************** + * + * Copyright (c) 2022 OCLC, Inc. All Rights Reserved. + * + * OCLC proprietary information: the enclosed materials contain + * proprietary information of OCLC, Inc. and shall not be disclosed in whole or in + * any part to any third party or used by any person for any purpose, without written + * consent of OCLC, Inc. Duplication of any portion of these materials shall include this notice. + * + ******************************************************************************************************************/ + +package com.baeldung.usersservice.adapters.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface UsersRepository extends JpaRepository { +} diff --git a/lightrun/users-service/src/main/java/com/baeldung/usersservice/service/UnknownUserException.java b/lightrun/users-service/src/main/java/com/baeldung/usersservice/service/UnknownUserException.java new file mode 100644 index 0000000000..d0ca79850c --- /dev/null +++ b/lightrun/users-service/src/main/java/com/baeldung/usersservice/service/UnknownUserException.java @@ -0,0 +1,24 @@ +/**************************************************************************************************************** + * + * Copyright (c) 2022 OCLC, Inc. All Rights Reserved. + * + * OCLC proprietary information: the enclosed materials contain + * proprietary information of OCLC, Inc. and shall not be disclosed in whole or in + * any part to any third party or used by any person for any purpose, without written + * consent of OCLC, Inc. Duplication of any portion of these materials shall include this notice. + * + ******************************************************************************************************************/ + +package com.baeldung.usersservice.service; + +public class UnknownUserException extends RuntimeException { + private final String id; + + public UnknownUserException(final String id) { + this.id = id; + } + + public String getId() { + return id; + } +} diff --git a/lightrun/users-service/src/main/java/com/baeldung/usersservice/service/UsersService.java b/lightrun/users-service/src/main/java/com/baeldung/usersservice/service/UsersService.java new file mode 100644 index 0000000000..46954b1ee0 --- /dev/null +++ b/lightrun/users-service/src/main/java/com/baeldung/usersservice/service/UsersService.java @@ -0,0 +1,61 @@ +/**************************************************************************************************************** + * + * Copyright (c) 2022 OCLC, Inc. All Rights Reserved. + * + * OCLC proprietary information: the enclosed materials contain + * proprietary information of OCLC, Inc. and shall not be disclosed in whole or in + * any part to any third party or used by any person for any purpose, without written + * consent of OCLC, Inc. Duplication of any portion of these materials shall include this notice. + * + ******************************************************************************************************************/ + +package com.baeldung.usersservice.service; + +import javax.transaction.Transactional; + +import java.time.Instant; +import java.util.Optional; +import java.util.UUID; + +import com.baeldung.usersservice.adapters.jms.JmsSender; +import com.baeldung.usersservice.adapters.repository.UserRecord; +import com.baeldung.usersservice.adapters.repository.UsersRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jms.core.JmsTemplate; +import org.springframework.stereotype.Service; + +@Service +public class UsersService { + @Autowired + private UsersRepository usersRepository; + + @Autowired + private JmsSender jmsSender; + + public UserRecord getUserById(String id) { + return usersRepository.findById(id).orElseThrow(() -> new UnknownUserException(id)); + } + + @Transactional + public void deleteUserById(String id) { + var user = usersRepository.findById(id).orElseThrow(() -> new UnknownUserException(id)); + usersRepository.delete(user); + + jmsSender.sendDeleteUserMessage(id); + } + + @Transactional + public UserRecord updateUser(String id, Optional newName) { + var user = usersRepository.findById(id).orElseThrow(() -> new UnknownUserException(id)); + + newName.ifPresent(user::setName); + + return user; + } + + public UserRecord createUser(String name) { + var user = new UserRecord(UUID.randomUUID().toString(), name); + usersRepository.save(user); + return user; + } +} diff --git a/lightrun/users-service/src/main/resources/application.properties b/lightrun/users-service/src/main/resources/application.properties new file mode 100644 index 0000000000..8cc8f67d92 --- /dev/null +++ b/lightrun/users-service/src/main/resources/application.properties @@ -0,0 +1,10 @@ +server.port=8081 + +spring.artemis.host=localhost +spring.artemis.port=61616 + +spring.jms.template.default-destination=my-queue-1 + +logging.level.org.apache.activemq.audit.base=WARN +logging.level.org.apache.activemq.audit.message=WARN + diff --git a/lightrun/users-service/src/main/resources/db/migration/V1_0_0__create-users-table.sql b/lightrun/users-service/src/main/resources/db/migration/V1_0_0__create-users-table.sql new file mode 100644 index 0000000000..d1ec9387e6 --- /dev/null +++ b/lightrun/users-service/src/main/resources/db/migration/V1_0_0__create-users-table.sql @@ -0,0 +1,8 @@ +CREATE TABLE users ( + user_id VARCHAR(36) PRIMARY KEY, + name VARCHAR(100) NOT NULL +); + +INSERT INTO users(user_id, name) VALUES + ('baeldung', 'Baeldung'), + ('coxg', 'Graham'); \ No newline at end of file diff --git a/pom.xml b/pom.xml index 106bb7516a..963267fee5 100644 --- a/pom.xml +++ b/pom.xml @@ -1329,6 +1329,7 @@ spring-boot-modules/spring-boot-camel testing-modules/testing-assertions persistence-modules/fauna + lightrun @@ -1396,6 +1397,7 @@ spring-boot-modules/spring-boot-camel testing-modules/testing-assertions persistence-modules/fauna + lightrun From e1c046fcab423aad3cffce764728fc4f53b620df Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Tue, 17 May 2022 21:53:59 +0530 Subject: [PATCH 218/278] JAVA-11489 Disabled sharing of Restx logs to Restx stats collector which is not working as of now --- restx/src/main/resources/restx/demo/settings.properties | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/restx/src/main/resources/restx/demo/settings.properties b/restx/src/main/resources/restx/demo/settings.properties index a03c2eea97..3b2b591922 100644 --- a/restx/src/main/resources/restx/demo/settings.properties +++ b/restx/src/main/resources/restx/demo/settings.properties @@ -1 +1,2 @@ -app.name=restx-demo \ No newline at end of file +app.name=restx-demo +restx.stats.share.enable=false \ No newline at end of file From 851c7d933e5375f241ff6ea9cffc2bc3d72fdae6 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Tue, 17 May 2022 22:04:30 +0530 Subject: [PATCH 219/278] JAVA-11489 Removed a test that was designed to run for 50 seconds to a new Manual Test class --- .../flogger/FloggerIntegrationTest.java | 8 ------ .../baeldung/flogger/FloggerManualTest.java | 25 +++++++++++++++++++ 2 files changed, 25 insertions(+), 8 deletions(-) create mode 100644 logging-modules/flogger/src/test/java/com/baeldung/flogger/FloggerManualTest.java diff --git a/logging-modules/flogger/src/test/java/com/baeldung/flogger/FloggerIntegrationTest.java b/logging-modules/flogger/src/test/java/com/baeldung/flogger/FloggerIntegrationTest.java index 80fa0edd96..d3b73637a4 100644 --- a/logging-modules/flogger/src/test/java/com/baeldung/flogger/FloggerIntegrationTest.java +++ b/logging-modules/flogger/src/test/java/com/baeldung/flogger/FloggerIntegrationTest.java @@ -5,7 +5,6 @@ import com.google.common.flogger.LoggerConfig; import com.google.common.flogger.StackSize; import org.junit.Test; -import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.stream.IntStream; @@ -25,13 +24,6 @@ public class FloggerIntegrationTest { }); } - @Test - public void givenATimeInterval_shouldLogAfterEveryTimeInterval() { - IntStream.range(0, 1_000_0000).forEach(value -> { - logger.atInfo().atMostEvery(10, TimeUnit.SECONDS).log("This log shows [every 10 seconds] => %d", value); - }); - } - @Test public void givenAnObject_shouldLogTheObject() { User user = new User(); diff --git a/logging-modules/flogger/src/test/java/com/baeldung/flogger/FloggerManualTest.java b/logging-modules/flogger/src/test/java/com/baeldung/flogger/FloggerManualTest.java new file mode 100644 index 0000000000..a3444e596e --- /dev/null +++ b/logging-modules/flogger/src/test/java/com/baeldung/flogger/FloggerManualTest.java @@ -0,0 +1,25 @@ +package com.baeldung.flogger; + +import java.util.concurrent.TimeUnit; +import java.util.stream.IntStream; + +import org.junit.Test; + +import com.google.common.flogger.FluentLogger; + +public class FloggerManualTest { + static { +// System.setProperty("flogger.backend_factory", "com.google.common.flogger.backend.log4j.Log4jBackendFactory#getInstance"); + System.setProperty("flogger.backend_factory", + "com.google.common.flogger.backend.slf4j.Slf4jBackendFactory#getInstance"); + } + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); + + @Test + public void givenATimeInterval_shouldLogAfterEveryTimeInterval() { + IntStream.range(0, 1_000_0000).forEach(value -> { + logger.atInfo().atMostEvery(10, TimeUnit.SECONDS).log("This log shows [every 10 seconds] => %d", value); + }); + } + +} From 633b5849bb8a65c69ea08443faefd686d01a2819 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Tue, 17 May 2022 22:28:39 +0530 Subject: [PATCH 220/278] JAVA-11489 Renamed time taking and unused integration tests to *ManualTests --- ...le1IntegrationTest.java => Example1ManualTest.java} | 2 +- ...le2IntegrationTest.java => Example2ManualTest.java} | 2 +- ...lelIntegrationTest.java => ParallelManualTest.java} | 6 +++--- ...nTest.java => Spring5JUnit5ParallelManualTest.java} | 10 +++++----- 4 files changed, 10 insertions(+), 10 deletions(-) rename spring-5/src/test/java/com/baeldung/{Example1IntegrationTest.java => Example1ManualTest.java} (93%) rename spring-5/src/test/java/com/baeldung/{Example2IntegrationTest.java => Example2ManualTest.java} (93%) rename spring-5/src/test/java/com/baeldung/{ParallelIntegrationTest.java => ParallelManualTest.java} (62%) rename spring-5/src/test/java/com/baeldung/jupiter/{Spring5JUnit5ParallelIntegrationTest.java => Spring5JUnit5ParallelManualTest.java} (60%) diff --git a/spring-5/src/test/java/com/baeldung/Example1IntegrationTest.java b/spring-5/src/test/java/com/baeldung/Example1ManualTest.java similarity index 93% rename from spring-5/src/test/java/com/baeldung/Example1IntegrationTest.java rename to spring-5/src/test/java/com/baeldung/Example1ManualTest.java index 8b9e66213f..c3330b4213 100644 --- a/spring-5/src/test/java/com/baeldung/Example1IntegrationTest.java +++ b/spring-5/src/test/java/com/baeldung/Example1ManualTest.java @@ -7,7 +7,7 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest -public class Example1IntegrationTest { +public class Example1ManualTest { @Test public void test1a() { diff --git a/spring-5/src/test/java/com/baeldung/Example2IntegrationTest.java b/spring-5/src/test/java/com/baeldung/Example2ManualTest.java similarity index 93% rename from spring-5/src/test/java/com/baeldung/Example2IntegrationTest.java rename to spring-5/src/test/java/com/baeldung/Example2ManualTest.java index 6ed53ca4e9..9c47b17fdb 100644 --- a/spring-5/src/test/java/com/baeldung/Example2IntegrationTest.java +++ b/spring-5/src/test/java/com/baeldung/Example2ManualTest.java @@ -7,7 +7,7 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest -public class Example2IntegrationTest { +public class Example2ManualTest { @Test public void test1a() { diff --git a/spring-5/src/test/java/com/baeldung/ParallelIntegrationTest.java b/spring-5/src/test/java/com/baeldung/ParallelManualTest.java similarity index 62% rename from spring-5/src/test/java/com/baeldung/ParallelIntegrationTest.java rename to spring-5/src/test/java/com/baeldung/ParallelManualTest.java index 1ce96de4ef..5c3a111c62 100644 --- a/spring-5/src/test/java/com/baeldung/ParallelIntegrationTest.java +++ b/spring-5/src/test/java/com/baeldung/ParallelManualTest.java @@ -5,18 +5,18 @@ import org.junit.experimental.ParallelComputer; import org.junit.runner.Computer; import org.junit.runner.JUnitCore; -public class ParallelIntegrationTest { +public class ParallelManualTest { @Test public void runTests() { - final Class[] classes = { Example1IntegrationTest.class, Example2IntegrationTest.class }; + final Class[] classes = { Example1ManualTest.class, Example2ManualTest.class }; JUnitCore.runClasses(new Computer(), classes); } @Test public void runTestsInParallel() { - final Class[] classes = { Example1IntegrationTest.class, Example2IntegrationTest.class }; + final Class[] classes = { Example1ManualTest.class, Example2ManualTest.class }; JUnitCore.runClasses(new ParallelComputer(true, true), classes); } diff --git a/spring-5/src/test/java/com/baeldung/jupiter/Spring5JUnit5ParallelIntegrationTest.java b/spring-5/src/test/java/com/baeldung/jupiter/Spring5JUnit5ParallelManualTest.java similarity index 60% rename from spring-5/src/test/java/com/baeldung/jupiter/Spring5JUnit5ParallelIntegrationTest.java rename to spring-5/src/test/java/com/baeldung/jupiter/Spring5JUnit5ParallelManualTest.java index 55b0fcf267..b9ed87ed73 100644 --- a/spring-5/src/test/java/com/baeldung/jupiter/Spring5JUnit5ParallelIntegrationTest.java +++ b/spring-5/src/test/java/com/baeldung/jupiter/Spring5JUnit5ParallelManualTest.java @@ -1,24 +1,24 @@ package com.baeldung.jupiter; -import com.baeldung.Example1IntegrationTest; -import com.baeldung.Example2IntegrationTest; +import com.baeldung.Example1ManualTest; +import com.baeldung.Example2ManualTest; import org.junit.experimental.ParallelComputer; import org.junit.jupiter.api.Test; import org.junit.runner.Computer; import org.junit.runner.JUnitCore; -class Spring5JUnit5ParallelIntegrationTest { +class Spring5JUnit5ParallelManualTest { @Test void givenTwoTestClasses_whenJUnitRunParallel_thenTheTestsExecutingParallel() { - final Class[] classes = { Example1IntegrationTest.class, Example2IntegrationTest.class }; + final Class[] classes = { Example1ManualTest.class, Example2ManualTest.class }; JUnitCore.runClasses(new ParallelComputer(true, true), classes); } @Test void givenTwoTestClasses_whenJUnitRunParallel_thenTheTestsExecutingLinear() { - final Class[] classes = { Example1IntegrationTest.class, Example2IntegrationTest.class }; + final Class[] classes = { Example1ManualTest.class, Example2ManualTest.class }; JUnitCore.runClasses(new Computer(), classes); } From f05171163b381e998fffed390cfb9f9cad78bf79 Mon Sep 17 00:00:00 2001 From: 515882294 <515882294@qq.com> Date: Wed, 18 May 2022 01:51:16 +0800 Subject: [PATCH 221/278] BAEL-4463: change method name --- .../java/com/baeldung/reflection/proxy/AdvancedOperation.java | 2 +- .../main/java/com/baeldung/reflection/proxy/BasicOperation.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/proxy/AdvancedOperation.java b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/proxy/AdvancedOperation.java index 3262b255f0..b3f0dc8ec0 100644 --- a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/proxy/AdvancedOperation.java +++ b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/proxy/AdvancedOperation.java @@ -1,7 +1,7 @@ package com.baeldung.reflection.proxy; public interface AdvancedOperation { - int multiple(int a, int b); + int multiply(int a, int b); int divide(int a, int b); } \ No newline at end of file diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/proxy/BasicOperation.java b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/proxy/BasicOperation.java index b39eb0118e..168367b690 100644 --- a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/proxy/BasicOperation.java +++ b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/proxy/BasicOperation.java @@ -3,5 +3,5 @@ package com.baeldung.reflection.proxy; public interface BasicOperation { int add(int a, int b); - int sub(int a, int b); + int subtract(int a, int b); } \ No newline at end of file From f57604bef02552b57fc4ea0bf6ed6e7a1047b941 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Aragon=C3=A9s=20L=C3=B3pez?= Date: Tue, 17 May 2022 21:02:03 +0200 Subject: [PATCH 222/278] Request Mapping value in properties file (#12226) * Exception Handler implemented for Spring Security Resource Server * Renamed test class name to solve PMD Failure * Code formatting * Using property parameter as Request Mapping value * Renamed test class name to solve PMD Failure --- .../WelcomeController.java | 15 +++++++++++ .../src/main/resources/application.properties | 1 + .../WelcomeControllerUnitTest.java | 25 +++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 spring-web-modules/spring-mvc-basics-5/src/main/java/com/baeldung/requestmappingvalue/WelcomeController.java create mode 100644 spring-web-modules/spring-mvc-basics-5/src/test/java/com/baeldung/requestmappingvalue/WelcomeControllerUnitTest.java diff --git a/spring-web-modules/spring-mvc-basics-5/src/main/java/com/baeldung/requestmappingvalue/WelcomeController.java b/spring-web-modules/spring-mvc-basics-5/src/main/java/com/baeldung/requestmappingvalue/WelcomeController.java new file mode 100644 index 0000000000..bbc978ccd4 --- /dev/null +++ b/spring-web-modules/spring-mvc-basics-5/src/main/java/com/baeldung/requestmappingvalue/WelcomeController.java @@ -0,0 +1,15 @@ +package com.baeldung.requestmappingvalue; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/${request.value}") +public class WelcomeController { + + @GetMapping + public String getWelcomeMessage() { + return "Welcome to Baeldung!"; + } +} diff --git a/spring-web-modules/spring-mvc-basics-5/src/main/resources/application.properties b/spring-web-modules/spring-mvc-basics-5/src/main/resources/application.properties index 935f91554b..61a0755b93 100644 --- a/spring-web-modules/spring-mvc-basics-5/src/main/resources/application.properties +++ b/spring-web-modules/spring-mvc-basics-5/src/main/resources/application.properties @@ -1 +1,2 @@ server.servlet.context-path=/spring-mvc-basics +request.value=welcome diff --git a/spring-web-modules/spring-mvc-basics-5/src/test/java/com/baeldung/requestmappingvalue/WelcomeControllerUnitTest.java b/spring-web-modules/spring-mvc-basics-5/src/test/java/com/baeldung/requestmappingvalue/WelcomeControllerUnitTest.java new file mode 100644 index 0000000000..ac5140733b --- /dev/null +++ b/spring-web-modules/spring-mvc-basics-5/src/test/java/com/baeldung/requestmappingvalue/WelcomeControllerUnitTest.java @@ -0,0 +1,25 @@ +package com.baeldung.requestmappingvalue; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.web.servlet.MockMvc; + +@SpringBootTest +@AutoConfigureMockMvc +class WelcomeControllerUnitTest { + + @Autowired + private MockMvc mockMvc; + + @Test + public void whenUserAccessToWelcome_thenReturnOK() throws Exception { + this.mockMvc.perform(get("/welcome")) + .andExpect(status().isOk()); + } + +} \ No newline at end of file From 7e3cddafaad586287c99f2f23426ddee554fc93d Mon Sep 17 00:00:00 2001 From: Ashley Frieze Date: Wed, 18 May 2022 08:54:10 +0100 Subject: [PATCH 223/278] BAEL-5562 Check if character is vowel (#12221) --- .../core-java-string-operations-4/pom.xml | 6 +++ .../com/baeldung/checkvowels/CheckVowels.java | 38 ++++++++++++++ .../checkvowels/CheckVowelsUnitTest.java | 51 +++++++++++++++++++ 3 files changed, 95 insertions(+) create mode 100644 core-java-modules/core-java-string-operations-4/src/main/java/com/baeldung/checkvowels/CheckVowels.java create mode 100644 core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/checkvowels/CheckVowelsUnitTest.java diff --git a/core-java-modules/core-java-string-operations-4/pom.xml b/core-java-modules/core-java-string-operations-4/pom.xml index 7f71ea8da5..0f1e377d18 100644 --- a/core-java-modules/core-java-string-operations-4/pom.xml +++ b/core-java-modules/core-java-string-operations-4/pom.xml @@ -30,6 +30,12 @@ commons-lang3 ${apache-commons-lang3.version} + + org.assertj + assertj-core + ${assertj.version} + test + diff --git a/core-java-modules/core-java-string-operations-4/src/main/java/com/baeldung/checkvowels/CheckVowels.java b/core-java-modules/core-java-string-operations-4/src/main/java/com/baeldung/checkvowels/CheckVowels.java new file mode 100644 index 0000000000..fd60427a4e --- /dev/null +++ b/core-java-modules/core-java-string-operations-4/src/main/java/com/baeldung/checkvowels/CheckVowels.java @@ -0,0 +1,38 @@ +package com.baeldung.checkvowels; + +import java.util.regex.Pattern; + +public class CheckVowels { + private static final String VOWELS = "aeiouAEIOU"; + private static final Pattern VOWELS_PATTERN = Pattern.compile("[aeiou]", Pattern.CASE_INSENSITIVE); + + public static boolean isInVowelsString(char c) { + return VOWELS.indexOf(c) != -1; + } + + public static boolean isInVowelsString(String c) { + return VOWELS.contains(c); + } + + public static boolean isVowelBySwitch(char c) { + switch (c) { + case 'a': + case 'e': + case 'i': + case 'o': + case 'u': + case 'A': + case 'E': + case 'I': + case 'O': + case 'U': + return true; + default: + return false; + } + } + + public static boolean isVowelByRegex(String c) { + return VOWELS_PATTERN.matcher(c).matches(); + } +} diff --git a/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/checkvowels/CheckVowelsUnitTest.java b/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/checkvowels/CheckVowelsUnitTest.java new file mode 100644 index 0000000000..52b0e55692 --- /dev/null +++ b/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/checkvowels/CheckVowelsUnitTest.java @@ -0,0 +1,51 @@ +package com.baeldung.checkvowels; + +import org.junit.jupiter.api.Test; + +import static com.baeldung.checkvowels.CheckVowels.*; +import static org.assertj.core.api.Assertions.*; + +class CheckVowelsUnitTest { + + @Test + void givenAVowelCharacter_thenInVowelString() { + assertThat(isInVowelsString('e')).isTrue(); + } + + @Test + void givenAConsonantCharacter_thenNotInVowelString() { + assertThat(isInVowelsString('z')).isFalse(); + } + + @Test + void givenAVowelString_thenInVowelString() { + assertThat(isInVowelsString("e")).isTrue(); + } + + @Test + void givenAConsonantString_thenNotInVowelString() { + assertThat(isInVowelsString("z")).isFalse(); + } + + @Test + void givenAVowelCharacter_thenInVowelSwitch() { + assertThat(isVowelBySwitch('e')).isTrue(); + } + + @Test + void givenAConsonantCharacter_thenNotInVowelSwitch() { + assertThat(isVowelBySwitch('z')).isFalse(); + } + + @Test + void givenAVowelString_thenInVowelPattern() { + assertThat(isVowelByRegex("e")).isTrue(); + assertThat(isVowelByRegex("E")).isTrue(); + } + + @Test + void givenAVowelCharacter_thenInVowelPattern() { + assertThat(isVowelByRegex(Character.toString('e'))).isTrue(); + assertThat(isVowelByRegex("E")).isTrue(); + } +} From 228c92dc67651662cb31bb6ae49e6b108b9fcb4a Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Wed, 18 May 2022 23:38:44 +0530 Subject: [PATCH 224/278] JAVA-12081 Reverting hazelcast back to previous version - Fixes JAVA-12081 --- libraries-data/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries-data/pom.xml b/libraries-data/pom.xml index c33be5b192..f0f5338560 100644 --- a/libraries-data/pom.xml +++ b/libraries-data/pom.xml @@ -174,7 +174,7 @@ 2.8.2 1.1.1 1.5.0 - 5.1.1 + 3.8.4 0.15.0 2.2.0 1.6.0.1 From b1c0a40b0eb7f087a60f9a1e0a6e59878870528c Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Wed, 18 May 2022 23:59:18 +0530 Subject: [PATCH 225/278] JAVA-11489 Renamed PropertiesReloadIntegrationTest to *ManualTest --- ...loadIntegrationTest.java => PropertiesReloadManualTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/reloading/{PropertiesReloadIntegrationTest.java => PropertiesReloadManualTest.java} (99%) diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/reloading/PropertiesReloadIntegrationTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/reloading/PropertiesReloadManualTest.java similarity index 99% rename from spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/reloading/PropertiesReloadIntegrationTest.java rename to spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/reloading/PropertiesReloadManualTest.java index 0c28cb085b..88e22af4ba 100644 --- a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/reloading/PropertiesReloadIntegrationTest.java +++ b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/reloading/PropertiesReloadManualTest.java @@ -24,7 +24,7 @@ import org.springframework.web.context.WebApplicationContext; @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = SpringBootPropertiesTestApplication.class) -public class PropertiesReloadIntegrationTest { +public class PropertiesReloadManualTest { protected MockMvc mvc; From 75a751df3a5695b605472ff86a56b84861c11d4c Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 19 May 2022 01:34:23 +0200 Subject: [PATCH 226/278] JAVA-5484: New Java Http Client Timeout (#12223) Co-authored-by: Harpal Singh --- .../baeldung/http/JavaHttpClientTimeout.java | 12 +++++ .../JavaHttpClientTimeoutIntegrationTest.java | 54 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 core-java-modules/core-java-networking-3/src/main/java/com/baeldung/http/JavaHttpClientTimeout.java create mode 100644 core-java-modules/core-java-networking-3/src/test/java/com/baeldung/http/JavaHttpClientTimeoutIntegrationTest.java diff --git a/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/http/JavaHttpClientTimeout.java b/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/http/JavaHttpClientTimeout.java new file mode 100644 index 0000000000..d7ab002e77 --- /dev/null +++ b/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/http/JavaHttpClientTimeout.java @@ -0,0 +1,12 @@ +package com.baeldung.http; + +import java.net.http.HttpClient; +import java.time.Duration; + +public class JavaHttpClientTimeout { + static HttpClient getHttpClientWithTimeout(int seconds) { + return HttpClient.newBuilder() + .connectTimeout(Duration.ofSeconds(seconds)) + .build(); + } +} diff --git a/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/http/JavaHttpClientTimeoutIntegrationTest.java b/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/http/JavaHttpClientTimeoutIntegrationTest.java new file mode 100644 index 0000000000..df635621ad --- /dev/null +++ b/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/http/JavaHttpClientTimeoutIntegrationTest.java @@ -0,0 +1,54 @@ +package com.baeldung.http; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpConnectTimeoutException; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.time.Duration; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +import static com.baeldung.http.JavaHttpClientTimeout.getHttpClientWithTimeout; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class JavaHttpClientTimeoutIntegrationTest { + + private HttpClient httpClient; + private HttpRequest httpRequest; + + @BeforeEach + public void setUp() { + httpClient = getHttpClientWithTimeout(3); + httpClient.connectTimeout().map(Duration::toSeconds) + .ifPresent(sec -> System.out.println("Timeout in seconds: " + sec)); + + httpRequest = HttpRequest.newBuilder().uri(URI.create("http://10.255.255.1")).GET().build(); + } + + @Test + void shouldThrowExceptionWhenMakingSyncCall() { + HttpConnectTimeoutException thrown = assertThrows( + HttpConnectTimeoutException.class, + () -> httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString()), + "Expected doThing() to throw, but it didn't" + ); + assertTrue(thrown.getMessage().contains("timed out")); + } + + @Test + void shouldThrowExceptionWhenMakingASyncCall() throws ExecutionException, InterruptedException, TimeoutException { + CompletableFuture completableFuture = + httpClient.sendAsync(httpRequest, HttpResponse.BodyHandlers.ofString()) + .thenApply(HttpResponse::body) + .exceptionally(Throwable::getMessage); + String response = completableFuture.get(5, TimeUnit.SECONDS); + assertTrue(response.contains("timed out")); + } +} \ No newline at end of file From f8ce24823675e0e32b3e965755812b27b3cfce2b Mon Sep 17 00:00:00 2001 From: opokharel <66694687+opokharel@users.noreply.github.com> Date: Wed, 18 May 2022 18:36:27 -0600 Subject: [PATCH 227/278] [BAEL-5554] Find files that match a wildcard string in Java by @opokharel (#12190) * BAEL-5554 by @opokharel * deletedToMoveToSrcFolder * movedToSrcFolder * redoingForJenkins * newPR for [BAEL-5554] Find files that match a wildcard string in Java by @opokharel * @opokharel * [BAEL-5554] @opokharel * [BAEL-5554] Find files that match a wildcard string in Java by @opokharel * Update SearchFileByWildcardTest.java * Update SearchFileByWildcard.java * Update SearchFileByWildcard.java * Create SearchFileByWildcardUnitTest.java * Delete SearchFileByWildcardTest.java * [BAEL-5554] Find files that match a wildcard string in Java by @opokharel * Update SearchFileByWildcardUnitTest.java * Update SearchFileByWildcardUnitTest.java * [BAEL-5554] UnitTestFiles by @opokharel * Update core-java-modules/core-java-nio-2/src/test/java/com/baeldung/searchfilesbywildcards/SearchFileByWildcardUnitTest.java Co-authored-by: KevinGilmore * updated curly braces and assertions Co-authored-by: KevinGilmore --- .../SearchFileByWildcard.java | 37 ++++++++++++++++++ .../SearchFileByWildcardUnitTest.java | 30 ++++++++++++++ .../src/test/resources/sfbw/test/five.csv | 0 .../src/test/resources/sfbw/test/four.xlsx | Bin 0 -> 6169 bytes .../src/test/resources/sfbw/test/one.txt | 0 .../test/resources/sfbw/test/test2/six.txt | 0 .../src/test/resources/sfbw/test/three.txt | 0 .../src/test/resources/sfbw/test/two.docx | 0 8 files changed, 67 insertions(+) create mode 100644 core-java-modules/core-java-nio-2/src/main/java/com/baeldung/searchfilesbywildcards/SearchFileByWildcard.java create mode 100644 core-java-modules/core-java-nio-2/src/test/java/com/baeldung/searchfilesbywildcards/SearchFileByWildcardUnitTest.java create mode 100644 core-java-modules/core-java-nio-2/src/test/resources/sfbw/test/five.csv create mode 100644 core-java-modules/core-java-nio-2/src/test/resources/sfbw/test/four.xlsx create mode 100644 core-java-modules/core-java-nio-2/src/test/resources/sfbw/test/one.txt create mode 100644 core-java-modules/core-java-nio-2/src/test/resources/sfbw/test/test2/six.txt create mode 100644 core-java-modules/core-java-nio-2/src/test/resources/sfbw/test/three.txt create mode 100644 core-java-modules/core-java-nio-2/src/test/resources/sfbw/test/two.docx diff --git a/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/searchfilesbywildcards/SearchFileByWildcard.java b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/searchfilesbywildcards/SearchFileByWildcard.java new file mode 100644 index 0000000000..2deaa60ec6 --- /dev/null +++ b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/searchfilesbywildcards/SearchFileByWildcard.java @@ -0,0 +1,37 @@ +package com.baeldung.searchfilesbywildcards; + +import java.io.IOException; + +import java.nio.file.FileSystem; +import java.nio.file.FileSystems; +import java.nio.file.FileVisitResult; +import java.nio.file.FileVisitor; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.PathMatcher; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; + +import java.util.ArrayList; +import java.util.List; + +public class SearchFileByWildcard { + public static List matchesList = new ArrayList(); + public List searchWithWc(Path rootDir, String pattern) throws IOException { + matchesList.clear(); + FileVisitor matcherVisitor = new SimpleFileVisitor() { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attribs) throws IOException { + FileSystem fs = FileSystems.getDefault(); + PathMatcher matcher = fs.getPathMatcher(pattern); + Path name = file.getFileName(); + if (matcher.matches(name)) { + matchesList.add(name.toString()); + } + return FileVisitResult.CONTINUE; + } + }; + Files.walkFileTree(rootDir, matcherVisitor); + return matchesList; + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/searchfilesbywildcards/SearchFileByWildcardUnitTest.java b/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/searchfilesbywildcards/SearchFileByWildcardUnitTest.java new file mode 100644 index 0000000000..71cee036ec --- /dev/null +++ b/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/searchfilesbywildcards/SearchFileByWildcardUnitTest.java @@ -0,0 +1,30 @@ +package com.baeldung.searchfilesbywildcards; + +import static org.junit.jupiter.api.Assertions.*; + +import java.io.IOException; + +import java.nio.file.Paths; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; + +import org.junit.jupiter.api.Test; + +public class SearchFileByWildcardUnitTest { + @Test + public void whenFourFilenameMatch_thenListOfFour() throws IOException { + SearchFileByWildcard sfbw = new SearchFileByWildcard(); + List actual = sfbw.searchWithWc(Paths.get("src/test/resources/sfbw"), "glob:*.{txt,docx}"); + + assertEquals(new HashSet<>(Arrays.asList("six.txt", "three.txt", "two.docx", "one.txt")), new HashSet<>(actual)); + } + @Test + public void whenOneFilenameMatch_thenListOfOne() throws IOException { + SearchFileByWildcard sfbw = new SearchFileByWildcard(); + List actual = sfbw.searchWithWc(Paths.get("src/test/resources/sfbw"), "glob:????.{csv}"); + + assertEquals(new HashSet<>(Arrays.asList("five.csv")), new HashSet<>(actual)); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-nio-2/src/test/resources/sfbw/test/five.csv b/core-java-modules/core-java-nio-2/src/test/resources/sfbw/test/five.csv new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core-java-modules/core-java-nio-2/src/test/resources/sfbw/test/four.xlsx b/core-java-modules/core-java-nio-2/src/test/resources/sfbw/test/four.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..1091dafe75e41a1e45f2c0b8df3dfe6d7f6f9af6 GIT binary patch literal 6169 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 T8WjM50R8eq+c=!^;@f`#F)1b5 literal 0 HcmV?d00001 diff --git a/core-java-modules/core-java-nio-2/src/test/resources/sfbw/test/one.txt b/core-java-modules/core-java-nio-2/src/test/resources/sfbw/test/one.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core-java-modules/core-java-nio-2/src/test/resources/sfbw/test/test2/six.txt b/core-java-modules/core-java-nio-2/src/test/resources/sfbw/test/test2/six.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core-java-modules/core-java-nio-2/src/test/resources/sfbw/test/three.txt b/core-java-modules/core-java-nio-2/src/test/resources/sfbw/test/three.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core-java-modules/core-java-nio-2/src/test/resources/sfbw/test/two.docx b/core-java-modules/core-java-nio-2/src/test/resources/sfbw/test/two.docx new file mode 100644 index 0000000000..e69de29bb2 From ae6ed6ba95826b0dd217292b5c546a4e89082172 Mon Sep 17 00:00:00 2001 From: apeterlic Date: Thu, 19 May 2022 06:50:58 +0200 Subject: [PATCH 228/278] Get domain name from given URL --- .../domain_name/DomainNameClient.java | 34 +++++++++++++ .../domain_name/DomainNameClientUnitTest.java | 51 +++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 core-java-modules/core-java-networking/src/main/java/com/baeldung/networking/domain_name/DomainNameClient.java create mode 100644 core-java-modules/core-java-networking/src/test/java/com/baeldung/networking/domain_name/DomainNameClientUnitTest.java diff --git a/core-java-modules/core-java-networking/src/main/java/com/baeldung/networking/domain_name/DomainNameClient.java b/core-java-modules/core-java-networking/src/main/java/com/baeldung/networking/domain_name/DomainNameClient.java new file mode 100644 index 0000000000..f38b017f4d --- /dev/null +++ b/core-java-modules/core-java-networking/src/main/java/com/baeldung/networking/domain_name/DomainNameClient.java @@ -0,0 +1,34 @@ +package com.baeldung.networking.domain_name; + +import com.google.common.net.InternetDomainName; + +import java.net.URI; +import java.net.URISyntaxException; + +public class DomainNameClient { + + public String getHost(String url) throws URISyntaxException { + URI uri = new URI(url); + return uri.getHost(); + } + + public String getTopPrivateDomain(String url) { + InternetDomainName internetDomainName = InternetDomainName.from(url) + .topPrivateDomain(); + return internetDomainName.toString(); + } + + public String getName(String url) { + InternetDomainName internetDomainName = InternetDomainName.from(url) + .topPrivateDomain(); + String publicSuffix = internetDomainName.publicSuffix() + .toString(); + String domainName = internetDomainName.toString(); + return domainName.substring(0, domainName.lastIndexOf("." + publicSuffix)); + } + + public String getDomainName(String url) { + String regex = "http(s)?://|www\\.|/.*"; + return url.replaceAll(regex, ""); + } +} diff --git a/core-java-modules/core-java-networking/src/test/java/com/baeldung/networking/domain_name/DomainNameClientUnitTest.java b/core-java-modules/core-java-networking/src/test/java/com/baeldung/networking/domain_name/DomainNameClientUnitTest.java new file mode 100644 index 0000000000..c6f868621d --- /dev/null +++ b/core-java-modules/core-java-networking/src/test/java/com/baeldung/networking/domain_name/DomainNameClientUnitTest.java @@ -0,0 +1,51 @@ +package com.baeldung.networking.domain_name; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class DomainNameClientUnitTest { + + DomainNameClient domainNameClient = new DomainNameClient(); + + @Test + void givenUrl_whenGetHost_thenReturnSubdomainAndDomainName() { + Assertions.assertAll(() -> { + assertEquals("www.baeldung.com", domainNameClient.getHost("https://www.baeldung.com/domain")); + assertEquals("www.google.co.uk", domainNameClient.getHost("https://www.google.co.uk/domain")); + assertEquals("jira.baeldung.com", domainNameClient.getHost("https://jira.baeldung.com/secure")); + }); + } + + @Test + void givenUrl_whenGetTopPrivateDomain_thenReturnDomainName() { + assertEquals("baeldung.com", domainNameClient.getTopPrivateDomain("www.baeldung.com")); + } + + @Test + void givenUrlWithPublicSuffix_whenGetTopPrivateDomain_thenReturnDomainName() { + assertEquals("google.co.uk", domainNameClient.getTopPrivateDomain("www.google.co.uk")); + assertEquals("baeldung.blogspot.com", domainNameClient.getTopPrivateDomain("www.baeldung.blogspot.com")); + } + + @Test + void givenUrlWithPublicSuffix_whenGetName_thenReturnSecondLevelDomain() { + assertEquals("baeldung", domainNameClient.getName("jira.baeldung.com")); + } + + @Test + void givenUrlWithPublicSuffix_whenGetName_thenReturnThirdLevelDomain() { + assertEquals("baeldung", domainNameClient.getName("www.baeldung.co.uk")); + assertEquals("google", domainNameClient.getName("www.google.co.uk")); + } + + @Test + void givenUrl_whenGetDomainNameRegex_thenReturnDomainName() { + assertEquals("google.com", domainNameClient.getDomainName("www.google.com")); + assertEquals("google.co.uk", domainNameClient.getDomainName("www.google.co.uk")); + assertEquals("jira.baeldung.com", domainNameClient.getDomainName("jira.baeldung.com")); + assertEquals("baeldung.com", domainNameClient.getDomainName("www.baeldung.com/test")); + } + +} From c3d957205a9a3a6f584fc05245966cf3e4b23250 Mon Sep 17 00:00:00 2001 From: apeterlic Date: Thu, 19 May 2022 07:03:06 +0200 Subject: [PATCH 229/278] Move code to different module --- core-java-modules/core-java-networking-3/pom.xml | 7 +++++++ .../java/com/baeldung}/domain_name/DomainNameClient.java | 2 +- .../baeldung}/domain_name/DomainNameClientUnitTest.java | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) rename core-java-modules/{core-java-networking/src/main/java/com/baeldung/networking => core-java-networking-3/src/main/java/com/baeldung}/domain_name/DomainNameClient.java (95%) rename core-java-modules/{core-java-networking/src/test/java/com/baeldung/networking => core-java-networking-3/src/test/java/com/baeldung}/domain_name/DomainNameClientUnitTest.java (97%) diff --git a/core-java-modules/core-java-networking-3/pom.xml b/core-java-modules/core-java-networking-3/pom.xml index 297d665544..63385c2334 100644 --- a/core-java-modules/core-java-networking-3/pom.xml +++ b/core-java-modules/core-java-networking-3/pom.xml @@ -52,6 +52,12 @@ java-ipv6 ${googlecode.ipv6.version} + + + com.google.guava + guava + ${guava.version} + @@ -84,6 +90,7 @@ 1.32 0.17 1.6.2 + 31.0-jre \ No newline at end of file diff --git a/core-java-modules/core-java-networking/src/main/java/com/baeldung/networking/domain_name/DomainNameClient.java b/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/domain_name/DomainNameClient.java similarity index 95% rename from core-java-modules/core-java-networking/src/main/java/com/baeldung/networking/domain_name/DomainNameClient.java rename to core-java-modules/core-java-networking-3/src/main/java/com/baeldung/domain_name/DomainNameClient.java index f38b017f4d..1b2cb636fe 100644 --- a/core-java-modules/core-java-networking/src/main/java/com/baeldung/networking/domain_name/DomainNameClient.java +++ b/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/domain_name/DomainNameClient.java @@ -1,4 +1,4 @@ -package com.baeldung.networking.domain_name; +package com.baeldung.domain_name; import com.google.common.net.InternetDomainName; diff --git a/core-java-modules/core-java-networking/src/test/java/com/baeldung/networking/domain_name/DomainNameClientUnitTest.java b/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/domain_name/DomainNameClientUnitTest.java similarity index 97% rename from core-java-modules/core-java-networking/src/test/java/com/baeldung/networking/domain_name/DomainNameClientUnitTest.java rename to core-java-modules/core-java-networking-3/src/test/java/com/baeldung/domain_name/DomainNameClientUnitTest.java index c6f868621d..d69e7c0333 100644 --- a/core-java-modules/core-java-networking/src/test/java/com/baeldung/networking/domain_name/DomainNameClientUnitTest.java +++ b/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/domain_name/DomainNameClientUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.networking.domain_name; +package com.baeldung.domain_name; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; From 762d5f0f56f66972f94d1dc1c19a29842338462a Mon Sep 17 00:00:00 2001 From: Graham Cox Date: Thu, 19 May 2022 10:14:05 +0100 Subject: [PATCH 230/278] Reformatted code --- lightrun/README.md | 9 +- lightrun/api-service/pom.xml | 80 ++++++------ .../apiservice/ApiServiceApplication.java | 6 +- .../apiservice/RequestIdGenerator.java | 14 +-- .../apiservice/RestTemplateConfig.java | 12 +- .../adapters/http/TaskResponse.java | 7 +- .../adapters/http/TasksController.java | 22 ++-- .../apiservice/adapters/tasks/Task.java | 7 +- .../adapters/tasks/TaskRepository.java | 6 +- .../adapters/users/UserRepository.java | 7 +- lightrun/pom.xml | 8 +- lightrun/tasks-service/pom.xml | 114 +++++++++--------- .../tasksservice/TasksServiceApplication.java | 6 +- .../adapters/http/TaskResponse.java | 7 +- .../adapters/http/TasksController.java | 20 ++- .../adapters/jms/JmsConsumer.java | 2 +- .../adapters/repository/TaskRecord.java | 6 +- .../service/DeletedUserService.java | 28 ++--- .../tasksservice/service/TasksService.java | 25 ++-- .../src/main/resources/application.properties | 4 - lightrun/users-service/README.md | 9 +- lightrun/users-service/pom.xml | 114 +++++++++--------- .../usersservice/UsersServiceApplication.java | 6 +- .../adapters/http/UserResponse.java | 3 +- .../adapters/http/UsersController.java | 13 +- .../usersservice/service/UsersService.java | 23 ++-- .../src/main/resources/application.properties | 3 - 27 files changed, 278 insertions(+), 283 deletions(-) diff --git a/lightrun/README.md b/lightrun/README.md index 732d9b03cd..18d4ccc12f 100644 --- a/lightrun/README.md +++ b/lightrun/README.md @@ -3,16 +3,21 @@ This application exists as an example for the Lightrun series of articles. ## Building + This application requires [Apache Maven](https://maven.apache.org/) and [Java 17+](https://www.oracle.com/java/technologies/downloads/). Building the code is done by executing: + ``` $ mvn install ``` + from the top level. ## Running + The application consists of three services: + * Tasks * Users * API @@ -23,7 +28,9 @@ The Tasks and Users services exist as microservices for managing one facet of da This does mean that the startup order is important. The JMS queue exists within the Tasks service and is connected to from the Users service. As such, the Tasks service must be started before the others. -Each service can be started either by executing `mvn spring-boot:run` from within the appropriate directory. Alternatively, as Spring Boot applications, the build will produce an executable JAR file within the `target` directory that can be executed as, for example: +Each service can be started either by executing `mvn spring-boot:run` from within the appropriate directory. Alternatively, as Spring Boot applications, the build will produce an executable JAR file within the `target` directory that can be executed as, for +example: + ``` $ java -jar ./target/tasks-service-0.0.1-SNAPSHOT.jar ``` diff --git a/lightrun/api-service/pom.xml b/lightrun/api-service/pom.xml index c72d66748c..3423c490f1 100644 --- a/lightrun/api-service/pom.xml +++ b/lightrun/api-service/pom.xml @@ -1,45 +1,45 @@ - - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 2.6.7 - - - com.baeldung - api-service - 0.0.1-SNAPSHOT - api-service - Aggregator Service for LightRun Article - - 17 - - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-starter-web - + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.6.7 + + + com.baeldung + api-service + 0.0.1-SNAPSHOT + api-service + Aggregator Service for LightRun Article + + 17 + + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-web + - - org.springframework.boot - spring-boot-starter-test - test - - + + org.springframework.boot + spring-boot-starter-test + test + + - - - - org.springframework.boot - spring-boot-maven-plugin - - - + + + + org.springframework.boot + spring-boot-maven-plugin + + + diff --git a/lightrun/api-service/src/main/java/com/baeldung/apiservice/ApiServiceApplication.java b/lightrun/api-service/src/main/java/com/baeldung/apiservice/ApiServiceApplication.java index 4d7e2f3ff7..a9b29cbd4b 100644 --- a/lightrun/api-service/src/main/java/com/baeldung/apiservice/ApiServiceApplication.java +++ b/lightrun/api-service/src/main/java/com/baeldung/apiservice/ApiServiceApplication.java @@ -6,8 +6,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class ApiServiceApplication { - public static void main(String[] args) { - SpringApplication.run(ApiServiceApplication.class, args); - } + public static void main(String[] args) { + SpringApplication.run(ApiServiceApplication.class, args); + } } diff --git a/lightrun/api-service/src/main/java/com/baeldung/apiservice/RequestIdGenerator.java b/lightrun/api-service/src/main/java/com/baeldung/apiservice/RequestIdGenerator.java index 3ad137ca4d..f15738c1e6 100644 --- a/lightrun/api-service/src/main/java/com/baeldung/apiservice/RequestIdGenerator.java +++ b/lightrun/api-service/src/main/java/com/baeldung/apiservice/RequestIdGenerator.java @@ -1,20 +1,20 @@ package com.baeldung.apiservice; -import org.slf4j.MDC; -import org.springframework.stereotype.Component; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.servlet.HandlerInterceptor; -import org.springframework.web.servlet.ModelAndView; +import java.util.UUID; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.util.UUID; + +import org.slf4j.MDC; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; @Component public class RequestIdGenerator implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - String requestId = UUID.randomUUID().toString(); + String requestId = UUID.randomUUID() + .toString(); MDC.put(RequestIdGenerator.class.getCanonicalName(), requestId); response.addHeader("X-Request-Id", requestId); diff --git a/lightrun/api-service/src/main/java/com/baeldung/apiservice/RestTemplateConfig.java b/lightrun/api-service/src/main/java/com/baeldung/apiservice/RestTemplateConfig.java index 278e1520c4..1582ba5953 100644 --- a/lightrun/api-service/src/main/java/com/baeldung/apiservice/RestTemplateConfig.java +++ b/lightrun/api-service/src/main/java/com/baeldung/apiservice/RestTemplateConfig.java @@ -9,12 +9,12 @@ import org.springframework.web.client.RestTemplate; public class RestTemplateConfig { @Bean public RestTemplate restTemplate(RestTemplateBuilder builder) { - return builder - .additionalInterceptors((request, body, execution) -> { - request.getHeaders().add("X-Request-Id", RequestIdGenerator.getRequestId()); + return builder.additionalInterceptors((request, body, execution) -> { + request.getHeaders() + .add("X-Request-Id", RequestIdGenerator.getRequestId()); - return execution.execute(request, body); - }) - .build(); + return execution.execute(request, body); + }) + .build(); } } diff --git a/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/http/TaskResponse.java b/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/http/TaskResponse.java index cec3105c04..875390fdcd 100644 --- a/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/http/TaskResponse.java +++ b/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/http/TaskResponse.java @@ -2,10 +2,5 @@ package com.baeldung.apiservice.adapters.http; import java.time.Instant; -public record TaskResponse(String id, - String title, - Instant created, - UserResponse createdBy, - UserResponse assignedTo, - String status) { +public record TaskResponse(String id, String title, Instant created, UserResponse createdBy, UserResponse assignedTo, String status) { } diff --git a/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/http/TasksController.java b/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/http/TasksController.java index e11eaac35f..55b449f249 100644 --- a/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/http/TasksController.java +++ b/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/http/TasksController.java @@ -1,11 +1,17 @@ package com.baeldung.apiservice.adapters.http; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; + import com.baeldung.apiservice.adapters.tasks.Task; import com.baeldung.apiservice.adapters.tasks.TaskRepository; import com.baeldung.apiservice.adapters.users.UserRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.*; @RequestMapping("/") @RestController @@ -27,15 +33,10 @@ public class TasksController { } private TaskResponse buildResponse(Task task) { - return new TaskResponse(task.id(), - task.title(), - task.created(), - getUser(task.createdBy()), - getUser(task.assignedTo()), - task.status()); + return new TaskResponse(task.id(), task.title(), task.created(), getUser(task.createdBy()), getUser(task.assignedTo()), task.status()); } - private UserResponse getUser(String userId) { + private UserResponse getUser(String userId) { if (userId == null) { return null; } @@ -47,6 +48,7 @@ public class TasksController { return new UserResponse(user.id(), user.name()); } + @ExceptionHandler(UnknownTaskException.class) @ResponseStatus(HttpStatus.NOT_FOUND) public void handleUnknownTask() { diff --git a/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/tasks/Task.java b/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/tasks/Task.java index a83192f188..188d3e951c 100644 --- a/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/tasks/Task.java +++ b/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/tasks/Task.java @@ -2,10 +2,5 @@ package com.baeldung.apiservice.adapters.tasks; import java.time.Instant; -public record Task(String id, - String title, - Instant created, - String createdBy, - String assignedTo, - String status) { +public record Task(String id, String title, Instant created, String createdBy, String assignedTo, String status) { } diff --git a/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/tasks/TaskRepository.java b/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/tasks/TaskRepository.java index 49ffa51818..9260a125af 100644 --- a/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/tasks/TaskRepository.java +++ b/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/tasks/TaskRepository.java @@ -17,9 +17,9 @@ public class TaskRepository { public Task getTaskById(String id) { var uri = UriComponentsBuilder.fromUriString(tasksService) - .path(id) - .build() - .toUri(); + .path(id) + .build() + .toUri(); try { return restTemplate.getForObject(uri, Task.class); diff --git a/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/users/UserRepository.java b/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/users/UserRepository.java index 5a0e4eb64f..d5625f6efc 100644 --- a/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/users/UserRepository.java +++ b/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/users/UserRepository.java @@ -1,6 +1,5 @@ package com.baeldung.apiservice.adapters.users; -import com.baeldung.apiservice.adapters.users.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Repository; @@ -18,9 +17,9 @@ public class UserRepository { public User getUserById(String id) { var uri = UriComponentsBuilder.fromUriString(usersService) - .path(id) - .build() - .toUri(); + .path(id) + .build() + .toUri(); try { return restTemplate.getForObject(uri, User.class); diff --git a/lightrun/pom.xml b/lightrun/pom.xml index cfe275848f..4d046347ab 100644 --- a/lightrun/pom.xml +++ b/lightrun/pom.xml @@ -1,13 +1,13 @@ - + 4.0.0 com.baelduung lightrun-demo 0.0.1-SNAPSHOT pom - lightrun - Services for LightRun Article + lightrun + Services for LightRun Article tasks-service diff --git a/lightrun/tasks-service/pom.xml b/lightrun/tasks-service/pom.xml index e56a3a9edf..441b4d3713 100644 --- a/lightrun/tasks-service/pom.xml +++ b/lightrun/tasks-service/pom.xml @@ -1,67 +1,67 @@ - - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 2.6.7 - - - com.baeldung - tasks-service - 0.0.1-SNAPSHOT - tasks-service - Tasks Service for LightRun Article - - 17 - - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-starter-artemis - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-web - - - org.flywaydb - flyway-core - + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.6.7 + + + com.baeldung + tasks-service + 0.0.1-SNAPSHOT + tasks-service + Tasks Service for LightRun Article + + 17 + + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-artemis + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-web + + + org.flywaydb + flyway-core + - - com.h2database - h2 - runtime - + + com.h2database + h2 + runtime + org.apache.activemq artemis-jms-server - - org.springframework.boot - spring-boot-starter-test - test - - + + org.springframework.boot + spring-boot-starter-test + test + + - - - - org.springframework.boot - spring-boot-maven-plugin - - - + + + + org.springframework.boot + spring-boot-maven-plugin + + + diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/TasksServiceApplication.java b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/TasksServiceApplication.java index f8e0d64c0c..dfd9859674 100644 --- a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/TasksServiceApplication.java +++ b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/TasksServiceApplication.java @@ -6,8 +6,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class TasksServiceApplication { - public static void main(String[] args) { - SpringApplication.run(TasksServiceApplication.class, args); - } + public static void main(String[] args) { + SpringApplication.run(TasksServiceApplication.class, args); + } } diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/TaskResponse.java b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/TaskResponse.java index ca13b2ee3d..4e01a649b1 100644 --- a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/TaskResponse.java +++ b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/TaskResponse.java @@ -13,10 +13,5 @@ package com.baeldung.tasksservice.adapters.http; import java.time.Instant; -public record TaskResponse(String id, - String title, - Instant created, - String createdBy, - String assignedTo, - String status) { +public record TaskResponse(String id, String title, Instant created, String createdBy, String assignedTo, String status) { } diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/TasksController.java b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/TasksController.java index 6502e43883..a4145a2243 100644 --- a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/TasksController.java +++ b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/TasksController.java @@ -15,9 +15,6 @@ import java.util.List; import java.util.Optional; import java.util.stream.Collectors; -import com.baeldung.tasksservice.adapters.repository.TaskRecord; -import com.baeldung.tasksservice.service.TasksService; -import com.baeldung.tasksservice.service.UnknownTaskException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.DeleteMapping; @@ -32,6 +29,10 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; +import com.baeldung.tasksservice.adapters.repository.TaskRecord; +import com.baeldung.tasksservice.service.TasksService; +import com.baeldung.tasksservice.service.UnknownTaskException; + @RestController @RequestMapping("/") class TasksController { @@ -46,13 +47,12 @@ class TasksController { } @GetMapping - public List searchTasks(@RequestParam("status") Optional status, - @RequestParam("createdBy") Optional createdBy) { + public List searchTasks(@RequestParam("status") Optional status, @RequestParam("createdBy") Optional createdBy) { var tasks = tasksService.search(status, createdBy); return tasks.stream() - .map(this::buildResponse) - .collect(Collectors.toList()); + .map(this::buildResponse) + .collect(Collectors.toList()); } @GetMapping("/{id}") @@ -67,16 +67,14 @@ class TasksController { } @PatchMapping("/{id}") - public TaskResponse patchTask(@PathVariable("id") String id, - @RequestBody PatchTaskRequest body) { + public TaskResponse patchTask(@PathVariable("id") String id, @RequestBody PatchTaskRequest body) { var task = tasksService.updateTask(id, body.status(), body.assignedTo()); return buildResponse(task); } private TaskResponse buildResponse(final TaskRecord task) { - return new TaskResponse(task.getId(), task.getTitle(), task.getCreated(), task.getCreatedBy(), - task.getAssignedTo(), task.getStatus()); + return new TaskResponse(task.getId(), task.getTitle(), task.getCreated(), task.getCreatedBy(), task.getAssignedTo(), task.getStatus()); } @ExceptionHandler(UnknownTaskException.class) diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/jms/JmsConsumer.java b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/jms/JmsConsumer.java index d5a705f56f..c380a16acc 100644 --- a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/jms/JmsConsumer.java +++ b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/jms/JmsConsumer.java @@ -1,8 +1,8 @@ package com.baeldung.tasksservice.adapters.jms; -import org.springframework.stereotype.Service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jms.annotation.JmsListener; +import org.springframework.stereotype.Service; import com.baeldung.tasksservice.service.DeletedUserService; diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/repository/TaskRecord.java b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/repository/TaskRecord.java index 6646258c22..dee3017a59 100644 --- a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/repository/TaskRecord.java +++ b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/repository/TaskRecord.java @@ -11,11 +11,12 @@ package com.baeldung.tasksservice.adapters.repository; +import java.time.Instant; + import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; -import java.time.Instant; @Entity @Table(name = "tasks") @@ -32,8 +33,7 @@ public class TaskRecord { private String assignedTo; private String status; - public TaskRecord(final String id, final String title, final Instant created, final String createdBy, - final String assignedTo, final String status) { + public TaskRecord(final String id, final String title, final Instant created, final String createdBy, final String assignedTo, final String status) { this.id = id; this.title = title; this.created = created; diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/service/DeletedUserService.java b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/service/DeletedUserService.java index 50d35d3f93..fa0c3572fb 100644 --- a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/service/DeletedUserService.java +++ b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/service/DeletedUserService.java @@ -2,26 +2,26 @@ package com.baeldung.tasksservice.service; import javax.transaction.Transactional; -import com.baeldung.tasksservice.adapters.repository.TaskRecord; -import com.baeldung.tasksservice.adapters.repository.TasksRepository; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import com.baeldung.tasksservice.adapters.repository.TaskRecord; +import com.baeldung.tasksservice.adapters.repository.TasksRepository; + @Service public class DeletedUserService { - @Autowired - private TasksRepository tasksRepository; + @Autowired + private TasksRepository tasksRepository; - @Transactional - public void handleDeletedUser(String user) { - var ownedByUser = tasksRepository.findByCreatedBy(user); - tasksRepository.deleteAll(ownedByUser); + @Transactional + public void handleDeletedUser(String user) { + var ownedByUser = tasksRepository.findByCreatedBy(user); + tasksRepository.deleteAll(ownedByUser); - var assignedToUser = tasksRepository.findByAssignedTo(user); - for (TaskRecord record : assignedToUser) { - record.setAssignedTo(null); - record.setStatus("PENDING"); + var assignedToUser = tasksRepository.findByAssignedTo(user); + for (TaskRecord record : assignedToUser) { + record.setAssignedTo(null); + record.setStatus("PENDING"); + } } - } } diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/service/TasksService.java b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/service/TasksService.java index e9ba1a9f70..3539dbbc3c 100644 --- a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/service/TasksService.java +++ b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/service/TasksService.java @@ -11,29 +11,33 @@ package com.baeldung.tasksservice.service; -import javax.transaction.Transactional; import java.time.Instant; import java.util.List; import java.util.Optional; import java.util.UUID; -import com.baeldung.tasksservice.adapters.repository.TaskRecord; -import com.baeldung.tasksservice.adapters.repository.TasksRepository; +import javax.transaction.Transactional; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import com.baeldung.tasksservice.adapters.repository.TaskRecord; +import com.baeldung.tasksservice.adapters.repository.TasksRepository; + @Service public class TasksService { @Autowired private TasksRepository tasksRepository; public TaskRecord getTaskById(String id) { - return tasksRepository.findById(id).orElseThrow(() -> new UnknownTaskException(id)); + return tasksRepository.findById(id) + .orElseThrow(() -> new UnknownTaskException(id)); } @Transactional public void deleteTaskById(String id) { - var task = tasksRepository.findById(id).orElseThrow(() -> new UnknownTaskException(id)); + var task = tasksRepository.findById(id) + .orElseThrow(() -> new UnknownTaskException(id)); tasksRepository.delete(task); } @@ -51,7 +55,8 @@ public class TasksService { @Transactional public TaskRecord updateTask(String id, Optional newStatus, Optional newAssignedTo) { - var task = tasksRepository.findById(id).orElseThrow(() -> new UnknownTaskException(id)); + var task = tasksRepository.findById(id) + .orElseThrow(() -> new UnknownTaskException(id)); newStatus.ifPresent(task::setStatus); newAssignedTo.ifPresent(task::setAssignedTo); @@ -60,12 +65,8 @@ public class TasksService { } public TaskRecord createTask(String title, String createdBy) { - var task = new TaskRecord(UUID.randomUUID().toString(), - title, - Instant.now(), - createdBy, - null, - "PENDING"); + var task = new TaskRecord(UUID.randomUUID() + .toString(), title, Instant.now(), createdBy, null, "PENDING"); tasksRepository.save(task); return task; } diff --git a/lightrun/tasks-service/src/main/resources/application.properties b/lightrun/tasks-service/src/main/resources/application.properties index 83bbf1a1b8..88326ed10e 100644 --- a/lightrun/tasks-service/src/main/resources/application.properties +++ b/lightrun/tasks-service/src/main/resources/application.properties @@ -1,13 +1,9 @@ server.port=8082 - spring.artemis.mode=EMBEDDED spring.artemis.host=localhost spring.artemis.port=61616 - spring.artemis.embedded.enabled=true - spring.jms.template.default-destination=my-queue-1 - logging.level.org.apache.activemq.audit.base=WARN logging.level.org.apache.activemq.audit.message=WARN diff --git a/lightrun/users-service/README.md b/lightrun/users-service/README.md index 7c713e6638..e7faae858f 100644 --- a/lightrun/users-service/README.md +++ b/lightrun/users-service/README.md @@ -3,16 +3,21 @@ This application exists as an example for the Lightrun series of articles. ## Building + This application requires [Apache Maven](https://maven.apache.org/) and [Java 17+](https://www.oracle.com/java/technologies/downloads/). It does use the Maven Wrapper, so it can be built with only Java available on the path. As such, building the code is done by executing: + ``` $ ./mvnw install ``` + from the top level. ## Running + The application consists of three services: + * Tasks * Users * API @@ -23,7 +28,9 @@ The Tasks and Users services exist as microservices for managing one facet of da This does mean that the startup order is important. The JMS queue exists within the Tasks service and is connected to from the Users service. As such, the Tasks service must be started before the others. -Each service can be started either by executing `mvn spring-boot:run` from within the appropriate directory. Alternatively, as Spring Boot applications, the build will produce an executable JAR file within the `target` directory that can be executed as, for example: +Each service can be started either by executing `mvn spring-boot:run` from within the appropriate directory. Alternatively, as Spring Boot applications, the build will produce an executable JAR file within the `target` directory that can be executed as, for +example: + ``` $ java -jar ./target/tasks-service-0.0.1-SNAPSHOT.jar ``` diff --git a/lightrun/users-service/pom.xml b/lightrun/users-service/pom.xml index a961e4093b..63596ed67b 100644 --- a/lightrun/users-service/pom.xml +++ b/lightrun/users-service/pom.xml @@ -1,63 +1,63 @@ - - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 2.6.7 - - - com.baeldung - users-service - 0.0.1-SNAPSHOT - users-service - Users Service for LightRun Article - - 17 - - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-starter-artemis - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-web - - - org.flywaydb - flyway-core - + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.6.7 + + + com.baeldung + users-service + 0.0.1-SNAPSHOT + users-service + Users Service for LightRun Article + + 17 + + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-artemis + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-web + + + org.flywaydb + flyway-core + - - com.h2database - h2 - runtime - + + com.h2database + h2 + runtime + - - org.springframework.boot - spring-boot-starter-test - test - - + + org.springframework.boot + spring-boot-starter-test + test + + - - - - org.springframework.boot - spring-boot-maven-plugin - - - + + + + org.springframework.boot + spring-boot-maven-plugin + + + diff --git a/lightrun/users-service/src/main/java/com/baeldung/usersservice/UsersServiceApplication.java b/lightrun/users-service/src/main/java/com/baeldung/usersservice/UsersServiceApplication.java index 487e8de45b..3910960282 100644 --- a/lightrun/users-service/src/main/java/com/baeldung/usersservice/UsersServiceApplication.java +++ b/lightrun/users-service/src/main/java/com/baeldung/usersservice/UsersServiceApplication.java @@ -6,8 +6,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class UsersServiceApplication { - public static void main(String[] args) { - SpringApplication.run(UsersServiceApplication.class, args); - } + public static void main(String[] args) { + SpringApplication.run(UsersServiceApplication.class, args); + } } diff --git a/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/UserResponse.java b/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/UserResponse.java index b9a20c415b..e74ede65d5 100644 --- a/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/UserResponse.java +++ b/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/UserResponse.java @@ -11,6 +11,5 @@ package com.baeldung.usersservice.adapters.http; -public record UserResponse(String id, - String name) { +public record UserResponse(String id, String name) { } diff --git a/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/UsersController.java b/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/UsersController.java index a5138e31d6..795d240fe9 100644 --- a/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/UsersController.java +++ b/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/UsersController.java @@ -11,9 +11,6 @@ package com.baeldung.usersservice.adapters.http; -import com.baeldung.usersservice.adapters.repository.UserRecord; -import com.baeldung.usersservice.service.UsersService; -import com.baeldung.usersservice.service.UnknownUserException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.DeleteMapping; @@ -27,6 +24,10 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; +import com.baeldung.usersservice.adapters.repository.UserRecord; +import com.baeldung.usersservice.service.UnknownUserException; +import com.baeldung.usersservice.service.UsersService; + @RestController @RequestMapping("/") class UsersController { @@ -50,14 +51,14 @@ class UsersController { var user = usersService.createUser(body.name()); return buildResponse(user); } - + @PatchMapping("/{id}") - public UserResponse patchUser(@PathVariable("id") String id, - @RequestBody PatchUserRequest body) { + public UserResponse patchUser(@PathVariable("id") String id, @RequestBody PatchUserRequest body) { var user = usersService.updateUser(id, body.name()); return buildResponse(user); } + private UserResponse buildResponse(final UserRecord user) { return new UserResponse(user.getId(), user.getName()); } diff --git a/lightrun/users-service/src/main/java/com/baeldung/usersservice/service/UsersService.java b/lightrun/users-service/src/main/java/com/baeldung/usersservice/service/UsersService.java index 46954b1ee0..5115a5a77b 100644 --- a/lightrun/users-service/src/main/java/com/baeldung/usersservice/service/UsersService.java +++ b/lightrun/users-service/src/main/java/com/baeldung/usersservice/service/UsersService.java @@ -11,18 +11,17 @@ package com.baeldung.usersservice.service; -import javax.transaction.Transactional; - -import java.time.Instant; import java.util.Optional; import java.util.UUID; +import javax.transaction.Transactional; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + import com.baeldung.usersservice.adapters.jms.JmsSender; import com.baeldung.usersservice.adapters.repository.UserRecord; import com.baeldung.usersservice.adapters.repository.UsersRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jms.core.JmsTemplate; -import org.springframework.stereotype.Service; @Service public class UsersService { @@ -33,12 +32,14 @@ public class UsersService { private JmsSender jmsSender; public UserRecord getUserById(String id) { - return usersRepository.findById(id).orElseThrow(() -> new UnknownUserException(id)); + return usersRepository.findById(id) + .orElseThrow(() -> new UnknownUserException(id)); } @Transactional public void deleteUserById(String id) { - var user = usersRepository.findById(id).orElseThrow(() -> new UnknownUserException(id)); + var user = usersRepository.findById(id) + .orElseThrow(() -> new UnknownUserException(id)); usersRepository.delete(user); jmsSender.sendDeleteUserMessage(id); @@ -46,7 +47,8 @@ public class UsersService { @Transactional public UserRecord updateUser(String id, Optional newName) { - var user = usersRepository.findById(id).orElseThrow(() -> new UnknownUserException(id)); + var user = usersRepository.findById(id) + .orElseThrow(() -> new UnknownUserException(id)); newName.ifPresent(user::setName); @@ -54,7 +56,8 @@ public class UsersService { } public UserRecord createUser(String name) { - var user = new UserRecord(UUID.randomUUID().toString(), name); + var user = new UserRecord(UUID.randomUUID() + .toString(), name); usersRepository.save(user); return user; } diff --git a/lightrun/users-service/src/main/resources/application.properties b/lightrun/users-service/src/main/resources/application.properties index 8cc8f67d92..616131c42e 100644 --- a/lightrun/users-service/src/main/resources/application.properties +++ b/lightrun/users-service/src/main/resources/application.properties @@ -1,10 +1,7 @@ server.port=8081 - spring.artemis.host=localhost spring.artemis.port=61616 - spring.jms.template.default-destination=my-queue-1 - logging.level.org.apache.activemq.audit.base=WARN logging.level.org.apache.activemq.audit.message=WARN From 9ada6d69ae5d425bd3352d8bf057df81b1063f88 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 19 May 2022 20:46:52 +0530 Subject: [PATCH 231/278] JAVA-11849 Disabled NPM and Frontend Tasks from Integration builds, added jhipster-5 to integration-heavy profile --- jhipster-5/bookstore-monolith/pom.xml | 60 +++++++++++++++++++++++++++ pom.xml | 9 ++-- 2 files changed, 65 insertions(+), 4 deletions(-) diff --git a/jhipster-5/bookstore-monolith/pom.xml b/jhipster-5/bookstore-monolith/pom.xml index 411de0e712..ccf7a3c85e 100644 --- a/jhipster-5/bookstore-monolith/pom.xml +++ b/jhipster-5/bookstore-monolith/pom.xml @@ -1090,6 +1090,66 @@ + + integration-lite-first + + + + com.github.eirslett + frontend-maven-plugin + + + + install node and npm + none + + + npm install + none + + + webpack build dev + none + + + webpack build test + none + + + + + + + + integration-lite-second + + + + com.github.eirslett + frontend-maven-plugin + + + + install node and npm + none + + + npm install + none + + + webpack build dev + none + + + webpack build test + none + + + + + + diff --git a/pom.xml b/pom.xml index 106bb7516a..37cc9a3ea1 100644 --- a/pom.xml +++ b/pom.xml @@ -366,7 +366,7 @@ atomix aws-modules - + axon azure @@ -836,7 +836,7 @@ atomix aws-modules - + axon azure @@ -895,7 +895,7 @@ helidon apache-httpclient httpclient-simple - hystrix + hystrix jackson-modules jackson-simple @@ -1209,6 +1209,7 @@ jenkins/plugins jhipster + jhipster-5 jws libraries @@ -1326,7 +1327,7 @@ quarkus-vs-springboot quarkus-jandex spring-boot-modules/spring-boot-cassandre - spring-boot-modules/spring-boot-camel + spring-boot-modules/spring-boot-camel testing-modules/testing-assertions persistence-modules/fauna From 2e8c7dc728cff6fdac37762049f2a65b884260e5 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Fri, 20 May 2022 10:32:38 +0530 Subject: [PATCH 232/278] JAVA-12015: Align module names, folder names and artifact id --- docker/docker-push-to-private-repo/pom.xml | 24 +++++++++++++--------- lightrun/pom.xml | 2 +- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/docker/docker-push-to-private-repo/pom.xml b/docker/docker-push-to-private-repo/pom.xml index 59a909ff07..19be098794 100644 --- a/docker/docker-push-to-private-repo/pom.xml +++ b/docker/docker-push-to-private-repo/pom.xml @@ -1,19 +1,19 @@ - + 4.0.0 + docker-push-to-private-repo + 0.0.1-SNAPSHOT + docker-push-to-private-repo + Example application to showcase how to push a docker image to a private repository + com.baeldung.docker docker 0.0.1 - push-to-private-repo - 0.0.1-SNAPSHOT - push-to-private-repo - Example application to showcase how to push a docker image to a private repository - - 11 - + org.springframework.boot @@ -40,4 +40,8 @@ - + + 11 + + + \ No newline at end of file diff --git a/lightrun/pom.xml b/lightrun/pom.xml index cfe275848f..ddb720b023 100644 --- a/lightrun/pom.xml +++ b/lightrun/pom.xml @@ -3,7 +3,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baelduung - lightrun-demo + lightrun 0.0.1-SNAPSHOT pom lightrun From 028347b1961a6fc4328462879a637c1026d9b2ce Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Fri, 20 May 2022 20:25:37 +0530 Subject: [PATCH 233/278] JAVA-12097: moved algorithms-genetic inside algorithms-module --- .../algorithms-genetic}/.gitignore | 0 .../algorithms-genetic}/README.md | 0 .../algorithms-genetic}/pom.xml | 2 +- .../src/main/java/com/baeldung/algorithms/RunAlgorithm.java | 0 .../main/java/com/baeldung/algorithms/ga/annealing/City.java | 0 .../baeldung/algorithms/ga/annealing/SimulatedAnnealing.java | 0 .../main/java/com/baeldung/algorithms/ga/annealing/Travel.java | 0 .../main/java/com/baeldung/algorithms/ga/ant_colony/Ant.java | 0 .../algorithms/ga/ant_colony/AntColonyOptimization.java | 0 .../main/java/com/baeldung/algorithms/ga/binary/Individual.java | 0 .../main/java/com/baeldung/algorithms/ga/binary/Population.java | 0 .../baeldung/algorithms/ga/binary/SimpleGeneticAlgorithm.java | 0 .../main/java/com/baeldung/algorithms/ga/jenetics/Knapsack.java | 0 .../java/com/baeldung/algorithms/ga/jenetics/KnapsackFF.java | 0 .../java/com/baeldung/algorithms/ga/jenetics/KnapsackItem.java | 0 .../baeldung/algorithms/ga/jenetics/SimpleGeneticAlgorithm.java | 0 .../com/baeldung/algorithms/ga/jenetics/SpringsteenProblem.java | 0 .../com/baeldung/algorithms/ga/jenetics/SpringsteenRecord.java | 0 .../java/com/baeldung/algorithms/ga/jenetics/SubsetSum.java | 0 .../com/baeldung/algorithms/ga/jenetics/TravelingSalesman.java | 0 .../algorithms-genetic}/src/main/resources/logback.xml | 0 .../algorithms/AntColonyOptimizationLongRunningUnitTest.java | 0 .../algorithms/BinaryGeneticAlgorithmLongRunningUnitTest.java | 0 .../algorithms/SimulatedAnnealingLongRunningUnitTest.java | 0 24 files changed, 1 insertion(+), 1 deletion(-) rename {algorithms-genetic => algorithms-module/algorithms-genetic}/.gitignore (100%) rename {algorithms-genetic => algorithms-module/algorithms-genetic}/README.md (100%) rename {algorithms-genetic => algorithms-module/algorithms-genetic}/pom.xml (96%) rename {algorithms-genetic => algorithms-module/algorithms-genetic}/src/main/java/com/baeldung/algorithms/RunAlgorithm.java (100%) rename {algorithms-genetic => algorithms-module/algorithms-genetic}/src/main/java/com/baeldung/algorithms/ga/annealing/City.java (100%) rename {algorithms-genetic => algorithms-module/algorithms-genetic}/src/main/java/com/baeldung/algorithms/ga/annealing/SimulatedAnnealing.java (100%) rename {algorithms-genetic => algorithms-module/algorithms-genetic}/src/main/java/com/baeldung/algorithms/ga/annealing/Travel.java (100%) rename {algorithms-genetic => algorithms-module/algorithms-genetic}/src/main/java/com/baeldung/algorithms/ga/ant_colony/Ant.java (100%) rename {algorithms-genetic => algorithms-module/algorithms-genetic}/src/main/java/com/baeldung/algorithms/ga/ant_colony/AntColonyOptimization.java (100%) rename {algorithms-genetic => algorithms-module/algorithms-genetic}/src/main/java/com/baeldung/algorithms/ga/binary/Individual.java (100%) rename {algorithms-genetic => algorithms-module/algorithms-genetic}/src/main/java/com/baeldung/algorithms/ga/binary/Population.java (100%) rename {algorithms-genetic => algorithms-module/algorithms-genetic}/src/main/java/com/baeldung/algorithms/ga/binary/SimpleGeneticAlgorithm.java (100%) rename {algorithms-genetic => algorithms-module/algorithms-genetic}/src/main/java/com/baeldung/algorithms/ga/jenetics/Knapsack.java (100%) rename {algorithms-genetic => algorithms-module/algorithms-genetic}/src/main/java/com/baeldung/algorithms/ga/jenetics/KnapsackFF.java (100%) rename {algorithms-genetic => algorithms-module/algorithms-genetic}/src/main/java/com/baeldung/algorithms/ga/jenetics/KnapsackItem.java (100%) rename {algorithms-genetic => algorithms-module/algorithms-genetic}/src/main/java/com/baeldung/algorithms/ga/jenetics/SimpleGeneticAlgorithm.java (100%) rename {algorithms-genetic => algorithms-module/algorithms-genetic}/src/main/java/com/baeldung/algorithms/ga/jenetics/SpringsteenProblem.java (100%) rename {algorithms-genetic => algorithms-module/algorithms-genetic}/src/main/java/com/baeldung/algorithms/ga/jenetics/SpringsteenRecord.java (100%) rename {algorithms-genetic => algorithms-module/algorithms-genetic}/src/main/java/com/baeldung/algorithms/ga/jenetics/SubsetSum.java (100%) rename {algorithms-genetic => algorithms-module/algorithms-genetic}/src/main/java/com/baeldung/algorithms/ga/jenetics/TravelingSalesman.java (100%) rename {algorithms-genetic => algorithms-module/algorithms-genetic}/src/main/resources/logback.xml (100%) rename {algorithms-genetic => algorithms-module/algorithms-genetic}/src/test/java/com/baeldung/algorithms/AntColonyOptimizationLongRunningUnitTest.java (100%) rename {algorithms-genetic => algorithms-module/algorithms-genetic}/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmLongRunningUnitTest.java (100%) rename {algorithms-genetic => algorithms-module/algorithms-genetic}/src/test/java/com/baeldung/algorithms/SimulatedAnnealingLongRunningUnitTest.java (100%) diff --git a/algorithms-genetic/.gitignore b/algorithms-module/algorithms-genetic/.gitignore similarity index 100% rename from algorithms-genetic/.gitignore rename to algorithms-module/algorithms-genetic/.gitignore diff --git a/algorithms-genetic/README.md b/algorithms-module/algorithms-genetic/README.md similarity index 100% rename from algorithms-genetic/README.md rename to algorithms-module/algorithms-genetic/README.md diff --git a/algorithms-genetic/pom.xml b/algorithms-module/algorithms-genetic/pom.xml similarity index 96% rename from algorithms-genetic/pom.xml rename to algorithms-module/algorithms-genetic/pom.xml index c53ae0f776..c18ba0e7f1 100644 --- a/algorithms-genetic/pom.xml +++ b/algorithms-module/algorithms-genetic/pom.xml @@ -9,7 +9,7 @@ com.baeldung - parent-modules + algorithms-modules 1.0.0-SNAPSHOT diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/RunAlgorithm.java b/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/RunAlgorithm.java similarity index 100% rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/RunAlgorithm.java rename to algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/RunAlgorithm.java diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/City.java b/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/City.java similarity index 100% rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/City.java rename to algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/City.java diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/SimulatedAnnealing.java b/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/SimulatedAnnealing.java similarity index 100% rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/SimulatedAnnealing.java rename to algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/SimulatedAnnealing.java diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/Travel.java b/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/Travel.java similarity index 100% rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/Travel.java rename to algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/Travel.java diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/ant_colony/Ant.java b/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/ant_colony/Ant.java similarity index 100% rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/ant_colony/Ant.java rename to algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/ant_colony/Ant.java diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/ant_colony/AntColonyOptimization.java b/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/ant_colony/AntColonyOptimization.java similarity index 100% rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/ant_colony/AntColonyOptimization.java rename to algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/ant_colony/AntColonyOptimization.java diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/Individual.java b/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/Individual.java similarity index 100% rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/Individual.java rename to algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/Individual.java diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/Population.java b/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/Population.java similarity index 100% rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/Population.java rename to algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/Population.java diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/SimpleGeneticAlgorithm.java b/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/SimpleGeneticAlgorithm.java similarity index 100% rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/SimpleGeneticAlgorithm.java rename to algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/SimpleGeneticAlgorithm.java diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/Knapsack.java b/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/Knapsack.java similarity index 100% rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/Knapsack.java rename to algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/Knapsack.java diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/KnapsackFF.java b/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/KnapsackFF.java similarity index 100% rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/KnapsackFF.java rename to algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/KnapsackFF.java diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/KnapsackItem.java b/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/KnapsackItem.java similarity index 100% rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/KnapsackItem.java rename to algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/KnapsackItem.java diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SimpleGeneticAlgorithm.java b/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SimpleGeneticAlgorithm.java similarity index 100% rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SimpleGeneticAlgorithm.java rename to algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SimpleGeneticAlgorithm.java diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SpringsteenProblem.java b/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SpringsteenProblem.java similarity index 100% rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SpringsteenProblem.java rename to algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SpringsteenProblem.java diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SpringsteenRecord.java b/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SpringsteenRecord.java similarity index 100% rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SpringsteenRecord.java rename to algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SpringsteenRecord.java diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SubsetSum.java b/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SubsetSum.java similarity index 100% rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SubsetSum.java rename to algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SubsetSum.java diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/TravelingSalesman.java b/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/TravelingSalesman.java similarity index 100% rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/TravelingSalesman.java rename to algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/TravelingSalesman.java diff --git a/algorithms-genetic/src/main/resources/logback.xml b/algorithms-module/algorithms-genetic/src/main/resources/logback.xml similarity index 100% rename from algorithms-genetic/src/main/resources/logback.xml rename to algorithms-module/algorithms-genetic/src/main/resources/logback.xml diff --git a/algorithms-genetic/src/test/java/com/baeldung/algorithms/AntColonyOptimizationLongRunningUnitTest.java b/algorithms-module/algorithms-genetic/src/test/java/com/baeldung/algorithms/AntColonyOptimizationLongRunningUnitTest.java similarity index 100% rename from algorithms-genetic/src/test/java/com/baeldung/algorithms/AntColonyOptimizationLongRunningUnitTest.java rename to algorithms-module/algorithms-genetic/src/test/java/com/baeldung/algorithms/AntColonyOptimizationLongRunningUnitTest.java diff --git a/algorithms-genetic/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmLongRunningUnitTest.java b/algorithms-module/algorithms-genetic/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmLongRunningUnitTest.java similarity index 100% rename from algorithms-genetic/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmLongRunningUnitTest.java rename to algorithms-module/algorithms-genetic/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmLongRunningUnitTest.java diff --git a/algorithms-genetic/src/test/java/com/baeldung/algorithms/SimulatedAnnealingLongRunningUnitTest.java b/algorithms-module/algorithms-genetic/src/test/java/com/baeldung/algorithms/SimulatedAnnealingLongRunningUnitTest.java similarity index 100% rename from algorithms-genetic/src/test/java/com/baeldung/algorithms/SimulatedAnnealingLongRunningUnitTest.java rename to algorithms-module/algorithms-genetic/src/test/java/com/baeldung/algorithms/SimulatedAnnealingLongRunningUnitTest.java From 22a63fe7d8fe314b160acebeb5e2836c2333c892 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Fri, 20 May 2022 20:27:05 +0530 Subject: [PATCH 234/278] JAVA-12097: moved algorithms-miscellaneous-1 inside algorithms-module --- .../algorithms-miscellaneous-1}/README.md | 0 .../algorithms-miscellaneous-1}/pom.xml | 2 +- .../com/baeldung/algorithms/automata/FiniteStateMachine.java | 0 .../com/baeldung/algorithms/automata/RtFiniteStateMachine.java | 0 .../src/main/java/com/baeldung/algorithms/automata/RtState.java | 0 .../java/com/baeldung/algorithms/automata/RtTransition.java | 0 .../src/main/java/com/baeldung/algorithms/automata/State.java | 0 .../main/java/com/baeldung/algorithms/automata/Transition.java | 0 .../java/com/baeldung/algorithms/hillclimbing/HillClimbing.java | 0 .../main/java/com/baeldung/algorithms/hillclimbing/State.java | 0 .../java/com/baeldung/algorithms/kthlargest/FindKthLargest.java | 0 .../main/java/com/baeldung/algorithms/minimax/GameOfBones.java | 0 .../src/main/java/com/baeldung/algorithms/minimax/MiniMax.java | 0 .../src/main/java/com/baeldung/algorithms/minimax/Node.java | 0 .../src/main/java/com/baeldung/algorithms/minimax/Tree.java | 0 .../algorithms-miscellaneous-1}/src/main/resources/logback.xml | 0 .../com/baeldung/algorithms/HillClimbingAlgorithmUnitTest.java | 0 .../algorithms/RtFiniteStateMachineLongRunningUnitTest.java | 0 .../baeldung/algorithms/kthlargest/FindKthLargestUnitTest.java | 0 .../java/com/baeldung/algorithms/minimax/MinimaxUnitTest.java | 0 20 files changed, 1 insertion(+), 1 deletion(-) rename {algorithms-miscellaneous-1 => algorithms-module/algorithms-miscellaneous-1}/README.md (100%) rename {algorithms-miscellaneous-1 => algorithms-module/algorithms-miscellaneous-1}/pom.xml (98%) rename {algorithms-miscellaneous-1 => algorithms-module/algorithms-miscellaneous-1}/src/main/java/com/baeldung/algorithms/automata/FiniteStateMachine.java (100%) rename {algorithms-miscellaneous-1 => algorithms-module/algorithms-miscellaneous-1}/src/main/java/com/baeldung/algorithms/automata/RtFiniteStateMachine.java (100%) rename {algorithms-miscellaneous-1 => algorithms-module/algorithms-miscellaneous-1}/src/main/java/com/baeldung/algorithms/automata/RtState.java (100%) rename {algorithms-miscellaneous-1 => algorithms-module/algorithms-miscellaneous-1}/src/main/java/com/baeldung/algorithms/automata/RtTransition.java (100%) rename {algorithms-miscellaneous-1 => algorithms-module/algorithms-miscellaneous-1}/src/main/java/com/baeldung/algorithms/automata/State.java (100%) rename {algorithms-miscellaneous-1 => algorithms-module/algorithms-miscellaneous-1}/src/main/java/com/baeldung/algorithms/automata/Transition.java (100%) rename {algorithms-miscellaneous-1 => algorithms-module/algorithms-miscellaneous-1}/src/main/java/com/baeldung/algorithms/hillclimbing/HillClimbing.java (100%) rename {algorithms-miscellaneous-1 => algorithms-module/algorithms-miscellaneous-1}/src/main/java/com/baeldung/algorithms/hillclimbing/State.java (100%) rename {algorithms-miscellaneous-1 => algorithms-module/algorithms-miscellaneous-1}/src/main/java/com/baeldung/algorithms/kthlargest/FindKthLargest.java (100%) rename {algorithms-miscellaneous-1 => algorithms-module/algorithms-miscellaneous-1}/src/main/java/com/baeldung/algorithms/minimax/GameOfBones.java (100%) rename {algorithms-miscellaneous-1 => algorithms-module/algorithms-miscellaneous-1}/src/main/java/com/baeldung/algorithms/minimax/MiniMax.java (100%) rename {algorithms-miscellaneous-1 => algorithms-module/algorithms-miscellaneous-1}/src/main/java/com/baeldung/algorithms/minimax/Node.java (100%) rename {algorithms-miscellaneous-1 => algorithms-module/algorithms-miscellaneous-1}/src/main/java/com/baeldung/algorithms/minimax/Tree.java (100%) rename {algorithms-miscellaneous-1 => algorithms-module/algorithms-miscellaneous-1}/src/main/resources/logback.xml (100%) rename {algorithms-miscellaneous-1 => algorithms-module/algorithms-miscellaneous-1}/src/test/java/com/baeldung/algorithms/HillClimbingAlgorithmUnitTest.java (100%) rename {algorithms-miscellaneous-1 => algorithms-module/algorithms-miscellaneous-1}/src/test/java/com/baeldung/algorithms/RtFiniteStateMachineLongRunningUnitTest.java (100%) rename {algorithms-miscellaneous-1 => algorithms-module/algorithms-miscellaneous-1}/src/test/java/com/baeldung/algorithms/kthlargest/FindKthLargestUnitTest.java (100%) rename {algorithms-miscellaneous-1 => algorithms-module/algorithms-miscellaneous-1}/src/test/java/com/baeldung/algorithms/minimax/MinimaxUnitTest.java (100%) diff --git a/algorithms-miscellaneous-1/README.md b/algorithms-module/algorithms-miscellaneous-1/README.md similarity index 100% rename from algorithms-miscellaneous-1/README.md rename to algorithms-module/algorithms-miscellaneous-1/README.md diff --git a/algorithms-miscellaneous-1/pom.xml b/algorithms-module/algorithms-miscellaneous-1/pom.xml similarity index 98% rename from algorithms-miscellaneous-1/pom.xml rename to algorithms-module/algorithms-miscellaneous-1/pom.xml index c6f247f4e3..62c9738f1a 100644 --- a/algorithms-miscellaneous-1/pom.xml +++ b/algorithms-module/algorithms-miscellaneous-1/pom.xml @@ -9,7 +9,7 @@ com.baeldung - parent-modules + algorithms-modules 1.0.0-SNAPSHOT diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/FiniteStateMachine.java b/algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/FiniteStateMachine.java similarity index 100% rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/FiniteStateMachine.java rename to algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/FiniteStateMachine.java diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtFiniteStateMachine.java b/algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtFiniteStateMachine.java similarity index 100% rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtFiniteStateMachine.java rename to algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtFiniteStateMachine.java diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtState.java b/algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtState.java similarity index 100% rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtState.java rename to algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtState.java diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtTransition.java b/algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtTransition.java similarity index 100% rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtTransition.java rename to algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtTransition.java diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/State.java b/algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/State.java similarity index 100% rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/State.java rename to algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/State.java diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/Transition.java b/algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/Transition.java similarity index 100% rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/Transition.java rename to algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/Transition.java diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/hillclimbing/HillClimbing.java b/algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/hillclimbing/HillClimbing.java similarity index 100% rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/hillclimbing/HillClimbing.java rename to algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/hillclimbing/HillClimbing.java diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/hillclimbing/State.java b/algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/hillclimbing/State.java similarity index 100% rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/hillclimbing/State.java rename to algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/hillclimbing/State.java diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/kthlargest/FindKthLargest.java b/algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/kthlargest/FindKthLargest.java similarity index 100% rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/kthlargest/FindKthLargest.java rename to algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/kthlargest/FindKthLargest.java diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/GameOfBones.java b/algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/GameOfBones.java similarity index 100% rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/GameOfBones.java rename to algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/GameOfBones.java diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/MiniMax.java b/algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/MiniMax.java similarity index 100% rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/MiniMax.java rename to algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/MiniMax.java diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/Node.java b/algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/Node.java similarity index 100% rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/Node.java rename to algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/Node.java diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/Tree.java b/algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/Tree.java similarity index 100% rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/Tree.java rename to algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/Tree.java diff --git a/algorithms-miscellaneous-1/src/main/resources/logback.xml b/algorithms-module/algorithms-miscellaneous-1/src/main/resources/logback.xml similarity index 100% rename from algorithms-miscellaneous-1/src/main/resources/logback.xml rename to algorithms-module/algorithms-miscellaneous-1/src/main/resources/logback.xml diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/HillClimbingAlgorithmUnitTest.java b/algorithms-module/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/HillClimbingAlgorithmUnitTest.java similarity index 100% rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/HillClimbingAlgorithmUnitTest.java rename to algorithms-module/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/HillClimbingAlgorithmUnitTest.java diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/RtFiniteStateMachineLongRunningUnitTest.java b/algorithms-module/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/RtFiniteStateMachineLongRunningUnitTest.java similarity index 100% rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/RtFiniteStateMachineLongRunningUnitTest.java rename to algorithms-module/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/RtFiniteStateMachineLongRunningUnitTest.java diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/kthlargest/FindKthLargestUnitTest.java b/algorithms-module/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/kthlargest/FindKthLargestUnitTest.java similarity index 100% rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/kthlargest/FindKthLargestUnitTest.java rename to algorithms-module/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/kthlargest/FindKthLargestUnitTest.java diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/minimax/MinimaxUnitTest.java b/algorithms-module/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/minimax/MinimaxUnitTest.java similarity index 100% rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/minimax/MinimaxUnitTest.java rename to algorithms-module/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/minimax/MinimaxUnitTest.java From cd0c9ae05edd748f26cf54e760aa36c919e84211 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Fri, 20 May 2022 20:27:38 +0530 Subject: [PATCH 235/278] JAVA-12097: moved algorithms-miscellaneous-2 inside algorithms-module --- .../algorithms-miscellaneous-2}/README.md | 0 .../algorithms-miscellaneous-2}/pom.xml | 2 +- .../java/com/baeldung/algorithms/RunAlgorithm.java | 0 .../algorithms/editdistance/EditDistanceBase.java | 0 .../EditDistanceDynamicProgramming.java | 0 .../editdistance/EditDistanceRecursive.java | 0 .../baeldung/algorithms/ga/dijkstra/Dijkstra.java | 0 .../com/baeldung/algorithms/ga/dijkstra/Graph.java | 0 .../com/baeldung/algorithms/ga/dijkstra/Node.java | 0 .../linkedlist/CycleDetectionBruteForce.java | 0 .../CycleDetectionByFastAndSlowIterators.java | 0 .../linkedlist/CycleDetectionByHashing.java | 0 .../algorithms/linkedlist/CycleDetectionResult.java | 0 .../linkedlist/CycleRemovalBruteForce.java | 0 .../linkedlist/CycleRemovalByCountingLoopNodes.java | 0 .../CycleRemovalWithoutCountingLoopNodes.java | 0 .../com/baeldung/algorithms/linkedlist/Node.java | 0 .../algorithms/maze/solver/BFSMazeSolver.java | 0 .../baeldung/algorithms/maze/solver/Coordinate.java | 0 .../algorithms/maze/solver/DFSMazeSolver.java | 0 .../com/baeldung/algorithms/maze/solver/Maze.java | 0 .../baeldung/algorithms/maze/solver/MazeDriver.java | 0 .../numberwordconverter/NumberWordConverter.java | 0 .../baeldung/algorithms/slope_one/InputData.java | 0 .../com/baeldung/algorithms/slope_one/Item.java | 0 .../com/baeldung/algorithms/slope_one/SlopeOne.java | 0 .../com/baeldung/algorithms/slope_one/User.java | 0 .../algorithms/sudoku/BacktrackingAlgorithm.java | 0 .../com/baeldung/algorithms/sudoku/ColumnNode.java | 0 .../baeldung/algorithms/sudoku/DancingLinks.java | 0 .../algorithms/sudoku/DancingLinksAlgorithm.java | 0 .../com/baeldung/algorithms/sudoku/DancingNode.java | 0 .../src/main/resources/logback.xml | 0 .../src/main/resources/maze/maze1.txt | 0 .../src/main/resources/maze/maze2.txt | 0 .../DijkstraAlgorithmLongRunningUnitTest.java | 0 .../java/com/baeldung/algorithms/astar/Graph.java | 0 .../com/baeldung/algorithms/astar/GraphNode.java | 0 .../com/baeldung/algorithms/astar/RouteFinder.java | 0 .../com/baeldung/algorithms/astar/RouteNode.java | 0 .../java/com/baeldung/algorithms/astar/Scorer.java | 0 .../astar/underground/HaversineScorer.java | 0 .../underground/RouteFinderIntegrationTest.java | 0 .../algorithms/astar/underground/Station.java | 0 .../editdistance/EditDistanceDataProvider.java | 0 .../editdistance/EditDistanceUnitTest.java | 0 .../CycleDetectionBruteForceUnitTest.java | 0 ...ycleDetectionByFastAndSlowIteratorsUnitTest.java | 0 .../linkedlist/CycleDetectionByHashingUnitTest.java | 0 .../linkedlist/CycleDetectionTestBase.java | 0 .../linkedlist/CycleRemovalBruteForceUnitTest.java | 0 .../CycleRemovalByCountingLoopNodesUnitTest.java | 0 ...ycleRemovalWithoutCountingLoopNodesUnitTest.java | 0 .../moneywords/NumberWordConverterUnitTest.java | 0 .../com/baeldung/jgrapht/CompleteGraphUnitTest.java | 0 .../com/baeldung/jgrapht/DirectedGraphUnitTest.java | 0 .../baeldung/jgrapht/EulerianCircuitUnitTest.java | 0 .../jgrapht/GraphImageGenerationUnitTest.java | 0 .../src/test/resources/graph.png | Bin 59 files changed, 1 insertion(+), 1 deletion(-) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/README.md (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/pom.xml (98%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/java/com/baeldung/algorithms/RunAlgorithm.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceBase.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceDynamicProgramming.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceRecursive.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/java/com/baeldung/algorithms/ga/dijkstra/Dijkstra.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/java/com/baeldung/algorithms/ga/dijkstra/Graph.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/java/com/baeldung/algorithms/ga/dijkstra/Node.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionBruteForce.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionByFastAndSlowIterators.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionByHashing.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionResult.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalBruteForce.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalByCountingLoopNodes.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalWithoutCountingLoopNodes.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/java/com/baeldung/algorithms/linkedlist/Node.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/java/com/baeldung/algorithms/maze/solver/BFSMazeSolver.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/java/com/baeldung/algorithms/maze/solver/Coordinate.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/java/com/baeldung/algorithms/maze/solver/DFSMazeSolver.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/java/com/baeldung/algorithms/maze/solver/Maze.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/java/com/baeldung/algorithms/maze/solver/MazeDriver.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/java/com/baeldung/algorithms/numberwordconverter/NumberWordConverter.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/java/com/baeldung/algorithms/slope_one/InputData.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/java/com/baeldung/algorithms/slope_one/Item.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/java/com/baeldung/algorithms/slope_one/SlopeOne.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/java/com/baeldung/algorithms/slope_one/User.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/java/com/baeldung/algorithms/sudoku/ColumnNode.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/java/com/baeldung/algorithms/sudoku/DancingLinks.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/java/com/baeldung/algorithms/sudoku/DancingNode.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/resources/logback.xml (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/resources/maze/maze1.txt (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/main/resources/maze/maze2.txt (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/test/java/com/baeldung/algorithms/DijkstraAlgorithmLongRunningUnitTest.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/test/java/com/baeldung/algorithms/astar/Graph.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/test/java/com/baeldung/algorithms/astar/GraphNode.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/test/java/com/baeldung/algorithms/astar/RouteFinder.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/test/java/com/baeldung/algorithms/astar/RouteNode.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/test/java/com/baeldung/algorithms/astar/Scorer.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/test/java/com/baeldung/algorithms/astar/underground/HaversineScorer.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/test/java/com/baeldung/algorithms/astar/underground/RouteFinderIntegrationTest.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/test/java/com/baeldung/algorithms/astar/underground/Station.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceDataProvider.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceUnitTest.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionBruteForceUnitTest.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByFastAndSlowIteratorsUnitTest.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByHashingUnitTest.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionTestBase.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalBruteForceUnitTest.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalByCountingLoopNodesUnitTest.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalWithoutCountingLoopNodesUnitTest.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/test/java/com/baeldung/algorithms/moneywords/NumberWordConverterUnitTest.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/test/java/com/baeldung/jgrapht/CompleteGraphUnitTest.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/test/java/com/baeldung/jgrapht/DirectedGraphUnitTest.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/test/java/com/baeldung/jgrapht/EulerianCircuitUnitTest.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/test/java/com/baeldung/jgrapht/GraphImageGenerationUnitTest.java (100%) rename {algorithms-miscellaneous-2 => algorithms-module/algorithms-miscellaneous-2}/src/test/resources/graph.png (100%) diff --git a/algorithms-miscellaneous-2/README.md b/algorithms-module/algorithms-miscellaneous-2/README.md similarity index 100% rename from algorithms-miscellaneous-2/README.md rename to algorithms-module/algorithms-miscellaneous-2/README.md diff --git a/algorithms-miscellaneous-2/pom.xml b/algorithms-module/algorithms-miscellaneous-2/pom.xml similarity index 98% rename from algorithms-miscellaneous-2/pom.xml rename to algorithms-module/algorithms-miscellaneous-2/pom.xml index a411cfdb71..f3b41cb7f8 100644 --- a/algorithms-miscellaneous-2/pom.xml +++ b/algorithms-module/algorithms-miscellaneous-2/pom.xml @@ -9,7 +9,7 @@ com.baeldung - parent-modules + algorithms-modules 1.0.0-SNAPSHOT diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/RunAlgorithm.java b/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/RunAlgorithm.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/RunAlgorithm.java rename to algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/RunAlgorithm.java diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceBase.java b/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceBase.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceBase.java rename to algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceBase.java diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceDynamicProgramming.java b/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceDynamicProgramming.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceDynamicProgramming.java rename to algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceDynamicProgramming.java diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceRecursive.java b/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceRecursive.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceRecursive.java rename to algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceRecursive.java diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Dijkstra.java b/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Dijkstra.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Dijkstra.java rename to algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Dijkstra.java diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Graph.java b/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Graph.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Graph.java rename to algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Graph.java diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Node.java b/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Node.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Node.java rename to algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Node.java diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionBruteForce.java b/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionBruteForce.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionBruteForce.java rename to algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionBruteForce.java diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionByFastAndSlowIterators.java b/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionByFastAndSlowIterators.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionByFastAndSlowIterators.java rename to algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionByFastAndSlowIterators.java diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionByHashing.java b/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionByHashing.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionByHashing.java rename to algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionByHashing.java diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionResult.java b/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionResult.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionResult.java rename to algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionResult.java diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalBruteForce.java b/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalBruteForce.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalBruteForce.java rename to algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalBruteForce.java diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalByCountingLoopNodes.java b/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalByCountingLoopNodes.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalByCountingLoopNodes.java rename to algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalByCountingLoopNodes.java diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalWithoutCountingLoopNodes.java b/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalWithoutCountingLoopNodes.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalWithoutCountingLoopNodes.java rename to algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalWithoutCountingLoopNodes.java diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/Node.java b/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/Node.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/Node.java rename to algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/Node.java diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/BFSMazeSolver.java b/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/BFSMazeSolver.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/BFSMazeSolver.java rename to algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/BFSMazeSolver.java diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/Coordinate.java b/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/Coordinate.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/Coordinate.java rename to algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/Coordinate.java diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/DFSMazeSolver.java b/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/DFSMazeSolver.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/DFSMazeSolver.java rename to algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/DFSMazeSolver.java diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/Maze.java b/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/Maze.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/Maze.java rename to algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/Maze.java diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/MazeDriver.java b/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/MazeDriver.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/MazeDriver.java rename to algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/MazeDriver.java diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/numberwordconverter/NumberWordConverter.java b/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/numberwordconverter/NumberWordConverter.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/numberwordconverter/NumberWordConverter.java rename to algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/numberwordconverter/NumberWordConverter.java diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/InputData.java b/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/InputData.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/InputData.java rename to algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/InputData.java diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/Item.java b/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/Item.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/Item.java rename to algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/Item.java diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/SlopeOne.java b/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/SlopeOne.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/SlopeOne.java rename to algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/SlopeOne.java diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/User.java b/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/User.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/User.java rename to algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/User.java diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java b/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java rename to algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/ColumnNode.java b/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/ColumnNode.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/ColumnNode.java rename to algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/ColumnNode.java diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingLinks.java b/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingLinks.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingLinks.java rename to algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingLinks.java diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java b/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java rename to algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingNode.java b/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingNode.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingNode.java rename to algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingNode.java diff --git a/algorithms-miscellaneous-2/src/main/resources/logback.xml b/algorithms-module/algorithms-miscellaneous-2/src/main/resources/logback.xml similarity index 100% rename from algorithms-miscellaneous-2/src/main/resources/logback.xml rename to algorithms-module/algorithms-miscellaneous-2/src/main/resources/logback.xml diff --git a/algorithms-miscellaneous-2/src/main/resources/maze/maze1.txt b/algorithms-module/algorithms-miscellaneous-2/src/main/resources/maze/maze1.txt similarity index 100% rename from algorithms-miscellaneous-2/src/main/resources/maze/maze1.txt rename to algorithms-module/algorithms-miscellaneous-2/src/main/resources/maze/maze1.txt diff --git a/algorithms-miscellaneous-2/src/main/resources/maze/maze2.txt b/algorithms-module/algorithms-miscellaneous-2/src/main/resources/maze/maze2.txt similarity index 100% rename from algorithms-miscellaneous-2/src/main/resources/maze/maze2.txt rename to algorithms-module/algorithms-miscellaneous-2/src/main/resources/maze/maze2.txt diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/DijkstraAlgorithmLongRunningUnitTest.java b/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/DijkstraAlgorithmLongRunningUnitTest.java similarity index 100% rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/DijkstraAlgorithmLongRunningUnitTest.java rename to algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/DijkstraAlgorithmLongRunningUnitTest.java diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/Graph.java b/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/Graph.java similarity index 100% rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/Graph.java rename to algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/Graph.java diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/GraphNode.java b/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/GraphNode.java similarity index 100% rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/GraphNode.java rename to algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/GraphNode.java diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/RouteFinder.java b/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/RouteFinder.java similarity index 100% rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/RouteFinder.java rename to algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/RouteFinder.java diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/RouteNode.java b/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/RouteNode.java similarity index 100% rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/RouteNode.java rename to algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/RouteNode.java diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/Scorer.java b/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/Scorer.java similarity index 100% rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/Scorer.java rename to algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/Scorer.java diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/HaversineScorer.java b/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/HaversineScorer.java similarity index 100% rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/HaversineScorer.java rename to algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/HaversineScorer.java diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/RouteFinderIntegrationTest.java b/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/RouteFinderIntegrationTest.java similarity index 100% rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/RouteFinderIntegrationTest.java rename to algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/RouteFinderIntegrationTest.java diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/Station.java b/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/Station.java similarity index 100% rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/Station.java rename to algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/Station.java diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceDataProvider.java b/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceDataProvider.java similarity index 100% rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceDataProvider.java rename to algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceDataProvider.java diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceUnitTest.java b/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceUnitTest.java similarity index 100% rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceUnitTest.java rename to algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceUnitTest.java diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionBruteForceUnitTest.java b/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionBruteForceUnitTest.java similarity index 100% rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionBruteForceUnitTest.java rename to algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionBruteForceUnitTest.java diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByFastAndSlowIteratorsUnitTest.java b/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByFastAndSlowIteratorsUnitTest.java similarity index 100% rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByFastAndSlowIteratorsUnitTest.java rename to algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByFastAndSlowIteratorsUnitTest.java diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByHashingUnitTest.java b/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByHashingUnitTest.java similarity index 100% rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByHashingUnitTest.java rename to algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByHashingUnitTest.java diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionTestBase.java b/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionTestBase.java similarity index 100% rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionTestBase.java rename to algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionTestBase.java diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalBruteForceUnitTest.java b/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalBruteForceUnitTest.java similarity index 100% rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalBruteForceUnitTest.java rename to algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalBruteForceUnitTest.java diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalByCountingLoopNodesUnitTest.java b/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalByCountingLoopNodesUnitTest.java similarity index 100% rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalByCountingLoopNodesUnitTest.java rename to algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalByCountingLoopNodesUnitTest.java diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalWithoutCountingLoopNodesUnitTest.java b/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalWithoutCountingLoopNodesUnitTest.java similarity index 100% rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalWithoutCountingLoopNodesUnitTest.java rename to algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalWithoutCountingLoopNodesUnitTest.java diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/moneywords/NumberWordConverterUnitTest.java b/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/moneywords/NumberWordConverterUnitTest.java similarity index 100% rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/moneywords/NumberWordConverterUnitTest.java rename to algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/moneywords/NumberWordConverterUnitTest.java diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/CompleteGraphUnitTest.java b/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/CompleteGraphUnitTest.java similarity index 100% rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/CompleteGraphUnitTest.java rename to algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/CompleteGraphUnitTest.java diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/DirectedGraphUnitTest.java b/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/DirectedGraphUnitTest.java similarity index 100% rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/DirectedGraphUnitTest.java rename to algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/DirectedGraphUnitTest.java diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/EulerianCircuitUnitTest.java b/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/EulerianCircuitUnitTest.java similarity index 100% rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/EulerianCircuitUnitTest.java rename to algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/EulerianCircuitUnitTest.java diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/GraphImageGenerationUnitTest.java b/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/GraphImageGenerationUnitTest.java similarity index 100% rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/GraphImageGenerationUnitTest.java rename to algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/GraphImageGenerationUnitTest.java diff --git a/algorithms-miscellaneous-2/src/test/resources/graph.png b/algorithms-module/algorithms-miscellaneous-2/src/test/resources/graph.png similarity index 100% rename from algorithms-miscellaneous-2/src/test/resources/graph.png rename to algorithms-module/algorithms-miscellaneous-2/src/test/resources/graph.png From 02f84766edd7d87d6e2e3789893be0c060d565c2 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Fri, 20 May 2022 20:28:10 +0530 Subject: [PATCH 236/278] JAVA-12097: moved algorithms-miscellaneous-3 inside algorithms-module --- .../algorithms-miscellaneous-3}/.gitignore | 0 .../algorithms-miscellaneous-3}/README.md | 0 .../algorithms-miscellaneous-3}/pom.xml | 2 +- .../java/com/baeldung/algorithms/checksortedlist/Employee.java | 0 .../baeldung/algorithms/checksortedlist/SortedListChecker.java | 0 .../baeldung/algorithms/enumstatemachine/LeaveRequestState.java | 0 .../baeldung/algorithms/graphcycledetection/domain/Graph.java | 0 .../baeldung/algorithms/graphcycledetection/domain/Vertex.java | 0 .../src/main/java/com/baeldung/algorithms/kmeans/Centroid.java | 0 .../src/main/java/com/baeldung/algorithms/kmeans/Distance.java | 0 .../src/main/java/com/baeldung/algorithms/kmeans/Errors.java | 0 .../java/com/baeldung/algorithms/kmeans/EuclideanDistance.java | 0 .../src/main/java/com/baeldung/algorithms/kmeans/KMeans.java | 0 .../src/main/java/com/baeldung/algorithms/kmeans/LastFm.java | 0 .../main/java/com/baeldung/algorithms/kmeans/LastFmService.java | 0 .../src/main/java/com/baeldung/algorithms/kmeans/Record.java | 0 .../algorithms/printtriangles/PrintTriangleExamples.java | 0 .../baeldung/algorithms/romannumerals/RomanArabicConverter.java | 0 .../com/baeldung/algorithms/romannumerals/RomanNumeral.java | 0 .../algorithms/twopointertechnique/LinkedListFindMiddle.java | 0 .../com/baeldung/algorithms/twopointertechnique/MyNode.java | 0 .../baeldung/algorithms/twopointertechnique/RotateArray.java | 0 .../com/baeldung/algorithms/twopointertechnique/TwoSum.java | 0 .../src/main/java/com/baeldung/folding/FoldingHash.java | 0 .../src/main/java/com/baeldung/folding/Main.java | 0 .../src/main/resources/kmeans/artists.json | 0 .../src/main/resources/kmeans/lastfm.json | 0 .../src/main/resources/kmeans/radial.html | 0 .../algorithms-miscellaneous-3}/src/main/resources/logback.xml | 0 .../baeldung/algorithms/analysis/AnalysisRunnerLiveTest.java | 0 .../algorithms/checksortedlist/SortedListCheckerUnitTest.java | 0 .../algorithms/enumstatemachine/LeaveRequestStateUnitTest.java | 0 .../graphcycledetection/GraphCycleDetectionUnitTest.java | 0 .../printtriangles/PrintTriangleExamplesUnitTest.java | 0 .../algorithms/romannumerals/RomanArabicConverterUnitTest.java | 0 .../twopointertechnique/LinkedListFindMiddleUnitTest.java | 0 .../algorithms/twopointertechnique/RotateArrayUnitTest.java | 0 .../baeldung/algorithms/twopointertechnique/TwoSumUnitTest.java | 0 .../src/test/java/com/baeldung/counter/CounterStatistics.java | 0 .../src/test/java/com/baeldung/counter/CounterUnitTest.java | 0 .../src/test/java/com/baeldung/counter/CounterUtil.java | 0 .../src/test/java/com/baeldung/folding/FoldingHashUnitTest.java | 0 42 files changed, 1 insertion(+), 1 deletion(-) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/.gitignore (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/README.md (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/pom.xml (98%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/main/java/com/baeldung/algorithms/checksortedlist/Employee.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/main/java/com/baeldung/algorithms/checksortedlist/SortedListChecker.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/main/java/com/baeldung/algorithms/enumstatemachine/LeaveRequestState.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/main/java/com/baeldung/algorithms/graphcycledetection/domain/Graph.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/main/java/com/baeldung/algorithms/graphcycledetection/domain/Vertex.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/main/java/com/baeldung/algorithms/kmeans/Centroid.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/main/java/com/baeldung/algorithms/kmeans/Distance.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/main/java/com/baeldung/algorithms/kmeans/Errors.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/main/java/com/baeldung/algorithms/kmeans/EuclideanDistance.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/main/java/com/baeldung/algorithms/kmeans/KMeans.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/main/java/com/baeldung/algorithms/kmeans/LastFm.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/main/java/com/baeldung/algorithms/kmeans/LastFmService.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/main/java/com/baeldung/algorithms/kmeans/Record.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/main/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamples.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/main/java/com/baeldung/algorithms/romannumerals/RomanArabicConverter.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/main/java/com/baeldung/algorithms/romannumerals/RomanNumeral.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/main/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddle.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/main/java/com/baeldung/algorithms/twopointertechnique/MyNode.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/main/java/com/baeldung/algorithms/twopointertechnique/RotateArray.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/main/java/com/baeldung/algorithms/twopointertechnique/TwoSum.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/main/java/com/baeldung/folding/FoldingHash.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/main/java/com/baeldung/folding/Main.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/main/resources/kmeans/artists.json (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/main/resources/kmeans/lastfm.json (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/main/resources/kmeans/radial.html (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/main/resources/logback.xml (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/test/java/com/baeldung/algorithms/analysis/AnalysisRunnerLiveTest.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/test/java/com/baeldung/algorithms/checksortedlist/SortedListCheckerUnitTest.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/test/java/com/baeldung/algorithms/enumstatemachine/LeaveRequestStateUnitTest.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/test/java/com/baeldung/algorithms/graphcycledetection/GraphCycleDetectionUnitTest.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/test/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamplesUnitTest.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/test/java/com/baeldung/algorithms/romannumerals/RomanArabicConverterUnitTest.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/test/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddleUnitTest.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/test/java/com/baeldung/algorithms/twopointertechnique/RotateArrayUnitTest.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/test/java/com/baeldung/algorithms/twopointertechnique/TwoSumUnitTest.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/test/java/com/baeldung/counter/CounterStatistics.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/test/java/com/baeldung/counter/CounterUnitTest.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/test/java/com/baeldung/counter/CounterUtil.java (100%) rename {algorithms-miscellaneous-3 => algorithms-module/algorithms-miscellaneous-3}/src/test/java/com/baeldung/folding/FoldingHashUnitTest.java (100%) diff --git a/algorithms-miscellaneous-3/.gitignore b/algorithms-module/algorithms-miscellaneous-3/.gitignore similarity index 100% rename from algorithms-miscellaneous-3/.gitignore rename to algorithms-module/algorithms-miscellaneous-3/.gitignore diff --git a/algorithms-miscellaneous-3/README.md b/algorithms-module/algorithms-miscellaneous-3/README.md similarity index 100% rename from algorithms-miscellaneous-3/README.md rename to algorithms-module/algorithms-miscellaneous-3/README.md diff --git a/algorithms-miscellaneous-3/pom.xml b/algorithms-module/algorithms-miscellaneous-3/pom.xml similarity index 98% rename from algorithms-miscellaneous-3/pom.xml rename to algorithms-module/algorithms-miscellaneous-3/pom.xml index 2f180da5e1..8958cbef88 100644 --- a/algorithms-miscellaneous-3/pom.xml +++ b/algorithms-module/algorithms-miscellaneous-3/pom.xml @@ -9,7 +9,7 @@ com.baeldung - parent-modules + algorithms-modules 1.0.0-SNAPSHOT diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/checksortedlist/Employee.java b/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/checksortedlist/Employee.java similarity index 100% rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/checksortedlist/Employee.java rename to algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/checksortedlist/Employee.java diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/checksortedlist/SortedListChecker.java b/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/checksortedlist/SortedListChecker.java similarity index 100% rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/checksortedlist/SortedListChecker.java rename to algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/checksortedlist/SortedListChecker.java diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/enumstatemachine/LeaveRequestState.java b/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/enumstatemachine/LeaveRequestState.java similarity index 100% rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/enumstatemachine/LeaveRequestState.java rename to algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/enumstatemachine/LeaveRequestState.java diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/graphcycledetection/domain/Graph.java b/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/graphcycledetection/domain/Graph.java similarity index 100% rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/graphcycledetection/domain/Graph.java rename to algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/graphcycledetection/domain/Graph.java diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/graphcycledetection/domain/Vertex.java b/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/graphcycledetection/domain/Vertex.java similarity index 100% rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/graphcycledetection/domain/Vertex.java rename to algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/graphcycledetection/domain/Vertex.java diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Centroid.java b/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Centroid.java similarity index 100% rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Centroid.java rename to algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Centroid.java diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Distance.java b/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Distance.java similarity index 100% rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Distance.java rename to algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Distance.java diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Errors.java b/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Errors.java similarity index 100% rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Errors.java rename to algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Errors.java diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/EuclideanDistance.java b/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/EuclideanDistance.java similarity index 100% rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/EuclideanDistance.java rename to algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/EuclideanDistance.java diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/KMeans.java b/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/KMeans.java similarity index 100% rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/KMeans.java rename to algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/KMeans.java diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/LastFm.java b/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/LastFm.java similarity index 100% rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/LastFm.java rename to algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/LastFm.java diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/LastFmService.java b/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/LastFmService.java similarity index 100% rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/LastFmService.java rename to algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/LastFmService.java diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Record.java b/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Record.java similarity index 100% rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Record.java rename to algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Record.java diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamples.java b/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamples.java similarity index 100% rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamples.java rename to algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamples.java diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/romannumerals/RomanArabicConverter.java b/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/romannumerals/RomanArabicConverter.java similarity index 100% rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/romannumerals/RomanArabicConverter.java rename to algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/romannumerals/RomanArabicConverter.java diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/romannumerals/RomanNumeral.java b/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/romannumerals/RomanNumeral.java similarity index 100% rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/romannumerals/RomanNumeral.java rename to algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/romannumerals/RomanNumeral.java diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddle.java b/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddle.java similarity index 100% rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddle.java rename to algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddle.java diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/MyNode.java b/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/MyNode.java similarity index 100% rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/MyNode.java rename to algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/MyNode.java diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/RotateArray.java b/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/RotateArray.java similarity index 100% rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/RotateArray.java rename to algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/RotateArray.java diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/TwoSum.java b/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/TwoSum.java similarity index 100% rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/TwoSum.java rename to algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/TwoSum.java diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/folding/FoldingHash.java b/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/folding/FoldingHash.java similarity index 100% rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/folding/FoldingHash.java rename to algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/folding/FoldingHash.java diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/folding/Main.java b/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/folding/Main.java similarity index 100% rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/folding/Main.java rename to algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/folding/Main.java diff --git a/algorithms-miscellaneous-3/src/main/resources/kmeans/artists.json b/algorithms-module/algorithms-miscellaneous-3/src/main/resources/kmeans/artists.json similarity index 100% rename from algorithms-miscellaneous-3/src/main/resources/kmeans/artists.json rename to algorithms-module/algorithms-miscellaneous-3/src/main/resources/kmeans/artists.json diff --git a/algorithms-miscellaneous-3/src/main/resources/kmeans/lastfm.json b/algorithms-module/algorithms-miscellaneous-3/src/main/resources/kmeans/lastfm.json similarity index 100% rename from algorithms-miscellaneous-3/src/main/resources/kmeans/lastfm.json rename to algorithms-module/algorithms-miscellaneous-3/src/main/resources/kmeans/lastfm.json diff --git a/algorithms-miscellaneous-3/src/main/resources/kmeans/radial.html b/algorithms-module/algorithms-miscellaneous-3/src/main/resources/kmeans/radial.html similarity index 100% rename from algorithms-miscellaneous-3/src/main/resources/kmeans/radial.html rename to algorithms-module/algorithms-miscellaneous-3/src/main/resources/kmeans/radial.html diff --git a/algorithms-miscellaneous-3/src/main/resources/logback.xml b/algorithms-module/algorithms-miscellaneous-3/src/main/resources/logback.xml similarity index 100% rename from algorithms-miscellaneous-3/src/main/resources/logback.xml rename to algorithms-module/algorithms-miscellaneous-3/src/main/resources/logback.xml diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/analysis/AnalysisRunnerLiveTest.java b/algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/analysis/AnalysisRunnerLiveTest.java similarity index 100% rename from algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/analysis/AnalysisRunnerLiveTest.java rename to algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/analysis/AnalysisRunnerLiveTest.java diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/checksortedlist/SortedListCheckerUnitTest.java b/algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/checksortedlist/SortedListCheckerUnitTest.java similarity index 100% rename from algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/checksortedlist/SortedListCheckerUnitTest.java rename to algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/checksortedlist/SortedListCheckerUnitTest.java diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/enumstatemachine/LeaveRequestStateUnitTest.java b/algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/enumstatemachine/LeaveRequestStateUnitTest.java similarity index 100% rename from algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/enumstatemachine/LeaveRequestStateUnitTest.java rename to algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/enumstatemachine/LeaveRequestStateUnitTest.java diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/graphcycledetection/GraphCycleDetectionUnitTest.java b/algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/graphcycledetection/GraphCycleDetectionUnitTest.java similarity index 100% rename from algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/graphcycledetection/GraphCycleDetectionUnitTest.java rename to algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/graphcycledetection/GraphCycleDetectionUnitTest.java diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamplesUnitTest.java b/algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamplesUnitTest.java similarity index 100% rename from algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamplesUnitTest.java rename to algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamplesUnitTest.java diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/romannumerals/RomanArabicConverterUnitTest.java b/algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/romannumerals/RomanArabicConverterUnitTest.java similarity index 100% rename from algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/romannumerals/RomanArabicConverterUnitTest.java rename to algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/romannumerals/RomanArabicConverterUnitTest.java diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddleUnitTest.java b/algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddleUnitTest.java similarity index 100% rename from algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddleUnitTest.java rename to algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddleUnitTest.java diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/RotateArrayUnitTest.java b/algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/RotateArrayUnitTest.java similarity index 100% rename from algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/RotateArrayUnitTest.java rename to algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/RotateArrayUnitTest.java diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/TwoSumUnitTest.java b/algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/TwoSumUnitTest.java similarity index 100% rename from algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/TwoSumUnitTest.java rename to algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/TwoSumUnitTest.java diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterStatistics.java b/algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterStatistics.java similarity index 100% rename from algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterStatistics.java rename to algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterStatistics.java diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUnitTest.java b/algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUnitTest.java similarity index 100% rename from algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUnitTest.java rename to algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUnitTest.java diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUtil.java b/algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUtil.java similarity index 100% rename from algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUtil.java rename to algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUtil.java diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/folding/FoldingHashUnitTest.java b/algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/folding/FoldingHashUnitTest.java similarity index 100% rename from algorithms-miscellaneous-3/src/test/java/com/baeldung/folding/FoldingHashUnitTest.java rename to algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/folding/FoldingHashUnitTest.java From c6f3e940412978e490e03e153cd7f3aa4f30e847 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Fri, 20 May 2022 20:28:36 +0530 Subject: [PATCH 237/278] JAVA-12097: moved algorithms-miscellaneous-4 inside algorithms-module --- .../algorithms-miscellaneous-4}/README.md | 0 .../algorithms-miscellaneous-4}/pom.xml | 2 +- .../algorithms/middleelementlookup/MiddleElementLookup.java | 0 .../java/com/baeldung/algorithms/middleelementlookup/Node.java | 0 .../main/java/com/baeldung/algorithms/multiswarm/Constants.java | 0 .../com/baeldung/algorithms/multiswarm/FitnessFunction.java | 0 .../java/com/baeldung/algorithms/multiswarm/Multiswarm.java | 0 .../main/java/com/baeldung/algorithms/multiswarm/Particle.java | 0 .../src/main/java/com/baeldung/algorithms/multiswarm/Swarm.java | 0 .../java/com/baeldung/algorithms/permutation/Permutation.java | 0 .../smallestinteger/SmallestMissingPositiveInteger.java | 0 .../com/baeldung/algorithms/string/EnglishAlphabetLetters.java | 0 .../string/LongestSubstringNonRepeatingCharacters.java | 0 .../com/baeldung/algorithms/string/SubstringPalindrome.java | 0 .../algorithms-miscellaneous-4}/src/main/resources/logback.xml | 0 .../com/baeldung/algorithms/MiddleElementLookupUnitTest.java | 0 .../com/baeldung/algorithms/multiswarm/LolFitnessFunction.java | 0 .../com/baeldung/algorithms/multiswarm/MultiswarmUnitTest.java | 0 .../smallestinteger/SmallestMissingPositiveIntegerUnitTest.java | 0 .../algorithms/string/EnglishAlphabetLettersUnitTest.java | 0 .../string/LongestSubstringNonRepeatingCharactersUnitTest.java | 0 .../baeldung/algorithms/string/SubstringPalindromeUnitTest.java | 0 .../test/java/com/baeldung/algorithms/support/MayFailRule.java | 0 23 files changed, 1 insertion(+), 1 deletion(-) rename {algorithms-miscellaneous-4 => algorithms-module/algorithms-miscellaneous-4}/README.md (100%) rename {algorithms-miscellaneous-4 => algorithms-module/algorithms-miscellaneous-4}/pom.xml (95%) rename {algorithms-miscellaneous-4 => algorithms-module/algorithms-miscellaneous-4}/src/main/java/com/baeldung/algorithms/middleelementlookup/MiddleElementLookup.java (100%) rename {algorithms-miscellaneous-4 => algorithms-module/algorithms-miscellaneous-4}/src/main/java/com/baeldung/algorithms/middleelementlookup/Node.java (100%) rename {algorithms-miscellaneous-4 => algorithms-module/algorithms-miscellaneous-4}/src/main/java/com/baeldung/algorithms/multiswarm/Constants.java (100%) rename {algorithms-miscellaneous-4 => algorithms-module/algorithms-miscellaneous-4}/src/main/java/com/baeldung/algorithms/multiswarm/FitnessFunction.java (100%) rename {algorithms-miscellaneous-4 => algorithms-module/algorithms-miscellaneous-4}/src/main/java/com/baeldung/algorithms/multiswarm/Multiswarm.java (100%) rename {algorithms-miscellaneous-4 => algorithms-module/algorithms-miscellaneous-4}/src/main/java/com/baeldung/algorithms/multiswarm/Particle.java (100%) rename {algorithms-miscellaneous-4 => algorithms-module/algorithms-miscellaneous-4}/src/main/java/com/baeldung/algorithms/multiswarm/Swarm.java (100%) rename {algorithms-miscellaneous-4 => algorithms-module/algorithms-miscellaneous-4}/src/main/java/com/baeldung/algorithms/permutation/Permutation.java (100%) rename {algorithms-miscellaneous-4 => algorithms-module/algorithms-miscellaneous-4}/src/main/java/com/baeldung/algorithms/smallestinteger/SmallestMissingPositiveInteger.java (100%) rename {algorithms-miscellaneous-4 => algorithms-module/algorithms-miscellaneous-4}/src/main/java/com/baeldung/algorithms/string/EnglishAlphabetLetters.java (100%) rename {algorithms-miscellaneous-4 => algorithms-module/algorithms-miscellaneous-4}/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java (100%) rename {algorithms-miscellaneous-4 => algorithms-module/algorithms-miscellaneous-4}/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java (100%) rename {algorithms-miscellaneous-4 => algorithms-module/algorithms-miscellaneous-4}/src/main/resources/logback.xml (100%) rename {algorithms-miscellaneous-4 => algorithms-module/algorithms-miscellaneous-4}/src/test/java/com/baeldung/algorithms/MiddleElementLookupUnitTest.java (100%) rename {algorithms-miscellaneous-4 => algorithms-module/algorithms-miscellaneous-4}/src/test/java/com/baeldung/algorithms/multiswarm/LolFitnessFunction.java (100%) rename {algorithms-miscellaneous-4 => algorithms-module/algorithms-miscellaneous-4}/src/test/java/com/baeldung/algorithms/multiswarm/MultiswarmUnitTest.java (100%) rename {algorithms-miscellaneous-4 => algorithms-module/algorithms-miscellaneous-4}/src/test/java/com/baeldung/algorithms/smallestinteger/SmallestMissingPositiveIntegerUnitTest.java (100%) rename {algorithms-miscellaneous-4 => algorithms-module/algorithms-miscellaneous-4}/src/test/java/com/baeldung/algorithms/string/EnglishAlphabetLettersUnitTest.java (100%) rename {algorithms-miscellaneous-4 => algorithms-module/algorithms-miscellaneous-4}/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java (100%) rename {algorithms-miscellaneous-4 => algorithms-module/algorithms-miscellaneous-4}/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java (100%) rename {algorithms-miscellaneous-4 => algorithms-module/algorithms-miscellaneous-4}/src/test/java/com/baeldung/algorithms/support/MayFailRule.java (100%) diff --git a/algorithms-miscellaneous-4/README.md b/algorithms-module/algorithms-miscellaneous-4/README.md similarity index 100% rename from algorithms-miscellaneous-4/README.md rename to algorithms-module/algorithms-miscellaneous-4/README.md diff --git a/algorithms-miscellaneous-4/pom.xml b/algorithms-module/algorithms-miscellaneous-4/pom.xml similarity index 95% rename from algorithms-miscellaneous-4/pom.xml rename to algorithms-module/algorithms-miscellaneous-4/pom.xml index 1dc9a62f64..ed752a6b41 100644 --- a/algorithms-miscellaneous-4/pom.xml +++ b/algorithms-module/algorithms-miscellaneous-4/pom.xml @@ -9,7 +9,7 @@ com.baeldung - parent-modules + algorithms-modules 1.0.0-SNAPSHOT diff --git a/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/MiddleElementLookup.java b/algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/MiddleElementLookup.java similarity index 100% rename from algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/MiddleElementLookup.java rename to algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/MiddleElementLookup.java diff --git a/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/Node.java b/algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/Node.java similarity index 100% rename from algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/Node.java rename to algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/Node.java diff --git a/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Constants.java b/algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Constants.java similarity index 100% rename from algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Constants.java rename to algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Constants.java diff --git a/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/FitnessFunction.java b/algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/FitnessFunction.java similarity index 100% rename from algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/FitnessFunction.java rename to algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/FitnessFunction.java diff --git a/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Multiswarm.java b/algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Multiswarm.java similarity index 100% rename from algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Multiswarm.java rename to algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Multiswarm.java diff --git a/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Particle.java b/algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Particle.java similarity index 100% rename from algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Particle.java rename to algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Particle.java diff --git a/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Swarm.java b/algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Swarm.java similarity index 100% rename from algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Swarm.java rename to algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Swarm.java diff --git a/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/permutation/Permutation.java b/algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/permutation/Permutation.java similarity index 100% rename from algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/permutation/Permutation.java rename to algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/permutation/Permutation.java diff --git a/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/smallestinteger/SmallestMissingPositiveInteger.java b/algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/smallestinteger/SmallestMissingPositiveInteger.java similarity index 100% rename from algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/smallestinteger/SmallestMissingPositiveInteger.java rename to algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/smallestinteger/SmallestMissingPositiveInteger.java diff --git a/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/EnglishAlphabetLetters.java b/algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/EnglishAlphabetLetters.java similarity index 100% rename from algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/EnglishAlphabetLetters.java rename to algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/EnglishAlphabetLetters.java diff --git a/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java b/algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java similarity index 100% rename from algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java rename to algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java diff --git a/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java b/algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java similarity index 100% rename from algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java rename to algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java diff --git a/algorithms-miscellaneous-4/src/main/resources/logback.xml b/algorithms-module/algorithms-miscellaneous-4/src/main/resources/logback.xml similarity index 100% rename from algorithms-miscellaneous-4/src/main/resources/logback.xml rename to algorithms-module/algorithms-miscellaneous-4/src/main/resources/logback.xml diff --git a/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/MiddleElementLookupUnitTest.java b/algorithms-module/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/MiddleElementLookupUnitTest.java similarity index 100% rename from algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/MiddleElementLookupUnitTest.java rename to algorithms-module/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/MiddleElementLookupUnitTest.java diff --git a/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/LolFitnessFunction.java b/algorithms-module/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/LolFitnessFunction.java similarity index 100% rename from algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/LolFitnessFunction.java rename to algorithms-module/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/LolFitnessFunction.java diff --git a/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/MultiswarmUnitTest.java b/algorithms-module/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/MultiswarmUnitTest.java similarity index 100% rename from algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/MultiswarmUnitTest.java rename to algorithms-module/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/MultiswarmUnitTest.java diff --git a/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/smallestinteger/SmallestMissingPositiveIntegerUnitTest.java b/algorithms-module/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/smallestinteger/SmallestMissingPositiveIntegerUnitTest.java similarity index 100% rename from algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/smallestinteger/SmallestMissingPositiveIntegerUnitTest.java rename to algorithms-module/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/smallestinteger/SmallestMissingPositiveIntegerUnitTest.java diff --git a/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/EnglishAlphabetLettersUnitTest.java b/algorithms-module/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/EnglishAlphabetLettersUnitTest.java similarity index 100% rename from algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/EnglishAlphabetLettersUnitTest.java rename to algorithms-module/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/EnglishAlphabetLettersUnitTest.java diff --git a/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java b/algorithms-module/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java similarity index 100% rename from algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java rename to algorithms-module/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java diff --git a/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java b/algorithms-module/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java similarity index 100% rename from algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java rename to algorithms-module/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java diff --git a/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/support/MayFailRule.java b/algorithms-module/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/support/MayFailRule.java similarity index 100% rename from algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/support/MayFailRule.java rename to algorithms-module/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/support/MayFailRule.java From ff86f70a1039b28410b65701cda5a261fd9badc6 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Fri, 20 May 2022 20:29:14 +0530 Subject: [PATCH 238/278] JAVA-12097: moved algorithms-miscellaneous-5 inside algorithms-module --- .../algorithms-miscellaneous-5}/README.md | 0 .../algorithms-miscellaneous-5}/pom.xml | 2 +- .../algorithms/balancedbinarytree/BalancedBinaryTree.java | 0 .../java/com/baeldung/algorithms/balancedbinarytree/Tree.java | 0 .../main/java/com/baeldung/algorithms/binarygap/BinaryGap.java | 0 .../com/baeldung/algorithms/combinatorics/Combinatorics.java | 0 .../com/baeldung/algorithms/conversion/HexStringConverter.java | 0 .../algorithms/integerstreammedian/MedianOfIntegerStream.java | 0 .../algorithms/integerstreammedian/MedianOfIntegerStream2.java | 0 .../main/java/com/baeldung/algorithms/knapsack/Knapsack.java | 0 .../algorithms/maximumsubarray/BruteForceAlgorithm.java | 0 .../baeldung/algorithms/maximumsubarray/KadaneAlgorithm.java | 0 .../com/baeldung/algorithms/mergesortedarrays/SortedArrays.java | 0 .../src/main/java/com/baeldung/algorithms/prim/Edge.java | 0 .../src/main/java/com/baeldung/algorithms/prim/Prim.java | 0 .../src/main/java/com/baeldung/algorithms/prim/Vertex.java | 0 .../baeldung/algorithms/relativelyprime/RelativelyPrime.java | 0 .../java/com/baeldung/algorithms/reversingtree/TreeNode.java | 0 .../com/baeldung/algorithms/reversingtree/TreeReverser.java | 0 .../algorithms-miscellaneous-5}/src/main/resources/logback.xml | 0 .../balancedbinarytree/BalancedBinaryTreeUnitTest.java | 0 .../algorithms/balancedbinarytree/BinaryTreeDataProvider.java | 0 .../com/baeldung/algorithms/binarygap/BinaryGapUnitTest.java | 0 .../algorithms/combinatorics/CombinatoricsUnitTest.java | 0 .../algorithms/conversion/ByteArrayConverterUnitTest.java | 0 .../integerstreammedian/MedianOfIntegerStreamUnitTest.java | 0 .../java/com/baeldung/algorithms/knapsack/KnapsackUnitTest.java | 0 .../algorithms/maximumsubarray/BruteForceAlgorithmUnitTest.java | 0 .../algorithms/maximumsubarray/KadaneAlgorithmUnitTest.java | 0 .../algorithms/mergesortedarrays/SortedArraysUnitTest.java | 0 .../test/java/com/baeldung/algorithms/prim/PrimUnitTest.java | 0 .../algorithms/relativelyprime/RelativelyPrimeUnitTest.java | 0 .../baeldung/algorithms/reversingtree/TreeReverserUnitTest.java | 0 .../algorithms-miscellaneous-5}/src/test/resources/input.json | 0 34 files changed, 1 insertion(+), 1 deletion(-) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/README.md (100%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/pom.xml (96%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/src/main/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTree.java (100%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/src/main/java/com/baeldung/algorithms/balancedbinarytree/Tree.java (100%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/src/main/java/com/baeldung/algorithms/binarygap/BinaryGap.java (100%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/src/main/java/com/baeldung/algorithms/combinatorics/Combinatorics.java (100%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java (100%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/src/main/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStream.java (100%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/src/main/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStream2.java (100%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/src/main/java/com/baeldung/algorithms/knapsack/Knapsack.java (100%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/src/main/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithm.java (100%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/src/main/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithm.java (100%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/src/main/java/com/baeldung/algorithms/mergesortedarrays/SortedArrays.java (100%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/src/main/java/com/baeldung/algorithms/prim/Edge.java (100%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/src/main/java/com/baeldung/algorithms/prim/Prim.java (100%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/src/main/java/com/baeldung/algorithms/prim/Vertex.java (100%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/src/main/java/com/baeldung/algorithms/relativelyprime/RelativelyPrime.java (100%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/src/main/java/com/baeldung/algorithms/reversingtree/TreeNode.java (100%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/src/main/java/com/baeldung/algorithms/reversingtree/TreeReverser.java (100%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/src/main/resources/logback.xml (100%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/src/test/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTreeUnitTest.java (100%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/src/test/java/com/baeldung/algorithms/balancedbinarytree/BinaryTreeDataProvider.java (100%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/src/test/java/com/baeldung/algorithms/binarygap/BinaryGapUnitTest.java (100%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/src/test/java/com/baeldung/algorithms/combinatorics/CombinatoricsUnitTest.java (100%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java (100%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/src/test/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStreamUnitTest.java (100%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/src/test/java/com/baeldung/algorithms/knapsack/KnapsackUnitTest.java (100%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/src/test/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithmUnitTest.java (100%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/src/test/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithmUnitTest.java (100%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/src/test/java/com/baeldung/algorithms/mergesortedarrays/SortedArraysUnitTest.java (100%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/src/test/java/com/baeldung/algorithms/prim/PrimUnitTest.java (100%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/src/test/java/com/baeldung/algorithms/relativelyprime/RelativelyPrimeUnitTest.java (100%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/src/test/java/com/baeldung/algorithms/reversingtree/TreeReverserUnitTest.java (100%) rename {algorithms-miscellaneous-5 => algorithms-module/algorithms-miscellaneous-5}/src/test/resources/input.json (100%) diff --git a/algorithms-miscellaneous-5/README.md b/algorithms-module/algorithms-miscellaneous-5/README.md similarity index 100% rename from algorithms-miscellaneous-5/README.md rename to algorithms-module/algorithms-miscellaneous-5/README.md diff --git a/algorithms-miscellaneous-5/pom.xml b/algorithms-module/algorithms-miscellaneous-5/pom.xml similarity index 96% rename from algorithms-miscellaneous-5/pom.xml rename to algorithms-module/algorithms-miscellaneous-5/pom.xml index 7ceede9cb9..26b445555b 100644 --- a/algorithms-miscellaneous-5/pom.xml +++ b/algorithms-module/algorithms-miscellaneous-5/pom.xml @@ -9,7 +9,7 @@ com.baeldung - parent-modules + algorithms-modules 1.0.0-SNAPSHOT diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTree.java b/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTree.java similarity index 100% rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTree.java rename to algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTree.java diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/balancedbinarytree/Tree.java b/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/balancedbinarytree/Tree.java similarity index 100% rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/balancedbinarytree/Tree.java rename to algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/balancedbinarytree/Tree.java diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/binarygap/BinaryGap.java b/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/binarygap/BinaryGap.java similarity index 100% rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/binarygap/BinaryGap.java rename to algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/binarygap/BinaryGap.java diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/combinatorics/Combinatorics.java b/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/combinatorics/Combinatorics.java similarity index 100% rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/combinatorics/Combinatorics.java rename to algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/combinatorics/Combinatorics.java diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java b/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java similarity index 100% rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java rename to algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStream.java b/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStream.java similarity index 100% rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStream.java rename to algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStream.java diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStream2.java b/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStream2.java similarity index 100% rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStream2.java rename to algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStream2.java diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/knapsack/Knapsack.java b/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/knapsack/Knapsack.java similarity index 100% rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/knapsack/Knapsack.java rename to algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/knapsack/Knapsack.java diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithm.java b/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithm.java similarity index 100% rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithm.java rename to algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithm.java diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithm.java b/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithm.java similarity index 100% rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithm.java rename to algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithm.java diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/mergesortedarrays/SortedArrays.java b/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/mergesortedarrays/SortedArrays.java similarity index 100% rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/mergesortedarrays/SortedArrays.java rename to algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/mergesortedarrays/SortedArrays.java diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Edge.java b/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Edge.java similarity index 100% rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Edge.java rename to algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Edge.java diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java b/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java similarity index 100% rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java rename to algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java b/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java similarity index 100% rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java rename to algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/relativelyprime/RelativelyPrime.java b/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/relativelyprime/RelativelyPrime.java similarity index 100% rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/relativelyprime/RelativelyPrime.java rename to algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/relativelyprime/RelativelyPrime.java diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeNode.java b/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeNode.java similarity index 100% rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeNode.java rename to algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeNode.java diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeReverser.java b/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeReverser.java similarity index 100% rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeReverser.java rename to algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeReverser.java diff --git a/algorithms-miscellaneous-5/src/main/resources/logback.xml b/algorithms-module/algorithms-miscellaneous-5/src/main/resources/logback.xml similarity index 100% rename from algorithms-miscellaneous-5/src/main/resources/logback.xml rename to algorithms-module/algorithms-miscellaneous-5/src/main/resources/logback.xml diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTreeUnitTest.java b/algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTreeUnitTest.java similarity index 100% rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTreeUnitTest.java rename to algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTreeUnitTest.java diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbinarytree/BinaryTreeDataProvider.java b/algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbinarytree/BinaryTreeDataProvider.java similarity index 100% rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbinarytree/BinaryTreeDataProvider.java rename to algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbinarytree/BinaryTreeDataProvider.java diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/binarygap/BinaryGapUnitTest.java b/algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/binarygap/BinaryGapUnitTest.java similarity index 100% rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/binarygap/BinaryGapUnitTest.java rename to algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/binarygap/BinaryGapUnitTest.java diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/combinatorics/CombinatoricsUnitTest.java b/algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/combinatorics/CombinatoricsUnitTest.java similarity index 100% rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/combinatorics/CombinatoricsUnitTest.java rename to algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/combinatorics/CombinatoricsUnitTest.java diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java b/algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java similarity index 100% rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java rename to algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStreamUnitTest.java b/algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStreamUnitTest.java similarity index 100% rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStreamUnitTest.java rename to algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStreamUnitTest.java diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/knapsack/KnapsackUnitTest.java b/algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/knapsack/KnapsackUnitTest.java similarity index 100% rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/knapsack/KnapsackUnitTest.java rename to algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/knapsack/KnapsackUnitTest.java diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithmUnitTest.java b/algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithmUnitTest.java similarity index 100% rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithmUnitTest.java rename to algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithmUnitTest.java diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithmUnitTest.java b/algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithmUnitTest.java similarity index 100% rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithmUnitTest.java rename to algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithmUnitTest.java diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/mergesortedarrays/SortedArraysUnitTest.java b/algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/mergesortedarrays/SortedArraysUnitTest.java similarity index 100% rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/mergesortedarrays/SortedArraysUnitTest.java rename to algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/mergesortedarrays/SortedArraysUnitTest.java diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimUnitTest.java b/algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimUnitTest.java similarity index 100% rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimUnitTest.java rename to algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimUnitTest.java diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/relativelyprime/RelativelyPrimeUnitTest.java b/algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/relativelyprime/RelativelyPrimeUnitTest.java similarity index 100% rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/relativelyprime/RelativelyPrimeUnitTest.java rename to algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/relativelyprime/RelativelyPrimeUnitTest.java diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/reversingtree/TreeReverserUnitTest.java b/algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/reversingtree/TreeReverserUnitTest.java similarity index 100% rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/reversingtree/TreeReverserUnitTest.java rename to algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/reversingtree/TreeReverserUnitTest.java diff --git a/algorithms-miscellaneous-5/src/test/resources/input.json b/algorithms-module/algorithms-miscellaneous-5/src/test/resources/input.json similarity index 100% rename from algorithms-miscellaneous-5/src/test/resources/input.json rename to algorithms-module/algorithms-miscellaneous-5/src/test/resources/input.json From 02de2268ec3b9a116928648be5610c739a0b58af Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Fri, 20 May 2022 20:29:42 +0530 Subject: [PATCH 239/278] JAVA-12097: moved algorithms-miscellaneous-6 inside algorithms-module --- .../algorithms-miscellaneous-6}/README.md | 0 .../algorithms-miscellaneous-6}/pom.xml | 2 +- .../algorithms/balancedbrackets/BalancedBracketsUsingDeque.java | 0 .../balancedbrackets/BalancedBracketsUsingString.java | 0 .../main/java/com/baeldung/algorithms/boruvka/BoruvkaMST.java | 0 .../main/java/com/baeldung/algorithms/boruvka/UnionFind.java | 0 .../java/com/baeldung/algorithms/caesarcipher/CaesarCipher.java | 0 .../baeldung/algorithms/gradientdescent/GradientDescent.java | 0 .../src/main/java/com/baeldung/algorithms/greedy/Follower.java | 0 .../main/java/com/baeldung/algorithms/greedy/FollowersPath.java | 0 .../java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java | 0 .../java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java | 0 .../java/com/baeldung/algorithms/greedy/SocialConnector.java | 0 .../main/java/com/baeldung/algorithms/greedy/SocialUser.java | 0 .../java/com/baeldung/algorithms/kruskal/CycleDetector.java | 0 .../java/com/baeldung/algorithms/kruskal/DisjointSetInfo.java | 0 .../src/main/java/com/baeldung/algorithms/kruskal/Kruskal.java | 0 .../com/baeldung/algorithms/linkedlist/LinkedListReversal.java | 0 .../main/java/com/baeldung/algorithms/linkedlist/ListNode.java | 0 .../java/com/baeldung/algorithms/minheapmerge/HeapNode.java | 0 .../main/java/com/baeldung/algorithms/minheapmerge/MinHeap.java | 0 .../src/main/java/com/baeldung/algorithms/play2048/Board.java | 0 .../src/main/java/com/baeldung/algorithms/play2048/Cell.java | 0 .../main/java/com/baeldung/algorithms/play2048/Computer.java | 0 .../src/main/java/com/baeldung/algorithms/play2048/Human.java | 0 .../src/main/java/com/baeldung/algorithms/play2048/Move.java | 0 .../main/java/com/baeldung/algorithms/play2048/Play2048.java | 0 .../algorithms/topkelements/BruteForceTopKElementsFinder.java | 0 .../algorithms/topkelements/MaxHeapTopKElementsFinder.java | 0 .../baeldung/algorithms/topkelements/TopKElementsFinder.java | 0 .../algorithms/topkelements/TreeSetTopKElementsFinder.java | 0 .../algorithms-miscellaneous-6}/src/main/resources/logback.xml | 0 .../balancedbrackets/BalancedBracketsUsingDequeUnitTest.java | 0 .../balancedbrackets/BalancedBracketsUsingStringUnitTest.java | 0 .../java/com/baeldung/algorithms/boruvka/BoruvkaUnitTest.java | 0 .../baeldung/algorithms/caesarcipher/CaesarCipherUnitTest.java | 0 .../algorithms/gradientdescent/GradientDescentUnitTest.java | 0 .../com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java | 0 .../java/com/baeldung/algorithms/kruskal/KruskalUnitTest.java | 0 .../algorithms/linkedlist/LinkedListReversalUnitTest.java | 0 .../com/baeldung/algorithms/minheapmerge/MinHeapUnitTest.java | 0 .../algorithms/topkelements/TopKElementsFinderUnitTest.java | 0 42 files changed, 1 insertion(+), 1 deletion(-) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/README.md (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/pom.xml (96%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDeque.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingString.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/boruvka/BoruvkaMST.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/boruvka/UnionFind.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/caesarcipher/CaesarCipher.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/gradientdescent/GradientDescent.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/greedy/Follower.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/kruskal/CycleDetector.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/kruskal/DisjointSetInfo.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/kruskal/Kruskal.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/linkedlist/LinkedListReversal.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/linkedlist/ListNode.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/minheapmerge/HeapNode.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/minheapmerge/MinHeap.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/play2048/Board.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/play2048/Cell.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/play2048/Computer.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/play2048/Human.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/play2048/Move.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/play2048/Play2048.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/topkelements/BruteForceTopKElementsFinder.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/topkelements/MaxHeapTopKElementsFinder.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/topkelements/TopKElementsFinder.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/topkelements/TreeSetTopKElementsFinder.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/main/resources/logback.xml (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/test/java/com/baeldung/algorithms/boruvka/BoruvkaUnitTest.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/test/java/com/baeldung/algorithms/caesarcipher/CaesarCipherUnitTest.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/test/java/com/baeldung/algorithms/gradientdescent/GradientDescentUnitTest.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/test/java/com/baeldung/algorithms/kruskal/KruskalUnitTest.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/test/java/com/baeldung/algorithms/linkedlist/LinkedListReversalUnitTest.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/test/java/com/baeldung/algorithms/minheapmerge/MinHeapUnitTest.java (100%) rename {algorithms-miscellaneous-6 => algorithms-module/algorithms-miscellaneous-6}/src/test/java/com/baeldung/algorithms/topkelements/TopKElementsFinderUnitTest.java (100%) diff --git a/algorithms-miscellaneous-6/README.md b/algorithms-module/algorithms-miscellaneous-6/README.md similarity index 100% rename from algorithms-miscellaneous-6/README.md rename to algorithms-module/algorithms-miscellaneous-6/README.md diff --git a/algorithms-miscellaneous-6/pom.xml b/algorithms-module/algorithms-miscellaneous-6/pom.xml similarity index 96% rename from algorithms-miscellaneous-6/pom.xml rename to algorithms-module/algorithms-miscellaneous-6/pom.xml index 584ec8a8dd..34eae2e2b9 100644 --- a/algorithms-miscellaneous-6/pom.xml +++ b/algorithms-module/algorithms-miscellaneous-6/pom.xml @@ -9,7 +9,7 @@ com.baeldung - parent-modules + algorithms-modules 1.0.0-SNAPSHOT diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDeque.java b/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDeque.java similarity index 100% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDeque.java rename to algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDeque.java diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingString.java b/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingString.java similarity index 100% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingString.java rename to algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingString.java diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/BoruvkaMST.java b/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/BoruvkaMST.java similarity index 100% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/BoruvkaMST.java rename to algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/BoruvkaMST.java diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/UnionFind.java b/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/UnionFind.java similarity index 100% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/UnionFind.java rename to algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/UnionFind.java diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/caesarcipher/CaesarCipher.java b/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/caesarcipher/CaesarCipher.java similarity index 100% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/caesarcipher/CaesarCipher.java rename to algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/caesarcipher/CaesarCipher.java diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/gradientdescent/GradientDescent.java b/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/gradientdescent/GradientDescent.java similarity index 100% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/gradientdescent/GradientDescent.java rename to algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/gradientdescent/GradientDescent.java diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/Follower.java b/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/Follower.java similarity index 100% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/Follower.java rename to algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/Follower.java diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java b/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java similarity index 100% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java rename to algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java b/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java similarity index 100% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java rename to algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java b/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java similarity index 100% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java rename to algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java b/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java similarity index 100% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java rename to algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java b/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java similarity index 100% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java rename to algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/CycleDetector.java b/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/CycleDetector.java similarity index 100% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/CycleDetector.java rename to algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/CycleDetector.java diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/DisjointSetInfo.java b/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/DisjointSetInfo.java similarity index 100% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/DisjointSetInfo.java rename to algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/DisjointSetInfo.java diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/Kruskal.java b/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/Kruskal.java similarity index 100% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/Kruskal.java rename to algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/Kruskal.java diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/LinkedListReversal.java b/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/LinkedListReversal.java similarity index 100% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/LinkedListReversal.java rename to algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/LinkedListReversal.java diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/ListNode.java b/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/ListNode.java similarity index 100% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/ListNode.java rename to algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/ListNode.java diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/minheapmerge/HeapNode.java b/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/minheapmerge/HeapNode.java similarity index 100% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/minheapmerge/HeapNode.java rename to algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/minheapmerge/HeapNode.java diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/minheapmerge/MinHeap.java b/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/minheapmerge/MinHeap.java similarity index 100% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/minheapmerge/MinHeap.java rename to algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/minheapmerge/MinHeap.java diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Board.java b/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Board.java similarity index 100% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Board.java rename to algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Board.java diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Cell.java b/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Cell.java similarity index 100% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Cell.java rename to algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Cell.java diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Computer.java b/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Computer.java similarity index 100% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Computer.java rename to algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Computer.java diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Human.java b/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Human.java similarity index 100% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Human.java rename to algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Human.java diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Move.java b/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Move.java similarity index 100% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Move.java rename to algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Move.java diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Play2048.java b/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Play2048.java similarity index 100% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Play2048.java rename to algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Play2048.java diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/BruteForceTopKElementsFinder.java b/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/BruteForceTopKElementsFinder.java similarity index 100% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/BruteForceTopKElementsFinder.java rename to algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/BruteForceTopKElementsFinder.java diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/MaxHeapTopKElementsFinder.java b/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/MaxHeapTopKElementsFinder.java similarity index 100% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/MaxHeapTopKElementsFinder.java rename to algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/MaxHeapTopKElementsFinder.java diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/TopKElementsFinder.java b/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/TopKElementsFinder.java similarity index 100% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/TopKElementsFinder.java rename to algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/TopKElementsFinder.java diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/TreeSetTopKElementsFinder.java b/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/TreeSetTopKElementsFinder.java similarity index 100% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/TreeSetTopKElementsFinder.java rename to algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/TreeSetTopKElementsFinder.java diff --git a/algorithms-miscellaneous-6/src/main/resources/logback.xml b/algorithms-module/algorithms-miscellaneous-6/src/main/resources/logback.xml similarity index 100% rename from algorithms-miscellaneous-6/src/main/resources/logback.xml rename to algorithms-module/algorithms-miscellaneous-6/src/main/resources/logback.xml diff --git a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java b/algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java similarity index 100% rename from algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java rename to algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java diff --git a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java b/algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java similarity index 100% rename from algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java rename to algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java diff --git a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/boruvka/BoruvkaUnitTest.java b/algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/boruvka/BoruvkaUnitTest.java similarity index 100% rename from algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/boruvka/BoruvkaUnitTest.java rename to algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/boruvka/BoruvkaUnitTest.java diff --git a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/caesarcipher/CaesarCipherUnitTest.java b/algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/caesarcipher/CaesarCipherUnitTest.java similarity index 100% rename from algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/caesarcipher/CaesarCipherUnitTest.java rename to algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/caesarcipher/CaesarCipherUnitTest.java diff --git a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/gradientdescent/GradientDescentUnitTest.java b/algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/gradientdescent/GradientDescentUnitTest.java similarity index 100% rename from algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/gradientdescent/GradientDescentUnitTest.java rename to algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/gradientdescent/GradientDescentUnitTest.java diff --git a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java b/algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java similarity index 100% rename from algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java rename to algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java diff --git a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/kruskal/KruskalUnitTest.java b/algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/kruskal/KruskalUnitTest.java similarity index 100% rename from algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/kruskal/KruskalUnitTest.java rename to algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/kruskal/KruskalUnitTest.java diff --git a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/linkedlist/LinkedListReversalUnitTest.java b/algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/linkedlist/LinkedListReversalUnitTest.java similarity index 100% rename from algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/linkedlist/LinkedListReversalUnitTest.java rename to algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/linkedlist/LinkedListReversalUnitTest.java diff --git a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/minheapmerge/MinHeapUnitTest.java b/algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/minheapmerge/MinHeapUnitTest.java similarity index 100% rename from algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/minheapmerge/MinHeapUnitTest.java rename to algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/minheapmerge/MinHeapUnitTest.java diff --git a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/topkelements/TopKElementsFinderUnitTest.java b/algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/topkelements/TopKElementsFinderUnitTest.java similarity index 100% rename from algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/topkelements/TopKElementsFinderUnitTest.java rename to algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/topkelements/TopKElementsFinderUnitTest.java From edb880df59830be9c352bf977cbd7703e7822822 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Fri, 20 May 2022 20:30:20 +0530 Subject: [PATCH 240/278] JAVA-12097: moved algorithms-searching inside algorithms-module --- .../algorithms-searching}/README.md | 0 .../algorithms-searching}/pom.xml | 2 +- .../java/com/baeldung/algorithms/binarysearch/BinarySearch.java | 0 .../breadthfirstsearch/BreadthFirstSearchAlgorithm.java | 0 .../java/com/baeldung/algorithms/breadthfirstsearch/Node.java | 0 .../java/com/baeldung/algorithms/breadthfirstsearch/Tree.java | 0 .../src/main/java/com/baeldung/algorithms/dfs/BinaryTree.java | 0 .../src/main/java/com/baeldung/algorithms/dfs/Graph.java | 0 .../algorithms/interpolationsearch/InterpolationSearch.java | 0 .../java/com/baeldung/algorithms/kthsmallest/KthSmallest.java | 0 .../algorithms/mcts/montecarlo/MonteCarloTreeSearch.java | 0 .../java/com/baeldung/algorithms/mcts/montecarlo/State.java | 0 .../main/java/com/baeldung/algorithms/mcts/montecarlo/UCT.java | 0 .../main/java/com/baeldung/algorithms/mcts/tictactoe/Board.java | 0 .../java/com/baeldung/algorithms/mcts/tictactoe/Position.java | 0 .../src/main/java/com/baeldung/algorithms/mcts/tree/Node.java | 0 .../src/main/java/com/baeldung/algorithms/mcts/tree/Tree.java | 0 .../src/main/java/com/baeldung/algorithms/quadtree/Point.java | 0 .../main/java/com/baeldung/algorithms/quadtree/QuadTree.java | 0 .../src/main/java/com/baeldung/algorithms/quadtree/Region.java | 0 .../src/main/java/com/baeldung/algorithms/suffixtree/Node.java | 0 .../java/com/baeldung/algorithms/suffixtree/SuffixTree.java | 0 .../baeldung/algorithms/textsearch/TextSearchAlgorithms.java | 0 .../algorithms-searching}/src/main/resources/logback.xml | 0 .../baeldung/algorithms/binarysearch/BinarySearchUnitTest.java | 0 .../breadthfirstsearch/BreadthFirstSearchAlgorithmUnitTest.java | 0 .../java/com/baeldung/algorithms/dfs/BinaryTreeUnitTest.java | 0 .../test/java/com/baeldung/algorithms/dfs/GraphUnitTest.java | 0 .../interpolationsearch/InterpolationSearchUnitTest.java | 0 .../baeldung/algorithms/kthsmallest/KthSmallestUnitTest.java | 0 .../test/java/com/baeldung/algorithms/mcts/MCTSUnitTest.java | 0 .../baeldung/algorithms/quadtree/QuadTreeSearchUnitTest.java | 0 .../com/baeldung/algorithms/suffixtree/SuffixTreeUnitTest.java | 0 .../algorithms/textsearch/TextSearchAlgorithmsUnitTest.java | 0 34 files changed, 1 insertion(+), 1 deletion(-) rename {algorithms-searching => algorithms-module/algorithms-searching}/README.md (100%) rename {algorithms-searching => algorithms-module/algorithms-searching}/pom.xml (93%) rename {algorithms-searching => algorithms-module/algorithms-searching}/src/main/java/com/baeldung/algorithms/binarysearch/BinarySearch.java (100%) rename {algorithms-searching => algorithms-module/algorithms-searching}/src/main/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithm.java (100%) rename {algorithms-searching => algorithms-module/algorithms-searching}/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Node.java (100%) rename {algorithms-searching => algorithms-module/algorithms-searching}/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Tree.java (100%) rename {algorithms-searching => algorithms-module/algorithms-searching}/src/main/java/com/baeldung/algorithms/dfs/BinaryTree.java (100%) rename {algorithms-searching => algorithms-module/algorithms-searching}/src/main/java/com/baeldung/algorithms/dfs/Graph.java (100%) rename {algorithms-searching => algorithms-module/algorithms-searching}/src/main/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearch.java (100%) rename {algorithms-searching => algorithms-module/algorithms-searching}/src/main/java/com/baeldung/algorithms/kthsmallest/KthSmallest.java (100%) rename {algorithms-searching => algorithms-module/algorithms-searching}/src/main/java/com/baeldung/algorithms/mcts/montecarlo/MonteCarloTreeSearch.java (100%) rename {algorithms-searching => algorithms-module/algorithms-searching}/src/main/java/com/baeldung/algorithms/mcts/montecarlo/State.java (100%) rename {algorithms-searching => algorithms-module/algorithms-searching}/src/main/java/com/baeldung/algorithms/mcts/montecarlo/UCT.java (100%) rename {algorithms-searching => algorithms-module/algorithms-searching}/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Board.java (100%) rename {algorithms-searching => algorithms-module/algorithms-searching}/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Position.java (100%) rename {algorithms-searching => algorithms-module/algorithms-searching}/src/main/java/com/baeldung/algorithms/mcts/tree/Node.java (100%) rename {algorithms-searching => algorithms-module/algorithms-searching}/src/main/java/com/baeldung/algorithms/mcts/tree/Tree.java (100%) rename {algorithms-searching => algorithms-module/algorithms-searching}/src/main/java/com/baeldung/algorithms/quadtree/Point.java (100%) rename {algorithms-searching => algorithms-module/algorithms-searching}/src/main/java/com/baeldung/algorithms/quadtree/QuadTree.java (100%) rename {algorithms-searching => algorithms-module/algorithms-searching}/src/main/java/com/baeldung/algorithms/quadtree/Region.java (100%) rename {algorithms-searching => algorithms-module/algorithms-searching}/src/main/java/com/baeldung/algorithms/suffixtree/Node.java (100%) rename {algorithms-searching => algorithms-module/algorithms-searching}/src/main/java/com/baeldung/algorithms/suffixtree/SuffixTree.java (100%) rename {algorithms-searching => algorithms-module/algorithms-searching}/src/main/java/com/baeldung/algorithms/textsearch/TextSearchAlgorithms.java (100%) rename {algorithms-searching => algorithms-module/algorithms-searching}/src/main/resources/logback.xml (100%) rename {algorithms-searching => algorithms-module/algorithms-searching}/src/test/java/com/baeldung/algorithms/binarysearch/BinarySearchUnitTest.java (100%) rename {algorithms-searching => algorithms-module/algorithms-searching}/src/test/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithmUnitTest.java (100%) rename {algorithms-searching => algorithms-module/algorithms-searching}/src/test/java/com/baeldung/algorithms/dfs/BinaryTreeUnitTest.java (100%) rename {algorithms-searching => algorithms-module/algorithms-searching}/src/test/java/com/baeldung/algorithms/dfs/GraphUnitTest.java (100%) rename {algorithms-searching => algorithms-module/algorithms-searching}/src/test/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearchUnitTest.java (100%) rename {algorithms-searching => algorithms-module/algorithms-searching}/src/test/java/com/baeldung/algorithms/kthsmallest/KthSmallestUnitTest.java (100%) rename {algorithms-searching => algorithms-module/algorithms-searching}/src/test/java/com/baeldung/algorithms/mcts/MCTSUnitTest.java (100%) rename {algorithms-searching => algorithms-module/algorithms-searching}/src/test/java/com/baeldung/algorithms/quadtree/QuadTreeSearchUnitTest.java (100%) rename {algorithms-searching => algorithms-module/algorithms-searching}/src/test/java/com/baeldung/algorithms/suffixtree/SuffixTreeUnitTest.java (100%) rename {algorithms-searching => algorithms-module/algorithms-searching}/src/test/java/com/baeldung/algorithms/textsearch/TextSearchAlgorithmsUnitTest.java (100%) diff --git a/algorithms-searching/README.md b/algorithms-module/algorithms-searching/README.md similarity index 100% rename from algorithms-searching/README.md rename to algorithms-module/algorithms-searching/README.md diff --git a/algorithms-searching/pom.xml b/algorithms-module/algorithms-searching/pom.xml similarity index 93% rename from algorithms-searching/pom.xml rename to algorithms-module/algorithms-searching/pom.xml index edb8a0c423..f981b4542f 100644 --- a/algorithms-searching/pom.xml +++ b/algorithms-module/algorithms-searching/pom.xml @@ -9,7 +9,7 @@ com.baeldung - parent-modules + algorithms-modules 1.0.0-SNAPSHOT diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/binarysearch/BinarySearch.java b/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/binarysearch/BinarySearch.java similarity index 100% rename from algorithms-searching/src/main/java/com/baeldung/algorithms/binarysearch/BinarySearch.java rename to algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/binarysearch/BinarySearch.java diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithm.java b/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithm.java similarity index 100% rename from algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithm.java rename to algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithm.java diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Node.java b/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Node.java similarity index 100% rename from algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Node.java rename to algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Node.java diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Tree.java b/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Tree.java similarity index 100% rename from algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Tree.java rename to algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Tree.java diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/dfs/BinaryTree.java b/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/dfs/BinaryTree.java similarity index 100% rename from algorithms-searching/src/main/java/com/baeldung/algorithms/dfs/BinaryTree.java rename to algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/dfs/BinaryTree.java diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/dfs/Graph.java b/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/dfs/Graph.java similarity index 100% rename from algorithms-searching/src/main/java/com/baeldung/algorithms/dfs/Graph.java rename to algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/dfs/Graph.java diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearch.java b/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearch.java similarity index 100% rename from algorithms-searching/src/main/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearch.java rename to algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearch.java diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/kthsmallest/KthSmallest.java b/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/kthsmallest/KthSmallest.java similarity index 100% rename from algorithms-searching/src/main/java/com/baeldung/algorithms/kthsmallest/KthSmallest.java rename to algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/kthsmallest/KthSmallest.java diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/MonteCarloTreeSearch.java b/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/MonteCarloTreeSearch.java similarity index 100% rename from algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/MonteCarloTreeSearch.java rename to algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/MonteCarloTreeSearch.java diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/State.java b/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/State.java similarity index 100% rename from algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/State.java rename to algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/State.java diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/UCT.java b/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/UCT.java similarity index 100% rename from algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/UCT.java rename to algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/UCT.java diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Board.java b/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Board.java similarity index 100% rename from algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Board.java rename to algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Board.java diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Position.java b/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Position.java similarity index 100% rename from algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Position.java rename to algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Position.java diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tree/Node.java b/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tree/Node.java similarity index 100% rename from algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tree/Node.java rename to algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tree/Node.java diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tree/Tree.java b/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tree/Tree.java similarity index 100% rename from algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tree/Tree.java rename to algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tree/Tree.java diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/Point.java b/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/Point.java similarity index 100% rename from algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/Point.java rename to algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/Point.java diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/QuadTree.java b/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/QuadTree.java similarity index 100% rename from algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/QuadTree.java rename to algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/QuadTree.java diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/Region.java b/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/Region.java similarity index 100% rename from algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/Region.java rename to algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/Region.java diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/suffixtree/Node.java b/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/suffixtree/Node.java similarity index 100% rename from algorithms-searching/src/main/java/com/baeldung/algorithms/suffixtree/Node.java rename to algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/suffixtree/Node.java diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/suffixtree/SuffixTree.java b/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/suffixtree/SuffixTree.java similarity index 100% rename from algorithms-searching/src/main/java/com/baeldung/algorithms/suffixtree/SuffixTree.java rename to algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/suffixtree/SuffixTree.java diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/textsearch/TextSearchAlgorithms.java b/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/textsearch/TextSearchAlgorithms.java similarity index 100% rename from algorithms-searching/src/main/java/com/baeldung/algorithms/textsearch/TextSearchAlgorithms.java rename to algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/textsearch/TextSearchAlgorithms.java diff --git a/algorithms-searching/src/main/resources/logback.xml b/algorithms-module/algorithms-searching/src/main/resources/logback.xml similarity index 100% rename from algorithms-searching/src/main/resources/logback.xml rename to algorithms-module/algorithms-searching/src/main/resources/logback.xml diff --git a/algorithms-searching/src/test/java/com/baeldung/algorithms/binarysearch/BinarySearchUnitTest.java b/algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/binarysearch/BinarySearchUnitTest.java similarity index 100% rename from algorithms-searching/src/test/java/com/baeldung/algorithms/binarysearch/BinarySearchUnitTest.java rename to algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/binarysearch/BinarySearchUnitTest.java diff --git a/algorithms-searching/src/test/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithmUnitTest.java b/algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithmUnitTest.java similarity index 100% rename from algorithms-searching/src/test/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithmUnitTest.java rename to algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithmUnitTest.java diff --git a/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/BinaryTreeUnitTest.java b/algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/BinaryTreeUnitTest.java similarity index 100% rename from algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/BinaryTreeUnitTest.java rename to algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/BinaryTreeUnitTest.java diff --git a/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/GraphUnitTest.java b/algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/GraphUnitTest.java similarity index 100% rename from algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/GraphUnitTest.java rename to algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/GraphUnitTest.java diff --git a/algorithms-searching/src/test/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearchUnitTest.java b/algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearchUnitTest.java similarity index 100% rename from algorithms-searching/src/test/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearchUnitTest.java rename to algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearchUnitTest.java diff --git a/algorithms-searching/src/test/java/com/baeldung/algorithms/kthsmallest/KthSmallestUnitTest.java b/algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/kthsmallest/KthSmallestUnitTest.java similarity index 100% rename from algorithms-searching/src/test/java/com/baeldung/algorithms/kthsmallest/KthSmallestUnitTest.java rename to algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/kthsmallest/KthSmallestUnitTest.java diff --git a/algorithms-searching/src/test/java/com/baeldung/algorithms/mcts/MCTSUnitTest.java b/algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/mcts/MCTSUnitTest.java similarity index 100% rename from algorithms-searching/src/test/java/com/baeldung/algorithms/mcts/MCTSUnitTest.java rename to algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/mcts/MCTSUnitTest.java diff --git a/algorithms-searching/src/test/java/com/baeldung/algorithms/quadtree/QuadTreeSearchUnitTest.java b/algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/quadtree/QuadTreeSearchUnitTest.java similarity index 100% rename from algorithms-searching/src/test/java/com/baeldung/algorithms/quadtree/QuadTreeSearchUnitTest.java rename to algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/quadtree/QuadTreeSearchUnitTest.java diff --git a/algorithms-searching/src/test/java/com/baeldung/algorithms/suffixtree/SuffixTreeUnitTest.java b/algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/suffixtree/SuffixTreeUnitTest.java similarity index 100% rename from algorithms-searching/src/test/java/com/baeldung/algorithms/suffixtree/SuffixTreeUnitTest.java rename to algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/suffixtree/SuffixTreeUnitTest.java diff --git a/algorithms-searching/src/test/java/com/baeldung/algorithms/textsearch/TextSearchAlgorithmsUnitTest.java b/algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/textsearch/TextSearchAlgorithmsUnitTest.java similarity index 100% rename from algorithms-searching/src/test/java/com/baeldung/algorithms/textsearch/TextSearchAlgorithmsUnitTest.java rename to algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/textsearch/TextSearchAlgorithmsUnitTest.java From ddb21dd81b44c7ef5d461b1abb6a232dddb73270 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Fri, 20 May 2022 20:30:56 +0530 Subject: [PATCH 241/278] JAVA-12097: moved algorithms-sorting inside algorithms-module --- .../algorithms-sorting}/.gitignore | 0 .../algorithms-sorting}/README.md | 0 .../algorithms-sorting}/pom.xml | 2 +- .../com/baeldung/algorithms/bubblesort/BubbleSort.java | 0 .../algorithms/bucketsort/IntegerBucketSorter.java | 2 +- .../java/com/baeldung/algorithms/bucketsort/Sorter.java | 2 +- .../com/baeldung/algorithms/counting/CountingSort.java | 0 .../main/java/com/baeldung/algorithms/heapsort/Heap.java | 0 .../baeldung/algorithms/insertionsort/InsertionSort.java | 0 .../com/baeldung/algorithms/mergesort/MergeSort.java | 0 .../com/baeldung/algorithms/quicksort/QuickSort.java | 0 .../baeldung/algorithms/quicksort/ThreeWayQuickSort.java | 0 .../com/baeldung/algorithms/radixsort/RadixSort.java | 0 .../baeldung/algorithms/selectionsort/SelectionSort.java | 0 .../com/baeldung/algorithms/shellsort/ShellSort.java | 0 .../algorithms-sorting}/src/main/resources/logback.xml | 0 .../algorithms/bubblesort/BubbleSortUnitTest.java | 0 .../bucketsort/IntegerBucketSorterUnitTest.java | 9 ++++----- .../algorithms/counting/CountingSortUnitTest.java | 0 .../com/baeldung/algorithms/heapsort/HeapUnitTest.java | 0 .../algorithms/insertionsort/InsertionSortUnitTest.java | 0 .../baeldung/algorithms/mergesort/MergeSortUnitTest.java | 0 .../baeldung/algorithms/quicksort/QuickSortUnitTest.java | 0 .../algorithms/quicksort/ThreeWayQuickSortUnitTest.java | 0 .../baeldung/algorithms/radixsort/RadixSortUnitTest.java | 0 .../algorithms/selectionsort/SelectionSortUnitTest.java | 0 .../baeldung/algorithms/shellsort/ShellSortUnitTest.java | 0 27 files changed, 7 insertions(+), 8 deletions(-) rename {algorithms-sorting => algorithms-module/algorithms-sorting}/.gitignore (100%) rename {algorithms-sorting => algorithms-module/algorithms-sorting}/README.md (100%) rename {algorithms-sorting => algorithms-module/algorithms-sorting}/pom.xml (96%) rename {algorithms-sorting => algorithms-module/algorithms-sorting}/src/main/java/com/baeldung/algorithms/bubblesort/BubbleSort.java (100%) rename {algorithms-sorting => algorithms-module/algorithms-sorting}/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java (97%) rename {algorithms-sorting => algorithms-module/algorithms-sorting}/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java (68%) rename {algorithms-sorting => algorithms-module/algorithms-sorting}/src/main/java/com/baeldung/algorithms/counting/CountingSort.java (100%) rename {algorithms-sorting => algorithms-module/algorithms-sorting}/src/main/java/com/baeldung/algorithms/heapsort/Heap.java (100%) rename {algorithms-sorting => algorithms-module/algorithms-sorting}/src/main/java/com/baeldung/algorithms/insertionsort/InsertionSort.java (100%) rename {algorithms-sorting => algorithms-module/algorithms-sorting}/src/main/java/com/baeldung/algorithms/mergesort/MergeSort.java (100%) rename {algorithms-sorting => algorithms-module/algorithms-sorting}/src/main/java/com/baeldung/algorithms/quicksort/QuickSort.java (100%) rename {algorithms-sorting => algorithms-module/algorithms-sorting}/src/main/java/com/baeldung/algorithms/quicksort/ThreeWayQuickSort.java (100%) rename {algorithms-sorting => algorithms-module/algorithms-sorting}/src/main/java/com/baeldung/algorithms/radixsort/RadixSort.java (100%) rename {algorithms-sorting => algorithms-module/algorithms-sorting}/src/main/java/com/baeldung/algorithms/selectionsort/SelectionSort.java (100%) rename {algorithms-sorting => algorithms-module/algorithms-sorting}/src/main/java/com/baeldung/algorithms/shellsort/ShellSort.java (100%) rename {algorithms-sorting => algorithms-module/algorithms-sorting}/src/main/resources/logback.xml (100%) rename {algorithms-sorting => algorithms-module/algorithms-sorting}/src/test/java/com/baeldung/algorithms/bubblesort/BubbleSortUnitTest.java (100%) rename {algorithms-sorting => algorithms-module/algorithms-sorting}/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java (89%) rename {algorithms-sorting => algorithms-module/algorithms-sorting}/src/test/java/com/baeldung/algorithms/counting/CountingSortUnitTest.java (100%) rename {algorithms-sorting => algorithms-module/algorithms-sorting}/src/test/java/com/baeldung/algorithms/heapsort/HeapUnitTest.java (100%) rename {algorithms-sorting => algorithms-module/algorithms-sorting}/src/test/java/com/baeldung/algorithms/insertionsort/InsertionSortUnitTest.java (100%) rename {algorithms-sorting => algorithms-module/algorithms-sorting}/src/test/java/com/baeldung/algorithms/mergesort/MergeSortUnitTest.java (100%) rename {algorithms-sorting => algorithms-module/algorithms-sorting}/src/test/java/com/baeldung/algorithms/quicksort/QuickSortUnitTest.java (100%) rename {algorithms-sorting => algorithms-module/algorithms-sorting}/src/test/java/com/baeldung/algorithms/quicksort/ThreeWayQuickSortUnitTest.java (100%) rename {algorithms-sorting => algorithms-module/algorithms-sorting}/src/test/java/com/baeldung/algorithms/radixsort/RadixSortUnitTest.java (100%) rename {algorithms-sorting => algorithms-module/algorithms-sorting}/src/test/java/com/baeldung/algorithms/selectionsort/SelectionSortUnitTest.java (100%) rename {algorithms-sorting => algorithms-module/algorithms-sorting}/src/test/java/com/baeldung/algorithms/shellsort/ShellSortUnitTest.java (100%) diff --git a/algorithms-sorting/.gitignore b/algorithms-module/algorithms-sorting/.gitignore similarity index 100% rename from algorithms-sorting/.gitignore rename to algorithms-module/algorithms-sorting/.gitignore diff --git a/algorithms-sorting/README.md b/algorithms-module/algorithms-sorting/README.md similarity index 100% rename from algorithms-sorting/README.md rename to algorithms-module/algorithms-sorting/README.md diff --git a/algorithms-sorting/pom.xml b/algorithms-module/algorithms-sorting/pom.xml similarity index 96% rename from algorithms-sorting/pom.xml rename to algorithms-module/algorithms-sorting/pom.xml index 383014d528..eeccbf814d 100644 --- a/algorithms-sorting/pom.xml +++ b/algorithms-module/algorithms-sorting/pom.xml @@ -9,7 +9,7 @@ com.baeldung - parent-modules + algorithms-modules 1.0.0-SNAPSHOT diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/bubblesort/BubbleSort.java b/algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/bubblesort/BubbleSort.java similarity index 100% rename from algorithms-sorting/src/main/java/com/baeldung/algorithms/bubblesort/BubbleSort.java rename to algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/bubblesort/BubbleSort.java diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java b/algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java similarity index 97% rename from algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java rename to algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java index 002d4997f4..cf86eda4a6 100644 --- a/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java +++ b/algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java @@ -1,4 +1,4 @@ -package com.baeldung.bucketsort; +package com.baeldung.algorithms.bucketsort; import java.util.ArrayList; import java.util.Comparator; diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java b/algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java similarity index 68% rename from algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java rename to algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java index b86f60324f..c1207088da 100644 --- a/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java +++ b/algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java @@ -1,4 +1,4 @@ -package com.baeldung.bucketsort; +package com.baeldung.algorithms.bucketsort; import java.util.List; diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/counting/CountingSort.java b/algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/counting/CountingSort.java similarity index 100% rename from algorithms-sorting/src/main/java/com/baeldung/algorithms/counting/CountingSort.java rename to algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/counting/CountingSort.java diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/heapsort/Heap.java b/algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/heapsort/Heap.java similarity index 100% rename from algorithms-sorting/src/main/java/com/baeldung/algorithms/heapsort/Heap.java rename to algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/heapsort/Heap.java diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/insertionsort/InsertionSort.java b/algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/insertionsort/InsertionSort.java similarity index 100% rename from algorithms-sorting/src/main/java/com/baeldung/algorithms/insertionsort/InsertionSort.java rename to algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/insertionsort/InsertionSort.java diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/mergesort/MergeSort.java b/algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/mergesort/MergeSort.java similarity index 100% rename from algorithms-sorting/src/main/java/com/baeldung/algorithms/mergesort/MergeSort.java rename to algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/mergesort/MergeSort.java diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/quicksort/QuickSort.java b/algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/quicksort/QuickSort.java similarity index 100% rename from algorithms-sorting/src/main/java/com/baeldung/algorithms/quicksort/QuickSort.java rename to algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/quicksort/QuickSort.java diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/quicksort/ThreeWayQuickSort.java b/algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/quicksort/ThreeWayQuickSort.java similarity index 100% rename from algorithms-sorting/src/main/java/com/baeldung/algorithms/quicksort/ThreeWayQuickSort.java rename to algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/quicksort/ThreeWayQuickSort.java diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/radixsort/RadixSort.java b/algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/radixsort/RadixSort.java similarity index 100% rename from algorithms-sorting/src/main/java/com/baeldung/algorithms/radixsort/RadixSort.java rename to algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/radixsort/RadixSort.java diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/selectionsort/SelectionSort.java b/algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/selectionsort/SelectionSort.java similarity index 100% rename from algorithms-sorting/src/main/java/com/baeldung/algorithms/selectionsort/SelectionSort.java rename to algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/selectionsort/SelectionSort.java diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/shellsort/ShellSort.java b/algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/shellsort/ShellSort.java similarity index 100% rename from algorithms-sorting/src/main/java/com/baeldung/algorithms/shellsort/ShellSort.java rename to algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/shellsort/ShellSort.java diff --git a/algorithms-sorting/src/main/resources/logback.xml b/algorithms-module/algorithms-sorting/src/main/resources/logback.xml similarity index 100% rename from algorithms-sorting/src/main/resources/logback.xml rename to algorithms-module/algorithms-sorting/src/main/resources/logback.xml diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/bubblesort/BubbleSortUnitTest.java b/algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/bubblesort/BubbleSortUnitTest.java similarity index 100% rename from algorithms-sorting/src/test/java/com/baeldung/algorithms/bubblesort/BubbleSortUnitTest.java rename to algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/bubblesort/BubbleSortUnitTest.java diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java b/algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java similarity index 89% rename from algorithms-sorting/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java rename to algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java index 2773d8a68f..4671819673 100644 --- a/algorithms-sorting/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java +++ b/algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java @@ -1,13 +1,12 @@ -package com.baeldung.bucketsort; +package com.baeldung.algorithms.bucketsort; -import com.baeldung.bucketsort.IntegerBucketSorter; -import org.junit.Before; -import org.junit.Test; +import static org.junit.Assert.assertEquals; import java.util.Arrays; import java.util.List; -import static org.junit.Assert.assertEquals; +import org.junit.Before; +import org.junit.Test; public class IntegerBucketSorterUnitTest { diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/counting/CountingSortUnitTest.java b/algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/counting/CountingSortUnitTest.java similarity index 100% rename from algorithms-sorting/src/test/java/com/baeldung/algorithms/counting/CountingSortUnitTest.java rename to algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/counting/CountingSortUnitTest.java diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/heapsort/HeapUnitTest.java b/algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/heapsort/HeapUnitTest.java similarity index 100% rename from algorithms-sorting/src/test/java/com/baeldung/algorithms/heapsort/HeapUnitTest.java rename to algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/heapsort/HeapUnitTest.java diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/insertionsort/InsertionSortUnitTest.java b/algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/insertionsort/InsertionSortUnitTest.java similarity index 100% rename from algorithms-sorting/src/test/java/com/baeldung/algorithms/insertionsort/InsertionSortUnitTest.java rename to algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/insertionsort/InsertionSortUnitTest.java diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/mergesort/MergeSortUnitTest.java b/algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/mergesort/MergeSortUnitTest.java similarity index 100% rename from algorithms-sorting/src/test/java/com/baeldung/algorithms/mergesort/MergeSortUnitTest.java rename to algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/mergesort/MergeSortUnitTest.java diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/QuickSortUnitTest.java b/algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/QuickSortUnitTest.java similarity index 100% rename from algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/QuickSortUnitTest.java rename to algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/QuickSortUnitTest.java diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/ThreeWayQuickSortUnitTest.java b/algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/ThreeWayQuickSortUnitTest.java similarity index 100% rename from algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/ThreeWayQuickSortUnitTest.java rename to algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/ThreeWayQuickSortUnitTest.java diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/radixsort/RadixSortUnitTest.java b/algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/radixsort/RadixSortUnitTest.java similarity index 100% rename from algorithms-sorting/src/test/java/com/baeldung/algorithms/radixsort/RadixSortUnitTest.java rename to algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/radixsort/RadixSortUnitTest.java diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/selectionsort/SelectionSortUnitTest.java b/algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/selectionsort/SelectionSortUnitTest.java similarity index 100% rename from algorithms-sorting/src/test/java/com/baeldung/algorithms/selectionsort/SelectionSortUnitTest.java rename to algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/selectionsort/SelectionSortUnitTest.java diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/shellsort/ShellSortUnitTest.java b/algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/shellsort/ShellSortUnitTest.java similarity index 100% rename from algorithms-sorting/src/test/java/com/baeldung/algorithms/shellsort/ShellSortUnitTest.java rename to algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/shellsort/ShellSortUnitTest.java From 2d7de1343f0c80b084bbdd9e012028a675e846ee Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Fri, 20 May 2022 20:31:27 +0530 Subject: [PATCH 242/278] JAVA-12097: moved algorithms-miscellaneous-1 inside algorithms-module --- .../algorithms-sorting-2}/.gitignore | 0 .../algorithms-sorting-2}/README.md | 0 .../algorithms-sorting-2}/pom.xml | 2 +- .../baeldung/algorithms/bynumber/NaturalOrderComparators.java | 0 .../main/java/com/baeldung/algorithms/inoutsort/InOutSort.java | 0 .../baeldung/algorithms/quicksort/BentleyMcIlroyPartioning.java | 0 .../algorithms/quicksort/DutchNationalFlagPartioning.java | 0 .../main/java/com/baeldung/algorithms/quicksort/Partition.java | 0 .../java/com/baeldung/algorithms/quicksort/SortingUtils.java | 0 .../com/baeldung/algorithms/stringsort/AnagramValidator.java | 0 .../algorithms-sorting-2}/src/main/resources/logback.xml | 0 .../algorithms/bynumber/NaturalOrderComparatorsUnitTest.java | 0 .../com/baeldung/algorithms/inoutsort/InOutSortUnitTest.java | 0 .../quicksort/BentleyMcilroyPartitioningUnitTest.java | 0 .../algorithms/quicksort/DNFThreeWayQuickSortUnitTest.java | 0 .../algorithms/stringsort/AnagramValidatorUnitTest.java | 0 .../com/baeldung/algorithms/stringsort/SortStringUnitTest.java | 0 17 files changed, 1 insertion(+), 1 deletion(-) rename {algorithms-sorting-2 => algorithms-module/algorithms-sorting-2}/.gitignore (100%) rename {algorithms-sorting-2 => algorithms-module/algorithms-sorting-2}/README.md (100%) rename {algorithms-sorting-2 => algorithms-module/algorithms-sorting-2}/pom.xml (96%) rename {algorithms-sorting-2 => algorithms-module/algorithms-sorting-2}/src/main/java/com/baeldung/algorithms/bynumber/NaturalOrderComparators.java (100%) rename {algorithms-sorting-2 => algorithms-module/algorithms-sorting-2}/src/main/java/com/baeldung/algorithms/inoutsort/InOutSort.java (100%) rename {algorithms-sorting-2 => algorithms-module/algorithms-sorting-2}/src/main/java/com/baeldung/algorithms/quicksort/BentleyMcIlroyPartioning.java (100%) rename {algorithms-sorting-2 => algorithms-module/algorithms-sorting-2}/src/main/java/com/baeldung/algorithms/quicksort/DutchNationalFlagPartioning.java (100%) rename {algorithms-sorting-2 => algorithms-module/algorithms-sorting-2}/src/main/java/com/baeldung/algorithms/quicksort/Partition.java (100%) rename {algorithms-sorting-2 => algorithms-module/algorithms-sorting-2}/src/main/java/com/baeldung/algorithms/quicksort/SortingUtils.java (100%) rename {algorithms-sorting-2 => algorithms-module/algorithms-sorting-2}/src/main/java/com/baeldung/algorithms/stringsort/AnagramValidator.java (100%) rename {algorithms-sorting-2 => algorithms-module/algorithms-sorting-2}/src/main/resources/logback.xml (100%) rename {algorithms-sorting-2 => algorithms-module/algorithms-sorting-2}/src/test/java/com/baeldung/algorithms/bynumber/NaturalOrderComparatorsUnitTest.java (100%) rename {algorithms-sorting-2 => algorithms-module/algorithms-sorting-2}/src/test/java/com/baeldung/algorithms/inoutsort/InOutSortUnitTest.java (100%) rename {algorithms-sorting-2 => algorithms-module/algorithms-sorting-2}/src/test/java/com/baeldung/algorithms/quicksort/BentleyMcilroyPartitioningUnitTest.java (100%) rename {algorithms-sorting-2 => algorithms-module/algorithms-sorting-2}/src/test/java/com/baeldung/algorithms/quicksort/DNFThreeWayQuickSortUnitTest.java (100%) rename {algorithms-sorting-2 => algorithms-module/algorithms-sorting-2}/src/test/java/com/baeldung/algorithms/stringsort/AnagramValidatorUnitTest.java (100%) rename {algorithms-sorting-2 => algorithms-module/algorithms-sorting-2}/src/test/java/com/baeldung/algorithms/stringsort/SortStringUnitTest.java (100%) diff --git a/algorithms-sorting-2/.gitignore b/algorithms-module/algorithms-sorting-2/.gitignore similarity index 100% rename from algorithms-sorting-2/.gitignore rename to algorithms-module/algorithms-sorting-2/.gitignore diff --git a/algorithms-sorting-2/README.md b/algorithms-module/algorithms-sorting-2/README.md similarity index 100% rename from algorithms-sorting-2/README.md rename to algorithms-module/algorithms-sorting-2/README.md diff --git a/algorithms-sorting-2/pom.xml b/algorithms-module/algorithms-sorting-2/pom.xml similarity index 96% rename from algorithms-sorting-2/pom.xml rename to algorithms-module/algorithms-sorting-2/pom.xml index a8477bf624..d81df0adec 100644 --- a/algorithms-sorting-2/pom.xml +++ b/algorithms-module/algorithms-sorting-2/pom.xml @@ -8,7 +8,7 @@ com.baeldung - parent-modules + algorithms-modules 1.0.0-SNAPSHOT diff --git a/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/bynumber/NaturalOrderComparators.java b/algorithms-module/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/bynumber/NaturalOrderComparators.java similarity index 100% rename from algorithms-sorting-2/src/main/java/com/baeldung/algorithms/bynumber/NaturalOrderComparators.java rename to algorithms-module/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/bynumber/NaturalOrderComparators.java diff --git a/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/inoutsort/InOutSort.java b/algorithms-module/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/inoutsort/InOutSort.java similarity index 100% rename from algorithms-sorting-2/src/main/java/com/baeldung/algorithms/inoutsort/InOutSort.java rename to algorithms-module/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/inoutsort/InOutSort.java diff --git a/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/BentleyMcIlroyPartioning.java b/algorithms-module/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/BentleyMcIlroyPartioning.java similarity index 100% rename from algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/BentleyMcIlroyPartioning.java rename to algorithms-module/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/BentleyMcIlroyPartioning.java diff --git a/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/DutchNationalFlagPartioning.java b/algorithms-module/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/DutchNationalFlagPartioning.java similarity index 100% rename from algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/DutchNationalFlagPartioning.java rename to algorithms-module/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/DutchNationalFlagPartioning.java diff --git a/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/Partition.java b/algorithms-module/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/Partition.java similarity index 100% rename from algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/Partition.java rename to algorithms-module/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/Partition.java diff --git a/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/SortingUtils.java b/algorithms-module/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/SortingUtils.java similarity index 100% rename from algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/SortingUtils.java rename to algorithms-module/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/SortingUtils.java diff --git a/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/stringsort/AnagramValidator.java b/algorithms-module/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/stringsort/AnagramValidator.java similarity index 100% rename from algorithms-sorting-2/src/main/java/com/baeldung/algorithms/stringsort/AnagramValidator.java rename to algorithms-module/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/stringsort/AnagramValidator.java diff --git a/algorithms-sorting-2/src/main/resources/logback.xml b/algorithms-module/algorithms-sorting-2/src/main/resources/logback.xml similarity index 100% rename from algorithms-sorting-2/src/main/resources/logback.xml rename to algorithms-module/algorithms-sorting-2/src/main/resources/logback.xml diff --git a/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/bynumber/NaturalOrderComparatorsUnitTest.java b/algorithms-module/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/bynumber/NaturalOrderComparatorsUnitTest.java similarity index 100% rename from algorithms-sorting-2/src/test/java/com/baeldung/algorithms/bynumber/NaturalOrderComparatorsUnitTest.java rename to algorithms-module/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/bynumber/NaturalOrderComparatorsUnitTest.java diff --git a/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/inoutsort/InOutSortUnitTest.java b/algorithms-module/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/inoutsort/InOutSortUnitTest.java similarity index 100% rename from algorithms-sorting-2/src/test/java/com/baeldung/algorithms/inoutsort/InOutSortUnitTest.java rename to algorithms-module/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/inoutsort/InOutSortUnitTest.java diff --git a/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/BentleyMcilroyPartitioningUnitTest.java b/algorithms-module/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/BentleyMcilroyPartitioningUnitTest.java similarity index 100% rename from algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/BentleyMcilroyPartitioningUnitTest.java rename to algorithms-module/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/BentleyMcilroyPartitioningUnitTest.java diff --git a/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/DNFThreeWayQuickSortUnitTest.java b/algorithms-module/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/DNFThreeWayQuickSortUnitTest.java similarity index 100% rename from algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/DNFThreeWayQuickSortUnitTest.java rename to algorithms-module/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/DNFThreeWayQuickSortUnitTest.java diff --git a/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/stringsort/AnagramValidatorUnitTest.java b/algorithms-module/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/stringsort/AnagramValidatorUnitTest.java similarity index 100% rename from algorithms-sorting-2/src/test/java/com/baeldung/algorithms/stringsort/AnagramValidatorUnitTest.java rename to algorithms-module/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/stringsort/AnagramValidatorUnitTest.java diff --git a/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/stringsort/SortStringUnitTest.java b/algorithms-module/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/stringsort/SortStringUnitTest.java similarity index 100% rename from algorithms-sorting-2/src/test/java/com/baeldung/algorithms/stringsort/SortStringUnitTest.java rename to algorithms-module/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/stringsort/SortStringUnitTest.java From 93b93417e0b645098efb3d2aa5c287eab63a10fe Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Fri, 20 May 2022 22:07:32 +0530 Subject: [PATCH 243/278] JAVA-12097: renamed algorithms-module to algorithms-modules --- .../algorithms-genetic/.gitignore | 0 .../algorithms-genetic/README.md | 0 .../algorithms-genetic/pom.xml | 0 .../com/baeldung/algorithms/RunAlgorithm.java | 0 .../algorithms/ga/annealing/City.java | 0 .../ga/annealing/SimulatedAnnealing.java | 0 .../algorithms/ga/annealing/Travel.java | 0 .../algorithms/ga/ant_colony/Ant.java | 0 .../ga/ant_colony/AntColonyOptimization.java | 0 .../algorithms/ga/binary/Individual.java | 0 .../algorithms/ga/binary/Population.java | 0 .../ga/binary/SimpleGeneticAlgorithm.java | 0 .../algorithms/ga/jenetics/Knapsack.java | 0 .../algorithms/ga/jenetics/KnapsackFF.java | 0 .../algorithms/ga/jenetics/KnapsackItem.java | 0 .../ga/jenetics/SimpleGeneticAlgorithm.java | 0 .../ga/jenetics/SpringsteenProblem.java | 0 .../ga/jenetics/SpringsteenRecord.java | 0 .../algorithms/ga/jenetics/SubsetSum.java | 0 .../ga/jenetics/TravelingSalesman.java | 0 .../src/main/resources/logback.xml | 0 ...ColonyOptimizationLongRunningUnitTest.java | 0 ...ryGeneticAlgorithmLongRunningUnitTest.java | 0 ...SimulatedAnnealingLongRunningUnitTest.java | 0 .../algorithms-miscellaneous-1/README.md | 0 .../algorithms-miscellaneous-1/pom.xml | 0 .../automata/FiniteStateMachine.java | 0 .../automata/RtFiniteStateMachine.java | 0 .../baeldung/algorithms/automata/RtState.java | 0 .../algorithms/automata/RtTransition.java | 0 .../baeldung/algorithms/automata/State.java | 0 .../algorithms/automata/Transition.java | 0 .../algorithms/hillclimbing/HillClimbing.java | 0 .../algorithms/hillclimbing/State.java | 0 .../algorithms/kthlargest/FindKthLargest.java | 0 .../algorithms/minimax/GameOfBones.java | 0 .../baeldung/algorithms/minimax/MiniMax.java | 0 .../com/baeldung/algorithms/minimax/Node.java | 0 .../com/baeldung/algorithms/minimax/Tree.java | 0 .../src/main/resources/logback.xml | 0 .../HillClimbingAlgorithmUnitTest.java | 0 ...FiniteStateMachineLongRunningUnitTest.java | 0 .../kthlargest/FindKthLargestUnitTest.java | 0 .../algorithms/minimax/MinimaxUnitTest.java | 0 .../algorithms-miscellaneous-2/README.md | 0 .../algorithms-miscellaneous-2/pom.xml | 0 .../com/baeldung/algorithms/RunAlgorithm.java | 0 .../editdistance/EditDistanceBase.java | 0 .../EditDistanceDynamicProgramming.java | 0 .../editdistance/EditDistanceRecursive.java | 0 .../algorithms/ga/dijkstra/Dijkstra.java | 0 .../algorithms/ga/dijkstra/Graph.java | 0 .../baeldung/algorithms/ga/dijkstra/Node.java | 0 .../linkedlist/CycleDetectionBruteForce.java | 0 .../CycleDetectionByFastAndSlowIterators.java | 0 .../linkedlist/CycleDetectionByHashing.java | 0 .../linkedlist/CycleDetectionResult.java | 0 .../linkedlist/CycleRemovalBruteForce.java | 0 .../CycleRemovalByCountingLoopNodes.java | 0 .../CycleRemovalWithoutCountingLoopNodes.java | 0 .../baeldung/algorithms/linkedlist/Node.java | 0 .../algorithms/maze/solver/BFSMazeSolver.java | 0 .../algorithms/maze/solver/Coordinate.java | 0 .../algorithms/maze/solver/DFSMazeSolver.java | 0 .../baeldung/algorithms/maze/solver/Maze.java | 0 .../algorithms/maze/solver/MazeDriver.java | 0 .../NumberWordConverter.java | 0 .../algorithms/slope_one/InputData.java | 0 .../baeldung/algorithms/slope_one/Item.java | 0 .../algorithms/slope_one/SlopeOne.java | 0 .../baeldung/algorithms/slope_one/User.java | 0 .../sudoku/BacktrackingAlgorithm.java | 0 .../algorithms/sudoku/ColumnNode.java | 0 .../algorithms/sudoku/DancingLinks.java | 0 .../sudoku/DancingLinksAlgorithm.java | 0 .../algorithms/sudoku/DancingNode.java | 0 .../src/main/resources/logback.xml | 0 .../src/main/resources/maze/maze1.txt | 0 .../src/main/resources/maze/maze2.txt | 0 .../DijkstraAlgorithmLongRunningUnitTest.java | 0 .../com/baeldung/algorithms/astar/Graph.java | 0 .../baeldung/algorithms/astar/GraphNode.java | 0 .../algorithms/astar/RouteFinder.java | 0 .../baeldung/algorithms/astar/RouteNode.java | 0 .../com/baeldung/algorithms/astar/Scorer.java | 0 .../astar/underground/HaversineScorer.java | 0 .../RouteFinderIntegrationTest.java | 0 .../algorithms/astar/underground/Station.java | 0 .../EditDistanceDataProvider.java | 0 .../editdistance/EditDistanceUnitTest.java | 0 .../CycleDetectionBruteForceUnitTest.java | 0 ...tectionByFastAndSlowIteratorsUnitTest.java | 0 .../CycleDetectionByHashingUnitTest.java | 0 .../linkedlist/CycleDetectionTestBase.java | 0 .../CycleRemovalBruteForceUnitTest.java | 0 ...cleRemovalByCountingLoopNodesUnitTest.java | 0 ...movalWithoutCountingLoopNodesUnitTest.java | 0 .../NumberWordConverterUnitTest.java | 0 .../jgrapht/CompleteGraphUnitTest.java | 0 .../jgrapht/DirectedGraphUnitTest.java | 0 .../jgrapht/EulerianCircuitUnitTest.java | 0 .../jgrapht/GraphImageGenerationUnitTest.java | 0 .../src/test/resources/graph.png | Bin .../algorithms-miscellaneous-3/.gitignore | 0 .../algorithms-miscellaneous-3/README.md | 0 .../algorithms-miscellaneous-3/pom.xml | 0 .../algorithms/checksortedlist/Employee.java | 0 .../checksortedlist/SortedListChecker.java | 0 .../enumstatemachine/LeaveRequestState.java | 0 .../graphcycledetection/domain/Graph.java | 0 .../graphcycledetection/domain/Vertex.java | 0 .../baeldung/algorithms/kmeans/Centroid.java | 0 .../baeldung/algorithms/kmeans/Distance.java | 0 .../baeldung/algorithms/kmeans/Errors.java | 0 .../algorithms/kmeans/EuclideanDistance.java | 0 .../baeldung/algorithms/kmeans/KMeans.java | 0 .../baeldung/algorithms/kmeans/LastFm.java | 0 .../algorithms/kmeans/LastFmService.java | 0 .../baeldung/algorithms/kmeans/Record.java | 0 .../printtriangles/PrintTriangleExamples.java | 0 .../romannumerals/RomanArabicConverter.java | 0 .../romannumerals/RomanNumeral.java | 0 .../LinkedListFindMiddle.java | 0 .../twopointertechnique/MyNode.java | 0 .../twopointertechnique/RotateArray.java | 0 .../twopointertechnique/TwoSum.java | 0 .../com/baeldung/folding/FoldingHash.java | 0 .../main/java/com/baeldung/folding/Main.java | 0 .../src/main/resources/kmeans/artists.json | 0 .../src/main/resources/kmeans/lastfm.json | 0 .../src/main/resources/kmeans/radial.html | 0 .../src/main/resources/logback.xml | 0 .../analysis/AnalysisRunnerLiveTest.java | 0 .../SortedListCheckerUnitTest.java | 0 .../LeaveRequestStateUnitTest.java | 0 .../GraphCycleDetectionUnitTest.java | 0 .../PrintTriangleExamplesUnitTest.java | 0 .../RomanArabicConverterUnitTest.java | 0 .../LinkedListFindMiddleUnitTest.java | 0 .../RotateArrayUnitTest.java | 0 .../twopointertechnique/TwoSumUnitTest.java | 0 .../baeldung/counter/CounterStatistics.java | 0 .../com/baeldung/counter/CounterUnitTest.java | 0 .../com/baeldung/counter/CounterUtil.java | 0 .../baeldung/folding/FoldingHashUnitTest.java | 0 .../algorithms-miscellaneous-4/README.md | 0 .../algorithms-miscellaneous-4/pom.xml | 0 .../MiddleElementLookup.java | 0 .../algorithms/middleelementlookup/Node.java | 0 .../algorithms/multiswarm/Constants.java | 0 .../multiswarm/FitnessFunction.java | 0 .../algorithms/multiswarm/Multiswarm.java | 0 .../algorithms/multiswarm/Particle.java | 0 .../baeldung/algorithms/multiswarm/Swarm.java | 0 .../algorithms/permutation/Permutation.java | 0 .../SmallestMissingPositiveInteger.java | 0 .../string/EnglishAlphabetLetters.java | 0 ...ongestSubstringNonRepeatingCharacters.java | 0 .../string/SubstringPalindrome.java | 0 .../src/main/resources/logback.xml | 0 .../MiddleElementLookupUnitTest.java | 0 .../multiswarm/LolFitnessFunction.java | 0 .../multiswarm/MultiswarmUnitTest.java | 0 ...mallestMissingPositiveIntegerUnitTest.java | 0 .../EnglishAlphabetLettersUnitTest.java | 0 ...bstringNonRepeatingCharactersUnitTest.java | 0 .../string/SubstringPalindromeUnitTest.java | 0 .../algorithms/support/MayFailRule.java | 0 .../algorithms-miscellaneous-5/README.md | 0 .../algorithms-miscellaneous-5/pom.xml | 0 .../BalancedBinaryTree.java | 0 .../algorithms/balancedbinarytree/Tree.java | 0 .../algorithms/binarygap/BinaryGap.java | 0 .../combinatorics/Combinatorics.java | 0 .../conversion/HexStringConverter.java | 0 .../MedianOfIntegerStream.java | 0 .../MedianOfIntegerStream2.java | 0 .../algorithms/knapsack/Knapsack.java | 0 .../maximumsubarray/BruteForceAlgorithm.java | 0 .../maximumsubarray/KadaneAlgorithm.java | 0 .../mergesortedarrays/SortedArrays.java | 0 .../com/baeldung/algorithms/prim/Edge.java | 0 .../com/baeldung/algorithms/prim/Prim.java | 0 .../com/baeldung/algorithms/prim/Vertex.java | 0 .../relativelyprime/RelativelyPrime.java | 0 .../algorithms/reversingtree/TreeNode.java | 0 .../reversingtree/TreeReverser.java | 0 .../src/main/resources/logback.xml | 0 .../BalancedBinaryTreeUnitTest.java | 0 .../BinaryTreeDataProvider.java | 0 .../binarygap/BinaryGapUnitTest.java | 0 .../combinatorics/CombinatoricsUnitTest.java | 0 .../ByteArrayConverterUnitTest.java | 0 .../MedianOfIntegerStreamUnitTest.java | 0 .../algorithms/knapsack/KnapsackUnitTest.java | 0 .../BruteForceAlgorithmUnitTest.java | 0 .../KadaneAlgorithmUnitTest.java | 0 .../SortedArraysUnitTest.java | 0 .../algorithms/prim/PrimUnitTest.java | 0 .../RelativelyPrimeUnitTest.java | 0 .../reversingtree/TreeReverserUnitTest.java | 0 .../src/test/resources/input.json | 0 .../algorithms-miscellaneous-6/README.md | 0 .../algorithms-miscellaneous-6/pom.xml | 0 .../BalancedBracketsUsingDeque.java | 0 .../BalancedBracketsUsingString.java | 0 .../algorithms/boruvka/BoruvkaMST.java | 0 .../algorithms/boruvka/UnionFind.java | 0 .../algorithms/caesarcipher/CaesarCipher.java | 0 .../gradientdescent/GradientDescent.java | 0 .../baeldung/algorithms/greedy/Follower.java | 0 .../algorithms/greedy/FollowersPath.java | 0 .../algorithms/greedy/GreedyAlgorithm.java | 0 .../algorithms/greedy/NonGreedyAlgorithm.java | 0 .../algorithms/greedy/SocialConnector.java | 0 .../algorithms/greedy/SocialUser.java | 0 .../algorithms/kruskal/CycleDetector.java | 0 .../algorithms/kruskal/DisjointSetInfo.java | 0 .../baeldung/algorithms/kruskal/Kruskal.java | 0 .../linkedlist/LinkedListReversal.java | 0 .../algorithms/linkedlist/ListNode.java | 0 .../algorithms/minheapmerge/HeapNode.java | 0 .../algorithms/minheapmerge/MinHeap.java | 0 .../baeldung/algorithms/play2048/Board.java | 0 .../baeldung/algorithms/play2048/Cell.java | 0 .../algorithms/play2048/Computer.java | 0 .../baeldung/algorithms/play2048/Human.java | 0 .../baeldung/algorithms/play2048/Move.java | 0 .../algorithms/play2048/Play2048.java | 0 .../BruteForceTopKElementsFinder.java | 0 .../MaxHeapTopKElementsFinder.java | 0 .../topkelements/TopKElementsFinder.java | 0 .../TreeSetTopKElementsFinder.java | 0 .../src/main/resources/logback.xml | 0 .../BalancedBracketsUsingDequeUnitTest.java | 0 .../BalancedBracketsUsingStringUnitTest.java | 0 .../algorithms/boruvka/BoruvkaUnitTest.java | 0 .../caesarcipher/CaesarCipherUnitTest.java | 0 .../GradientDescentUnitTest.java | 0 .../greedy/GreedyAlgorithmUnitTest.java | 0 .../algorithms/kruskal/KruskalUnitTest.java | 0 .../LinkedListReversalUnitTest.java | 0 .../minheapmerge/MinHeapUnitTest.java | 0 .../TopKElementsFinderUnitTest.java | 0 .../algorithms-searching/README.md | 0 .../algorithms-searching/pom.xml | 0 .../algorithms/binarysearch/BinarySearch.java | 0 .../BreadthFirstSearchAlgorithm.java | 0 .../algorithms/breadthfirstsearch/Node.java | 0 .../algorithms/breadthfirstsearch/Tree.java | 0 .../baeldung/algorithms/dfs/BinaryTree.java | 0 .../com/baeldung/algorithms/dfs/Graph.java | 0 .../InterpolationSearch.java | 0 .../algorithms/kthsmallest/KthSmallest.java | 0 .../mcts/montecarlo/MonteCarloTreeSearch.java | 0 .../algorithms/mcts/montecarlo/State.java | 0 .../algorithms/mcts/montecarlo/UCT.java | 0 .../algorithms/mcts/tictactoe/Board.java | 0 .../algorithms/mcts/tictactoe/Position.java | 0 .../baeldung/algorithms/mcts/tree/Node.java | 0 .../baeldung/algorithms/mcts/tree/Tree.java | 0 .../baeldung/algorithms/quadtree/Point.java | 0 .../algorithms/quadtree/QuadTree.java | 0 .../baeldung/algorithms/quadtree/Region.java | 0 .../baeldung/algorithms/suffixtree/Node.java | 0 .../algorithms/suffixtree/SuffixTree.java | 0 .../textsearch/TextSearchAlgorithms.java | 0 .../src/main/resources/logback.xml | 0 .../binarysearch/BinarySearchUnitTest.java | 0 .../BreadthFirstSearchAlgorithmUnitTest.java | 0 .../algorithms/dfs/BinaryTreeUnitTest.java | 0 .../algorithms/dfs/GraphUnitTest.java | 0 .../InterpolationSearchUnitTest.java | 0 .../kthsmallest/KthSmallestUnitTest.java | 0 .../algorithms/mcts/MCTSUnitTest.java | 0 .../quadtree/QuadTreeSearchUnitTest.java | 0 .../suffixtree/SuffixTreeUnitTest.java | 0 .../TextSearchAlgorithmsUnitTest.java | 0 .../algorithms-sorting-2/.gitignore | 0 .../algorithms-sorting-2/README.md | 0 .../algorithms-sorting-2/pom.xml | 0 .../bynumber/NaturalOrderComparators.java | 0 .../algorithms/inoutsort/InOutSort.java | 0 .../quicksort/BentleyMcIlroyPartioning.java | 0 .../DutchNationalFlagPartioning.java | 0 .../algorithms/quicksort/Partition.java | 0 .../algorithms/quicksort/SortingUtils.java | 0 .../stringsort/AnagramValidator.java | 0 .../src/main/resources/logback.xml | 0 .../NaturalOrderComparatorsUnitTest.java | 0 .../inoutsort/InOutSortUnitTest.java | 0 .../BentleyMcilroyPartitioningUnitTest.java | 0 .../DNFThreeWayQuickSortUnitTest.java | 0 .../stringsort/AnagramValidatorUnitTest.java | 0 .../stringsort/SortStringUnitTest.java | 0 .../algorithms-sorting/.gitignore | 0 .../algorithms-sorting/README.md | 0 .../algorithms-sorting/pom.xml | 0 .../algorithms/bubblesort/BubbleSort.java | 0 .../bucketsort/IntegerBucketSorter.java | 0 .../algorithms/bucketsort/Sorter.java | 0 .../algorithms/counting/CountingSort.java | 0 .../baeldung/algorithms/heapsort/Heap.java | 0 .../insertionsort/InsertionSort.java | 0 .../algorithms/mergesort/MergeSort.java | 0 .../algorithms/quicksort/QuickSort.java | 0 .../quicksort/ThreeWayQuickSort.java | 0 .../algorithms/radixsort/RadixSort.java | 0 .../selectionsort/SelectionSort.java | 0 .../algorithms/shellsort/ShellSort.java | 0 .../src/main/resources/logback.xml | 0 .../bubblesort/BubbleSortUnitTest.java | 0 .../IntegerBucketSorterUnitTest.java | 0 .../counting/CountingSortUnitTest.java | 0 .../algorithms/heapsort/HeapUnitTest.java | 0 .../insertionsort/InsertionSortUnitTest.java | 0 .../mergesort/MergeSortUnitTest.java | 0 .../quicksort/QuickSortUnitTest.java | 0 .../quicksort/ThreeWayQuickSortUnitTest.java | 0 .../radixsort/RadixSortUnitTest.java | 0 .../selectionsort/SelectionSortUnitTest.java | 0 .../shellsort/ShellSortUnitTest.java | 0 algorithms-modules/pom.xml | 29 ++++++++++++++++++ pom.xml | 22 ++----------- 324 files changed, 31 insertions(+), 20 deletions(-) rename {algorithms-module => algorithms-modules}/algorithms-genetic/.gitignore (100%) rename {algorithms-module => algorithms-modules}/algorithms-genetic/README.md (100%) rename {algorithms-module => algorithms-modules}/algorithms-genetic/pom.xml (100%) rename {algorithms-module => algorithms-modules}/algorithms-genetic/src/main/java/com/baeldung/algorithms/RunAlgorithm.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/City.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/SimulatedAnnealing.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/Travel.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/ant_colony/Ant.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/ant_colony/AntColonyOptimization.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/Individual.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/Population.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/SimpleGeneticAlgorithm.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/Knapsack.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/KnapsackFF.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/KnapsackItem.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SimpleGeneticAlgorithm.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SpringsteenProblem.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SpringsteenRecord.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SubsetSum.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/TravelingSalesman.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-genetic/src/main/resources/logback.xml (100%) rename {algorithms-module => algorithms-modules}/algorithms-genetic/src/test/java/com/baeldung/algorithms/AntColonyOptimizationLongRunningUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-genetic/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmLongRunningUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-genetic/src/test/java/com/baeldung/algorithms/SimulatedAnnealingLongRunningUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-1/README.md (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-1/pom.xml (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/FiniteStateMachine.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtFiniteStateMachine.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtState.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtTransition.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/State.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/Transition.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/hillclimbing/HillClimbing.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/hillclimbing/State.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/kthlargest/FindKthLargest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/GameOfBones.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/MiniMax.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/Node.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/Tree.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-1/src/main/resources/logback.xml (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/HillClimbingAlgorithmUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/RtFiniteStateMachineLongRunningUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/kthlargest/FindKthLargestUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/minimax/MinimaxUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/README.md (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/pom.xml (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/RunAlgorithm.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceBase.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceDynamicProgramming.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceRecursive.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Dijkstra.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Graph.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Node.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionBruteForce.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionByFastAndSlowIterators.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionByHashing.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionResult.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalBruteForce.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalByCountingLoopNodes.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalWithoutCountingLoopNodes.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/Node.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/BFSMazeSolver.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/Coordinate.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/DFSMazeSolver.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/Maze.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/MazeDriver.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/numberwordconverter/NumberWordConverter.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/InputData.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/Item.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/SlopeOne.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/User.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/ColumnNode.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingLinks.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingNode.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/resources/logback.xml (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/resources/maze/maze1.txt (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/main/resources/maze/maze2.txt (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/DijkstraAlgorithmLongRunningUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/Graph.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/GraphNode.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/RouteFinder.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/RouteNode.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/Scorer.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/HaversineScorer.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/RouteFinderIntegrationTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/Station.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceDataProvider.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionBruteForceUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByFastAndSlowIteratorsUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByHashingUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionTestBase.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalBruteForceUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalByCountingLoopNodesUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalWithoutCountingLoopNodesUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/moneywords/NumberWordConverterUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/CompleteGraphUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/DirectedGraphUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/EulerianCircuitUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/GraphImageGenerationUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-2/src/test/resources/graph.png (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/.gitignore (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/README.md (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/pom.xml (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/checksortedlist/Employee.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/checksortedlist/SortedListChecker.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/enumstatemachine/LeaveRequestState.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/graphcycledetection/domain/Graph.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/graphcycledetection/domain/Vertex.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Centroid.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Distance.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Errors.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/EuclideanDistance.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/KMeans.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/LastFm.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/LastFmService.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Record.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamples.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/romannumerals/RomanArabicConverter.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/romannumerals/RomanNumeral.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddle.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/MyNode.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/RotateArray.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/TwoSum.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/main/java/com/baeldung/folding/FoldingHash.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/main/java/com/baeldung/folding/Main.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/main/resources/kmeans/artists.json (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/main/resources/kmeans/lastfm.json (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/main/resources/kmeans/radial.html (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/main/resources/logback.xml (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/analysis/AnalysisRunnerLiveTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/checksortedlist/SortedListCheckerUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/enumstatemachine/LeaveRequestStateUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/graphcycledetection/GraphCycleDetectionUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamplesUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/romannumerals/RomanArabicConverterUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddleUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/RotateArrayUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/TwoSumUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterStatistics.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUtil.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-3/src/test/java/com/baeldung/folding/FoldingHashUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-4/README.md (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-4/pom.xml (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/MiddleElementLookup.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/Node.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Constants.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/FitnessFunction.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Multiswarm.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Particle.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Swarm.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/permutation/Permutation.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/smallestinteger/SmallestMissingPositiveInteger.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/EnglishAlphabetLetters.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-4/src/main/resources/logback.xml (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/MiddleElementLookupUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/LolFitnessFunction.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/MultiswarmUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/smallestinteger/SmallestMissingPositiveIntegerUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/EnglishAlphabetLettersUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/support/MayFailRule.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/README.md (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/pom.xml (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTree.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/balancedbinarytree/Tree.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/binarygap/BinaryGap.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/combinatorics/Combinatorics.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStream.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStream2.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/knapsack/Knapsack.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithm.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithm.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/mergesortedarrays/SortedArrays.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Edge.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/relativelyprime/RelativelyPrime.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeNode.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeReverser.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/src/main/resources/logback.xml (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTreeUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbinarytree/BinaryTreeDataProvider.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/binarygap/BinaryGapUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/combinatorics/CombinatoricsUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStreamUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/knapsack/KnapsackUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithmUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithmUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/mergesortedarrays/SortedArraysUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/relativelyprime/RelativelyPrimeUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/reversingtree/TreeReverserUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-5/src/test/resources/input.json (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/README.md (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/pom.xml (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDeque.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingString.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/BoruvkaMST.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/UnionFind.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/caesarcipher/CaesarCipher.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/gradientdescent/GradientDescent.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/Follower.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/CycleDetector.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/DisjointSetInfo.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/Kruskal.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/LinkedListReversal.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/ListNode.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/minheapmerge/HeapNode.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/minheapmerge/MinHeap.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Board.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Cell.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Computer.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Human.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Move.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Play2048.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/BruteForceTopKElementsFinder.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/MaxHeapTopKElementsFinder.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/TopKElementsFinder.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/TreeSetTopKElementsFinder.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/main/resources/logback.xml (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/boruvka/BoruvkaUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/caesarcipher/CaesarCipherUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/gradientdescent/GradientDescentUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/kruskal/KruskalUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/linkedlist/LinkedListReversalUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/minheapmerge/MinHeapUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/topkelements/TopKElementsFinderUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/README.md (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/pom.xml (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/src/main/java/com/baeldung/algorithms/binarysearch/BinarySearch.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithm.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Node.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Tree.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/src/main/java/com/baeldung/algorithms/dfs/BinaryTree.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/src/main/java/com/baeldung/algorithms/dfs/Graph.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/src/main/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearch.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/src/main/java/com/baeldung/algorithms/kthsmallest/KthSmallest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/MonteCarloTreeSearch.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/State.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/UCT.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Board.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Position.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tree/Node.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tree/Tree.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/Point.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/QuadTree.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/Region.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/src/main/java/com/baeldung/algorithms/suffixtree/Node.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/src/main/java/com/baeldung/algorithms/suffixtree/SuffixTree.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/src/main/java/com/baeldung/algorithms/textsearch/TextSearchAlgorithms.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/src/main/resources/logback.xml (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/src/test/java/com/baeldung/algorithms/binarysearch/BinarySearchUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/src/test/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithmUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/BinaryTreeUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/GraphUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/src/test/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearchUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/src/test/java/com/baeldung/algorithms/kthsmallest/KthSmallestUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/src/test/java/com/baeldung/algorithms/mcts/MCTSUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/src/test/java/com/baeldung/algorithms/quadtree/QuadTreeSearchUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/src/test/java/com/baeldung/algorithms/suffixtree/SuffixTreeUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-searching/src/test/java/com/baeldung/algorithms/textsearch/TextSearchAlgorithmsUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting-2/.gitignore (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting-2/README.md (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting-2/pom.xml (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/bynumber/NaturalOrderComparators.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/inoutsort/InOutSort.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/BentleyMcIlroyPartioning.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/DutchNationalFlagPartioning.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/Partition.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/SortingUtils.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/stringsort/AnagramValidator.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting-2/src/main/resources/logback.xml (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/bynumber/NaturalOrderComparatorsUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/inoutsort/InOutSortUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/BentleyMcilroyPartitioningUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/DNFThreeWayQuickSortUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/stringsort/AnagramValidatorUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/stringsort/SortStringUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting/.gitignore (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting/README.md (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting/pom.xml (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting/src/main/java/com/baeldung/algorithms/bubblesort/BubbleSort.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting/src/main/java/com/baeldung/algorithms/counting/CountingSort.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting/src/main/java/com/baeldung/algorithms/heapsort/Heap.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting/src/main/java/com/baeldung/algorithms/insertionsort/InsertionSort.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting/src/main/java/com/baeldung/algorithms/mergesort/MergeSort.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting/src/main/java/com/baeldung/algorithms/quicksort/QuickSort.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting/src/main/java/com/baeldung/algorithms/quicksort/ThreeWayQuickSort.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting/src/main/java/com/baeldung/algorithms/radixsort/RadixSort.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting/src/main/java/com/baeldung/algorithms/selectionsort/SelectionSort.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting/src/main/java/com/baeldung/algorithms/shellsort/ShellSort.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting/src/main/resources/logback.xml (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting/src/test/java/com/baeldung/algorithms/bubblesort/BubbleSortUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting/src/test/java/com/baeldung/algorithms/counting/CountingSortUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting/src/test/java/com/baeldung/algorithms/heapsort/HeapUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting/src/test/java/com/baeldung/algorithms/insertionsort/InsertionSortUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting/src/test/java/com/baeldung/algorithms/mergesort/MergeSortUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/QuickSortUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/ThreeWayQuickSortUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting/src/test/java/com/baeldung/algorithms/radixsort/RadixSortUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting/src/test/java/com/baeldung/algorithms/selectionsort/SelectionSortUnitTest.java (100%) rename {algorithms-module => algorithms-modules}/algorithms-sorting/src/test/java/com/baeldung/algorithms/shellsort/ShellSortUnitTest.java (100%) create mode 100644 algorithms-modules/pom.xml diff --git a/algorithms-module/algorithms-genetic/.gitignore b/algorithms-modules/algorithms-genetic/.gitignore similarity index 100% rename from algorithms-module/algorithms-genetic/.gitignore rename to algorithms-modules/algorithms-genetic/.gitignore diff --git a/algorithms-module/algorithms-genetic/README.md b/algorithms-modules/algorithms-genetic/README.md similarity index 100% rename from algorithms-module/algorithms-genetic/README.md rename to algorithms-modules/algorithms-genetic/README.md diff --git a/algorithms-module/algorithms-genetic/pom.xml b/algorithms-modules/algorithms-genetic/pom.xml similarity index 100% rename from algorithms-module/algorithms-genetic/pom.xml rename to algorithms-modules/algorithms-genetic/pom.xml diff --git a/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/RunAlgorithm.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/RunAlgorithm.java similarity index 100% rename from algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/RunAlgorithm.java rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/RunAlgorithm.java diff --git a/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/City.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/City.java similarity index 100% rename from algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/City.java rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/City.java diff --git a/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/SimulatedAnnealing.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/SimulatedAnnealing.java similarity index 100% rename from algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/SimulatedAnnealing.java rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/SimulatedAnnealing.java diff --git a/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/Travel.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/Travel.java similarity index 100% rename from algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/Travel.java rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/Travel.java diff --git a/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/ant_colony/Ant.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/ant_colony/Ant.java similarity index 100% rename from algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/ant_colony/Ant.java rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/ant_colony/Ant.java diff --git a/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/ant_colony/AntColonyOptimization.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/ant_colony/AntColonyOptimization.java similarity index 100% rename from algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/ant_colony/AntColonyOptimization.java rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/ant_colony/AntColonyOptimization.java diff --git a/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/Individual.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/Individual.java similarity index 100% rename from algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/Individual.java rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/Individual.java diff --git a/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/Population.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/Population.java similarity index 100% rename from algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/Population.java rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/Population.java diff --git a/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/SimpleGeneticAlgorithm.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/SimpleGeneticAlgorithm.java similarity index 100% rename from algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/SimpleGeneticAlgorithm.java rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/SimpleGeneticAlgorithm.java diff --git a/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/Knapsack.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/Knapsack.java similarity index 100% rename from algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/Knapsack.java rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/Knapsack.java diff --git a/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/KnapsackFF.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/KnapsackFF.java similarity index 100% rename from algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/KnapsackFF.java rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/KnapsackFF.java diff --git a/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/KnapsackItem.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/KnapsackItem.java similarity index 100% rename from algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/KnapsackItem.java rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/KnapsackItem.java diff --git a/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SimpleGeneticAlgorithm.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SimpleGeneticAlgorithm.java similarity index 100% rename from algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SimpleGeneticAlgorithm.java rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SimpleGeneticAlgorithm.java diff --git a/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SpringsteenProblem.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SpringsteenProblem.java similarity index 100% rename from algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SpringsteenProblem.java rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SpringsteenProblem.java diff --git a/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SpringsteenRecord.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SpringsteenRecord.java similarity index 100% rename from algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SpringsteenRecord.java rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SpringsteenRecord.java diff --git a/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SubsetSum.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SubsetSum.java similarity index 100% rename from algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SubsetSum.java rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SubsetSum.java diff --git a/algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/TravelingSalesman.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/TravelingSalesman.java similarity index 100% rename from algorithms-module/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/TravelingSalesman.java rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/TravelingSalesman.java diff --git a/algorithms-module/algorithms-genetic/src/main/resources/logback.xml b/algorithms-modules/algorithms-genetic/src/main/resources/logback.xml similarity index 100% rename from algorithms-module/algorithms-genetic/src/main/resources/logback.xml rename to algorithms-modules/algorithms-genetic/src/main/resources/logback.xml diff --git a/algorithms-module/algorithms-genetic/src/test/java/com/baeldung/algorithms/AntColonyOptimizationLongRunningUnitTest.java b/algorithms-modules/algorithms-genetic/src/test/java/com/baeldung/algorithms/AntColonyOptimizationLongRunningUnitTest.java similarity index 100% rename from algorithms-module/algorithms-genetic/src/test/java/com/baeldung/algorithms/AntColonyOptimizationLongRunningUnitTest.java rename to algorithms-modules/algorithms-genetic/src/test/java/com/baeldung/algorithms/AntColonyOptimizationLongRunningUnitTest.java diff --git a/algorithms-module/algorithms-genetic/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmLongRunningUnitTest.java b/algorithms-modules/algorithms-genetic/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmLongRunningUnitTest.java similarity index 100% rename from algorithms-module/algorithms-genetic/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmLongRunningUnitTest.java rename to algorithms-modules/algorithms-genetic/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmLongRunningUnitTest.java diff --git a/algorithms-module/algorithms-genetic/src/test/java/com/baeldung/algorithms/SimulatedAnnealingLongRunningUnitTest.java b/algorithms-modules/algorithms-genetic/src/test/java/com/baeldung/algorithms/SimulatedAnnealingLongRunningUnitTest.java similarity index 100% rename from algorithms-module/algorithms-genetic/src/test/java/com/baeldung/algorithms/SimulatedAnnealingLongRunningUnitTest.java rename to algorithms-modules/algorithms-genetic/src/test/java/com/baeldung/algorithms/SimulatedAnnealingLongRunningUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-1/README.md b/algorithms-modules/algorithms-miscellaneous-1/README.md similarity index 100% rename from algorithms-module/algorithms-miscellaneous-1/README.md rename to algorithms-modules/algorithms-miscellaneous-1/README.md diff --git a/algorithms-module/algorithms-miscellaneous-1/pom.xml b/algorithms-modules/algorithms-miscellaneous-1/pom.xml similarity index 100% rename from algorithms-module/algorithms-miscellaneous-1/pom.xml rename to algorithms-modules/algorithms-miscellaneous-1/pom.xml diff --git a/algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/FiniteStateMachine.java b/algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/FiniteStateMachine.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/FiniteStateMachine.java rename to algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/FiniteStateMachine.java diff --git a/algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtFiniteStateMachine.java b/algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtFiniteStateMachine.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtFiniteStateMachine.java rename to algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtFiniteStateMachine.java diff --git a/algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtState.java b/algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtState.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtState.java rename to algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtState.java diff --git a/algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtTransition.java b/algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtTransition.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtTransition.java rename to algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtTransition.java diff --git a/algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/State.java b/algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/State.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/State.java rename to algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/State.java diff --git a/algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/Transition.java b/algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/Transition.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/Transition.java rename to algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/Transition.java diff --git a/algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/hillclimbing/HillClimbing.java b/algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/hillclimbing/HillClimbing.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/hillclimbing/HillClimbing.java rename to algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/hillclimbing/HillClimbing.java diff --git a/algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/hillclimbing/State.java b/algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/hillclimbing/State.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/hillclimbing/State.java rename to algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/hillclimbing/State.java diff --git a/algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/kthlargest/FindKthLargest.java b/algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/kthlargest/FindKthLargest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/kthlargest/FindKthLargest.java rename to algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/kthlargest/FindKthLargest.java diff --git a/algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/GameOfBones.java b/algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/GameOfBones.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/GameOfBones.java rename to algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/GameOfBones.java diff --git a/algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/MiniMax.java b/algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/MiniMax.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/MiniMax.java rename to algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/MiniMax.java diff --git a/algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/Node.java b/algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/Node.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/Node.java rename to algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/Node.java diff --git a/algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/Tree.java b/algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/Tree.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/Tree.java rename to algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/Tree.java diff --git a/algorithms-module/algorithms-miscellaneous-1/src/main/resources/logback.xml b/algorithms-modules/algorithms-miscellaneous-1/src/main/resources/logback.xml similarity index 100% rename from algorithms-module/algorithms-miscellaneous-1/src/main/resources/logback.xml rename to algorithms-modules/algorithms-miscellaneous-1/src/main/resources/logback.xml diff --git a/algorithms-module/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/HillClimbingAlgorithmUnitTest.java b/algorithms-modules/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/HillClimbingAlgorithmUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/HillClimbingAlgorithmUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/HillClimbingAlgorithmUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/RtFiniteStateMachineLongRunningUnitTest.java b/algorithms-modules/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/RtFiniteStateMachineLongRunningUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/RtFiniteStateMachineLongRunningUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/RtFiniteStateMachineLongRunningUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/kthlargest/FindKthLargestUnitTest.java b/algorithms-modules/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/kthlargest/FindKthLargestUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/kthlargest/FindKthLargestUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/kthlargest/FindKthLargestUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/minimax/MinimaxUnitTest.java b/algorithms-modules/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/minimax/MinimaxUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/minimax/MinimaxUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/minimax/MinimaxUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-2/README.md b/algorithms-modules/algorithms-miscellaneous-2/README.md similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/README.md rename to algorithms-modules/algorithms-miscellaneous-2/README.md diff --git a/algorithms-module/algorithms-miscellaneous-2/pom.xml b/algorithms-modules/algorithms-miscellaneous-2/pom.xml similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/pom.xml rename to algorithms-modules/algorithms-miscellaneous-2/pom.xml diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/RunAlgorithm.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/RunAlgorithm.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/RunAlgorithm.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/RunAlgorithm.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceBase.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceBase.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceBase.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceBase.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceDynamicProgramming.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceDynamicProgramming.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceDynamicProgramming.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceDynamicProgramming.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceRecursive.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceRecursive.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceRecursive.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceRecursive.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Dijkstra.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Dijkstra.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Dijkstra.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Dijkstra.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Graph.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Graph.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Graph.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Graph.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Node.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Node.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Node.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Node.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionBruteForce.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionBruteForce.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionBruteForce.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionBruteForce.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionByFastAndSlowIterators.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionByFastAndSlowIterators.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionByFastAndSlowIterators.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionByFastAndSlowIterators.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionByHashing.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionByHashing.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionByHashing.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionByHashing.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionResult.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionResult.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionResult.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionResult.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalBruteForce.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalBruteForce.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalBruteForce.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalBruteForce.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalByCountingLoopNodes.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalByCountingLoopNodes.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalByCountingLoopNodes.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalByCountingLoopNodes.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalWithoutCountingLoopNodes.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalWithoutCountingLoopNodes.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalWithoutCountingLoopNodes.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalWithoutCountingLoopNodes.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/Node.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/Node.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/Node.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/Node.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/BFSMazeSolver.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/BFSMazeSolver.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/BFSMazeSolver.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/BFSMazeSolver.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/Coordinate.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/Coordinate.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/Coordinate.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/Coordinate.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/DFSMazeSolver.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/DFSMazeSolver.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/DFSMazeSolver.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/DFSMazeSolver.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/Maze.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/Maze.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/Maze.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/Maze.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/MazeDriver.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/MazeDriver.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/MazeDriver.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/MazeDriver.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/numberwordconverter/NumberWordConverter.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/numberwordconverter/NumberWordConverter.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/numberwordconverter/NumberWordConverter.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/numberwordconverter/NumberWordConverter.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/InputData.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/InputData.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/InputData.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/InputData.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/Item.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/Item.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/Item.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/Item.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/SlopeOne.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/SlopeOne.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/SlopeOne.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/SlopeOne.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/User.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/User.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/User.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/User.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/ColumnNode.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/ColumnNode.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/ColumnNode.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/ColumnNode.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingLinks.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingLinks.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingLinks.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingLinks.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingNode.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingNode.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingNode.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingNode.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/resources/logback.xml b/algorithms-modules/algorithms-miscellaneous-2/src/main/resources/logback.xml similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/resources/logback.xml rename to algorithms-modules/algorithms-miscellaneous-2/src/main/resources/logback.xml diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/resources/maze/maze1.txt b/algorithms-modules/algorithms-miscellaneous-2/src/main/resources/maze/maze1.txt similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/resources/maze/maze1.txt rename to algorithms-modules/algorithms-miscellaneous-2/src/main/resources/maze/maze1.txt diff --git a/algorithms-module/algorithms-miscellaneous-2/src/main/resources/maze/maze2.txt b/algorithms-modules/algorithms-miscellaneous-2/src/main/resources/maze/maze2.txt similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/main/resources/maze/maze2.txt rename to algorithms-modules/algorithms-miscellaneous-2/src/main/resources/maze/maze2.txt diff --git a/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/DijkstraAlgorithmLongRunningUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/DijkstraAlgorithmLongRunningUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/DijkstraAlgorithmLongRunningUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/DijkstraAlgorithmLongRunningUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/Graph.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/Graph.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/Graph.java rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/Graph.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/GraphNode.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/GraphNode.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/GraphNode.java rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/GraphNode.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/RouteFinder.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/RouteFinder.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/RouteFinder.java rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/RouteFinder.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/RouteNode.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/RouteNode.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/RouteNode.java rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/RouteNode.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/Scorer.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/Scorer.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/Scorer.java rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/Scorer.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/HaversineScorer.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/HaversineScorer.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/HaversineScorer.java rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/HaversineScorer.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/RouteFinderIntegrationTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/RouteFinderIntegrationTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/RouteFinderIntegrationTest.java rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/RouteFinderIntegrationTest.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/Station.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/Station.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/Station.java rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/Station.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceDataProvider.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceDataProvider.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceDataProvider.java rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceDataProvider.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionBruteForceUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionBruteForceUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionBruteForceUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionBruteForceUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByFastAndSlowIteratorsUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByFastAndSlowIteratorsUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByFastAndSlowIteratorsUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByFastAndSlowIteratorsUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByHashingUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByHashingUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByHashingUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByHashingUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionTestBase.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionTestBase.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionTestBase.java rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionTestBase.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalBruteForceUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalBruteForceUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalBruteForceUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalBruteForceUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalByCountingLoopNodesUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalByCountingLoopNodesUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalByCountingLoopNodesUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalByCountingLoopNodesUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalWithoutCountingLoopNodesUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalWithoutCountingLoopNodesUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalWithoutCountingLoopNodesUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalWithoutCountingLoopNodesUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/moneywords/NumberWordConverterUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/moneywords/NumberWordConverterUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/moneywords/NumberWordConverterUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/moneywords/NumberWordConverterUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/CompleteGraphUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/CompleteGraphUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/CompleteGraphUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/CompleteGraphUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/DirectedGraphUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/DirectedGraphUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/DirectedGraphUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/DirectedGraphUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/EulerianCircuitUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/EulerianCircuitUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/EulerianCircuitUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/EulerianCircuitUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/GraphImageGenerationUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/GraphImageGenerationUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/GraphImageGenerationUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/GraphImageGenerationUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-2/src/test/resources/graph.png b/algorithms-modules/algorithms-miscellaneous-2/src/test/resources/graph.png similarity index 100% rename from algorithms-module/algorithms-miscellaneous-2/src/test/resources/graph.png rename to algorithms-modules/algorithms-miscellaneous-2/src/test/resources/graph.png diff --git a/algorithms-module/algorithms-miscellaneous-3/.gitignore b/algorithms-modules/algorithms-miscellaneous-3/.gitignore similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/.gitignore rename to algorithms-modules/algorithms-miscellaneous-3/.gitignore diff --git a/algorithms-module/algorithms-miscellaneous-3/README.md b/algorithms-modules/algorithms-miscellaneous-3/README.md similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/README.md rename to algorithms-modules/algorithms-miscellaneous-3/README.md diff --git a/algorithms-module/algorithms-miscellaneous-3/pom.xml b/algorithms-modules/algorithms-miscellaneous-3/pom.xml similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/pom.xml rename to algorithms-modules/algorithms-miscellaneous-3/pom.xml diff --git a/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/checksortedlist/Employee.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/checksortedlist/Employee.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/checksortedlist/Employee.java rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/checksortedlist/Employee.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/checksortedlist/SortedListChecker.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/checksortedlist/SortedListChecker.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/checksortedlist/SortedListChecker.java rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/checksortedlist/SortedListChecker.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/enumstatemachine/LeaveRequestState.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/enumstatemachine/LeaveRequestState.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/enumstatemachine/LeaveRequestState.java rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/enumstatemachine/LeaveRequestState.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/graphcycledetection/domain/Graph.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/graphcycledetection/domain/Graph.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/graphcycledetection/domain/Graph.java rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/graphcycledetection/domain/Graph.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/graphcycledetection/domain/Vertex.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/graphcycledetection/domain/Vertex.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/graphcycledetection/domain/Vertex.java rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/graphcycledetection/domain/Vertex.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Centroid.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Centroid.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Centroid.java rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Centroid.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Distance.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Distance.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Distance.java rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Distance.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Errors.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Errors.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Errors.java rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Errors.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/EuclideanDistance.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/EuclideanDistance.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/EuclideanDistance.java rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/EuclideanDistance.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/KMeans.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/KMeans.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/KMeans.java rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/KMeans.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/LastFm.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/LastFm.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/LastFm.java rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/LastFm.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/LastFmService.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/LastFmService.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/LastFmService.java rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/LastFmService.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Record.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Record.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Record.java rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Record.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamples.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamples.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamples.java rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamples.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/romannumerals/RomanArabicConverter.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/romannumerals/RomanArabicConverter.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/romannumerals/RomanArabicConverter.java rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/romannumerals/RomanArabicConverter.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/romannumerals/RomanNumeral.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/romannumerals/RomanNumeral.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/romannumerals/RomanNumeral.java rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/romannumerals/RomanNumeral.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddle.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddle.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddle.java rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddle.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/MyNode.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/MyNode.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/MyNode.java rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/MyNode.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/RotateArray.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/RotateArray.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/RotateArray.java rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/RotateArray.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/TwoSum.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/TwoSum.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/TwoSum.java rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/TwoSum.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/folding/FoldingHash.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/folding/FoldingHash.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/folding/FoldingHash.java rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/folding/FoldingHash.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/folding/Main.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/folding/Main.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/main/java/com/baeldung/folding/Main.java rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/folding/Main.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/main/resources/kmeans/artists.json b/algorithms-modules/algorithms-miscellaneous-3/src/main/resources/kmeans/artists.json similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/main/resources/kmeans/artists.json rename to algorithms-modules/algorithms-miscellaneous-3/src/main/resources/kmeans/artists.json diff --git a/algorithms-module/algorithms-miscellaneous-3/src/main/resources/kmeans/lastfm.json b/algorithms-modules/algorithms-miscellaneous-3/src/main/resources/kmeans/lastfm.json similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/main/resources/kmeans/lastfm.json rename to algorithms-modules/algorithms-miscellaneous-3/src/main/resources/kmeans/lastfm.json diff --git a/algorithms-module/algorithms-miscellaneous-3/src/main/resources/kmeans/radial.html b/algorithms-modules/algorithms-miscellaneous-3/src/main/resources/kmeans/radial.html similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/main/resources/kmeans/radial.html rename to algorithms-modules/algorithms-miscellaneous-3/src/main/resources/kmeans/radial.html diff --git a/algorithms-module/algorithms-miscellaneous-3/src/main/resources/logback.xml b/algorithms-modules/algorithms-miscellaneous-3/src/main/resources/logback.xml similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/main/resources/logback.xml rename to algorithms-modules/algorithms-miscellaneous-3/src/main/resources/logback.xml diff --git a/algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/analysis/AnalysisRunnerLiveTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/analysis/AnalysisRunnerLiveTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/analysis/AnalysisRunnerLiveTest.java rename to algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/analysis/AnalysisRunnerLiveTest.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/checksortedlist/SortedListCheckerUnitTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/checksortedlist/SortedListCheckerUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/checksortedlist/SortedListCheckerUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/checksortedlist/SortedListCheckerUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/enumstatemachine/LeaveRequestStateUnitTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/enumstatemachine/LeaveRequestStateUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/enumstatemachine/LeaveRequestStateUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/enumstatemachine/LeaveRequestStateUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/graphcycledetection/GraphCycleDetectionUnitTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/graphcycledetection/GraphCycleDetectionUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/graphcycledetection/GraphCycleDetectionUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/graphcycledetection/GraphCycleDetectionUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamplesUnitTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamplesUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamplesUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamplesUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/romannumerals/RomanArabicConverterUnitTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/romannumerals/RomanArabicConverterUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/romannumerals/RomanArabicConverterUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/romannumerals/RomanArabicConverterUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddleUnitTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddleUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddleUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddleUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/RotateArrayUnitTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/RotateArrayUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/RotateArrayUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/RotateArrayUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/TwoSumUnitTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/TwoSumUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/TwoSumUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/TwoSumUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterStatistics.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterStatistics.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterStatistics.java rename to algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterStatistics.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUnitTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUtil.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUtil.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUtil.java rename to algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUtil.java diff --git a/algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/folding/FoldingHashUnitTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/folding/FoldingHashUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-3/src/test/java/com/baeldung/folding/FoldingHashUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/folding/FoldingHashUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-4/README.md b/algorithms-modules/algorithms-miscellaneous-4/README.md similarity index 100% rename from algorithms-module/algorithms-miscellaneous-4/README.md rename to algorithms-modules/algorithms-miscellaneous-4/README.md diff --git a/algorithms-module/algorithms-miscellaneous-4/pom.xml b/algorithms-modules/algorithms-miscellaneous-4/pom.xml similarity index 100% rename from algorithms-module/algorithms-miscellaneous-4/pom.xml rename to algorithms-modules/algorithms-miscellaneous-4/pom.xml diff --git a/algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/MiddleElementLookup.java b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/MiddleElementLookup.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/MiddleElementLookup.java rename to algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/MiddleElementLookup.java diff --git a/algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/Node.java b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/Node.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/Node.java rename to algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/Node.java diff --git a/algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Constants.java b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Constants.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Constants.java rename to algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Constants.java diff --git a/algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/FitnessFunction.java b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/FitnessFunction.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/FitnessFunction.java rename to algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/FitnessFunction.java diff --git a/algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Multiswarm.java b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Multiswarm.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Multiswarm.java rename to algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Multiswarm.java diff --git a/algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Particle.java b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Particle.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Particle.java rename to algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Particle.java diff --git a/algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Swarm.java b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Swarm.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Swarm.java rename to algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Swarm.java diff --git a/algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/permutation/Permutation.java b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/permutation/Permutation.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/permutation/Permutation.java rename to algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/permutation/Permutation.java diff --git a/algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/smallestinteger/SmallestMissingPositiveInteger.java b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/smallestinteger/SmallestMissingPositiveInteger.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/smallestinteger/SmallestMissingPositiveInteger.java rename to algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/smallestinteger/SmallestMissingPositiveInteger.java diff --git a/algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/EnglishAlphabetLetters.java b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/EnglishAlphabetLetters.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/EnglishAlphabetLetters.java rename to algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/EnglishAlphabetLetters.java diff --git a/algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java rename to algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java diff --git a/algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java rename to algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java diff --git a/algorithms-module/algorithms-miscellaneous-4/src/main/resources/logback.xml b/algorithms-modules/algorithms-miscellaneous-4/src/main/resources/logback.xml similarity index 100% rename from algorithms-module/algorithms-miscellaneous-4/src/main/resources/logback.xml rename to algorithms-modules/algorithms-miscellaneous-4/src/main/resources/logback.xml diff --git a/algorithms-module/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/MiddleElementLookupUnitTest.java b/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/MiddleElementLookupUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/MiddleElementLookupUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/MiddleElementLookupUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/LolFitnessFunction.java b/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/LolFitnessFunction.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/LolFitnessFunction.java rename to algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/LolFitnessFunction.java diff --git a/algorithms-module/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/MultiswarmUnitTest.java b/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/MultiswarmUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/MultiswarmUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/MultiswarmUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/smallestinteger/SmallestMissingPositiveIntegerUnitTest.java b/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/smallestinteger/SmallestMissingPositiveIntegerUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/smallestinteger/SmallestMissingPositiveIntegerUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/smallestinteger/SmallestMissingPositiveIntegerUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/EnglishAlphabetLettersUnitTest.java b/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/EnglishAlphabetLettersUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/EnglishAlphabetLettersUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/EnglishAlphabetLettersUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java b/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java b/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/support/MayFailRule.java b/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/support/MayFailRule.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/support/MayFailRule.java rename to algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/support/MayFailRule.java diff --git a/algorithms-module/algorithms-miscellaneous-5/README.md b/algorithms-modules/algorithms-miscellaneous-5/README.md similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/README.md rename to algorithms-modules/algorithms-miscellaneous-5/README.md diff --git a/algorithms-module/algorithms-miscellaneous-5/pom.xml b/algorithms-modules/algorithms-miscellaneous-5/pom.xml similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/pom.xml rename to algorithms-modules/algorithms-miscellaneous-5/pom.xml diff --git a/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTree.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTree.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTree.java rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTree.java diff --git a/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/balancedbinarytree/Tree.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/balancedbinarytree/Tree.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/balancedbinarytree/Tree.java rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/balancedbinarytree/Tree.java diff --git a/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/binarygap/BinaryGap.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/binarygap/BinaryGap.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/binarygap/BinaryGap.java rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/binarygap/BinaryGap.java diff --git a/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/combinatorics/Combinatorics.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/combinatorics/Combinatorics.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/combinatorics/Combinatorics.java rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/combinatorics/Combinatorics.java diff --git a/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java diff --git a/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStream.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStream.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStream.java rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStream.java diff --git a/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStream2.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStream2.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStream2.java rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStream2.java diff --git a/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/knapsack/Knapsack.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/knapsack/Knapsack.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/knapsack/Knapsack.java rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/knapsack/Knapsack.java diff --git a/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithm.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithm.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithm.java rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithm.java diff --git a/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithm.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithm.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithm.java rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithm.java diff --git a/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/mergesortedarrays/SortedArrays.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/mergesortedarrays/SortedArrays.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/mergesortedarrays/SortedArrays.java rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/mergesortedarrays/SortedArrays.java diff --git a/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Edge.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Edge.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Edge.java rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Edge.java diff --git a/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java diff --git a/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java diff --git a/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/relativelyprime/RelativelyPrime.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/relativelyprime/RelativelyPrime.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/relativelyprime/RelativelyPrime.java rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/relativelyprime/RelativelyPrime.java diff --git a/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeNode.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeNode.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeNode.java rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeNode.java diff --git a/algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeReverser.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeReverser.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeReverser.java rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeReverser.java diff --git a/algorithms-module/algorithms-miscellaneous-5/src/main/resources/logback.xml b/algorithms-modules/algorithms-miscellaneous-5/src/main/resources/logback.xml similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/src/main/resources/logback.xml rename to algorithms-modules/algorithms-miscellaneous-5/src/main/resources/logback.xml diff --git a/algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTreeUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTreeUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTreeUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTreeUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbinarytree/BinaryTreeDataProvider.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbinarytree/BinaryTreeDataProvider.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbinarytree/BinaryTreeDataProvider.java rename to algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbinarytree/BinaryTreeDataProvider.java diff --git a/algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/binarygap/BinaryGapUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/binarygap/BinaryGapUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/binarygap/BinaryGapUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/binarygap/BinaryGapUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/combinatorics/CombinatoricsUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/combinatorics/CombinatoricsUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/combinatorics/CombinatoricsUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/combinatorics/CombinatoricsUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStreamUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStreamUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStreamUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStreamUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/knapsack/KnapsackUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/knapsack/KnapsackUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/knapsack/KnapsackUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/knapsack/KnapsackUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithmUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithmUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithmUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithmUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithmUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithmUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithmUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithmUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/mergesortedarrays/SortedArraysUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/mergesortedarrays/SortedArraysUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/mergesortedarrays/SortedArraysUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/mergesortedarrays/SortedArraysUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/relativelyprime/RelativelyPrimeUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/relativelyprime/RelativelyPrimeUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/relativelyprime/RelativelyPrimeUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/relativelyprime/RelativelyPrimeUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/reversingtree/TreeReverserUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/reversingtree/TreeReverserUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/reversingtree/TreeReverserUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/reversingtree/TreeReverserUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-5/src/test/resources/input.json b/algorithms-modules/algorithms-miscellaneous-5/src/test/resources/input.json similarity index 100% rename from algorithms-module/algorithms-miscellaneous-5/src/test/resources/input.json rename to algorithms-modules/algorithms-miscellaneous-5/src/test/resources/input.json diff --git a/algorithms-module/algorithms-miscellaneous-6/README.md b/algorithms-modules/algorithms-miscellaneous-6/README.md similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/README.md rename to algorithms-modules/algorithms-miscellaneous-6/README.md diff --git a/algorithms-module/algorithms-miscellaneous-6/pom.xml b/algorithms-modules/algorithms-miscellaneous-6/pom.xml similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/pom.xml rename to algorithms-modules/algorithms-miscellaneous-6/pom.xml diff --git a/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDeque.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDeque.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDeque.java rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDeque.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingString.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingString.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingString.java rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingString.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/BoruvkaMST.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/BoruvkaMST.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/BoruvkaMST.java rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/BoruvkaMST.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/UnionFind.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/UnionFind.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/UnionFind.java rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/UnionFind.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/caesarcipher/CaesarCipher.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/caesarcipher/CaesarCipher.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/caesarcipher/CaesarCipher.java rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/caesarcipher/CaesarCipher.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/gradientdescent/GradientDescent.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/gradientdescent/GradientDescent.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/gradientdescent/GradientDescent.java rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/gradientdescent/GradientDescent.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/Follower.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/Follower.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/Follower.java rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/Follower.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/CycleDetector.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/CycleDetector.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/CycleDetector.java rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/CycleDetector.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/DisjointSetInfo.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/DisjointSetInfo.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/DisjointSetInfo.java rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/DisjointSetInfo.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/Kruskal.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/Kruskal.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/Kruskal.java rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/Kruskal.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/LinkedListReversal.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/LinkedListReversal.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/LinkedListReversal.java rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/LinkedListReversal.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/ListNode.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/ListNode.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/ListNode.java rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/ListNode.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/minheapmerge/HeapNode.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/minheapmerge/HeapNode.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/minheapmerge/HeapNode.java rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/minheapmerge/HeapNode.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/minheapmerge/MinHeap.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/minheapmerge/MinHeap.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/minheapmerge/MinHeap.java rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/minheapmerge/MinHeap.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Board.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Board.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Board.java rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Board.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Cell.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Cell.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Cell.java rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Cell.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Computer.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Computer.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Computer.java rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Computer.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Human.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Human.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Human.java rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Human.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Move.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Move.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Move.java rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Move.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Play2048.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Play2048.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Play2048.java rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Play2048.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/BruteForceTopKElementsFinder.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/BruteForceTopKElementsFinder.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/BruteForceTopKElementsFinder.java rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/BruteForceTopKElementsFinder.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/MaxHeapTopKElementsFinder.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/MaxHeapTopKElementsFinder.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/MaxHeapTopKElementsFinder.java rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/MaxHeapTopKElementsFinder.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/TopKElementsFinder.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/TopKElementsFinder.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/TopKElementsFinder.java rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/TopKElementsFinder.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/TreeSetTopKElementsFinder.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/TreeSetTopKElementsFinder.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/TreeSetTopKElementsFinder.java rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/TreeSetTopKElementsFinder.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/main/resources/logback.xml b/algorithms-modules/algorithms-miscellaneous-6/src/main/resources/logback.xml similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/main/resources/logback.xml rename to algorithms-modules/algorithms-miscellaneous-6/src/main/resources/logback.xml diff --git a/algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/boruvka/BoruvkaUnitTest.java b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/boruvka/BoruvkaUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/boruvka/BoruvkaUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/boruvka/BoruvkaUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/caesarcipher/CaesarCipherUnitTest.java b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/caesarcipher/CaesarCipherUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/caesarcipher/CaesarCipherUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/caesarcipher/CaesarCipherUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/gradientdescent/GradientDescentUnitTest.java b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/gradientdescent/GradientDescentUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/gradientdescent/GradientDescentUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/gradientdescent/GradientDescentUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/kruskal/KruskalUnitTest.java b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/kruskal/KruskalUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/kruskal/KruskalUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/kruskal/KruskalUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/linkedlist/LinkedListReversalUnitTest.java b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/linkedlist/LinkedListReversalUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/linkedlist/LinkedListReversalUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/linkedlist/LinkedListReversalUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/minheapmerge/MinHeapUnitTest.java b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/minheapmerge/MinHeapUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/minheapmerge/MinHeapUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/minheapmerge/MinHeapUnitTest.java diff --git a/algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/topkelements/TopKElementsFinderUnitTest.java b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/topkelements/TopKElementsFinderUnitTest.java similarity index 100% rename from algorithms-module/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/topkelements/TopKElementsFinderUnitTest.java rename to algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/topkelements/TopKElementsFinderUnitTest.java diff --git a/algorithms-module/algorithms-searching/README.md b/algorithms-modules/algorithms-searching/README.md similarity index 100% rename from algorithms-module/algorithms-searching/README.md rename to algorithms-modules/algorithms-searching/README.md diff --git a/algorithms-module/algorithms-searching/pom.xml b/algorithms-modules/algorithms-searching/pom.xml similarity index 100% rename from algorithms-module/algorithms-searching/pom.xml rename to algorithms-modules/algorithms-searching/pom.xml diff --git a/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/binarysearch/BinarySearch.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/binarysearch/BinarySearch.java similarity index 100% rename from algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/binarysearch/BinarySearch.java rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/binarysearch/BinarySearch.java diff --git a/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithm.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithm.java similarity index 100% rename from algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithm.java rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithm.java diff --git a/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Node.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Node.java similarity index 100% rename from algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Node.java rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Node.java diff --git a/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Tree.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Tree.java similarity index 100% rename from algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Tree.java rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Tree.java diff --git a/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/dfs/BinaryTree.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/dfs/BinaryTree.java similarity index 100% rename from algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/dfs/BinaryTree.java rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/dfs/BinaryTree.java diff --git a/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/dfs/Graph.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/dfs/Graph.java similarity index 100% rename from algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/dfs/Graph.java rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/dfs/Graph.java diff --git a/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearch.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearch.java similarity index 100% rename from algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearch.java rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearch.java diff --git a/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/kthsmallest/KthSmallest.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/kthsmallest/KthSmallest.java similarity index 100% rename from algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/kthsmallest/KthSmallest.java rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/kthsmallest/KthSmallest.java diff --git a/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/MonteCarloTreeSearch.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/MonteCarloTreeSearch.java similarity index 100% rename from algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/MonteCarloTreeSearch.java rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/MonteCarloTreeSearch.java diff --git a/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/State.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/State.java similarity index 100% rename from algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/State.java rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/State.java diff --git a/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/UCT.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/UCT.java similarity index 100% rename from algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/UCT.java rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/UCT.java diff --git a/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Board.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Board.java similarity index 100% rename from algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Board.java rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Board.java diff --git a/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Position.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Position.java similarity index 100% rename from algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Position.java rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Position.java diff --git a/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tree/Node.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tree/Node.java similarity index 100% rename from algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tree/Node.java rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tree/Node.java diff --git a/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tree/Tree.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tree/Tree.java similarity index 100% rename from algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tree/Tree.java rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tree/Tree.java diff --git a/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/Point.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/Point.java similarity index 100% rename from algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/Point.java rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/Point.java diff --git a/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/QuadTree.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/QuadTree.java similarity index 100% rename from algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/QuadTree.java rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/QuadTree.java diff --git a/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/Region.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/Region.java similarity index 100% rename from algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/Region.java rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/Region.java diff --git a/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/suffixtree/Node.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/suffixtree/Node.java similarity index 100% rename from algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/suffixtree/Node.java rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/suffixtree/Node.java diff --git a/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/suffixtree/SuffixTree.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/suffixtree/SuffixTree.java similarity index 100% rename from algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/suffixtree/SuffixTree.java rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/suffixtree/SuffixTree.java diff --git a/algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/textsearch/TextSearchAlgorithms.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/textsearch/TextSearchAlgorithms.java similarity index 100% rename from algorithms-module/algorithms-searching/src/main/java/com/baeldung/algorithms/textsearch/TextSearchAlgorithms.java rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/textsearch/TextSearchAlgorithms.java diff --git a/algorithms-module/algorithms-searching/src/main/resources/logback.xml b/algorithms-modules/algorithms-searching/src/main/resources/logback.xml similarity index 100% rename from algorithms-module/algorithms-searching/src/main/resources/logback.xml rename to algorithms-modules/algorithms-searching/src/main/resources/logback.xml diff --git a/algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/binarysearch/BinarySearchUnitTest.java b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/binarysearch/BinarySearchUnitTest.java similarity index 100% rename from algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/binarysearch/BinarySearchUnitTest.java rename to algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/binarysearch/BinarySearchUnitTest.java diff --git a/algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithmUnitTest.java b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithmUnitTest.java similarity index 100% rename from algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithmUnitTest.java rename to algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithmUnitTest.java diff --git a/algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/BinaryTreeUnitTest.java b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/BinaryTreeUnitTest.java similarity index 100% rename from algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/BinaryTreeUnitTest.java rename to algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/BinaryTreeUnitTest.java diff --git a/algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/GraphUnitTest.java b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/GraphUnitTest.java similarity index 100% rename from algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/GraphUnitTest.java rename to algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/GraphUnitTest.java diff --git a/algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearchUnitTest.java b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearchUnitTest.java similarity index 100% rename from algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearchUnitTest.java rename to algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearchUnitTest.java diff --git a/algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/kthsmallest/KthSmallestUnitTest.java b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/kthsmallest/KthSmallestUnitTest.java similarity index 100% rename from algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/kthsmallest/KthSmallestUnitTest.java rename to algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/kthsmallest/KthSmallestUnitTest.java diff --git a/algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/mcts/MCTSUnitTest.java b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/mcts/MCTSUnitTest.java similarity index 100% rename from algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/mcts/MCTSUnitTest.java rename to algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/mcts/MCTSUnitTest.java diff --git a/algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/quadtree/QuadTreeSearchUnitTest.java b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/quadtree/QuadTreeSearchUnitTest.java similarity index 100% rename from algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/quadtree/QuadTreeSearchUnitTest.java rename to algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/quadtree/QuadTreeSearchUnitTest.java diff --git a/algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/suffixtree/SuffixTreeUnitTest.java b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/suffixtree/SuffixTreeUnitTest.java similarity index 100% rename from algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/suffixtree/SuffixTreeUnitTest.java rename to algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/suffixtree/SuffixTreeUnitTest.java diff --git a/algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/textsearch/TextSearchAlgorithmsUnitTest.java b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/textsearch/TextSearchAlgorithmsUnitTest.java similarity index 100% rename from algorithms-module/algorithms-searching/src/test/java/com/baeldung/algorithms/textsearch/TextSearchAlgorithmsUnitTest.java rename to algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/textsearch/TextSearchAlgorithmsUnitTest.java diff --git a/algorithms-module/algorithms-sorting-2/.gitignore b/algorithms-modules/algorithms-sorting-2/.gitignore similarity index 100% rename from algorithms-module/algorithms-sorting-2/.gitignore rename to algorithms-modules/algorithms-sorting-2/.gitignore diff --git a/algorithms-module/algorithms-sorting-2/README.md b/algorithms-modules/algorithms-sorting-2/README.md similarity index 100% rename from algorithms-module/algorithms-sorting-2/README.md rename to algorithms-modules/algorithms-sorting-2/README.md diff --git a/algorithms-module/algorithms-sorting-2/pom.xml b/algorithms-modules/algorithms-sorting-2/pom.xml similarity index 100% rename from algorithms-module/algorithms-sorting-2/pom.xml rename to algorithms-modules/algorithms-sorting-2/pom.xml diff --git a/algorithms-module/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/bynumber/NaturalOrderComparators.java b/algorithms-modules/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/bynumber/NaturalOrderComparators.java similarity index 100% rename from algorithms-module/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/bynumber/NaturalOrderComparators.java rename to algorithms-modules/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/bynumber/NaturalOrderComparators.java diff --git a/algorithms-module/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/inoutsort/InOutSort.java b/algorithms-modules/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/inoutsort/InOutSort.java similarity index 100% rename from algorithms-module/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/inoutsort/InOutSort.java rename to algorithms-modules/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/inoutsort/InOutSort.java diff --git a/algorithms-module/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/BentleyMcIlroyPartioning.java b/algorithms-modules/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/BentleyMcIlroyPartioning.java similarity index 100% rename from algorithms-module/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/BentleyMcIlroyPartioning.java rename to algorithms-modules/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/BentleyMcIlroyPartioning.java diff --git a/algorithms-module/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/DutchNationalFlagPartioning.java b/algorithms-modules/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/DutchNationalFlagPartioning.java similarity index 100% rename from algorithms-module/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/DutchNationalFlagPartioning.java rename to algorithms-modules/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/DutchNationalFlagPartioning.java diff --git a/algorithms-module/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/Partition.java b/algorithms-modules/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/Partition.java similarity index 100% rename from algorithms-module/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/Partition.java rename to algorithms-modules/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/Partition.java diff --git a/algorithms-module/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/SortingUtils.java b/algorithms-modules/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/SortingUtils.java similarity index 100% rename from algorithms-module/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/SortingUtils.java rename to algorithms-modules/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/SortingUtils.java diff --git a/algorithms-module/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/stringsort/AnagramValidator.java b/algorithms-modules/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/stringsort/AnagramValidator.java similarity index 100% rename from algorithms-module/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/stringsort/AnagramValidator.java rename to algorithms-modules/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/stringsort/AnagramValidator.java diff --git a/algorithms-module/algorithms-sorting-2/src/main/resources/logback.xml b/algorithms-modules/algorithms-sorting-2/src/main/resources/logback.xml similarity index 100% rename from algorithms-module/algorithms-sorting-2/src/main/resources/logback.xml rename to algorithms-modules/algorithms-sorting-2/src/main/resources/logback.xml diff --git a/algorithms-module/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/bynumber/NaturalOrderComparatorsUnitTest.java b/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/bynumber/NaturalOrderComparatorsUnitTest.java similarity index 100% rename from algorithms-module/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/bynumber/NaturalOrderComparatorsUnitTest.java rename to algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/bynumber/NaturalOrderComparatorsUnitTest.java diff --git a/algorithms-module/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/inoutsort/InOutSortUnitTest.java b/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/inoutsort/InOutSortUnitTest.java similarity index 100% rename from algorithms-module/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/inoutsort/InOutSortUnitTest.java rename to algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/inoutsort/InOutSortUnitTest.java diff --git a/algorithms-module/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/BentleyMcilroyPartitioningUnitTest.java b/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/BentleyMcilroyPartitioningUnitTest.java similarity index 100% rename from algorithms-module/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/BentleyMcilroyPartitioningUnitTest.java rename to algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/BentleyMcilroyPartitioningUnitTest.java diff --git a/algorithms-module/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/DNFThreeWayQuickSortUnitTest.java b/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/DNFThreeWayQuickSortUnitTest.java similarity index 100% rename from algorithms-module/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/DNFThreeWayQuickSortUnitTest.java rename to algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/DNFThreeWayQuickSortUnitTest.java diff --git a/algorithms-module/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/stringsort/AnagramValidatorUnitTest.java b/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/stringsort/AnagramValidatorUnitTest.java similarity index 100% rename from algorithms-module/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/stringsort/AnagramValidatorUnitTest.java rename to algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/stringsort/AnagramValidatorUnitTest.java diff --git a/algorithms-module/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/stringsort/SortStringUnitTest.java b/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/stringsort/SortStringUnitTest.java similarity index 100% rename from algorithms-module/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/stringsort/SortStringUnitTest.java rename to algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/stringsort/SortStringUnitTest.java diff --git a/algorithms-module/algorithms-sorting/.gitignore b/algorithms-modules/algorithms-sorting/.gitignore similarity index 100% rename from algorithms-module/algorithms-sorting/.gitignore rename to algorithms-modules/algorithms-sorting/.gitignore diff --git a/algorithms-module/algorithms-sorting/README.md b/algorithms-modules/algorithms-sorting/README.md similarity index 100% rename from algorithms-module/algorithms-sorting/README.md rename to algorithms-modules/algorithms-sorting/README.md diff --git a/algorithms-module/algorithms-sorting/pom.xml b/algorithms-modules/algorithms-sorting/pom.xml similarity index 100% rename from algorithms-module/algorithms-sorting/pom.xml rename to algorithms-modules/algorithms-sorting/pom.xml diff --git a/algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/bubblesort/BubbleSort.java b/algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/bubblesort/BubbleSort.java similarity index 100% rename from algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/bubblesort/BubbleSort.java rename to algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/bubblesort/BubbleSort.java diff --git a/algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java b/algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java similarity index 100% rename from algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java rename to algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java diff --git a/algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java b/algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java similarity index 100% rename from algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java rename to algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java diff --git a/algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/counting/CountingSort.java b/algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/counting/CountingSort.java similarity index 100% rename from algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/counting/CountingSort.java rename to algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/counting/CountingSort.java diff --git a/algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/heapsort/Heap.java b/algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/heapsort/Heap.java similarity index 100% rename from algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/heapsort/Heap.java rename to algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/heapsort/Heap.java diff --git a/algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/insertionsort/InsertionSort.java b/algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/insertionsort/InsertionSort.java similarity index 100% rename from algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/insertionsort/InsertionSort.java rename to algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/insertionsort/InsertionSort.java diff --git a/algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/mergesort/MergeSort.java b/algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/mergesort/MergeSort.java similarity index 100% rename from algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/mergesort/MergeSort.java rename to algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/mergesort/MergeSort.java diff --git a/algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/quicksort/QuickSort.java b/algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/quicksort/QuickSort.java similarity index 100% rename from algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/quicksort/QuickSort.java rename to algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/quicksort/QuickSort.java diff --git a/algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/quicksort/ThreeWayQuickSort.java b/algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/quicksort/ThreeWayQuickSort.java similarity index 100% rename from algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/quicksort/ThreeWayQuickSort.java rename to algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/quicksort/ThreeWayQuickSort.java diff --git a/algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/radixsort/RadixSort.java b/algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/radixsort/RadixSort.java similarity index 100% rename from algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/radixsort/RadixSort.java rename to algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/radixsort/RadixSort.java diff --git a/algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/selectionsort/SelectionSort.java b/algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/selectionsort/SelectionSort.java similarity index 100% rename from algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/selectionsort/SelectionSort.java rename to algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/selectionsort/SelectionSort.java diff --git a/algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/shellsort/ShellSort.java b/algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/shellsort/ShellSort.java similarity index 100% rename from algorithms-module/algorithms-sorting/src/main/java/com/baeldung/algorithms/shellsort/ShellSort.java rename to algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/shellsort/ShellSort.java diff --git a/algorithms-module/algorithms-sorting/src/main/resources/logback.xml b/algorithms-modules/algorithms-sorting/src/main/resources/logback.xml similarity index 100% rename from algorithms-module/algorithms-sorting/src/main/resources/logback.xml rename to algorithms-modules/algorithms-sorting/src/main/resources/logback.xml diff --git a/algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/bubblesort/BubbleSortUnitTest.java b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/bubblesort/BubbleSortUnitTest.java similarity index 100% rename from algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/bubblesort/BubbleSortUnitTest.java rename to algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/bubblesort/BubbleSortUnitTest.java diff --git a/algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java similarity index 100% rename from algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java rename to algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java diff --git a/algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/counting/CountingSortUnitTest.java b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/counting/CountingSortUnitTest.java similarity index 100% rename from algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/counting/CountingSortUnitTest.java rename to algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/counting/CountingSortUnitTest.java diff --git a/algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/heapsort/HeapUnitTest.java b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/heapsort/HeapUnitTest.java similarity index 100% rename from algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/heapsort/HeapUnitTest.java rename to algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/heapsort/HeapUnitTest.java diff --git a/algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/insertionsort/InsertionSortUnitTest.java b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/insertionsort/InsertionSortUnitTest.java similarity index 100% rename from algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/insertionsort/InsertionSortUnitTest.java rename to algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/insertionsort/InsertionSortUnitTest.java diff --git a/algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/mergesort/MergeSortUnitTest.java b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/mergesort/MergeSortUnitTest.java similarity index 100% rename from algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/mergesort/MergeSortUnitTest.java rename to algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/mergesort/MergeSortUnitTest.java diff --git a/algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/QuickSortUnitTest.java b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/QuickSortUnitTest.java similarity index 100% rename from algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/QuickSortUnitTest.java rename to algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/QuickSortUnitTest.java diff --git a/algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/ThreeWayQuickSortUnitTest.java b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/ThreeWayQuickSortUnitTest.java similarity index 100% rename from algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/ThreeWayQuickSortUnitTest.java rename to algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/ThreeWayQuickSortUnitTest.java diff --git a/algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/radixsort/RadixSortUnitTest.java b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/radixsort/RadixSortUnitTest.java similarity index 100% rename from algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/radixsort/RadixSortUnitTest.java rename to algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/radixsort/RadixSortUnitTest.java diff --git a/algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/selectionsort/SelectionSortUnitTest.java b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/selectionsort/SelectionSortUnitTest.java similarity index 100% rename from algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/selectionsort/SelectionSortUnitTest.java rename to algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/selectionsort/SelectionSortUnitTest.java diff --git a/algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/shellsort/ShellSortUnitTest.java b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/shellsort/ShellSortUnitTest.java similarity index 100% rename from algorithms-module/algorithms-sorting/src/test/java/com/baeldung/algorithms/shellsort/ShellSortUnitTest.java rename to algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/shellsort/ShellSortUnitTest.java diff --git a/algorithms-modules/pom.xml b/algorithms-modules/pom.xml new file mode 100644 index 0000000000..4ba819cfe3 --- /dev/null +++ b/algorithms-modules/pom.xml @@ -0,0 +1,29 @@ + + + 4.0.0 + algorithms-modules + algorithms-modules + pom + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + algorithms-genetic + algorithms-miscellaneous-1 + algorithms-miscellaneous-2 + algorithms-miscellaneous-3 + algorithms-miscellaneous-4 + algorithms-miscellaneous-5 + algorithms-miscellaneous-6 + algorithms-searching + algorithms-sorting + algorithms-sorting-2 + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index a8bd79f3f5..5919a930f0 100644 --- a/pom.xml +++ b/pom.xml @@ -333,16 +333,7 @@ akka-http akka-streams - algorithms-genetic - algorithms-miscellaneous-1 - algorithms-miscellaneous-2 - algorithms-miscellaneous-3 - algorithms-miscellaneous-4 - algorithms-miscellaneous-5 - algorithms-miscellaneous-6 - algorithms-searching - algorithms-sorting - algorithms-sorting-2 + algorithms-modules annotations antlr @@ -803,16 +794,7 @@ akka-http akka-streams - algorithms-genetic - algorithms-miscellaneous-1 - algorithms-miscellaneous-2 - algorithms-miscellaneous-3 - algorithms-miscellaneous-4 - algorithms-miscellaneous-5 - algorithms-miscellaneous-6 - algorithms-searching - algorithms-sorting - algorithms-sorting-2 + algorithms-modules annotations antlr From 22f01e2188427bd4cbe5612c2e194dbe9124485b Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Fri, 20 May 2022 14:09:36 -0300 Subject: [PATCH 244/278] isolating application repositories --- .../collection/name/SpringBootCollectionNameApplication.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/SpringBootCollectionNameApplication.java b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/SpringBootCollectionNameApplication.java index 0a5c36db29..e4157b6a53 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/SpringBootCollectionNameApplication.java +++ b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/collection/name/SpringBootCollectionNameApplication.java @@ -4,9 +4,11 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.PropertySource; +import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; @SpringBootApplication @PropertySource("classpath:boot.collection.name/app.properties") +@EnableMongoRepositories(basePackages = { "com.baeldung.boot.collection.name" }) public class SpringBootCollectionNameApplication { public static void main(String... args) { SpringApplication.run(SpringBootCollectionNameApplication.class, args); From 2ea0db57d60b2f497e2082223ff0aa09b103463f Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Sat, 21 May 2022 01:19:50 +0100 Subject: [PATCH 245/278] [JAVA-11789] Add generated classes --- .../java/com/baeldung/schema/Employee.java | 517 ++++++++++++++++++ .../java/com/baeldung/schema/EmployeeKey.java | 307 +++++++++++ 2 files changed, 824 insertions(+) create mode 100644 spring-cloud/spring-cloud-stream/spring-cloud-stream-kafka/src/main/java/com/baeldung/schema/Employee.java create mode 100644 spring-cloud/spring-cloud-stream/spring-cloud-stream-kafka/src/main/java/com/baeldung/schema/EmployeeKey.java diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-kafka/src/main/java/com/baeldung/schema/Employee.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kafka/src/main/java/com/baeldung/schema/Employee.java new file mode 100644 index 0000000000..a805491cea --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kafka/src/main/java/com/baeldung/schema/Employee.java @@ -0,0 +1,517 @@ +/** + * Autogenerated by Avro + * + * DO NOT EDIT DIRECTLY + */ +package com.baeldung.schema; + +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 Employee extends org.apache.avro.specific.SpecificRecordBase implements org.apache.avro.specific.SpecificRecord { + private static final long serialVersionUID = 7340575283344282036L; + public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"Employee\",\"namespace\":\"com.baeldung.schema\",\"fields\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"firstName\",\"type\":\"string\"},{\"name\":\"lastName\",\"type\":\"string\"},{\"name\":\"department\",\"type\":\"string\",\"default\":\"IT \"},{\"name\":\"designation\",\"type\":\"string\",\"default\":\"Software Engineer\"}]}"); + 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 Employee to a ByteBuffer. */ + public java.nio.ByteBuffer toByteBuffer() throws java.io.IOException { + return ENCODER.encode(this); + } + + /** Deserializes a Employee from a ByteBuffer. */ + public static Employee fromByteBuffer( + java.nio.ByteBuffer b) throws java.io.IOException { + return DECODER.decode(b); + } + + @Deprecated public int id; + @Deprecated public java.lang.CharSequence firstName; + @Deprecated public java.lang.CharSequence lastName; + @Deprecated public java.lang.CharSequence department; + @Deprecated public java.lang.CharSequence designation; + + /** + * 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 Employee() {} + + /** + * All-args constructor. + * @param id The new value for id + * @param firstName The new value for firstName + * @param lastName The new value for lastName + * @param department The new value for department + * @param designation The new value for designation + */ + public Employee(java.lang.Integer id, java.lang.CharSequence firstName, java.lang.CharSequence lastName, java.lang.CharSequence department, java.lang.CharSequence designation) { + this.id = id; + this.firstName = firstName; + this.lastName = lastName; + this.department = department; + this.designation = designation; + } + + 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 id; + case 1: return firstName; + case 2: return lastName; + case 3: return department; + case 4: return designation; + 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: id = (java.lang.Integer)value$; break; + case 1: firstName = (java.lang.CharSequence)value$; break; + case 2: lastName = (java.lang.CharSequence)value$; break; + case 3: department = (java.lang.CharSequence)value$; break; + case 4: designation = (java.lang.CharSequence)value$; break; + default: throw new org.apache.avro.AvroRuntimeException("Bad index"); + } + } + + /** + * Gets the value of the 'id' field. + * @return The value of the 'id' field. + */ + public java.lang.Integer getId() { + return id; + } + + /** + * Sets the value of the 'id' field. + * @param value the value to set. + */ + public void setId(java.lang.Integer value) { + this.id = value; + } + + /** + * Gets the value of the 'firstName' field. + * @return The value of the 'firstName' field. + */ + public java.lang.CharSequence getFirstName() { + return firstName; + } + + /** + * Sets the value of the 'firstName' field. + * @param value the value to set. + */ + public void setFirstName(java.lang.CharSequence value) { + this.firstName = value; + } + + /** + * Gets the value of the 'lastName' field. + * @return The value of the 'lastName' field. + */ + public java.lang.CharSequence getLastName() { + return lastName; + } + + /** + * Sets the value of the 'lastName' field. + * @param value the value to set. + */ + public void setLastName(java.lang.CharSequence value) { + this.lastName = value; + } + + /** + * Gets the value of the 'department' field. + * @return The value of the 'department' field. + */ + public java.lang.CharSequence getDepartment() { + return department; + } + + /** + * Sets the value of the 'department' field. + * @param value the value to set. + */ + public void setDepartment(java.lang.CharSequence value) { + this.department = value; + } + + /** + * Gets the value of the 'designation' field. + * @return The value of the 'designation' field. + */ + public java.lang.CharSequence getDesignation() { + return designation; + } + + /** + * Sets the value of the 'designation' field. + * @param value the value to set. + */ + public void setDesignation(java.lang.CharSequence value) { + this.designation = value; + } + + /** + * Creates a new Employee RecordBuilder. + * @return A new Employee RecordBuilder + */ + public static com.baeldung.schema.Employee.Builder newBuilder() { + return new com.baeldung.schema.Employee.Builder(); + } + + /** + * Creates a new Employee RecordBuilder by copying an existing Builder. + * @param other The existing builder to copy. + * @return A new Employee RecordBuilder + */ + public static com.baeldung.schema.Employee.Builder newBuilder(com.baeldung.schema.Employee.Builder other) { + return new com.baeldung.schema.Employee.Builder(other); + } + + /** + * Creates a new Employee RecordBuilder by copying an existing Employee instance. + * @param other The existing instance to copy. + * @return A new Employee RecordBuilder + */ + public static com.baeldung.schema.Employee.Builder newBuilder(com.baeldung.schema.Employee other) { + return new com.baeldung.schema.Employee.Builder(other); + } + + /** + * RecordBuilder for Employee instances. + */ + public static class Builder extends org.apache.avro.specific.SpecificRecordBuilderBase + implements org.apache.avro.data.RecordBuilder { + + private int id; + private java.lang.CharSequence firstName; + private java.lang.CharSequence lastName; + private java.lang.CharSequence department; + private java.lang.CharSequence designation; + + /** 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(com.baeldung.schema.Employee.Builder other) { + super(other); + if (isValidValue(fields()[0], other.id)) { + this.id = data().deepCopy(fields()[0].schema(), other.id); + fieldSetFlags()[0] = true; + } + if (isValidValue(fields()[1], other.firstName)) { + this.firstName = data().deepCopy(fields()[1].schema(), other.firstName); + fieldSetFlags()[1] = true; + } + if (isValidValue(fields()[2], other.lastName)) { + this.lastName = data().deepCopy(fields()[2].schema(), other.lastName); + fieldSetFlags()[2] = true; + } + if (isValidValue(fields()[3], other.department)) { + this.department = data().deepCopy(fields()[3].schema(), other.department); + fieldSetFlags()[3] = true; + } + if (isValidValue(fields()[4], other.designation)) { + this.designation = data().deepCopy(fields()[4].schema(), other.designation); + fieldSetFlags()[4] = true; + } + } + + /** + * Creates a Builder by copying an existing Employee instance + * @param other The existing instance to copy. + */ + private Builder(com.baeldung.schema.Employee other) { + super(SCHEMA$); + if (isValidValue(fields()[0], other.id)) { + this.id = data().deepCopy(fields()[0].schema(), other.id); + fieldSetFlags()[0] = true; + } + if (isValidValue(fields()[1], other.firstName)) { + this.firstName = data().deepCopy(fields()[1].schema(), other.firstName); + fieldSetFlags()[1] = true; + } + if (isValidValue(fields()[2], other.lastName)) { + this.lastName = data().deepCopy(fields()[2].schema(), other.lastName); + fieldSetFlags()[2] = true; + } + if (isValidValue(fields()[3], other.department)) { + this.department = data().deepCopy(fields()[3].schema(), other.department); + fieldSetFlags()[3] = true; + } + if (isValidValue(fields()[4], other.designation)) { + this.designation = data().deepCopy(fields()[4].schema(), other.designation); + fieldSetFlags()[4] = true; + } + } + + /** + * Gets the value of the 'id' field. + * @return The value. + */ + public java.lang.Integer getId() { + return id; + } + + /** + * Sets the value of the 'id' field. + * @param value The value of 'id'. + * @return This builder. + */ + public com.baeldung.schema.Employee.Builder setId(int value) { + validate(fields()[0], value); + this.id = value; + fieldSetFlags()[0] = true; + return this; + } + + /** + * Checks whether the 'id' field has been set. + * @return True if the 'id' field has been set, false otherwise. + */ + public boolean hasId() { + return fieldSetFlags()[0]; + } + + + /** + * Clears the value of the 'id' field. + * @return This builder. + */ + public com.baeldung.schema.Employee.Builder clearId() { + fieldSetFlags()[0] = false; + return this; + } + + /** + * Gets the value of the 'firstName' field. + * @return The value. + */ + public java.lang.CharSequence getFirstName() { + return firstName; + } + + /** + * Sets the value of the 'firstName' field. + * @param value The value of 'firstName'. + * @return This builder. + */ + public com.baeldung.schema.Employee.Builder setFirstName(java.lang.CharSequence value) { + validate(fields()[1], value); + this.firstName = value; + fieldSetFlags()[1] = true; + return this; + } + + /** + * Checks whether the 'firstName' field has been set. + * @return True if the 'firstName' field has been set, false otherwise. + */ + public boolean hasFirstName() { + return fieldSetFlags()[1]; + } + + + /** + * Clears the value of the 'firstName' field. + * @return This builder. + */ + public com.baeldung.schema.Employee.Builder clearFirstName() { + firstName = null; + fieldSetFlags()[1] = false; + return this; + } + + /** + * Gets the value of the 'lastName' field. + * @return The value. + */ + public java.lang.CharSequence getLastName() { + return lastName; + } + + /** + * Sets the value of the 'lastName' field. + * @param value The value of 'lastName'. + * @return This builder. + */ + public com.baeldung.schema.Employee.Builder setLastName(java.lang.CharSequence value) { + validate(fields()[2], value); + this.lastName = value; + fieldSetFlags()[2] = true; + return this; + } + + /** + * Checks whether the 'lastName' field has been set. + * @return True if the 'lastName' field has been set, false otherwise. + */ + public boolean hasLastName() { + return fieldSetFlags()[2]; + } + + + /** + * Clears the value of the 'lastName' field. + * @return This builder. + */ + public com.baeldung.schema.Employee.Builder clearLastName() { + lastName = null; + fieldSetFlags()[2] = false; + return this; + } + + /** + * Gets the value of the 'department' field. + * @return The value. + */ + public java.lang.CharSequence getDepartment() { + return department; + } + + /** + * Sets the value of the 'department' field. + * @param value The value of 'department'. + * @return This builder. + */ + public com.baeldung.schema.Employee.Builder setDepartment(java.lang.CharSequence value) { + validate(fields()[3], value); + this.department = value; + fieldSetFlags()[3] = true; + return this; + } + + /** + * Checks whether the 'department' field has been set. + * @return True if the 'department' field has been set, false otherwise. + */ + public boolean hasDepartment() { + return fieldSetFlags()[3]; + } + + + /** + * Clears the value of the 'department' field. + * @return This builder. + */ + public com.baeldung.schema.Employee.Builder clearDepartment() { + department = null; + fieldSetFlags()[3] = false; + return this; + } + + /** + * Gets the value of the 'designation' field. + * @return The value. + */ + public java.lang.CharSequence getDesignation() { + return designation; + } + + /** + * Sets the value of the 'designation' field. + * @param value The value of 'designation'. + * @return This builder. + */ + public com.baeldung.schema.Employee.Builder setDesignation(java.lang.CharSequence value) { + validate(fields()[4], value); + this.designation = value; + fieldSetFlags()[4] = true; + return this; + } + + /** + * Checks whether the 'designation' field has been set. + * @return True if the 'designation' field has been set, false otherwise. + */ + public boolean hasDesignation() { + return fieldSetFlags()[4]; + } + + + /** + * Clears the value of the 'designation' field. + * @return This builder. + */ + public com.baeldung.schema.Employee.Builder clearDesignation() { + designation = null; + fieldSetFlags()[4] = false; + return this; + } + + @Override + @SuppressWarnings("unchecked") + public Employee build() { + try { + Employee record = new Employee(); + record.id = fieldSetFlags()[0] ? this.id : (java.lang.Integer) defaultValue(fields()[0]); + record.firstName = fieldSetFlags()[1] ? this.firstName : (java.lang.CharSequence) defaultValue(fields()[1]); + record.lastName = fieldSetFlags()[2] ? this.lastName : (java.lang.CharSequence) defaultValue(fields()[2]); + record.department = fieldSetFlags()[3] ? this.department : (java.lang.CharSequence) defaultValue(fields()[3]); + record.designation = fieldSetFlags()[4] ? this.designation : (java.lang.CharSequence) defaultValue(fields()[4]); + 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/spring-cloud/spring-cloud-stream/spring-cloud-stream-kafka/src/main/java/com/baeldung/schema/EmployeeKey.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kafka/src/main/java/com/baeldung/schema/EmployeeKey.java new file mode 100644 index 0000000000..bfd87751a4 --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kafka/src/main/java/com/baeldung/schema/EmployeeKey.java @@ -0,0 +1,307 @@ +/** + * Autogenerated by Avro + * + * DO NOT EDIT DIRECTLY + */ +package com.baeldung.schema; + +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 EmployeeKey extends org.apache.avro.specific.SpecificRecordBase implements org.apache.avro.specific.SpecificRecord { + private static final long serialVersionUID = 5288483459411046896L; + public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"EmployeeKey\",\"namespace\":\"com.baeldung.schema\",\"fields\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"departmentName\",\"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 EmployeeKey to a ByteBuffer. */ + public java.nio.ByteBuffer toByteBuffer() throws java.io.IOException { + return ENCODER.encode(this); + } + + /** Deserializes a EmployeeKey from a ByteBuffer. */ + public static EmployeeKey fromByteBuffer( + java.nio.ByteBuffer b) throws java.io.IOException { + return DECODER.decode(b); + } + + @Deprecated public int id; + @Deprecated public java.lang.CharSequence departmentName; + + /** + * 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 EmployeeKey() {} + + /** + * All-args constructor. + * @param id The new value for id + * @param departmentName The new value for departmentName + */ + public EmployeeKey(java.lang.Integer id, java.lang.CharSequence departmentName) { + this.id = id; + this.departmentName = departmentName; + } + + 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 id; + case 1: return departmentName; + 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: id = (java.lang.Integer)value$; break; + case 1: departmentName = (java.lang.CharSequence)value$; break; + default: throw new org.apache.avro.AvroRuntimeException("Bad index"); + } + } + + /** + * Gets the value of the 'id' field. + * @return The value of the 'id' field. + */ + public java.lang.Integer getId() { + return id; + } + + /** + * Sets the value of the 'id' field. + * @param value the value to set. + */ + public void setId(java.lang.Integer value) { + this.id = value; + } + + /** + * Gets the value of the 'departmentName' field. + * @return The value of the 'departmentName' field. + */ + public java.lang.CharSequence getDepartmentName() { + return departmentName; + } + + /** + * Sets the value of the 'departmentName' field. + * @param value the value to set. + */ + public void setDepartmentName(java.lang.CharSequence value) { + this.departmentName = value; + } + + /** + * Creates a new EmployeeKey RecordBuilder. + * @return A new EmployeeKey RecordBuilder + */ + public static com.baeldung.schema.EmployeeKey.Builder newBuilder() { + return new com.baeldung.schema.EmployeeKey.Builder(); + } + + /** + * Creates a new EmployeeKey RecordBuilder by copying an existing Builder. + * @param other The existing builder to copy. + * @return A new EmployeeKey RecordBuilder + */ + public static com.baeldung.schema.EmployeeKey.Builder newBuilder(com.baeldung.schema.EmployeeKey.Builder other) { + return new com.baeldung.schema.EmployeeKey.Builder(other); + } + + /** + * Creates a new EmployeeKey RecordBuilder by copying an existing EmployeeKey instance. + * @param other The existing instance to copy. + * @return A new EmployeeKey RecordBuilder + */ + public static com.baeldung.schema.EmployeeKey.Builder newBuilder(com.baeldung.schema.EmployeeKey other) { + return new com.baeldung.schema.EmployeeKey.Builder(other); + } + + /** + * RecordBuilder for EmployeeKey instances. + */ + public static class Builder extends org.apache.avro.specific.SpecificRecordBuilderBase + implements org.apache.avro.data.RecordBuilder { + + private int id; + private java.lang.CharSequence departmentName; + + /** 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(com.baeldung.schema.EmployeeKey.Builder other) { + super(other); + if (isValidValue(fields()[0], other.id)) { + this.id = data().deepCopy(fields()[0].schema(), other.id); + fieldSetFlags()[0] = true; + } + if (isValidValue(fields()[1], other.departmentName)) { + this.departmentName = data().deepCopy(fields()[1].schema(), other.departmentName); + fieldSetFlags()[1] = true; + } + } + + /** + * Creates a Builder by copying an existing EmployeeKey instance + * @param other The existing instance to copy. + */ + private Builder(com.baeldung.schema.EmployeeKey other) { + super(SCHEMA$); + if (isValidValue(fields()[0], other.id)) { + this.id = data().deepCopy(fields()[0].schema(), other.id); + fieldSetFlags()[0] = true; + } + if (isValidValue(fields()[1], other.departmentName)) { + this.departmentName = data().deepCopy(fields()[1].schema(), other.departmentName); + fieldSetFlags()[1] = true; + } + } + + /** + * Gets the value of the 'id' field. + * @return The value. + */ + public java.lang.Integer getId() { + return id; + } + + /** + * Sets the value of the 'id' field. + * @param value The value of 'id'. + * @return This builder. + */ + public com.baeldung.schema.EmployeeKey.Builder setId(int value) { + validate(fields()[0], value); + this.id = value; + fieldSetFlags()[0] = true; + return this; + } + + /** + * Checks whether the 'id' field has been set. + * @return True if the 'id' field has been set, false otherwise. + */ + public boolean hasId() { + return fieldSetFlags()[0]; + } + + + /** + * Clears the value of the 'id' field. + * @return This builder. + */ + public com.baeldung.schema.EmployeeKey.Builder clearId() { + fieldSetFlags()[0] = false; + return this; + } + + /** + * Gets the value of the 'departmentName' field. + * @return The value. + */ + public java.lang.CharSequence getDepartmentName() { + return departmentName; + } + + /** + * Sets the value of the 'departmentName' field. + * @param value The value of 'departmentName'. + * @return This builder. + */ + public com.baeldung.schema.EmployeeKey.Builder setDepartmentName(java.lang.CharSequence value) { + validate(fields()[1], value); + this.departmentName = value; + fieldSetFlags()[1] = true; + return this; + } + + /** + * Checks whether the 'departmentName' field has been set. + * @return True if the 'departmentName' field has been set, false otherwise. + */ + public boolean hasDepartmentName() { + return fieldSetFlags()[1]; + } + + + /** + * Clears the value of the 'departmentName' field. + * @return This builder. + */ + public com.baeldung.schema.EmployeeKey.Builder clearDepartmentName() { + departmentName = null; + fieldSetFlags()[1] = false; + return this; + } + + @Override + @SuppressWarnings("unchecked") + public EmployeeKey build() { + try { + EmployeeKey record = new EmployeeKey(); + record.id = fieldSetFlags()[0] ? this.id : (java.lang.Integer) defaultValue(fields()[0]); + record.departmentName = fieldSetFlags()[1] ? this.departmentName : (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)); + } + +} From d46b2d068414fb3bfd85260f836556b07d4dda08 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sat, 21 May 2022 17:33:00 +0530 Subject: [PATCH 246/278] JAVA-11421 Update article - RegEx for matching Date Pattern in Java --- .../regexp/datepattern/gregorian/February29thMatcher.java | 2 +- .../regexp/datepattern/gregorian/GregorianDateMatcher.java | 2 +- .../gregorian/testhelper/GregorianDateTestHelper.java | 4 ++++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/February29thMatcher.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/February29thMatcher.java index b0243ae48f..629f15b2dd 100644 --- a/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/February29thMatcher.java +++ b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/February29thMatcher.java @@ -7,7 +7,7 @@ import java.util.regex.Pattern; public class February29thMatcher implements DateMatcher { private static final Pattern DATE_PATTERN = Pattern.compile( - "^((2000|2400|2800|(19|2[0-9](0[48]|[2468][048]|[13579][26])))-02-29)$"); + "^((2000|2400|2800|(19|2[0-9])(0[48]|[2468][048]|[13579][26]))-02-29)$"); @Override public boolean matches(String date) { diff --git a/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/GregorianDateMatcher.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/GregorianDateMatcher.java index fc8abdb201..13be452910 100644 --- a/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/GregorianDateMatcher.java +++ b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/GregorianDateMatcher.java @@ -7,7 +7,7 @@ import java.util.regex.Pattern; class GregorianDateMatcher implements DateMatcher { private static final Pattern DATE_PATTERN = Pattern.compile( - "^((2000|2400|2800|(19|2[0-9](0[48]|[2468][048]|[13579][26])))-02-29)$" + "^((2000|2400|2800|(19|2[0-9])(0[48]|[2468][048]|[13579][26]))-02-29)$" + "|^(((19|2[0-9])[0-9]{2})-02-(0[1-9]|1[0-9]|2[0-8]))$" + "|^(((19|2[0-9])[0-9]{2})-(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))$" + "|^(((19|2[0-9])[0-9]{2})-(0[469]|11)-(0[1-9]|[12][0-9]|30))$"); diff --git a/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/gregorian/testhelper/GregorianDateTestHelper.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/gregorian/testhelper/GregorianDateTestHelper.java index 6429e4fe2d..b7fb267077 100644 --- a/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/gregorian/testhelper/GregorianDateTestHelper.java +++ b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/gregorian/testhelper/GregorianDateTestHelper.java @@ -37,6 +37,8 @@ public class GregorianDateTestHelper { } public void assertFebruary29th() { + Assert.assertTrue(matcher.matches("1904-02-29")); + Assert.assertTrue(matcher.matches("1996-02-29")); Assert.assertTrue(matcher.matches("2000-02-29")); Assert.assertTrue(matcher.matches("2400-02-29")); Assert.assertTrue(matcher.matches("2800-02-29")); @@ -44,6 +46,8 @@ public class GregorianDateTestHelper { Assert.assertTrue(matcher.matches("2024-02-29")); Assert.assertTrue(matcher.matches("2028-02-29")); + Assert.assertFalse(matcher.matches("1900-02-29")); + Assert.assertFalse(matcher.matches("1999-02-29")); Assert.assertFalse(matcher.matches("2017-02-29")); Assert.assertFalse(matcher.matches("2018-02-29")); Assert.assertFalse(matcher.matches("2019-02-29")); From 296b77b90951c8324d9593e99492f51b771df6f7 Mon Sep 17 00:00:00 2001 From: etrandafir93 <75391049+etrandafir93@users.noreply.github.com> Date: Sat, 21 May 2022 21:47:49 +0200 Subject: [PATCH 247/278] BAEL-4605: code and tests for composing constraints (#12180) * BAEL-4605: code and tests for composing constraints * BAEL-4605: small fix and formatted the code * BAEL-4605: code review --- .../constraint/composition/Account.java | 37 +++++++++ .../composition/AccountService.java | 19 +++++ .../composition/AlphanumericReturnValue.java | 36 +++++++++ .../ConstraintCompositionConfig.java | 21 +++++ .../composition/ValidAlphanumeric.java | 37 +++++++++ .../ValidAlphanumericWithSingleViolation.java | 38 +++++++++ .../ValidLengthOrNumericCharacter.java | 34 ++++++++ .../ConstraintCompositionUnitTest.java | 80 +++++++++++++++++++ 8 files changed, 302 insertions(+) create mode 100644 javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/Account.java create mode 100644 javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/AccountService.java create mode 100644 javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/AlphanumericReturnValue.java create mode 100644 javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/ConstraintCompositionConfig.java create mode 100644 javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/ValidAlphanumeric.java create mode 100644 javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/ValidAlphanumericWithSingleViolation.java create mode 100644 javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/ValidLengthOrNumericCharacter.java create mode 100644 javaxval/src/test/java/com/baeldung/javaxval/constraint/composition/ConstraintCompositionUnitTest.java diff --git a/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/Account.java b/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/Account.java new file mode 100644 index 0000000000..b47a47ec81 --- /dev/null +++ b/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/Account.java @@ -0,0 +1,37 @@ +package com.baeldung.javaxval.constraint.composition; + +public class Account { + + @ValidAlphanumeric + private String username; + + @ValidAlphanumericWithSingleViolation + private String password; + + @ValidLengthOrNumericCharacter + private String nickname; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } +} diff --git a/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/AccountService.java b/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/AccountService.java new file mode 100644 index 0000000000..f76fed8f04 --- /dev/null +++ b/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/AccountService.java @@ -0,0 +1,19 @@ +package com.baeldung.javaxval.constraint.composition; + +import org.springframework.stereotype.Component; +import org.springframework.validation.annotation.Validated; + +@Component +@Validated +public class AccountService { + + @AlphanumericReturnValue + public String getAnInvalidAlphanumericValue() { + return "john"; + } + + @AlphanumericReturnValue + public String getValidAlphanumericValue() { + return "johnDoe1234"; + } +} diff --git a/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/AlphanumericReturnValue.java b/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/AlphanumericReturnValue.java new file mode 100644 index 0000000000..6e3408712b --- /dev/null +++ b/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/AlphanumericReturnValue.java @@ -0,0 +1,36 @@ +package com.baeldung.javaxval.constraint.composition; + +import org.hibernate.validator.constraints.Length; + +import javax.validation.Constraint; +import javax.validation.Payload; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import javax.validation.constraintvalidation.SupportedValidationTarget; +import javax.validation.constraintvalidation.ValidationTarget; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.*; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +@NotNull +@Pattern(regexp = ".*\\d.*", message = "must contain at least one numeric character") +@Length(min = 6, max = 32, message = "must have between 6 and 32 characters") +@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) +@Retention(RUNTIME) +@Documented +@Constraint(validatedBy = {}) +@SupportedValidationTarget(ValidationTarget.ANNOTATED_ELEMENT) +public @interface AlphanumericReturnValue { + + String message() default "method return value should have a valid length and contain numeric character(s)."; + + Class[] groups() default {}; + + Class[] payload() default {}; + +} + diff --git a/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/ConstraintCompositionConfig.java b/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/ConstraintCompositionConfig.java new file mode 100644 index 0000000000..ac0ec81ab2 --- /dev/null +++ b/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/ConstraintCompositionConfig.java @@ -0,0 +1,21 @@ +package com.baeldung.javaxval.constraint.composition; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.validation.beanvalidation.MethodValidationPostProcessor; + +@Configuration +@ComponentScan({ "com.baeldung.javaxval.constraint.composition" }) +public class ConstraintCompositionConfig { + + @Bean + public MethodValidationPostProcessor methodValidationPostProcessor() { + return new MethodValidationPostProcessor(); + } + + @Bean + public AccountService accountService() { + return new AccountService(); + } +} \ No newline at end of file diff --git a/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/ValidAlphanumeric.java b/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/ValidAlphanumeric.java new file mode 100644 index 0000000000..916b4e36a4 --- /dev/null +++ b/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/ValidAlphanumeric.java @@ -0,0 +1,37 @@ +package com.baeldung.javaxval.constraint.composition; + +import static java.lang.annotation.ElementType.ANNOTATION_TYPE; +import static java.lang.annotation.ElementType.CONSTRUCTOR; +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import javax.validation.Constraint; +import javax.validation.Payload; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; + +import org.hibernate.validator.constraints.Length; + +@NotNull +@Pattern(regexp = ".*\\d.*", message = "must contain at least one numeric character") +@Length(min = 6, max = 32, message = "must have between 6 and 32 characters") +@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) +@Retention(RUNTIME) +@Documented +@Constraint(validatedBy = {}) +public @interface ValidAlphanumeric { + + String message() default "field should have a valid length and contain numeric character(s)."; + + Class[] groups() default {}; + + Class[] payload() default {}; + +} + diff --git a/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/ValidAlphanumericWithSingleViolation.java b/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/ValidAlphanumericWithSingleViolation.java new file mode 100644 index 0000000000..edc5b6af3e --- /dev/null +++ b/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/ValidAlphanumericWithSingleViolation.java @@ -0,0 +1,38 @@ +package com.baeldung.javaxval.constraint.composition; + +import static java.lang.annotation.ElementType.ANNOTATION_TYPE; +import static java.lang.annotation.ElementType.CONSTRUCTOR; +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import javax.validation.Constraint; +import javax.validation.Payload; +import javax.validation.ReportAsSingleViolation; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; + +import org.hibernate.validator.constraints.Length; + +@NotNull +@Pattern(regexp = ".*\\d.*", message = "must contain at least one numeric character") +@Length(min = 6, max = 32, message = "must have between 6 and 32 characters") +@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) +@Retention(RUNTIME) +@Documented +@Constraint(validatedBy = {}) +@ReportAsSingleViolation +public @interface ValidAlphanumericWithSingleViolation { + + String message() default "field should have a valid length and contain numeric character(s)."; + + Class[] groups() default {}; + + Class[] payload() default {}; + +} \ No newline at end of file diff --git a/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/ValidLengthOrNumericCharacter.java b/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/ValidLengthOrNumericCharacter.java new file mode 100644 index 0000000000..444cb4a63a --- /dev/null +++ b/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/ValidLengthOrNumericCharacter.java @@ -0,0 +1,34 @@ +package com.baeldung.javaxval.constraint.composition; + +import org.hibernate.validator.constraints.CompositionType; +import org.hibernate.validator.constraints.ConstraintComposition; +import org.hibernate.validator.constraints.Length; + +import javax.validation.Constraint; +import javax.validation.Payload; +import javax.validation.constraints.Pattern; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.*; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +@Pattern(regexp = ".*\\d.*", message = "must contain at least one numeric character") +@Length(min = 6, max = 32, message = "must have between 6 and 32 characters") +@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) +@Retention(RUNTIME) +@Documented +@Constraint(validatedBy = {}) +@ConstraintComposition(CompositionType.OR) +public @interface ValidLengthOrNumericCharacter { + + String message() default "field should have a valid length or contain numeric character(s)."; + + Class[] groups() default {}; + + Class[] payload() default {}; + +} + diff --git a/javaxval/src/test/java/com/baeldung/javaxval/constraint/composition/ConstraintCompositionUnitTest.java b/javaxval/src/test/java/com/baeldung/javaxval/constraint/composition/ConstraintCompositionUnitTest.java new file mode 100644 index 0000000000..6c2b8f801c --- /dev/null +++ b/javaxval/src/test/java/com/baeldung/javaxval/constraint/composition/ConstraintCompositionUnitTest.java @@ -0,0 +1,80 @@ +package com.baeldung.javaxval.constraint.composition; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.util.Set; + +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; +import javax.validation.Validation; +import javax.validation.Validator; +import javax.validation.ValidatorFactory; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.AnnotationConfigContextLoader; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = { ConstraintCompositionConfig.class }, loader = AnnotationConfigContextLoader.class) +public class ConstraintCompositionUnitTest { + + @Autowired + private AccountService accountService; + + private Validator validator; + + @Before + public void setup() { + ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); + validator = factory.getValidator(); + } + + @Test + public void whenUsernameIsInvalid_validationShouldReturnTwoViolations() { + Account account = new Account(); + account.setNickname("valid_nickname123"); + account.setPassword("valid_password123"); + account.setUsername("john"); + + Set> violations = validator.validate(account); + + assertThat(violations).hasSize(2); + } + + @Test + public void whenPasswordIsInvalid_validationShouldReturnSingleViolation() { + Account account = new Account(); + account.setUsername("valid_username123"); + account.setNickname("valid_nickname123"); + account.setPassword("john"); + + Set> violations = validator.validate(account); + + assertThat(violations).hasSize(1); + } + + @Test + public void whenNicknameIsTooShortButContainsNumericCharacter_validationShouldPass() { + Account account = new Account(); + account.setUsername("valid_username123"); + account.setPassword("valid_password123"); + account.setNickname("doe1"); + + Set> violations = validator.validate(account); + + assertThat(violations).isEmpty(); + } + + @Test + public void whenMethodReturnValuesIsInvalid_validationShouldFail() { + assertThatThrownBy(() -> accountService.getAnInvalidAlphanumericValue()).isInstanceOf(ConstraintViolationException.class) + .hasMessageContaining("must contain at least one numeric character") + .hasMessageContaining("must have between 6 and 32 characters"); + } + +} \ No newline at end of file From 1efe19f3833a83fab78136070696fedf5ce3a610 Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Sat, 21 May 2022 20:22:05 +0100 Subject: [PATCH 248/278] [JAVA-11892] Logging clean up --- .../cipher/AvailableCiphersUnitTest.java | 4 ++-- .../src/test/resources/logback.xml | 13 +++++++++++ .../src/main/resources/log4j.xml | 22 +++++++++++++++++++ .../resources/hibernate-namedquery.properties | 5 ++++- .../hibernate-pessimistic-locking.properties | 4 +++- .../src/test/resources/hibernate.properties | 5 ++++- .../src/main/resources/log4j.xml | 22 +++++++++++++++++++ .../src/main/resources/logback.xml | 2 +- .../hibernate-customtypes.properties | 3 ++- .../resources/hibernate-namedquery.properties | 3 ++- .../src/test/resources/hibernate.properties | 3 ++- .../src/test/resources/log4j.xml | 22 +++++++++++++++++++ .../baeldung/jpa/enums/ArticleUnitTest.java | 5 +++-- .../src/test/resources/persistence.xml | 4 ++-- 14 files changed, 104 insertions(+), 13 deletions(-) create mode 100644 core-java-modules/core-java-security-algorithms/src/test/resources/logback.xml create mode 100644 persistence-modules/hibernate-jpa/src/main/resources/log4j.xml create mode 100644 persistence-modules/hibernate-queries/src/main/resources/log4j.xml create mode 100644 persistence-modules/hibernate-queries/src/test/resources/log4j.xml diff --git a/core-java-modules/core-java-security-algorithms/src/test/java/com/baeldung/cipher/AvailableCiphersUnitTest.java b/core-java-modules/core-java-security-algorithms/src/test/java/com/baeldung/cipher/AvailableCiphersUnitTest.java index fa38aca272..5653f47734 100644 --- a/core-java-modules/core-java-security-algorithms/src/test/java/com/baeldung/cipher/AvailableCiphersUnitTest.java +++ b/core-java-modules/core-java-security-algorithms/src/test/java/com/baeldung/cipher/AvailableCiphersUnitTest.java @@ -17,7 +17,7 @@ public class AvailableCiphersUnitTest { public void whenGetServices_thenGetAllCipherAlgorithms() { for (Provider provider : Security.getProviders()) { for (Provider.Service service : provider.getServices()) { - logger.info(service.getAlgorithm()); + logger.debug(service.getAlgorithm()); } } } @@ -30,6 +30,6 @@ public class AvailableCiphersUnitTest { .map(Provider.Service::getAlgorithm) .collect(Collectors.toList()); - algorithms.forEach(logger::info); + algorithms.forEach(logger::debug); } } diff --git a/core-java-modules/core-java-security-algorithms/src/test/resources/logback.xml b/core-java-modules/core-java-security-algorithms/src/test/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/core-java-modules/core-java-security-algorithms/src/test/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/hibernate-jpa/src/main/resources/log4j.xml b/persistence-modules/hibernate-jpa/src/main/resources/log4j.xml new file mode 100644 index 0000000000..f58dbdc514 --- /dev/null +++ b/persistence-modules/hibernate-jpa/src/main/resources/log4j.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/persistence-modules/hibernate-jpa/src/test/resources/hibernate-namedquery.properties b/persistence-modules/hibernate-jpa/src/test/resources/hibernate-namedquery.properties index 457f965347..2f05e32a30 100644 --- a/persistence-modules/hibernate-jpa/src/test/resources/hibernate-namedquery.properties +++ b/persistence-modules/hibernate-jpa/src/test/resources/hibernate-namedquery.properties @@ -5,5 +5,8 @@ hibernate.connection.autocommit=true jdbc.password= hibernate.dialect=org.hibernate.dialect.H2Dialect -hibernate.show_sql=true + +# enable to see Hibernate generated SQL +hibernate.show_sql=false + hibernate.hbm2ddl.auto=create-drop \ No newline at end of file diff --git a/persistence-modules/hibernate-jpa/src/test/resources/hibernate-pessimistic-locking.properties b/persistence-modules/hibernate-jpa/src/test/resources/hibernate-pessimistic-locking.properties index 342f7b0bf5..da6ab4d68a 100644 --- a/persistence-modules/hibernate-jpa/src/test/resources/hibernate-pessimistic-locking.properties +++ b/persistence-modules/hibernate-jpa/src/test/resources/hibernate-pessimistic-locking.properties @@ -4,5 +4,7 @@ hibernate.connection.username=sa hibernate.connection.autocommit=true hibernate.dialect=org.hibernate.dialect.H2Dialect -hibernate.show_sql=true +# enable to see Hibernate generated SQL +hibernate.show_sql=false + hibernate.hbm2ddl.auto=create-drop \ No newline at end of file diff --git a/persistence-modules/hibernate-jpa/src/test/resources/hibernate.properties b/persistence-modules/hibernate-jpa/src/test/resources/hibernate.properties index c14782ce0f..20197700a1 100644 --- a/persistence-modules/hibernate-jpa/src/test/resources/hibernate.properties +++ b/persistence-modules/hibernate-jpa/src/test/resources/hibernate.properties @@ -5,7 +5,10 @@ hibernate.connection.autocommit=true jdbc.password= hibernate.dialect=org.hibernate.dialect.H2Dialect -hibernate.show_sql=true + +# enable to see Hibernate generated SQL +hibernate.show_sql=false + hibernate.hbm2ddl.auto=create-drop hibernate.c3p0.min_size=5 diff --git a/persistence-modules/hibernate-queries/src/main/resources/log4j.xml b/persistence-modules/hibernate-queries/src/main/resources/log4j.xml new file mode 100644 index 0000000000..f58dbdc514 --- /dev/null +++ b/persistence-modules/hibernate-queries/src/main/resources/log4j.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/persistence-modules/hibernate-queries/src/main/resources/logback.xml b/persistence-modules/hibernate-queries/src/main/resources/logback.xml index 612296c6ce..56af2d397e 100644 --- a/persistence-modules/hibernate-queries/src/main/resources/logback.xml +++ b/persistence-modules/hibernate-queries/src/main/resources/logback.xml @@ -12,7 +12,7 @@ - + diff --git a/persistence-modules/hibernate-queries/src/test/resources/hibernate-customtypes.properties b/persistence-modules/hibernate-queries/src/test/resources/hibernate-customtypes.properties index c14782ce0f..c202f59f82 100644 --- a/persistence-modules/hibernate-queries/src/test/resources/hibernate-customtypes.properties +++ b/persistence-modules/hibernate-queries/src/test/resources/hibernate-customtypes.properties @@ -5,7 +5,8 @@ hibernate.connection.autocommit=true jdbc.password= hibernate.dialect=org.hibernate.dialect.H2Dialect -hibernate.show_sql=true +# enable to see Hibernate generated SQL +hibernate.show_sql=false hibernate.hbm2ddl.auto=create-drop hibernate.c3p0.min_size=5 diff --git a/persistence-modules/hibernate-queries/src/test/resources/hibernate-namedquery.properties b/persistence-modules/hibernate-queries/src/test/resources/hibernate-namedquery.properties index 457f965347..120212070a 100644 --- a/persistence-modules/hibernate-queries/src/test/resources/hibernate-namedquery.properties +++ b/persistence-modules/hibernate-queries/src/test/resources/hibernate-namedquery.properties @@ -5,5 +5,6 @@ hibernate.connection.autocommit=true jdbc.password= hibernate.dialect=org.hibernate.dialect.H2Dialect -hibernate.show_sql=true +# enable to see Hibernate generated SQL +hibernate.show_sql=false hibernate.hbm2ddl.auto=create-drop \ No newline at end of file diff --git a/persistence-modules/hibernate-queries/src/test/resources/hibernate.properties b/persistence-modules/hibernate-queries/src/test/resources/hibernate.properties index c14782ce0f..c202f59f82 100644 --- a/persistence-modules/hibernate-queries/src/test/resources/hibernate.properties +++ b/persistence-modules/hibernate-queries/src/test/resources/hibernate.properties @@ -5,7 +5,8 @@ hibernate.connection.autocommit=true jdbc.password= hibernate.dialect=org.hibernate.dialect.H2Dialect -hibernate.show_sql=true +# enable to see Hibernate generated SQL +hibernate.show_sql=false hibernate.hbm2ddl.auto=create-drop hibernate.c3p0.min_size=5 diff --git a/persistence-modules/hibernate-queries/src/test/resources/log4j.xml b/persistence-modules/hibernate-queries/src/test/resources/log4j.xml new file mode 100644 index 0000000000..f58dbdc514 --- /dev/null +++ b/persistence-modules/hibernate-queries/src/test/resources/log4j.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/enums/ArticleUnitTest.java b/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/enums/ArticleUnitTest.java index 9d98d6b86f..36a7cb1002 100644 --- a/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/enums/ArticleUnitTest.java +++ b/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/enums/ArticleUnitTest.java @@ -22,8 +22,9 @@ public class ArticleUnitTest { @BeforeClass public static void setup() { Map properties = new HashMap<>(); - properties.put("hibernate.show_sql", "true"); - properties.put("hibernate.format_sql", "true"); + // set these to true to see Hibernate SQL + properties.put("hibernate.show_sql", "false"); + properties.put("hibernate.format_sql", "false"); emFactory = Persistence.createEntityManagerFactory("jpa-h2", properties); em = emFactory.createEntityManager(); } diff --git a/persistence-modules/java-jpa/src/test/resources/persistence.xml b/persistence-modules/java-jpa/src/test/resources/persistence.xml index c902e0a320..e9b5ebbbcf 100644 --- a/persistence-modules/java-jpa/src/test/resources/persistence.xml +++ b/persistence-modules/java-jpa/src/test/resources/persistence.xml @@ -14,7 +14,7 @@ - + @@ -28,7 +28,7 @@ - + From 147d60e5285008765e38286398b3a90217daf124 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sun, 22 May 2022 12:46:31 +0530 Subject: [PATCH 249/278] JAVA-11422 Update article - A Guide To Java Regular Expressions API --- .../src/test/java/com/baeldung/regex/RegexUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/RegexUnitTest.java b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/RegexUnitTest.java index 77052b79ac..f6c5f35f37 100644 --- a/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/RegexUnitTest.java +++ b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/RegexUnitTest.java @@ -104,7 +104,7 @@ public class RegexUnitTest { @Test public void givenNumberRange_whenMatchesAccurately_thenCorrect2() { - int matches = runTest("[30-35]", "Two Uppercase alphabets 34 overall"); + int matches = runTest("3[0-5]", "Two Uppercase alphabets 34 overall"); assertTrue(matches > 0); assertEquals(matches, 1); } From 5ab2b9b8e4be3293bc096a6fccf53444e20bfbad Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Sun, 22 May 2022 11:44:39 +0100 Subject: [PATCH 250/278] [JAVA-12011] Remove redundant comments from pom files --- persistence-modules/pom.xml | 2 +- spring-boot-modules/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 7be71ad215..41396e81c6 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -15,7 +15,7 @@ activejdbc - apache-bookkeeper + apache-bookkeeper apache-cayenne apache-derby core-java-persistence diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index 63f11a4a76..29685b0eb8 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -44,7 +44,7 @@ spring-boot-groovy spring-boot-jasypt - spring-boot-keycloak + spring-boot-keycloak spring-boot-libraries spring-boot-libraries-2 spring-boot-libraries-comparison From ac5dbbc5da40106ea68a2e1b309af5169d3ed78b Mon Sep 17 00:00:00 2001 From: Thiago dos Santos Hora Date: Mon, 23 May 2022 08:09:09 +0200 Subject: [PATCH 251/278] [BAEL-4120] Read-only transactions samples (#11841) * [BAEL-4120] Read-only transactions samples * Extract query runner jobs logic * Apply test name standards * Fix code standards * Use pom properties to define versions * Rename main package * Rename generics * Code clean up * Code clean up on lambdas * Add debug logs * Fix format issues * Rename entity --- persistence-modules/pom.xml | 1 + .../read-only-transactions/README.md | 8 ++ .../read-only-transactions/create.sql | 43 +++++++ .../docker-compose-mysql.yml | 15 +++ .../read-only-transactions/pom.xml | 89 +++++++++++++++ .../readonlytransactions/h2/Book.java | 44 ++++++++ .../readonlytransactions/h2/BookService.java | 24 ++++ .../readonlytransactions/h2/Config.java | 54 +++++++++ .../h2/TransactionConfig.java | 21 ++++ .../mysql/dao/BaseRepo.java | 29 +++++ .../mysql/dao/MyRepoJPA.java | 36 ++++++ .../mysql/dao/MyRepoJdbc.java | 71 ++++++++++++ .../mysql/dao/MyRepoSpring.java | 22 ++++ .../mysql/entities/Book.java | 44 ++++++++ .../mysql/spring/Config.java | 77 +++++++++++++ .../mysql/spring/ReadOnlyContext.java | 26 +++++ .../mysql/spring/ReadOnlyInterception.java | 29 +++++ .../mysql/spring/ReaderDS.java | 10 ++ .../mysql/spring/RoutingDS.java | 35 ++++++ .../mysql/spring/entities/BookEntity.java | 45 ++++++++ .../spring/repositories/BookRepository.java | 21 ++++ .../utils/ExecutorUtils.java | 16 +++ .../main/resources/META-INF/persistence.xml | 23 ++++ .../src/main/resources/logback.xml | 18 +++ .../JPATransactionIntegrationTest.java | 77 +++++++++++++ ...ingTransactionReadOnlyIntegrationTest.java | 72 ++++++++++++ .../TransactionSetupIntegrationTest.java | 106 ++++++++++++++++++ 27 files changed, 1056 insertions(+) create mode 100644 persistence-modules/read-only-transactions/README.md create mode 100644 persistence-modules/read-only-transactions/create.sql create mode 100644 persistence-modules/read-only-transactions/docker-compose-mysql.yml create mode 100644 persistence-modules/read-only-transactions/pom.xml create mode 100644 persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/h2/Book.java create mode 100644 persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/h2/BookService.java create mode 100644 persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/h2/Config.java create mode 100644 persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/h2/TransactionConfig.java create mode 100644 persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/dao/BaseRepo.java create mode 100644 persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/dao/MyRepoJPA.java create mode 100644 persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/dao/MyRepoJdbc.java create mode 100644 persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/dao/MyRepoSpring.java create mode 100644 persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/entities/Book.java create mode 100644 persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/spring/Config.java create mode 100644 persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/spring/ReadOnlyContext.java create mode 100644 persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/spring/ReadOnlyInterception.java create mode 100644 persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/spring/ReaderDS.java create mode 100644 persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/spring/RoutingDS.java create mode 100644 persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/spring/entities/BookEntity.java create mode 100644 persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/spring/repositories/BookRepository.java create mode 100644 persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/utils/ExecutorUtils.java create mode 100644 persistence-modules/read-only-transactions/src/main/resources/META-INF/persistence.xml create mode 100644 persistence-modules/read-only-transactions/src/main/resources/logback.xml create mode 100644 persistence-modules/read-only-transactions/src/test/java/com/baeldung/readonlytransactions/JPATransactionIntegrationTest.java create mode 100644 persistence-modules/read-only-transactions/src/test/java/com/baeldung/readonlytransactions/SpringTransactionReadOnlyIntegrationTest.java create mode 100644 persistence-modules/read-only-transactions/src/test/java/com/baeldung/readonlytransactions/TransactionSetupIntegrationTest.java diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 7be71ad215..23d29de1e8 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -52,6 +52,7 @@ persistence-libraries querydsl r2dbc + read-only-transactions redis solr diff --git a/persistence-modules/read-only-transactions/README.md b/persistence-modules/read-only-transactions/README.md new file mode 100644 index 0000000000..90a86e551e --- /dev/null +++ b/persistence-modules/read-only-transactions/README.md @@ -0,0 +1,8 @@ +### Relevant Articles: +- + +### Instructions +To run the `com.baeldung.read_only_transactions.TransactionSetupIntegrationTest` first follow the steps described next: +- run the command `docker-compose -f docker-compose-mysql.yml up` +- Open a SQL client of your preference and execute the `create.sql` script. +- You can check the mysql logs using `tail -f mysql/${name of de log file created}.log` \ No newline at end of file diff --git a/persistence-modules/read-only-transactions/create.sql b/persistence-modules/read-only-transactions/create.sql new file mode 100644 index 0000000000..0ba60be150 --- /dev/null +++ b/persistence-modules/read-only-transactions/create.sql @@ -0,0 +1,43 @@ +create table book ( + id bigint(20) AUTO_INCREMENT primary key, + name varchar(255) not null, + uuid varchar(40) +); + + +DELIMITER ;; +DROP PROCEDURE IF EXISTS populate; +create procedure populate() +BEGIN + SET @name1='Josh purchase'; + SET @name2='Henry purchase'; + SET @name3='Betty purchase'; + SET @name4='Kate purchase'; + SET @name5='Mari purchase'; + SET @name=''; + SET @counter=0; + + START TRANSACTION; + + while @counter < 1000000 do + SET @name = case + when MOD(@counter, 5) = 0 THEN @name5 + when MOD(@counter, 3) = 0 THEN @name3 + when MOD(@counter, 4) = 0 THEN @name4 + when MOD(@counter, 2) = 0 THEN @name2 + else @name1 + end; + + insert into book(name, uuid) values(@name, uuid()); + SET @counter=@counter+1; + end while; + + COMMIT; + +END;; + +DELIMITER ; + +CALL populate(); + + diff --git a/persistence-modules/read-only-transactions/docker-compose-mysql.yml b/persistence-modules/read-only-transactions/docker-compose-mysql.yml new file mode 100644 index 0000000000..a922fabbd8 --- /dev/null +++ b/persistence-modules/read-only-transactions/docker-compose-mysql.yml @@ -0,0 +1,15 @@ +version: "3.9" # optional since v1.27.0 +services: + mysql: + build: . + restart: always + ports: + - "3306:3306" + environment: + MYSQL_PASSWORD: "baeldung" + MYSQL_USER: "baeldung" + MYSQL_DATABASE: "baeldung" + MYSQL_ROOT_PASSWORD: "baeldung" + command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --innodb_buffer_pool_size=3G --innodb_adaptive_hash_index=off --query_cache_size=0 --query_cache_type=0 --log_output=FILE --general_log=1 + volumes: + - ./mysql:/var/lib/mysql/ \ No newline at end of file diff --git a/persistence-modules/read-only-transactions/pom.xml b/persistence-modules/read-only-transactions/pom.xml new file mode 100644 index 0000000000..d3822f8e58 --- /dev/null +++ b/persistence-modules/read-only-transactions/pom.xml @@ -0,0 +1,89 @@ + + + + 4.0.0 + read-only-transactions + 0.0.1-SNAPSHOT + read-only-transactions + + + com.baeldung + persistence-modules + 1.0.0-SNAPSHOT + + + + + + org.springframework.boot + spring-boot-starter-data-jpa + ${spring-boot.version} + + + com.zaxxer + HikariCP + + + + + + org.springframework.boot + spring-boot-starter-test + ${spring-boot.version} + test + + + + org.springframework + spring-test + ${spring-test.version} + test + + + + mysql + mysql-connector-java + ${mysql.version} + + + + org.hibernate + hibernate-core + ${hibernate.version} + + + + com.zaxxer + HikariCP + ${hikari.version} + + + + org.junit.jupiter + junit-jupiter-engine + ${junit-jupiter.version} + test + + + + com.h2database + h2 + ${h2.version} + runtime + + + + + + + 8.0.21 + 4.0.3 + 5.6.1.Final + 2.6.1 + 5.3.13 + 5.8.2 + 1.4.200 + + \ No newline at end of file diff --git a/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/h2/Book.java b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/h2/Book.java new file mode 100644 index 0000000000..000859a201 --- /dev/null +++ b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/h2/Book.java @@ -0,0 +1,44 @@ +package com.baeldung.readonlytransactions.h2; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "book") +public class Book { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String name; + + private String uuid; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } +} diff --git a/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/h2/BookService.java b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/h2/BookService.java new file mode 100644 index 0000000000..0ecbc4a0d4 --- /dev/null +++ b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/h2/BookService.java @@ -0,0 +1,24 @@ +package com.baeldung.readonlytransactions.h2; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.persistence.EntityManagerFactory; + +@Service +public class BookService { + + private EntityManagerFactory entityManagerFactory; + + public BookService(@Autowired @Qualifier("h2EntityManagerFactory") EntityManagerFactory entityManagerFactory) { + this.entityManagerFactory = entityManagerFactory; + } + + @Transactional(readOnly = true) + public Book getBookById(long id) { + return entityManagerFactory.createEntityManager() + .find(Book.class, id); + } +} diff --git a/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/h2/Config.java b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/h2/Config.java new file mode 100644 index 0000000000..241dad417b --- /dev/null +++ b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/h2/Config.java @@ -0,0 +1,54 @@ +package com.baeldung.readonlytransactions.h2; + +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; + +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; + +import java.util.Properties; + +import javax.persistence.EntityManagerFactory; +import javax.sql.DataSource; + +@Configuration +public class Config { + + @Bean("h2DataSource") + public DataSource dataSource() { + HikariConfig config = new HikariConfig(); + config.setJdbcUrl("jdbc:h2:mem:mydb"); + config.setUsername("sa"); + config.setPassword(""); + config.setDriverClassName("org.h2.Driver"); + return new HikariDataSource(config); + } + + @Bean("h2EntityManagerFactory") + public EntityManagerFactory entityManagerFactory(@Qualifier("h2DataSource") DataSource dataSource) { + HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); + vendorAdapter.setGenerateDdl(false); + + LocalContainerEntityManagerFactoryBean managerFactoryBean = new LocalContainerEntityManagerFactoryBean(); + managerFactoryBean.setJpaVendorAdapter(vendorAdapter); + managerFactoryBean.setPackagesToScan(Config.class.getPackage() + .getName()); + managerFactoryBean.setDataSource(dataSource); + + Properties properties = new Properties(); + + properties.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect"); + properties.setProperty("hibernate.hbm2ddl.auto", "create-drop"); + + properties.setProperty("hibernate.show_sql", "true"); + properties.setProperty("hibernate.format_sql", "true"); + + managerFactoryBean.setJpaProperties(properties); + managerFactoryBean.afterPropertiesSet(); + + return managerFactoryBean.getObject(); + } +} diff --git a/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/h2/TransactionConfig.java b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/h2/TransactionConfig.java new file mode 100644 index 0000000000..62abb85edd --- /dev/null +++ b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/h2/TransactionConfig.java @@ -0,0 +1,21 @@ +package com.baeldung.readonlytransactions.h2; + +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import javax.persistence.EntityManagerFactory; + +@Configuration +@EnableTransactionManagement +public class TransactionConfig { + + @Bean + public PlatformTransactionManager transactionManager(@Qualifier("h2EntityManagerFactory") EntityManagerFactory entityManagerFactory) { + return new JpaTransactionManager(entityManagerFactory); + } + +} diff --git a/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/dao/BaseRepo.java b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/dao/BaseRepo.java new file mode 100644 index 0000000000..81ff78efb2 --- /dev/null +++ b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/dao/BaseRepo.java @@ -0,0 +1,29 @@ +package com.baeldung.readonlytransactions.mysql.dao; + +import com.baeldung.readonlytransactions.utils.ExecutorUtils; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; +import java.util.function.Consumer; + +public abstract class BaseRepo { + + protected long execQuery(Consumer function) { + AtomicLong count = new AtomicLong(0); + + ExecutorService executor = ExecutorUtils.createExecutor(10, 10); + ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); + + scheduler.schedule(executor::shutdownNow, 5L, TimeUnit.SECONDS); + scheduler.shutdown(); + + while (!executor.isShutdown()) { + executor.execute(() -> function.accept(count)); + } + + return count.get(); + } +} diff --git a/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/dao/MyRepoJPA.java b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/dao/MyRepoJPA.java new file mode 100644 index 0000000000..727e88219f --- /dev/null +++ b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/dao/MyRepoJPA.java @@ -0,0 +1,36 @@ +package com.baeldung.readonlytransactions.mysql.dao; + +import org.hibernate.Session; + +import com.baeldung.readonlytransactions.mysql.entities.Book; + +import java.util.SplittableRandom; +import java.util.concurrent.atomic.AtomicLong; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; + +public class MyRepoJPA extends BaseRepo { + + private EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("jpa-unit"); + private SplittableRandom random = new SplittableRandom(); + + public long runQuery() { + return execQuery(this::runSql); + } + + private void runSql(AtomicLong count) { + if (Thread.interrupted()) { + return; + } + + EntityManager entityManager = entityManagerFactory.createEntityManager(); + Session session = entityManager.unwrap(Session.class); + session.setDefaultReadOnly(true); + entityManager.find(Book.class, 1L + random.nextLong(0, 1000000)); + count.incrementAndGet(); + entityManager.clear(); + } + +} diff --git a/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/dao/MyRepoJdbc.java b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/dao/MyRepoJdbc.java new file mode 100644 index 0000000000..306bfd5f0c --- /dev/null +++ b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/dao/MyRepoJdbc.java @@ -0,0 +1,71 @@ +package com.baeldung.readonlytransactions.mysql.dao; + +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.SplittableRandom; +import java.util.concurrent.atomic.AtomicLong; + +public class MyRepoJdbc extends BaseRepo { + + static { + try { + Class.forName("com.mysql.cj.jdbc.Driver"); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + private HikariDataSource ds; + private SplittableRandom random = new SplittableRandom(); + + public MyRepoJdbc(boolean readOnly, boolean autocommit) { + HikariConfig config = new HikariConfig(); + config.setJdbcUrl("jdbc:mysql://localhost/baeldung?useUnicode=true&characterEncoding=UTF-8"); + config.setUsername("baeldung"); + config.setPassword("baeldung"); + config.setReadOnly(readOnly); + config.setAutoCommit(autocommit); + ds = new HikariDataSource(config); + } + + private Connection getConnection() throws SQLException { + return ds.getConnection(); + } + + public long runQuery(Boolean autoCommit, Boolean readOnly) { + try { + return execQuery(count -> runSql(count, autoCommit, readOnly)); + } finally { + ds.close(); + } + } + + private void runSql(AtomicLong count, Boolean autoCommit, Boolean readOnly) { + if (Thread.interrupted()) { + return; + } + + try (Connection connect = getConnection(); PreparedStatement statement = connect.prepareStatement("select * from transactions where id = ?")) { + if (autoCommit != null) + connect.setAutoCommit(autoCommit); + + if (readOnly != null) + connect.setReadOnly(readOnly); + + statement.setLong(1, 1L + random.nextLong(0, 100000)); + ResultSet resultSet = statement.executeQuery(); + + if (autoCommit != null && !autoCommit) + connect.commit(); + + count.incrementAndGet(); + resultSet.close(); + } catch (Exception ignored) { + } + } +} \ No newline at end of file diff --git a/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/dao/MyRepoSpring.java b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/dao/MyRepoSpring.java new file mode 100644 index 0000000000..387f5ec722 --- /dev/null +++ b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/dao/MyRepoSpring.java @@ -0,0 +1,22 @@ +package com.baeldung.readonlytransactions.mysql.dao; + +import com.baeldung.readonlytransactions.mysql.spring.repositories.BookRepository; + +import java.util.SplittableRandom; + +public class MyRepoSpring extends BaseRepo { + + private SplittableRandom random = new SplittableRandom(); + private BookRepository repository; + + public MyRepoSpring(BookRepository repository) { + this.repository = repository; + } + + public long runQuery() { + return execQuery(count -> { + repository.get(1L + random.nextLong(0, 1000000)); + count.incrementAndGet(); + }); + } +} diff --git a/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/entities/Book.java b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/entities/Book.java new file mode 100644 index 0000000000..405cc9c2c2 --- /dev/null +++ b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/entities/Book.java @@ -0,0 +1,44 @@ +package com.baeldung.readonlytransactions.mysql.entities; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "book") +public class Book { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String name; + + private String uuid; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } +} diff --git a/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/spring/Config.java b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/spring/Config.java new file mode 100644 index 0000000000..abaa63b197 --- /dev/null +++ b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/spring/Config.java @@ -0,0 +1,77 @@ +package com.baeldung.readonlytransactions.mysql.spring; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.EnableAspectJAutoProxy; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import com.baeldung.readonlytransactions.mysql.dao.MyRepoSpring; +import com.baeldung.readonlytransactions.mysql.spring.entities.BookEntity; +import com.baeldung.readonlytransactions.mysql.spring.repositories.BookRepository; +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; + +import java.util.Properties; + +import javax.persistence.EntityManagerFactory; +import javax.sql.DataSource; + +@Configuration +@EnableJpaRepositories(basePackageClasses = Config.class, enableDefaultTransactions = false) +@EnableTransactionManagement +@EnableAspectJAutoProxy +public class Config { + + @Bean + public MyRepoSpring repoSpring(BookRepository repository) { + return new MyRepoSpring(repository); + } + + private DataSource dataSource(boolean readOnly, boolean isAutoCommit) { + HikariConfig config = new HikariConfig(); + config.setJdbcUrl("jdbc:mysql://localhost/baeldung?useUnicode=true&characterEncoding=UTF-8"); + config.setUsername("baeldung"); + config.setPassword("baeldung"); + config.setReadOnly(readOnly); + config.setAutoCommit(isAutoCommit); + return new HikariDataSource(config); + } + + @Bean + public DataSource dataSource() { + return new RoutingDS(dataSource(false, false), dataSource(true, true)); + } + + @Bean + public EntityManagerFactory entityManagerFactory(DataSource dataSource) { + HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); + vendorAdapter.setGenerateDdl(false); + + LocalContainerEntityManagerFactoryBean managerFactoryBean = new LocalContainerEntityManagerFactoryBean(); + managerFactoryBean.setJpaVendorAdapter(vendorAdapter); + managerFactoryBean.setPackagesToScan(BookEntity.class.getPackage() + .getName()); + managerFactoryBean.setDataSource(dataSource); + + Properties properties = new Properties(); + + properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect"); + properties.setProperty("hibernate.hbm2ddl.auto", "validate"); + + managerFactoryBean.setJpaProperties(properties); + managerFactoryBean.afterPropertiesSet(); + + return managerFactoryBean.getObject(); + } + + @Bean + public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) { + return new JpaTransactionManager(entityManagerFactory); + } + +} diff --git a/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/spring/ReadOnlyContext.java b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/spring/ReadOnlyContext.java new file mode 100644 index 0000000000..2933c8c4a9 --- /dev/null +++ b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/spring/ReadOnlyContext.java @@ -0,0 +1,26 @@ +package com.baeldung.readonlytransactions.mysql.spring; + +import java.util.concurrent.atomic.AtomicInteger; + +public class ReadOnlyContext { + + private static final ThreadLocal READ_ONLY_LEVEL = ThreadLocal.withInitial(() -> new AtomicInteger(0)); + + private ReadOnlyContext() { + } + + public static boolean isReadOnly() { + return READ_ONLY_LEVEL.get() + .get() > 0; + } + + public static void enter() { + READ_ONLY_LEVEL.get() + .incrementAndGet(); + } + + public static void exit() { + READ_ONLY_LEVEL.get() + .decrementAndGet(); + } +} diff --git a/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/spring/ReadOnlyInterception.java b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/spring/ReadOnlyInterception.java new file mode 100644 index 0000000000..30488970a8 --- /dev/null +++ b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/spring/ReadOnlyInterception.java @@ -0,0 +1,29 @@ +package com.baeldung.readonlytransactions.mysql.spring; + +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +@Aspect +@Component +public class ReadOnlyInterception { + + private static final Logger logger = LoggerFactory.getLogger(ReadOnlyInterception.class); + + @Around("@annotation(com.baeldung.readonlytransactions.mysql.spring.ReaderDS)") + public Object aroundMethod(ProceedingJoinPoint joinPoint) throws Throwable { + try { + ReadOnlyContext.enter(); + //Debug data source switch + logger.debug("-----------------------------Entering read only zone-----------------------------"); + return joinPoint.proceed(); + } finally { + logger.debug("-----------------------------Leaving read only zone------------------------------"); + ReadOnlyContext.exit(); + } + } + +} diff --git a/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/spring/ReaderDS.java b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/spring/ReaderDS.java new file mode 100644 index 0000000000..312c65b3cf --- /dev/null +++ b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/spring/ReaderDS.java @@ -0,0 +1,10 @@ +package com.baeldung.readonlytransactions.mysql.spring; + +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Inherited +@Retention(RetentionPolicy.RUNTIME) +public @interface ReaderDS { +} diff --git a/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/spring/RoutingDS.java b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/spring/RoutingDS.java new file mode 100644 index 0000000000..36ce8a16e6 --- /dev/null +++ b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/spring/RoutingDS.java @@ -0,0 +1,35 @@ +package com.baeldung.readonlytransactions.mysql.spring; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; + +import java.util.HashMap; +import java.util.Map; + +import javax.sql.DataSource; + +public class RoutingDS extends AbstractRoutingDataSource { + + private static final Logger logger = LoggerFactory.getLogger(RoutingDS.class); + + RoutingDS(DataSource writer, DataSource reader) { + + Map dataSources = new HashMap<>(); + dataSources.put("writer", writer); + dataSources.put("reader", reader); + + setTargetDataSources(dataSources); + } + + @Override + protected Object determineCurrentLookupKey() { + String dataSourceMode = ReadOnlyContext.isReadOnly() ? "reader" : "writer"; + + // Testing data source switch + logger.debug("-----------------------------Datasource: {} ---------------------------------", dataSourceMode); + + return dataSourceMode; + } + +} diff --git a/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/spring/entities/BookEntity.java b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/spring/entities/BookEntity.java new file mode 100644 index 0000000000..87c8988a8d --- /dev/null +++ b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/spring/entities/BookEntity.java @@ -0,0 +1,45 @@ +package com.baeldung.readonlytransactions.mysql.spring.entities; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "book") +public class BookEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String name; + + private String uuid; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } +} + diff --git a/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/spring/repositories/BookRepository.java b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/spring/repositories/BookRepository.java new file mode 100644 index 0000000000..2cc61c016d --- /dev/null +++ b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/mysql/spring/repositories/BookRepository.java @@ -0,0 +1,21 @@ +package com.baeldung.readonlytransactions.mysql.spring.repositories; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +import com.baeldung.readonlytransactions.mysql.spring.ReaderDS; +import com.baeldung.readonlytransactions.mysql.spring.entities.BookEntity; + +import javax.transaction.Transactional; + +public interface BookRepository extends JpaRepository { + + @ReaderDS + @Query("Select 1 from BookEntity t where t.id = ?1") + Long get(Long id); + + @Transactional + default BookEntity persist(BookEntity book) { + return this.save(book); + } +} diff --git a/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/utils/ExecutorUtils.java b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/utils/ExecutorUtils.java new file mode 100644 index 0000000000..60c306b3b8 --- /dev/null +++ b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/utils/ExecutorUtils.java @@ -0,0 +1,16 @@ +package com.baeldung.readonlytransactions.utils; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +public class ExecutorUtils { + + private ExecutorUtils() { + } + + public static ExecutorService createExecutor(int corePoolSize, int maximumPoolSize) { + return new ThreadPoolExecutor(corePoolSize, maximumPoolSize, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(), new ThreadPoolExecutor.DiscardOldestPolicy()); + } +} diff --git a/persistence-modules/read-only-transactions/src/main/resources/META-INF/persistence.xml b/persistence-modules/read-only-transactions/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000000..37fb45ed49 --- /dev/null +++ b/persistence-modules/read-only-transactions/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,23 @@ + + + + + org.hibernate.jpa.HibernatePersistenceProvider + com.baeldung.readonlytransactions.mysql.entities.Book + true + + + + + + + + + + + + diff --git a/persistence-modules/read-only-transactions/src/main/resources/logback.xml b/persistence-modules/read-only-transactions/src/main/resources/logback.xml new file mode 100644 index 0000000000..5d331c64b3 --- /dev/null +++ b/persistence-modules/read-only-transactions/src/main/resources/logback.xml @@ -0,0 +1,18 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - + %msg%n + + + + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/read-only-transactions/src/test/java/com/baeldung/readonlytransactions/JPATransactionIntegrationTest.java b/persistence-modules/read-only-transactions/src/test/java/com/baeldung/readonlytransactions/JPATransactionIntegrationTest.java new file mode 100644 index 0000000000..a15651b273 --- /dev/null +++ b/persistence-modules/read-only-transactions/src/test/java/com/baeldung/readonlytransactions/JPATransactionIntegrationTest.java @@ -0,0 +1,77 @@ +package com.baeldung.readonlytransactions; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import org.hibernate.Session; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.ApplicationContextInitializer; +import org.springframework.context.annotation.AnnotatedBeanDefinitionReader; +import org.springframework.context.support.GenericApplicationContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.context.support.AnnotationConfigContextLoader; + +import com.baeldung.readonlytransactions.h2.Config; +import com.baeldung.readonlytransactions.h2.Book; +import com.baeldung.readonlytransactions.mysql.spring.ReadOnlyInterception; + +import java.util.UUID; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(loader = AnnotationConfigContextLoader.class, initializers = JPATransactionIntegrationTest.TestConfig.class, classes = { ReadOnlyInterception.class }) +class JPATransactionIntegrationTest { + + static class TestConfig implements ApplicationContextInitializer { + @Override + public void initialize(GenericApplicationContext applicationContext) { + new AnnotatedBeanDefinitionReader(applicationContext).register(Config.class); + } + } + + @Autowired + @Qualifier("h2EntityManagerFactory") + private EntityManagerFactory entityManagerFactory; + + @BeforeEach + void setUp() { + EntityManager entityManager = entityManagerFactory.createEntityManager(); + entityManager.getTransaction() + .begin(); + entityManager.createQuery("DELETE FROM Book") + .executeUpdate(); + + Book book = new Book(); + book.setName("Test 1"); + book.setUuid(UUID.randomUUID() + .toString()); + + entityManager.merge(book); + entityManager.getTransaction() + .commit(); + } + + @Test + void givenAEntityManagerDefinedAsReadOnly_whenCreatingATransaction_thenAReadOnlyTransactionShouldBeCreated() { + EntityManager entityManager = entityManagerFactory.createEntityManager(); + + entityManager.unwrap(Session.class) + .setDefaultReadOnly(true); + entityManager.getTransaction() + .begin(); + Book book = entityManager.find(Book.class, 1L); + entityManager.getTransaction() + .commit(); + entityManager.unwrap(Session.class) + .setDefaultReadOnly(false); + + assertNotNull(book); + } + +} diff --git a/persistence-modules/read-only-transactions/src/test/java/com/baeldung/readonlytransactions/SpringTransactionReadOnlyIntegrationTest.java b/persistence-modules/read-only-transactions/src/test/java/com/baeldung/readonlytransactions/SpringTransactionReadOnlyIntegrationTest.java new file mode 100644 index 0000000000..2f5fd66140 --- /dev/null +++ b/persistence-modules/read-only-transactions/src/test/java/com/baeldung/readonlytransactions/SpringTransactionReadOnlyIntegrationTest.java @@ -0,0 +1,72 @@ +package com.baeldung.readonlytransactions; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.ApplicationContextInitializer; +import org.springframework.context.annotation.AnnotatedBeanDefinitionReader; +import org.springframework.context.support.GenericApplicationContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.context.support.AnnotationConfigContextLoader; + +import com.baeldung.readonlytransactions.h2.Config; +import com.baeldung.readonlytransactions.h2.Book; +import com.baeldung.readonlytransactions.h2.TransactionConfig; +import com.baeldung.readonlytransactions.h2.BookService; + +import java.util.UUID; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(loader = AnnotationConfigContextLoader.class, initializers = SpringTransactionReadOnlyIntegrationTest.TestConfig.class, classes = { BookService.class }) +class SpringTransactionReadOnlyIntegrationTest { + + static class TestConfig implements ApplicationContextInitializer { + @Override + public void initialize(GenericApplicationContext applicationContext) { + AnnotatedBeanDefinitionReader beanDefinitionReader = new AnnotatedBeanDefinitionReader(applicationContext); + + beanDefinitionReader.register(Config.class); + beanDefinitionReader.register(TransactionConfig.class); + } + } + + @Autowired + @Qualifier("h2EntityManagerFactory") + private EntityManagerFactory entityManagerFactory; + + @Autowired + private BookService service; + + @BeforeEach + void setUp() { + EntityManager entityManager = entityManagerFactory.createEntityManager(); + entityManager.getTransaction() + .begin(); + entityManager.createQuery("DELETE FROM Book") + .executeUpdate(); + + Book book = new Book(); + book.setName("Test 1"); + book.setUuid(UUID.randomUUID() + .toString()); + + entityManager.merge(book); + entityManager.getTransaction() + .commit(); + } + + @Test + void givenThatSpringTransactionManagementIsEnabled_whenAMethodIsAnnotatedAsTransactionalReadOnly_thenSpringShouldTakeCareOfTheTransaction() { + Book book = service.getBookById(1L); + + assertNotNull(book); + } +} diff --git a/persistence-modules/read-only-transactions/src/test/java/com/baeldung/readonlytransactions/TransactionSetupIntegrationTest.java b/persistence-modules/read-only-transactions/src/test/java/com/baeldung/readonlytransactions/TransactionSetupIntegrationTest.java new file mode 100644 index 0000000000..9cbc22afe3 --- /dev/null +++ b/persistence-modules/read-only-transactions/src/test/java/com/baeldung/readonlytransactions/TransactionSetupIntegrationTest.java @@ -0,0 +1,106 @@ +package com.baeldung.readonlytransactions; + +import static java.util.stream.Collectors.toList; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContextInitializer; +import org.springframework.context.annotation.AnnotatedBeanDefinitionReader; +import org.springframework.context.support.GenericApplicationContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.context.support.AnnotationConfigContextLoader; + +import com.baeldung.readonlytransactions.mysql.dao.MyRepoJPA; +import com.baeldung.readonlytransactions.mysql.dao.MyRepoJdbc; +import com.baeldung.readonlytransactions.mysql.dao.MyRepoSpring; +import com.baeldung.readonlytransactions.mysql.spring.Config; +import com.baeldung.readonlytransactions.mysql.spring.ReadOnlyInterception; +import com.baeldung.readonlytransactions.mysql.spring.entities.BookEntity; +import com.baeldung.readonlytransactions.mysql.spring.repositories.BookRepository; + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.UUID; +import java.util.function.Supplier; +import java.util.stream.Stream; + +// Needs to be run with Docker look at the readme file. +@Disabled +@ExtendWith(SpringExtension.class) +@ContextConfiguration(loader = AnnotationConfigContextLoader.class, initializers = TransactionSetupIntegrationTest.TestConfig.class, classes = { ReadOnlyInterception.class }) +class TransactionSetupIntegrationTest { + + static class TestConfig implements ApplicationContextInitializer { + @Override + public void initialize(GenericApplicationContext applicationContext) { + new AnnotatedBeanDefinitionReader(applicationContext).register(Config.class); + } + } + + private static final Logger logger = LoggerFactory.getLogger(TransactionSetupIntegrationTest.class); + + @Autowired + private MyRepoSpring repoSpring; + + @Autowired + private BookRepository repository; + + @Test + void givenTheDifferentTransactionSetup_whenRunningAThroughputTest_thenWeCanObserveTheSystem() { + Map> jdbcConfigurations = new LinkedHashMap<>(); + + jdbcConfigurations.put("JPA: Session read only true and autocommit disabled", () -> new MyRepoJPA().runQuery()); + + jdbcConfigurations.put("Spring: Session read only and autocommit true", () -> repoSpring.runQuery()); + + jdbcConfigurations.put("JDBC: Global read only and autocommit enabled", () -> new MyRepoJdbc(true, true).runQuery(null, null)); + jdbcConfigurations.put("JDBC: Global read only false and autocommit enabled", () -> new MyRepoJdbc(false, true).runQuery(null, null)); + jdbcConfigurations.put("JDBC: Global read only true and autocommit disabled", () -> new MyRepoJdbc(true, false).runQuery(null, null)); + + jdbcConfigurations.put("JDBC: Session read only and autocommit disabled", () -> new MyRepoJdbc(false, false).runQuery(false, false)); + jdbcConfigurations.put("JDBC: Session read only and autocommit enabled", () -> new MyRepoJdbc(false, false).runQuery(true, true)); + jdbcConfigurations.put("JDBC: Session read only false and autocommit enabled", () -> new MyRepoJdbc(false, false).runQuery(false, true)); + jdbcConfigurations.put("JDBC: Session read only true and autocommit disabled", () -> new MyRepoJdbc(false, false).runQuery(true, false)); + + jdbcConfigurations.entrySet() + .stream() + .flatMap(entry -> { + Stream.Builder builder = Stream.builder(); + return builder.add(entry.getKey() + " Total: " + entry.getValue() + .get()) + .add(entry.getKey() + " Total: " + entry.getValue() + .get()) + .add(entry.getKey() + " Total: " + entry.getValue() + .get()) + .build(); + }) + .collect(toList()) + .stream() + .peek(o -> logger.info("--------------------------------------------------")) + .forEach(logger::info); + } + + @Test + void givenThatSpringTransactionManagementIsEnabled_whenAMethodIsAnnotatedAsTransactionalReadOnly_thenSpringShouldTakeCareOfTheTransaction() { + Long id = repository.get(2L); + + assertNotNull(id); + } + + @Test + void givenThatSpringTransactionManagementIsEnabled_whenAMethodIsAnnotatedAsTransactional_thenSpringShouldTakeCareOfTheTransaction() { + BookEntity book = new BookEntity(); + book.setName("Persistence test"); + book.setUuid(UUID.randomUUID() + .toString()); + book = repository.persist(book); + + assertNotNull(book.getId()); + } +} \ No newline at end of file From e37a0e7b94146727655e846350cf7b03d0c5d5e8 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Mon, 23 May 2022 10:12:24 +0300 Subject: [PATCH 252/278] Create README.md --- maven-modules/maven-simple/README.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 maven-modules/maven-simple/README.md diff --git a/maven-modules/maven-simple/README.md b/maven-modules/maven-simple/README.md new file mode 100644 index 0000000000..01ae4387ad --- /dev/null +++ b/maven-modules/maven-simple/README.md @@ -0,0 +1,8 @@ +### Maven Articles that are also part of the e-book + +This module contains articles about Maven that are also part of an Ebook. + + +### NOTE: + +Since this is a module tied to an e-book, it should **not** be moved or used to store the code for any further article. From 37fe7442f8551338e07deabe7b25754d26d44953 Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Mon, 23 May 2022 16:30:02 +0500 Subject: [PATCH 253/278] Updated README.md added link back to the article: https://www.baeldung.com/java-jdbc-convert-resultset-to-json --- persistence-modules/core-java-persistence-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/core-java-persistence-2/README.md b/persistence-modules/core-java-persistence-2/README.md index 6622f9733f..4bc7d8b663 100644 --- a/persistence-modules/core-java-persistence-2/README.md +++ b/persistence-modules/core-java-persistence-2/README.md @@ -7,3 +7,4 @@ - [A Guide to Auto-Commit in JDBC](https://www.baeldung.com/java-jdbc-auto-commit) - [JDBC Connection Status](https://www.baeldung.com/jdbc-connection-status) - [Get the Number of Rows in a ResultSet](https://www.baeldung.com/java-resultset-number-of-rows) +- [Converting a JDBC ResultSet to JSON in Java](https://www.baeldung.com/java-jdbc-convert-resultset-to-json) From fe2f7ca04c07f0e787e3091fdfb5fe9f6643f06a Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Mon, 23 May 2022 16:42:16 +0500 Subject: [PATCH 254/278] Updated README.md added link back to the article: https://www.baeldung.com/java-scanner-usedelimiter --- core-java-modules/core-java-9/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-9/README.md b/core-java-modules/core-java-9/README.md index 8203755417..0fe2b857a4 100644 --- a/core-java-modules/core-java-9/README.md +++ b/core-java-modules/core-java-9/README.md @@ -11,3 +11,4 @@ This module contains articles about Java 9 core features - [Immutable ArrayList in Java](https://www.baeldung.com/java-immutable-list) - [Easy Ways to Write a Java InputStream to an OutputStream](https://www.baeldung.com/java-inputstream-to-outputstream) - [Private Methods in Java Interfaces](https://www.baeldung.com/java-interface-private-methods) +- [Java Scanner useDelimiter with Examples](https://www.baeldung.com/java-scanner-usedelimiter) From 14f0910339129197c15f853a0fa7ed3e1a9991d2 Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Mon, 23 May 2022 16:48:34 +0500 Subject: [PATCH 255/278] Updated README.md added link back to the article: https://www.baeldung.com/spring-jpa-joining-tables --- persistence-modules/spring-data-jpa-query-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/spring-data-jpa-query-3/README.md b/persistence-modules/spring-data-jpa-query-3/README.md index 920ec40965..268bce96ca 100644 --- a/persistence-modules/spring-data-jpa-query-3/README.md +++ b/persistence-modules/spring-data-jpa-query-3/README.md @@ -5,6 +5,7 @@ This module contains articles about querying data using Spring Data JPA. ### Relevant Articles: - [Query Entities by Dates and Times with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-query-by-date) - [JPA and Hibernate – Criteria vs. JPQL vs. HQL Query](https://www.baeldung.com/jpql-hql-criteria-query) +- [Joining Tables With Spring Data JPA Specifications](https://www.baeldung.com/spring-jpa-joining-tables) - More articles: [[<-- prev]](../spring-data-jpa-query-2) ### Eclipse Config From 44a0ff9d9bf04235e8f4a22b70bd730b311c9c06 Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Mon, 23 May 2022 16:52:12 +0500 Subject: [PATCH 256/278] Updated README.md added link back to the article: https://www.baeldung.com/java-files-match-wildcard-strings --- core-java-modules/core-java-nio-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-nio-2/README.md b/core-java-modules/core-java-nio-2/README.md index c405cb7c77..527600779a 100644 --- a/core-java-modules/core-java-nio-2/README.md +++ b/core-java-modules/core-java-nio-2/README.md @@ -13,4 +13,5 @@ This module contains articles about core Java non-blocking input and output (IO) - [Java – Path vs File](https://www.baeldung.com/java-path-vs-file) - [What Is the Difference Between NIO and NIO.2?](https://www.baeldung.com/java-nio-vs-nio-2) - [Guide to ByteBuffer](https://www.baeldung.com/java-bytebuffer) +- [Find Files that Match Wildcard Strings in Java](https://www.baeldung.com/java-files-match-wildcard-strings) - [[<-- Prev]](/core-java-modules/core-java-nio) From 429fb3c660e2474b8a6c2d28bb4bc9727d8d4a7e Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Mon, 23 May 2022 17:07:54 +0500 Subject: [PATCH 257/278] Updated README.md added link back to the article: https://www.baeldung.com/spring-keycloak-get-user-id --- spring-boot-modules/spring-boot-keycloak/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-modules/spring-boot-keycloak/README.md b/spring-boot-modules/spring-boot-keycloak/README.md index 7a1323d10e..cde11df0fa 100644 --- a/spring-boot-modules/spring-boot-keycloak/README.md +++ b/spring-boot-modules/spring-boot-keycloak/README.md @@ -9,3 +9,4 @@ This module contains articles about Keycloak in Spring Boot projects. - [Keycloak User Self-Registration](https://www.baeldung.com/keycloak-user-registration) - [Customizing Themes for Keycloak](https://www.baeldung.com/spring-keycloak-custom-themes) - [Securing SOAP Web Services With Keycloak](https://www.baeldung.com/soap-keycloak) +- [Get Keycloak User ID in Spring](https://www.baeldung.com/spring-keycloak-get-user-id) From e8de750d9747efa13e37bb61efce5ca53e7dfd5f Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Mon, 23 May 2022 17:12:20 +0500 Subject: [PATCH 258/278] Updated README.md added link back to the article: https://www.baeldung.com/spring-data-mongodb-collection-name --- .../spring-boot-persistence-mongodb-2/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/README.md b/persistence-modules/spring-boot-persistence-mongodb-2/README.md index 9169e09813..ba27436109 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-2/README.md +++ b/persistence-modules/spring-boot-persistence-mongodb-2/README.md @@ -1,4 +1,5 @@ # Relevant Articles - [Logging MongoDB Queries with Spring Boot](https://www.baeldung.com/spring-boot-mongodb-logging) -- More articles: [[<--prev]](../spring-boot-persistence-mongodb) \ No newline at end of file +- [Configure MongoDB Collection Name for a Class in Spring Data](https://www.baeldung.com/spring-data-mongodb-collection-name) +- More articles: [[<--prev]](../spring-boot-persistence-mongodb) From d8adffdbb248c22b9b3e7ebd63e38fcd4613ba06 Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Mon, 23 May 2022 17:15:39 +0500 Subject: [PATCH 259/278] Updated README.md added link back to the article: https://www.baeldung.com/jdk-com-sun-proxy --- core-java-modules/core-java-reflection-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-reflection-2/README.md b/core-java-modules/core-java-reflection-2/README.md index c1966dd63d..a3c9d00b0a 100644 --- a/core-java-modules/core-java-reflection-2/README.md +++ b/core-java-modules/core-java-reflection-2/README.md @@ -7,3 +7,4 @@ - [Invoking a Private Method in Java](https://www.baeldung.com/java-call-private-method) - [Finding All Classes in a Java Package](https://www.baeldung.com/java-find-all-classes-in-package) - [Invoke a Static Method Using Java Reflection API](https://www.baeldung.com/java-invoke-static-method-reflection) +- [What Is the JDK com.sun.proxy.$Proxy Class?](https://www.baeldung.com/jdk-com-sun-proxy) From d34be2d6b747ddfd48f4f43d89aee0d5ece213ac Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Mon, 23 May 2022 17:25:29 +0500 Subject: [PATCH 260/278] Updated README.md added link back to the article: https://www.baeldung.com/java-bean-validation-constraint-composition --- javaxval/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/javaxval/README.md b/javaxval/README.md index 24c2cf98c5..8fc5b07ccf 100644 --- a/javaxval/README.md +++ b/javaxval/README.md @@ -12,3 +12,4 @@ This module contains articles about Bean Validation. - [Validations for Enum Types](https://www.baeldung.com/javax-validations-enums) - [Guide to ParameterMessageInterpolator](https://www.baeldung.com/hibernate-parametermessageinterpolator) - [Hibernate Validator Annotation Processor in Depth](https://www.baeldung.com/hibernate-validator-annotation-processor) +- [Constraint Composition with Bean Validation](https://www.baeldung.com/java-bean-validation-constraint-composition) From b208b9650597c3636ce0e6abe2e39b12cdbed0f2 Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Mon, 23 May 2022 17:30:29 +0500 Subject: [PATCH 261/278] Updated README.md added link back to the article: https://www.baeldung.com/java-domain-name-from-url --- core-java-modules/core-java-networking-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-networking-3/README.md b/core-java-modules/core-java-networking-3/README.md index 21f939b43e..03c2dcfa89 100644 --- a/core-java-modules/core-java-networking-3/README.md +++ b/core-java-modules/core-java-networking-3/README.md @@ -11,4 +11,5 @@ This module contains articles about networking in Java - [Find the IP Address of a Client Connected to a Server](https://www.baeldung.com/java-client-get-ip-address) - [Unix Domain Socket in Java 16](https://www.baeldung.com/java-unix-domain-socket) - [Get the IP Address of the Current Machine Using Java](https://www.baeldung.com/java-get-ip-address) +- [Get Domain Name From Given URL in Java](https://www.baeldung.com/java-domain-name-from-url) - [[<-- Prev]](/core-java-modules/core-java-networking-2) From 1abbf7083d137567d40a32367d0cb2e5030ecdef Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Mon, 23 May 2022 17:32:59 +0500 Subject: [PATCH 262/278] Updated README.md added link back to the article: https://www.baeldung.com/java-check-character-vowel --- core-java-modules/core-java-string-operations-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-string-operations-4/README.md b/core-java-modules/core-java-string-operations-4/README.md index 0e6c9e7e2c..ff6d887154 100644 --- a/core-java-modules/core-java-string-operations-4/README.md +++ b/core-java-modules/core-java-string-operations-4/README.md @@ -6,4 +6,5 @@ - [Split a String Every n Characters in Java](https://www.baeldung.com/java-string-split-every-n-characters) - [String equals() Vs contentEquals() in Java](https://www.baeldung.com/java-string-equals-vs-contentequals) - [Check if a String Ends with a Certain Pattern in Java](https://www.baeldung.com/java-string-ends-pattern) +- [Check if a Character is a Vowel in Java](https://www.baeldung.com/java-check-character-vowel) From 10bc54e7d6233eb1111fb908ee58e81eb20054cf Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Mon, 23 May 2022 17:35:17 +0500 Subject: [PATCH 263/278] Updated README.md added link back to the article: https://www.baeldung.com/spring-transactions-read-only --- persistence-modules/read-only-transactions/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/persistence-modules/read-only-transactions/README.md b/persistence-modules/read-only-transactions/README.md index 90a86e551e..8f3898f217 100644 --- a/persistence-modules/read-only-transactions/README.md +++ b/persistence-modules/read-only-transactions/README.md @@ -1,8 +1,8 @@ ### Relevant Articles: -- +- [Using Transactions for Read-Only Operations](https://www.baeldung.com/spring-transactions-read-only) ### Instructions To run the `com.baeldung.read_only_transactions.TransactionSetupIntegrationTest` first follow the steps described next: - run the command `docker-compose -f docker-compose-mysql.yml up` - Open a SQL client of your preference and execute the `create.sql` script. -- You can check the mysql logs using `tail -f mysql/${name of de log file created}.log` \ No newline at end of file +- You can check the mysql logs using `tail -f mysql/${name of de log file created}.log` From fb9f92629e98c7e92e5eee96dc03d276674033ed Mon Sep 17 00:00:00 2001 From: kwoyke Date: Mon, 23 May 2022 17:49:01 +0200 Subject: [PATCH 264/278] JAVA-12009: Upgrade Spring to 5.3.20 (#12251) --- parent-spring-5/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parent-spring-5/pom.xml b/parent-spring-5/pom.xml index b2d581c9c1..dfdfa77d36 100644 --- a/parent-spring-5/pom.xml +++ b/parent-spring-5/pom.xml @@ -24,7 +24,7 @@ - 5.3.16 + 5.3.20 5.6.0 1.5.10.RELEASE From 8f54543306578e62d539fdc0811fdd4044d1732e Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Mon, 23 May 2022 18:27:46 +0200 Subject: [PATCH 265/278] JAVA-5484: Added Java Http Request Timeout (#12248) Co-authored-by: Harpal Singh --- ...ClientTimeoutOnRequestIntegrationTest.java | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 core-java-modules/core-java-networking-3/src/test/java/com/baeldung/http/JavaHttpClientTimeoutOnRequestIntegrationTest.java diff --git a/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/http/JavaHttpClientTimeoutOnRequestIntegrationTest.java b/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/http/JavaHttpClientTimeoutOnRequestIntegrationTest.java new file mode 100644 index 0000000000..d693b9075c --- /dev/null +++ b/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/http/JavaHttpClientTimeoutOnRequestIntegrationTest.java @@ -0,0 +1,51 @@ +package com.baeldung.http; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpConnectTimeoutException; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.time.Duration; +import java.time.LocalTime; + +import static com.baeldung.http.JavaHttpClientTimeout.getHttpClientWithTimeout; +import static java.time.LocalTime.now; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class JavaHttpClientTimeoutOnRequestIntegrationTest { + + private HttpClient httpClient; + private HttpRequest httpRequest; + + @BeforeEach + public void setUp() { + httpClient = getHttpClientWithTimeout(3); + httpClient.connectTimeout().map(Duration::toSeconds) + .ifPresent(sec -> System.out.println("Timeout in seconds: " + sec)); + + httpRequest = HttpRequest.newBuilder() + .uri(URI.create("http://10.255.255.1")) + .timeout(Duration.ofSeconds(1)) + .GET() + .build(); + } + + @Test + void shouldThrowExceptionWhithin1SecondWhenMakingSyncCall() { + LocalTime beforeHttpCall = now(); + HttpConnectTimeoutException thrown = assertThrows( + HttpConnectTimeoutException.class, + () -> httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString()), + "Expected doThing() to throw, but it didn't" + ); + LocalTime afterHttpCall = now(); + assertTrue(thrown.getMessage().contains("timed out")); + assertEquals(1, Duration.between(beforeHttpCall, afterHttpCall).getSeconds()); + } + +} From c4b76701ebf7debd388e2bb4fe553729ca38ac00 Mon Sep 17 00:00:00 2001 From: Yavuz Tas <12643010+yavuztas@users.noreply.github.com> Date: Mon, 23 May 2022 22:01:34 +0200 Subject: [PATCH 266/278] BAEL-5452 sample docker and docker compose files for the article. (#12115) Co-authored-by: Yavuz Tas --- docker/docker-spring-boot/pom.xml | 7 +++++++ .../src/main/docker/springprofile/Dockerfile | 11 +++++++++++ .../main/docker/springprofile/docker-compose-prod.yml | 6 ++++++ .../main/docker/springprofile/docker-compose-test.yml | 6 ++++++ 4 files changed, 30 insertions(+) create mode 100644 docker/docker-spring-boot/src/main/docker/springprofile/Dockerfile create mode 100644 docker/docker-spring-boot/src/main/docker/springprofile/docker-compose-prod.yml create mode 100644 docker/docker-spring-boot/src/main/docker/springprofile/docker-compose-test.yml diff --git a/docker/docker-spring-boot/pom.xml b/docker/docker-spring-boot/pom.xml index c42f7602b4..69d25e374b 100644 --- a/docker/docker-spring-boot/pom.xml +++ b/docker/docker-spring-boot/pom.xml @@ -42,6 +42,13 @@ ${project.basedir}/src/layers.xml + + + + repackage + + + diff --git a/docker/docker-spring-boot/src/main/docker/springprofile/Dockerfile b/docker/docker-spring-boot/src/main/docker/springprofile/Dockerfile new file mode 100644 index 0000000000..f06f08cff6 --- /dev/null +++ b/docker/docker-spring-boot/src/main/docker/springprofile/Dockerfile @@ -0,0 +1,11 @@ +# To build and run docker-with-spring-profile: +# +# docker build -f src/main/docker/springprofile/Dockerfile --tag=docker-with-spring-profile:latest . +# docker run docker-with-spring-profile:latest +# +# To run with profiles: +# docker run -e "SPRING_PROFILES_ACTIVE=test1,test2,test3" docker-with-spring-profile:latest + +FROM openjdk:11 +COPY target/*.jar app.jar +ENTRYPOINT ["java", "-jar", "/app.jar"] diff --git a/docker/docker-spring-boot/src/main/docker/springprofile/docker-compose-prod.yml b/docker/docker-spring-boot/src/main/docker/springprofile/docker-compose-prod.yml new file mode 100644 index 0000000000..1892a38ae6 --- /dev/null +++ b/docker/docker-spring-boot/src/main/docker/springprofile/docker-compose-prod.yml @@ -0,0 +1,6 @@ +version: "3.5" +services: + docker-with-spring-profile: + image: docker-with-spring-profile:latest + environment: + - "SPRING_PROFILES_ACTIVE=prod" diff --git a/docker/docker-spring-boot/src/main/docker/springprofile/docker-compose-test.yml b/docker/docker-spring-boot/src/main/docker/springprofile/docker-compose-test.yml new file mode 100644 index 0000000000..780ebcb63f --- /dev/null +++ b/docker/docker-spring-boot/src/main/docker/springprofile/docker-compose-test.yml @@ -0,0 +1,6 @@ +version: "3.5" +services: + docker-with-spring-profile: + image: docker-with-spring-profile:latest + environment: + - "SPRING_PROFILES_ACTIVE=test" From d330c8a991c2723a8d328616cadbc1d52d5e7fcc Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Tue, 24 May 2022 11:02:46 +0300 Subject: [PATCH 267/278] Update README.md --- spring-security-modules/spring-security-core/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-security-modules/spring-security-core/README.md b/spring-security-modules/spring-security-core/README.md index 1949b5a929..9f8e4dda53 100644 --- a/spring-security-modules/spring-security-core/README.md +++ b/spring-security-modules/spring-security-core/README.md @@ -10,7 +10,6 @@ This module contains articles about core Spring Security - [Deny Access on Missing @PreAuthorize to Spring Controller Methods](https://www.baeldung.com/spring-deny-access) - [Spring Security: Check If a User Has a Role in Java](https://www.baeldung.com/spring-security-check-user-role) - [Filtering Jackson JSON Output Based on Spring Security Role](https://www.baeldung.com/spring-security-role-filter-json) -- [Handle Spring Security Exceptions](https://www.baeldung.com/spring-security-exceptions) ### Build the Project From 4696d0b54e92ed5e0567352ec6346aacfa02b860 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Tue, 24 May 2022 10:22:37 +0200 Subject: [PATCH 268/278] JAVA-12100: Rename ddd-modules -> ddd-contexts --- {ddd-modules => ddd-contexts}/README.md | 0 .../infrastructure/pom.xml | 12 ++++++------ .../infrastructure/db/InMemoryOrderStore.java | 12 ++++++------ .../infrastructure/events/SimpleEventBus.java | 8 ++++---- .../src/main/java/module-info.java | 14 ++++++++++++++ {ddd-modules => ddd-contexts}/mainapp/pom.xml | 8 ++++---- .../dddcontexts}/mainapp/Application.java | 16 ++++++++-------- .../mainapp/src/main/java/module-info.java | 8 ++++++++ .../ordercontext/pom.xml | 8 ++++---- .../ordercontext/model/CustomerOrder.java | 2 +- .../ordercontext/model/OrderItem.java | 2 +- .../repository/CustomerOrderRepository.java | 7 +++++++ .../service/CustomerOrderService.java | 10 +++++----- .../ordercontext/service/OrderService.java | 11 +++++++++++ .../ordercontext/src/main/java/module-info.java | 8 ++++++++ {ddd-modules => ddd-contexts}/pom.xml | 6 +++--- .../sharedkernel/pom.xml | 6 +++--- .../sharedkernel/events/ApplicationEvent.java | 2 +- .../sharedkernel/events/EventBus.java | 2 +- .../sharedkernel/events/EventSubscriber.java | 2 +- .../sharedkernel/service/ApplicationService.java | 8 ++++---- .../sharedkernel/src/main/java/module-info.java | 4 ++++ .../shippingcontext/pom.xml | 8 ++++---- .../shippingcontext/model/PackageItem.java | 2 +- .../shippingcontext/model/Parcel.java | 2 +- .../shippingcontext/model/ShippableOrder.java | 2 +- .../repository/ShippingOrderRepository.java | 4 ++-- .../service/ParcelShippingService.java | 14 +++++++------- .../shippingcontext/service/ShippingService.java | 8 ++++---- .../src/main/java/module-info.java | 8 ++++++++ .../mainapp/src/main/java/module-info.java | 8 -------- .../repository/CustomerOrderRepository.java | 7 ------- .../ordercontext/service/OrderService.java | 11 ----------- .../ordercontext/src/main/java/module-info.java | 8 -------- .../sharedkernel/src/main/java/module-info.java | 4 ---- .../src/main/java/module-info.java | 8 -------- 36 files changed, 132 insertions(+), 118 deletions(-) rename {ddd-modules => ddd-contexts}/README.md (100%) rename {ddd-modules => ddd-contexts}/infrastructure/pom.xml (80%) rename {ddd-modules/infrastructure/src/main/java/com/baeldung/dddmodules => ddd-contexts/infrastructure/src/main/java/com/baeldung/dddcontexts}/infrastructure/db/InMemoryOrderStore.java (85%) rename {ddd-modules/infrastructure/src/main/java/com/baeldung/dddmodules => ddd-contexts/infrastructure/src/main/java/com/baeldung/dddcontexts}/infrastructure/events/SimpleEventBus.java (82%) create mode 100644 ddd-contexts/infrastructure/src/main/java/module-info.java rename {ddd-modules => ddd-contexts}/mainapp/pom.xml (87%) rename {ddd-modules/mainapp/src/main/java/com/baeldung/dddmodules => ddd-contexts/mainapp/src/main/java/com/baeldung/dddcontexts}/mainapp/Application.java (80%) create mode 100644 ddd-contexts/mainapp/src/main/java/module-info.java rename {ddd-modules => ddd-contexts}/ordercontext/pom.xml (84%) rename {ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules => ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts}/ordercontext/model/CustomerOrder.java (95%) rename {ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules => ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts}/ordercontext/model/OrderItem.java (95%) create mode 100644 ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/repository/CustomerOrderRepository.java rename {ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules => ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts}/ordercontext/service/CustomerOrderService.java (76%) create mode 100644 ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/service/OrderService.java create mode 100644 ddd-contexts/ordercontext/src/main/java/module-info.java rename {ddd-modules => ddd-contexts}/pom.xml (95%) rename {ddd-modules => ddd-contexts}/sharedkernel/pom.xml (86%) rename {ddd-modules/sharedkernel/src/main/java/com/baeldung/dddmodules => ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts}/sharedkernel/events/ApplicationEvent.java (88%) rename {ddd-modules/sharedkernel/src/main/java/com/baeldung/dddmodules => ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts}/sharedkernel/events/EventBus.java (83%) rename {ddd-modules/sharedkernel/src/main/java/com/baeldung/dddmodules => ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts}/sharedkernel/events/EventSubscriber.java (63%) rename {ddd-modules/sharedkernel/src/main/java/com/baeldung/dddmodules => ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts}/sharedkernel/service/ApplicationService.java (76%) create mode 100644 ddd-contexts/sharedkernel/src/main/java/module-info.java rename {ddd-modules => ddd-contexts}/shippingcontext/pom.xml (83%) rename {ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules => ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts}/shippingcontext/model/PackageItem.java (93%) rename {ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules => ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts}/shippingcontext/model/Parcel.java (95%) rename {ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules => ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts}/shippingcontext/model/ShippableOrder.java (93%) rename {ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules => ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts}/shippingcontext/repository/ShippingOrderRepository.java (51%) rename {ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules => ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts}/shippingcontext/service/ParcelShippingService.java (78%) rename {ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules => ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts}/shippingcontext/service/ShippingService.java (50%) create mode 100644 ddd-contexts/shippingcontext/src/main/java/module-info.java delete mode 100644 ddd-modules/mainapp/src/main/java/module-info.java delete mode 100644 ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules/ordercontext/repository/CustomerOrderRepository.java delete mode 100644 ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules/ordercontext/service/OrderService.java delete mode 100644 ddd-modules/ordercontext/src/main/java/module-info.java delete mode 100644 ddd-modules/sharedkernel/src/main/java/module-info.java delete mode 100644 ddd-modules/shippingcontext/src/main/java/module-info.java diff --git a/ddd-modules/README.md b/ddd-contexts/README.md similarity index 100% rename from ddd-modules/README.md rename to ddd-contexts/README.md diff --git a/ddd-modules/infrastructure/pom.xml b/ddd-contexts/infrastructure/pom.xml similarity index 80% rename from ddd-modules/infrastructure/pom.xml rename to ddd-contexts/infrastructure/pom.xml index 232e5ff4b4..6107991ceb 100644 --- a/ddd-modules/infrastructure/pom.xml +++ b/ddd-contexts/infrastructure/pom.xml @@ -3,31 +3,31 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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.dddmodules.infrastructure + com.baeldung.dddcontexts.infrastructure infrastructure 1.0 jar - com.baeldung.dddmodules - ddd-modules + com.baeldung.dddcontexts + ddd-contexts 1.0 ../ - com.baeldung.dddmodules.shippingcontext + com.baeldung.dddcontexts.shippingcontext shippingcontext ${appmodules.version} - com.baeldung.dddmodules.ordercontext + com.baeldung.dddcontexts.ordercontext ordercontext ${appmodules.version} - com.baeldung.dddmodules.sharedkernel + com.baeldung.dddcontexts.sharedkernel sharedkernel ${appmodules.version} diff --git a/ddd-modules/infrastructure/src/main/java/com/baeldung/dddmodules/infrastructure/db/InMemoryOrderStore.java b/ddd-contexts/infrastructure/src/main/java/com/baeldung/dddcontexts/infrastructure/db/InMemoryOrderStore.java similarity index 85% rename from ddd-modules/infrastructure/src/main/java/com/baeldung/dddmodules/infrastructure/db/InMemoryOrderStore.java rename to ddd-contexts/infrastructure/src/main/java/com/baeldung/dddcontexts/infrastructure/db/InMemoryOrderStore.java index 13deb2471e..8424afff79 100644 --- a/ddd-modules/infrastructure/src/main/java/com/baeldung/dddmodules/infrastructure/db/InMemoryOrderStore.java +++ b/ddd-contexts/infrastructure/src/main/java/com/baeldung/dddcontexts/infrastructure/db/InMemoryOrderStore.java @@ -1,10 +1,10 @@ -package com.baeldung.dddmodules.infrastructure.db; +package com.baeldung.dddcontexts.infrastructure.db; -import com.baeldung.dddmodules.ordercontext.model.CustomerOrder; -import com.baeldung.dddmodules.ordercontext.repository.CustomerOrderRepository; -import com.baeldung.dddmodules.shippingcontext.model.PackageItem; -import com.baeldung.dddmodules.shippingcontext.model.ShippableOrder; -import com.baeldung.dddmodules.shippingcontext.repository.ShippingOrderRepository; +import com.baeldung.dddcontexts.ordercontext.model.CustomerOrder; +import com.baeldung.dddcontexts.ordercontext.repository.CustomerOrderRepository; +import com.baeldung.dddcontexts.shippingcontext.model.PackageItem; +import com.baeldung.dddcontexts.shippingcontext.model.ShippableOrder; +import com.baeldung.dddcontexts.shippingcontext.repository.ShippingOrderRepository; import java.util.HashMap; import java.util.List; diff --git a/ddd-modules/infrastructure/src/main/java/com/baeldung/dddmodules/infrastructure/events/SimpleEventBus.java b/ddd-contexts/infrastructure/src/main/java/com/baeldung/dddcontexts/infrastructure/events/SimpleEventBus.java similarity index 82% rename from ddd-modules/infrastructure/src/main/java/com/baeldung/dddmodules/infrastructure/events/SimpleEventBus.java rename to ddd-contexts/infrastructure/src/main/java/com/baeldung/dddcontexts/infrastructure/events/SimpleEventBus.java index 6aea7ff6e9..1cbcf13749 100644 --- a/ddd-modules/infrastructure/src/main/java/com/baeldung/dddmodules/infrastructure/events/SimpleEventBus.java +++ b/ddd-contexts/infrastructure/src/main/java/com/baeldung/dddcontexts/infrastructure/events/SimpleEventBus.java @@ -1,8 +1,8 @@ -package com.baeldung.dddmodules.infrastructure.events; +package com.baeldung.dddcontexts.infrastructure.events; -import com.baeldung.dddmodules.sharedkernel.events.ApplicationEvent; -import com.baeldung.dddmodules.sharedkernel.events.EventBus; -import com.baeldung.dddmodules.sharedkernel.events.EventSubscriber; +import com.baeldung.dddcontexts.sharedkernel.events.ApplicationEvent; +import com.baeldung.dddcontexts.sharedkernel.events.EventBus; +import com.baeldung.dddcontexts.sharedkernel.events.EventSubscriber; import java.util.Map; import java.util.Set; diff --git a/ddd-contexts/infrastructure/src/main/java/module-info.java b/ddd-contexts/infrastructure/src/main/java/module-info.java new file mode 100644 index 0000000000..1387de16c2 --- /dev/null +++ b/ddd-contexts/infrastructure/src/main/java/module-info.java @@ -0,0 +1,14 @@ +import com.baeldung.dddcontexts.infrastructure.db.InMemoryOrderStore; +import com.baeldung.dddcontexts.infrastructure.events.SimpleEventBus; + +module com.baeldung.dddcontexts.infrastructure { + requires transitive com.baeldung.dddcontexts.sharedkernel; + requires transitive com.baeldung.dddcontexts.ordercontext; + requires transitive com.baeldung.dddcontexts.shippingcontext; + provides com.baeldung.dddcontexts.sharedkernel.events.EventBus + with SimpleEventBus; + provides com.baeldung.dddcontexts.ordercontext.repository.CustomerOrderRepository + with InMemoryOrderStore; + provides com.baeldung.dddcontexts.shippingcontext.repository.ShippingOrderRepository + with InMemoryOrderStore; +} diff --git a/ddd-modules/mainapp/pom.xml b/ddd-contexts/mainapp/pom.xml similarity index 87% rename from ddd-modules/mainapp/pom.xml rename to ddd-contexts/mainapp/pom.xml index a2d3b8f3ea..8046ae4e7d 100644 --- a/ddd-modules/mainapp/pom.xml +++ b/ddd-contexts/mainapp/pom.xml @@ -3,21 +3,21 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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.dddmodules.mainapp + com.baeldung.dddcontexts.mainapp mainapp 1.0 jar - com.baeldung.dddmodules - ddd-modules + com.baeldung.dddcontexts + ddd-contexts 1.0 ../ - com.baeldung.dddmodules.infrastructure + com.baeldung.dddcontexts.infrastructure infrastructure ${appmodules.version} diff --git a/ddd-modules/mainapp/src/main/java/com/baeldung/dddmodules/mainapp/Application.java b/ddd-contexts/mainapp/src/main/java/com/baeldung/dddcontexts/mainapp/Application.java similarity index 80% rename from ddd-modules/mainapp/src/main/java/com/baeldung/dddmodules/mainapp/Application.java rename to ddd-contexts/mainapp/src/main/java/com/baeldung/dddcontexts/mainapp/Application.java index 05e27abe30..ff866e49dd 100644 --- a/ddd-modules/mainapp/src/main/java/com/baeldung/dddmodules/mainapp/Application.java +++ b/ddd-contexts/mainapp/src/main/java/com/baeldung/dddcontexts/mainapp/Application.java @@ -1,12 +1,12 @@ -package com.baeldung.dddmodules.mainapp; +package com.baeldung.dddcontexts.mainapp; -import com.baeldung.dddmodules.ordercontext.model.CustomerOrder; -import com.baeldung.dddmodules.ordercontext.model.OrderItem; -import com.baeldung.dddmodules.ordercontext.repository.CustomerOrderRepository; -import com.baeldung.dddmodules.ordercontext.service.OrderService; -import com.baeldung.dddmodules.sharedkernel.events.EventBus; -import com.baeldung.dddmodules.shippingcontext.repository.ShippingOrderRepository; -import com.baeldung.dddmodules.shippingcontext.service.ShippingService; +import com.baeldung.dddcontexts.ordercontext.model.CustomerOrder; +import com.baeldung.dddcontexts.ordercontext.model.OrderItem; +import com.baeldung.dddcontexts.ordercontext.repository.CustomerOrderRepository; +import com.baeldung.dddcontexts.ordercontext.service.OrderService; +import com.baeldung.dddcontexts.sharedkernel.events.EventBus; +import com.baeldung.dddcontexts.shippingcontext.repository.ShippingOrderRepository; +import com.baeldung.dddcontexts.shippingcontext.service.ShippingService; import java.util.*; diff --git a/ddd-contexts/mainapp/src/main/java/module-info.java b/ddd-contexts/mainapp/src/main/java/module-info.java new file mode 100644 index 0000000000..b71e474111 --- /dev/null +++ b/ddd-contexts/mainapp/src/main/java/module-info.java @@ -0,0 +1,8 @@ +module com.baeldung.dddcontexts.mainapp { + uses com.baeldung.dddcontexts.sharedkernel.events.EventBus; + uses com.baeldung.dddcontexts.ordercontext.service.OrderService; + uses com.baeldung.dddcontexts.ordercontext.repository.CustomerOrderRepository; + uses com.baeldung.dddcontexts.shippingcontext.repository.ShippingOrderRepository; + uses com.baeldung.dddcontexts.shippingcontext.service.ShippingService; + requires transitive com.baeldung.dddcontexts.infrastructure; +} \ No newline at end of file diff --git a/ddd-modules/ordercontext/pom.xml b/ddd-contexts/ordercontext/pom.xml similarity index 84% rename from ddd-modules/ordercontext/pom.xml rename to ddd-contexts/ordercontext/pom.xml index eaf44badd3..e29f109b71 100644 --- a/ddd-modules/ordercontext/pom.xml +++ b/ddd-contexts/ordercontext/pom.xml @@ -3,20 +3,20 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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.dddmodules.ordercontext + com.baeldung.dddcontexts.ordercontext ordercontext 1.0 jar - com.baeldung.dddmodules - ddd-modules + com.baeldung.dddcontexts + ddd-contexts 1.0 - com.baeldung.dddmodules.sharedkernel + com.baeldung.dddcontexts.sharedkernel sharedkernel ${appmodules.version} diff --git a/ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules/ordercontext/model/CustomerOrder.java b/ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/model/CustomerOrder.java similarity index 95% rename from ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules/ordercontext/model/CustomerOrder.java rename to ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/model/CustomerOrder.java index ee87de56bd..8a69e8b805 100644 --- a/ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules/ordercontext/model/CustomerOrder.java +++ b/ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/model/CustomerOrder.java @@ -1,4 +1,4 @@ -package com.baeldung.dddmodules.ordercontext.model; +package com.baeldung.dddcontexts.ordercontext.model; import java.util.List; diff --git a/ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules/ordercontext/model/OrderItem.java b/ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/model/OrderItem.java similarity index 95% rename from ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules/ordercontext/model/OrderItem.java rename to ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/model/OrderItem.java index aaad0777e4..87b8fea260 100644 --- a/ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules/ordercontext/model/OrderItem.java +++ b/ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/model/OrderItem.java @@ -1,4 +1,4 @@ -package com.baeldung.dddmodules.ordercontext.model; +package com.baeldung.dddcontexts.ordercontext.model; public class OrderItem { private int productId; diff --git a/ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/repository/CustomerOrderRepository.java b/ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/repository/CustomerOrderRepository.java new file mode 100644 index 0000000000..15d1e70981 --- /dev/null +++ b/ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/repository/CustomerOrderRepository.java @@ -0,0 +1,7 @@ +package com.baeldung.dddcontexts.ordercontext.repository; + +import com.baeldung.dddcontexts.ordercontext.model.CustomerOrder; + +public interface CustomerOrderRepository { + void saveCustomerOrder(CustomerOrder order); +} diff --git a/ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules/ordercontext/service/CustomerOrderService.java b/ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/service/CustomerOrderService.java similarity index 76% rename from ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules/ordercontext/service/CustomerOrderService.java rename to ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/service/CustomerOrderService.java index b9d26e6212..c017f36ca5 100644 --- a/ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules/ordercontext/service/CustomerOrderService.java +++ b/ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/service/CustomerOrderService.java @@ -1,9 +1,9 @@ -package com.baeldung.dddmodules.ordercontext.service; +package com.baeldung.dddcontexts.ordercontext.service; -import com.baeldung.dddmodules.ordercontext.model.CustomerOrder; -import com.baeldung.dddmodules.ordercontext.repository.CustomerOrderRepository; -import com.baeldung.dddmodules.sharedkernel.events.ApplicationEvent; -import com.baeldung.dddmodules.sharedkernel.events.EventBus; +import com.baeldung.dddcontexts.ordercontext.model.CustomerOrder; +import com.baeldung.dddcontexts.ordercontext.repository.CustomerOrderRepository; +import com.baeldung.dddcontexts.sharedkernel.events.ApplicationEvent; +import com.baeldung.dddcontexts.sharedkernel.events.EventBus; import java.util.HashMap; import java.util.Map; diff --git a/ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/service/OrderService.java b/ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/service/OrderService.java new file mode 100644 index 0000000000..94e9dcc7fc --- /dev/null +++ b/ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/service/OrderService.java @@ -0,0 +1,11 @@ +package com.baeldung.dddcontexts.ordercontext.service; + +import com.baeldung.dddcontexts.ordercontext.model.CustomerOrder; +import com.baeldung.dddcontexts.ordercontext.repository.CustomerOrderRepository; +import com.baeldung.dddcontexts.sharedkernel.service.ApplicationService; + +public interface OrderService extends ApplicationService { + void placeOrder(CustomerOrder order); + + void setOrderRepository(CustomerOrderRepository orderRepository); +} diff --git a/ddd-contexts/ordercontext/src/main/java/module-info.java b/ddd-contexts/ordercontext/src/main/java/module-info.java new file mode 100644 index 0000000000..681565ab4d --- /dev/null +++ b/ddd-contexts/ordercontext/src/main/java/module-info.java @@ -0,0 +1,8 @@ +module com.baeldung.dddcontexts.ordercontext { + requires com.baeldung.dddcontexts.sharedkernel; + exports com.baeldung.dddcontexts.ordercontext.service; + exports com.baeldung.dddcontexts.ordercontext.model; + exports com.baeldung.dddcontexts.ordercontext.repository; + provides com.baeldung.dddcontexts.ordercontext.service.OrderService + with com.baeldung.dddcontexts.ordercontext.service.CustomerOrderService; +} \ No newline at end of file diff --git a/ddd-modules/pom.xml b/ddd-contexts/pom.xml similarity index 95% rename from ddd-modules/pom.xml rename to ddd-contexts/pom.xml index d2932ee515..1a764a65b9 100644 --- a/ddd-modules/pom.xml +++ b/ddd-contexts/pom.xml @@ -3,10 +3,10 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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.dddmodules - ddd-modules + com.baeldung.dddcontexts + ddd-contexts 1.0 - ddd-modules + ddd-contexts pom diff --git a/ddd-modules/sharedkernel/pom.xml b/ddd-contexts/sharedkernel/pom.xml similarity index 86% rename from ddd-modules/sharedkernel/pom.xml rename to ddd-contexts/sharedkernel/pom.xml index 3966e1c26e..5d31973c92 100644 --- a/ddd-modules/sharedkernel/pom.xml +++ b/ddd-contexts/sharedkernel/pom.xml @@ -3,14 +3,14 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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.dddmodules.sharedkernel + com.baeldung.dddcontexts.sharedkernel sharedkernel 1.0 jar - com.baeldung.dddmodules - ddd-modules + com.baeldung.dddcontexts + ddd-contexts 1.0 diff --git a/ddd-modules/sharedkernel/src/main/java/com/baeldung/dddmodules/sharedkernel/events/ApplicationEvent.java b/ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/ApplicationEvent.java similarity index 88% rename from ddd-modules/sharedkernel/src/main/java/com/baeldung/dddmodules/sharedkernel/events/ApplicationEvent.java rename to ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/ApplicationEvent.java index e3c3ebaf0e..7db89e36e0 100644 --- a/ddd-modules/sharedkernel/src/main/java/com/baeldung/dddmodules/sharedkernel/events/ApplicationEvent.java +++ b/ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/ApplicationEvent.java @@ -1,4 +1,4 @@ -package com.baeldung.dddmodules.sharedkernel.events; +package com.baeldung.dddcontexts.sharedkernel.events; import java.util.Map; diff --git a/ddd-modules/sharedkernel/src/main/java/com/baeldung/dddmodules/sharedkernel/events/EventBus.java b/ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/EventBus.java similarity index 83% rename from ddd-modules/sharedkernel/src/main/java/com/baeldung/dddmodules/sharedkernel/events/EventBus.java rename to ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/EventBus.java index b128b959e9..be95de674d 100644 --- a/ddd-modules/sharedkernel/src/main/java/com/baeldung/dddmodules/sharedkernel/events/EventBus.java +++ b/ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/EventBus.java @@ -1,4 +1,4 @@ -package com.baeldung.dddmodules.sharedkernel.events; +package com.baeldung.dddcontexts.sharedkernel.events; public interface EventBus { void publish(E event); diff --git a/ddd-modules/sharedkernel/src/main/java/com/baeldung/dddmodules/sharedkernel/events/EventSubscriber.java b/ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/EventSubscriber.java similarity index 63% rename from ddd-modules/sharedkernel/src/main/java/com/baeldung/dddmodules/sharedkernel/events/EventSubscriber.java rename to ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/EventSubscriber.java index 0d6d48cc33..f941514024 100644 --- a/ddd-modules/sharedkernel/src/main/java/com/baeldung/dddmodules/sharedkernel/events/EventSubscriber.java +++ b/ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/EventSubscriber.java @@ -1,4 +1,4 @@ -package com.baeldung.dddmodules.sharedkernel.events; +package com.baeldung.dddcontexts.sharedkernel.events; public interface EventSubscriber { void onEvent(E event); diff --git a/ddd-modules/sharedkernel/src/main/java/com/baeldung/dddmodules/sharedkernel/service/ApplicationService.java b/ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/service/ApplicationService.java similarity index 76% rename from ddd-modules/sharedkernel/src/main/java/com/baeldung/dddmodules/sharedkernel/service/ApplicationService.java rename to ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/service/ApplicationService.java index 5ef57ae269..a9f4488d90 100644 --- a/ddd-modules/sharedkernel/src/main/java/com/baeldung/dddmodules/sharedkernel/service/ApplicationService.java +++ b/ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/service/ApplicationService.java @@ -1,8 +1,8 @@ -package com.baeldung.dddmodules.sharedkernel.service; +package com.baeldung.dddcontexts.sharedkernel.service; -import com.baeldung.dddmodules.sharedkernel.events.ApplicationEvent; -import com.baeldung.dddmodules.sharedkernel.events.EventBus; -import com.baeldung.dddmodules.sharedkernel.events.EventSubscriber; +import com.baeldung.dddcontexts.sharedkernel.events.ApplicationEvent; +import com.baeldung.dddcontexts.sharedkernel.events.EventBus; +import com.baeldung.dddcontexts.sharedkernel.events.EventSubscriber; public interface ApplicationService { diff --git a/ddd-contexts/sharedkernel/src/main/java/module-info.java b/ddd-contexts/sharedkernel/src/main/java/module-info.java new file mode 100644 index 0000000000..f093924aed --- /dev/null +++ b/ddd-contexts/sharedkernel/src/main/java/module-info.java @@ -0,0 +1,4 @@ +module com.baeldung.dddcontexts.sharedkernel { + exports com.baeldung.dddcontexts.sharedkernel.events; + exports com.baeldung.dddcontexts.sharedkernel.service; +} diff --git a/ddd-modules/shippingcontext/pom.xml b/ddd-contexts/shippingcontext/pom.xml similarity index 83% rename from ddd-modules/shippingcontext/pom.xml rename to ddd-contexts/shippingcontext/pom.xml index a6e6167b69..2fb9e83645 100644 --- a/ddd-modules/shippingcontext/pom.xml +++ b/ddd-contexts/shippingcontext/pom.xml @@ -3,20 +3,20 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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.dddmodules.shippingcontext + com.baeldung.dddcontexts.shippingcontext shippingcontext 1.0 jar - com.baeldung.dddmodules - ddd-modules + com.baeldung.dddcontexts + ddd-contexts 1.0 - com.baeldung.dddmodules.sharedkernel + com.baeldung.dddcontexts.sharedkernel sharedkernel ${appmodules.version} diff --git a/ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/model/PackageItem.java b/ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/PackageItem.java similarity index 93% rename from ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/model/PackageItem.java rename to ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/PackageItem.java index ed09a0f2a2..0e4da42cec 100644 --- a/ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/model/PackageItem.java +++ b/ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/PackageItem.java @@ -1,4 +1,4 @@ -package com.baeldung.dddmodules.shippingcontext.model; +package com.baeldung.dddcontexts.shippingcontext.model; public class PackageItem { private int productId; diff --git a/ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/model/Parcel.java b/ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/Parcel.java similarity index 95% rename from ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/model/Parcel.java rename to ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/Parcel.java index 70c4f06ac6..ee24818fb0 100644 --- a/ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/model/Parcel.java +++ b/ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/Parcel.java @@ -1,4 +1,4 @@ -package com.baeldung.dddmodules.shippingcontext.model; +package com.baeldung.dddcontexts.shippingcontext.model; import java.util.List; diff --git a/ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/model/ShippableOrder.java b/ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/ShippableOrder.java similarity index 93% rename from ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/model/ShippableOrder.java rename to ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/ShippableOrder.java index afeea2f472..97daaf681e 100644 --- a/ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/model/ShippableOrder.java +++ b/ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/ShippableOrder.java @@ -1,4 +1,4 @@ -package com.baeldung.dddmodules.shippingcontext.model; +package com.baeldung.dddcontexts.shippingcontext.model; import java.util.List; diff --git a/ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/repository/ShippingOrderRepository.java b/ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/repository/ShippingOrderRepository.java similarity index 51% rename from ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/repository/ShippingOrderRepository.java rename to ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/repository/ShippingOrderRepository.java index b1a643f989..ba01d8e39c 100644 --- a/ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/repository/ShippingOrderRepository.java +++ b/ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/repository/ShippingOrderRepository.java @@ -1,6 +1,6 @@ -package com.baeldung.dddmodules.shippingcontext.repository; +package com.baeldung.dddcontexts.shippingcontext.repository; -import com.baeldung.dddmodules.shippingcontext.model.ShippableOrder; +import com.baeldung.dddcontexts.shippingcontext.model.ShippableOrder; import java.util.Optional; diff --git a/ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/service/ParcelShippingService.java b/ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/service/ParcelShippingService.java similarity index 78% rename from ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/service/ParcelShippingService.java rename to ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/service/ParcelShippingService.java index 05f261612e..70c0970e8b 100644 --- a/ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/service/ParcelShippingService.java +++ b/ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/service/ParcelShippingService.java @@ -1,11 +1,11 @@ -package com.baeldung.dddmodules.shippingcontext.service; +package com.baeldung.dddcontexts.shippingcontext.service; -import com.baeldung.dddmodules.sharedkernel.events.ApplicationEvent; -import com.baeldung.dddmodules.sharedkernel.events.EventBus; -import com.baeldung.dddmodules.sharedkernel.events.EventSubscriber; -import com.baeldung.dddmodules.shippingcontext.model.Parcel; -import com.baeldung.dddmodules.shippingcontext.model.ShippableOrder; -import com.baeldung.dddmodules.shippingcontext.repository.ShippingOrderRepository; +import com.baeldung.dddcontexts.sharedkernel.events.ApplicationEvent; +import com.baeldung.dddcontexts.sharedkernel.events.EventBus; +import com.baeldung.dddcontexts.sharedkernel.events.EventSubscriber; +import com.baeldung.dddcontexts.shippingcontext.model.Parcel; +import com.baeldung.dddcontexts.shippingcontext.model.ShippableOrder; +import com.baeldung.dddcontexts.shippingcontext.repository.ShippingOrderRepository; import java.util.HashMap; import java.util.Map; diff --git a/ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/service/ShippingService.java b/ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/service/ShippingService.java similarity index 50% rename from ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/service/ShippingService.java rename to ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/service/ShippingService.java index a2f0095c43..b78a0f9fb2 100644 --- a/ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/service/ShippingService.java +++ b/ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/service/ShippingService.java @@ -1,8 +1,8 @@ -package com.baeldung.dddmodules.shippingcontext.service; +package com.baeldung.dddcontexts.shippingcontext.service; -import com.baeldung.dddmodules.sharedkernel.service.ApplicationService; -import com.baeldung.dddmodules.shippingcontext.model.Parcel; -import com.baeldung.dddmodules.shippingcontext.repository.ShippingOrderRepository; +import com.baeldung.dddcontexts.sharedkernel.service.ApplicationService; +import com.baeldung.dddcontexts.shippingcontext.model.Parcel; +import com.baeldung.dddcontexts.shippingcontext.repository.ShippingOrderRepository; import java.util.Optional; diff --git a/ddd-contexts/shippingcontext/src/main/java/module-info.java b/ddd-contexts/shippingcontext/src/main/java/module-info.java new file mode 100644 index 0000000000..c53cbedf8a --- /dev/null +++ b/ddd-contexts/shippingcontext/src/main/java/module-info.java @@ -0,0 +1,8 @@ +module com.baeldung.dddcontexts.shippingcontext { + requires com.baeldung.dddcontexts.sharedkernel; + exports com.baeldung.dddcontexts.shippingcontext.service; + exports com.baeldung.dddcontexts.shippingcontext.model; + exports com.baeldung.dddcontexts.shippingcontext.repository; + provides com.baeldung.dddcontexts.shippingcontext.service.ShippingService + with com.baeldung.dddcontexts.shippingcontext.service.ParcelShippingService; +} diff --git a/ddd-modules/mainapp/src/main/java/module-info.java b/ddd-modules/mainapp/src/main/java/module-info.java deleted file mode 100644 index 356b03731c..0000000000 --- a/ddd-modules/mainapp/src/main/java/module-info.java +++ /dev/null @@ -1,8 +0,0 @@ -module com.baeldung.dddmodules.mainapp { - uses com.baeldung.dddmodules.sharedkernel.events.EventBus; - uses com.baeldung.dddmodules.ordercontext.service.OrderService; - uses com.baeldung.dddmodules.ordercontext.repository.CustomerOrderRepository; - uses com.baeldung.dddmodules.shippingcontext.repository.ShippingOrderRepository; - uses com.baeldung.dddmodules.shippingcontext.service.ShippingService; - requires transitive com.baeldung.dddmodules.infrastructure; -} \ No newline at end of file diff --git a/ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules/ordercontext/repository/CustomerOrderRepository.java b/ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules/ordercontext/repository/CustomerOrderRepository.java deleted file mode 100644 index 771bbf3301..0000000000 --- a/ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules/ordercontext/repository/CustomerOrderRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.baeldung.dddmodules.ordercontext.repository; - -import com.baeldung.dddmodules.ordercontext.model.CustomerOrder; - -public interface CustomerOrderRepository { - void saveCustomerOrder(CustomerOrder order); -} diff --git a/ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules/ordercontext/service/OrderService.java b/ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules/ordercontext/service/OrderService.java deleted file mode 100644 index 1bbb8b8398..0000000000 --- a/ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules/ordercontext/service/OrderService.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.baeldung.dddmodules.ordercontext.service; - -import com.baeldung.dddmodules.ordercontext.model.CustomerOrder; -import com.baeldung.dddmodules.ordercontext.repository.CustomerOrderRepository; -import com.baeldung.dddmodules.sharedkernel.service.ApplicationService; - -public interface OrderService extends ApplicationService { - void placeOrder(CustomerOrder order); - - void setOrderRepository(CustomerOrderRepository orderRepository); -} diff --git a/ddd-modules/ordercontext/src/main/java/module-info.java b/ddd-modules/ordercontext/src/main/java/module-info.java deleted file mode 100644 index e9b7cf9535..0000000000 --- a/ddd-modules/ordercontext/src/main/java/module-info.java +++ /dev/null @@ -1,8 +0,0 @@ -module com.baeldung.dddmodules.ordercontext { - requires com.baeldung.dddmodules.sharedkernel; - exports com.baeldung.dddmodules.ordercontext.service; - exports com.baeldung.dddmodules.ordercontext.model; - exports com.baeldung.dddmodules.ordercontext.repository; - provides com.baeldung.dddmodules.ordercontext.service.OrderService - with com.baeldung.dddmodules.ordercontext.service.CustomerOrderService; -} \ No newline at end of file diff --git a/ddd-modules/sharedkernel/src/main/java/module-info.java b/ddd-modules/sharedkernel/src/main/java/module-info.java deleted file mode 100644 index aeb64f52c9..0000000000 --- a/ddd-modules/sharedkernel/src/main/java/module-info.java +++ /dev/null @@ -1,4 +0,0 @@ -module com.baeldung.dddmodules.sharedkernel { - exports com.baeldung.dddmodules.sharedkernel.events; - exports com.baeldung.dddmodules.sharedkernel.service; -} diff --git a/ddd-modules/shippingcontext/src/main/java/module-info.java b/ddd-modules/shippingcontext/src/main/java/module-info.java deleted file mode 100644 index a5ec1ca435..0000000000 --- a/ddd-modules/shippingcontext/src/main/java/module-info.java +++ /dev/null @@ -1,8 +0,0 @@ -module com.baeldung.dddmodules.shippingcontext { - requires com.baeldung.dddmodules.sharedkernel; - exports com.baeldung.dddmodules.shippingcontext.service; - exports com.baeldung.dddmodules.shippingcontext.model; - exports com.baeldung.dddmodules.shippingcontext.repository; - provides com.baeldung.dddmodules.shippingcontext.service.ShippingService - with com.baeldung.dddmodules.shippingcontext.service.ParcelShippingService; -} From b01bfd8c5cfb197a25e11431cd53852ce6c2d0d2 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Tue, 24 May 2022 10:39:18 +0200 Subject: [PATCH 269/278] JAVA-12100: Delete left ddd-modules file --- .../infrastructure/src/main/java/module-info.java | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 ddd-modules/infrastructure/src/main/java/module-info.java diff --git a/ddd-modules/infrastructure/src/main/java/module-info.java b/ddd-modules/infrastructure/src/main/java/module-info.java deleted file mode 100644 index 19f7b36548..0000000000 --- a/ddd-modules/infrastructure/src/main/java/module-info.java +++ /dev/null @@ -1,11 +0,0 @@ -module com.baeldung.dddmodules.infrastructure { - requires transitive com.baeldung.dddmodules.sharedkernel; - requires transitive com.baeldung.dddmodules.ordercontext; - requires transitive com.baeldung.dddmodules.shippingcontext; - provides com.baeldung.dddmodules.sharedkernel.events.EventBus - with com.baeldung.dddmodules.infrastructure.events.SimpleEventBus; - provides com.baeldung.dddmodules.ordercontext.repository.CustomerOrderRepository - with com.baeldung.dddmodules.infrastructure.db.InMemoryOrderStore; - provides com.baeldung.dddmodules.shippingcontext.repository.ShippingOrderRepository - with com.baeldung.dddmodules.infrastructure.db.InMemoryOrderStore; -} From 4f615e380a801afabd31619fa49b30d26b3d8b90 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Tue, 24 May 2022 11:09:48 +0200 Subject: [PATCH 270/278] JAVA-12100: Update main pom.xml --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 5919a930f0..7cd2bbe3d1 100644 --- a/pom.xml +++ b/pom.xml @@ -1300,7 +1300,7 @@ core-java-modules/multimodulemavenproject core-java-modules/core-java-strings core-java-modules/core-java-httpclient - ddd-modules + ddd-contexts docker apache-httpclient-2 libraries-concurrency @@ -1368,7 +1368,7 @@ core-java-modules/core-java-networking-3 core-java-modules/multimodulemavenproject core-java-modules/core-java-strings - ddd-modules + ddd-contexts docker apache-httpclient-2 libraries-concurrency From d24c84be8e02351ad3adf42ca1911eb0b80752c8 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Tue, 24 May 2022 22:11:03 +0530 Subject: [PATCH 271/278] JAVA-9808 Fix integration test in spring-state-machine --- spring-state-machine/pom.xml | 2 +- .../SimpleStateMachineConfiguration.java | 2 +- .../StateMachineIntegrationTest.java | 27 +++++++++++-------- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/spring-state-machine/pom.xml b/spring-state-machine/pom.xml index 741361b3fa..0e930d6ff1 100644 --- a/spring-state-machine/pom.xml +++ b/spring-state-machine/pom.xml @@ -39,7 +39,7 @@ 3.2.0 5.3.19 - 4.3.7.RELEASE + 5.3.19 1.7.0 diff --git a/spring-state-machine/src/main/java/com/baeldung/spring/statemachine/config/SimpleStateMachineConfiguration.java b/spring-state-machine/src/main/java/com/baeldung/spring/statemachine/config/SimpleStateMachineConfiguration.java index 0c392c2c35..bdb488c354 100644 --- a/spring-state-machine/src/main/java/com/baeldung/spring/statemachine/config/SimpleStateMachineConfiguration.java +++ b/spring-state-machine/src/main/java/com/baeldung/spring/statemachine/config/SimpleStateMachineConfiguration.java @@ -38,7 +38,7 @@ public class SimpleStateMachineConfiguration extends StateMachineConfigurerAdapt .stateEntry("S3", entryAction()) .stateExit("S3", exitAction()) .state("S4", executeAction(), errorAction()) - .stateDo("S5", executeAction()); + .stateDo("S5", executeAction(), errorAction()); } diff --git a/spring-state-machine/src/test/java/com/baeldung/spring/statemachine/StateMachineIntegrationTest.java b/spring-state-machine/src/test/java/com/baeldung/spring/statemachine/StateMachineIntegrationTest.java index 5909340a82..ac2d6a22c2 100644 --- a/spring-state-machine/src/test/java/com/baeldung/spring/statemachine/StateMachineIntegrationTest.java +++ b/spring-state-machine/src/test/java/com/baeldung/spring/statemachine/StateMachineIntegrationTest.java @@ -1,32 +1,37 @@ package com.baeldung.spring.statemachine; -import com.baeldung.spring.statemachine.config.SimpleStateMachineConfiguration; -import org.junit.After; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.statemachine.StateMachine; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import com.baeldung.spring.statemachine.config.SimpleStateMachineConfiguration; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -@RunWith(SpringJUnit4ClassRunner.class) +@ExtendWith(SpringExtension.class) @ContextConfiguration(classes = SimpleStateMachineConfiguration.class) +@TestMethodOrder(OrderAnnotation.class) public class StateMachineIntegrationTest { @Autowired private StateMachine stateMachine; - @Before + @BeforeEach public void setUp() { stateMachine.start(); } @Test + @Order(1) public void whenSimpleStringStateMachineEvents_thenEndState() { assertEquals("SI", stateMachine.getState().getId()); @@ -37,8 +42,8 @@ public class StateMachineIntegrationTest { assertEquals("S2", stateMachine.getState().getId()); } - @Ignore("Fixing in JAVA-9808") @Test + @Order(2) public void whenSimpleStringMachineActionState_thenActionExecuted() { stateMachine.sendEvent("E3"); @@ -58,7 +63,7 @@ public class StateMachineIntegrationTest { assertEquals(2, stateMachine.getExtendedState().getVariables().get("approvalCount")); } - @After + @AfterEach public void tearDown() { stateMachine.stop(); } From 4977a58de10522c509d479f21bc10cca4ab97924 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Wed, 25 May 2022 20:16:11 +0530 Subject: [PATCH 272/278] JAVA-9808 Fix integration test in spring-state-machine --- .../statemachine/config/SimpleStateMachineConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-state-machine/src/main/java/com/baeldung/spring/statemachine/config/SimpleStateMachineConfiguration.java b/spring-state-machine/src/main/java/com/baeldung/spring/statemachine/config/SimpleStateMachineConfiguration.java index bdb488c354..8c95e9d843 100644 --- a/spring-state-machine/src/main/java/com/baeldung/spring/statemachine/config/SimpleStateMachineConfiguration.java +++ b/spring-state-machine/src/main/java/com/baeldung/spring/statemachine/config/SimpleStateMachineConfiguration.java @@ -38,7 +38,7 @@ public class SimpleStateMachineConfiguration extends StateMachineConfigurerAdapt .stateEntry("S3", entryAction()) .stateExit("S3", exitAction()) .state("S4", executeAction(), errorAction()) - .stateDo("S5", executeAction(), errorAction()); + .state("S5", executeAction(), errorAction()); } From 4188ab68b37cca0768ea17dc765c00112af88e7e Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Wed, 25 May 2022 17:48:48 +0100 Subject: [PATCH 273/278] [JAVA-8153] Code clean up for reactive error handling --- .../ErrorHandlingApplication.java | 19 +- .../errorhandling/GlobalErrorAttributes.java | 36 +-- .../reactive/errorhandling/Handler.java | 67 +++++ .../reactive/errorhandling/Router.java | 26 ++ .../errorhandling/handlers/Handler1.java | 28 --- .../errorhandling/handlers/Handler2.java | 37 --- .../errorhandling/handlers/Handler3.java | 33 --- .../errorhandling/handlers/Handler4.java | 29 --- .../errorhandling/handlers/Handler5.java | 21 -- .../errorhandling/routers/Router1.java | 21 -- .../errorhandling/routers/Router2.java | 21 -- .../errorhandling/routers/Router3.java | 21 -- .../errorhandling/routers/Router4.java | 21 -- .../errorhandling/routers/Router5.java | 21 -- .../ErrorHandlingIntegrationTest.java | 235 +++++++----------- 15 files changed, 195 insertions(+), 441 deletions(-) create mode 100644 spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/Handler.java create mode 100644 spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/Router.java delete mode 100644 spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/handlers/Handler1.java delete mode 100644 spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/handlers/Handler2.java delete mode 100644 spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/handlers/Handler3.java delete mode 100644 spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/handlers/Handler4.java delete mode 100644 spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/handlers/Handler5.java delete mode 100644 spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/routers/Router1.java delete mode 100644 spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/routers/Router2.java delete mode 100644 spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/routers/Router3.java delete mode 100644 spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/routers/Router4.java delete mode 100644 spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/routers/Router5.java diff --git a/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/ErrorHandlingApplication.java b/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/ErrorHandlingApplication.java index c40db74003..50579d8721 100644 --- a/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/ErrorHandlingApplication.java +++ b/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/ErrorHandlingApplication.java @@ -3,23 +3,16 @@ package com.baeldung.reactive.errorhandling; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.security.config.web.server.ServerHttpSecurity; -import org.springframework.security.web.server.SecurityWebFilterChain; +import org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration; +import org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration; -@SpringBootApplication(exclude = MongoReactiveAutoConfiguration.class) +@SpringBootApplication(exclude = { + MongoReactiveAutoConfiguration.class, + ReactiveSecurityAutoConfiguration.class, + ReactiveUserDetailsServiceAutoConfiguration.class }) public class ErrorHandlingApplication { public static void main(String[] args) { SpringApplication.run(ErrorHandlingApplication.class, args); } - - @Bean - public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) { - http.authorizeExchange() - .anyExchange() - .permitAll(); - http.csrf().disable(); - return http.build(); - } } diff --git a/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/GlobalErrorAttributes.java b/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/GlobalErrorAttributes.java index 0a96a8593c..3458a175e4 100644 --- a/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/GlobalErrorAttributes.java +++ b/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/GlobalErrorAttributes.java @@ -9,44 +9,14 @@ import org.springframework.web.reactive.function.server.ServerRequest; import java.util.Map; @Component -public class GlobalErrorAttributes extends DefaultErrorAttributes{ - - private HttpStatus status = HttpStatus.BAD_REQUEST; - private String message = "please provide a name"; +public class GlobalErrorAttributes extends DefaultErrorAttributes { @Override public Map getErrorAttributes(ServerRequest request, ErrorAttributeOptions options) { Map map = super.getErrorAttributes(request, options); - map.put("status", getStatus()); - map.put("message", getMessage()); + map.put("status", HttpStatus.BAD_REQUEST); + map.put("message", "please provide a name"); return map; } - /** - * @return the status - */ - public HttpStatus getStatus() { - return status; - } - - /** - * @param status the status to set - */ - public void setStatus(HttpStatus status) { - this.status = status; - } - - /** - * @return the message - */ - public String getMessage() { - return message; - } - - /** - * @param message the message to set - */ - public void setMessage(String message) { - this.message = message; - } } diff --git a/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/Handler.java b/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/Handler.java new file mode 100644 index 0000000000..d49d9b4be2 --- /dev/null +++ b/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/Handler.java @@ -0,0 +1,67 @@ +package com.baeldung.reactive.errorhandling; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +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 Handler { + + public Mono handleWithErrorReturn(ServerRequest request) { + return sayHello(request) + .onErrorReturn("Hello, Stranger") + .flatMap(s -> ServerResponse.ok() + .contentType(MediaType.TEXT_PLAIN) + .bodyValue(s)); + } + + public Mono handleWithErrorResumeAndDynamicFallback(ServerRequest request) { + return sayHello(request) + .flatMap(s -> ServerResponse.ok() + .contentType(MediaType.TEXT_PLAIN) + .bodyValue(s)) + .onErrorResume(e -> (Mono.just("Hi, I looked around for your name but found: " + e.getMessage())) + .flatMap(s -> ServerResponse.ok() + .contentType(MediaType.TEXT_PLAIN) + .bodyValue(s))); + } + + public Mono handleWithErrorResumeAndFallbackMethod(ServerRequest request) { + return sayHello(request) + .flatMap(s -> ServerResponse.ok() + .contentType(MediaType.TEXT_PLAIN) + .bodyValue(s)) + .onErrorResume(e -> sayHelloFallback() + .flatMap(s -> ServerResponse.ok() + .contentType(MediaType.TEXT_PLAIN) + .bodyValue(s))); + } + + public Mono handleWithErrorResumeAndCustomException(ServerRequest request) { + return ServerResponse.ok() + .body(sayHello(request) + .onErrorResume(e -> Mono.error(new NameRequiredException( + HttpStatus.BAD_REQUEST, + "please provide a name", e))), String.class); + } + + public Mono handleWithGlobalErrorHandler(ServerRequest request) { + return ServerResponse.ok() + .body(sayHello(request), String.class); + } + + private Mono sayHello(ServerRequest request) { + try { + return Mono.just("Hello, " + request.queryParam("name").get()); + } catch (Exception e) { + return Mono.error(e); + } + } + + private Mono sayHelloFallback() { + return Mono.just("Hello, Stranger"); + } +} diff --git a/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/Router.java b/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/Router.java new file mode 100644 index 0000000000..5f130ec035 --- /dev/null +++ b/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/Router.java @@ -0,0 +1,26 @@ +package com.baeldung.reactive.errorhandling; + +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +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 static org.springframework.http.MediaType.TEXT_PLAIN; +import static org.springframework.web.reactive.function.server.RequestPredicates.GET; +import static org.springframework.web.reactive.function.server.RequestPredicates.accept; + +@Component +public class Router { + + @Bean + public RouterFunction routes(Handler handler) { + return RouterFunctions + .route(GET("/api/endpoint1").and(accept(TEXT_PLAIN)), handler::handleWithErrorReturn) + .andRoute(GET("/api/endpoint2").and(accept(TEXT_PLAIN)), handler::handleWithErrorResumeAndFallbackMethod) + .andRoute(GET("/api/endpoint3").and(accept(TEXT_PLAIN)), handler::handleWithErrorResumeAndDynamicFallback) + .andRoute(GET("/api/endpoint4").and(accept(TEXT_PLAIN)), handler::handleWithErrorResumeAndCustomException) + .andRoute(GET("/api/endpoint5").and(accept(TEXT_PLAIN)), handler::handleWithGlobalErrorHandler); + } + +} diff --git a/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/handlers/Handler1.java b/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/handlers/Handler1.java deleted file mode 100644 index 32f2f1c3a2..0000000000 --- a/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/handlers/Handler1.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.baeldung.reactive.errorhandling.handlers; - -import org.springframework.http.MediaType; -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 Handler1 { - - public Mono handleRequest1(ServerRequest request) { - return sayHello(request).onErrorReturn("Hello, Stranger") - .flatMap(s -> ServerResponse.ok() - .contentType(MediaType.TEXT_PLAIN) - .bodyValue(s)); - } - - private Mono sayHello(ServerRequest request) { - try { - return Mono.just("Hello, " + request.queryParam("name") - .get()); - } catch (Exception e) { - return Mono.error(e); - } - } - -} diff --git a/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/handlers/Handler2.java b/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/handlers/Handler2.java deleted file mode 100644 index 093120c92b..0000000000 --- a/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/handlers/Handler2.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.baeldung.reactive.errorhandling.handlers; - -import org.springframework.http.MediaType; -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 Handler2 { - -public Mono handleRequest2(ServerRequest request) { - return - sayHello(request) - .flatMap(s -> ServerResponse.ok() - .contentType(MediaType.TEXT_PLAIN) - .bodyValue(s)) - .onErrorResume(e -> sayHelloFallback() - .flatMap(s -> ServerResponse.ok() - .contentType(MediaType.TEXT_PLAIN) - .bodyValue(s))); -} - - private Mono sayHello(ServerRequest request) { - try { - return Mono.just("Hello, " + request.queryParam("name") - .get()); - } catch (Exception e) { - return Mono.error(e); - } - } - - private Mono sayHelloFallback() { - return Mono.just("Hello, Stranger"); - } - -} diff --git a/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/handlers/Handler3.java b/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/handlers/Handler3.java deleted file mode 100644 index 44842e0539..0000000000 --- a/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/handlers/Handler3.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.baeldung.reactive.errorhandling.handlers; - -import org.springframework.http.MediaType; -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 Handler3 { - - public Mono handleRequest3(ServerRequest request) { - return - sayHello(request) - .flatMap(s -> ServerResponse.ok() - .contentType(MediaType.TEXT_PLAIN) - .bodyValue(s)) - .onErrorResume(e -> (Mono.just("Hi, I looked around for your name but found: " + - e.getMessage())).flatMap(s -> ServerResponse.ok() - .contentType(MediaType.TEXT_PLAIN) - .bodyValue(s))); - } - - private Mono sayHello(ServerRequest request) { - try { - return Mono.just("Hello, " + request.queryParam("name") - .get()); - } catch (Exception e) { - return Mono.error(e); - } - } - -} diff --git a/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/handlers/Handler4.java b/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/handlers/Handler4.java deleted file mode 100644 index 2d391a42a7..0000000000 --- a/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/handlers/Handler4.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.baeldung.reactive.errorhandling.handlers; - -import com.baeldung.reactive.errorhandling.NameRequiredException; -import org.springframework.http.HttpStatus; -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 Handler4 { - -public Mono handleRequest4(ServerRequest request) { - return ServerResponse.ok() - .body(sayHello(request) - .onErrorResume(e -> - Mono.error(new NameRequiredException( - HttpStatus.BAD_REQUEST, "please provide a name", e))), String.class); -} - - private Mono sayHello(ServerRequest request) { - try { - return Mono.just("Hello, " + request.queryParam("name").get()); - } catch (Exception e) { - return Mono.error(e); - } - } - -} diff --git a/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/handlers/Handler5.java b/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/handlers/Handler5.java deleted file mode 100644 index a466982865..0000000000 --- a/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/handlers/Handler5.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.reactive.errorhandling.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 Handler5 { - - public Mono handleRequest5(ServerRequest request) { - return ServerResponse.ok() - .body(sayHello(request), String.class); - - } - - private Mono sayHello(ServerRequest request) { - return Mono.just("Hello, " + request.queryParam("name").get()); - } - -} diff --git a/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/routers/Router1.java b/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/routers/Router1.java deleted file mode 100644 index caf779b456..0000000000 --- a/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/routers/Router1.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.reactive.errorhandling.routers; - -import com.baeldung.reactive.errorhandling.handlers.Handler1; -import org.springframework.context.annotation.Bean; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Component; -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; - -@Component -public class Router1 { - - @Bean - public RouterFunction routeRequest1(Handler1 handler) { - return RouterFunctions.route(RequestPredicates.GET("/api/endpoint1") - .and(RequestPredicates.accept(MediaType.TEXT_PLAIN)), handler::handleRequest1); - } - -} diff --git a/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/routers/Router2.java b/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/routers/Router2.java deleted file mode 100644 index b965257c30..0000000000 --- a/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/routers/Router2.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.reactive.errorhandling.routers; - -import com.baeldung.reactive.errorhandling.handlers.Handler2; -import org.springframework.context.annotation.Bean; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Component; -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; - -@Component -public class Router2 { - - @Bean - public RouterFunction routeRequest2(Handler2 handler) { - return RouterFunctions.route(RequestPredicates.GET("/api/endpoint2") - .and(RequestPredicates.accept(MediaType.TEXT_PLAIN)), handler::handleRequest2); - } - -} diff --git a/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/routers/Router3.java b/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/routers/Router3.java deleted file mode 100644 index b8f7f983cc..0000000000 --- a/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/routers/Router3.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.reactive.errorhandling.routers; - -import com.baeldung.reactive.errorhandling.handlers.Handler3; -import org.springframework.context.annotation.Bean; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Component; -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; - -@Component -public class Router3 { - - @Bean - public RouterFunction routeRequest3(Handler3 handler) { - return RouterFunctions.route(RequestPredicates.GET("/api/endpoint3") - .and(RequestPredicates.accept(MediaType.TEXT_PLAIN)), handler::handleRequest3); - } - -} diff --git a/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/routers/Router4.java b/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/routers/Router4.java deleted file mode 100644 index 03c65fec67..0000000000 --- a/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/routers/Router4.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.reactive.errorhandling.routers; - -import com.baeldung.reactive.errorhandling.handlers.Handler4; -import org.springframework.context.annotation.Bean; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Component; -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; - -@Component -public class Router4 { - - @Bean - public RouterFunction routeRequest4(Handler4 handler) { - return RouterFunctions.route(RequestPredicates.GET("/api/endpoint4") - .and(RequestPredicates.accept(MediaType.TEXT_PLAIN)), handler::handleRequest4); - } - -} diff --git a/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/routers/Router5.java b/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/routers/Router5.java deleted file mode 100644 index c68e04659f..0000000000 --- a/spring-reactive/src/main/java/com/baeldung/reactive/errorhandling/routers/Router5.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.reactive.errorhandling.routers; - -import com.baeldung.reactive.errorhandling.handlers.Handler5; -import org.springframework.context.annotation.Bean; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Component; -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; - -@Component -public class Router5 { - - @Bean - public RouterFunction routeRequest5(Handler5 handler) { - return RouterFunctions.route(RequestPredicates.GET("/api/endpoint5") - .and(RequestPredicates.accept(MediaType.TEXT_PLAIN)), handler::handleRequest5); - } - -} diff --git a/spring-reactive/src/test/java/com/baeldung/reactive/errorhandling/ErrorHandlingIntegrationTest.java b/spring-reactive/src/test/java/com/baeldung/reactive/errorhandling/ErrorHandlingIntegrationTest.java index 1167792542..bbcab179eb 100644 --- a/spring-reactive/src/test/java/com/baeldung/reactive/errorhandling/ErrorHandlingIntegrationTest.java +++ b/spring-reactive/src/test/java/com/baeldung/reactive/errorhandling/ErrorHandlingIntegrationTest.java @@ -7,19 +7,13 @@ import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWeb import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.http.MediaType; -import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.reactive.server.WebTestClient; -import java.io.IOException; - -import static org.junit.Assert.assertEquals; - @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) @DirtiesContext -@WithMockUser @AutoConfigureWebTestClient(timeout = "10000") public class ErrorHandlingIntegrationTest { @@ -27,150 +21,107 @@ public class ErrorHandlingIntegrationTest { private WebTestClient webTestClient; @Test - public void givenErrorReturn_whenUsernamePresent_thenOk() throws IOException { - - String s = webTestClient.get() - .uri("/api/endpoint1?name={username}", "Tony") - .accept(MediaType.TEXT_PLAIN) - .exchange() - .returnResult(String.class) - .getResponseBody() - .blockFirst(); - - assertEquals("Hello, Tony", s); - - } - - @Test - public void givenErrorReturn_whenNoUsername_thenOk() throws IOException { - - String s = webTestClient.get() - .uri("/api/endpoint1") - .accept(MediaType.TEXT_PLAIN) - .exchange() - .returnResult(String.class) - .getResponseBody() - .blockFirst(); - - assertEquals("Hello, Stranger", s); - } - - @Test - public void givenResumeFallback_whenUsernamePresent_thenOk() throws IOException { - - String s = webTestClient.get() - .uri("/api/endpoint2?name={username}", "Tony") - .accept(MediaType.TEXT_PLAIN) - .exchange() - .returnResult(String.class) - .getResponseBody() - .blockFirst(); - - assertEquals("Hello, Tony", s); - } - - @Test - public void givenResumeFallback_whenNoUsername_thenOk() throws IOException { - String s = webTestClient.get() - .uri("/api/endpoint2") - .accept(MediaType.TEXT_PLAIN) - .exchange() - .returnResult(String.class) - .getResponseBody() - .blockFirst(); - - assertEquals("Hello, Stranger", s); - - } - - @Test - public void givenResumeDynamicValue_whenUsernamePresent_thenOk() throws IOException { - - String s = webTestClient.get() - .uri("/api/endpoint3?name={username}", "Tony") - .accept(MediaType.TEXT_PLAIN) - .exchange() - .returnResult(String.class) - .getResponseBody() - .blockFirst(); - - assertEquals("Hello, Tony", s); - } - - @Test - public void givenResumeDynamicValue_whenNoUsername_thenOk() throws IOException { - String s = webTestClient.get() - .uri("/api/endpoint3") - .accept(MediaType.TEXT_PLAIN) - .exchange() - .returnResult(String.class) - .getResponseBody() - .blockFirst(); - - assertEquals("Hi, I looked around for your name but found: No value present", s); - } - - @Test - public void givenResumeRethrow_whenUsernamePresent_thenOk() throws IOException { - String s = webTestClient.get() - .uri("/api/endpoint4?name={username}", "Tony") - .accept(MediaType.TEXT_PLAIN) - .exchange() - .returnResult(String.class) - .getResponseBody() - .blockFirst(); - - assertEquals("Hello, Tony", s); - } - - @Test - public void givenResumeRethrow_whenNoUsername_thenOk() throws IOException { + public void givenErrorReturn_whenUsernamePresent_thenOk() { webTestClient.get() - .uri("/api/endpoint4") - .accept(MediaType.TEXT_PLAIN) - .exchange() - .expectStatus() - .isBadRequest() - .expectHeader() - .contentType(MediaType.APPLICATION_JSON) - .expectBody() - .jsonPath("$.message") - .isNotEmpty() - .jsonPath("$.message") - .isEqualTo("please provide a name"); + .uri("/api/endpoint1?name={username}", "Tony") + .accept(MediaType.TEXT_PLAIN) + .exchange() + .expectBody(String.class).isEqualTo("Hello, Tony"); } @Test - public void givenGlobalErrorHandling_whenUsernamePresent_thenOk() throws IOException { + public void givenErrorReturn_whenNoUsername_thenOk() { - String s = webTestClient.get() - .uri("/api/endpoint5?name={username}", "Tony") - .accept(MediaType.TEXT_PLAIN) - .exchange() - .returnResult(String.class) - .getResponseBody() - .blockFirst(); - - assertEquals("Hello, Tony", s); - } - - @Test - public void givenGlobalErrorHandling_whenNoUsername_thenOk() throws IOException { webTestClient.get() - .uri("/api/endpoint5") - .accept(MediaType.TEXT_PLAIN) - .exchange() - .expectStatus() - .isBadRequest() - .expectHeader() - .contentType(MediaType.APPLICATION_JSON) - .expectBody() - .jsonPath("$.message") - .isNotEmpty() - .jsonPath("$.message") - .isEqualTo("please provide a name"); + .uri("/api/endpoint1") + .accept(MediaType.TEXT_PLAIN) + .exchange() + .expectBody(String.class).isEqualTo("Hello, Stranger"); + } + @Test + public void givenResumeFallback_whenUsernamePresent_thenOk() { + + webTestClient.get() + .uri("/api/endpoint2?name={username}", "Tony") + .accept(MediaType.TEXT_PLAIN) + .exchange() + .expectBody(String.class).isEqualTo("Hello, Tony"); + } + + @Test + public void givenResumeFallback_whenNoUsername_thenOk() { + + webTestClient.get() + .uri("/api/endpoint2") + .accept(MediaType.TEXT_PLAIN) + .exchange() + .expectBody(String.class).isEqualTo("Hello, Stranger"); + } + + @Test + public void givenResumeDynamicValue_whenUsernamePresent_thenOk() { + + webTestClient.get() + .uri("/api/endpoint3?name={username}", "Tony") + .accept(MediaType.TEXT_PLAIN) + .exchange() + .expectBody(String.class).isEqualTo("Hello, Tony"); + } + + @Test + public void givenResumeDynamicValue_whenNoUsername_thenOk() { + + webTestClient.get() + .uri("/api/endpoint3") + .accept(MediaType.TEXT_PLAIN) + .exchange() + .expectBody(String.class).isEqualTo("Hi, I looked around for your name but found: No value present"); + } + + @Test + public void givenResumeRethrow_whenUsernamePresent_thenOk() { + + webTestClient.get() + .uri("/api/endpoint4?name={username}", "Tony") + .accept(MediaType.TEXT_PLAIN) + .exchange() + .expectBody(String.class).isEqualTo("Hello, Tony"); + } + + @Test + public void givenResumeRethrow_whenNoUsername_thenOk() { + + webTestClient.get() + .uri("/api/endpoint4") + .accept(MediaType.TEXT_PLAIN) + .exchange() + .expectStatus().isBadRequest() + .expectHeader().contentType(MediaType.APPLICATION_JSON) + .expectBody().jsonPath("$.message").isEqualTo("please provide a name"); + } + + @Test + public void givenGlobalErrorHandling_whenUsernamePresent_thenOk() { + + webTestClient.get() + .uri("/api/endpoint5?name={username}", "Tony") + .accept(MediaType.TEXT_PLAIN) + .exchange() + .expectBody(String.class).isEqualTo("Hello, Tony"); + } + + @Test + public void givenGlobalErrorHandling_whenNoUsername_thenOk() { + + webTestClient.get() + .uri("/api/endpoint5") + .accept(MediaType.TEXT_PLAIN) + .exchange() + .expectStatus().isBadRequest() + .expectHeader().contentType(MediaType.APPLICATION_JSON) + .expectBody().jsonPath("$.message").isEqualTo("please provide a name"); } } From 863356b4bcfb5273ab9140c68fa19c2682f2a200 Mon Sep 17 00:00:00 2001 From: keerthigadde Date: Thu, 26 May 2022 15:38:47 +1000 Subject: [PATCH 274/278] JAVA-9556 added try-with-resources for resultset --- .../jdbcmetadata/MetadataExtractor.java | 96 ++++++++++--------- 1 file changed, 49 insertions(+), 47 deletions(-) diff --git a/persistence-modules/core-java-persistence/src/main/java/com/baeldung/jdbcmetadata/MetadataExtractor.java b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/jdbcmetadata/MetadataExtractor.java index 27c615aebc..e9618836e9 100644 --- a/persistence-modules/core-java-persistence/src/main/java/com/baeldung/jdbcmetadata/MetadataExtractor.java +++ b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/jdbcmetadata/MetadataExtractor.java @@ -14,65 +14,66 @@ public class MetadataExtractor { } public void extractTableInfo() throws SQLException { - ResultSet resultSet = databaseMetaData.getTables(null, null, "CUST%", new String[] { "TABLE" }); - while (resultSet.next()) { - // Print the names of existing tables - System.out.println(resultSet.getString("TABLE_NAME")); - System.out.println(resultSet.getString("REMARKS")); + try (ResultSet resultSet = databaseMetaData.getTables(null, null, "CUST%", new String[] { "TABLE" })) { + while (resultSet.next()) { + // Print the names of existing tables + System.out.println(resultSet.getString("TABLE_NAME")); + System.out.println(resultSet.getString("REMARKS")); + } } } public void extractSystemTables() throws SQLException { - ResultSet resultSet = databaseMetaData.getTables(null, null, null, new String[] { "SYSTEM TABLE" }); - while (resultSet.next()) { - // Print the names of system tables - System.out.println(resultSet.getString("TABLE_NAME")); + try (ResultSet resultSet = databaseMetaData.getTables(null, null, null, new String[] { "SYSTEM TABLE" })) { + while (resultSet.next()) { + // Print the names of system tables + System.out.println(resultSet.getString("TABLE_NAME")); + } } } public void extractViews() throws SQLException { - ResultSet resultSet = databaseMetaData.getTables(null, null, null, new String[] { "VIEW" }); - while (resultSet.next()) { - // Print the names of existing views - System.out.println(resultSet.getString("TABLE_NAME")); - } + try(ResultSet resultSet = databaseMetaData.getTables(null, null, null, new String[] { "VIEW" })) { + while (resultSet.next()) { + // Print the names of existing views + System.out.println(resultSet.getString("TABLE_NAME")); + } + } } public void extractColumnInfo(String tableName) throws SQLException { - ResultSet columns = databaseMetaData.getColumns(null, null, tableName, null); - - while (columns.next()) { - String columnName = columns.getString("COLUMN_NAME"); - String columnSize = columns.getString("COLUMN_SIZE"); - String datatype = columns.getString("DATA_TYPE"); - String isNullable = columns.getString("IS_NULLABLE"); - String isAutoIncrement = columns.getString("IS_AUTOINCREMENT"); - System.out.println(String.format("ColumnName: %s, columnSize: %s, datatype: %s, isColumnNullable: %s, isAutoIncrementEnabled: %s", columnName, columnSize, datatype, isNullable, isAutoIncrement)); - } + try(ResultSet columns = databaseMetaData.getColumns(null, null, tableName, null)) { + while (columns.next()) { + String columnName = columns.getString("COLUMN_NAME"); + String columnSize = columns.getString("COLUMN_SIZE"); + String datatype = columns.getString("DATA_TYPE"); + String isNullable = columns.getString("IS_NULLABLE"); + String isAutoIncrement = columns.getString("IS_AUTOINCREMENT"); + System.out.println(String.format("ColumnName: %s, columnSize: %s, datatype: %s, isColumnNullable: %s, isAutoIncrementEnabled: %s", columnName, columnSize, datatype, isNullable, isAutoIncrement)); + } + } } public void extractPrimaryKeys(String tableName) throws SQLException { - ResultSet primaryKeys = databaseMetaData.getPrimaryKeys(null, null, tableName); - while (primaryKeys.next()) { - String primaryKeyColumnName = primaryKeys.getString("COLUMN_NAME"); - String primaryKeyName = primaryKeys.getString("PK_NAME"); - System.out.println(String.format("columnName:%s, pkName:%s", primaryKeyColumnName, primaryKeyName)); - } - } - - public void fun() throws SQLException { - + try(ResultSet primaryKeys = databaseMetaData.getPrimaryKeys(null, null, tableName)) { + while (primaryKeys.next()) { + String primaryKeyColumnName = primaryKeys.getString("COLUMN_NAME"); + String primaryKeyName = primaryKeys.getString("PK_NAME"); + System.out.println(String.format("columnName:%s, pkName:%s", primaryKeyColumnName, primaryKeyName)); + } + } } public void extractForeignKeys(String tableName) throws SQLException { - ResultSet foreignKeys = databaseMetaData.getImportedKeys(null, null, tableName); - while (foreignKeys.next()) { - String pkTableName = foreignKeys.getString("PKTABLE_NAME"); - String fkTableName = foreignKeys.getString("FKTABLE_NAME"); - String pkColumnName = foreignKeys.getString("PKCOLUMN_NAME"); - String fkColumnName = foreignKeys.getString("FKCOLUMN_NAME"); - System.out.println(String.format("pkTableName:%s, fkTableName:%s, pkColumnName:%s, fkColumnName:%s", pkTableName, fkTableName, pkColumnName, fkColumnName)); - } + try(ResultSet foreignKeys = databaseMetaData.getImportedKeys(null, null, tableName)) { + while (foreignKeys.next()) { + String pkTableName = foreignKeys.getString("PKTABLE_NAME"); + String fkTableName = foreignKeys.getString("FKTABLE_NAME"); + String pkColumnName = foreignKeys.getString("PKCOLUMN_NAME"); + String fkColumnName = foreignKeys.getString("FKCOLUMN_NAME"); + System.out.println(String.format("pkTableName:%s, fkTableName:%s, pkColumnName:%s, fkColumnName:%s", pkTableName, fkTableName, pkColumnName, fkColumnName)); + } + } } public void extractDatabaseInfo() throws SQLException { @@ -89,11 +90,12 @@ public class MetadataExtractor { public void extractUserName() throws SQLException { String userName = databaseMetaData.getUserName(); System.out.println(userName); - ResultSet schemas = databaseMetaData.getSchemas(); - while (schemas.next()) { - String table_schem = schemas.getString("TABLE_SCHEM"); - String table_catalog = schemas.getString("TABLE_CATALOG"); - System.out.println(String.format("Table_schema:%s, Table_catalog:%s", table_schem, table_catalog)); + try(ResultSet schemas = databaseMetaData.getSchemas()) { + while (schemas.next()) { + String table_schem = schemas.getString("TABLE_SCHEM"); + String table_catalog = schemas.getString("TABLE_CATALOG"); + System.out.println(String.format("Table_schema:%s, Table_catalog:%s", table_schem, table_catalog)); + } } } From 2a854383caf9f552420f2ab1ead72f23c17d4906 Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Thu, 26 May 2022 11:17:52 +0100 Subject: [PATCH 275/278] [JAVA-8154] Code clean up for reactive security --- .../reactive/security/GreetController.java | 37 ------------------ .../reactive/security/GreetingController.java | 37 ++++++++++++++++++ ...GreetService.java => GreetingService.java} | 2 +- .../reactive/security/SecurityConfig.java | 39 +++++++++---------- .../security/SecurityIntegrationTest.java | 19 ++++++--- 5 files changed, 70 insertions(+), 64 deletions(-) delete mode 100644 spring-reactive/src/main/java/com/baeldung/reactive/security/GreetController.java create mode 100644 spring-reactive/src/main/java/com/baeldung/reactive/security/GreetingController.java rename spring-reactive/src/main/java/com/baeldung/reactive/security/{GreetService.java => GreetingService.java} (91%) diff --git a/spring-reactive/src/main/java/com/baeldung/reactive/security/GreetController.java b/spring-reactive/src/main/java/com/baeldung/reactive/security/GreetController.java deleted file mode 100644 index 99b79d88ea..0000000000 --- a/spring-reactive/src/main/java/com/baeldung/reactive/security/GreetController.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.baeldung.reactive.security; - -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; -import reactor.core.publisher.Mono; - -import java.security.Principal; - -@RestController -public class GreetController { - - private GreetService greetService; - - public GreetController(GreetService greetService) { - this.greetService = greetService; - } - - @GetMapping("/") - public Mono greet(Mono principal) { - return principal - .map(Principal::getName) - .map(name -> String.format("Hello, %s", name)); - } - - @GetMapping("/admin") - public Mono greetAdmin(Mono principal) { - return principal - .map(Principal::getName) - .map(name -> String.format("Admin access: %s", name)); - } - - @GetMapping("/greetService") - public Mono greetService() { - return greetService.greet(); - } - -} diff --git a/spring-reactive/src/main/java/com/baeldung/reactive/security/GreetingController.java b/spring-reactive/src/main/java/com/baeldung/reactive/security/GreetingController.java new file mode 100644 index 0000000000..10d6cf4df7 --- /dev/null +++ b/spring-reactive/src/main/java/com/baeldung/reactive/security/GreetingController.java @@ -0,0 +1,37 @@ +package com.baeldung.reactive.security; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Mono; + +import java.security.Principal; + +@RestController +public class GreetingController { + + private final GreetingService greetingService; + + public GreetingController(GreetingService greetingService) { + this.greetingService = greetingService; + } + + @GetMapping("/") + public Mono greet(Mono principal) { + return principal + .map(Principal::getName) + .map(name -> String.format("Hello, %s", name)); + } + + @GetMapping("/admin") + public Mono greetAdmin(Mono principal) { + return principal + .map(Principal::getName) + .map(name -> String.format("Admin access: %s", name)); + } + + @GetMapping("/greetingService") + public Mono greetingService() { + return greetingService.greet(); + } + +} diff --git a/spring-reactive/src/main/java/com/baeldung/reactive/security/GreetService.java b/spring-reactive/src/main/java/com/baeldung/reactive/security/GreetingService.java similarity index 91% rename from spring-reactive/src/main/java/com/baeldung/reactive/security/GreetService.java rename to spring-reactive/src/main/java/com/baeldung/reactive/security/GreetingService.java index 93df64bced..b512f12bae 100644 --- a/spring-reactive/src/main/java/com/baeldung/reactive/security/GreetService.java +++ b/spring-reactive/src/main/java/com/baeldung/reactive/security/GreetingService.java @@ -5,7 +5,7 @@ import org.springframework.stereotype.Service; import reactor.core.publisher.Mono; @Service -public class GreetService { +public class GreetingService { @PreAuthorize("hasRole('ADMIN')") public Mono greet() { diff --git a/spring-reactive/src/main/java/com/baeldung/reactive/security/SecurityConfig.java b/spring-reactive/src/main/java/com/baeldung/reactive/security/SecurityConfig.java index bb2f2d50e1..67e54ad26a 100644 --- a/spring-reactive/src/main/java/com/baeldung/reactive/security/SecurityConfig.java +++ b/spring-reactive/src/main/java/com/baeldung/reactive/security/SecurityConfig.java @@ -16,40 +16,37 @@ import org.springframework.security.web.server.SecurityWebFilterChain; public class SecurityConfig { @Bean - public SecurityWebFilterChain securitygWebFilterChain(ServerHttpSecurity http) { + public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) { return http.authorizeExchange() - .pathMatchers("/admin") - .hasAuthority("ROLE_ADMIN") - .anyExchange() - .authenticated() - .and() - .formLogin() - .and() - .csrf() - .disable() - .build(); + .pathMatchers("/admin").hasAuthority("ROLE_ADMIN") + .anyExchange().authenticated() + .and() + .formLogin() + .and() + .csrf().disable() + .build(); } @Bean public MapReactiveUserDetailsService userDetailsService() { UserDetails user = User - .withUsername("user") - .password(passwordEncoder().encode("password")) - .roles("USER") - .build(); + .withUsername("user") + .password(passwordEncoder().encode("password")) + .roles("USER") + .build(); UserDetails admin = User - .withUsername("admin") - .password(passwordEncoder().encode("password")) - .roles("ADMIN") - .build(); + .withUsername("admin") + .password(passwordEncoder().encode("password")) + .roles("ADMIN") + .build(); return new MapReactiveUserDetailsService(user, admin); } - + @Bean public PasswordEncoder passwordEncoder() { - return new BCryptPasswordEncoder(); + return new BCryptPasswordEncoder(); } } diff --git a/spring-reactive/src/test/java/com/baeldung/reactive/security/SecurityIntegrationTest.java b/spring-reactive/src/test/java/com/baeldung/reactive/security/SecurityIntegrationTest.java index 06644fbf77..0ef828df5a 100644 --- a/spring-reactive/src/test/java/com/baeldung/reactive/security/SecurityIntegrationTest.java +++ b/spring-reactive/src/test/java/com/baeldung/reactive/security/SecurityIntegrationTest.java @@ -15,23 +15,32 @@ import org.springframework.test.web.reactive.server.WebTestClient; public class SecurityIntegrationTest { @Autowired - ApplicationContext context; + private ApplicationContext context; - private WebTestClient rest; + private WebTestClient webTestClient; @BeforeEach public void setup() { - this.rest = WebTestClient.bindToApplicationContext(this.context).configureClient().build(); + webTestClient = WebTestClient.bindToApplicationContext(context) + .configureClient() + .build(); } @Test public void whenNoCredentials_thenRedirectToLogin() { - this.rest.get().uri("/").exchange().expectStatus().is3xxRedirection(); + webTestClient.get() + .uri("/") + .exchange() + .expectStatus().is3xxRedirection(); } @Test @WithMockUser public void whenHasCredentials_thenSeesGreeting() { - this.rest.get().uri("/").exchange().expectStatus().isOk().expectBody(String.class).isEqualTo("Hello, user"); + webTestClient.get() + .uri("/") + .exchange() + .expectStatus().isOk() + .expectBody(String.class).isEqualTo("Hello, user"); } } From 4b36bbf0b776f83227225034048d1dbfa2108acb Mon Sep 17 00:00:00 2001 From: Saikat Chakraborty <40471715+saikatcse03@users.noreply.github.com> Date: Fri, 27 May 2022 13:58:56 +0530 Subject: [PATCH 276/278] Bael 5296: Added Http Request Header using the Feign Client (#12201) * Implemented cassandra batch query * Added netty version param * Reformatted correctly * Reformatted correctly * Reformatted correctly * Formatting fix resolved * Formatting fix resolved * Removed unused method * Refactored method for better readability * tab spaces corrected * Added http headers in feign * Updated code * Updated code * Removed unused code * Removed unused logger code * Implemented Interceptor and logging related code review * Added AuthService Code * Removed toString method * Removed unnecessary declaration * Removed new line * Added feign headers log as well * Moved to Authorisation package for better naming * spaces removed * @Override included Co-authored-by: saikat chakraborty --- .../builder/BookFeignClientBuilder.java | 34 ++++++++++++ .../header/dynamicheader/BookClient.java | 17 ++++++ .../header/staticheader/BookClient.java | 18 +++++++ .../parameterized/BookClient.java | 16 ++++++ .../ApiAuthorisationService.java | 11 ++++ .../authorisation/AuthorisationService.java | 7 +++ .../interceptor/AuthRequestInterceptor.java | 22 ++++++++ feign/src/main/resources/logback.xml | 3 +- .../dynamicheader/BookClientLiveTest.java | 38 ++++++++++++++ .../interceptor/BookClientLiveTest.java | 52 +++++++++++++++++++ .../staticheader/BookClientLiveTest.java | 45 ++++++++++++++++ .../parameterized/BookClientLiveTest.java | 31 +++++++++++ 12 files changed, 293 insertions(+), 1 deletion(-) create mode 100644 feign/src/main/java/com/baeldung/feign/clients/builder/BookFeignClientBuilder.java create mode 100644 feign/src/main/java/com/baeldung/feign/clients/header/dynamicheader/BookClient.java create mode 100644 feign/src/main/java/com/baeldung/feign/clients/header/staticheader/BookClient.java create mode 100644 feign/src/main/java/com/baeldung/feign/clients/header/staticheader/parameterized/BookClient.java create mode 100644 feign/src/main/java/com/baeldung/feign/header/authorisation/ApiAuthorisationService.java create mode 100644 feign/src/main/java/com/baeldung/feign/header/authorisation/AuthorisationService.java create mode 100644 feign/src/main/java/com/baeldung/feign/header/interceptor/AuthRequestInterceptor.java create mode 100644 feign/src/test/java/com/baeldung/feign/clients/header/dynamicheader/BookClientLiveTest.java create mode 100644 feign/src/test/java/com/baeldung/feign/clients/header/interceptor/BookClientLiveTest.java create mode 100644 feign/src/test/java/com/baeldung/feign/clients/header/staticheader/BookClientLiveTest.java create mode 100644 feign/src/test/java/com/baeldung/feign/clients/header/staticheader/parameterized/BookClientLiveTest.java diff --git a/feign/src/main/java/com/baeldung/feign/clients/builder/BookFeignClientBuilder.java b/feign/src/main/java/com/baeldung/feign/clients/builder/BookFeignClientBuilder.java new file mode 100644 index 0000000000..70a574ed81 --- /dev/null +++ b/feign/src/main/java/com/baeldung/feign/clients/builder/BookFeignClientBuilder.java @@ -0,0 +1,34 @@ +package com.baeldung.feign.clients.builder; + +import com.baeldung.feign.header.authorisation.ApiAuthorisationService; +import com.baeldung.feign.header.interceptor.AuthRequestInterceptor; + + +import feign.Feign; +import feign.Logger; +import feign.gson.GsonDecoder; +import feign.gson.GsonEncoder; +import feign.slf4j.Slf4jLogger; + + +public class BookFeignClientBuilder { + + public static T createClient(Class type, String uri) { + return Feign.builder() + .encoder(new GsonEncoder()) + .decoder(new GsonDecoder()) + .logger(new Slf4jLogger(type)) + .logLevel(Logger.Level.HEADERS) + .target(type, uri); + } + + public static T createClientWithInterceptor(Class type, String uri) { + return Feign.builder() + .requestInterceptor(new AuthRequestInterceptor(new ApiAuthorisationService())) + .encoder(new GsonEncoder()) + .decoder(new GsonDecoder()) + .logger(new Slf4jLogger(type)) + .logLevel(Logger.Level.HEADERS) + .target(type, uri); + } +} diff --git a/feign/src/main/java/com/baeldung/feign/clients/header/dynamicheader/BookClient.java b/feign/src/main/java/com/baeldung/feign/clients/header/dynamicheader/BookClient.java new file mode 100644 index 0000000000..2148a90120 --- /dev/null +++ b/feign/src/main/java/com/baeldung/feign/clients/header/dynamicheader/BookClient.java @@ -0,0 +1,17 @@ +package com.baeldung.feign.clients.header.dynamicheader; + +import com.baeldung.feign.models.Book; + +import feign.HeaderMap; +import feign.Headers; +import feign.RequestLine; + +import java.util.Map; + +@Headers("Content-Type: application/json") +public interface BookClient { + + @RequestLine("POST") + void create(@HeaderMap Map headers, Book book); + +} diff --git a/feign/src/main/java/com/baeldung/feign/clients/header/staticheader/BookClient.java b/feign/src/main/java/com/baeldung/feign/clients/header/staticheader/BookClient.java new file mode 100644 index 0000000000..cbd2622f9b --- /dev/null +++ b/feign/src/main/java/com/baeldung/feign/clients/header/staticheader/BookClient.java @@ -0,0 +1,18 @@ +package com.baeldung.feign.clients.header.staticheader; + +import com.baeldung.feign.models.Book; +import com.baeldung.feign.models.BookResource; +import feign.Headers; +import feign.Param; +import feign.RequestLine; + +@Headers("Accept-Language: en-US") +public interface BookClient { + + @RequestLine("GET /{isbn}") + BookResource findByIsbn(@Param("isbn") String isbn); + + @RequestLine("POST") + @Headers("Content-Type: application/json") + void create(Book book); +} diff --git a/feign/src/main/java/com/baeldung/feign/clients/header/staticheader/parameterized/BookClient.java b/feign/src/main/java/com/baeldung/feign/clients/header/staticheader/parameterized/BookClient.java new file mode 100644 index 0000000000..83a273893c --- /dev/null +++ b/feign/src/main/java/com/baeldung/feign/clients/header/staticheader/parameterized/BookClient.java @@ -0,0 +1,16 @@ +package com.baeldung.feign.clients.header.staticheader.parameterized; + +import com.baeldung.feign.models.BookResource; + +import feign.Headers; +import feign.Param; +import feign.RequestLine; + + +@Headers("x-requester-id: {requester}") +public interface BookClient { + + @RequestLine("GET /{isbn}") + BookResource findByIsbn(@Param("requester") String requestorId, @Param("isbn") String isbn); + +} diff --git a/feign/src/main/java/com/baeldung/feign/header/authorisation/ApiAuthorisationService.java b/feign/src/main/java/com/baeldung/feign/header/authorisation/ApiAuthorisationService.java new file mode 100644 index 0000000000..1a23f968ac --- /dev/null +++ b/feign/src/main/java/com/baeldung/feign/header/authorisation/ApiAuthorisationService.java @@ -0,0 +1,11 @@ +package com.baeldung.feign.header.authorisation; + +import java.util.UUID; + +public class ApiAuthorisationService implements AuthorisationService { + + @Override + public String getAuthToken() { + return "Bearer " + UUID.randomUUID(); + } +} diff --git a/feign/src/main/java/com/baeldung/feign/header/authorisation/AuthorisationService.java b/feign/src/main/java/com/baeldung/feign/header/authorisation/AuthorisationService.java new file mode 100644 index 0000000000..12e6d59bcc --- /dev/null +++ b/feign/src/main/java/com/baeldung/feign/header/authorisation/AuthorisationService.java @@ -0,0 +1,7 @@ +package com.baeldung.feign.header.authorisation; + +public interface AuthorisationService { + + String getAuthToken(); + +} diff --git a/feign/src/main/java/com/baeldung/feign/header/interceptor/AuthRequestInterceptor.java b/feign/src/main/java/com/baeldung/feign/header/interceptor/AuthRequestInterceptor.java new file mode 100644 index 0000000000..eda428de1a --- /dev/null +++ b/feign/src/main/java/com/baeldung/feign/header/interceptor/AuthRequestInterceptor.java @@ -0,0 +1,22 @@ +package com.baeldung.feign.header.interceptor; + +import com.baeldung.feign.header.authorisation.AuthorisationService; +import feign.RequestInterceptor; +import feign.RequestTemplate; + + +public class AuthRequestInterceptor implements RequestInterceptor { + + private AuthorisationService authTokenService; + + public AuthRequestInterceptor(AuthorisationService authTokenService) { + this.authTokenService = authTokenService; + } + + @Override + public void apply(RequestTemplate template) { + template.header("Authorisation", authTokenService.getAuthToken()); + } +} + + \ No newline at end of file diff --git a/feign/src/main/resources/logback.xml b/feign/src/main/resources/logback.xml index 7d900d8ea8..e5e962c8e0 100644 --- a/feign/src/main/resources/logback.xml +++ b/feign/src/main/resources/logback.xml @@ -5,9 +5,10 @@ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + - + \ No newline at end of file diff --git a/feign/src/test/java/com/baeldung/feign/clients/header/dynamicheader/BookClientLiveTest.java b/feign/src/test/java/com/baeldung/feign/clients/header/dynamicheader/BookClientLiveTest.java new file mode 100644 index 0000000000..6e78ba03a6 --- /dev/null +++ b/feign/src/test/java/com/baeldung/feign/clients/header/dynamicheader/BookClientLiveTest.java @@ -0,0 +1,38 @@ +package com.baeldung.feign.clients.header.dynamicheader; + +import com.baeldung.feign.clients.builder.BookFeignClientBuilder; +import com.baeldung.feign.models.Book; +import org.junit.Before; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +/** + * Consumes https://github.com/Baeldung/spring-hypermedia-api + */ +public class BookClientLiveTest { + + private BookClient bookClient; + + @Before + public void setup() { + bookClient = BookFeignClientBuilder.createClient(BookClient.class, "http://localhost:8081/api/books"); + } + + @Test + public void givenBookClient_shouldPostBook() throws Exception { + String isbn = UUID.randomUUID() + .toString(); + + Book book = new Book(isbn, "Me", "It's me!", null, null); + + Map headerMap = new HashMap<>(); + + headerMap.put("metadata-key1", "metadata-value1"); + headerMap.put("metadata-key2", "metadata-value2"); + + bookClient.create(headerMap, book); + } +} diff --git a/feign/src/test/java/com/baeldung/feign/clients/header/interceptor/BookClientLiveTest.java b/feign/src/test/java/com/baeldung/feign/clients/header/interceptor/BookClientLiveTest.java new file mode 100644 index 0000000000..2062b86791 --- /dev/null +++ b/feign/src/test/java/com/baeldung/feign/clients/header/interceptor/BookClientLiveTest.java @@ -0,0 +1,52 @@ +package com.baeldung.feign.clients.header.interceptor; + +import com.baeldung.feign.clients.builder.BookFeignClientBuilder; +import com.baeldung.feign.clients.header.staticheader.BookClient; +import com.baeldung.feign.models.Book; +import org.junit.Before; +import org.junit.Test; + +import java.util.UUID; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +/** + * Consumes https://github.com/Baeldung/spring-hypermedia-api + */ +public class BookClientLiveTest { + + private BookClient bookClient; + + @Before + public void setup() { + bookClient = BookFeignClientBuilder.createClientWithInterceptor(BookClient.class, "http://localhost:8081/api/books"); + } + + @Test + public void givenBookClient_shouldFindOneBook() throws Exception { + Book book = bookClient.findByIsbn("0151072558") + .getBook(); + assertThat(book.getAuthor(), containsString("Orwell")); + } + + @Test + public void givenBookClient2_shouldFindOneBook() throws Exception { + Book book = bookClient.findByIsbn("0151072558") + .getBook(); + assertThat(book.getAuthor(), containsString("Orwell")); + } + + @Test + public void givenBookClient_shouldPostBook() throws Exception { + String isbn = UUID.randomUUID() + .toString(); + Book book = new Book(isbn, "Me", "It's me!", null, null); + bookClient.create(book); + + book = bookClient.findByIsbn(isbn) + .getBook(); + assertThat(book.getAuthor(), is("Me")); + } +} diff --git a/feign/src/test/java/com/baeldung/feign/clients/header/staticheader/BookClientLiveTest.java b/feign/src/test/java/com/baeldung/feign/clients/header/staticheader/BookClientLiveTest.java new file mode 100644 index 0000000000..08b8461fb5 --- /dev/null +++ b/feign/src/test/java/com/baeldung/feign/clients/header/staticheader/BookClientLiveTest.java @@ -0,0 +1,45 @@ +package com.baeldung.feign.clients.header.staticheader; + +import com.baeldung.feign.clients.builder.BookFeignClientBuilder; +import com.baeldung.feign.models.Book; +import org.junit.Before; +import org.junit.Test; + +import java.util.UUID; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +/** + * Consumes https://github.com/Baeldung/spring-hypermedia-api + */ +public class BookClientLiveTest { + + private BookClient bookClient; + + @Before + public void setup() { + bookClient = BookFeignClientBuilder.createClient(BookClient.class, "http://localhost:8081/api/books"); + } + + @Test + public void givenBookClient_shouldFindOneBook() throws Exception { + Book book = bookClient.findByIsbn("0151072558") + .getBook(); + assertThat(book.getAuthor(), containsString("Orwell")); + } + + @Test + public void givenBookClient_shouldPostBook() throws Exception { + String isbn = UUID.randomUUID() + .toString(); + Book book = new Book(isbn, "Me", "It's me!", null, null); + + bookClient.create(book); + + book = bookClient.findByIsbn(isbn) + .getBook(); + assertThat(book.getAuthor(), is("Me")); + } +} diff --git a/feign/src/test/java/com/baeldung/feign/clients/header/staticheader/parameterized/BookClientLiveTest.java b/feign/src/test/java/com/baeldung/feign/clients/header/staticheader/parameterized/BookClientLiveTest.java new file mode 100644 index 0000000000..94e91b539c --- /dev/null +++ b/feign/src/test/java/com/baeldung/feign/clients/header/staticheader/parameterized/BookClientLiveTest.java @@ -0,0 +1,31 @@ +package com.baeldung.feign.clients.header.staticheader.parameterized; + +import com.baeldung.feign.clients.builder.BookFeignClientBuilder; +import com.baeldung.feign.models.Book; +import org.junit.Before; +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.Assert.assertThat; + +/** + * Consumes https://github.com/Baeldung/spring-hypermedia-api + */ +public class BookClientLiveTest { + + private BookClient bookClient; + + private String requester = "test"; + + @Before + public void setup() { + bookClient = BookFeignClientBuilder.createClient(BookClient.class, "http://localhost:8081/api/books"); + } + + @Test + public void givenBookClient_shouldFindOneBook() throws Exception { + Book book = bookClient.findByIsbn(requester, "0151072558") + .getBook(); + assertThat(book.getAuthor(), containsString("Orwell")); + } +} From 9c40bfe2974f0d0b499d965c6c6a3dd14212c005 Mon Sep 17 00:00:00 2001 From: vunamtien Date: Fri, 27 May 2022 18:48:42 +0700 Subject: [PATCH 277/278] BAEL-5487-java-httpclient-custom-header (#12269) Co-authored-by: tienvn4 --- .../baeldung/httpclient/HttpClientHeader.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 core-java-modules/core-java-httpclient/src/main/java/com/baeldung/httpclient/HttpClientHeader.java diff --git a/core-java-modules/core-java-httpclient/src/main/java/com/baeldung/httpclient/HttpClientHeader.java b/core-java-modules/core-java-httpclient/src/main/java/com/baeldung/httpclient/HttpClientHeader.java new file mode 100644 index 0000000000..43e6587ed4 --- /dev/null +++ b/core-java-modules/core-java-httpclient/src/main/java/com/baeldung/httpclient/HttpClientHeader.java @@ -0,0 +1,46 @@ +package com.baeldung.httpclient; + +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; + +public class HttpClientHeader { + + public static HttpResponse callWithCustomHeader(String url) throws URISyntaxException, IOException, InterruptedException { + HttpClient httpClient = HttpClient.newHttpClient(); + + HttpRequest request = HttpRequest.newBuilder() + .header("X-Our-Header-1", "value1") + .header("X-Our-Header-1", "value2") + .header("X-Our-Header-2", "value2") + .uri(new URI(url)).build(); + + return httpClient.send(request, HttpResponse.BodyHandlers.ofString()); + } + + public static HttpResponse callWithCustomHeaderV2(String url) throws URISyntaxException, IOException, InterruptedException { + HttpClient httpClient = HttpClient.newHttpClient(); + + HttpRequest request = HttpRequest.newBuilder() + .headers("X-Our-Header-1", "value1", "X-Our-Header-1", "value2") + .uri(new URI(url)).build(); + + return httpClient.send(request, HttpResponse.BodyHandlers.ofString()); + } + + public static HttpResponse callWithCustomHeaderV3(String url) throws URISyntaxException, IOException, InterruptedException { + HttpClient httpClient = HttpClient.newHttpClient(); + + HttpRequest request = HttpRequest.newBuilder() + .setHeader("X-Our-Header-1", "value1") + .setHeader("X-Our-Header-1", "value2") + .uri(new URI(url)).build(); + + return httpClient.send(request, HttpResponse.BodyHandlers.ofString()); + } + + +} From 26224e4686630f32bf790576ca898f46c05592dd Mon Sep 17 00:00:00 2001 From: Mayank Aggarwal Date: Fri, 27 May 2022 20:37:59 +0530 Subject: [PATCH 278/278] BAEL-5558 (#12222) * [BAEL-5438] Added Criteria Queries for Employee * [BAEL-5558] Sorting By Date in Java * BAEL-5558: Added and refactored tests name * [BAEL-5558] Refactored the code. * [BAEL-5558] Resolved PMD violation. * [BAEL-5558] Indented with 4 spaces * Refactored the Employee class Co-authored-by: Mayank Agarwal --- .../core-java-collections-4/pom.xml | 1 - .../collections/sorting/Employee.java | 93 ++++---- .../EmployeeSortingByDateUnitTest.java | 201 +++++++++--------- 3 files changed, 136 insertions(+), 159 deletions(-) diff --git a/core-java-modules/core-java-collections-4/pom.xml b/core-java-modules/core-java-collections-4/pom.xml index aaf63a2b2a..8060e4f606 100644 --- a/core-java-modules/core-java-collections-4/pom.xml +++ b/core-java-modules/core-java-collections-4/pom.xml @@ -25,5 +25,4 @@ 2.2 - \ No newline at end of file diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/Employee.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/Employee.java index d41ad54295..a9e7bc8a38 100644 --- a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/Employee.java +++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/Employee.java @@ -4,69 +4,48 @@ import java.util.Date; public class Employee implements Comparable{ - private String name; - private int age; - private double salary; - private Date joiningDate; + private String name; + private Date joiningDate; - public Employee(String name, int age, double salary, Date joiningDate) { - this.name = name; - this.age = age; - this.salary = salary; - this.joiningDate = joiningDate; - } + public Employee(String name, Date joiningDate) { + this.name = name; + this.joiningDate = joiningDate; + } - public String getName() { - return name; - } + public String getName() { + return name; + } - public void setName(String name) { - this.name = name; - } + public void setName(String name) { + this.name = name; + } - public int getAge() { - return age; - } + public Date getJoiningDate() { + return joiningDate; + } - public void setAge(int age) { - this.age = age; - } + public void setJoiningDate(Date joiningDate) { + this.joiningDate = joiningDate; + } - public double getSalary() { - return salary; - } + @Override + public boolean equals(Object obj) { + return ((Employee) obj).getName() + .equals(getName()); + } - public void setSalary(double salary) { - this.salary = salary; - } + @Override + public String toString() { + return new StringBuffer().append("(") + .append(getName()) + .append(",") + .append(getJoiningDate()) + .append(")") + .toString(); + } - public Date getJoiningDate() { - return joiningDate; - } - - public void setJoiningDate(Date joiningDate) { - this.joiningDate = joiningDate; - } - - @Override - public boolean equals(Object obj) { - return ((Employee) obj).getName() - .equals(getName()); - } - - @Override - public String toString() { - return new StringBuffer().append("(") - .append(getName()).append(",") - .append(getAge()) - .append(",") - .append(getSalary()).append(",").append(getJoiningDate()) - .append(")") - .toString(); - } - - @Override - public int compareTo(Employee employee) { - return getJoiningDate().compareTo(employee.getJoiningDate()); - } + @Override + public int compareTo(Employee employee) { + return getJoiningDate().compareTo(employee.getJoiningDate()); + } } diff --git a/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/sorting/EmployeeSortingByDateUnitTest.java b/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/sorting/EmployeeSortingByDateUnitTest.java index b8acb789a6..250fb7b62b 100644 --- a/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/sorting/EmployeeSortingByDateUnitTest.java +++ b/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/sorting/EmployeeSortingByDateUnitTest.java @@ -14,133 +14,132 @@ import org.junit.Test; public class EmployeeSortingByDateUnitTest { - private List employees = new ArrayList<>(); - private List employeesSortedByDateAsc = new ArrayList<>(); - private List employeesSortedByDateDesc = new ArrayList<>(); + private List employees = new ArrayList<>(); + private List employeesSortedByDateAsc = new ArrayList<>(); + private List employeesSortedByDateDesc = new ArrayList<>(); - @Before - public void initVariables() { + @Before + public void initVariables() { - Collections.addAll(employees, - new Employee("Earl", 43, 10000, DateUtils.addMonths(new Date(), -2)), - new Employee("Frank", 33, 7000, DateUtils.addDays(new Date(), -20)), - new Employee("Steve", 26, 6000, DateUtils.addDays(new Date(), -10)), - new Employee("Jessica", 23, 4000, DateUtils.addMonths(new Date(), -6)), - new Employee("Pearl", 33, 6000, DateUtils.addYears(new Date(), -1)), - new Employee("John", 23, 5000, new Date()) - ); + Collections.addAll(employees, + new Employee("Earl", DateUtils.addMonths(new Date(), -2)), + new Employee("Frank", DateUtils.addDays(new Date(), -20)), + new Employee("Steve", DateUtils.addDays(new Date(), -10)), + new Employee("Jessica", DateUtils.addMonths(new Date(), -6)), + new Employee("Pearl", DateUtils.addYears(new Date(), -1)), + new Employee("John", new Date()) + ); - Collections.addAll(employeesSortedByDateDesc, - new Employee("John", 23, 5000, new Date()), - new Employee("Steve", 26, 6000, DateUtils.addDays(new Date(), -10)), - new Employee("Frank", 33, 7000, DateUtils.addDays(new Date(), -20)), - new Employee("Earl", 43, 10000, DateUtils.addMonths(new Date(), -2)), - new Employee("Jessica", 23, 4000, DateUtils.addMonths(new Date(), -6)), - new Employee("Pearl", 33, 6000, DateUtils.addYears(new Date(), -1)) - ); + Collections.addAll(employeesSortedByDateDesc, + new Employee("John", new Date()), + new Employee("Steve", DateUtils.addDays(new Date(), -10)), + new Employee("Frank", DateUtils.addDays(new Date(), -20)), + new Employee("Earl", DateUtils.addMonths(new Date(), -2)), + new Employee("Jessica", DateUtils.addMonths(new Date(), -6)), + new Employee("Pearl", DateUtils.addYears(new Date(), -1)) + ); - Collections.addAll(employeesSortedByDateAsc, - new Employee("Pearl", 33, 6000, DateUtils.addYears(new Date(), -1)), - new Employee("Jessica", 23, 4000, DateUtils.addMonths(new Date(), -6)), - new Employee("Earl", 43, 10000, DateUtils.addMonths(new Date(), -2)), - new Employee("Frank", 33, 7000, DateUtils.addDays(new Date(), -20)), - new Employee("Steve", 26, 6000, DateUtils.addDays(new Date(), -10)), - new Employee("John", 23, 5000, new Date()) - ); - } + Collections.addAll(employeesSortedByDateAsc, + new Employee("Pearl", DateUtils.addYears(new Date(), -1)), + new Employee("Jessica", DateUtils.addMonths(new Date(), -6)), + new Employee("Earl", DateUtils.addMonths(new Date(), -2)), + new Employee("Frank", DateUtils.addDays(new Date(), -20)), + new Employee("Steve", DateUtils.addDays(new Date(), -10)), + new Employee("John", new Date()) + ); + } - @Test - public void givenEmpList_SortEmpList_thenSortedListinNaturalOrder() { - Collections.sort(employees); + @Test + public void givenEmpList_SortEmpList_thenSortedListinNaturalOrder() { + Collections.sort(employees); + System.out.println(employees); - assertEquals(employees, employeesSortedByDateAsc); - } + assertEquals(employees, employeesSortedByDateAsc); + } - @Test - public void givenEmpList_SortEmpList_thenCheckSortedList() { + @Test + public void givenEmpList_SortEmpList_thenCheckSortedList() { - Collections.sort(employees, new Comparator() { - public int compare(Employee o1, Employee o2) { - return o1.getJoiningDate().compareTo(o2.getJoiningDate()); - } - }); + Collections.sort(employees, new Comparator() { + public int compare(Employee o1, Employee o2) { + return o1.getJoiningDate().compareTo(o2.getJoiningDate()); + } + }); - assertEquals(employees, employeesSortedByDateAsc); - } + assertEquals(employees, employeesSortedByDateAsc); + } - @Test - public void givenEmpList_SortEmpList_thenCheckSortedListV1() { + @Test + public void givenEmpList_SortEmpList_thenCheckSortedListV1() { - Collections.sort(employees, new Comparator() { - public int compare(Employee emp1, Employee emp2) { - if (emp1.getJoiningDate() == null || emp2.getJoiningDate() == null) - return 0; - return emp1.getJoiningDate().compareTo(emp2.getJoiningDate()); - } - }); + Collections.sort(employees, new Comparator() { + public int compare(Employee emp1, Employee emp2) { + if (emp1.getJoiningDate() == null || emp2.getJoiningDate() == null) + return 0; + return emp1.getJoiningDate().compareTo(emp2.getJoiningDate()); + } + }); - assertEquals(employees, employeesSortedByDateAsc); - } + assertEquals(employees, employeesSortedByDateAsc); + } - @Test - public void givenEmpList_SortEmpList_thenSortedListinAscOrder() { - Collections.sort(employees, Collections.reverseOrder()); + @Test + public void givenEmpList_SortEmpList_thenSortedListinDescOrder() { + Collections.sort(employees, Collections.reverseOrder()); - assertEquals(employees, employeesSortedByDateDesc); - } + assertEquals(employees, employeesSortedByDateDesc); + } - @Test - public void givenEmpList_SortEmpList_thenCheckSortedListAsc() { + @Test + public void givenEmpList_SortEmpList_thenCheckSortedListAsc() { - Collections.sort(employees, new Comparator() { - public int compare(Employee emp1, Employee emp2) { - return emp2.getJoiningDate().compareTo(emp1.getJoiningDate()); - } - }); + Collections.sort(employees, new Comparator() { + public int compare(Employee emp1, Employee emp2) { + return emp2.getJoiningDate().compareTo(emp1.getJoiningDate()); + } + }); - assertEquals(employees, employeesSortedByDateDesc); - } + assertEquals(employees, employeesSortedByDateDesc); + } - @Test - public void givenEmpList_SortEmpList_thenCheckSortedListAscV1() { + @Test + public void givenEmpList_SortEmpList_thenCheckSortedListDescV1() { - Collections.sort(employees, new Comparator() { - public int compare(Employee emp1, Employee emp2) { - if (emp1.getJoiningDate() == null || emp2.getJoiningDate() == null) - return 0; - return emp2.getJoiningDate().compareTo(emp1.getJoiningDate()); - } - }); + Collections.sort(employees, new Comparator() { + public int compare(Employee emp1, Employee emp2) { + return emp2.getJoiningDate().compareTo(emp1.getJoiningDate()); + } + }); - assertEquals(employees, employeesSortedByDateDesc); - } + assertEquals(employees, employeesSortedByDateDesc); + } - @Test - public void givenEmpList_SortEmpList_thenCheckSortedListDescLambda() { + @Test + public void givenEmpList_SortEmpList_thenCheckSortedListDescLambda() { - Collections.sort(employees, - (emp1, emp2) -> emp2.getJoiningDate().compareTo(emp1.getJoiningDate())); + Collections.sort(employees, + (emp1, emp2) -> emp2.getJoiningDate().compareTo(emp1.getJoiningDate())); - assertEquals(employees, employeesSortedByDateDesc); - } + assertEquals(employees, employeesSortedByDateDesc); + } - @Test - public void givenEmpList_SortEmpList_thenCheckSortedListDescLambdaV1() { + @Test + public void givenEmpList_SortEmpList_thenCheckSortedListDescLambdaV1() { - Collections.sort(employees, (emp1, emp2) -> { - if (emp1.getJoiningDate() == null || emp2.getJoiningDate() == null) - return 0; - return emp2.getJoiningDate().compareTo(emp1.getJoiningDate()); - }); + Collections.sort(employees, (emp1, emp2) -> { + if (emp1.getJoiningDate() == null || emp2.getJoiningDate() == null) + return 0; + return emp2.getJoiningDate().compareTo(emp1.getJoiningDate()); + }); - assertEquals(employees, employeesSortedByDateDesc); - } + assertEquals(employees, employeesSortedByDateDesc); + } - @Test - public void givenEmpList_SortEmpList_thenCheckSortedListAscLambda() { - Collections.sort(employees, - Comparator.comparing(Employee::getJoiningDate)); - assertEquals(employees, employeesSortedByDateAsc); - } + @Test + public void givenEmpList_SortEmpList_thenCheckSortedListAscLambda() { + Collections.sort(employees, + Comparator.comparing(Employee::getJoiningDate)); + assertEquals(employees, employeesSortedByDateAsc); + } }

    2Nqj;GWe*{{%+stj=Wx+AyD5OwMG0Pnm!4*h2A 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ƾWwq}We2pjA&dH&Ad4njng1WhnB=aKD4 zuJ4R&udZUC#U<{dd2Vr;yJ%tJbkw^jchQPxcyeX!y<*DY*3g4fdR%hdWhZ*uX6E*C z=$(APeh=k&82=CN#X6NLo`N$0WRhVyPj`xjrbu(bVQox3(Z}StR=?mB{mrdkFrt2@ zqZFdSS8jLO*OB4ZQS~!V4W}6t(3MYB|5#XHbp6cJyfy0thoHciu)x@`!0E`{^)t_K zJGiTrq2J_NO6`UR*ktW$F0IL{a)yek8V+Sg|xrcGTnZ}Zn9m^PxQWsMzYRZYYn0`9z%X1YkQ6bC>hvX&$zHTr}nFC z58WR0KD}z3bLSj38Ufyz_r-bus!UY`u-98O#X_>}(~{h83m@yOc}vEOx?NT0L+#KK z)YWW!5K(w!@G;U>w`(;wj`k}H98T$7?y)7wk}*;DXtO`YTU1mZ>%pJ6^j(&-nX6i{ zgZhvQaiuDI>SKrGsJ=H?e+3V=oCJ16qsx>yN$C0{X9#rzkJ7jZdxH8`seXvh0JpdZ8&XdB-cvy`h1Z2Is5OSnczFzlYCm!r zrBW2u$KF+x+ptF)bKihDbJej@c->RuC8%oHU$TkI<{XSgiUsVEi{>S90`|&;UVeEO zk_T$kqU*fNh(w+$zDBCyjYJBuc9Emg%{dq;U?fLE=B-ljQ{DU zKj?i@$j@Ah39|nkdtc<`<4bW9KF56FD5br)L_gY#=jl&d@u~bQ3*Ic$AAbe8_mFlXzti}=f(iab? zUSfE%YD`umS5~tUU;f1E)%}sJ;b?ez7m1g8Yt~b=?^K`k3IgK_5IB7?|M*WmIw;E@ z^wST5eb^*Lm}#o?0QkUqiv<;^0rA#}$)nsIjE@$fevZn?$^%(Tp3KFba6V5qkW65t zj6KpT$#-A(?hytR-Xk8hBJbLC8+vF!f7hmnF4>X(+b2W2LB?P1CKP{Af{csh8~iU4 z0;Xo$zi#JTo(Krp-c%7(qS3o`yjL{7u#J7hnct>uGPXW`mRH)i6@U6hM~*lSIjl<+8DGV90&=CNfnhv~v@dkqgQ97~u(VYn6H0eGcl{c+ z;H-U6de1>{++vaL=sqpn9}8nm%kR|%_`!_LTRI+@0l5lmQw#$@7sCnB+la@uIIINk z{Av&aL#l+WNuuA8!?y3U;T1L$K@{BF4%EF^BQYQ|g4~vK4H?_x#o&iO;%xEO4)FH9PYBs4|?|cCtGHH{Ix#KFp)-+w`tI>Q0p_eb`H^&%rc_>rR}#iy8P;t!!Q} z#-iLd4ZL%>%!dyrF2;8rOZkPYbs+g<3y4LNwIi|v+g{5SdSf2d?DXFmH1uNS z(>;1HeqLDKGt{)Gx9D-ph6igP{J!BH>u4LT`$Y zhXmmw1Z0_mB6v=)Y_Z+)aNGT%^AWFjHZ{9jg%3pApt3F?>=G8@TCjum@B2uU8o)iHn z#L1$hf7_o;TdV6)f2I4A$GB&yv-FH$;M6|BMjRRpnTC#%wZlt*G|4_O)|fOl{t4>SeW@UypgDx<()X@!s<%Yu6*?NNz;9vC*IcH33>@nWd-jH!3D3# zh_GP7-Oa*;ePW&WH_?I3C4P?i6vjt}-49uvPkNi;vK2!q+Tg#>^plnQnN64z%^&(H z)Qi)F(oNW(MaL{qkmoqGHEUF|R!(g?JZnspBQ4|XFc5j333CV=(e#1wl1_z#7xrwM zD)@2b*&G}{7f2@F{3(5s$yf`U!BIhUbSRKCOCTW*V_|8RQ#VqxCk>@C;9>1|w%-45 z%#dp+1@*9FVq>*9wM+TN4&S-NU89d_!m9C1GA=*DEvq%Zw5t1glJOywAz)|5o?D$q zgmgR}`ML1LSanl`!;X#O-LN2`Fg|%g=s>K>o1mN7@EP9a_AZdTTexUEz(SZ@G~O$| z3hcR3%Y`VwfsvLbeIaAe63Y>y(|+ZqN7m`TQ&586XZ4bTzZ+$6j$rEOz9q@) z#vJj-jR0F|r&~+_8)((H8rh%2Ys;x+WBMXM&UBmc$w_Cg&wlr3@!`%BqnEg+*}2(z zmKqO7023WuA3e<$HnpZhQ{L`BkI>8!Q5yBVcgfF^es*``!yBFMU-$b{;XHj&gexBGRjo^uQf?x4c0$0D3C<{lElkJRQC13<%A?uw5*2okuacZ}6|g#K1#M ztHy=R(d{%hEU!lDC&nYsoREuhWoTlPn_1+Kd{8pmIt?O_PrzQzJe<0G%;iXoiiF%m zWh1`(MUs^r>=@o}B~`S?>>`9)xe>M5EnnXrlbZ{Cv^BHu!>bzMD{ff{Dk+K6dvaop zrNP&`7dHH5OTEG0QTasg9wNgBF1O33?T++vAhvNA}rzt zafPJBf2Oyz#4DM1Vd<6&6OBU;a&%>{QL&ubd(=W~J;+#K9JJM&c~wn|7TkYZ9tW{j zvIbV*W7!DUyFV6;9~-@y0`@v{IK zt-;5dbd6zyLNLqg`o5-f+JrvdlUikvh}bX3+3oul85Hs-eSg3@-w$F_BV-A8mNPe& zr-QR&iiY!{b$^2CULkV)6O|}I0B%toX)%CmseX?1W<^pn+dX=g1Jo27NS~tbNCTvmvAe2Q#qg?5x40faF zIdx};{cMVjLAw^USGhkA<&lrBqG6ZM4+NiCI61D?NccoA8MY(H1cs=P5Lv(v7;F4}@qjmm=nr zh}tBxz=H9?)V{Auc1T}0L_f{x zXZ=bh7GVIJlgf?H0Hk(1OfWr#f2@2zH}Nk+D$Bq>J(>dYplAa7jDg8wD@HC>R&#t9 z{K%<$i{qd41W62~>ocps-@FLWla8$EBKBoKC>6UUakW?aAWmm+ddV9X-6y8Eo~|M` zb=|pY(9~%W_zJ=e+^{&0YtkI0JGCAR)=VE((0~1L*aamZsauWpKAc`=<7uTuLc>&U zz?JDf;`rlsrje(=z>qB$#2O_-PJaM)Xg46rSZm^i^lS_g!M-v;-`Dp;0{E#5T*tVd*P05xq{{2K0ciYhS z*uggWCFkNXAKs7S7H__tS9Sk~;my>;)wkzoB_Qcd_S*mbP)ms1miQg7sw+lDmVeoP zj9}5^Z~1I4EU$Y#Q}AYDk`|f>GW?B(e*=;e^_DOqWfU9y3s4Zu1rB{O z=~rb$59zNqMscs`f5mI_s1g*gGz{2hyn9Ys#_=q|Of^{D!HASo0$jRx14{xZ?q19c z`ucsIhqRJ(@Mh{Re>qArmCsgX;c|!HdafBm&>T86qson0`gW`jd$Fma` zIGZ~Px5rPdu8I<>q<+z$L~iocL0F37ldw%;qsW-2pp)eBXuR{}w`NaNriNW!RRFlW zfl#Zi8X0l!)H%1ac@Z(Foz2II6ZiFM4#aC+-hySP^I|Xtk3rpc09UJnCLxq~3z-3XeN$xA9Z= z_&Op88g5(UMByO}MO72Nb7HdjIn2BUJ=L2%EkD^l*)47KzXJgw7!}@n-Ri&UOq`1D zg6o{x2c;SO)?^57FHMB#`HBQ|D*@;5ES@~3 z!deH`pRQ)#a9>R1bx+VZ*xSe8G`=*?Bj;@BS)B#(P_m0DA&<0XVznW7V}kll)8w3) z*I;pSYHtTdsz&>t`j4=EEL6mz(3sI$ZY}ZV6nHD=G4XJqoZ?B_t;xtl-=}2z%o0Wk zuy8e=IZr=Xufp=(&fRbE+e!Tw|2A+)ARQWK6}8RDgXuKhvN4!zO^J0L*@NGW3|-}D zdS(UNGSCW!*}{6|3cs4k3x`;CL*e3yPHl&FvC5|QIpfs7S9XKDc;eJug=MpyJL~u~ z{nm?|Q|`g^xwOoBv+BH#_RM+Sf|8tD%T8Un5DomOH1K&s zHz|L+C-oo)2TJX6_kU7rg_fHeBxEq}z3CAmXvGPzM4tqBvcs0pY(P;@MKSl3HlnJT zBgJv$iA>)WjE`tNfzB=ck#-0ucQAb;zv0w%FKO>vFk9Lhep)=>XV$~Y_Bgedf*0*G zFJktAn-A@94n=?ey2&U;dAD?G-Rj<2;;x+6M{AWk(!*&T*;B`=>4bV9Zf4nR4@+&? zJa5qix2#O<5MB@43Tj!Sw_;5CO6quv$E9cKFPqae<&gWmHjfL{LeO;LQE%Kh3Mib*pCJf#b3tRph&rs3>r&O1ug}ch2)F#<^8x z!XOL}w{1?^yQFTraN&_7FQ}3Q}6_=)M5-%ZbpP zSr&G{z#%k$Crix2uWL!hI-}@M=M^S8mYtI-KF7O!e6ybiC+$cTJYGvvHLrbeDfdbX zYP{_3r)6M20gJ6CP-=O{^hL9s+Iej7Tp(pt|2u62o4#0YN*go0q;D7G&}8m2hCsBC z{sC+C5%Jl{mYh5=-q~D|Uwv$Fypl`)$0EyPnS-DByl}%q&4f03{jsR{?3bs8Y9~PM z@&71^zt@SiJDWSnLr&-}WxCBDoNOH*_?IM)pAzrx?rD%~gf@*YR3FPud>jtclhI!P zohG`Q*fhgB!LF(j{F)h_iLq-w^WeBBG0Ru;jYoM zcbZ$?L&9@YPf7}cLmcuEU}&)O9PDAvBRkoEy~-X^zaM$k?uH!D2DV?Wci5r8Icn$j zF2;AM0-8C+v%?RsNEkL|z#*bZE&lr>iE{i${2xEid~~}zy%$#2ci$a}<@NZ`Ytt77 zeDNdlcPsw=6vP`&^ip?9knq3VOC~g2a0yWIxh2Vp(<9u|FC#+zd)}Se(A#70@o$#Q zIL{+cQLZI^Dfmp_$mi)=E<$szVz48{?=eJB7NTP+hmx&Rf>eJED%{D?Dcrr2a=13J zN+XB_q2?05l?{`m*WYbYWy(C1S^r=@UeWAp?fC2?=fmBs$==eaKl*RNj4OYM^p-C- zlZQS(`U_dYB%!OR+JmboJpJ9hGWHo60tji|Lls7n4TTKCUrZ> z__!XOID`+`^qJKB5jB%5CuS!GElK{<=&jzOiGe@vqKS#YZ6pL*(m=ZiYXw<}pWto^ zOn%TFWDN@Yva7+?-`qUcN!}if=mN{>m;pfy|B>Hd~J3any zSxf#L=N%+Hb=TM2PF&40c4$(skh)?b(D;1y%KYs3d}s3l0*kn%VhCDtza~e#t;cQ2 zm71uyUylWy)v2=-%!1BP$cnl zN=LePhk8QnJrD_&1)cd{XJ}q|Prz{8PMxb~?01v>u>^mq*|z8x@@@c_AYA+={}uQR zN17aquz8@3eA$~bO}ss}LH0x(j8@OXuWyWmeNv;&Ij~v#M=$(}zs~_4Ev zyRbv1lyQP2gEJ1RGjqG|3=yJley`hh6m_;1>ljsqp90*plQe^CHztN{%ftC$VH} z^lR5{vvt;bW%7&Mb1OePN0`LcM%$5vP5^F^VNvf_Ch@W=A9 zrFh{kjAXNh*LW~;3+rrSo@}*x6UzGJgH2=05Z!!zlNGMgm#_u1VQIuFXjSF+K6 z*8y6kjgp+d&nEyU8aq=z?-!HAN_nPa?&SU)Ghxk|NG(u_uo>)IK^f}fLMUPJW2hl~ z#0w;7{dc#E^|4~aT$0?n+o^rcddWk<=1!DT`v>}*UG^1c@|DF4NUqUH zfd7-HFk?$^kl~wMVuP)OqNEsJmDp;gh&D`Y(I-$)t`SHo_;}gd_F2Xeyeo2@C)SvV zJOE_S3C1sf)lUs%T2_p*h~H(=WN`&&I!^6w2)_YvW5LHmDL-AMXY(FSlNd6DSM}{@ z;$QkI&jABFJA}K$j;zEmfFryPNou#}=ihb%6NS>rr%$YQ8qPsU+K&Xya6c#xn5%K=DQ z7xPRWVEnUk({d^`_i!OzLtr{e!-+A02dv8f@^F*Dpwer#{tBAl8M=e(Y0Scquu}{A zg1_lM@E9&7lCCu1iT-fhcQW(PStjdt*@rF$~Sa6O5De zLYv?}A~9x%3=(rrr}^y|XqyS~7|}LBgR9KY*@X{XI<7f^x3(X&FS6V9b|(WGQlje) z|1v_Y)NEVx;~`l`o)9@Zn->=(w@2$27eE07`{;EOJKPtJ{P~>34$}2XXOl8Jrcg;L zoHdFOh&w92rIWat4io7N)y=x+s&2$hkIxxHa)3{X-8qRJg+1{Rk`NC0o8A;NOjLyI z*Ld$%4MXg=Cq7Lien@=eD0n5sCCfhtJxjo^;X!sZjrXf*C%(a3BGi)m4HeO`A zod=te45gOSj-OBoCgo+Pm$7!7&m2Mw38eGq;B!_@xYreL6^&T56=!xSS|&%ut$yrX z>3HRhq{R)y50KKo?#0kvtTWv%BdysGEs@|yQ{0Xa)3?!^;UCGAxJwZq(OU@kl0r+4 zN`WA8cnpH({!+~W3zc8M^U;zd{LOyldiMJpf1?O3Sn<6U|Tj>zL>4*TFnBtYbNAN8&n|VlV%SxUV z^xe7BcRqf=kh0-sGEN%)_@@#SMm6KldxQOA;7f|_5Whox z{fUZsxJxcc_KsS8qqBK_37LGc#gBb1`D(VhN8OT!b+wHk@kJCQXDhCX&#qe1KD(-n z*uTl*fie{$-zc0Ay!f*fG?qPWZgzZF;~(~chc6Q{v`>$3Y}c!{{#PFXZyR5Jux~h9 zi|2Xs)>OE$_YlUj5_2#^55}`3XXZ3#bH1~=f+*W#h92h!cYBMno8QbQ-t*AoWQ2bL z`)}!cOWfJ>=OaEURw)a=G1;1Lu(!|U?_p@B#G?7Up4y}jCcnFF4c70%H5G~`pSZ%C zTjV^ksu&$(_DcH6TiN_-?$8eBiMa*mbmYtmMp9xU*^U_`7|E;oL$_-zE%d$y^riP- zsfS=*Uz^&*Z@aIs@-Xp8DI50}Wc%qqyHx$~6 zFUxYCSTt{mg46wL{7lB%g6b!McL{f~{PKh1w0uX)>0*Bt?u;VUI(K?F@gY1pag=t( zM>Uoaw~V=8{k3b;pB*GRM@T-1kUXFDHBp%jZB$m`Mh zTQmdp^eY^0ln|66c{Jh;HVgu@42kAf2#I9zgHkS~O*BS3+{*BU;@Ls}AzYXk;uwp; zkfcv(qJ7VL=*F3~gd9n^IVHfI(3mp~?k)U?H1E%6;Wy9B4qLf8gg>*3_Vf4T0p(IL zXK(kV>Wa%E#JB13Z?h#z?a+|D|Ax zL#pSO|-3kIO6T)^7R)%d7C2+06Aw!}Y!GcnsE)+t=pd)=u{?Hxi4Zl@5Z z^?Io*#ETjr^q!1zo;r+qSRk z%jzR4Pb+m`n`bqnEMPuaNzzQ_N<1NN&O{!&28L6Gg4efBn;zg}hd&B?A( z2>K1gb*kC+{QWo@vq`*EAA3oi+eW6Y*&cMX4||$^i6W#qW{nQxE2ol=5AZG4j&wD* zQ%<_u5c28Gu{SS{k?v}Ld^RV!G+&_YQn7Qeq%EAFDEF|q*h~DyWBIBeW^2^X`-kQN zd0~2aUgC-F`^m#hgf-1L1BjRua8~kzqeny4pRQF@mz-~UvvQkMk&ybtH z?H$34SmkO7&whkGGOFUm&ABAlj(B)kwE5LBnDcREgeMIdic|jPnS;cm?AKs1Cmob^ zdimA2j|A=&>TMQ!M5-jmDQRv#N@_aN;_PrzCf?IhC6||W3+L*dTYY|7mQ9WK5GmmN zzb-z}E8z{gFC?H)?Yoq+ww=u@px8OXg^U=i=M2>d^kbL?(59~APg*mXxnV$KQd#~+ z(4zZC!TO?I0nNKDK1ZTelA&fbidjbLxujIyQD3^vUR^=bg_Sw=<-7d|=~Gklk?Vjj zhab#S%OFEtYzMJ$=m80FTl4-gLytO}D|a`)mOr$!`OVy+?atlHP23~6NJEGx8XrEl zY$^E?l#p|Af%RW3XU?tH1U_W}-jHGK0tE0_SNbXtMf$!JcEdxf6!pJPCFNlwXZPEY z^k+kK>R;K+?8&8S$AJ0i8*DV4-bh;}yTWBt{U0_TS!HNMLb&Ze48gx%jTzAB_kV%g zbDUN%K=)vPns%|5bQ7XOh*ppY@^ku~3;U-JqfT#UoEiP4=D-Fa009A)j`!F8Sw!*s zf5*&+v+f3bFTIipZlb}P5*oMqZZF^E&7W|xV-knLZs|kqG0YI$YRt#^qo!3&8_<_D z_}>AXZ0&E#SN1WVL26f8G0r9Q{NnLqFR_goydvItz-O2TYx`cfwz8cJVk&rwdW1u6d6o$(`jIUJ!LGAW8=g~l=O9gOJ-a^ItF84W{|p^J#=1-ZTjp#Yfuxl~ zb84qJ(@t?V4&c@lPB66N(2mTJtHD9e>AA;c++KG90k6Lox;7Q8Fi{&nE0xSUltHac zl<-&LgGP^Tq89nfd7^9-_FH+HjMC_EM!Qwsp0%=Q%4@2$-b-w7Z=XQ=J$Ko7udK+~ z9KW3nui$pl-wfSD{epA$|Gln7dF3i}Ave(;cJ3A-u5vtkTUh#_b0<8HFf*%IKKz*3Wu%{hq7T9y3cMi9 zET|@wl0L=Uez<_S>8=J!zq(56rjM7Xbzek~AU&ml`35B9!Kt}{gvmy}z&7$d{D_E2 z=?7NRjW)m3y`K>D@P~%37LTu9Dfo-_r|vRTbdRP84iJQXabi0eV-y%DV1{6js8%(o zg_=m%PVLWts=(sZ{y^|8HP^?3=8BSsvfq_blyrif^}<8@rc93!7JedR4S=&utT_sW|qki8V;bLhXD3 zQ8jN=P3lk+v4;Sn0BwS>;vV>)j`7OGFCb6kAFOV>x5 zQ^^}JFOja$*<5Ivg!Un%yGYjb$_Jghbh{}vdm27853SBim-18{9URf_++OuJyH3!| zO|^#$%Qq&T^(yO`uZ?N;FbHAZFr#wpy&J18b$4>rN8$?uj<8d%iXe2Oucj8}_ZGIS z%4?{Oj*g(n6}D9VO+~05h01e>cCLP2UL&!G6qTXsDq6uQyz(KgBL({&W)WF}+ELF8 z=mmrE5O@pcw<=%tz%t{x>oiM?KW(cl{9uLeoX-l|Ta7%XmC7DcNLtv9T#mG=pvM+f z)xropaDP+tVab0X5MKIoh|cXqOa{i?e?`vi3~x=#pAf`FuDA-r6lPx0 zU~T#b#@_(hhV~*u9k`(=*(Z9ZFRBiD}CG9l!7Yh4u+o5OHVEj1!l^BzrTE$*$->IN}Sj^ zHQAJYMw6-Bn0}m&1AvbcQ3+x|YrKXIm>ORNOd|vYjo_$zC>)S~shUP~X;L$!TVeNF zCr&|3p+!-0&*PcG?o+;-?S?CL&Rr|`xH`A+pmWE~{1Vl}22;t&S}CL@?t6z_8!5+; zn0`3VhG52IwVBv!E$$0jy!#Whvq~){&luR^QqAI{Tl{j^BGys)D~0xxEB(`nxL31n z@xKM}SQ}dbVBbNCynREve(?vQkV&g3`G&m`1D~{^i zUm}*jfSjvbB2C$GSi7Ak(MgtH*z*Ag4D#dng*wGy1TGpc08h7aM>%jXiLaJJ$?d$m z;Lo%YdKsG=@}eTU4Kqr+Re6`Lgpi6`@-R_EX8cc|h@1P3e}@P{SBb!Lx(Rfb%5=k8 z3mKbq*b(ol>AOrCo?Qb%2JAQKf=d>aqjB%CSZ8ZtAYz4oy8hlZ^|z5R95gXZJ0o?7Kh5 zU)ZA2OS5^J@`qyu)$OK!3IOpD$UTZqYd8fP9h!tA}<|gZaUZ_#~xi zY@r(a<8nJ241(|1esU=7+$Z3)TUh5T0N-wYeB&wX%_7s^_^Lc&sU`Oxbp!uCt9dxa zY$&1Df3G$SVuIBR9A9|`WxMfOsz(c~KlLzCyy|Aqm8!MZ74a(=Xi50aP0i-l)aTmk zriE{Up)m~aKKT~9sf+kG7)`3SOwN!5oro@t^yFB>{!zT}JS!wn=@f{(ml}cn_U_Z0 zL3`=my`zJFgV!}J@&tFwW_SUXV1KKd($`OJaO+=_(j~a+*I+<@NW49EGE-TVb_1Q3lT&bA zVQMQH8Eq>%CF0t`1%*;Us)5j%?SpPZ#5SjHypfk6_0$yg_KZ*?xJm(R>*O@!J)?g~ zns(?|uQR*HeOy5HO#KMLm+FWKD9=EGJ~_Tu4tTFHlDqu zsKD^EXiOQSYAZT3+bx-ZSJbz7^3Qr9Gx~1~VaTX=1_xq4s@>!pk>p|Sh}D-3Cdi|p zSzqGt%?Pbp=j6P)w7x8_zARc_hAqILR9`ZrzHCH*^RV!Ic{a5b4bN^X8uszFqM_MA z7faf!>uI1YtG)WcprPLO>W9K#{?GArMaigpz7M9{9m)k+U?EG~tXdBnY= ziFyGGA`|e;3EqN~vyH$Zh8a@+F-7R8V0rS~ho?l;<9|YA0jXlzHO}_2DUiXd->cz^qcWl&e zZfP_AK8-8&Bx?1eKvS9oq#;tw8T`-}#VrW);MGywIeP)pmR$yKYn6-hnC!zXe#mAV0!3Zwq-m6D_ zJY65HA!}u7uoT`hvanQ5@UGy>sHfxfLR2lDfR#OLRAE( z|Bcyc<796fxVwEEc`#(%OLL`+9&&p)vG*^y1@|Xg-w<#%zPjfiCC*}cr5ZkCO|wbJ zD=FBf8V!Wc#n0>8#7H@KQvN#I>M~b^C94J%LsSaY<*%(`YWG_F{JxDCskCkl0PF|A zL;=9^1GO9b5YlS-O01Oa9e^oYr5@9&aq4iP_eJkcZ8s87!#*jq_I3-?3~Jts{WuUpb4_I=9-bwi+tY%s%iFpsC`r;;w zI@8}Uu-(8<5$`an zK#*MEMdMY*sq0Y7woX#qcEXoy1teXomy$jAH60c z#c1V>zJkPH~3^lefdt(RxHS*e}HKUOKo3Nm`?wkO*! zcrtk^SP-7JLRaaj)`H1S#)wkU&zq|smC1{Q#_Hd2lQDH{4d-f-8Sp~N15qGZh^fIz-ZhFd#WNDxGk>9)A7p#?FeROS`tPNz7mJO zGbl~ChJg3&il3#B|6|=wvm1Y?9FLI}1@M1DwoIRCxW|zm-$sWsA3|(`zI1&3Tmn5jjZtml9_c%;MtliEr_I_c~5hd zN|Y*&1jTZK!C@`(Qq%ZAmzW@;{)puu*h`#I1M6A0X0YfL00WA|6}7__(`}w~EXdyJ zzR*vf1C=dNuAuUfG@}G#CZYVA9BvYBYUYsX zvvMmJ1bU78LV$_=Y~lZ~_Ac;sl~vw<(wwGg8`uFN1gw(M7AjOtu|h*4Bq1jW*z{)8 zqJs*9#tWzg&glh7oA#Vw_UxV-2Rc&`waze3RrD=LFJ>sDB_@TbV<{b|uT>)!*oRgK z$b@oh-|ufd`y_3_nfLvF{(L?(`|QheSVQZL|_AC;X0 zB>D*UH!=T#4`VmaR&XnP{<_h5+t%Cr9-$KCy+l z2#JUvwm-5HWXena5jPM*6eQvONC77x)C^qCRB#L@;z7k*iSy_(B2%z?!DNGl^*jldI>U@hf%YL0lU70%v&2YQVSRqEXe_JFA*FJlNV~et? zu&9X*`-`8@{44^5aH~!087-Toe$c2!@UY^wDNBB4$C2d3u}Azn^qV7B24V$uu&;b# zQ;Dceubs?Uq^RV}D2&NP-JJii~IvnqKo`Dg#N9nVt-Wgw_63+Ba$wF(#M%%A4{7UWhE zR9}{;%mlN@9P3tlbRmbNK5){U*g4LE@a0wV3?|+;9BXLH5LD{JQ{9J$en}L6H9n>8hZ(Al zzJxHtvb&Z_C#ti25|j&Yy0Jt-3sMtgZl#o?TS2xW(!lhkCX92g4xuXHqtH+=q;hHL z%14J&OPsxz_?^_@nqYCgKL`c)8|$%YCtp>B%2&U|lsWmhd3Wl$n4cW<;~{}mwWEs? z1wn0Tu(Srb-UCO*2Xki#Z^h zt85Sd<_W3Z8jH|_T)5JZKL{GBPKW(H>cXbi7Hq(|MjkZ%0{>@W z>KUTGC7uL}tHqel(Ip}~ij-%U<*Ccaq%Y9*EhO7}9Y?g(^U*`t<6im&eht-4EAcu8 zbU!aOlehmPN0^ZT98<$dvxMw@;FS(xtYj5k4@>V~2fO6KRLs7OqaWyvo zs9Z5;wNvrBGFT$wTh&mU_>kXrSZ*bXFdy`vICLuTMD%+mR(1QC#R&?Q=2z}QziB?W zK4?4a#}5ZBhgoSL`>zsh>7#`Tt;2gxDrJKr0D#eRXflAlHPv>2b=xI+L>+fRS@E>* z)@FY8Q&4SMQ0>lx-Xrk?nOMz^fdVEbM<+9RctOQ`I3MG8)ZSEj2(d7?6alI9f517# z5BvD*x9#z^wm}1NRPH}i;^GCC*lDbBb=eSWt(=+sb5IKlE5^s$oExjsdm#KM}RK*V_am^2co~N{?R$QE){CWF|OY$gP-bP5t0XOrE5S-LOe53Kh>~p3(4SP}d zCBiT$KoAeZUyu}!Hh&}>AXI{SwhZ3eQUQXc`U-^I`>8v~)NP*aw^x+rd1)oQ@F~@l z*}1x)awdh`u<6DR-%2PRD|$E+Yxfu2fotr9*Mh}m;4&UWf8jO4Z;CY?%l?SHoAYbk z97BeKLP5;WX76C=)YVX`ZxkcRst$;QTWx7-CUh#nr`g{g_q|O%yNEmX9@Fx>1cSpO zd^T<6hrFuzf&oE*7s@p6mQagUS03CJtL(e=luYTCAQ}4g|0pEk3STOFOj|rySmxJV zll=lcu>0iuB1~6gMf*;iB^1gn5a21({S;XL4u6SawZ{=L9Mr%hLkN%`ALNX&>N#He zKDwx$<)t4IgjdWQYMc_|7$yVvtEzW9ki!Y6ykrm;e?dLlBf$QkmsVyou(U8xkLMm z*v(a6HXhe7!%Ght94dn5!#dh5vta()nd&azha?xE>VQM#O6U*R`{$>uZV^X71{Sd#uRtOu_v^IYpJEgB9kJ$ z4K+X`|AHI2M)M;^!-%t2@nKhgLj_L=(<{w>TEE5qSV*k+y!i;EmP1@5Cv&G;?qb@C z_^~M%pLR3LPSm$1&qmc)E&pN}oQOC8oXucFnk{dZGjD5>+9Dh9rdzS`lJK*?5Z}D# zDCE5%!{kfU}yEWVs!>B-H-K3&$^M-A@N>$c)vv&CL4MfY3C2fjg`@uKq zF&H~kH?v%XD?XTdy~b}|<9+i8!jZT2DR-W1>X{nf6qCf~x78cJdnAuP{qZ#*qSX7y zkR!dk{nMBVsd{7sY+qKLm!N)EPk45ku#9+*20|I}&wu2jvP_W%;&nW7vFwxr&4`^c zzJ{$Rs$ZCSX!RKDG4=eBOk@3_zZX39-IkU$L36slrWzn0>zq3!;N)x|yP>~Ex}Kal zfrAuTp_v7Cr&vhR^9>P-9=>h$Z+X8`22C~ z_;aW6No#-2R7IrMTo}V(Hd#{>$xQ-Uyfe3tU)k38=c3h7zDA3a5;zYD12cz z4=&lkCMsm|cCj$Wv;k__NI1J1dD4jEAlgmO*JGIbp@RA zQm<&i`hS2=_GDt0DHH*pcf7N*WaS_E6STC4cl?l{45J11TXUFxj-^@kj5>4vEw5t( z_fu_aFf8}#4HCza8v`<}`4<<^!YOcKc8%G%sP~`ho8fPkRlxakRRneMwCO_~d*5Zb zDA)#IQ~gC02csfQf4qyIpz&Sq&wBSqt|00PZQ#KsUHYcQ3h(ehY?35K4c^{P2n|s` zOQ%xU3W{`W#fORE!86RtQbDIaQLc=?jfgLNSC#0jM>+tMSe`0hPrjtuHm(`JfwHd1$CS_ynTIyD#?=B3{NLSg1U3lvVjDR5CG zvoBaQtW;lKr6qEHP~j_ z5TRI;9W9EjhRR?IEJA%Hl#-C*;Hr8wm+5W_C`HRk!G!aIxg}Ls7bnj+R2K0Y={Z%i zMoE4}dpRokbz88UG3@XaqsyWCU(F3#S%wmJN4TP8h14R-VA| z*?1|*))Y!l-_3JYr+wLZu*QL6eZ7(M+D))5s_duc)v3@0)`Vj=aXV43f!#Z|dfTO} zt)h|V=|I_{V2(sZD2atl82ehA5-Ca(f&SpfL9C%=C|_xmuLevd3Nr(OlpC&B$>)y! zV#(`7UbSj<<$mqd-Ztm6dDc%ZU2RgJ-8C<0NSIYdlB{${j z^#nu!&npiu;WUO7*giNQWTwBaTwRL4C=#xEwLp{HP_QgU7A3XPmljdPqNB%eS?{gA z;av9fym~KP%Y}>5#X9wrXm8J#Z4{T-z|(023j%-UO%;`jM=HDK~k?c|yOYt;NQXD##B-OjsYP-#mJ)x5vlLT2F<@uQY@zT@F^bW}TUOEku#1SfywrxY788jgxOUn94w?SkE<6HgB zB}~rmDAp8Nq3zSSVB+~$)zQ6Il(kkZy;zA}`MT&d>#zOvw%V6NJIhB*v;Jn2n>H8G zM&c~`G~-;*I4y{6lBd)BEU9No`Ym8ZE0Q?x__wy3c{a95VH6d#K{K@@ZQxOUU_+Td_Zr8IL>Vf8Bc#)i&y)$pLC{nF zpw>m|tb@eRinotd88DN3D>n;D-r7%}MtDK>W`>O%EjS!H8+!rYrHt>za_@bV_na3X zu-AgxX)ZK7h|LVPYY{XX>)82zfTKwm`LAJDR7@a(MK~E#du6}BBQZI(UCV`t@;bt) z3Ba0V_jwwJ!U8|F8X%j$PdT0&S9z}0d{yW=65hkX#mu}T$pVZxKpJQv$jBYyAMqY8 zogV%Rr|?zRaze?Ox!1Ujjuakt-=|CUg~hw{#V)SRj@Hlk29y*(BjZhY7gf~)yA&dP z3>oV<;+);APlk>BG{x7auI%O_Op8=6( zn~RlSC8s2Uzp?JtRh*A8iZH6|#k!r`m1*1MZ(qg$hZ^2rjzC9PjW{r3-JCL58)l^m zdT~*`3{t1*a%n|if)}|Th<>a3OeRmR4{jlRd_8#&{S79jkj;4xK(|?frb20%KZ_Zd z{xWC#3rXW|WXhjq;kyD6M1H52?!roj&4d>7!4twS8Ya{1)O@9%mf63h6V2iAHBG$@ zF^>mla;$e_jlb0jY=AD!y@-L2t(Xq^&540?>J#Td;@Wx-nXK5dscL})!4fvE69ltX zqF_j;I} zG5D5Esd#UFrELIj?T@(azueipA^R3sAbD1!h8LiOa|*+g&pbJh{jdOIVtRIgQ03~1 z;FhvT0c-AZ#4b2pro>)v?I{v<3{9wgcuVY%XG%$FRa>u@ep!6IFdT=mADbd^G0k07 zO%sy8Gi&Ser*b%W0M8Q;_g@L}bBk=0qE@y(#Fg;%WuSiJZ8 zj@O>>GiBOuPv~j_SJ`WiFvZm0Ag0J}L`yVZR0HnNZg}uxM~8RBB_uaTF_owsZof@_ z4q9!OzQw0yU&oCNZ#_YLydCio`4_8@kthvzcN>FUS_1EOTq>A9)3IrBJzIrflT^kV zO{1KaKd9r))_W;LzX*_-V5x>|v^EMq6~3QvVu$}kUwlK}p(WTw$Qp`2IH_gZr1(SJ z%OAUkBHN6~b>+CaFw~E4@V3@nSh>UdCPiVGu6UL{2yXeqY^Y5 z%DNF1Awa{&X&U~}IPSYOLLOV4Zb)ygqBc1J;p*FY($d>kHw6J}n#dh8<~Hg1ZiPCI ztvovmWpL-+8@5i8!kv04Kd}f*DBW0?9HgFQ&@gq$Z< zuhYqf37YBi5&x-A0G8P(@z$WjwB(O8icTBCHX(`Z2X|>|o2Lpq3yTjGQ+1cv7b-(> z8x2B(INZ8w<>{khW?_Pm5Ze)r#ZCxz1GIs) zhi^7QW+FzT5THMnO9d;1UY*L7gp!i%QjI2KW16S>ao0&yMd+PhBUOrSO1RsD>Ubyu(mJ+7^Vfht@L1_C-Ae6Yz2z6c`ip|I{50#SdZAO%; zUkK=4=1L|OE$wrb33A`0g_9>WOl4`Ga*HVvC4jnR49<+mMe-KwLM!TkcS1jRqp5pa zmrZ4isk+bQXXcDz#~4`&i=UB9*h^W{B?$RWu9f_eXiN2sqUMMbaWEyC)Nu&AO|KK% z#DGo6F?q%WxVhBo)k@4SaY6c0P)*2MaiN6c(oGncIMh@-KmX;Sy3_NM_jA}H!KQ3- ztf8w~@p=7wBvd6g7=(k24M|2;L_Kx2DZFaAwv_JME9^3vp^e0D3a9CzePlk__7xNI zl?^{O6^`c>*l{F0nvA9ZpZNOWS!@b_Pgz%Vi4OSUgglNYrjE=8G&A^=E00(i0CCg) zvV5K(&uX0}Pk}{1_z=Rox78%?*Y>{l#HzI&h(J=A=b4CSs!{K*T_}u0~&5pt!en@%h`Xpv~6Q(JMIFay@)JzHJ3HiZ^gn ztZ_GjOdmX-H`pHa>dC^$j#u1Vag5aOk4gGy-nR1TXe)D;>;@JIA+hs$GbE%r?#$cj z#4px}Eo03RtZEjX-5+;)h;YtJZxru$b2BAg=Nmd@tHfW-TJ<>6Xw0C69hkXu>S0Ni zj@BEBs`Y*gAlH?%H4}3nOQl%I4-tqW+BBy`NOKYkd5ePI5KzZLHmHgI_`Ur5S6Rpg zzl9Vg=6vrY<7tzuZ#HZOD}h~)kKdb%$kD2eZ(%dtB%s0}>=PHC7|f5g`o(pD3*M=t zG^Q+cG7hA}f4E#kQ80qv?s#TYfsWB}h?N*cg$=QMqA=Eb zkHnU-aonK+f)b#ld+hZa9U+&nqZ{FcbrLL-KLn>!eK||IAsO^ExHyPmJd6@()@Er* z#%iiPyJg?5IUhO)I%$d<#^KVy?p0mxWw!CQ+>EiJh=V{JCg}KT+k%q$9t%uSkj#38 zx3%=F*2=l%$p?eBuBv4dlJ}YHk`5oM8sRvJe{}RmnirfOLG8_jxdu(mVmJ~`w`(Oc zu_Z_f1&y)xWjHxIc1Re|#;v`$wM)QDe_QB`$h;C$9>=YD9m)gFo&`feytWq)aV}?C z#;3XUnYw(xwtm|sOe*`Yhxri6s(DlX-W`7&1$iJz@>&@ZP4kr^u<5_qnIQ0)0*tXX zkZPG6*QMLUYus*qR0p(K`$5}!*G1z@?b%Mr)6V!{sw}Ov_Q$ZDkiMu!s_~1!YU}-4 z1-B8m?sSCinT$F|g==+=cw{X8?ycgCGWq@dQlOmd?Y_w^+Q=&}+=8@;cNL=pep&bj zm?L>gC^alPM88e-B8W@GUg<}|4nwze_~fmOyt%jgtGsHfcl7OEb`J%$zW!J=iS*3FjVHv&7Tt_71y%|H7V6I zQ$8?SOogQmzS`@?kD-#BzHzF@5l9xj z7_6(XS10qYy}DPg>fQ;j>amNbv?Jx$?cm_l)OL+HkJ72sKQIHJGk(chvO|ifBkM-h z3d~f8=u=aoXeuHYMNK3FtoSr<+OP1@Upd3h*Vqd=!w!epZx##-tQq&B_wbov|2SE9 zk_CN*wfu}4IGu{`5CYu{oO__`YX0_G0V2WY;lJ*7u(?e3=7$L+akqQM3Ji&hj=Ob=K`~jT zGgn_R{ETnQN$u0WrfEqyl75;g(!dNHK}WfIxt}5@I*1Sihw`DKIi_XSRZTn-yE!l$ zux7qMGdJ81G6or7M1Sb#nsVxWDK>!*MHA1Gv15CyhjYzZH9(o z+;rt$y5n?iZC9(6ZR?{-II6as9DC?=<1L)`nseqPU-Y&vx>&e$@l#5)5oQTJjp45a z{re48Tp%OH9A)yh7BAk$d#uYe{kxFl#U(SyYANT-s&UCv4xQE2T2)-{Rxx ze93)a@=JlCltI_#t~sNaI|D3}@BEU?!i^U@Lu!7djlf%TJALsHG4_W3rW9hJovYh~ z9M#j8Td_^yLPAN9%ZD1KlyE+>M7XwIBx(*XlF2{9#ha%NHJ;C@F}3Fp;q>x4el!Rr zsJ$RRyMc@KS+zTzjf^QjF^uY zF(#-fW3^wx<=K5FO-SlME;h`R49l%y<8M%_M0n@l3?IhI*sZeafCp_+5>Q_ZJJ0vZhYs{%`ZO_}~=tGOG&9YSM3@2s0*achoB5~_Fp72et} z$ST{ssatBBh>{7x`H$^*Zj?fO*vV8KK?g|1H;iiaOL3K4L+j{RL1VdJT;X&;#BcAB zrt>Qwzx_Xs6E3sGG#znVh%|5`CH8nOY8emN%|{pjo5Y#)*ecjVq`41cgNVNT8z4Dw z!%~M~IDw8JypJ2^aC{cGB8?(M6ca(DJ;hY@@XM9Ae$2tOwf_WhJgHUJ>G;AWoY zpd$qPBz}x+DgSgq6ugdI1ILbStl`u@88+gm$zI1^vvKs8nBIQdd6W>4uN=Inn;E&o zHq-U%!79N}?&gfk19Y0ee&AqLu1IwlDcI3!>#WhdUU+9v0|vEggfpAaI6lZA=v;J^F_z zek^j=NeT}aYwww;WP$JDb)Oq?-)T4H+;`dPg94{;0&vb5$GB`i2j)2=?k`ik*dc57 zKFb0Ula8p*2)!GQErjmfLC@I>&7y6n<|L+^_%%}<@n5HDyv|4JH0a2=o1H4n)qLM5 zRL8l*vmqk6A;`0VvUM-+99g&dJcM3b$$ zLU+hIz+5JlEK=%($7Xz5Q%?8iP9@4?N_D<>#}cp=X&Q+&w;?E`Wsp-yn$cQk`c{-e zeb+3bEhc(A^-;5mz(dj%hlUA+u|#e39x|qTs9fadla<_4#0l>mE!0!kNbE-?e<{k- z&q?sag8b!Q{3ALH{?u0A`vp5&bpR4$C}wqPCp03`jfprynex`|;W-FJgW#sC&C&0) zZhhD{%XhXolY$N{$R+hpgF+sc)Ng0c7qNP~AWUCNA7^(g}a?xAae zWMaNEjk$3Vgz?2(sEkd#z}SGRD7h1_2!(0(!BXre$#I9y=n52XE%~a!1>O6#jGbQ3mm>}s zzr)mycu&fF1o_@tRn)>l+ka!T)cQCPM#^~ckbGg@D(IsKTI zfY1rMAeela7k=wjXoEA%iK!Xly?sDJ<1*d?u2oxQmA?J^j^H+Fv($!&PfQ?&0w^@;QyS#t*)3oUFpIp;^uiD zYM55;XCzR2=|^#W9FJKg#1=&Mws+u{w{^DUcUkDK&ag%}X>JqqE)9)sWK>o$Uwi z3^NB@R_$pg_3)j(U^bS>9BI`MO-O>%fsMj}^?K8K8u4o43R|^9dX5oPBcjm`kqC*a zJTJT%nhTPhZ{lD%i9Fa+PRWISNJK1$bjyl@Pe(x?;zt&F)4psH$>(yOd-a)8?h@BE z%D1b;`y$Ry6&~cv+2C`PY3E+Lj_VObbj^hylu&2da>~|{y)C?~YAW{D+(0ft;9_^= zF!5JZpf(sAA@VY(HYCo8BqX=hqBCF~5BH&sxrtS-vyDs^{wcv`UAig8KssZ?L1S^W zLvtkLn(G+UIs+W1T)%QGXevW?s$Gm^J64833QNu~M{HfW7)$LnCTL8_UvjE+3%9Wk zQlf7}$y{rqbHu*FW!Ox!U*}eac$epnruyb*e`~_)Utgq2f@^_+?Iw}{ z`@GJ3v>3 z8*HstTwA%F7fGLPsjMz*=ud#oo5`z#a``exIo4BaFk|~s3V!5%c(+k@!nk2ve~P$OC*{)zZ>zQd5#~S zgsML^A|blfZ~Th)#G!q&lVrb(Hs@_ERCaM6YRVYp80*l1|EbkQ!>#^8RGS8~SIUb^ zMCLm6mFla(`+xtR;9V`ao%i7Nf;XJPz3*~wY<$yLs>^MGZzp@SL3R==qtyS0(u_AK3S z@mYm^HP!i9Z@=cY$(e1nQ82K*3@&DWdib3W_UpkiJ{~`J?pln8(R4Ee7bgHeI@+VJO;)VwXp?fW`F#9Cc^JCvm3YygNdUl zEs za+INDpAe!pZ*#d(!#)pZP7*O37Ma6~KM6YB^Qw^OliBAV%@hj>nc=n0o#4l~ep*?|5l+>iK;CCEl(nPt^fpUK#C!I{YflrT)~3ikGo#!y$pq?2230)QV-!TdJV-vp<-3je z!O{!zT45mk&&HULt$%uW))7)zB$VhJ^)go-o(T@B;6n1q!@@>Y3oyPBwC~Xq)Ak}= z&scc4ol-BW9)07IF~pQFV35J;eR^@VUI)RzUb{gQmWjQIQ$Us!WJfVQU z%lCAQit0=v35ImTNEqoq6P;svN5;xq{6d1XZ#f*)QHvL~&n)up_@36#4c!JEal7!2 zZ5-%{RzLb7USNb2WSnrzVC2Uq18jb|&zZmWVN`0*&AFx~xR~7qwYY{^T1wkjUCx66 zD*B>J)5Zbk-U>g^48dq28dKkd@8wr^99KCzrWV;f3+7dX#lPZZH`Y4CaSpaDJes|f zmyUyrxAnHd@CWlPKQj`ClWL}=D0MlEXw(X_LtvHTIRC`EV;7LgO>Ks3V4oW{s7-&Y z^|k&OUa!c3Hc~H3^^#WBWd8uawtih=>T{5h6Ph}ExT%y8P~`2o45V_LxAtBsU3Sye zV3Cm|=djA$KCUQG_J893pi$;q#9Rpi8A_YR4{A+<_T9oDXN$M8AW`V|*EdNEsn={x zb||1Yz-ql4{QY76g^(3S7JO&vv6q6=No%BPqCQI|+zd9xymd}(++u&U=$2r@0VGs3 zoyn_E<{A9)T~))Yrn)ei^xh~!zp2#gxKEm)eI_#dtj1v~l5*nLKE=4VVlY*vYjB`WG8L^x)i-3XtZxm!Z8_&;Bkz6JNfjnYyv9|yy# zfsND&cdyJZZ?9x=1wrqQi=`5{ja^s4hR;sqMzmfAeFiSg)?lU4hHDvk_DzkT7G#;A zKIEYAJEn0-eyxolsNt5^F-|&CEdp0(jt6QbC zs+k$wE#Yop@oGbLlgqu1Jbv4g^e0I`alMnXn(Lh`BYvoPs%!!$?L7Z+D=N{a2k8Cd zCu(Qc6>c2ubv&S#>L6qh)W@~o7E5>?-?7`}g5O$>@H-Zqj)VTRN=&M&^lP0~=+Mu* zaH-Uo41X{|{jz;3e*pVyMx)7Ms@Y?>w=nQrFQb5M{!yFRes2U92G4-qR5_bb7% zF`xV7rx`p)Z$n4Qr7Vf^9trzi^GMYQq zUpIk&S2|<(FjWXAQ)4EYst(d6H@JBZ;>&x3vofg=uBx=(}X^S1Ow&~9jJ&>{pnW$ZkbUlkcM&X63!FjmiRI+p-6RDn3CyevBKv8? z`wX2460;D@@TUJIVF1~pMx*%*zg+&1vhy86xhJpwOz+`~CEeSPcde-Qw#K&+&uU{z z?J8$^2sR?o{5V=#i|!t+iI;9u zSW#`gW7e+1r*wnbdVkl+lGnd}kkUq%3D74YrDLGZ2C|F^Iv%!ISK>E@o|k=G7-;m_ zjB$R4rF+&jaTaA}@hDEl^6Q#hSuJzP^>Nj1~2!rt23 z_7jKuFR#3PjIsj8q%wEj!>^&5!u(81_dSS-;ePuzXH-vr4GIu#P--vC6l)Pa`$u8q z@lOBs>3b`iif=CjJ#lv8#ZL8)E8+Z~%T*!%<8Fob|Cp^A#c^p$?sg9M z1evc@Lm%4KK;c&+Hz5kyZXn!rbDnzt57LL|vA?V`xyD<&P@)y(226O%KcWHsvA~+A zNhu4iY6*sf1?Ztz5=f^Jw$0?Eztuf@o znn3cQesxPvlaSaxX9_y~y?$dkoeYmH>=V{I)4Ma9@O&u;zT7(Q#wSYs`ZGxaDtB>y z?3iGl3hp?V947>3hd|#Y@zxaF#v$J8p^?_Z+1<8(@K&BFQvy{6!i&BLVK$Y#a?yla&R9CS zvaxIlX|NI!d^{WTCTK&M$8mC+@V(CXZ=m;>Gd=HN!qDP9h$LwgWfa6c9ebCJOSL_O z#5WbrN3oj7OVFkWn=;~=gp-Cu&<=%aiwbJ?r8-3kEY8?yp)a=EyXxQ6=_enU!#N6V zzbWw2mnvc}`H(`O_DFMU?#ZN{WJ71}{3ZY5*PDIv#_k1Bt~DorD1-PCk>Smf62i50 zAh&5dqP6Y(3Ys5sNePm%BNr!SEXKmqy)7?yW(4twSYwLaEGnS|x_q>x0sR__rOCU? zEIaPTDb5}5bsUfaNwGG|#v3WSNrtsk$Xu-tS0^->eo?Y#h~wtG^kw=iw_Ad%>&3*J z?GCnr0VqG!wj0G#YK>gJ9a|WRBNE+^7mn3A6(zP@Pa&xoLfPo94^f~tP1yj@{bgQu zl=K(Ys@3WL5+JHa~dmZW0sGezsqdJ+n&sWa$_+Gj>J z5rNlU$=msZc<78ocRA|o3NBf5`GXp->yz(u8PlqFwX0Uy(gJpJSG&2Z$9w5}K?v^~ zQ~B538t0{#1G)C?Vs?36$9s|BfWBqDVeWIIKU%NpSM!Dz@jQdH=0@f&eywGvIHy)& z#h{8Pt)U%>oI|0fveA>&7!x$4_?75i!65VUNzQue9u{Gs(}+lk!M@|IP;Qb2kJ-z z(uB-gQACrPrS6AM)zGX{*KC~uzTN-K58gcHG7QYY;jHuWWo%}*WzSQ0ZgbyAD<^O6 zZ}HB5zqx;{?O`H@S@9i_$ewi)3GS<34VT z6dHE8k}cu`5gqnR&OpHqdYOi!;fvix2&eaWxK9r`7}GYY(`4VdUES8m-T>yf@#F-) zjx8`$Cl-cXAI97KLw>t`V(3NzT@8o0&YUPHAM~o3slNtWX1?@n-Y*!^24*fuX4|Vvh6z4O7aqyUZK&3dZEGoc_aae<5Ca7;26a%?ah8R+0;4AfvV1|BNFIDFASTbPBmob%UPM=0QrpGG@)T&Ii&S2|yKoKUsC0yDqRmL78oubG zA#sy_prCYL$k4;1wtBkPP4ju2rJ5t`E(6MCZs~dWWTk*JmrK|Bi7iJqR=0o5dKsys zBC;dsqOEuL#{>|=7+-ywrhMWnOYM~j8kX#(!{QUY*!XE>fxV(%vKw1$P|1ybrMABu zGI0AOyRpGCv+gE73UBy`bd6GVVS2rN6Onb}B!6L(MaV;a6G;$m$4R^h3}c58#}x5L zZBrU^a$|ny%s1F8HuIARs+(81QZE=hjvG|4tX$Gfj^+G~-f=uqM(_wC?CS@#mS&c8 z_fD2zoPB(W#Rlahm`HZHrM%lMh2W8CAR0q_@Hl8cr?xFJ*SOBeGJMPs=sGO}9;v3H z3=uKNrMtr3$-p-g zRkA|E|Gl`TD@SGs7dGDqyZWW%1XGAqxDzoZs4ME8Bw(3{|0Q+Z9Fc;6+G>FC+4V5Z zov#8{BPYCT2YS@diLSF7#e_Cr%g@vb8QgD|@#54JE~1W`b=iPno9oYWomw`57yd?f zmr>#^M(kEeK;+0(+-a};j@MDcg^cDi^$MoJn%GcH0gBO7eh<~gh>L%}o-D2Zg%$WV zRf+n4qY{+_zWC<9oBmj27F;nUs41yhTukD{d(97MN2*jMN{SQXG3`{@+sPMBU`mRt z72T1nqy$qTg8#U50>_L^6G5KN{{eFzlOte}(@sQ>ln2$aj!@{bj|i7#g|R5Lvxx0I zq*I4oJTLhliohhSw-GaSVj{l#ShAE7gcYq-i!N*%ms$om(>pa`9TSlJgOuSAHYV-* zm1soH|K~8a>djntRy3L66^rQ!?HwZf#t5S=Wh$E{D@wWeqr)U9ajs()smE<6Nffsk z8EM`q6(D|B_rnsl_PDEGPb+XSX%Z(vTsk=0DW5N;%PJaKbS zn7Q+3m`*Gb*)|RUD#79p@N|qGPeg}B0K*4<%Svq)@^>rJJD9Dsni78M9T7_dw}8vj zyxF88OgM)TCv_UB2;tM^7&=X<^B>mx(aJ8L;lJ)oT`IP6zIf`=3jd7=Z(ImY ze`C3Z@0%GgSX$lRC_$UwVy6_;?{BPezbowbjQ++M_S=moisaaOg~VRH(bpJD_={?s zih$*s_#0=PTNK&GIGNgwE-{s|1B+)Q3jBtd{<4{V;|w=01!Z_0AJZ(ZnvuOy;9ff8 z(4U;6*>9|H{>Agg3~6+kw(51S(F= zeY$9B?$gUY#;_WuMpg>T$yU$<#^u(rjfFvj66VJFjn(}Pwh}qp?@YnJW=1gIJg2h+ z7c*mc9d8K`>zu{PMzIkkEt+=Hb0HzTek_|Dpb2NXFfOJYH1e2}01IQ;dG?OBo3p7! z!=GR3yB;{q;%r6s8578Xr6?S&dj#=0*uC}v{VM5iu&vSG;C4!b(W#ETgfnUF66ax7 zpGu4ytnDJCJh*qOUpLj!-ToR0FHB1;^+wy_^|?qM%`|c=83ZCoIve?ta;zW0<)Gf? za=mA)!QVcC>u3v@Mb6tYe{!dppHlWLf5laiKg5(sClu3*#`pduEXzkW#s6RHn$7SSLicX^7#}8cT5`#F|@h8O6`Aq^m(v{n!kgHK@mSr;cN7kg1cY`s(LegXGfk?QmiJ1C#eyr_AxTtL) zS3Q3^K|dVyF;rFIW&T;Vize!D<+t|Np9a>Yc9tG`&V6qO4mli-Xo}e@Y~RZ*CmQM3 zmg9SUOGOU^w!G|5%nD_i(n=$Rj*SpgAkbF(q{aw zv_nTDKGO)OxP&vo>!k0H_C>B(tQ>T`_OZ#7$k`pu9S5W13GAo&OmixKx%w!(v^Gfp4@kgmoP5R7*d7d3R@5@<16}tyK#v zyjg?U51BLUmE-z6U46o%=`*n=OSxv47xKYqUQ}PNvb>okdD&ZkLk}(<`5WsQBG2mk zgHA>I`d2skUAo9_6<%51aKt_w$D2Dj$Ul+G$=;OXa;kOYwhanT;)gsiME7eaXXhB! ziRlpIDBUD=giE)jT+=6U&;O#`>}PmM=ePS$FZBC95ngkRf=t&H>jd}P!+-vOgd}#6 z3iX`DL{bf(BP1?Xj@U~-Q0q^!OWPlgJk~ep#}yy<(r*GGQuu;7rG4>V;s4yH6%oB| zXllP=DRDE=X$hR~%_oLoBs|OJK&EbAe0M>P53imEdXckBP&>zmZ3rLur?(K-?nTGz zPU~%CEq^d4-sL{}F6W=|QGczIwIBCut26k;5c>whRr}bk%qTgFSR2gVa)l%$bhSOy zactRzR;Z=ClDO2{RBVRWmeRks^GXQv#naN(3!e!V$#u#OU_7t<9av7XX)k9E+i?mm zezdVT-1SSIv=n#7pAQ=9{l*D4`}*iCjge>~=fI`h#d>mQIH)3uA0(JJey^AQ2+$d7 z98J}5q97k;n356KvJUNS&*vp$eevgO$*ceu&kPn7yAhRxtpU;hlm;f&*#`NmzlXX~ z<$5rDlq&|s69v3H=ylZ50p$>{qF^~*Q-!~;eJ{;Z1NP9@TDvkW1AO!!M0yEKzZaNj z<`ofjvSQBHx0KNA3+l=(SsnUAKzOv8VgH2;B>v#ASHkWOPxsqIwNcf)H1!qobkp~; zmNUrIf5%B1-oP}{Ys7#San=fHNJYFXf|eA-DEmq! zndqFI!EhowFxp=PPkJ5Sg^39*Q*W})?6piV#D#}XZ?98hGIx&p3pbi}2LE8;;ifd5 z$}My>WmG8=qlC?b@|64!jyaRsB;aW~^Y;XO$-tJ=nHXyLCsr+c4nuHp)f~rR0Xep` zfY0SP?McgBCkHf>E^UwAaPb+u)+&HjB4 zvo^qWv) zZ|jVdhcxr-_XKlJFX~=E`^<+Jg$Hd~!`SfrB<4==nw@jAF)XVhy8W^2D76{Q-(ZoO z{jLk#?7zngcD~{wPE7Nk`oyZkhc$zmqTsCX(0mcwsbj`KA_uq&pKvi@QGB*6W!BL?8nzA!Jp#-8cKcmHFYM*_@d4y zVR;I;*gzTz6pJ#e09sa`_P&#kTJ3J#*^SOKiUOUdx0$2JbWn?{mP-l3dov&ub&`uE;==Tof5q!4}5`S4E zvULzwWmZ>q)16r!u`jo;RXE{)UvyXM_BRm@o@wp6J#S22HUB?fIP(92*vR$q_y4Es zefj_2zI(TJXT3{Xubwo{cl++HHw*Lh|LsQ$^WJ*9Fz>#%3iA#gbN|1kd++kU+R1(Q zKm8SK3}&=>eE-Fx{{NZ#$!l?ZAAjw-6u8V_&c*zne&fV({k3n7zb{xF|6A9SX=fI5 zDn3$}_aOhT;eXBjAnRiJoDCD;b)A34Fw8+h=LfT=iBg(f51T$5+Is}z5gnp3j~zeQ)+mt{nb~&9W7Y`n1D>tKvl* zBJe&r612IESjydZ9&Lx`swq4P4MilCxouM2&4#A$sUj6KCVLO}7=^bF!OQXTWsG6_SF%-}*7Ip!NI z)F|1q8sQnlu!YUcQEfL<-Jgcp=d-6VMUBaOr1pI8k%i?*m)`$^9NV}u^&A6d;&E=a z;bjaO16H{kAFAlGp9S+`>&cDG#CEnXdrv(1Jx%z6VPH#CO1gdl^1q>fYd&OCMpQk5 z)IW(tTBm%@O5&#(266by;qSlhzK65C<3QE+zeIE@OAXQ7`mr1fVw(1S4R8l9sU0kmaljAzeaZ*eCdbtCSSjb zhR6h90;!(a8qo%gNW@?k(x^etd}hiPm4i#*71wyFg$-pn`xm)&3!$o0zK*gW-U@X#l2 zi9V+*7pFi^1?mZ8Z{khY3j5U7&EX6y8(wiXvc66pEwtWmvSEdfm8L`9p(y`I~d zLhX(E(ygJ5{T-fp+fk8c-mZyKMbVr>YZ8-)b+qpUIBuB_eSx*98M|lybDP7(Kpc5} z5=+&)(mB;hH$2z$hLP%C-F0)YD-G~^P=RrqUl51=#djMQaeT^E^NPTR9=Eef@nWL_1kCWC69bymkt`fLSX6J@#4Ap zeNP<47wnc37LXtQ%`2F#kaORm={fX4H$Hw*-xe}Bfb7Ju#W)}u%uC$5`&_|#n6Er@ z4zD&8wJ*!hqw*j-Rm*`2Mi@7e?l<a`QwEAtW@Lty&ANpNy` z)-t8$yo)S{?UNkAG@dN`!s8=I9iFc(WN%1K)5he?b$lWWP8z+Py|&J7Z><}}Npcjs z1~XM?u|x5FjJGSvrp8qmu&0DjFHesY^Ezb+Cp3r_- zp2+|^ypEMxt0oR`&Hf6O?DVJxz+Te+M%qiC!wlNr=|O6 z&x*x6HR5pXcp5_d+L7BQk*u&p_n`-$;-!dODt=DfXc#kAm*#drljH(Ug~N_{6fkPM z%EGFfim|<^DEk48(H%rFR5Pla)49O9VGsnRGhL8&c-kMJh6cW@&dQGHp6QK47C@1o z_)=7*$yOoN$k7iROE)m80P8dRc?Jn95Yw^DpFg9PBIa4e@Z%|r=iiMilHJHZ4sMOt zYMmbfRNf=A%ct+n-;rIWfEQ-}?(*#2kcdM+Y`;z0sP9#K6IrSV)G`Fb(fnbp;V_&& zbw&*T6@a8 zS_FVBB$ufnTkh`3^v^g-keJ`yu;tiC{+Vl7~A6|CAYV1g?s2i5p93;zDi&RJar?Jg>zAWn4(7%<+W=BTf9nQq z@WWCg3Bj6_6Bz+AJL9+*W-Nn=w645I4OyNyI#SM z?q=Q$@3wtUCP*YAglFHXji$bYPZsxCk?JcIqcRvRr#JBF7QJSTTA-9bp8VE3#R|`V z9ib;X26G1V2Eq6`txc--FAxU?BX;Ob$_9H9rVGit}G zzppm|<6Ki%A|SGJqk(q4ZEgB5XP5Az*Fp69v8qv(+ zrP-Hs1NFxOA8>(P5Dhx)+dDkk_tJDG)gEPS$(H;h9%7z6mj`{0&h=Z-5QYtF)%4xf zHPKb}H(;}~uPOJ(Hk27mqq7GMo3sA_02w#_qSWCsTnNb{2+?hCVZw$KT=xCMC75gJ zyqGdbl}D)ZHk+C{i8EL+m(I7#fkg@{d%S&MD&HEsO9Sd1I(l+ol@uo;ld>}j>@K~kk zgBscS8rf&<>gDK%~b2R~P~A13RNLyF|glH^vDCc2kEAGZFdi zkF(!S1G97<2$co5#2@dhf1rSN{9R7AZ{E#JV#X1%99=Y7rGIE3)wZXsdo3-Z{A)D3 z!g6+CR^<+b7j;G1zi=u4^TJQ04$mU*ingg1b|Cz9rFn-xbvFMx z7#GZs`JnX(xXwlx3R?@v8HN~3GT(>%aU{K~ry-K3xsdfqU1%HJ5_QaSYGb8>{2R2YDKESDSoYcHO6+c*786QYg2jp`%AH89 zuR3?8L>U{4U}mFZOqWiE;%#yABklCgI?kVbTe08PQ*c|1L)4)omHl4Fay6lQ%+c;0 zC2-kRw+DN#}Y07v&BcWb3srJ1Z~oZqU??+SvwCTU&-(V&sX*hWAv_mU%dT3v1iUao+4>g<;OS}@1 zjG$#OC=6fTspgWu3zn1|nogHt4M@u)=Yiq(z(Mf}LQ~EYWq2c;tLO2ee)X4^>Mi#N zMdKs69SLI8@ICZWs0Y0)w)%RDn^;)^)DT#CX2Wkr^S_RrNQepyWO`2}Nr^27GcAYv zFg7vBj5Gr==Hzzih4hNVkIkVN&~_~Dz!I^(a2j^lm_zkVx&gw)Q%F}5F65UY3| z-k3TznpV7YAh^{Phm*c!$BV2)qNr>xrWl9B)8_pq^RT6fd^&Bs$nQZN@$6Lax(Rmr zkKb(jWiV{l3-RK2@j$ie30gMiJS;38v}UvC95i$GP%E7$VE%Qp2KAcMUplWdCE!vu=E( zZtI7;y;j|}?AI!sc8kzwAp9hdPxW5s;>aL(5FA z8N&ps;s;lbYj5jk_w@1-bfJ5WYnWJo{aOI%v$OWacd08NOFzprCyE(vX?_iUG@gad z=@LSDMtK3FgxX+fKA4IhD6RBRIMu$6IXFO;R3>ic3-KoIZ$&`GCFP_gQtKU9eyjv6 z3s<&EaO%;sSw=wifti{$>_I}0pb)+g6R>)+Vj##{iqmf{>YnZ9Gdu?^3^-z##Z1Bn z3y+(FmsXr`G!MUJHx?@R!{a5L3pxw3Q?1>gZ661=OozM%vro)*Ucsqa_@2w5z`_Yt z?;QxIEGB+Q)+X*!-mbY=!=2?|8w(o^ecuh?KFE_pcZ>fp2g!79!Wue*_Uya;+LUgZ z0*3IdL2nwGA1Hu_1(M+-yv(7z0WNB%p9RdWW^G%$M1RctFA1axbQz>6(B)PA5nuj; z{$lBPn!i+*^S10sy^>%3aVQiAI6-=sHdi;Hr*mce!Mo!;aIg9*PN&n~tEtz-hoWu^ zhhyFuHE}*}v*5F5+(*JvNWh`LZSAW5#M0ZVXM3yH2!mzQ7pCxh9|k;GIpYU1CZ%y} zhi+NJG)PF1h!p0+1N@?VDd z!2LGEr|L7jbSDq18?T4=0sIEwm2xda&*i%l~8DikRDZ9Z}SplI#N^s?6O z;PBdw)~(sa)AzPteieJPv|Vt5HsFd`w==bKwp+@BGVMYRw4z$h;ideCU(wHW>xZp% zM1!{tt}L36uq4KY!fxuhgBG+)0ucfpj*#%_8<_ViT#HX*AtgrBEy2%@q3jZ4BIE(~ zk)C`_G+7pAUYUcg-?E<)-v14Bvv+C_+CHX1t0JMXokCODWf~y%Hq#Gw<@k-p_aSIm zmO7}%{GrT4@_0J=$nRTqcz_?|aJH33d$Z3%@X_IVgSr^}0fE(z?}oFBhtx?B59)}A z*{_HjG{-vPVbD8~v(U`o8DUU2)sG+M^yUn4a`C~88JJvdQzm|wt9sREH$NdjICl(j zO_&c#$-L={-!(5fUnG8Sw5)^Shwu#$Pt&{V^SfLyO)tSTFJxR5MWsD6hIk2*XWU%i zgB6M7pfR}z;#A>dH)l4H+ zjy{gis|VhdUU5^5_8s)=LJu1=;`M>Iz0)q(J&>%+b^P52Xgf4 zgKBD+UVZazxLA%}CF-jiTf36~z;`F_xGw;Vzp~?I@rWJwd7ZXhVNBNIfDE1@8|;bY z5YKEW&)z|24urpxEfBgOIx{drX9^*e*+1I;AE8U(CbP?*Kxe*dx5RlIiQ%ZfRNKH+ zZbc7*7x<6R|M2{BOP-_>^`p(7TZM}rqbr^J8Oiw~6bHhNHvzP0HTXP2s|Osd-pD3D zf%-5}W+0kM7PQSLqSXWMq}2m|g;r1cED(HAM8(wscjI{b4M(sv3~j3-uO9!i5wB=4 z-*FH$V#6SE)W$KShoN@@@Bia)vaKWIcvm{sO1s%wUP8Wz>|+%{5^{79Nml`eZDoYd zwS;JWWM|AH`3eJoc2JFR!V8#{9D9Z0W+*lO-0Q?_=9vN@s%b%@JPbdE?NpCMR5)U! z_R=D+;|X5yw$7X3BaBKOJt&5Cu$4`qS0Q?d@m28&UivZK;~XJnIN|3J)jMVCb+Vbe-D_#Sd ze6;m-Q82$hfoNr=(06&AS8AMQ91J@jVFj2L><LUjC~Az6Q~bpcY?R^rkri!RYDBH8Fad*~87*@ zNLVn#9=t(lEMUmxU>=|7uTyAY&dvM9J56pCA3#Uhr$+kBF1Fv53vnf=7_a09T1RkY zp*k*xz)NErOPexOGGl<~LOGrjd0JFnN$rg}F>m!}wY3_hajSjKUWpgslklnNNeEn# z+G*a^eW}`s%T{Ipg4jBC)VxRIbM3BRA(R$DVRUNtp!zkM*{yTd>H+}jDvF!{jZbSJ zGVo!U>nPGN=9FVDB*EeM@>iz3Gk2TfIa+j7+^^D&fmWXx;Q2~0czsBdQ~$+L|IsnP z5`M#<{H^sEm6dWZwRZPvJxP?9BhxUtJf>lyqqwn1y1W2Wca0@myQ!XG%fIKiJNb5J zz(3;dF_M=6M})|%L?+g5){RBw*>8^Ui>8u?m1e&xn>YE@yzK8;ShrtW4z%B<^Slr7 zDnN0B0n2)*G80*`GB>6|QX zUikbK@UTuglDvB`3_lNb-XRi>e9D{ir}-_rvQ!QQ?z_5|sBJ5cBw*je6#s9r<2qK( z9BbL%(YPG;L)kwg+Br&;d4z@|dG;wRs?)-6kUh5Q(cb-qD3}nZM3crNK9;zOQxj+8 zB`P4#DAuK%xfN?oRWHj!sX=li_yJ50C;s*gk&^cjJUGKlkGJo2wE+Gt)jQ2Bl-6Dm zB5V90T3N|9Ed*t2Bo_|^ZJ63Rj;**TxUHmWPH|$ApG3?UICPpDtq$vmRn0o9I5CEu zRXIq3fuxnqiXWW5H{61kibgF{15$e|T=xbyREWUqxQyQ>G}$_ve*HB5Az3(8r4{ic zG!gnRM}l7+>D#PJ3$i#Sz!H+YCTiRqNi>&34C)=1F@K1h5WyuBJ9s9DhpG4=ly)!` zKU`8dw{+zrSQN!BjNTK;e;=?8;20aiiIW87&peH_x}_J!8Sf!;jU;K3Y!auf>eY)5 zSjI1IY$=+SX{aG!-fv0!Pm@GbfQ9NT920Qv@Kh2N6W`~yhOy0>+oTg!ymUt6URXn& z?8&?**z%tKkoOzkr4Rb!yY*+qr`A_B)SuWEZ-`bzZzN`tvzWZs@vEx(wJ|T169 z{b}uQB)W0QP3>)+dC6A6BXM1jB!Q%``f7itmzFuRy3tE-66{E;OGdjt}PCqor}zX-)4tYKNsP* zSGVkvyuA4ONh||eV!UfoWBK^_F4CsY?rEKJY<%nJyjXkX-8fQqk-tUQlH8Z=m)-59 zvx;G|;rlzYvcH*p-m+(?Zgdg(Us~w-7%%S)zc{?g+4tneb>bl&15Z9f`>7tz_t~A= z3kq%YTkgxQ6F#@}w%-OEI`Zj&-umMv#6)&awiNkZI`NTn_eg~-tswU$qLJaZVjvfe zzdalPbKLFQxD7QI#}=rhG;oH}*(EwdNis-JScVu4;V7j$VtF}IaqL`DVHZwr^*JR5 zSoP9_m|XZZSzDDxW*=_2acEk2kEkU3s4a~slA@R))I^C``TeXnKFo@k=Mu@2d-@vR zgSo5_;CW0mXOGix4Qe}Y%k7QqA80i9JlRwI?cfqW$*vj?i1}K@;ky`XCiUk*7Zf0$ zJ4sUIPl*6}9etv<4W+4>#C3J+8Z~`!Y5V1OdmTT~Pw3yhgo`<}`1o>dVQogdMkJ|K z@!O%vr1+jmE&Imq^g5FIiX@}QbD%!IfU;sA0VFx7Mh`@X1<}649Che`W&jL7DmfT1 zft_vX8+)b|kn=}(O%r^|JaNXrT-x_%q$Yhe(Ph@Bv<0><3_$OKEj zA=)R@zq6>dG~-aDH?zo6(%Si5yFcAJJ>^3wWV*UQuBX z+Q2D0<>r&#ax+MG21N{n!W2(d%A^U%AU%){YPd_h7a$IAf-3npoX>E>tu}>tm#7QJ zTER^g7ttG-w01FDIp$~Eo=BTI_e2}^oXA&@Z#M8jyU&xHk#p)$*PBwPYyX>BJWibB5L4+1WJFJ^xBa~zt!kJ*jBZaHf#kr3w)3!!;bN7l z0Ylh*b-3?pNZK3OurarRB*-}UEWU;$P%{9$5~{Yr4sN6Vq<=b^9tdNIQ60t@ z|65PUGw1fgt}K+zMmpSDTQu2iD$s_>%J#B*Yb>(VSd6YQsN#-IQLDFxhyWU`r7Q0O z|Ch#Vxe5PeA+|KNMN-?MT#GE96SCA4c`FN)2qt(rYo!5FQ@gp(?LBwg16MV+!SN&4 z#s=p`u8zTMW4!^COB>)GA5>$UPMejg|9`R5xl5m8xhczZ?#fW<|N3C%N3TV+VBiYj zoz@|8on3=Jp8KVza`+oFYp{XzymS)-w)k=`zj^JsBjBLhux?;Kvjr9cyZ`yKgc^UG zEA4;X8Q!Gu1ruuK|LF~}2AmgyyxF>c#vw$if-(>@6z+IsqyCFjN7tdG5&9ot)lW9eHAT%S9F z^w*dZPFmnrPaNh6f5QqJ`HPqxGuHPUS%$QOsFVIQ+7ETGGBS;vpjqiZ$l4w5xEeVc z0@AQirWFy7aR<{JjIKxAhoZTwL>B1a8!PyGUPA{3cew~~#$`0@hVTZCGZeeFDI1xd z`q&s&UgMCzyNd|cm2VRIoctGFMtJvH@>?5=o+xYX<5XaNR+giVT*by*UKPC{{So>J z=x(=Nmr#eCD~$2s8ai?Z3CJtfXw8M6+|vU!lG<<2M67}0>(m` z(hB`Dd@9c?FLZ4vt`%_JB;{3UaR|FSEAW5GZ_m77#T=fM;!YoHicLqq2L~=6Sgq5# z>N?IPcjqv_^jWsmUm!B+Ut_@r-5EFhXN_6pJjN$xea_Kwy-G&N($e&{YE5<3k;O&& zgKz|dv48kHn)#h39J}9bK5X|;T63l?o#%O2jeAWfiVAC4R-C>}`ZaWuUs@LEcYHjz zPF5F{M+N{uec>nq__=qa5-7w6@)bgl7VFIN@08bzRpIS|f%e9j;R9JtT%Fk?Nn3w= zRy&w|y09SKqTwK7A|LI{Z^XC?)6Y(ZUvqXY;80MOmID|ohb7P*>=c|6W&!+pvCLY` zu5=RrEHYU={bc#{Le6#44?fHCFRo$%+h?$VtIpof5Zov@{sw$C*1X{h!Cs1dm2KjG z?oFDLm^LZ>7(k=AA>~;({t0Mp=X@;$MCv^cHLkj4Vpgt!Wp297Jni(?J!*7-@g$J1 zf(Ee$!R)BE3mwDe*Xp-^j@9_2H2Y{DQYJFy*PX{X7cCNV9R?FhVOej!zzzT6-Bum|Wy|w>a%W_%YTh8YIPn!y8G*y1G;nC>FWHAcL?%*^ zO6r|cm)6H=1Xy2{{qx+R#%4&+gCq?7`q$!4jesP__D>wO3b*lmz zaii^R3%x)y@4pKPT7I&*$N;cP&V9!eRhuhCF+k(D71hr9upr!huYi=!6H6vbhTn#r z{r91}PF|aH_w19^`Ju?{U?bqdtHY(WZL(L9-{SPPip6L#4QYmnm~#nZ>CkhpkK3ka zX&vFkCaY>UNEPmgv_p3mVwVJwc2x)rHgVX0`(F7qI;3bWdh+y8Y%nMK&EWS9`%kMT zVS;6oV0<^6mTa}b$t}&jt1|;&Okn6|)mwvbo5?7s(xzk8=r(Kq%v=dheQ-bn??6Sp za}Q6k`x$!fEy<;PTj}0=&%0|cr6}`^xXZUBHh1!M&~o~}AW9&q4QK3n?zM3bnb|G@ z6oj^}xQ^@2<9mNI`xIH&v}dSkemR@O~uA;NW>qw$!~wlG1@*m6ded` zY?kAVvS(s%JEQ5bwBbz{`4-Rgf8@yO=07Q`+h&=};J#ZhVNiX7m0}=RZLq+3oLUUO zw`IkWv_WCH+*EAk02NeDMs0NP!8aA#9)#9| zcEPzAtXTNFES@>}CQyhtywt1!9XG5a=3Ki{a?u8V*C)018&`E}3f2+`cx)ZP3hZZg zG$hIA{$EFQlo6%B0^|)GgHic!W96_zYHi-a+}oUZvC6VGY{vIA%gZa96{+R$uvRDW z^f+$+|LM5u5;`{Jxf(W~tQ?!~B*sp#Jygz+j5?r(!>o|%gz%Tx{vO0(ubgrm<&4+= z$* zI`Uch*`A61fyPY&eTIg{}Zj(?U z@QqI5a!s~mBrK(EG1RUNz3=_89&-3lY&k-luv`Sv+=mGVE^BCu9ut@{2<*Rr&)qg@ zGfy~hTF;v|xr=8ES5c#upIx-6Mhb{)O-7Ovd&8|jIm_it9lLz-NBLl)f11t&VJ|rLxbIM+<3mXa<=B{EhzUFncJIstIKt#C%l`p ztM;&IYJ<~@1FKL^xc~fAeKuP$Ri6_?EH!Lmfyt$?skm;m(=0UTw6Q0A5NZ8IwJ712 z{B2;xomX@xgXZD@#<2>)+~}|TrG^&|vi!nvwwTCB>tS}Zt$D2jnZ(LA`9E6?e8DIJ z_e}!$lOiUZMrcImD}Ng zuohIA0gjALSvkLc$-Ezh@g z0^Q{WbZaLA)(p4G`N3y*+m`CtR3{$s_@#Pln4hkFSLw-ysyK*(AB6RIWzZ5!zMHymg0QTEAN2`m!(QCu3X$$xd% zUrO&wR@&LxBMD6QpGINv(C^kPnAIdL4|ti-Cw5xFTmHZCigC*ZG{Ek1Thlf3PP3YU z3vh6EWid%&p_<|gD4mwsS4*74pD?{@SAyv)i{0imx?Xf?Y5k>(CoN^6*OWHt_%NO} zuW_+jP}1GtLojLsM$_7;vFB@GX5h%qI?+*M&x~l`WkwWEo-=SeZNJ|<3f4@BV|ofc z2b|3tW2R(N$XhwtH7n?>ju$fg@EUszR0jD*jb+7O?(PeEGz#M_x_c{g!F7Y3;QH7M zuG2TTj`5P{1cOF)f_CamlPTcao?v8ctNJgqGn3xZ;sEyMG^*;mk-GCV z8zQuuH}0A$G&4sGxz%)Yr@&@T@vxg^WR=abut^O6hV0}&Pb(JJ zGvHMDh^57x;Paj-3KugI)R|Uf&_H2l(luLto&U@&v;$TcN}0Oy1}zFB=wbX-TKv`6p(c ziWMQ5S;&kMQa5eLu=#U^)bv7QOGGZThYMxdFSnXz+x&4Na+G^B0Q1a|Rm7B;KokXn zaA4Jz3F+_ICY<)l+}RN){$)(xv!hP@2TWr2y-xgJ`70WTD4;WROaxT8&DOrmU<6{6 zp$+~9ts*22*J{7*bs(Fodd|I!o@$KM=82r98g|2&LL@^O-eh?KkqVqKU}U3kw`mTO zupr;3AN~Wag0p?RPIn}vZ6w{3@JtT&vBN>;6gY)zW<>rtJDfl)kZY)N_6W07IXsD} ztr{`<8NF4Ot8E4ta4Ok-HV0xZoNAm#0a75(LiH(?%frPp@zNm!BZk`nmM*+>vE!`n zkUSmT>{7sv=K=Q)Sdza@=Nd#MA0y$9a~IF{kf9cr+Xe^?khMal#*DOGen{`P1%5OH z?vLmOy$5BD0yO$ow8yHvRB+K+>`2o$z7dbEk!v zv6DkCP_XEUY7uU2n&j0h5Z~Bn2`mJ8Deav5Q$ZuzD$!#cLy|x&vLtc9B8{dK%%#Xo zm2xD4!*JV>0oI#H^m0+UaRAe^Wogv#8a2!@&Y6azNje^;cNV+Z$-90bAhww|GdLz$ z;t}1qlRyMyO@mUp>?kMxMFz}0^ff{OexOA3Y_uwi%0b~V#3RKW_&5G=w4f~A%8CC% zf@5=>gIvGPINV-Tp57w2E;&$uFkBXmJMn+yz6C!CE;9p6cw)QEF>db8D3Nm;q(|rO z9C(_oNKt#XVrB%v+ZFd^$V)mQd&A<%yvG8&QLwz#3Ze2uts79&^s`uUoy3nZM-u&Xi%hv@LH{RyKI`yke!k{hDdhb;6a$72 zXY6JcCpP+7dNk7dFt%*;Uk96qB?OD<=LiWs!uJ1ONcfQ+nNM2xNF@m5GO*Z5{8G`j zrlH}+4SH_$qv~+<5D`n*Tfx&sYSX|u{V+|8$b2P3>30;L4D})3cDpVi1J^#o>ukMX zb8hkr+s)~y*R#vfO=(e3X#l9$SDJ6RRd!w2LumKM8? zxU9N0nL&oxGgug^ps5nIDyz(l)^J!o?B{NMGi+uzdkKAH_gJxxK&NrB0ybng1*(o| zq}HD8hG>8oi4j8p#<*?z!&uwO>L=fO zK91c~!8f6>Zq-_fl!&GgU_8R6B@+63e+%8KOZHYhR>;pGj4H9A?C2J?yJRLoeBZ)a z6Kr)m>o5FghES#(usFg)@n*cOIX7wK$7mo)u&+!iM96JO@+3*oYpqpA3%4RgW;0<1vm%ZeyKyCr5-Hl3 z!oo1DNkEt(Ch*tQ1|f{iOag|s0YXLw6HFsce2;Xc_XriA4%;vBue67^1bf!X7PCVc z<#t5KsK*sIdz=%$1yX&Eu<_hJ+L5p!i-f4mUfr<5hVh75nRWVZo|<>wD{OpIR0+-v z7Q?(pi3P*5fK)NllpGf$vcj-@a2&HaEg1PA8SDwk2Wy7q15vN{$_Ivxk7K_C@&N)v zhK*~-$e?mc+n%8X_1?5!uxT3MAo&-BgXDXJgG`g7ck!lSYLZrsn!m(nUs|5wk?F51 z9t!}Gi$?q^xoFh|2&ZoKY_GCBMHTGoa!~5eaM$9kzba}z&gcRb@iO=p5CJ0|-;jof zSfdzD;-I#di&3Kms}$A>Cs98}h{TrJGTfP#+TyA;he=+u9ZGqBkL-)!yD+26Gx(tM z$gEVuQU6mV06TN%10JEpoh?_W^`Jb+@=F&Naw>Rb@se@6ySUh0erb#l4kx}{E>4!I zp1}O1cX#f+6YdHpQG%sE=q~6fB^cS7gGTS?Wi*%eeoK4_*}xR2>c>bbOf8s;Fbx@Q zH7SL5OzB2-Qn%)=y)c}OUR5@J)Oh+I*cI?I7z(sKU_7uSvU-iLQM?DWX@vKnH^{hV zw3Po7|4hrSAiG7&68uZYvAz{!YZ=#$!L!BS~ErL*Kr zvwIRt5T`ks&+Qvl!VvF!dw=G$^vCg{X=8Xb99I=cgSV1R7l3GhL$qK85Sy%Y_8Wps z(rk8EpGE^irMd5_x#sw;J9$g{%vuYM`|pZuG_MPQXj^pRzmf$|Y}v9`RYVI|sm;nT zO_r0^VLy;D;&WM8yj*~Jv1P`>>E?x5Hs53Lxbjoiir0q+Q*$q=Gp zg0r#*f@9zm+auDF}$EoYbq>VR1m#zpxFA!+~bs3EWK^4@-d7f?Dsk>Bz!o7ZSm*d<*cI& z_X_TsFwMjMwJ!weV^5@7JihL{#dLQ=YGjEea`FR3Sl%&EaD(edH#kU5Z_aV7WK*`KVq1O}G-R^yDB;c+Y3aEb zRpdI;m+_K`1EVev6M_tDrRe_)wiX?{(saDpzW#gmXyCpdm0wRb(xnuy@=yLjApYp) zJVb6IzR=Ih--CwMC|%v}=d!f95Q7K3lpN}q!5{zSZyM3LDW(L>*O*OwZ@+;PTse9ab@;N6bw!xZS0fekp7D7zsL98PL zC+*7EZ;>MEIfZs$z=CI&f%Bk$fMDc-7jWc{-oNhiv16a7WObNq%h?_onNEDHG437p zDyMjJiV2OnZ-9xFn3FW+Vxu0%K!Mgt73g|(V_{LrkO{mjn_sMABKLovyC#v{onnroLK+Gx0^` zwEeBHK>6H+(UI!q5wt7z+>&dkX9acix_4DREd))VNuBba|g9&35-)_!rK}IU}-g@-^+MapaFLP zBYgBARU=Nl>NUTZsynWtT?af$%_tU&SkV(Ef%Q1jvR5dHNlS$gD^wp^aIM#TRKAg# zDd~R~0xLdaVPT4MQ0n^q<^QE!sZ174ec5aiY$X5;C$m$b>u>;1BQsb~@aAj-0F_hj zkL_g@4lDV+H&yYapl(FPm!M55BT}C0R?_@oMNA-P^CH;=4HWPzNOv)yvg#ryrX-hi z7BKO~Gk8NBy>G736rchbTqdP3w*T@~udQ5}Zz`A%k#ww3_r%ZiHJQ{y1LwDm{$G&4 zOq9$CRh$h|Qfro1UgdZHLdEcu%#Aiqu5_Uxoa9O6-8z5nS5hs-93C0DV=|%D`Tw~1 zYhUQCE{IJ2Xcnon=sjJ2ezLldM9QmrswakesxJ&Bt1saGUsX=AhanQ0U2dxN^i)rp zoUAVDslEub{1$Vuha)c8f{>$8&8H{h6<*i&83&kFvl&>Q{$hQX4ZT9z@+1yIs3($M2i?dQK7ytC*=}+?O-2F24`e2qghaRhNh6P)te%t~+1y(_o#`R=`cqhMLdd>l z&mUrZGdwhvW6IgLN7hD9$mH`o-u8$NS$L;*mueAt(Gw_1)DEz@Kx;z)j8Kbb2d)X? zu}Q1rBn!cj&000cDo9|syU1C)O`lWsN1{XyR;k)tiXZ+a)_goW+DDKW-$f62Vc+D; zx)czCiud_HXP{6oIN`Q|N8q1P`B0bkICK!@t_sWc|B+2A8*gfH$&YTaNLBQ+2=&_nqEysUumDsTy?T z!Qqz$6eM;7IiZn#&9ujhPP|&%l9AICV# zgZn6Sq8unQ&YLC(nYW1$9Ci{9b5Ff_^QXs-oJt&ObSoxB$Hw{yQm&YkiamBSK1i}! zPEpR>=8zJ4H}ECP?^>ImquwA`8rmf}ju-UDiT{i?TU&~!(> zwhsK*8aqA4Nwi|8(|b;030Fdmi9`Sjg&X;8zIEb9Xbkz1W{|`9<0PKqj{BB-)@$x- zZOPAyUJ|RgHq_cOE-O;lQ#~aFfZXb9Q=FbsQOgKP*+hR&R_EVXQM4o{Sy7}> zJVN+UF&Cu)@RG2D)^#|KZwJ1`{v`P$oAXyEpnlK47Q$5~bN+$o=RnML74K_ZR!EZZ z_k~vTrX#l`bgm|YTaVEKZ6SS!c6*^P4Do^JL`liRse=5p{CHLXk^@fsTQsF{QuXLS z`Z>k|N$n#oQ7C!9Nx%k%C`oTISL$4b5&9oJGyGCopOKMX3%Tud+UK)S6<2hR$X24WQyPlCe`2#Tu@pdeJUc@Ym#}+hh_z zRmB&|{_5s>tuj1_i-rg26LD+aM`XzLf2eP?r^o}P?bc-zvzLr%jLn-AYF&0=_O45K z)wzERPn`Hy)ORduC2hKYpW0GZP|*G7Mw%+o2krAOU`B;quN5+vaeGshLy3L@_8H2m z(-1k@eZ*e#ue16g{o7tqM3}7GKP|kyY~f_VC!vC$C^jd{F9}6a*Sa|p(^-?|=Bnn- z-$gnLm>@Zpc9MuQSlR-i*LmU(JZ-m-EWUGOtu*Ua2&%urRzeQLgmr zDUS^?xspR;PLNlK6X?`iC5K}EMU6yOHcHN~o}wpXyN--uX->VRoMLBZ-GoE zRsXREhZp>pdZ(her=l>sx1yFGS-ll=^@l_$w_>teacLTB#E?M(03)CC}!#9VUAT(NiwSJj@)Z2&7u|nkT2S8<-df4lU^?C1VC)Bp9YA4 zhf#zAJAwbuG0`T$Q-}@BveMHSH5G)-W}=U{@#Yv#qiwAznGsul`MLtq>b9k?XY71L z8-lWb%jl2d3GQ03s6t+Pzg$kh5a`{&2npj)RoA=o&^ETZ3n%-3CvsW0Jq6MmIqm8* zqKXI7-{sqm=Y9c`z90*JCannYq;+t(8V{I>6aTR>`J!JOPOoI{0X0tF%XO@|k0TB+ z;$r2-=9ghy6h{zYqbQKOzy}!u5d&KvkFKGpb8khyv$dw_n@>L5Vs& zrBnzzm(C+x;#R{Zi;N+Kz<;of9D;M-Qn$PZ^AsU6Z+-2*d2727j7G*6oDUp3_8AiX z=K3XOkpHkQFN-1~)3dy}tD8`hDB}?4(xMO)&s=18y_P?&Kh|7GzVH!SKeL2fEmAC57<=FhJFh&|De!HgC3}q$y^>FMBg(2zi*5=&t$JPxL%947{r>uA-yLe5 zSDT$C(a4~G$JUqGVm~>fQq7pUQG z0*t%J1jo(*s@H87kpZ4!hW;JUSR~|Hrmv-r_2nk3YfBDo$#vp0L=5uy$LKEz3z-UZ zSPf_-$X))@J0q}L*O^9?4eEc$1_SPOc+DMTUjGkRXABHSQdJI_xFAQLg_|jy3GDm} zMel&|QMX~c|2#+5kQ?8yJ^e{RjD6XmxM=@7@4govnp6n}&%>eghoBs75apsjnOS2u zS*Xw{0|RlL?fxyE%!VKURT_%^)?HZcRu`rB(SurfLKY_)%1R$Kle61AsGr06->MkY z@QMh~H{0^E1}55dENz(`DdboP%H}L6i{?j8fI!yH#KZ?a*F1Vu>qd%dLP)VoFiCH)UG4ZTyEeo5> zSyz9DR&uNDVH%q@=)<)C<^Q$)p6Z)(S{rNMO;?BtL&7PwbZ{Mfn7z&IOaUVjgS>?^ z{hceUmKphw7`aAGhd`Fc7;7bL9rynz24^g`+uV7x(tk(09fIhU{+J11AQhtGK(L}ehZ&M{@07t^Rs2`R2LvXZDk6HCPbdbpg7QF$K{Rn zOI|xWWY}v4iJ)9n;OD3^vcD(UhY{b1O~O+QYbB!d0;A)QC&=#wml?`yuP-;mSJiN@ za%-le+INCzUd`;Dnxc?@^uc$BdTVA2w&_|1g!)ikJn%xMKJu;pFJBVsU9>ij)90y| zb;OGuzfh7{BzveIWAFCgGrOe}XFaMW5+_^!nu>z#8*6O9%}@?CCCj-fKika72_w7c zn1Ca`OnSn=r9~?bQe3Qx@BN0SXfAeQxQCN9#o3hQc_O9OBVVM$@2bQ5yZO25%f$@% zZ14TDGw6TR#J^wG2K}%1ere(MN;U@lk1QYz8vCMott)TLik{~^+{sP&@=$*U@1S!v z8gD^cYwaf{d*zDk{VzKG@Q2R~4cr$X)DvpU*yq@t{;n4VpHpiLe83I=K1zR?sshn5 z0~6ca{?ZvFnmX|q9}%qg2Qc`!{}ZS!e}2HLQhF))!Bg+S8PE)K9DU+xeha^;TDD*< z+hb8V#ve4gMdhFpDO2{b|NRutsxc)J?Y*#w@(hq-`vYHkv9$5XH)I#j?B+&lLmc(V zYL>*3{+iZ%QI-2(6UiDGd&nY`F`YZ&U-ETrOXEcNTXi$m-$Jb-Px&>G3EnL;V9om? zDm*;Y?=6~9(&?9e_g$iQ>-~R2!WCtG2N@>)S^5w@fb=lbtf2>+m}B}%-8KBk^VE6i zvrc?5_heCDu2IdeDt&>{7#FsAbE-<8jhydt+C}t_rZtL`-%{nysY=i1#dGT8>b#2S z{?r$=AdOyL)~cr3m1my)67z|U^-R3oka`=RWfq80n7TMU@x3HA5>70iRac0F$T z@)yf_6h1np7OaMX>TXfq3$Hh%1DxA ziPOK#0S&akL=SRm2KMe(I4&c)gSWhGTlL^%Vp>XzN281zwk#v+ne~s5>8d}ndNs6Z{`-%tmvn} zR9guNX{df?*-pK>LSXaS^ooC(bjzx}`0{b6*OZFd82ee^@K z|5YY=mgdxIvqf4v{zyX@vG`24v)Hj2)N-Fmw?OB-)&l0ChyTf58h9QINf&efT>K5V z{g)35gEuGhqyVdgvqWzH&1*#SojCFc5|`=!1_lKgnV~dzZTyxy0y+#G3m=uWm&ye) zBSy;cD{}}_X`8nw|77L#!pKxSF5JH=ws&^f3@Tr2q*dWh*$gM%rtA7*7y;z(_uk)v z7=7kggYZ#29xFD}<%d8*{!F50_qZk9|BS~BHqH7eeP_!M3HE1_r2VLk#@qP(Mcq;>gu|{V&#Z^;?AR+tZ(8rQZ7- zI&L3U^3a|qu#kM{-I{th-~a9*t>KZ?sEp>UuRH!t?sG^HV+@C$MTsYz&!Jg z?i~gkh@<9iqB9knI7rHK*!&D$t<*w)tR$eH?pb-f7t7<#a!#=y8W}0iU5`Mg+)Mut zH0qgOyz@2Hj9gx{@~Po>@ft6~mX+G^CB2WNC4Ciw-O7mlj|s=k@Faurg4Jee^^-A! z{datHjHZS?i+@*j3jkJfH1v<2S{{ElU(xFnSPM7({vr zJwP8)v8wl<{R>0dmVmJ+iD~r5YxQxdhG!<~f0_^sd|`|Rce5q079Rcn=RZJw3whc7 z=f9d8)O%?l7axnii8y$pUu!od!Tv+OCFTIbzZ3r^Es^1l_4Opn7@0~$0|5h7cS2LE zuN9QX1q}0T|05eg)4C(QH8a({rTvpe8wS#Qh%2;oigQaiop6-VApPpEzanE*O8o1 zA9^_6;}f9i#rsYjOyxfH2}Zf<)js|Wb;;FOJl<^!s$+i2I@f@D&ktp!T zA4PABy&j5wh%f;J^JHZ)Rzh4Bl|`wluh+YkbJ-^}{sA0x<|*vYFO~o45RWbi0Xx-?TB*)bdc{ zGv855{x1|DMZ+J;G;FG~-*Ug%$^K5BLJ$Pew0oj!kM9TqEZ zem?Yr!aMn#DeS~A!uIY(yV>V3O18TRJWu^>_x-1aPVUX6jcBoLF812R{NngpdbIPP zr=H5OknDc{9mHZ7ZkT#gEgBJJ7cunI750X=tJzpj@zgr1$J~q`5dXtndIj@OJGP3j zwhkIKI2*aI2^-r)xoTf{4k7>pC)}Ywv9HlxQ8~{^C|VddGMK*HR_#x-BB+JQg3)+<&a7__{4(-gC@X_)884ugYM;YeO=^ zZ9z_R!(05zAi-XE3#SCG_zHn7z$djxMNY9jmDcsG{5$L{p=S>wZQ^36#wK{%GR`O!{5 z9g~xBd{7d?dYZCnI`Dn;H@cD93I0MIw=s@T z4^qFE6?^v(ShW??c**IKx5gc`_SY?_fgGwjR0h&Na2^*c#+5a1bz)iiCW;PiHg2y< zXaU@gSoc>ABenZ5TEs2;Eb~C}T5NCje+RGh7a6h92kN?eD+<(NZ-t4yN*_gcK|X9M zO2uY>{S=1-IAMx`bf(|7_Z#{(6nwW9p)KMxba#+Qn$@~|EXVqVJ7jhX_c!+9FUV^B zeC<1<2FoOj_2oAKeuFHajQ_j)48HK;z*E{3EF;B^+pCs?7DdaAfr4#QbS3*~;n+}r zPW7zTmYl3eZ5xMOBgMrJE&H3Y>e-9m>ZtiOGKoVmeJ#fenxx%F9wGMBVr-vVPm8(r zTE;F=py(%VJZ zgjZdDM!q~D`+>V&&ZOSNwfw72+|*>Q^?FsiF14Nr zNY%6zN%OCdzB}}o))Ttei+Mbyc6nd6UQq|nG@Pn0P^Af$`FRW)jj@%vS&^ll>A^iM zFNrzdS3@ux+63U3fv5@pkQ_Fqe+J$axk&ZMV0Nh@-uHh?l%Z!X31GS7qwh09bYFDV zs&37DRJ=&Z&_K%IJ71f|Xv6;jUw3@}87A_p--0n+1H1gAUqs?#y-j?_weIc2k)CmT z{1ZfsuX?iNpA3h}joi~yelsVp&q|e7VTWYY1(+N~G699+w{od$Vyur*)&quhfp`0$ zM?*S1H^9e*iXoC6BU-=trsmh8FVRdt;x4KG0bJl!A|L&{?m%=AEcq>*nwXTFr z#!Zw?J?@{m3nw(98qK6k_sJ|u?JNq$+laFEaWuNB!<04K*)rF8qBk}2e&mRnqMTMq zXQN9Ktt+#$BGc4#6gSv$d9G0H{D%qvX=V9i8Cd?5{m=n;1MbLzt8W=^P(_U*x_I@sSqdZ%YSo;mVrqQjh7>nq` zbYzaFOqU@=tKkuOIChL!P+TSjisNZMBX_zXUvEh$vBWGo!+D~1Zt5NYwc>67H59qR zo11KET{b2w@;-tw*`aq&AgmZA4!wZYCN3&CH90+pX^9|=im#RQ9jxC8*6$Ln-@nkQ z*6&CB)%rOJm6X$xIZq6ddDj%{)iSkApjHvEZkfhjP||5Oo{{!OBi~xNfrr;R!zU~AVx9RpmH+z^rhjReZQ_%(l9nnO z^qax1sZ1h0J9EDoO4mD9*dd^|Vx3?nM6zc-&u>3|h zdJ=x@NYPR3}`I6x%G7R z(kobq)1kUJDLbE^uLc=(B2K` zCD=|a-{vz$XDj4XHu&|;5IRkzh>3Ja;pW`f%&vG+8su>wgBV=rINknM9}N70)R$au z;cUg#)`@)hpLrdIC-TZ`xLrdLGGhs~C1|lXY~&W2#4lsFUHa@1u)`AC(eNz>z9Zvn zrluF;o2T)aamDvh=4*Il7C&3x$zFQ33r#q#&WL`G4$`5Z5p?ySy3)Q-h-Z&@RfFcS zb6~%1V7Pys_Y_2&E&`XzK^fu$h;K%3Dc!sD@|?O8c;<-9Ei82B6{7LF^9r>4tZu8c zhU0n~!ee+Gsm|YZkDP||wfOE-%UhP{Rex)M+8}pNA7yPc--^c zx&}i20r{$)7a{K{J>{(aCX$Yn;=Szc*5;oRz7{^rU%~|Xc)|h8UQLz1XN%F*2%vsa z3IH)A3vs66=&zXN9_&gNCu^tZZ(*|b8vV^r)_x#a|3PD(RLErfr{HP8ciDhCi()gcDBuQ%uFaqzE{Ml26CyWri{?GnDaWDAU3PP7=ei0&;-p<$U2D zG==%la?RTGxDDF|E^aG5-aN+bahta*f4eKUteKdbAk|$`R4~A9`h#{ zhE4m+y8niTS|dHDUL1IgxJ2}cP6DSdLaN8jcZzm^Bw?|2PFvOLHSzl>Zef5=GehuwEd#G$S})&=(ls-n8r8SriO zyT1poZ?D@bft)yDpcBV^v&5jo5lZto?TcCe%JYQH9134KPRgw=#@h`BHs9CASBg*3 zA+F37Qo!gK-v;Ce;kGTmk1eXoZ=gF99YF+8;wxH<`dLgB&|$(xU&fJpfITO3M_pgA z^KyfoH^x1ftRIV3X7*nm5wxjVB(MXiq688Ks+gJ)0Yh_$b((A`KYEwZ(frGL0F^x* z`KM;Lu(PZD-pzJ^PYK|JTBoPgR4+-bx>Vh!Fq-z^6T zkoyQ@0sgJc+mWvt`N4p_$}0cUrY`|`p9Y|0k$krVTxP$^Ksr$;dMIdRcZRB=h#&U9 z^b{c$HUd~E(ZEmLuH&yleo;e&0@T6~4sgSxjn_um7Z;DDdze9`qexo(%}`kXQPi`95+a!#K1^$j?*jL!yjZ2XKv__0>M z$jGFu0dUY9U5s?Y?bNBUduJZvnx13}&%Z|h=63vs%x(W$PcqnRCDo%wbUgbTcF037 zyf+SrS&0ZoMa!axnT>yyY061V)-04UG)u?>(oA#<(|5A40UhU*@@|FwIQLzPRH6MS zopSVktPLm*=e@9`t<6UbFHFCKXQPd&Ox>Z>PkLXsH~l`r)X2-t+r5Tuso8t9Ebcp@ zgDk%m+-(K{mgPW*v){9X>1xTXJ!ok|=_T}&p+5(_=r(WeF7*2A(#--&o`3&dRtdj` z#c$Ie;UxFyE{ppW{-&>Bf@T~Td9*XZ*JS*nog#l)J8Y4#+cjM|gwF|^v))^X_( z*6a0Oh`gp3YmZxTk>T4o7tEXc18=FspCDcjQ|LFJ&S1!$l3Hbxuk!0Qu{C@7;m1h) zk^}PN=HXxBUf8TkyPSllm1P>YOi#CR*|AcCnr{d7E3=`GFuV?++i{Z~U2h+8Xb#5I zt^P&yWz2}A0;azyOdO?O8h=%-TvP3cZqF+e@OC8FGs*CCUbcUAyX3FW|Gj+3PU3qY zgJde{k0pveSW@OKvy9UngmqRM*124)^Hj+p=h4A{4Rd%lG8K`PBw+2$(WH8vs?&ni z=?vEp&W8NIVPmT!;&Zd6o=wf9xOVK#F;4PV{1ymnb3^;BS^K#g$73gs)cB{rBV@wG zo%jJiaK3fR6c<*xtmzsOs8Dr92X6yr}!E;a^JSWZL zw6QpsHWWl382FCx65jb7JS#a~2@?$ksj8AQhJSEv8Hl+M2O+beAX%T2{sM>zKK^;{ zMh@=y8;!5!xy<;&N7EnGUNrg=lJKD0LueyFLXeg#(Z6>yIYT?cZ==9R%AK8^5W-Ne z(|!?&DjAD(O~xW!!@*hvdCsfF9tTy;GR6+CdZv*_P7C{owHe9dM*AoyYKi6)8B$Z5 zY zoiKKpnd33zkB4*QBf0OyF7tfO(pe}aPp43v1`Ty(h5a064{VKXsDl#H6op`EAv6dG<_ zc0pEje5`x6aUEc98}wf_WHR5)&fL{LF#4Oanc=XaA2@dw)F#6}SAFz`Z3?)a^>A%rA2iMMn~6dF9Wp)mI9yN&L=;?(_p z-1RRfZbRtT9l09KxHxtsw{cu`v1vWNU!N@^S-czHk3SQ~s2V}t-byq66nPP!8N58>=p*#0q;;W5}u)A#0rAvS4J>0GN)PPT0*iC%spSl6H zyKc+CT4OieNBV^MEb&jYea?c!|4}^L^iNJbDt+A+|5HCR9|NfPe4YZtzU_f$(45t2 z8z48kJ6$5y67WYdt>8RAJ|H=~+aL27JUzu@vMa?0!*&cnB5{?4G1Wni**Y);|D)c5 zaFd~iqA=L=8@6(0ngClh5x*~@awp3N&@|Pofxn^7dwU)hA+sv|Tx2o^7TSyfoHI`R zEk22bJF|gEEZiL`ZD2;SXL~i}cyFEdne|`*WC_2IRGpnQMOXGfnpppw=%$p4Oc?O{ z@8AM=b~d~Y;fp+~*PNY)FfFI%PRc3mTKeq}_K5#&EVhVNxDX0d*yR@|^FY5OqxTDw z)%Y#BM}~EFfCr^vCjTi0&j#C-9Ls@5;p2eOuK=bp?4Y;(l&zWKE;z@o=DnX=c~zAZ zKtX>Jq8_iNzpnQTzaj6)FGTdnAY|enc_j3A5`W9p2x?-Lr%A>H?L%G4vUFy<|0Izo zw)gl1K1hE=O@pT z&%C8Q9{rGLKdNPphWHmeyM}X?HgKFs#}WHlDeU$y=G&*Mqo#9PF7mF%+|*4Vs= zY1q3}%wXvA1bE?|HWF2BAW`)VOH^|tQIRa?JlYpXR7)q5jsx1l*aC^F%c#2j486EMY64Hx#@u^s5ph+MEw&EIZd^EIS`CC18y@MqHdW3wb2{hW@L-l*Rsx zxaR*1DIMh58+{3XpyF*;@kOfP6{M7amJJtT#Lv4OQp;#9Ds@=o+-|qiX+j1>g+Hfp z!?FLqomEzCnpfCgV@kuFi=VWgNzM}Xv2btD0#;pBy@F0OAri~D@FEIqt#To37K-hE8gNu>jD@EL_`A zWn9*zq?kN}VIbwv0P0nmbtnA6$Hf6oP>BXtCe&M&`1pfr z;TYrUCGx87c&h3fQxHL=T9d}kUreSP3eH7-?DW`VEj*LhtlFH&BpApk8dSWLsr(Vp z1)1oRb0+#PkA9Ykhm`EpRNz1K@7gQR-EIQvs9mI-8pvY&l-Qrru8%av$ZGX4>>fqU zVQ|P!i4q}}Tn>enwaz>-r;~6)QX}!=sZppYKcdp-Ls>hYcF74W?0dz`urei6SvG zpy}wnGI7b+h=s};8bkUUSg3ddP_wrIe@|s@R!`*^{>$S(B9a!(O3s-aEXkZJ?UE$t zTxHf{&ea1KTlja(dKFAMOW^`wX6X146pK96dF{#Pf68!(!G6a4B?rZdg?dkbt+jTf zSBr^IX|KOhcBBlQ5ReawYIcE_fn|blqyzrFkB`hS`VC6Xm?N@jY%v?Wa%{%#I3{Cv z#5i+U?eut+GIyuy&rNli8P@PB|Bbfc#hkc(RIYs7WCu5J+HTne&gw3@QlMV=NSduAyNx_DhSeU<01uW6 zN@V$qj*Cznl?c`=UaL6bjGWZ~Z$9kb!67oJYUvPG!e-S9`f_9MHW;<@$AXQOg>QTnDk4Q9Gj%2d(iPs>y2P_jLbO&a1xi-@TSo&FEp%y^w2}8 zNMVjdE*7b@$GN|n2RRC!t3;%@F)8O!C6s1CPBQ!~082JJqXk%u=F{NEexIAF${U)B zspZs3fpQO^g=asb(C6Yn>hBFpFwc@tsi8k05Dm{70s((;RyXsICQBDjUmWG2nt?eT zKh?hJd6Ip@q)&ht6AXpy^AG(*2;PTpbP?4@qQ@ikv~X@WOGv41TAZfHIbhGZ(2RPnkSLe2s`->_NecuzlEkhG}mGM!72y5o}w^~0!!ZZ@8P_A zmaGe}pPG&SyBd4jzwswVdZ+r-iReQZGpxMc(WZ9Kl2k&g=p?8qeexTl-z`+Rsv-|D zoY=AYTCaAdl=Qu<{pU2SyjXXU+`YCP-d}ZWgP>$mo`)UPB-2v1tggsE^j*<#=M$25 zs5FI&5%=nfIo`|Ei1|uuODHR{7$CeK3!7?9sjr4MskQ#5TcMy_?ZctN7e{@EGLz0LL>fih5jv^DC0>T2sv+pf=|N)qHRqT%*S`32tiWUy;?S2zgyQq z=w51W{umS~d&NVJkJ#e0<4^-6uXuHvk%z~HUxB>Z0I(K^{4>>8p`JtHKjbse$?ur3 z4>+lX<|kgIZLKR15TfVthq#RRO}bC7R3nUTcbhjc4PzgG|8Iodi%rsmLUNdXqjGB)4bf z|D)8ggo=%vF{!fBbWQ1j z>2n@1F{tW&tJ}QM02LW^Za!us08h|xx9pwq)ZB4rNw2jh{Za|(9`HWYQyT4X)~q)B zycwRE zm1M)=VuJ1T*zM_`Aw^4G zi5?{^k_ubQWh3~iL(#%<_CMabIObJH=}*Do0Q)e+JC*={|Cf7E`Qkj! zX-JkffFs9*BQk$A2pa_44ap10{pPs@jr?StAZ@sO$Kz^Y11)H%I*LM`8}tYy+4N%C zgbrkH)G93@9`-?RJ7zlIQ*zt@(DFX&j>g;YF$xv<1^Cf1ysIbv3!h?K(Ro$MIod&0d zI$lvL&*@bKYEcD;ox}4Eq$H}p8@I?vKH6hH`r!|MsHA6-np9WDP0Y|o>-BFY*py@@ zf7iFg7f#K`D4I|JH$X+E&-KcuggPnuXTCc4rYcmp>yPo=w%{fd4(i=@Uz59jmafci z0k=)NBB6Ws$jq-f!}g+H8)xs`jig@X?^mBwwK=W6{d5{R=@rMJUrSdmq*7% zYEL5r{m-*k{!O2fW_0w9kDhM=O0j0G;k8xWny68nIb}yfNHuh`G?Ff}JW5g-^{|gc zLKk}X6-M3AE!heJ_n`?G99yIz+{6_@DsmCsp^4e)sRGL!a!4n|Iwu)6Pa&^;hB?OO zvWIpU80aN}Al{DcMf;x|yw>%qaRT_C<~{L6=uNU-|DstC73m(2y>`m~&f{3z*kbGk z1=|sV0|KMb1p>3tkcTwd&#X(HZ&Q4Z1Co3|Zb%y?a z7ASi=Ok0G8l~4A6h#%WCp9c)UTQD;?uFM86w^z@3oS>O3cfFJa3F;{|ZlZ-%Fx-Sc z_a+pwtOdk&g)C7qF*P$AfzI8L%l($iwN5`bpD6;mH=(<5f~=`2U3uo;92@p*zL`px_Yq6bw{Z?zBe~nVMT`^d0IfVu-~38|ra)C<5P0nSV_)y@_(}XjtAJ zK`1a>xjTFs{PV;F!|Sm#r4=({^n{W_tt%yHY}9s<;p-6QP&Z{vC#fo0oO;kDQg*Hx zP$nE6%V<}Qc?YH=Tb?_2M@J@-XT+Z8ruxh%DA@vILr5C*>pDf0I^C)r9Pp#3ZlYLI zGI^NNu$}m8nvA*Y?w__^1HrkmzEE$O1uDaQ^}r`dBk7;*3)ei0)3DVk6oABRWF@!;NOVU4IcCzP?>;ek*INdx2b6|TP%036 zdJ|`u0S{OrUHP*=&hAPHeW^M<#oeL#dIp^-_*1oK6OkbPhDXj0m7ZOB+%r!}ul`WV zoYhDq>7WXWxO?HhxhB7Qy>P<+viZO>Kcc_&q6fV7hVUMWGzEnBsoUt*uDPMfmK2!j z{S_Zu=D^OGiyV|7z_xNO6cug7ONlaU2-wElRZXs;&*^SVh^42z9ooF9Tkyc#aMr1M z#x)x@eJvuz=*|YdkwF#hGH-{rppG9%2n?~FoY?DUQnRm5&8f$1=%$qQ80t?I-H^(y z_s>T=hSVF_Iq{dqW#9;ZPtDvGI)(l^#$uoaqFL}guh0Ys#%dx7f}1(rO54I&`(0?A zvl9+P?P0I7hOhdAr*6X7$Wz8jV!rWqnC(*#_cLOL`~N%*?;_ANvd6UH+r3Xm!`+k^hZ1<8>{hf2z zfc>HU@lJQWfKQo8MkBl2Jnh1iCQ9{$^}^89?5}$!7scI^&uy1Q*7#FJb6i6|0=-p) z{vD7dHaHZy7&%e(jV6`uUpXey5KD*bgXo)N2ca{K5a+!JSVdPV1IUF3j>N7q4H(S z_d8F@&%Z~r3$YC9FjX+mO`Twx)aZ~P_w5oeMdcXY zat&{XT8QqpfV23VDwyCJINIeZHQZ+9ZQc%(#B11FXorxj)F2qVOL|XA$m89X+AIas z{7C<+1kHrT?4A_|)79uUTei0D5#nY=zU!?w4^tW%gm#T*5I<*+ur)PvzHPnHMFHp} zY&n$BeLCw9%@V5kD?i4}OkZ9~^Uv9%&5$ZuW#R1J$jQl#)65p48D(QQ@hpM|8qrpl zj%n=8%gu_J&qL`883UU!&zmy~Nhs9kCd72pt%J;iRWF~^SXMdFNqkdYFe6;VmV*}Y z`}j>d=|sw(C6?%!Auq&ec*|xw@&AIPrl8TeQ&Jq-E=R5r2{T02|HC0;>F+VV@u|{L z4Aq9V5bEMz@Yv}gQysZc75~G1{&9|TOJQYzSMgI!BvXI(B!vT8S4xb0kS;TFQvF1) zR`p*9CqRU0F9M>H7o|62%9yVV8N!|ktgIb3a9*%4O8X+`+uS)G#1A$7Ar(EEYIu3% z`P&ipV!l-~ljAY9#P>D5>Ftm(!hy9|NG4jTlu=S#pf)pSeio#{FOY>Q#;do@X5a7s z{C9$yZorvQoJ}-FCK~%af@p2FF~|1#*Kd@Z-ktt0#YtH|qoF6>dLe+yjm^zIVbM!e z;!Xs$-h_}|gt4Tveb_F~jyVTH%=4+;&jqNd#h#NO&UbvC;PR)aqLma9ug8)D7{0Euq%s7i76{ zQ@0{|d)Xezl}>5{OXHp`HNs5G1CspgC%s$=Z}=|wM*9)Bm=QAlzi$E;%_WRJd?2#T zHPqido4!G7U0<6bjGvuvvED1MwciDyMP@S_Y1se5iyB@ay9!rSlWe%L73A212bpA&$A-F}UgAm7L0e{qe&hXVuTykCfmfyb@5Q-Ax}Zpr-ip3aYGm5x z%RP(UR*JH$)UA5>jJw8Qy=O!KOYX=*HMG!8iDaa|%0HeRnQg*px3bQTR{(0S85`5c zGMKDBt$sQpcm~klE3euG6d52*Vm>u>f3g=3$^WN(E(727}Q_?Ng||_p)w7bKK0i$i2P0GeshfwqqGT#D zm$6Fn9t@~i!EzKW17FWP^VZk%Myw}SFBwmh?=}s;Vn#f|SzQBU<#b!==~g;AY4DOY z5%$>q5WOseoJPvTkIfF;Dla-DsWLydXEI$9n3NPM7-5TSn2A}@fAS3ON=$1kt1eu6 z7u8I)>kVsAmc*Mf$e3SHyX$_d>6?9A4$bRWX$j1ETMU6oPd5}(m=z$2rREzS%`AkZ zPCJb?5^1f@WZF}#q!S+yu`>g*)*tPOUSkZSP4qG&8b|S0$Q4zMH!XqEys`n>01ZMDx1XEC*>I86pY+Vk=lBXS$a`s zR?CTp&9=~BZ3@0sh{|>wdB%zViP3sy6i5%~JO(;9*Otz!jm&C{?Ga4?rq`rX@weW!d7gA2*=Dig-Q)Lod;ewn3k_^gO)8GIEfqn0On^f z#!DG>e&z$DKp& zlac68^xK}X%cVOxkPi*XlC_|g!WtuvATk(GIB|vdD3f_8_G2LkFYAw`tx&?XYXP9e z8Vg^$=t7LNf{6n76mP_`6qD|BlMdSe*GH2vpuc^TO$jYva_S|fdhVd{>9++Cx) zc1QglsojplHS0fWG&#K0amRmROWU-Wt=5yS*Kvdf7gPA)Gz7^eouj&ja(;jN#)2w>(%cc0KRizybtXrr0@X8GG{BtQw zN4+31AMW7Xt)ES;PC@47f48zGsaDL{JT50W!HNGZ1~!~x!~>KN@nD1Dh;qABdJjGn zgG@#@q(%RZ-NUVz5LFK1Tv;FFt*AbY+q}W6x~~aee2{xWbkkTjyvevRi*o8Hl$t{V z@b1Wkv3FKF_qWrxk(HALH-tDwZ3Es^j2Y;reXWSEx4K1k4xpET zfpZSbzMF%XU{>C;A}`(SN+o~vg3ch#K_eTvSKj}V=8IZz&f9Ci8tY@E@!TNr` zKVF}_~W*|Ja z$4&RsUgi&U(nR<4V_c=$?v7&-r~_>D+Juo*1{2$R`|QQb_G_6uE!OCp8XZ^1f@}nr$4D54O@sf^j3Jy z3tW>~7i6Y=ttlyyd8@nrO5)3^B%Zb)7AMEM6gaHNy9(2pjjSOMFTa`sj{n96g4}fk zscG1n*A7~ccd?$kJrKm7c6bOSXf2H2-Oq1@PMrctMxz#E;a5KfG-q=-y)OSVy`&SZ zQUsDQ$7*MkC;sME@x?R7T-=Q5UGfD*o9TT9(xO0KSYdRY$HC$O&(GL#_ZD6v(iGep zyS$9=H2@;zu+lcupO47l-fqDyCxFJLBE?kGNhgO5J!SQ~Q+7^A=PrpbvIF zb!X(2iz%W9`89fsyYcOQJpWn77}=L9zRKc&z-x165#KjhzJ3{&c}6c4Hg(6mIdc|G zn}6mvhAY|*27Y@N55_;hCJmcHrKiJ{$+&H3dsFQqOU;QtPepSFIb(RdeR?xq`wzjC zY6W48K_0l)8tAq5u)BUFP~R(}`bzTqI9`CW=C2SmVQq{3{`C(2uOwG<(9ZF0%R>>+ z8}ubm6n=`tiejOaukTRM+-x;svb&XCH~iTDW`%HRH1277?)qG=<7J6$vVbbq zARuts4{Q*(JSFt7?l2Y&^}LE%arlS@I}lO21i^?L8KQTd(E?hkoPhd za3Av$BH-+)?rNLl|8|2QK`rE;nHBb|ReT)xG`IXuuo>^=?FiB@fm+;obCcHkD|!6n z%#R1J44NtU6fpu#_l_My8cqL|qWS-b%9A%cAgh9SkQZ@u31k7miYGIo>L&~2>5+cZ z=)eU9IzaJV@1z5cF3o;1zk^pd4CQx-K3`2#0w!v;ET{!+LFvT-y7MtiQZ+6N8vcs{ z3Xn2mG}C)RJa++kQfZehLc~joctC~ZC^&D zpvxm)KI{Xd^XZ}Pd{A@vKvqcPqli1_Ot91Xl01*bvMtACmvj_=wdgh!jS@TxCt=A! ztf(kLzJt@w`aE>>1K*Kd<0LKH$p;KB>WjBM`9fm4xi2J2_=;n-LyD5bY1mMPMNgn6 z`pJd>3z6FwM$kxpn`RJCS=Jv-J%WI6ApFX|zom%ob4rV5aQpw@HA3C*7?o|_+6N;j zU*?98|5v^v2IQUbpDbU%YvGp_2Agm&L*oB`->TV@ykua1813-FqK{clg1^Gp@)o@S zv@xv?XvJZnl)^wV+=W){(4>O{_M8@fbCyEVpG_8^RS$jYBIAkS=^UQ|fH4EtwsiWU z4Q#4!7{(@F=V-#E{}FC=hBw?o$0Lplt1j_dU2!`%*xOsYfosQa4Ryizhmkm@;j3lL z)_$BZ61gE>6If)54-obkeDA!^!S`Siv;8NhVJ95Sf%=4pCGg<@FU_@IAmm zUKH%yUrGs+#5tt*@F=x+ma(^{Z<?$&3RWoK}t63?~h=_bA{_9pW$%1DpNl9!Nd^ zR%*}bVeNNCgZ2xhwyjnJJ*--}Q_dtdY9AJKjc50+8A5+8o-+PlUkQJ; zLn>Fz$gWyMAGuo^0g*vBqHa%c3Vkqi%C8^iLLqlO1FgELRvmO zYuUT%`53@WPQVC^P#azCC$PlbyR)2!Uc(;3WuC@%KFUZy#kl^t6?C0=P&2SmZ=L0n zL92Bhaiq=gEd2~j4{Sx@Hx@oQ3Y7q2lEnR; zsfI1EFn6a~?v8o)%)a~h7q=ia%5jPaRJFv(1=6#|m1k!^ZB@XoA&R%`6rCwmldKbS zMcdMUb*ZsaiGR9m6cdurrk!~eyj5Px#OcRzRb^JZ^k#vPnp@`uIkoL9dam8pt4PWfnC55Zgnq@kE>qv#8fmU!3l*`9 zH^VKax+-z*Lfpw-uR1dN>u*}FzotD6vbxSS+^tuRzvSKXsNc{5)*^PdbYM6xyU)h} zZwDsUy;CB7v897?7TM`FMb5G+{FZh~1@p@=C#S5A#w$cjo`7K?{_Dde=a{dw+|ywm z<|AgWGxTX`rx{j*1&s@uDgtU@OKi9^d~l_#n-aG=pyl@ojT$yiK9I|3jOwjW=-s-V zEX~f|$bL#<;iWj;mLahbX%%?KNdVlo(Ko2%#TrNbH*4wajq|!2_I|v(;a4lW8@h+f z`$H#@!h-IG-0E%&d%GJR{;<438h%r_|H$**4Zp6GOLYT5jI6NSgX*r2h)YjITplyx zlIiSdIY8_aFMTfOKujmLyFuMNk)x*K!oCHfR5BVwq%4b#MQg%hxKbIYVBOnD*JFKq zTHo~L8GY0K9}#CeTAuB0s*CyaXDRYfWe099e3y63e$FBh`Ay9ov!8e9(b4b%j8%8j zN8t(J4ctJ)eC#WyySNqCIF%snHeiMpc z!$u-3oHg(^OFVizJ&RKL;rwy%cef*N)dz*oAo^}`-rWrya8m7bA_lt4zDkqbdxm>Y z=s#A+FpU++37F)I8Qc&yY=9M7BI>qrPvQ^$+fnt_bFJGfDv@B5=GEI_GX_k%PL@yV z97$Z|rh59}FP#pmRp8I)_obR@fY6Nax6cyfVQE>gJHd-V(*lkA6RIh>QT>>z%iTKU z@L7yjsCQIhe`{JmxCmuAgra`%Gi*-u?wIoQY;b+cpG48HXoEXW7o~u*#KOP4&lEHR z^rg|!8*F0dVY@OvRd+q+ur3j8ORjFZfK-SQ-f9xOj6n=nKrzFWx)z5kbLV%|wZb?1 zbqnycdi{^qPOkAfRgr7F-hBzu5OKkYFO3?0ZSDj}oiJ5BEOhiW)IRy69PUTsJ!Xh8 z7P`uUXD-`soD6DQp_!UnnzM&7Ff5l@NS$g7wMp$nAbz2?kDjOm?+%to^_}nCoKX!8 zP>6JqRdUuQRS?+WhM!r$wZG{a-Pt7UOWB?Nl-&YZ?YWcycEf0lZLr1RxT0eAXL|`p zJL?tJm7I=6c~4XuZUWhPe8(RNpl7aO`|Dd*+*+t+ci*CT66@xI#Vb#PdR6y$Yo_xf z!eS>kLrkwK4jMY#_HLe;wn;Ztm=~+aT@PoYLe|rzf-=e)hngB?9X%Tr=()`75T=^%0wssKL z?3~#6KM>SaK-=*nM4^^#1_03_JH$aHY@OX&8QE>-Z>I*?56vz2rBn(3H34G$sIRcj z9f^VR8EFA1`YvWt#p?85JvIM;iV`;qmmqLUJWv>pB~A%>YII-JAR1kPC3aiv+a;|@b&gFPU=|F^92O=qB+^fod0_RVx)+*$ z0i!=r#c&-V^jIF?(rzLKDoL-S)s&I75-&3ka}={lxl9g(E8ZI|RIUdX zss&67FT~oB9S=6cdg0bfzEtq$XH$Vws~TvEYZFOvq%2IPYsDoI+euLdsE&#nJVLcs>v+#A#I z25$=!g^@)0(HvnTA7*6>#DUh6;TOIE1AB}k)*bs)WH_X175EsQc0FnbekETY(wWRR znDhJs>TF*rwee@U!ipNX#$^#f8w#^{mq_E%+F&?NmD);f<3!9X9-Zz?9+t4**6AaIWBIArNGMN;u8XnC{8?V6QLw?1 z6X#6Rkl4H&e^7j`G$c+4I;8LNj+W>2UE0y|JU(XP5UBa1_#{ha;H--C8{p)Un45TU zNMuVmgPc2iCuoEBOu{%b)DH(4A5=igg6p%*u(Su|fN=yI-ElM7shUlqpz9E4Dsr`4 zWVP(03dB#jf%bq+ah;a#;pRU4w0Xal20Y)=+Cr`S3-xgUi}gH8i2VY~+1flUSC|6^au%IRlC`^71JaNO z;WJRb`TQ~G6ji^}A<;Mk3`cLJ(QDFTP>B=BxGIM88i4NE*2jI>B>u(~HkEPaxv6&a z{8@-o$QjI$E#k_7S6*P*1xsg5!*O&zvG{scet3Dww3a8o@c~{7CJ72^(O%;RQ&2we z>K46f>r6P>!vb+ij-BC#znV&j`A%CIEsSv5BK-5UbZ%J6dj*8}f(i_-oYAP#!p9a4 ztQ%NSWK|1^XU#2d-^ zTxYJKNB5%R#l*G2T4@M?3>eKxzNCMlm^=TXCm^qbvQxZCP4M%R9Ec`y9(J07o>Mdh zNz)V@jTS9+u>hN9z|`k2Wr!k3pPv(rCZmK;(wQ}rf}}Vc^)G<6;mPi%GvncZeU$;s z-kEQw=L1o5Lv-T*(cRDK4ub+QIPlW#z+` zDjv+syz-7p391>XWpBc!+t2kr>2@V50g|R|_C&9T=$oxA%))|T<-`blB#iUho?bGG zM;6^VXc~9?c~q>N;bX)Z9peuPROz=J!lsk7EWCh%S~TqtWL&=RB!y{Ef)*a_t8RPR zbIG;}`fMvMXg55KT>)c^LM`1i4(qfJcD-CVlGu#(?-%c{ix21|&Ls&_Fi-_yZ#xvW zEAbmyiKGHP=&kNz{vQ+)EWLtmXvICm581W3z(G%jSAB`)v5Ohp`F%D@Dhw}MC3a=M zpOZi04|$TmNkqDhWTOC$5(TJES<7t;0;1I3$t$2a%5R>eTTk~6U$h~uq;d4@Bt#I0 zw!+pM)@(Cza^s%r<2U?41Ul!lLY`KZu#J00?n$%8|4DnRPHi+lJ2%s_@UHf#Tb7R@ zf)5tc^my7QSpuAO<$`)Ns#Cjb$HuyAFW_?_pZ8(;?e31_*ZcW=fX@f*E(^KVBDFM= zBI%%oYI%=c;Gp_mww;3=&F3=$Zgtn575AGbGTglE-6Qs9;Cy9BK85gfBG*DB4u`L? zilIe0uoV4WvXWbMJOfJyLS-7>Tj3G^qNuLDe}Lbxc!=;y%Mnb&m#)*odEdK+qkO7R zG8#M*e|{xt+>FhsNjU(T%Xm1eP;&N^*jS-|%w418GUL2{LA|i=m zL&x63I1?)Y89Ey73|5Ry6UdRMttdk8O?cH$P*nS%m;Mpep&mj450*^q%AXIAlARsI zVMv<`Da}F*=ah5%Q7_}uA|^53+IBVFu#?oUZJB}@~oEQmS&+C`#b$Z@Ju=V0#+1SE45>aOH8H2_p$TGVt+ossuHQKa`Vbx;c zUzr!1#9MUcOi+N9Qf=rw!dh9@EvY?9Zmj(q8T+{zE;jF>@Ept?%eu^?)@Q zcW#L5cfHNyH!8GPOM|+~unG~%rnE4}^YyHOY|zV{YLImhG;9TglB*n)8}1Am#|A6M z4k-S1DiX0Nd5!x9ul9uxCbdXQDZ}`U2dS&%Py_LPV7_REi~x5s(HlE2Y`8ODF9a7| zY(t-&*)f3bLX);0sP0$Q>11b6N2qiE>*K~NI!g6nf9}|&*92d$f`fh!LlTrZ$X(#i zo#@Y4kgKaw`;N{xY!M}@b`xUZeO9&gjA8?ZJoW^{i|z57#^fKRVJn|%>-l2x5%jFi zi@s7Ubz7;^^rC~hs#yFjjKIEd^)GG3HS{FE8z`A&Nf;yYWP974j6?i6=u=IUh4mKB z3!AL}R)Bxwu8xDHU5f4Few|PNqb?35pm~g=cC5J5K3R`7$BE!SeV-KM@Cf>r_|vlg z_^X)CF++aK=AgF5tQ@umwUsz#1KrgRF;?^=C2wGk7b)kq9b;R;=Y0Nji$&9@SndTAN>kbCjJG4;s*U|`;u zUptZte~HKfF4Lj(NVRFG7a_wk)_(!5@)%j7rvjUz)t#SX3<*PKu*WT|H(3q*`pTfb z%2k;8pgPsCRr|5G_6%F#AYIQF)$=;bv+AXbT=&M%Jvx!;+^MIUbAIJz{1ENW*gIX{ zP*_Nhei10JkY!|_h zSKUU)8-@8If(U;>evtQJ!N2WpPy{M1S*&JUe={kOHJ6#YZE`kGYj|)YNh3jev&gF6T4HZ)1zmQ*q;m^25q3=njQLOVa6?%1RoEtG z=WytMjc9u;Lr9mE%194tP|TAWrZ8`_OAXJM?{Mey1E{u^0{K$@FlukjL}O$fCb6h6 zA8pw?`lMPRdiK2^V8q}h!DjY}ZEia_A=!Cen=E|oq(FpLN~4BDDi?n0uSKyeG2o*G z!|+(15b^L*FpTBzWYI%m@CDYx8o1yHzkm#@(_pGH9+8g7a;;vA zfqez4fiLEwtnF(|1JapT7|gE-n##lHFvb(DRbDT}vMGS7(3x9aq%%s_^RIYow7eEx zFdt-Zc`bqy>^sA9spRO+mZIb<$C@gO6SwrfsP5VIO-`~n9JXF#65O8Tq+i6rnEB7y zfc9`WKEGmGYvq#9sXueAKZzFPi0-I-Vur$N^^Hn$Y+U8{Z~#2~9sCi6zg?*OfAW`z zE42NseMNau@&}7H@2T+EnG8S z{MAFGWRbK2Y_+$D$!Z;;BT>J5MKhTKAn}qkwe-Tb%HI@nO|&f^_7*dU50$Z5-x|`U z_}v664Q?FyPesBH6C?MONMVLclMmSP>HQD0A9UHCv7HEywW>cCt3P5XtWV6A7>@9v z)2KEEIXg62|xF1*J?*oC0E%qM$p^CW-nn4r1BpF0&RX@Bmx zV05r}3@n;|!x;aju|aLEUv~|rG`V&)qJO#eo$dlND#4911uhy+>-Hc%FR8h+|a#(*eJ0%y?)sO_e%HIcLdV~o3l&`ptb1HN{vp0v6 z)a>ld(^k|h4+HWr9)W)9{uYyPMVlW9V&T7yJ*CxTR$bU>Yq>u$`hI3vX)rb9@N1K; z=;ULomR0@e^rO2I1Xy40A2ud2SUig}s*Z0%QI6Gq8ZQ3JTror+25n)0dhXuf%7wTF zWqzgmG|}8_Yi|TJO)GGIs&6FusCdZI@iJSqoi!XZJS7k>zhFEU#FjOoJiA}qvD-$k zy-8@lKTOusGf20Bs%oaO2EQ~;6TRn~L@&1Og)>N>uS=9|#IT(F&!Resi-ozZ z&1wMa^jQ1Jvk29wQc=glpFlFy=dL>Iv-MQ1EGSQm#ajW;tyFP3R(nmnuGz1frD4@x zqhSfU%z@fNfhfMvd;yJ}Cs`2qSA+^>NB`#3#;J@%Bn%Mk*yHerJza}9)IsrWZ z1hKp{0BDKB+mJN#+P9>NzC5d zk6vRlVk!BaxuKPa#1Ids+2SXxrW6A5hi}jFpFt;xSVJ0i>i~dU|G#){ z-6GYb(@TPF*>5o)Uf1)*MRUu88;Y4<#P?FL_k{X*k~*ley0v2E|InxRgHyp;ouKif zGWeEA=mTf5jO{d5T*6^Nna^N+BKM+K`lyZ7JIJ~fu8^t-UR zB<*>!Z+zD(HvIl8yo?OKXqeDFtrflF#3%TDU5AQ`h$2^8Ov`65HNUrb-Kh3jb)sMW z#B$dO_GZ!L?0*gFftC z>TQn24j5)RQk4D`KeT{@s~3vOER!CzTKD#ae<`NH7G{1Qn`J3Y>5xFIWk0(dDhiI8 z_J_B>8*b@X@~$9t_$-@{Vc-h$b5#YK*myRv!-82;1haA*=qR_ep82P@ah_%Ws#yM1 zka}(Kb%aZH;UvAZF16O?mS8qmFt3Fpr$KTHPz@i&77Y0{LAlL_p zZutULHS7~|ybe_Izu^yZ09oYD<%$jqEgX^rSD^DumN^X3ab4ov$;X5xXW|;s9dEx} zSkk?U+?xGY=tW?YO+E0px12p$&A6~+pGXEP%S(TruEe`Z8g^?h1+u}@D#jrarmnMh z5ec=TIE97{3xzQJWmG{hA;F zXkdcIisSP#U$dR>5M%fp$d~G0xN;n7;AF<$+!-~Z`s{r7=@QPa7l|@r{+fC;8q$zb z;r*0wt^Qq$V?ZxSv68IAGY^aB^wRxI4dr1iDPOK0@?CazEj^{j*4u{7{jHq+Y<3;~ zonC-qv{rB&-s6^1q!x;7yauc!J5`;cxq2kBz;Hx4EV3_hPp4(lCl?p7{+AV#aQKg$ zFAl>f6(fdtuyqS%pfChh<^(V~5pEbhX6)yLYw$66yN)1yY0KvDT5h2`-HaZ0;~wnW zaYSJ9{li{b8Xt5uAO)y!*gvjFkXJ}~({QJ(B(aJl@a5eMkGTB1G{=CqTp~1T5qv!R zn~B4(s=92=CeAIOm4A4A-#}dgq$q1#Aep^C-mqmf>09Pj&dZVL z=1KJbnDWPHfR5}=?yv6i)=vTp`R$(+f#tN!2&^q({4q9%?~>EMn}FnL?mdvD_g9dB zKgS#iV4>f0HhbDGoht1M|0lZbCdn*1u%`HAfA6#Y@m#~5 zj477y(b9{$4_=s_vcDNKCPRkgZK5Mh6_)h{<;d(^wEXG+cgw@o@>#U(@umx6Ac*KFCzu-U#!ohAoR#TZ_Ejjv_mPHzR!Pvwnf;r?)FcGN+zCRoM`&;Z&4UcgqLLFIv>*~bm1&OcUt$MB9Y$T}Bjw{7 z_@cWS#Z|m#T4V8wX|^XwzB%`e{`-U;cAWYYzi6HMsH}|2u$mZ}t}N2S9=cET6QDkV zznBDsgW*-zisI8n9b%SAoQ2{PwHnb;HXn=tFs1Ht<;k)2HI*kh)`{W-yzL?Xs!9Hg z<~)oP@dmGbZD$R9&A=q)>#-)1z3ic|1HeT{z}xvI$`8hS75so(AKt{_OGJg?{Nv3M z=o54FreHU_H2cd}d?0jfpRY8^6+ZiprM%C#Q*Sh%?)|&${TJSN=lkpa?H|5hTX?_9 z^ei@eU$83fqzZ5ZvUo-CaVW@K&PD{?%ijXJeW4tr&~+zJq=%cN-L-0OC|UMdVut`(A05-t*jbd zPO-~cU5>ZQ>AHNcUCz+uS#~)~m!)>utjo8U@St&?E|1#f0$si=G(Z(}vkHQGhK>)} zI&=7_pij) zf$A&t>#OR64nIM;`f?VdL(6k0^bYJB;=h-AMequJYp1)9b~u6qc!?1lh(Zr4G?cxn zd0;54+eU-c&$x{vNi6vXl#uGd9V$mKdoGXAYVSjTKmSg@H9%rVg`{p|gtKTFJU!Os zphwpwgH{!1YlVcKaJ?HfT^;EU4@UJy`ROkJz;>Y2yNeBD5WdPs zDEte*MR>ne4;?(N5ht!RiDU(Qs-uS^g5s?#l<*G_f$F8jD_=#~&Y*U^$@rQ?`of=c znQIc!jOC;ui{+Y(Jp=bm15=o9^LLvVj; z&75%ra9YLHhi^C<-*c>s=g;yy^&D?J%7tMM=NK!hQCdCjpN!<#75LIV2`&3I)e!4prBeVYkup zbiR^_39c^Jzz!u|wU;?rPMjXWqn;lTJe;SNzo+-lsl5{osEd@KIF%=3{by>!-r+)M@gcc)cXH>Xo}SA`HKEVz)Dg z#VP;bigOK{wTWhb`4zEj$t^~o;7xV(D)A9AyfbwomaDDQ5AtVu>-!`^lM23VZ|`Vp z4-~?XmT~aFdti9@l}>5KlOeh0IRS)gX}jBh0&xcS`RtSvuuLUe-X@PB_2Dg3tn^Sf z`>I@FO|YLE?wccvm|#{wxc&&>wma0huzkgF&b<*CP6sLRDIEoqIEt4$TJH58;1J3R zhJSt#w29vFGMyt)*|gnT<)yc~s|&sK-R>&prGMzI#)E!bY5XPv6?-mr6WwmZX?u7L zFTKP7YpCXj!}%u2#a1spLnnW=6-toXNjFfGtka4SjMjQ*>&5<1oq!u%9 zC9PEK2nB4e)r&CApkV&Euw$K_v5sifFp`Zi(nwBaFs46p^HFU-7KG) zNKV|W%j1IW!zLIRODMgX-c`z(jSYL#4=22K!muPprmjGj@ik^lb~d+I335{k|5I0h zv@JZrkXThd07^**b5*&2V`=Je-2W}UMF`pBXYYz*aP}v}BQK-)!4aPkP5J#g)#Vg! z0;X{%zZiw5oLxG;3x=2VU+QI$Cn!)Bv~~DXSMAkGEaZqYy<<6NGXJX5JV!k`_t{xR4dGp+uNRb_fiCA_pkb_cw40yQrA6M& z-D)MOf}{Ele_5H2HB-*1e-w4upIJ@|97y!u$5=sfnK^QfU}lFNYkU*O8# zMDI*9_kMudW9>D=dGtx>hwMpul79v3vWZE;H=B|{m{`pE4MB1)+-Z@8bz~+PDbd&%@C$Wo7Uah0B7HSoOtsznMK9CM?8uqs0lsDBE7eU@r@dG1 z-pd~b!~CNYT6SjVmE&O9DZ&~;?zZ~dmTBn8t_2&F4 z%(f!z`L>Ig!`!@X^9O6L+%NPx`ZO2M`3DT+E#28t%~4Mt%sGX zB&x7^!e^6HodGb2c^2_TAm31M4{vzUZgOa58jX#7Ve5N4UwC}p$yaeds+-Ql6rDR0 z@?G9I0tH$JyN*U<>**d43@QPM$p3*!gD=C+ghUgYIFlEs_YxBlz~YobdJ^J#gv+A` zcd*{|VD{a)hP3vtZ1I(Zf6314S^zKMKjvlr9hexmkTOb?P91vF&n%}eD4mP7FN&#{ zW_NCQHQsfsAq{8Y>7|A=ti@aEnR2$=QPj{L4Z=n!nO1`gFZeUW8RJVERGdQfpwpqr zoz+>**~$;&1B@l0{03Ky4lI--*@^l;>yCc>`m$8R-SJezy2`xd$EZL}>4)6&-Yy82 ztx6G2PNTqlY~{(IlD}L(pv0|Y&+4&p)Q*k2xW|O5mol;#5Q1EElyc$2$D`A0R_A^* zQ(=)!@6k3gy9YFkKdRMu4O(BOWI)5#u9^ohX0LvEnYrpIshtGt_O3%pX_TE8U#uB> z;bQ|c)(7bPZfOS>@K&n3N{Ss-K!?JgzAC8g)fw09t+^P~6Lp$@Lxp0QvB*%F;R)Pw zhd-xT?!zQFE1i@ep`zv=K3+&>oWtf&)!d;P^I{^XuD&9eQH7^8bznnC(7+!-IY=+c z7T2~nTX7})c-QkqexiI58l|E{`IKohs+PYf@^~P>jG~;{L~A0?So%3^%fG?xMLC8; zwjx7|be=oCFG{=h{A&ddT?nw@K=@m3k-B9cUjjI!-h9D7#wftp(lRQ{Wpv9ZVSY_nmB0p(j4yX%H(8M0zzC7Ol+2my~4cgG7Y&%KFUJrtyh#jaUbNob1kE^XQ?9wX zjLZ8aY(yMr{!UE3;5=>H#{*c?ez$n%RNR_LdYG6(t%#&YQ8&Li_3j2pA;4I%cOuH$zKVJGzjKmgf z{sNX#uHjw{Q)jn8<|XF8@B)QhF~m#2wLkp!Q4mRm&3>!Ec-RevPj?`WC~|(It-xJD zawkyBF9*{K3YP)KlpG_X30w?#KN%-8J@LbxDD2bt3 zkI%&IBaN#GEK&71$Av}2@1O<&b?NW?$Gct{CdvAyzn(Bsy~|5ap>i0)(xL19zl};_ z758FLKCPuQSsuw}SpPP>SY4hthIWp_VgeJfHNwZvD9zQvhOwzWjQNI_{u`IMx-#9t zm6#A(p`;=04g0)I2@Uc-n=VxH`wct1^%4z*w-O;yyc3k?6SlAUbIM@-mBs7p7y_63 zoVzT>;uiBbYfMrZt9%cX^Tle;W*_y|Z;EQls-{tdDI_#W6kHIcv{=%o^aTC%?9O0* zxn%jC>QV0)Un%3$Nm!{r6O(@h)A?8c3px{ialgN`lpxrrF&cns(~b8-VLGD;$(Qoj z$!+_CE6Z_1>HU?4hnYfuc->)p^-OhR_QA=@IC35yRmcJCqs0#}Ue+5CbK4H$Z^g;+ zvE*qRIE*yD)PFlzQL5?t=_^cMf0BSWyR<;>;HQ}{PKJF$-`?J~gN0-}e)6JToPSr8 z2gSFLr33(?oB@UaQ-2GPYcl1{ zLG}j;B8ju5pX?b>I2P1ZMN237OD7dAt;)ecf?scq32ijsXv^!XhLgM{N%LONh{Co zy-;{QX9{;KgND~8G*-p?rZrAlQGwFyEieF}Jr{*n!QOgr`Q%Ouujcr2S3e0TClP%1 zpMsmFqQm`EwgJ2ET)lSNSg!sW_cc#n#J~n9W95FTalop`F2#@!&WwN(0>fkC-q!Ao$r;cbOuAn*N6o(r`h-X$LRKiInAkj-1n3z zaQ4&Hk1ZLe)N08o>-OYQEydzMZab)FjF8XA62kjUEI*gzHssET_d{^V|yFW zi&O^{JM4|b$6;_)Wac#&*Dn~^B?F~>Y~qFO2z1tv!UeQjojkbmAaXZZxZ#3!>AR|oSRpUz6E%CehDs=lgBW6NG;${+>r zGX^nH84ml*OK6-HeCQ|bIGeZ0jQ$M{%`5LK$R+;1v| zlFl#f{YAmv)5X)lfH=H$qR_VIkixo4j*h(I&yXHLY7*k~O$vr}*Iz*X9gDEgHw^s} zeerG<`GBMG(jS)~xk(=Ma>VZ;3QYKZLPG>e-0w{`pEH)QQxCh)3Ya-b=itID*h}8_ z4voN-P3;*wb;cyJ-6#0nCw~Qvkhg zW3Q{kpma!F9a8gn=?v^js;`*z9eT}0bFjYTEI5upJv7Ela8p@uLwTaYJ>?aewon;* zd;S=?5zQIXzG5tKhZ4HgTIpMm5#K@p_!bes%e>4M>0-z@t;7Ti9B|&IYk0+#cTb~A ztSUlONU`PJW9?p*_NK8e@R67K25sR}o_Rl0ld{-1vE^rZ zH=k`kRXFCY9jR&KFwJ79*hGbY6ymjzO2kkB5$I_6Yi{L_0I!JejOMw_w~iI2y}bRV z3mCl?k(ZvSfif4agsTfqX_YFs5Jc@aj*WR44EC*r(8W|Xsm__b(QDM;wMulStI)4%6T^n=a!$IvUDuKQ=zPaZMF<--d!XJf6f>; zXuq|R5H46ij2(iF5&Yn1ZzylS@xqwDZ2`5QDA3648k=B)NBfEk1sp#+Lp_)>&dZ!& zQo@Ny+EK`f0YF#ko-1eZOI#F_2xM9#?|oymfz4Jg)<}< z+eoa>=^C|wQ<-LOuzeTmBboq<|K&GUnxyErj?s(B(}xUvQ>O!cNB!9RA5}lZ{%C~v z5Ypcvf==#iUpY3G7@>uY1)(edj|c>HI4lJH{{PU3sX6f7B zV~D1Bh(;fURoAP7)=;*k<35=q(9vP44{LPhD6YZM)9zwH+Rt2G&=i zipkFIKt8dlrJ5m;R|Zoc4cH&!pD?#{Xb2WpMq8TOB}GVoEDGJwuEV^piePb-0&P|w z_m6tn=@ir~N=cP1evth(J3Z53%#&@|+2qR+2@>DNx$t>Xu{dJmHsLrdj*y?ittt7cXOtRZ zxMoVG_RFJM?$yp*sD+6Y1s?)!N)3UkqfY{W{teDTw%B*)BBb965+&<`#zyLHVT`2+*>tJS3jFt*65Fs?YuI+>>Sj(KIS-khSqH$P&bjHHU^8)E6qw7pEC=KNMvqDiW2!+k0Kk{)ZpT!Wx*-Ue4Qy@veVn&V0;@LfCPLADsT2k zP-*7`(t2)dE!P((f z&i|x%8xSMdJ@P-7MXNCz`TvBpxrZYdR{mRhLgOyapIaWbGO=A0O_{!Is6;a&IQ~*Jv#KE{K?IEDj&~J)>_lTe+Q2sCQ-x_cOcviYEJqTnfj(!?($)pZP5DjZNQ1 z0~6K22dsfFsDVZk`X6{)HI;>rtMV08{i3kLK<_>tQq496+M)=z?>V6sB$A-<% z5F3RJOhqwd>Gm@uBqLW*IZ@?Sjt!QKQDl(a3%TcSlYbOk$n1{HmsG~RQ_HrisB!LR zs&gT7`@qkjcA@x(VW+d}{?ZVr1a}gSGf}L; zKi->`9+H6C{<9NyrFKn%G`_rO!{>fm5_{q2C9zNP8MCz{w)~!w*o2>z#Ag4%eTM(2 zB&N^JKP-ujmd|=VPyM(g_9H&m@)^zN6Prt7@6VOQ>bpx~Z~m$z_AH;xe7?lz z3O;|@TM~POPxw$ttc%a4=rfn^S2{~#{STJJI{2Q5VdxXovH4;88GSyvldgUTmzh}qb=S;5W{I~mj@BWh5b$mJ*$6I%l#P;*~?*HMVG9BMN z^|SChC9!vYcHUkRd-u0WVkMhs1qEGspz=Y3l1I7rP^?9Ao zzXNZ5zPP?5_KU3e^;17%*OkPM-BJ=;%%?i~{Cq=6?58)E#5VAm&1WC)et~+wx~3#H zk2*cRvzd}uYZ@4}Gv9n>@Og9<{o`{UpWpMli07MA%pITi@OgAKTgmd0*mG?qv6*~A z^04e@9)7^5>zBZR&xiN~hO^4I0$K2v9*mf;NN%1Xj_TQ&%G@>%ww9N1hfN<7Mq+ofldJ9kO z6bimjhb^fo7di|0aIKgiN9$&Fv08WAIyMt0FSFVzH6mvOEimF1Y|;w$7mx9Y?qjdU zo0nq{z69TAi2OOouX>&>+yhrFXR_g6FdcO@=NGVXEZXq@gd+qLQ_I*+{RzJp@Vd>6*$Em{ z4bes;%nBHv?Y1lD|V-lMOgkn;_w+C{IL2aeSPQ7yRmA<`jf)?xT~}+I7?aVvg#@iRt^y7XiZ~oLujjk?NctcAnN)J%Cs%*1F-xvD!Xt zs$nZ|v$RXSF8i~bU^;8eY$jRSu2C3r%LzKX7L=Sb=lhu&KTBAiqZT9G1cpJhg+skfk zeMT?uR__Q0%Aj{|< zXi(@EkmT6(?ov)3uAMh9RCieL1K2Ew{lSKNc$(`Ak&A;(y334{RaYlL_kKy| zDx47gc>&|HzNS_b%Nh{rFIupgsKjaQGZqlcV+xG?>u$c94{oP9TR_~qZ zY*Tje9o%LsS!-CN>L=Wa=${j}3V@<9FH^CQZbjohO}aY=#oZbuLlTUp$YrK~5(Bj% zF(C88jSnB)T3mRwM>bCX=+$E|d0zVQ&x61_pir)*MemP2klI&FwwBWTZU5IdGs}3h z(8!kuibC#A?V&0^wzt;HT+eviLfR6?D#puv50VNU78frkTSwoJbPtCU6Zk#a@BEDv zisr=iFj!LVZ~F@G2_tC{wTm89^_)?ZdY> zaq~W~@|^r*{|3@6!D^B8=XwboH;QP*N%=?)2z!-iEcnr2EI3jH<=;Dgq+l< zpc|;S?g#97tlx4f*5{SN$$2m6u;av1nO8m@VGp8;y=gW$lb=QWU4ZaXn1H zigN+VaDZ~G@jQ?^-BzfcY;6;P!IxL5BAYRYUt>*BPm0Z%RemG+cxnQpdW6L9@tV5) z#@cD~=Xq;Kf0#FT?7%vIhTlqNvvNERI*#}v`Shg{-pC!*G)_ko$p8_Y&Q{BM;tvZf z2l}d$MeXFD=7IjyzETl+39svlW$w%dksjWdM2xyD+31@Y>}>0WAb5#YGsvC#E8zNdPRZ~gaHU%-G-L8{3Ue#K6jn`TVY zH%hCsn)0^qpqwIDz3Nk%Cx71r>xd6nGzdaRZeZ+L>(A=XeHBAO&$UtwJktM*8#_my z6OVX-H-9aTeYf)2?%iPOvn-s@_7Oz%9of?tm zug(`lv^z!UzFTGeN&d3p{63Mwp^Fjjl?p0WvnRcHDbK97s0X=X2?DYF1a-ui42SLt zM!K}z7Umutt{vK=TFP#qoh&-nY;jkB^+iVTck98=3cXQ`%y)||ajCa`x1+6RN4$+S z&|6Gg#6Gt(0wIBLnSrS3s|F&$2h}Wf^FF*G#`)K0LJH{5GjOJi0@YS zM{iQu)Y~hUoHx0DQYZFyopJB(w?}mSbwsMKbmegW=*W}F-ngMcDqmG?Q1{lH&8m)g zhsW?}KXJbQ+sO~745%yolitn$^$DToR#lBw-Q_OQuV}y7qya~4i(9%j&LUH}1T*KI zwOhTi_o|=pZr)H8i;=-Jt(m_ZEr=p=T&f|3Pu=h0K%hqs(%ErG}8a29cnI$y>ih)OLXpS-!;vq&9*-O1aQyCJBrV6 z`O2dV_jmV{64zgLH-j%GpGesXsEVLqTXftYU2U6=mttW7TTvJ{cuuak&K!^`t32kf zD8o3%2$0>V_0Nc4P7f4riXHDRdW-3lhtlxlSApA~F7$g%qKio5Hz;j9O9 z3k1NXhY$qwOBeZ>C-s)2n41oA?Xn<}wfYbdx8og|-&?JNf`O^yp62GU+L5)`8hu5; zRE=4C-APv2O{D^*g7VoaaFZtS$d)6VGynKmtZ$6ja@8g%b$OXfE>b^LABRNzy`sDE z-RwA1tzbsAdh4%7;?ruZM0|Fo>acBqc8}mj&I+k`fpXqN{G-9Gz98T*jt8)lB2Jcg ziHpQepF-419YwPko36|SDq}MlKiXbB!%M%4Y~gL+c-AGXZ`VNTZn!e+&TjyGHLD>YVhQyC_hPHKI99Fo8YnNm7l z+E%*1NqbWyAlROE{J~3|XoE2%pxC?>^R~q5cywgAqZ9$9t`r#25R4=|>|Cf!8^szGMT2aPw zt%-ZzYOGFob~H{)oHzMEq|g8Io~ihm_=(}uSuE44_bh+ajbZY`?aQV?ZDv`I1tzS3 z;+?EhN3GOQ86h7@N_o$o)X7oaEJqr_G%TeY2+MgFePAD4qQ7EF=>GuMh`#u_5BnV3 zKQ|(OgbCRY&En7{g;e17j-%??38kDQ0xT|xeIpNhnYwz>S0T!vw0^~lgHvnhpg9_( z8_r_u4qgc}A8~}KS#i3o7SnRJmO?@b`W?TyJpY#$3eO|N6OtOXL}3dZiy6UsV&wMX zU!K2r;Kg^ofnLplZdsYke=>F84*4L6uBDQ(VCU_^ro-V!E4br`VqaHZVGH&z_Zy4z ztwU;$^u{>GKd^;2$;ReQx0QzZq(Zo%<6*^G7t$B6kxe{z{afYd;pd6BDy>i?#YtM1Gz{3RP52S6xfjK-xNxP#~T zCLH=Yt=SszwhtT1jmbJ>bTcFQ?`K{^YISUmX^fFq{I}hH4LeaYDlq~foZweS3wyBE z37Z?L`&jr3>}~LbJvqM5whKK9zsEg$h2W!C(aYn#_qYK^m{eOvl#QZDC@j!(B8Wl3 ziz5o|XGE#d?tAI$rZECj$r0_Bl|;N>+n;;Sg8wF~OLtW&S6uxVDFrC#fBabE$nwO? zbjhu7$5_<-LMp~$RcSXMntSv2590BXV&8Vnhz1y{GSw@}k=IGV<`!wN^$_xg*qtM- zv}6#IfnW#KYF>K14Z#vc(^Qdt6p3Ul_G=VJ92YJ5rRT!a zG-8*h)u#HybsaQrLImNsc(T@L-bHF2H;OBMrD@WDvbTO7+7iCHnHvr$u05;7 zug9+~BJ*e?4!QWWWz|y?BcRJ4x{BUe#rKV73_7@wemhd3yB1A({0~mEIcRh8gN$WQ zJ=6ZBZS=M|E&Cx|w{ojaSmu+=yPxBZ&1!dJO+0^^{WJg#-7u%D9zwV0OwswR?-VTQ z#nn2`tp-+S%wulq%EPlR!W-O{JB*uR$>LrWg;Fs7HUIX=!nC>-oa&yaklS8*=K>xW z6jM8eRdMg;c9Ej20P7w^Yu;8*a3$$pnuC?If^TYnBB!=6#i=p(xtC6lRgI0Yt-Q{T zHQi>XSd<@={<`wqD!rwD?Ke&v=I_2njoe5k926i10Z;*sz1Hh6E-9PpJMV4ts5>f7 zY+v}@zY!72I)Z&G@2VypP*qgt+C~#~3Jblimy6?1_@+A1dGt-l$r1MMR$l|tbp@N6 zx%LUfxLaM+@u1^$TAS~eSmN96>!w#M2M8ZyE7GIz32pAydUqpX&kKb9Lbs!W-eJpo z*|-Wmv&P@KQVyKax@ew7HTH6T_aPyKjemgAH!&V|U%OS!fV?67D3a?9W1WCFRIkYa ztlL|bR^gC+%;{hv#mtPd73XH>H{FV*Y@fo$s^IW;}AVk6E_t( zajK)fRuYx#s00Bg|H{1&sk49n6l_FH31$o1sl_^4Ya>z`otgs}fkMbkz&QtuN^EB% zBmx+Rr?NCooaJS9o+-RFoMNyO2y^q?F(fS1E`py(Ti zf@Q}P6kAQw&q>;f(B|t?w2vRYlp9TD7`>a8&8>Ms#K}Z%3GR_(VRiYY3Kl)?Lhsx& zqU+BiQYWN$?jHGgvNu|9n*<}0IL|2-KhPqAIHxK=qBL#UK*3fHDzKIjsyZ!UkzKpitM_;}|5EH#D`H%SibRr|s&EBUog-3*`U<^QHAPm& zZ=B>#Hz&9u)fZRj56{2xxPrX6+tTO`8&yD!s4Oub3U@#jQxP`8HrruyN8_mc zg#)cbi(^Syu(EXg+tHy~M6?7QnF6>P&h1~c>g5=Ja-1wYyvQ9dFTy;;TmKWuF1FSS zl7O1bF0G2>01l!0!n^ihXVT~GFr~!=Q`@J0X0yD=pEvwa@~Mb>wC+ZOmzIA@w{N%d zC5+mQY5+7tRstrS-M%~jz^HTFiqyWi9pnG@cZIj`s)guFsWzx5CUCd-Cv`Xc(_Iog zoLTMAP6%NBU@h1l=mctt=^q`5Dq36v)6u{V0uE+==K&3?(m%@X5~IcN(>#lMoxg0b zE@vxXxK6HlH_m9{vNq@R&k$Z~9nmFHwd5SG`MF3h+7~{B5f6lz*aF3P4om%px`J30 zpct_#NGaf_gIlpOa&^XR-8pkQ2(1`rd&Ny3Ak(-+2k0RtVE@WU< zwr7j!gL;_%+CeQL&7&j5!QwL62bzIKjf_kjO86*k5zx8_@c%Bc&-+lyr|h*VVlC2O zMA;R8K{hbq2hV(?-=wj}0PX#o1=>V+e)8LY(QbYpYXD(%>S1|&{5UF@v7fHQY#!-fm4 zkmMC~)?m~qiC{X%=hCy~KRQ_bP_kT5uem)+CQRCs-66My8M?Y$TeE48JEM~f>~*SS z$c{qJwG>r2XndzlCN+KSSCDzM8#rOi7;A6)(xQOm#iUe)!`ML2$lg*oWwtHV&XtGm ztBw%F+{!;UK#QWoZm^M)?kTI; z4>MQL*#ZJJKUToPY@~?M0Mtm%ev9|anc7%ah&0+UvUbCEj7X8bg_pt#IFY~<&&alt zI6pldN@KI_sKkJJTQINbCLE?>ouQagRn8ayzl_TsK)3fc9`zspAg^yUjZg3IBJjL} z3Y{wYrtJI}#{`g3n}bBWNoZqAA`zy+h!$zRhWU2otzABmCK_w8-zA${YQ?OWx4z?A zZn=|+sJIu)-l{Yu$>D*CoUR$9_aBI{Fv?SHEqm$bxI<1uRL0)zx~7~Bl|PAr!<;sUOKNkG+h`}f}}N(@*cY4 zrT-0L=XdEe-?2D$j^Jo9vP039IC^%I0a7GVvOB{P_Yu*9^=oz zz^JiQZ$|-zNXaOqj|?xi&n@CKa8G%n2r~}M;|A4WL>oqJE#x8;^7Huq>Jnp9IPyxc zxPtkz2pM+3!42Er(2=1C8DzD@hld|nh;p-ulintnZ)s*&F_{y86{xhDg7y1#7v}sY z*U&FVGg}qrHhuBu;m98#Kt#m!Z=`rZm26Yb#9FuP$V%iA`dkq)K=NEWRE+K%M_)F+o<*nG#UjTuZ^1nD#CRGpG!t5+4mH)( zd+QsaNSt)&oz$T-%&hd*g}Q}_W%Rq5wde$iZL_#)lt}S3S5D2K6n0+bTA{r|VXS)< z>;fj>$0U`HEa{AKAY)09x4pC@V)P}ZW$S)%{6N>A&qtP8`+GPHog+RqVO?tBLhLA? zd*&-8vAKM%<8uX{FY_tv3PTq2;5pzBi(Rd7oBM*sS#TP3BdRZ5bXpzw?q!|>EW}fB zQs50G1t~Cs<38UIH~h37*beM%|G2{@Cl>jKYg$Ng1w3k6z4T8d_hi>GveV3#J5gIO z6r1qDr2WKvFZ~-a;Thp7Tc7_Rzj8JYZimr*{d0_|lX8RIx*MS&=3Ctu zaLFTTsO7+hM+WfhorbNb*LUpMQbt5NhP>rWSO6oiOy7f&{oVArQ$xqMVym_T%U63T z{clVU+tZ;kP)t+jC__+JHk9%39UBeyiI{kq%QdGvto)+)S#w*EniJXvQ3jIcX1Ied zIfxBvezr_wHWoUX0cS?y$jbJ3%|ChR7qI>C*3Q86s^-&P`g5|}u}M13I3X|n@Q1l$ z8`k@b;tlH92aV)XC;Agpop2a9ODCtbF$fENAyE*7QYjn4{r_4N9YvmEoshj3F!-*2 zuHQEL2=C0s?*BelFYbHCT)8P2$|w)PZCmKdxNevnvGd-JI*h0noz_~KdLDS^KgJ4` z_3|nxid(Alxl*YuXL{-L?3$_J`jE(h?FGS&Wkp!O*3KjG4l=)^)Dr)z-KA4#+7cd$ z`QFWU48!KDY?@mZYuEFOz_P|qXXnFFlmZ?$exT`)I85JKSY2ZF#{ZhpZ_?JtiEo6% z!>W&R;98oPjFSKk9FeS!MC2Gd`9Pc^me=2kSZ>c;O?r*YY*&^QAxmirr5A!Bc(=+8 zl@XD$x{C=w#@FtnMCu9^nwqA>5tclNc#`LQJno5!GYH zDXw6#N*<^tQq7yJ;P}Hc{LPaH&R$_8BiP;d8k3b1%3szf2 zz1m)|y9x*)VRj+oI3bGBerT<>zNJ+wT8N+`NyIErtO2Qj5nsXfa&1hbYfQbGa6ndE^Yvk8Fd##_x`#FNMW&_ff#?m5Vc;|zKn^KwHv^wNF#Rma-;(>=QHGf4pF?0OK;B| zo_o(UW6A4$7B$8^k*(sK6&XUX20~e1$p+pS*S>4XzHmdey|H^@GwKR$(?SC%oOMsS zV$>NVafmm=017W;uQEu;O;Do2a_Hzl)7wyW7lA`(jf=#@=xjR3}SM4g;1j|cM)b~ zHR6||d#|&Af`}|*k0Pi|$YCOjbl{j1kh@!?ttmykw=K%Uq%5o;$>9fB98gs zJzsV=S2!_E)7580AzrO}ArpUsB$5e{7n*n0lw{SosQ%Tn_) zwu(|Al%kv9XQ<@^znV;sBwc1rqzx7- zUr-8afS9k8jghjj&;Nx`H>y}AB}VI2@Tr&EF_4Ol)fhd?H+&*DoOI~s|BxF*lM}Dx zYy3c)<}_i1Nwx^4ZY>M;<+&@QwFcM5GCw^;b%I5}3k7kNXX1@(a56)C`d`DdrYRCc zfaBi`0r-Yv@tA~sIXR5r?uQsJNNVfmECB^=-kV&<-d12Z=RoC^cB{kT89w3rh<9+4 zmVo#RY%8z+#n6URLhF0t))R5+LBwhSbh8F@z@5vSpAz0~*Rcq_ya*>ZcXpc$1|ze# zM29h!UUm)+D$VR0K)kE_-Z7}+jf${X?XX#O>^jyjU=%l#u)aw;IIhR;?5!5UD7;Wk z{KnowC_>KWw!wbf4bPMsv4%4MVs$Bc^dRp)kNgWN{tXSEq?-HF%&x%VomKNDU<#Fp zGHm>UxvPqNPTgsSDsI`*aBa4m(hR zAM4qfzFtf#5?9iCL&Bvljh+Y7ZZQfeuMHA50YCcLm76eI%3xxCx8h^jWIw&D$AM!U zV7p1Hd_rOhQH54FvEwJ=?I^)FiTKgvQ>T71V%I>0Z*BWxsLm?Q7})MHkSTuDEBG_F+cDz1r~Tmk2T0=vjV*);$J4a4&kjDPCA}$ zm4RjO-IibHHOJ57Q*#`*Id&s~42O=z(+6tHa1!#m;egt=8$ZnIkK=bm7dP(9kcV$I z?hEyAq)dz=+4ypiU*rP6$b}L_rOI`JAG!wY(3;{UVZ>eZ6ozC=tS0xy3jA_jt-&OK z31Y}r*wA(w`GzhQnS-p*;43#Ne_Z9fLAaY98>ixI?MBg(p!RmSf567jXNr_S@5oFu zU-pTvrorz0pA&fg3IfqImMyhq1vo$#yj+dLdG+@greu&)W?hgKpi>!uh=TEtFca?; zlt%pJi9jO0Rxb&Xd?;DEX!t8{ZQZ)HW4}h>Pf~GX2$Gz9nzP+_VUxlG6##<^N-T%< zm4T;YZZ=4;7>5|y*^ri7$B#G;%|Dj>o41C~xNTI-4}?(k3LP~>>kKsw(SRZ1xZ&|Q zhOPDCh3us$grm=)cxQCFfPk`zvFxyciLWRAo5GEdGTn&1$Cs+14(rp#!)b`2R?8+= zz`ygc2D{%PVkm%Wh+H`lxOb95aRGuoZutKQ2kZmO8O^b+=f41mnLubPM~nTD+h`QO zjU#mNiC6*EYUScVDafwC-!eSM{E{*p=MLoHtS6U#+3iuV*Tj+HQ4H;oaUe28;Kp1Z z_MA|35ZwC95jZcoKVmD_u@tf|vA8|0IcS5D(P$#(_(TP~PFiKlt4}tsypVn;xF`i#lpYzQWMO+oroD6(&=fwa3v$b{AfWwuGVvA9;s-Tid!gvT`2`uR%@+iO zz16NowY=#I4d<=1P(lL^R>81 z!*nQ%kINe*u$YMh+SW@fhRZdy5rHaI(J)x+^PS?#K57m;AS*#@LY0agH z)KZQr3E;BOzu151wS9CWTZKu?-~Cj$KaE3AlU2jV6mQ9DfK6#rLT~MA8FAqVu9`{* z0(m-ZN+=DnF?{tVtJ$K`rcDvCI0L@@>mhacxNtd}RE_yqpixa;;;ioU4EGfzOQ7&) z#1Fwzp{+qlzij^FyxZA*lZuhj1wfFl0XBNq!D@3-+!R+yOX-O5uLwfsJMRGQR^YaX z&w)(^FJ|F|9#PWWV*Rz(C`raPp3e1^MOQM-w_)?v@=UKh8U8HCC+i#a)6;RtSZfT& zN`@97))ma?W4OBfMfF|zCz;!66+m!|Q zL85%|nfMFE`)c-%JT7P1MPrrhO}@Meuz<+`D2ZB^YGcI`*3H?TH#$1lyA7~rzMs4? zwMOg)`~b@4Zkb&hJ!EZq<@VXLXLo!8rLgn-ZCxXq5M2*)6FaQ{Ak2puk&UYrdp?ts zld&$7Q9i~ltT9VKp)B>LB4m~zBtUS|OfW?))leN}2)#lnzHcIHlU8wm@-pYoUE!yU ziKctCSU#19&_5@b#4Eul!9_VR=x#ZfT;e*RR@zZYRqrqSRuas`8VoTWyydi%6deCM z%UCi4Pd@w?yojE^j28OSm!sfq-W z50XG~e?$>!Mw(XDZj`=csh2Y1e4tb^V(WTM;~J?%`;%^l5i%ivh<>nJYf9^RUS?1G zr|3n#6RvW>(4IAE$**WZ< zHYMBA@u>i!__Z>z1!gmzO0@>{R!7L9AJE9|DWkM|UEwb<7s>{^vW_qalH5;YaGGda zE=M6KtqB>nY8ZJ_I00SoKVkk>FWkdK$0Sv|6V%dMgu_^phf6_4Ew0M5kiVpI@z4|_ zmVRCj;=J`2uC^?bM)nMQ9-_m9LXT-uQT^@iu}2wWMH;)K1r=b^=*NwS?Fb&;T{b~& z&y)8iX6o%_bAS7xP%^YGhvzijyJ=y$1wG8{X9v68t49F*RS3zU5%kpW!yBv>+0uVlsy6(22 z_Nro1q+n3sV#ZYdy)$F3wNQ7hZ=iCUR$U0_9u5oy+Th-6qePu|s$Gp)|H0V-Y+ee|>M z&BEPapKGqCn5ghRYs^|iN`W;kVHe~}-ciyafpE@t_woXN{LeFHLtd+6Nzpy}fO32V zzo?jhg`|b0yftrAz$z@|M$mF00|+#&Da1{KJa$xbjWLR@iKVaH_*8 zIl9gD+VND2;KzXXs~6COZy-4`-}j<;$54WKWo7^^q33j$Ws=z8x+EE3VqAzb(nKLC zSr$F-?>@EAJP6@^M0zA41>So?TDfi2=634n@nra|P;BmX?7$6Z*}d`}zbW(!L+k=> zI<<*$jWKu2{0yf|d}yczmotq6+dm<3Bm|pF`leKlz1E1`KMbfK(FnaVVjRJKR})bC z-523;ynn+nKa&Ks9OV;vY={uK_(8^Y2Z*HeC)ailDu7S8Sqm9?z))2> zGJaKnk*uen;H>$Q?;xnZdoDIayKC%$veT@sdO{K1^ctd8K3ihMg*pp0GI!{dpqsM- zic@#wG7{MkHod*VC4!25kw^j(=bwP0>W907_TI-RccnF5a#?6L;QP9{1yU7`_KUi!j~{E5cLr2m zZYqSS)0oDQX~zLJE~E&d={WViUd}A{&eo{%G~!Y;u|)zy2_I>| zAt#Z)Jd;AQ3{!H)#9H8XT1Oh}z4?)U--O^PGL;|~Swk-JAq*`7)jZ~`cpS$cBZHh3 zTk#hs*UdRR4q4oy)h%GV8YSncXE^^#KLYv6H`(tg`V+2g{`hIU_w^#eI=z`;T7J}J z4sr=5+2Z?qd^`pxV#L=@gwe(GVA5EL%mb?+DCiy2WB)+wK3o^ECt*rB(wT-N6{5Kq z)uY5TqoVS%VFNwiZ$?)Xgrv5uFroKxourn9yqo9s>S}PW=f3O~!c)O0q*l4M6QuCg z?U)8MPvp!uYVLR)cqDllyr1H+ImJ&y;=T10Di#d4M?27Z#1sWGxANy-`1w9?pJQ^U zel&kN1EqsYa1S!^!8-!7=TE2Nz3t4j`cL%{Ui$1RAN=`Y8!PN$eBGh(;TeV;f;ibH|87nZ4gZ@he8Xm&?)N`?{NW%SU+$JvD%V3%eBe_9F< z%62{}=s=f}1#rtVd|}f(-Vf=~8Zm(+#+ixADmF%RhT281rOYxmbz_}jZ0 z)K8L#d3{lyfgzpMLTKH4-|ph^G$EgIZo1PomF@+VeQ-7=ifl=;E$xC*Sf(?*ZE&-S zouGgLFR>>4%$tM!htWfMW22vd$+NAi%0l<1RhNa5GVe|3M=SAPfP(sHzwEaFqLK^z zP!wOeeC=I-;_Rja$J@Neu^X6QT{2T@Y1}XFoK*ZZ7XKNFBQK*L;*y8W*<RWGPKV~5_8-0g}e9`eP_={ixY;~Mwa7>^$g3e(W?dWG3lrBSMCRN-?6_8l-R^nTDzF}73l*y-)ubD)K=ANERQsK|HXaXGrHe4 zd9(1Q*6beW$AnXs|2{M`4I;rjdvQ8Q47Y$7=tM*Y0dv>ij_bJlv#>OorXZ6~019_@ zhr#6pj_TbF?JNIBM(j+4A?MFD;;W(8>^`)6^ZQ=wZsUPY$P7mO2>xx|)w-*#FaA$$ z-K8n_(CQw_{rqpbyCr;`Go(~CcN-S3)BWfGZbCx9`fL@T?)?z2PvwhqQCBUUJN;vb z_Tqhq4GsC3aD}A_Hh+or_Fc_L@5SYHiUXsa(sTzgjho!1*F#+g+wVl;Hx!KSwvNX) zi+fO|>kr`Avyf5Nv`dO%4YA_scxK~B5Vhvd>t)1xl6*u2Yc$b z+QRh@>#cU;t(pFF z`r<>zgD#k4t`O7v_IcoJ@DFDYiwi+RGx;Dty>ZaeRg!AGO?suLj{XY8#4ZVe#-19q zi;Xb~Gc{OrE;)g!qt^$wh8hAuSbZ`Q7E*(LN>?B36)6ort zoj<l6@N(hc%K53VhAl+b(Ge<8TzmWlS_F_f(x8&M4wCeR#>>SO zlk%hzlEAablmerEVG&Mw1&bJZ zw6-Xb-H5$H{Y3D|E*nN`+ogb*vxW<=&dLx{)|z6xRVh#u6m5rZdZMX-NF$r1H?u3l znB3yX`t@ufT5fLmgl59XEo%Gp3g4VO-sf#|MAz2Ro0g*>#){nz*ZBOj=>ORR*&&$y251 z(JCYDuNjW4lU$8d-t)O3)!BQ(sd!e>2L9@?fiYL|GSm&NS-? zY;$=MGjBZjB0L0eE1xiy{1H#q32*<~K)7qs7xK~yQ*g$l1e(29A)LCS^lQ-G?cQ5> z18RB0-ys9>RHd@`DDf`TdYiHiM#*IH%C+33;t;!S(3i|`08M|u6PTuAGup0m zB?>8!Jc+t!zq3uWz37wp)#?8EC)_1uK5OZKJh2WF$G(>Z)w>_AyaP`GS7i6PcP5B7 zD*@?6w&&~IFIAjBCb{^e5nu{ z!Tsstp4N6g1jv0CkfXbo3okbA-G_+3#;+0N*@DxD?SaaxFT5kdK!5c zjnGN?z-(A&MS~aHlQ_9BEu0+pZ+4<54~oXNiy<*NF1qu~4QTRYT>9zXd|c9bq_EhJ zhy>8r2SPS_RH?d!#vp@yyZhXmxSLDhis)4MECy6oj0Y*Xk*0OIilA3it9JoVnCo{l z%)~fv34_W~%BV>7A)|)%Zh$_mUti*;MeQJk6#diuqk{g-- z8a%t|?@XJqopvgaR%RwzChk0e;@bVDvSUlEDO{DJbG4mW%L99DjBIsk-UcLfklJhjQOtc*Ww8>Vk&*F2Jvg)$={)`pfR$k+b0RKt_8vs|Ez@vNr$*r{qzx-o< z(R2JfF}ZIWHB5k;Jn9$ukYpO^Pb7WLDYOl4OpegKDk9J33N;ogc@us~+a zcjiEV^Dcw!cAu@?WFwWjp0wP7RPC}yVP*7U_>;(U8k$q0e zfTG=(m(eK7=cH$ND*;DeOp_It{bM!_HyiTJM!EQ=Vw*tRb2#X)PqhnPA%C!DHOfrS zra(O#wl@1Jgow%N>iq`k0GzQKx>_;}NC$C}ZxD-4iEcWw#ovUs2*#ReKLV)}>{rN* zu%eZz(V;8TBWLvA{SI%gDk+2(-htF^{P(MtF$p* zUK9sI6^QNv6Go$$_nx_`-ge0h@?AXFA0y zV!8bgF&<3Inx5fVOEJR#MFIQA2bv(p79RnPeti>wT@UzyIMiZXjI7jmE#JzisLPww z6*JS8mMIcwPpAs!PAV|WVJsrJMa$F5hREq=*T8%G;F_h#d9j9hXFJy&-R9xdeK?cx zpb$#NP241|OZJ9vp{~;$kq3;DMv5=>XNvzs@(75{gh?5Wev~8x-ZSy;?hTAX@;*P@ z^L9DjF6?jOu=ui(J9=Kv!)y40+p9(7b2lSUr0A{JAUn6&$HpkYr;RP(_wFZ4G+7Y=f8W`H^{S`9{A2cMG|;58vU;rKTCvl18VH2GuQg;-c|IQSi1YOeD~O$AeXAC93;MjkpruhkJW00nTx~fJ;e7t zW9bBbgZcmK_6oR^@XaoPr{9kdwa*96(Ncx%wUEkG(oe>-rHF-6OMX9p`%5@xMzd>u zPP-AUs5WvMyq`X+oD#D@H|dmE1zp*eAc=uu;xS_LKgJs&YZobFb|;qPODu_UB>eCB zV}^}MgSNg(rn{Q|D*K}x;PevGA1PVxq;S{R;sxBMWco<2n{9orb9>&eP)n$cX^@4(6ckj!0pqJDs=i7$^IacM9GMeG9K-@l&}Y@1il|> zx@3g+`;`EN*6Dl2yyiE13$Q4@OmTT7N-;27FOZ$$re6S@ZuAy`#1dC=DU1s|^}kM}j=pZ%_9WpwPkvSu|vK39z4ar8-BmySO= zJ~(MnsYhja6pdxShFl8R{g!H=7)Vvjr=Gv?Zi(cWgQj@tgGeV@vmKYw_#sRvGx@1F z1fLtB?5_9=hAEE;vA_c+5<)K1ll_Sl+29uIpz(lOvW_MLe`3w#Ac83;so`3x{OU^%MwvgWgF2W?e9y>Q>r`uVUGRF2|D$a&B6ADczT@#7EfxZsK{2 zNC5#+$GFhG0A?)NIO=-`zB^{dc`&m|;&2tp`OqV&h^wWc^*pG&J~YNvcCFnl(y zPF{;-#BDTODKrhJ`p*ln1k$L$v~mIS_T7mRIHYkkoYB=Up@8vvL()6JSWL$KoF%#`} z!%m_y3%KtDLPx4WxGA++<*o_xuw{K0757fyrJ4>=dUG^Q!q@fA=$a$M$(2Dq)A9+0zGM zAd2EWM*S-H-AFDCdEABSJTv0aaUcCs(Z<@{(wi}+NBP72i;I5)xm~-^P zPw^}zPdwo;nzXb`G`Pp)dKaGENw*%8Yg|N6w3bnigSH<3ZUu%ds=sggmf8?%+TZn+ z(9@wD`%L-Q^H3h*%#2W=$r$U@?~Dq;kayH#x@YN$+*C1aeDQfJ!VOBEr{ZHnmZ z;mBKydn0n2qV03Q<76(P-9oPnB>!+R zMQ_eFE(KW^l2lHHa6|pfzvBZ2PnmJMTg@y-`iCm6Eg9T?dQTuU-p#lcif2!9sHa#> zFy6ZdT9?0`Tkhqssp263C8ctpFjOOMVvE{w?thV@u!pVhzz@;eIA}JfRPAIPg#(tl z>RAn1luU2>^CAXZy^&p1b6#@7NA)rA>+;D0C`d}(=m3N5Q4_T{uA8jVOsjVeQrlB|bo&!8t!1PsRN4hx818umzC}AOZhGif3RkVG7r= z5wXI(Sl|u#$CuZ+%sQY-xfudNt@+w`xpV|m?3I+NP$QtV_j4#wR=Wm^tfHGz=`Sb( zg#y@Ugn$P#DCWe4OTa)EDpbS!oMQ9(8OgO#&rwIRhJU*s&GQ=CdFff;aGdiIhA?%5Wg+e&RZg z&2q-_UqmRjLmzECem){}q&ELmdiNO$bDX0npxIS~MbrxwO{T@(Id~5v9sVU8)F9bz znzU|74cp;&1bMNII{te}9m|}f+LJ+A+tk@0yN;6`DAycWI_za*e{L1_G*AVs#ePLu zUjpFNd*cOhDH$&at_52BIINkd)A39h{`KX*T095fP7*{Hc&ja=L(ug5OrpAcl|75A zX3Z`zOIB8rzOnSK(;y3j#HV<__&44*_82C6GShlffmA*nXu7B8xgO8PgB4HXO+_gz zQg`4<;jMQk9#7?b%TSzNWMOdFr`{hZ=Lj8EOg<2j@yO0M0EFcKx# z{uV|wEfygo!FcHXt5CyBZ0H%;Fm$yJQ%ms{K$o#4QZ6zG8d=)ke1Yf|`H(c^{#mHy zFhGokW*R@dGFXZ}*z8RMU_S7?iTu;(mEaFmk+Yz23vqR`pT_>ubk-Mtdr?~DQhgRT ztMwwX`KTj)PTZ=5TWA%z{V()qb$J<3ii`~f6BNx(h9aAdSu`QsgA^o6Z>cOr9P%At z%WlP`jO3VpHXXVBL9-Ra%u100yn;`9;1ZnM^V~Uyl6HfeJzDI;5|#-!IxJ!g5A_cH zgHT?{wW#_fAPLf5)4CiBY)9v98K%(+$>ISXoSBW6)?xdq#I1fb&;WD%veGiGOluJ3GxBx{; zMeF{s7)XL)hcE^s_7WQrH&x*8l~-S5#LvaJ#Qie?4_Y*mfH!MXK;K;B%n3NSoJHMT zc~? zC$P{h3dPqU+W=0fuEpoio<+nB%UN|Pm@8~*KquiGkO*)i3-gycaaML07JQ+iQT*RC zpoYeo0Z1`+9}iIxhB+t!-Hf}CaFY+QNO%glSqQMv)mssd?%lxJa<&QTA{4h>!+^4C zC+w9^q#MqPr;cHfgAzyWey;-N45&N60PYy4B;fA<3<8a+^(WTqt1hIV=k5eLX6}8Z zKVS&SQ9?9-pczg513e&FbYwEBNvUKB8M>>7j=8u$Wcg=MzO}DoUiQgX-K{f+r?>qc z$LD3v09JCgZH^WeR*d{Y#*Ucf6nFk2fQ$)275S(b3x6ksJn0tkt78!|n(SS{PJ8bO zyFG7y(XFyfN4NNmcc{j(!YS@BH174|Qf}hS%0x$ZSC68whQ1=%Tj;b9$B2!ZY>?>Q z7iLW(wM~(Tc)&?qQf0 z?rIq86!#tNlw~>da56a4J@Sg|c9;kDaf3@ZIF@q^`tqmiP69nqvOWlIvsIWO`Z+Rl zvWD<0r+`7)Fk)SFzE73k!Ej;vR-;K2WDyQFE@{gU@nK})=%G_^721qEc(q}eQYTU> zZq3<@o3ABsQ-!MH?jO7ObcT9fYG?SZpbe$`tsx4k_DV(%g(*=sH}c^~tGG1VMFP7q zxe3+!!sql|w)TU|I=a!1=t6B{;J*XK&=Ryn9@+u-J!l-%Ko2tkiSSSC+&p#LAXY#h zo8gt*udsv)TYq~@+I6^kdo*&bi19M=4~!r;5&fMIeMIR0q4CS^ww2fd@LIaxeiB=w ztiWt2fGRh@DawZJB=_CuG5ABR3~vntP@l=px{FKmI3{aXt^^!uMkT8^;@4L9l)6$% zkwUu@V0ZOaBv77)c)rp|cLfcyioIO>Oi$G>{}V+aH};AdNkbMu1z)&JwszqF#UNNW zvBaYh2<_E^DQQF(4>GVi8Nmef!5CBA$FA`E!gv!_VYU&Q2AOBJH7DrpMCXcU_ZDUW z_wW7=l_Y-JUQc<&I)d29MyvCCcwUU)wiveoVvupf)skYC6!X4XtW9y=FaIk!G!gFg zoopifb?i#&1CV|?-V>$Zn%_`iHR3@=bc!BgD`%G&K9qjqHNjS-m!p?|f8(8~B1*wP zC91_Y9AoeKTq+S(A;VFLFkWb+e8xwGyB!~T*Ptk`sO4@_T0ZhE-wr87Ddz!&c0;$D zO{wnvr_me?D_$&z(vA|D)EU$Z@xn)xF&GbGgBD#3Qr+ZbzK^0MD*suNU7Bu9DzGNy za|@P~dcS}IC;Qm@D^w2O(OU?jF$_56+XrH+D3c26DZypQSN;aCxf|8w3%tSscip8J z1~16{A!{f*g?v>aB)302$1ow4dEbYd%onsYUf%T!A6Iw`=gTOju}K9jsy&Uv7T%{A zG1w$cDVg3CfAR;7P@!>I;I#V=;mtUl4TSRrhmVnvTbwUSS{%3=?aL!9Dy7JD`w~mb zCQ^G>BQ1g$+$UdyYAuw6qTg69SxF{6KmTZC^a20s?T})&V|S!JgWd7t z-yoXgzjk2{q&+R65I;jS3gUlry4|MV_>q_N9V~yBvzUVxwM8v+ErLtc>f*d6)9`~d z@rnX+d}Y!eopd)7PO7>Aet zINS#>$X2sDN3^Ka2MDq?9{e2BFlufAed~CFb}5jOS0}G`w^8SYx&k?l8igup3oR!dGRRP+4HT_2@*UB(U0%2R3yQ7E1CIfXaHe zZy;oZ@Il5dy94eAC1k()D2mA=?m9S;E5dZA#-+pjrfA&wWtf4!-D9ADkH?WeBy1!e zUilXhhU&h@>*;l@+M(NIG27km{T_??^sjoBc?Z5IvZwk|s<0e>QSMXs=?neNv0a;t z*d1S>2K-z_LGOYZJPJvzoODjAcm4ew1tDlFjZmq1J?E;dIugK>=%cV1kbeVPthxx>mVc8}PYB+mM-{<4;|RY~j)pEv1W*F@*KQ5*-ozTIB~>N@5H*e) zimAwe>8T1P9nbJBdtS|+RXZZVYSCSrS;XKV=iJ27r9=c?ajXPI47Pj5Fn=*_xfM;p z94C$eOF~UFM?0d|`^VQ4JuLtzTaQHU(fBm{DP;yHAWdsVIb za6vHf)&0{502K6tKg{EOa2^;I7Sy2X?M(%_(9zK1ayw(bB77yK*2t9(0y}SFJ zeV{s#pw*Pq(7(NZ7o^smUL0G|c%}m+>0joDAW0{TaJx4LFLxjE7PoR70t6YGHD`i1 z8TyJlb!eJ@VY%SE+juu8Dk%J0Qt#xYUoTI%W*}0i6P*dsLi?{RMAYLyAg}0rOp1~J z92ka=*WehamtD{8V8n)0p_(whSAx)U+@_})0J;*(%1f!e@8WaL_TJ~*o;p9-E0)6} zxt;@GyCA|?dwQu=mQL{@qY0hIvj8H!3;$H+*F)4RbwC(1Z-gkO((+tmEdASYY_F&5 zxV>0SDY`p9dlsG@F+kH!K!)dYyHxN~I<7F)Za42$-%evK;e?80rkSD&jgfd^-3~%xpt*w zv?l>|63%CJdIfK?l(zu&wHNfheEVT$_u_4r1QqUVg?HUMjDH*3yi*HH2s`()m zEU2PwjQB$GC7G|f<`pAzr>2PDCq`N$J`hRdkkJ>Z)A68)e&u}T-+dp`P*s&+r4SJ! z!PJMly7Oe*M(j2zB(&{Eaokv_NWZrKk#s|mR>x(ML%iseA?^l^)GR~lp`aMCNiFb)$lFG}cqTl}&14(kYb%@Y4(iFQ@+@pu_`3)t9<30|!^|tMw)a(oY07|PK zVkh-5iam(!0lTVMY{D{2xyVZiM@}iwUuA%1=Hm_=WK(FB=agY&k?RokcRXq zQnn`0fIWW)s9?J$Y%~VQ#&<8O!LAYk&KFjR)U%OX3|GMRvt|T)2*jMlfa|eny3aUA z%;HjUrz_8-5~tIyL#oCgFGVZE&4khPwzDOl!(bfeI}KsVd2_O(N340-ZU2@c2+WQ4 zZ_BK;d%ln2_fc*ChV(ZFZR_43pI19~;kWnVOm;{l>%Cy^fE`>UzIOL6>5T@4zcc5w4sh^6J3z-!Nj+b;Pni{4{UOrT2d!0 zYhBxMY=6ep1AqAM`bY4uTLFPZw1;){{CFQf;Zw;*V@XvlVCaCogDi^0>U-e3-cb^N zVNX_ zGg5Orn(+!hV6*vXNo$BRiiO6rcg08iz3=`CEokJ1j{FletlLJt{T8SL8@JEO?&cV&#?}7G)@O9-d%_9I_iSK(aEbt>_=NT zO%>GIU6!p%-;UCXdScU@p*TIw3NF~RS46(j?jA_W1-U5Q_Fk>#-{savGp7Hb>flTa z+Kz_YwCM5fsy7No_K_4KHLwZWVPqLZNAaU4z+Ga8`D#6%;Z(;++%4b1w89~0#r4Rn zUwQM59k`kRU$5Xm>ss(6@#OZzP}Teqzd!BB`bdZfdf+0|S`@OcB#uW46XVJtuB1rn zL|b}7T*>dkTyp7(_uXwpTQsM{iBYj#0!nQ-;DQ z(fHzQYrTtdY}(wHMoW4MNC#5UFbP^6KPBQj@GrVTnEkHg(;od~)pg>@F2^w@TF&jF z3D!0zzq0Y;)V2`fC*n+XlpALmSpKawlKE)v1fymN#!$JQeWgYR*>iCn!)6Z2ll z#&`f`fw&tOjx<%=8^lcye|4u1RpWVfqN);qQd3of%JG1V2)O&;jC{jbIuc8$hKCe2 zm}2a=d?8Dq%I50jct(t(1ebC*U|XZ4vMIB3$O!n>?Y_Zlh!!E@e%uXooTOED0Th`G zA}9}avZ;3C6y>XQl8fq6d5?~5W|b1QtHn2EX%hY&kzQIE_48L&cw&*TD_t{XX$EG z!S3yTlq0jHON8mFc>xfYQp!WkNu%uUdc1NcFC9vHkqA+j5zO@F`p-4KmBv8PVpVJ+DjZpQi8*jEz- z7%bK;149#S&?n7$?W`u4yMFpm0EiU%F-8K5QEV&eSDny`B?r{p+~1Kg>1h< zRNUwDFavq4oQEL4*neTD;j!n z%xBN2WE+4Ie{dbk#@Lg`Sh$jK@@Q+u7`tq=RXW;U&c(H6jJ9j#p<4cx6~~1@Hv;`` zH1`K_%Cvt=^|%{xJx%#O-c2KZH&WNTFUA}kE+sDGD@HyT;uYh3HT|}QGFa~d{Au^) zTRYR{?^?lTY5o~lVV6J zw6(&`z8J%TX5gO7IgxHa8n50D?F`6JdEJd64*^`-Z{IvFKj2-0BK|xlVyhP3urfQk zh`S%EB95`u0v0f}4oEC@@x=dZ!Dot;{w|AMq<8=YCaFM>uM9*7nv#(b{uKO7jr22@ zK7#t(z=?thY|48XgQ?Yw$;$*^r@RX6Ks20=R0#3q>Tj_$pa`;7LqRSfTaz#8>ESfn zaF1vrkXMnpXbxfC)wmxCb~0!%cHvD!#JIi}HL@GF@n|Qtb3)Sc$YL!QAF3j^&dRs@?DHhoFM}Cj6|qFh8JzL2$Aa zvJKn1MB2wWy&1@lvT%s)@MWz%KRB|*Y(zLH-Y)voHWZ(uDX zL+SvdK43p$ZvB+vIaY7R&5>cufpQj-w8*(M0QIDMYNbWZOUKP@9{0ll_;Ka@z#%2= zAa4feEQ?6K^c93AwPd(3H5atK4ReM|xQ>ugpvLt~SijuhIwSUXd;|vO?qqBsOE~Fq zkaXm=24ZaC4fiyk5PLM^_&;ZZ*$UYp?_W-MDrsmc9I6fMqK>6;w8oa7R_0oJJ>SeW zCx20H=E6*9tl(i_1~?a(;(l`B@$R*shj4&)&R=ldkNY`gv<7SMC9j#a z$j9IPaqaPQ`=soLLwe=6)cDMWej27=^92o=8^BsVR0bYABE_G=b&K@&7C0akPXnr_dALSGEIr7c?dtPZQuu$xwta<5@B0aFfDaoV{LM# z1mInfC0*PXoRqB1Io~=# zxWf^P@EqLBe4+{-uI_8h6Mc=?5l|;5m}7RHZ7koxnnH<@xnh)42ybFkmY=HOXAJ`@vE6h6$r3KYrl-!T|G!+Iw1FZ@PT{2SoBjrf1! z*;$dvm6qu#S;6}fntKmk;o=5{pCH)fa;_Y3#5(|DmMqW;r2eapRq?j;{=#z>L_J-d zu`=GDdKXa54#!n*-gvxs%&Y!eq&xo{0;(7C&cGlY^IBABdrRSsq;tABi9?aIt(KF{ zA73JKgy7J9jcUoNiUD()tCry3fOi#VEhLC?K7={m*rNp?&iH^)0lbBM z+zs9>pP?fq8gA0uC^%r$WtUxs&E@@)n0vRjp}j+YPjJuV0!x0s4w3IDpZ_^ZAO-o=stT= zrcs|`)Q?9lxe#`J^niJMgf%IvV))vD9NolyR(Kb!8$(DXqnRr7+79pXCSgr5)z%nf z*QqQjnjKDv4&f!;MH!|Gj}aJu$8k7o(hzM?U&4fhfhK7qj6Z$>?t&Mhfad4 zKH^-|1)xR`pd6yB>}gBWttna7gr(_l>qDoAW?Dl$>IF%7WtfG4WXM~Iml%$(V`(@A z71XTo9y@#hfgAp3E4)vaco>k(4evAJ^=yE^%P<>;5qKjodl-!HO)k8*CuU#-RtRNS zpeQp@lnxN!lA55k0D5%>;jgcuv8QC91(2VRUA~80$i1Hf3ByAd`8FCdj|BvuIrjc1 zn8Ta`S|LUtfD*r;Uxwcs@%`@}&N(rS$aZxi{tW!GjybP=oBfuHm}z}v9vopsJK?Qc z^d&4jeXMeKWTP`5Az-ibQ0*W)+G#KP(mFWn4Gq8e=4dgTx;#P}Znw&hIw)wDx62-% zcocWGVwKoFgmOCF+#MogyH+Y&>}d`8e6n$oGDBogdE(Kwm)lOO?fswZFY{nFXcKg~ zzq>ehR(>=QJ}PZ9A$A@y>zF<9Xk;|TGz#c57#Z*D?;T>i@UGbuOe@Q@ur*rTi#7wJ zciQFYnB#Y?1wpRH#%ya7jc44*K0FADQh)-R*qU|J{p@CL?9pfTNdaW+(_zeL*M1tr6xB+g&mMuqo-C%ps4x@fD#<2|x7vCJ2hCj}<2SONUV0ewk!n|<(oTBEZQ`Sw3m-A>Hd6g9M*C>DH_&80 zTwm*5Oat>lVVteQNu#Mjx3A3T+B2}&z?sJW+amLTCftq0>*S;WwTn3^$gdMgH`E5k zl*#E>k|qUNhmiXmSuff^olghJqfT|eH+#_vP1uo<7$d^2lA8?tKw4HnM9FX_1nwH< zdnySIED1&5rtul%7NEHf3&`o8L=z?VhoU4wcf{wZ$YTkbxD02mvaHCmbQ04Zs92k3 zz0qS2Z{&)PRlq^m)R9?S<;w@dAiiC|2Gb*^X&0psCV~KP<0Yc48JPf zDXvOK$Y%QNTBj(>o|>hCHnXe@ZJ?n8iXG5T>|$sIHXn<0>2RFc8EZmvsrO5qxFTP|i)n3s9ehooHpPeO+cEUaDUt;uG`} zY(GftHXioaP@s{K((v^mLM)EHb|1>w+*((L-_E!*t$0KpGFzXx84p(c2K?LB2lxaI z#5;WrTNu4T!&(J%e9DQpjCyOLEwF(ON5 zI_6eY8;ovX+qJ+e-n|yNlc!iqf;n9|oBB6FZXE)liIx8XDH*~G$PKn0Y`YmIL?67s zbt!BHB2Hht1nID+QgjVbR8UYO)ukxZUB1WMn6IZuHtpAJYfg@(?Nw~>9{xRJx_Pj` zE(Mxy#7(AFd4m(ILaNL;A$wkWYYG4h3EP6_2n>GFRtthCE=(wQZA90UAB1n-D&GNF z1jgx%>hf*)GpM?JJN^u=E`P_#tfvnte-LizTR13a!JWTw5Tuz+7H%V1I4Iqkmu^oO zlwqUU(hM8>X5x-CWWTNtZ?mq;FzP36Z#~<(2lpM~IsA^bAies!LDfZr?QjFES7v8$ z@ugs~c2s^fpN1D~V%nI8^h1YK>y4U@-n2oha6@tI#4mn`jlRSx!v1NIQjMP@1-GQ0`Xyw z)#X0-0e0=gJ@JNlZ?>hi?t*^-Vpy;B#SNao79`9?4p=y!NIC4n?ABSEs(~!vc3);7 zk$-(T8fXn~0!Bw(MR7#9TXQq*@mU@zw-#Ttd`tiC>pXyF9)zfRl)^29MWeoD43kfOE6<*$NlJBsRM8Rp%OP6*hLeCKvsQP*7L zrdju70Ye-FZG6`nZ9}?8_|`ok3y615Ix^`%IYs_vqoxtf;8MWv2!BChJSVft4j*(M zZk2Nn))Lhxk`Q;0on3{P0HSz|4YB01MYXEpZVw66WfuqnY6kFuTGizTT4%X#2qVC5 zIAGLoGm8O4uB96}t2G5gdyw&fg_dxh8UJ2Yn(>Q@%8EWI(X7^+hF4F*QSaf+C4B;V z5X8S$hzjl16Qx}qRAsvqGT7psmy~2TcBbChz~CXLEMRuwwEft{`PQ_hkoboCH*&x; zG(tQ>qr@{bT0BEz;2COr0Q7zq_StBw9l-D!2&KN50s3>_f&Gx3p`*5!T6ZB^)ND+? zR`eCb6CA|wap-0a{PtwQi7-7BDV6ijMA`)Mduz=!{0jxms0TME7gMa!ZF^sWAmX?3 zbL@|>j#SReNWl$dv`|Z1PWcWu48sPlN@un34%(C-MnT1Jku;sJsbmyEW|%561ENUS zpjAf}WYm`q##MlM!jBAx2ZZc392AtNA+{RW3r)7jHTKj@Y{@_iwsw3bi_~0&f$VmX zUlYGLr``J!!f`45;(&&JtA>gssQ8^WCj-pE>_eJd4%XHA@5j2AP zLB56mFVuYdY&;La|AX=W>G*#D{>L36LcbKC0TBjL^@fXFE1?&q9(>IE5hz@(y@t|( zSrIJ3HQF+C8EUvv&B`hy*kR7V^`P0UsjX8+x87KQH-jt~V+!+?=z<;B4SwmcradJ; zw~hi!Yhi&gNj-@$^S)=vFJqa7`7_t```cP~1GU3DB7?oBux3I(FbhThWetD{u^`7M z>wt>@h-9WLRc5ZkwLw4+HC3548#Nx2qC^Sx5~j53I<8uE8IYtbqw*8{=17fLCl^n! zK#O2+uVd~nxS#8#3u~uBDJ_jTAESKbdclZDuyxn&L&%cFmRg5tIk4Ipj-T!>Ko>!6 zeC7mT$AP&|CNB%JIS;Xdz}-2a>asy#vBrbQa@ptpIT?WSxL^^7|d;loNL6o zDS8cpzi10Ym*@^lqSbdxcw5_caVOdicYAeVFsFex)KqOG9XQEOCnE(G4`L(xjMxek zIH}W;klcA=UWn0}orOj`7rlBXFlE7489(Y{o3Mq-NL1A}JFiuvjzo>+%&BB{78$WC z@PNJJ=kVhJe1w=0e7NO<`7?3U9|Kl%@LpvntHqz&du|>VO}}s5UA~m{e`uX5c%vI3|H7$+ROQ88_tk&~lj)L88v)Y@z$);C@ zFW?}rqouX9rFd`n@B=@AI2)v}+U{PCCe4jOaHCn?3P>ziKgDm%gEJu_x+Rk+$C;^p zRCGytB1{bdcU7288QRWk77PziqeGxqL%KU@2LuE-ev7gxTix6b%YkUIcGT%e0CT{G zSA)iNB(Nj#+(3G}EvKQ;OFh<<`q{G)ghOGpW+K(xABdzi_hYOaf~4*8jo7SKM&yT1 zc#jh2A(ei!e*ButP0!W#ow(B6I8!S+8V~J>S?a2Y zyD;cPxCNC{G?V3#11H?Vj-iU-58~H0()vzw>L|pZOMmetBoSc<3r6fdc|>Bt-G@M% z+)~lm4^aJu+&!_uDjRD<Gq<`c=zI4FoNBO?6NF0h#u%DtKaVKg9ss!uN=eKD2&TL2z9K84uWVd7>sLn2SH`p zqu0`c8NbDS6eC2C=UYH&A0FkINbb}4uT&1?k9{!^IP4c?TJv#T9L^0JvEQR%dI%8f zt8Eip^40)K(i{QhVgl^|FsqcW@=G{Dacgs$P|)2~D4Ym4prI7V?SKsI+6`$CX*CMa_G1TP?_(wih#VU?TH&v#G>Aa%f%&?i#8(WGnP z)db9KfR|dA`FuHXHEvHG$59rRdGi3@C>-pVNO411}sVkoN?*yPF_ohTPo1;!BoI*+RJ0HpxBJ=BAgX7PxOf% zq|Lhp-{9uTX;2JQx4%tU=(X|Iohm&nM-OVV2c05l_nm0l9t`8k#1_|MZxdUv=*^KV zIVySCOuQi zU`vuSt^o8#qQH(H0~X*XW_#$1^_;k^ZGguluSNh&yGFRiMWrWl2t;$`W%+ajlP|7pAG zHXMeB`z!-yQPkxwRgtYo$~6UZ8!f)G!Ypg@Xz#CF`;+W1*3RkL!Z0!9zBG;)aQF+v z^1$9Tv4swZiCb$CUW<%mxQOJ_K>uwxd`9RR5YpmbpgWm0#!Whe4={R{aptQ&2guap zGuT<${X&OAu6|tuFk#ya@J$M|dmf-gw~p;!gG&;Y;nQsR$`nf7n>5tw2A=1Rg|%uk z3}jaMt_Y~uKK#A{E~@aJD++`Cn<9_E#sORXqFq*WhaKJ1c9xQJdO2>5*f9<|1rATw zUIa7B4pg?`SnU-2mI{Q?Fw;^-GbjqA|Ol(2E92b z?1pfLO-1nIG#}RlhF-Dn762c`zI)}@?7PyL`}dDfdcEoqaSGD6n0V#M8p8hNQ3ppt zHn|>mYEj;46nlomIz`j-=8Q3F%CKCzbdN77k1wO?&Z4z)Y*DqNN~uUbYtERQ201r@ z{FFZS7ZCe-R9j-TVKPgYAD^(~o@J}EabI69&62N3D=Z1qGh$odu5p5k?KP~yRIu_M zT**ma>*OPZU&5W%^Q#K_wAQo`RBLwdjl&o|RL|+DYDs>eT&aOLE;N4s!+ELMBt<$!3 zR#s%D7_rZZy$*w4cQ;TMCmL8=+Wup9?e3!V-9@1fJQWg(`~dbELLMsmo?B%MyEbuF zCpuMUMtudc@EFe1Y*3o1tbpfy-TQ^FDpMn1}(@CKURUZ*hZ23F@9AMm@DcAH8JCPVK?)MnO$93_p>r=|FUdV6@yVK= z+e4h-_~gK>4Ek3Q$u>QN?5DUM8E1!)kOt;wdpeVN*l+_w8JRxJDjUY6H#kT(eK^EN z8!0)S%OHKHIHK|R{WRv*LL_Xx%s~V zMcJI*4AgGjWeTDp5^@s?n6gEHh=SblZ4mmY_Dejhthz1dr;r_%Ez>mw`q8!lJ4OLY zt?jrBg?v*o{Urjx05%_HU7+o1E*eyAY1jY?S)9q(yX+mTkTE04Fr*V!<65%84o?_h z$M!TCO0L?6xMYm@%VB9K6|ei!8B?G(EAH7$Q)B_dow*UhXJ56OVFZ=MliksH#gHo| z1tI&y>3`O6ogTC&!2`so54a0uSCF?!uK)lq{({^92`*aUZttWfYs4-`b!Kf9LIh0w zHP}eiM)C*6ZQr1RFMG{S#Th0@#}G7&LeOL3!?$o86-opWq#=JTbc>=as}KssFspDF zjRJ+)cF}OFaJXGG0u~y(Xp~hr%EL{--R=SO-d5Rzi)yf#a9*?6ubYkdeVkWVt}7SM ziCQjTuL!!BA|p34{JdnrN z2k~yfb@b+wM+OU$j0-zO;T+G85|7*~00vMutPA%UirWhD;r~=?M~(z#_BY!20gRG* zZLO$x%!ng<4rAVdaq${F`rL!oQg0Dn`0}5Cp0OW&s7OjQH8Ndr#6Yqc$vrA^TPF6$ zr`VlpJFk&dL{QE2Otrw8;`&8%P?WI(PQF+rkXr$*f-4y>bdr_61PPerdn?|;SBD|_ zGL5{cFJdMWe4}>mQwmI&Vss1rWkQ+Ut?i`aoH@ksOy>T`<$+I$-Om973U<+3Nl;XYT`F zWm*6KZ*YWx(|hVvG)hu5O)5}Q=STNyDJ;NUq&cD#3R3K$g? zpQ1ig)Rznpr^rCvz)&atCI5s*dLO5TrgNgn@A-OP_kFgB`T2f-J(At$zOTRU>wUfd zU++tg12<@(P8fr6!Mr-T5H15$7yh0z7Op(@q`Znf_p{mj+k4Mhe!~TcnYCp&kD#a(!h6%iU2e)_v8r=pYZ5F>oI4mWL$P z*yypGEorjWSBI_VlTGQiL!VpH!tYQPu#(UHY&maGJ#*RhJotGH$6umF@?$sqFj$Ai z;-Ca^A1-e_r|qYd<)#xGTb`S)1N6D+6?nLE(<`y5<)#ng3gO)J;r^5nx#@%xj?7IT z=}$R6M^;nUYz>~hQEJ=(;K#~7)W>1;k+$;|r8!72UE!XgtMjcZ61maU`PS9>*46pe z)%n)d`PLQpU((6MQQkuN`OK2ib%FHhrX^Qt9wvH5le`h{hP{n7g?KS;WZw~iCQw5G zC%C8$_F+Of?x|{H_=y>A#i}g=9|zx|H~ge&$qzoV7kgXmW$b_IeT)w&yqPc)jb89kn-6@21`YQN5d}*XQ-T!tNCL>4IE{IV-7G83E4uQwnmGDIOenFYqmWhAXM17g7FBx;8?b!NE;kv2M7Z`BW zmgl!7sF}Efp~mPoZ0))`R7dt>_0Y9i>#R55vNzclH8E?0B8KoYhW9+WUproZI$b{R z189o@&R-%C7~=KZ&m{B&-o19M)vG**pNM+;+0**;)&>y4h=U*Q)bq4cpLMd46A&zb z+8Br1xz@)!uQ)=qspqH@Hdif?FwFrbko38%cII@GV?GA+x(^Rl1&(*r=J2K~xQr;|WPp4!GyCt~Z;i z4ZCnQAE8!;ZBK)c5!RSPF+ySz8PE{JWxPU5;XRis^Q2bYc9!tZB*7{@}i>Qx&ADJS&h4IcB5 znV0e|pSKY*^!3Otj@b5{LntE^S@0j%v&)Q*Ma*}~p&=i~Vq#=j9R}^>ZmlvVJ?}=B zia|Qyh*yyvO!Yz5k)U*t$fA=)CzS0!A(q@9VOt+6O@Gh`$wj7rF{)x(bznqivj_mi zWG=Bq4aHJh>0Z;wA<|H-bwwPWuHkVFcAEmD-5dzFdW{J=sqd+`1jj%?S!)e75PwsL z3Rh|8Mx8q{Aa;Z@^-Mo#rw_o&J|Da&1 zbG1?a8!GR_JDng=DC<-+D3Vpw?CK@}b{M_Vo zuuwmh=x{3}#8V+=)T$Dw1cpuELpkb;EE`TaE8-K_5&ZOtXw+FMb=?@@H|tuoJC{C4 z>JjZ*6aU9RJ*ToN+r9tuRGwqs!O|bGB2qv!0`+DK)328=7JE6WIC!C3WZ*ONcIksv zPkH%&(}?Rx-E{p(F|Ky(x`>b3`a;RWf_vq-5lk{)7GUq=fY-kEUhJ#sSFhAbk@yN6 zAHnX=%i#ODzjG6nizUf5EX&20h5_Jyd#ZaCse&8=&QCzRbo~lR zty4#fX1w|`G=qL-jz+gn5@YgHE!*DYQ)of`Y*s|yH!Ppq))7|<4V*Vi^LQ2GE3{)> z0OpIgTj;S-sfjVZYX0#R!RZc}I+7U(ieAetw9AU|byWfA@v}ok_ddda2@sji+NI-5 zQTEVc>z7v5FQ2zC*HIANCh`O?LwrTzu;5Wjr|-Wq*V8w?CAizY{l>*Q(xJ08Ot@hw z-OS1R1yy$|)foFb~0?XX|{>2Rq#f6(lK`q=Jlx5LQ)JR#T z@xv?-jgu0UxlJ-s3~ic#o0WtV<^w9EDbBho&tD(^ONjqqe)oyO{F8U$y-ijqawOeY zUg|BZfqSK9ABv3lyihS-mYOZ2?pJ|hzJ3kKWOe2&%_r#hj`U3A-RHONxM;&HhZ}1@W{>)_BFne8ykD(Uf|cZ;+a}1RQc^+dtfR$4!4xI z3Stj#=T$YYcum~M(#B02mH1S|WgGHD?GhPKcE^U$$V8|Hp)a-{~KW`A#Tkw&H3VWN-TMV2FnEQE z!G1%?1!r?CTHrfM;$(eUwmY9bxaZ${z1rQ%XGQk~AwitzsNj(vNY@&R545{MKI^JD zPFMl7!#1JccKlfog~pj(@jDPu$alQc%dQs~5LuHt6|zoU%wYLD;`j3&9=pZ;*``1F z$_E^tkzqr>a}D?8>f5NSTFcp0cC=EhW~NinPBve{gWs@4Hpo9xg~Gvao+D*pa%VI= zimw~gof&u~YgwA8)Vg7#>+_Dh9tw)u7Bs$zs1hf3#LEn2GBdzi8yAf-_Wgo-HQca` z(!qHu+R&-Tm*3$C8iFQAx=98i>uH=ZW!e%$2xoFZCbrrJ-aV|n!rRO>eqXxhGI#!r z0^Q?}AX${DO%3Bm5xGZfT{}w2 znn9k7N9Mmw^)n?4?!gDV=cwT7b{4FjHOiGHX3?vfI>5-^F#jM~i6tY6MfE)1!wu7n zWBuR^X;y|@j>qf%3yXdUAz1tw@E~4h84{w6_1|w>WTL!=g>A6d5Ou;}#ll^@QWYX7 zokJs-Nrl4Sd98u>KRCf%Lfz638 zhoWviJ$d2VcAZZUVS6i zV`ob=O^X*JS}3@ggoyL+>v$^0`O0QMlHOCAYgm!@s|qBbO;5&NnyX))@bdm-d$G;E z@avc77hP1sM>b)@3J5_yzQyK2&~W`0!zDX;fox6uQA7ahpJn*v^kVTpP_Ytil+LqC z!LwZe^Mv_(hw|B5yqRfui`#~5#tInI9OmDz!9_AJc!^{-QR@P5;s1Waa#{kiF^*IL z*;uM>RH;^>erf3@g=W<+6J7cM)Fq7bs#DRh>z8%J7i%b308+EdN)p^nm}_j|^v}cj zX=~TWd4Q<=W-#FNJqnHEIu-=i@v*KKjo(0(FRzL+G@mPh$J*1@P$5DGmywLB0VdTV za*kwqKS!R%BVB6yzC<~VPPZe~)pI6<>l4q&r&FK+pmTVm^$ltG#-F^$Mk|a6YttDZ8WykX*EiKo<~5q)z6y}e5rbg3ELc|-XCG=^q-PmX<;R0J8sgy`d<-0DNO^L z6-CaP=hMyCkZ*b#JG-G-%>=J>LLN6EN)YsAwf%->FRNA7xoyr=H3!$dDoW8zet`po zWV?eI(&Ou!mAf;UW~CEd6Jo#2n6 z0X4$~!qUQj^8nGJA>pV3ryJQPZXmCd)|P&|Zfao=e@ce;`F3-Ep_iQlc}u@L zIQIxxJO5pWz94Sl8s5)nG1^F)N3WK%yISz3DfPXJW{T1-i|F0Ht%w~cghj6KJ<_C*JHXB6GoaRV!NhSv@g(!bK=-{b2DgFd*gw?^Mlgl$?TP? z_8Z>9f8AYkPHEzY-SOQ6Tv>D#S+LXJ9rkaoA-R7G64{vaJwLf`idH48pN|X2c zoQKmD%>;RV8>=)+cpzQSW!JCVusE^%rou`&ub0rMUk%&uZF7yuM>J%KI$T?aSzC&7 zzns-@AFPpj*GSi0W43nPQ>2GR?FoIG^(oQBKW~@iVHd+^ubRj(9fkw~OyQcJJi7bt z;7K42AM5ZkB6jWZ$BE1h#i%eczD?DO9LOXs>is|$1xZXHtwICGRfpvc^5etZ&uxDF zaQz%%KP7aHAcskOr29%7=SY1$-hJJ|Q?4x4_&9+6n(g6Td0&_^W;=9-^RJ)|n@$>s zMR6SaC$Pqb{)qyz(jLZg$LlH{3(VStVK_snl^}wuXlTX7G05w|SdOZp%HKYwYYg!tgQ;%+l?{ zyp0o%tBybJEz}tZUs*ybOW%R|#Qeb$J;C?8jnC0I_22cA+x*5(RjQ&=Caqbrp?q4;|W=YsgXEpQ$btzVhKOMrp1hFB0Qp=Mrr=B0uf6_u6Y)29~vc$w~*Ee72K;qUS2+ zWpvskpMF0S6Va-Qf8TEiRMznpCF;sO75qV#F|OJn@jVBFV3D|N zq{n8zA}Elzt2fJ!qp#TS@sIfJKq9~BF8=juNl#UV&hsUfko{|HI=`syHK!&@P?n_{ zxR)|6K-oT#^JsmWHF_iFo?mocSW7ijlUjfIt<~z<;<$j(Z)7=(#t(DfI~3wP(it7E2{Nb z<$e|PLLg~eB$nZ!wUg8sd6<-rk1CJ|axuH*d zu`IZ4B71-eZw42<>^A7PRH5;nbbGC&E0Up9dEUa48BzDdW6P5NK>eVj>`97f!}dvV z>{;|Im~ZoQ29n105{$AIQ!p1C%{6ZEGDpJ-BxK3-nMAbyFHmKx|O)nEUxq4t@CsKa?+%k9ui*h^^jvOwm zoJx~V6Wk64{?B^^j%u-O^=-xd`1%hs$7LL8M&#H8j1%91Ey4yVrK3)H+3A8;H?W@e z=r?Xjoi$1!x$*TgI>y64`4@g!EE_@jw{K7dP;eESRTScJRMQaftLvFyC;oe@u%^j@G1Uj@#kVNFJqM-tJU&pX(uzsBD3GNu6I6* z!ud3;0WgRitK6Jqo&Zq6qdq&`Mwlz@8WQ3m68)sH!uLG!4V21{KTccpaGhQxt-irz zeX(L+I0!g}-!n0{o{ejYyUxqr1a%a-J8ML`s+2{WTMsljBf!bwP^e3HOwKie9IO4S ziJDFv=r^t;s$Te3W$GuAz$%tG9bXM{uH?UMrEIVOVSLrRt$ss`e>$?o!h03_$&d45 z#7;M4ymb|+J&6QbeP&E|*Cz!}shl5pnI$SXzLI;e!ZHV>_FRvBlRUepC5Z2Dyk8oK z4BtqdDgEI*xZg7BvqC0G7o8gG~O?$HLUjs z2M_Ksp(wsSaVp~gz9qT^9cKrZW#?lzDe8Z)y(ufcDeD+-qFcv!^HWnTG(tDDq~j@e zW-1-eR8|f37XH9CW5&lAUP0s#v-Pr9Gro?vXp45U42#~vb3iBA-tImViq9!fee8&@ z)}P#l8?-a)+roX==Fh3{&ms%sN=Ywlanz4xtf>@QXK+}eD4GkOWGzK-}x4TB1kWyDBE5@`{pHrR~iEfg6s;i=fGjA`(swW>-j{gY6P!w-Z@)fMjh{k?wP}msF z&PdNA`|!fC>J5K=1EcIzKOy;LBug-fZ|7g1v@rgd?h*A{3JWRV_GNd?;RBN2_v5Q6 zxbT}sl~-u=)AU&1);)e?EHR3sb)3HTo`m6a~Q!jJ!Drjm6`{^hF6PaZE z=wJs2rUA5wJtWd+CmolLcUGECJ6rCWNwL!1KAJj$dHpsoBgGDoW4rPiWzChDxjP(ziv=TS=S0bxdLc#Kg96^yai7KABaId{W!c4Xeyfzw4C$% z8y!zssq|b6^bFyp=YjrtV?_cTE!uXbB)Qd&j&%)Wp8f=*U$lvYGCd~q?eT-Ce40N% zXSw&&PH5Z)c}s6P&KL$aS`Q9(-6XL`?IVw@?yebJ#u+o)Gz@LIgg#DQXsyeFuc=Gp zI343*!!%dFGIxs&&~eD$a2BF)BLAoq%d}187mYF$9fcg1Eq`yXV+BgqFL}0pTk9v( z7A`}+|6>iDI=;$}Hv>un9qxf{dJB&*dfG9$>i*!h9kM0R z&QfOfMGT&O>!v=w?w_K%%?vKIdBZ9#orjnGri2ArMjkR}Hc7d5z71e3V+_dUTlPQF zutXWNzXzu13IH-@=N@fg9af3`_gT&VaN5dJl7M!E0-Me_%#suz^5uKrH7wq0@)p!02;D;ZLYVU^c?U59(iAk#%X~}prEx_*-6Qlxony>W zfV7Ay95RJE%4&VNZ>6E!KexPVu+drJ>1pD#{&}?spdjhDm16L`Sk9!&!ZdzKkcWom z(>`rm!{+ca1gXrhupx*S7p|4yP+TMj(Za=g*|>VlR>Jc}t{mYl*|ZXW#(FRFC*j$o zQ6gu56|ClsmR|k{k2BJ9MKt#c&l;4CgCi6it$sYcc_c2Ru8J8gT%d9s@!RQ+VdR~= z0xig0e-o2FE+GS{Fm_rfXGpZ)5`4cdlAu_>Hf?P1MG8mlNJN=!U@T4!33{y3F3pmF zmk@jZhUOUV>;)1H#%s)(hiw2&akdOQQsUy|I;NTDEYp?QZ zwN6EyJGx`iC?+qv0OU!H*|x233z-AAbBJ5+1-B!)oRW>51{V-2)&nrSg`eR&BDw-+ zp3H6TI+XR5P0<9{VGx8ir;&H%V81mMq~1c3EzaFkMJQ9UQ- zH7o5v;SMsHK%CSN^(*=iso8yqRGZv1^(&1|i3l5wbFqgWGC|=rkuG0s95n#`Tp#gr zFZTnHz&Rp;jgRA>8Y%zO{aV~;Z(K^-jsSlDO-c=RpP`bk_8GvLQK2vgZ{ZA;#TDTY z-?oQB)y!_{=S_|=fy1`Q8z~K68@@19@~4>0{c3$uxyv07Mom3FxOt+)_0?>M!bYUm z+~&e_r0UUp(a>_*lr`mk4aUnAg+B;vkc`iqC#+hJW}frFW>GjV^Gkvgl^A6Dg$Vyu zhkFZe)rkxKn*Z-L8Q#c+N z`%dHpfLL}^{WDZA{8K|~yg#3=Q}Y5X)|3PI;=p={4TsN_;pZZYpx8@4j*7jyJEC~S z{L#vvn|l(SKR9GCsOS9MWWiuJ(&0J768p_akB7xKyd_u5 z?qD#SL*Lp=fcD~Bq}u1UpxhVp?Tyk7AxC(;1(Wa@`$>ua;a!+Y8ZzNl%*CP3gm1_} zg3#8aKYm>e637sIb-E2JQSCQ0@fGhYI)*| zp(l`t*AxW?H#tgG+{3@N|3SNzRT+7 za1noZvWZ>q>Me;k=kniTL@(PEEfwF!x64-2q9@PiAs#C zJJE(h1_f$_sgvQEstlMos&*sJVwZ=Jw4d(yf+9w4S`SgS#*Wyn^n*VJ_J={MbKdI&ir4P9Oi&_*A5HL@-44zQzQg%scAxm+Krb)!>4-P0 zXon^8(^I?UhAhFGnX^QH?UtyI0<$Tt0^xdcD7C)XuY@}+3$A*|8EPIu*$7$npHPBw zJ;41PVu|7@j&ZFqf2Ow)MFKwEKCEhsx9}$E&6UZJRPF;?6(#Z@JKt~MN@cdMFZN=g4h69dBT_^y>H#gY>ccSuB z%MiO+P}4ACHjKscUo26YL1Hjy!;wal9C&XEg{T=u9Dh(N0OVpXt+6e7OVHH@ZLt^f z3uW$?64*1q%j~ZQ>ytwc>N*{7u9V!?%HANan+7+)vi-3an(~Ssv{atMdFYrhP7v>y zP@_K@vvH9Y3*IFHkJCL2Z=e)@mlX4X3F=HUg}ANn2UGnKTLQ z$OYO5UiK6QSM3Dn%x49J@gpghJ&H%~&haPVzoXsn@Rv==d!w7~;71Ls%X4tdC}r50By7aS;DT2F`I?X{yz zx%kRu3(dvuK-I@4B1vkhnzh;ZHXD(Ue|I|LMYEUrx|FDRiyTAA!C+FV?t%)3+vXqV zlUUP*Tv-c6sqnG~YM!Dzkexb5`;-iKLY;4ig;E=|BAjW}T6s&dat$-`C3eAaYJ+~3 zB#%jL7-kPgy1a+J!M`_aDTsKi8-q}ct_E6j=}iOOrgF9DGh8g1KZN#@M@8)(=2~=M zl5(RpC92i3EYhB6R95e3BO1aqevXmNiRGbJ z^{?+}AD%#tD!>4wtLfqci(l9h{BnPVCL(k%3l?m3`}}1o7e+qV%0{Q{e3X~njNa)s znDhC7uA%i&4YN4G;)g+5cXA6ZiZ@@HR8a&lncFT%5W<7z?1|vhweFI2&dsRbn$!Fx zS{qb2fBZNlAYV8BXwxsht2%B^x}#=pVq!YY!HL`H*zL~^*hpE#;zV)W8?Z^t|yaJ&XcVu;VO+UJ8hNXzTkGG`PFB5qu1QkXSNlzxUAnPizr?4^h><*KMoZVpA)Qqcm&9?Y*{AHsJ%3?> z-^tXAcn2iGyglEzgGdKAv&859_|s&@hH9zgiN;ski5ljBgT2o8eO-zfeN;vAiy@z} zGjudA->MeIED3J)S_B>oe?FCO!MjT&EDDy)A+ykyUd-0-(|l@NX-Q(N6Dj>Af*?(C zc3tzQHI7KB2Jav)&8&B8ty-S<5WqKhw@&7FdV_Ry4o^AKowv$vy=2~*3N3IgcG!Ya zgYBE3N@~LeRx#VG!R1Hu1A?-|5zA~VBE*=j(Uv|S+bI>Mupb-lN;`OrGt~0`Ix5qa&YjIK0oXUbv zHopf?hgFiF(B=6|8;2fNwcA_By>GxoJ?u@~mHyzUc?VfkR_=|*c4n>Pq;Xg>XGG_gW!kFz&4G#r3SRJq*I zw|rTmT}aRmC~l#HK}dF)?Jew|(cVg492ITw*N&o<)?=6z$W+`PIIO-Pq7!d6eh_T_ zB+*XkDoo}m5f1Sv>&&F#?F;|sPZV+T3es(1q%<1iagJe0?h^Z$PzM=?I8UhavZT-2 zTR4e-qI#qnh&M+dsvMBB)hNtGZIYOLs3gL56Hav*s`37hLsS?g+X~hUwND)7sp%I6 zBA;^KfoMSTHD^{S4AN*=fMl~@J37V;P)9NaOqprFd}fr z0J#sEfe<@HFfW{>*5WOBaz@%B`sa*8sT9l5p35PaNfUA_nfOF?DK}+q&TZ+6RaaT8N&(0nbJv zbnZbKaMg!d^-#cEsX1&g>R}s8`(5+u6;!+G9bV>RDGYG~OT)Ig!odyhx6fe9eA7=_ z>w|(;F1ZW^wX{)>VQ64%!78IVjblO#K(&kAoNb$VJe*s_QkV&`Tw>6%f3cn5Pr?37a7E1s`F7fCZybmme~*eX2P4UJ&>p|% zKnzmt@eSy?_uCL%AX@N+Yq2SQScGC6h$6F@uE{*MU!nmZT(SMGqzxt{j&Gibr4KR~ zE7$skzMssRh)O1+LOqT9A`;keoShd|RGubeHYZa!p*W*rr%=pkNawrKBEE7>i1?=4 z20FITuc1uoZiuXFDn%QmyF+jVg$IbV6#}&1@Q_y0TpUP~Zw9vvm8`D~((1W^S73p0 zc2Oq_GX+5*L^(HB5rklIhr)N`6|L9=#q)=H7#`VWb@(t6`-cnCG;RJs5t#anf8$a} zE^Au5xfPN@65m5heFF?b)!I7(7SxjsPZVL|h$;uRb7I#Xc!eo5mATr3uz!w#ZsV6k z*Y!!rIpG2qOtYo99+1g0HR4v^?T~lQ;DywC*e6RD&*)F#(A`WGcno985r@rOD4&Go zF;_ZYpajQMDp@0YAuGicD14Skq;Bg2tT=BR(cFx{V{R_&g90dGcD?M7hIw!Q=5=)e6X7cehq zh9e%L91~>Rf^497yuF4iH}N58aK=Bw74F5F`&i(v+XWxBqj7rKC#0f8(q1OT28cMB z8ZEN8Ri?-a$#t2HLnJ47kndT-7nz4lCJ6y46zXfL87wg*6v&cSM^aPfB{d6*5%p~9 znnVBeZm4@|_7VP)8`R;1nGj@*xXn_>&l-^{2m6}CZ{tURIG{`Gc}Gw zJ1;R7L+~PcgJ&l&#;$E{S#9ko6fU1gNHB!&g&neW8gF+VqkLVdxADA_awc@biSo4r zuunngB+L4oZZyMy({@Z7(5A$G<;wT(U?l`45``leG6n%rlsjnBcju=vT|x-AI0vc0 zTxd|>1rsur$>~On+qM+7iy8Erx<;LzIkL>l)W5|GBhB~S zrBfJ%al9yQfK#;n8kz~d431TXq9q1=pe}|Ku>|33L{0bJr-f3f*2^g3?s^bwWU+)P zf75r;^au|!D3uOv&HT~lWzj&plg#5SD&Ir2H8ALVsJirFKZM| zYqPlakSjKYAy&C*rLubHJKUGJT2ft4xu6J_XJCPT-ezGd@8&|+PCk?$$u=L*rI|?m z?jtW63k4wWtm0(hO1X!Oe9&d!|3nhBQ7LD;lvL$5o^C`dLN(SpM(9Q(?~*mjY2D!t zak7Pw*gOFRu(#LtQJC;P-8nA(rWS}6zW6&apoCWC|B8Xx@cZ~0ChGKdsO)F15^(yU zg+nnl-e$3;%BwP)Qy?%B3@&l z*J5fHiJW|UtH9=vS-aU0`yv|H){+|Gs_?$3FBkwtDO#+d-GV>NE2N4)GA3Fa!)!G{ z6yiSp-@s9n!uPGPt(_AAo&3=Y;E6&LkSKVR{5^%+<;0Jux;Bdq1yng!>u@iqR2ZWc zjmU(mlW{LLyOB#g#Z3U!%_;ci7KVU#4mfC-ZZoP`D;+KYt!og$6b1l|f1l#Pg@5R= zxb4DDxdEMqAT_EN*d}&=P6PS|10uemMru3CiVJ5qP76#_EUXml1&s=m#bgW!t@CLx zv{~6MlG!k&zMR1D-slnifOFF_0Cdreh^^T}_7|B?Gr=fA3`BVCzF zWHwjip61uo1a}2w8ojT3nVgWzLnmamt>}PUL5-5+Ad4bCNykQef)OV%9)g*Bf>}D3 z)v$u6_x}tz=o@Vv+9{CX%&!;xRCz$`QBJF6iF)Nv2|uzB&OQ<@2ypr@dJSIw9L-xD z6_#Uk8BS@X$=DM3cS%Q@2BZ)yk3fr%*~7>YCrX@m@Eomlaxq4KYP+J{I?;q%cT4cz zyS??3ZPqe@&Um{q1B;(eCmxTZm)^oT2%v;yj_GEi)g)VFFT|UOLT_v$(mVH5jua*Y zLLM5;ceCQZXTR@dK0zypF;x#IyRZV(uh7}s#-@P;S+imJKXEwA`eEPz6Lmv3sEzTR z-$Y}?=VL>=Q)&?6A1h_DwiZVtnlPHygmzF8K2K1n8n0S%jTyXI$}&ukjq>S@JzQ$j z)wRy(v)gaX__({AklwJ=T>3inl}Q{!&<*O1O~@~8_I&q zbrvsNaWDG^YIaW=mU1#2D@`a*An4esTrR5w1mrQ(@m4RBG!}*mjlHrXanE@=m zG+3E@Z*O(7`G&_72~|Yv zhX_ti)NPIyg0v8!&qWb3HUgz+Dl+_=4>r z$V;xb$1uV;R2V>J(Ch%n2e?JR`qzY8CRAwj%VjhmzfpXJ+h8X)5ZKWoOizvDuEgx+ z4ijBfyBTrjI4(38+J$y(_Zh^h&q%%vT#I`y*~2)Tbl%T0gc>heVocJw+0uyDq}Ng- zzBHWBK6beQ{`|-Sw8@M=h7eMD=h2udqSj-Ii#MCHy?FLvroB3CK1m*d#r~`jxv?$2 zo?9>jg{r*4WpW6Ysvc@Ku0%W;B5{kW?+`d=AH}hX98Tl5BxT&y1Zz0<8 z7Hvw>O^{+x#Djg{_yo%h+B1a^MSs_Sp+{7)95ZF5i?@&}We`HD2Eqc`qoMu(BsQcQyexG)Z=z#&8HLPs5=F3g<}ZsUGk+*a(O zuv0K~7;!9Bi?Azh9q{5iy~Q~!$7Yk+fdaz_5n?kd=i6`{kmi`EbwdgPUR8P<+xdg( zKNQK(DR=P#sPE(t!rx*icAQKWhY(P=O2G*O93;ocimTMPD%c~e3MQqcV>ube*#A^f za%W^i>T=Tzx4qzC2VBa6)r%#jukhF2K&$PwC+TPpiDz9qvj?Au>AmQz9ZJFQMcRA` z?4oTVTWk%?;f-e7F?|KKW-#^->*EU!Qd5 zLDbjwN;kHTKuhmV$9cfcIY96tsIjxl8Am=l^&o%7itappLfH4?l&BB~|+cb*g*313CL6e3L+5k*Yw z{Jns?%neR5P4ZMqR-iFS{m|`sF*nC>PpEF|EOqSm^UUJRgwKsDavbs_;b_-!GWPlt zN4c_YdalMfI4mK?Ar5sXpCt4|x9iATr~2P#@7{oBUpwW zr-)M49373JaHxnCSp5gdvbbXJl<_RS(>X8tLg1bv%nGNou0@7C?ia=Ve3jmJNBKZ7 zcj|`w`LB+GU&+r|5}b=8V*Y*2w@A}!igI*Ht7#4|P3-Rm^Jmu-6Jc};meCO&g6cB* zjo8M&kQPOSdf6TNkrZns`%78(gh44Ud#IRrLlc(F>nn)x&aAZx$dVO;+~6metvw>( zk(A>{`bsz`LNh$))&uyZqpse<-|A5zD55A7B1)!0y3i&TF>y++5pP)qiExRN=cY9D zpDE}+dsrygdDT1UKh6tpfy#sd5c@Zfpv+QBFi_kSLX^RVq1o0wff_Y^qNMRY%eP zx#bkGaJ$Hn+8pfUKyvO4W)pAmvM1Z1c2Y`Pt2wx~3+$~Yri!^{53`TW!Q9_LZdJn^ zLF8eQHH6SJ#h?v!RwN5UTPvf068gxgu|(&qx4Lj})Z8JQb~UroCXk#wdXkxzvL>O^ zg>U#Qk_#k16B;_%_3TfnlM^d{cBwfcCf4a3rn{`z?Q5NDCf*Lmo7hQiVjZFR-SHHs zEX-pesrQrWgmst@!bZbKb!wQgp=pOK!e^BRK{$&pMc=deEK%+$GwxZ7k4=N=Dp_BhTb5ahzS4I*1+ z>G&fD6P!(y0~;pOkiAfQtO1}g1EFFPB71+#cWZ%8kP{32G^dMJaE zet$c78;)s;37~bcYY%~t=VR+E|AUp56l!)|XRr>9p`?RoAT9)pgQQD5bP8#MY~oj` zsYQ*|oJhdY8Ju@8d&9{SXWKi)MbD>^Ec`wW$7ov@8Yq1`J&o)Eqz4`<2p{js=~2Qrc|}9 z?Y?ZzP|po#w}xYnfTqe>*a2MS6;=u19V37Axi93DLcFc+JJOZL-_v9+@)aElC{YZ9I2myS+vV5z`#gt<9boC3Fz!k@PV4Qye86vvo{c z_k_a-KvY1<()RS`VJ@imhL@4Rurv*e8ue87gx%F5bf2*>t8zYbRz%dm-oBz8C{9vC z>p;wc83~#_NWi;5qY$bs*_3k`@y*%gu&;^2ZivY-y02N37(wu9{y_6Zke$B9mZq7# z5N3-a{PTZ7eB1LeS(=;xv^d%&G~L)0@~)Qf;WU`smw6h_%v zts!p%Sm@C|WDdrk>fP8_P<(%)e|sYU#whfG)h)Uu!hK|6Hu$&lelEbNkuvkUGef zZmp;Da9g;Fkcq3bBOC*nMx5Z;8XuchJc!kVnLphNs`~^4hy7Mx)B|4_%7pOq+QUql z(4#36#cg6DdQsC2$8y|9jOFjYj)2^5(H=xTY8)kVzaSj286zFLNLRNmCSN1Z3L%5B znu-l9Jb10}lipZfZn3s$Q502b6b(BcnRr9#8*qa#IR0*8Lc>kuWzz}}Z77FkpGO## zyTN|$G1^32T{(g_U>M2ru7kwisuG)G?#NAN@?WTruN6oryVZ_YwTZ4 z_Ld`UmYS;}L*`ZWaGeZWLljam3;~rm`o-0Q$omPwLR>Oo^e6v7o0L%t_?A0lW}~{m zCkU$g0hfU;D!)RrVh$^UUxFb0BA(oGDDKH&!^{{x9s-lhWy=^82C6ICDx0PaA_S`0 z?~Q*l>z4}v^|Ggn+nPm!ZTvNP8*TTYXA&c0y8w%Th7_U%2MR&96HMe%khy6bB1x#y z#mEVUFIh3zsH2b$ncWB#IU@?}Ix$0A%k1IKi0ND8jOTPtnb@4U&G0)cVMe!bK?$Sr zvTuq+m?m&(=<;`}yx<(sgI)k${i}U;Sd|4S$$SJ85><8K>XSM20-g6n54pH1AHF-46>L2e4yWA zHb5};9}+IZHOuTU-Ob8i!_beEl|yp5SHCR$*M;v|^KR+H41`n?U%p$UHO?&f4jE1I z>AAgTL93@_r9$Ka3|`1aB%p9U{Wv){RCyXxg-YI`zc^vS-5^7hT#Fq+GLZafa8w^$ zn--oAA<0@p%8A7#IXjO~c$iSy7S7-~EzGQi1z8IVcPOr94YIJr zJ`#C_+g3_cOsB#C8#Bg!X*@K&GdwD(?TGx__AOKrPV#KE=-wOEfWo~m6oyW&z?KD! z4_D^m$h~9J_+4r5G`#Fevs4*feo%;jgmMJ;@fA49g>a(xeWd-u5Jd^2#BB947ip=G z`&x8D8LE_>tQQSs>FaCZw`cOhTi3FV6+?YNr(RQGk>lCp_~3YtZXqE?F#YaOr?+^S zD@+C9#_^}6g^AGj1J(A0~L2i77 zIKgxLLJZ5i$ls8{u}zpyaOwPrc1fyiBcX=MwNg$u<|c+(=E%(N_#H*QoaUcJc&OHP z@n+RAMsd1flb4-u9VIHoPK0_-%y!9AE>{B%O;Ft|(WBc}<}6$x^i3B}A2z2OGbjys zZqEZRWEePDzS|aW;aU7fdhNzSK|J5V=#O?*y|TIy4dWgfQDOAK%F%hQu_)uf30v^l zFM8=C6ZFOrR;a11@UU08CgPK(RZ5tb}&)X5{2?A&UNbhTc4olYBZ zeo90WG@QVXi73U3y@i2q@!drbe?fyPQhW6-9f?t1E|12SGM+zSqJG!2`4s!Lb_$~~5q(6+ISIuumdB*Tj5H({_Z3B;8cM#? zxhXh`PnB>4{+KA}z!nU>2h5Ya5P^liMu#PjgwN=Pcnqr>W6V; zbDV}(Ova$DSQ?W$Ayh+}A{;MtVLl8gGP^-E%_PE)m9js*EFy%VL|OPP~lV!c8-S`6|!7MY_deiQ8A?ba17Bl9)>DihCbC>@f=JgXI_d=<{xi~&b z@_zd#2w8HQ05Gb{rf<8<0N|MJw|`1I_87KS6u1SnP~bNB$*JTDQlyW-?OZI$Y6Cq17{%sWS!53afEKXH8c>UWFiy++9r-2HhQOgZ7oV|NB{+G$3sAQRud3ASz4sfJA6j=H!agsl@m zqz$Po5o~W4jRt;?rUoB;cavUS9Y%v(9k#0B3`359Pcv8}_%@;7jinOc2e%LYMH5rC zck{m++bg3$vKVNp|4bfv9w#bes?5ARH_vt^3LjG+rG#OjV`hE1W{`u7``~dYPac23kF+9 zEkuI*4dtWu?_U>1Efnr#7*bB`09bD%S&iUVq~sCFyMs9u+QbiR4(1#dNpO=c7T4BW zpy|6Q+gCF;T|le$WlXV^p{$g-i;t-df;Rb(18ke* z{*9*wjz?M=t@@`V?{faj>Y3#{&Md3GZiJUPw~J{^BBm(uo9daPyv&*UZCjvgh`so{ zUf5B)-EMG&>*=C*LHp9>;MpZbY~rIsK#=Rp*~X!o_)&U9Z8`MuLcv zfTaCXB-@ddFa~J{1@$*XYXUC)0sXfy zQ$0RXn4mFoxatwM!Y9L+*YU$bP9CIw=tSq?Dh2hez(xPtk`gZJ7@D4^XrqCASeZiq z(T#IPPTl!(X_9_jEf%6L_}7s2MGG(7sj~HHJkp(1(3R~Il<+n&ByB}XyPnssee4zx zb&2X=w%3an_i#ad(Qt35CzNvsTEd^CL#Qp9uH}b%?Mlu{+CEhiSMAX+ZGZi`gkR3a zUOW>~W^R7G)y8)whXs4ie~;*FfbTWwxLDfOs3gfT0@?IQNE;Oo?i8 z)O*?Qi_<&DvPg3u$-C?n`jK2dhG{rH_fbQ;?^Y28P1&aElDc?JTSNupEv?^GBT}ZA z#nNI?i)%(saMHcS7;EY_9d&teUW+IwDS#UnPsCRrm=l?;y|SS34# z&^zt4Bc8sUMv&#Q*^Sr?sm8@L!pMaBMvG>o)oz`^=;=-q2?L2KLfL!d>Xy zc|HVW`bmWB&VqoX=atzSdYM(KVS}=Tr8^CxjV;H$Zo0GCTQ~8P(>xIzC!`+- zphLR_gMR!m_lQHcRzoi>{lrlrY{3UAG45~rnyq|C*{=%sZV;@s#r(W2uZb&~G@0la zfLInG-zT_Q4sU|5sOBVGz5ssu2yp+3?Un7d6$8miBl_*mLiO~8*1HSo)vfzw^wnq4 z+ug99?k%7LB01GINw@#1|M$&mN1fy++JRNKo;I^3YGTp|RQam*YlmLZ&0*D(%It-% zoDA1HI;`5m+@b*n->}Y$D{Y;-?E}Eh&_~m8S+JZv6b_Z3>L|+D4mGq^m6T+yh7)HJ z(j(unL%tzxn5rdWCs2@U54ys5&wrvJ?#gM%;f(}2IybY3V}f64OIuTtoTC$MCbrOj z;US$68Lat894dxBY4)KauylcDA==~!xIZYGJu9puy2^Mn4^_7xk&n*HY|w9A=ejz$?c3%wj4w|lxCaAGlOTaP`Y?wNx%f)u2yY-d zY8h3CU5+XH`;%CsXgRqwv7diRF3J6}%gM~EJi$`Q)}ZIbT6NPVh+P(x61T=Sx{M%y zHT%mOS#RB;yE^z0kMr->ge{?){6G2hcC1S#L=rJS%^8XQIa=9IR~D`Y&c*obHNp4Z zbT=rT%=p+f`2T zSjxLFy`->Ew|QM-feP2uwO*p~RJVO(1{t-&OY=-d`0`{EyQRk&->?6xjPFktjqh&z zt437%dq03nAEPFWu4tUvaz+mrEF(LGkri|ubxXRZoFuAT|F<0?%jK^?D!<6Ch%&)M zD^vt{QsD3BE{~NQF(p<~HI?V{VkKMoPw!5wb${1Pij|b{-~073 zHeIY_zq4Z{ms}Vt`Q^7`B@axGl}x(8m79HjtYkOOhhYA=nE$%??>+we)K_CA4Gpo9 z$0+~AWwDZ@XT(abp^{)lAf2Ot4h2$2LO`GxOz*IKb^gjPhT?N zgS|6|$P@&$n1A@bP!y?IAOFC$q0xuMe9#Rk-RYMGfO**5N`jK7B^In1vmGj-7y0zs zsD`m1UKMe0*AO~xr_!h z2uVWyi0b{vWcQu2z0XAXOU!3@MQ zuz8s$KW6}PeeBB=wV?#Vh=OdGua=o-Y2r-owJup*%B>0wt4JMjoVmK@o*=yBy5)^S ztLxV!59yN+bMk}_c$Fwa2`2(;?(1wo8=+&GhHh8&CoXyy5tnIvDr8||A}(I$)6r(s z&U|TB9sPt!qq0y%oeE9yGA+)xur&5gyP)9bj&c+v-9bmV#w2QSXiC{B)X zpNGSIfPdq5@%=8a$mP%47x!n*Ad?cqA!_tvQCtJVJs!lf`WP2yvOql6r!_^YLRemgMU2 z>JrkWaGxt#RNZBsIQ_A|keyoT50;fArjf-N)eoe&+A`ge)&DqVs_Z9;&)^5mPa5E` zKr1(KRCMlYRq!44Z!s6o`UtA07(q*}Lt|}RI4!ieNl?ih$r<+u}N5lw=gW!9ceN7 z)pn}o)2$H8lz{?9c|*9q2R3}^t-4xYFBAfM!kOb28vu3Yp;y)qW zHS_vTBVV~LS9@#kG&Fdy_#s^bpKP)Wr#bjvx}l6%hi!}rebSKH8#W6yHAI?=^74Pij#_I&{7r; zX{12KgUi?@HVaM8aN5xb+#i^8WPJ#>Ya=P?@G4#13~nR&nADYVRM*7&e;@t-v^Re6 z!;ivh8_{<(qW<)%O?yD-qm%bN!JpkZ1G>f7Cy1V+=AJm0x$a=P^<70`B0pGIPPKu@SF9!erfsMFqajH^Wd(= z$fFHA|6o8|U&amh#DmX?L6tZ>lsqwHsdJB3ri9fvsM|}O&p;01Sg^k?6pOE}nprt- zCk&TN_3z$;lEQxJrwu%Zz8@TO8H4$^g}5vgqvx6^qEp4cP;9p!r0!RfCX(z}yCb5& z;Iw^$%w}YOp239tsd{|1E=w%j!LyTJ9t13*LUZ$vBrQB%GUs4F{WOHdU-T^hat1=_ zi|flYGg7zf+K$K3opKXL=FUH!2DzvSoW`j`OSwnIfZ3REE|}J|GHv&Zm|azTRbnU+ znCx40rmy(P&RnN%iXiOonpm!pb4=RW&I%A5)XIbg`HhQ}DssKGJM)I1>kqtjW`fS( z3>C3D>Hk_)nl5nt>Z-lTCfIwPd(=?2;+>j32gLM;hyn~Q`$ICZ zg?O2t;|0S)lb(QKV?uf17W*klEco;ba^R41VR`YK3F=eo9uwYXdYJ(7uZ1|PLK@+m zgL0eS`KyfKDT#FRO-7V)|!9K?lt)=*upg9%Tc^(K{E+a z&TY0}_JzozFTLt;RA@o80%3QfnLXqpnmvNC(^!AYX>Asmvqa*Z{!QB$j@?K5I4axi zGSB4}F6ZCGpxl&-TwSGqlivBa>z&ZR>BZcZX=>_z?EK*7Z-bbZG6JV`^#o6JNLcOp z7$env-*Cce;+qVMtA9)ow<~~h?PIo{m|U6LGatv?-ZL#PTISD_-;#GS@dZcRSB91% z#h4&mPrL{=Y)GNC{Pi)cC85_J48ni-lnxAS-J6~Z+8)?3(Mc-t70iXjTFp5=%t^D8 z+z_cdVRq|6U9699AZ<;mP@Y%1JiD6R&Us*EVFPQc!GYX^Ars2~MN0j$Rw5~J3J7^4 zO6C^Z?5D%7h0ZuEEtIBTCj@hEayeInd}!4pvh?mOmh*7@({5{49sU07)lJ9;EGk6reM%0>-?>;;rB<&HI z916Y{?79k3Lq`fVP)7N`43srx$*N~o-f(|Y-IofV0NUD@mtVsMf<%?%I)aNH&`x2G z%4DE-!4=Pm%{|PGN&iW0s$%^4^zCoL!30saskGDhQRHBiR_NCs&*uKgf#`ht_bMbl z^U*CmNFkVsKb|zO6*7{n@iHeAw0YMU_-(P#Vg9bT&{OHuQ(-xY==*EnTu zjhFo~eWw)~upAPBak6X-wM`|4LG!bP8Taf-*kH{=7*p}Ac;40pQm z#i?IRZ%|VXj6Kpd(2uX+I0LynoxJBbhr68627I6p_!7p^i#~m)-3OrsAZ_+-SE)Zo zIw=|%sjRiOtNF(DmdU2V)5LO!e4;8oq_B?uqFVmX!++krH|Q+mrZ>U~>0bj-oK$fj z@aJ+Qxy%eM;bVUJyDz)u18!WNB>zBopSAh~Lo~?XAG>6-TkQ&bT$>-NtPL5gq%x*? zI$)ME8|N3j1P%GPX86`m=e{iJ-zvuJAVct_={Cn7!X2 z+sx?^iSlZ9tJy1QR&d;Pq``5>%weqyH6kNeJVeEVfuJ>0PtC@HmN|m%f=e|}k0+=( z#O`R_CaFwpYh;H*@=6Ee$DMTDfr#1Oy_tcpUJdx-YtoHtu)rP5nd0#QeZjify) zg>ibU8b9wQqEgx_ef%Sd0Wsbo{8yhl!b|&P)41Xdf~;5I57&h__BN>;8~Da1k1j7< zu4g!_#H?AdToMcSFNGpv(AA|M5N>Om2^M|cRFf>TM=%y9hD`BhQ{5TZb%Q1#D!zU4 z-&us$kyG$zt??F&;bAHd7})iJ#KZIw(9tusa( zo`vB+3&RQL$M2`QDx+*WlYxQ(dBbL4u9S3crEgVoI;>qz$wVrB?O{_gbr3nJZ|uld zu>M=X45l_asKWbJ5q|}4Ng~SM{j6lf&8FyttXbcK&L_m0r{W_DS+lg3eq8tGQ$>QL zqxQ1qeG1L7LgMhf8t6WSrdgr;`myGH3Vp!}?fDli8LJV=-lxz|E3`!|6|MRE6#B;$ z4Sc%_30n;(_9@h6gy3kK4Qo3 zk|aU|7hkDO>f8zXDB356xjU%kOMgl}Nn%V<2oRy`E4=Iu27ot3k=eN)IK?-9WIk52 zY3D#fB%L%Qid<|Z`1+0NplQ6L_(xKw<$43jiN`V^dCLJ+uFv$@Rc)XilmPvKdZ-f|S zAcmKD)n4487en+SyPX$>C;7*1`=2~7f){Oj{CPK_<{+wWBKw&>%`A6hH8jOR1%q98 z^%1;{tG)TCcK01@f&V0Ux7BNt$eY)@yZ3Sb{?rPYL(i}csPxe-LTPsvg&Zzn+&l>e z^7M1kdu?Ax8*W(RZ5%rV(_x6nA2K>EV4Wh1lnZq-raqI`1QBq_YlI^prY-+Kw5ooH z`C;_#36A-0w35c^!UDFE!-N)2AC$+A3%}&CyXC9U%ED0$+$}UqPNy z@6MWY(mVG<<@7S6DU!eYRor6v^h2UgALOT(b#V_y&8XVI}3c5mW+V-nhJjke&vZVq>kE6O%v+VXCM%4c}6{Ck;CC-t}%;s0Y*Uq z|4HG0D8Qcbbv4vSK!AF$(ft7lpFPHm> zQgxJq-7}A%{$cP&{v~eJ!QN38>ZBHq>}78ID?qV1r`rd(i|u^f^6q6yh;x!ufB_n7 zh|Y5&*v5hbe+b%GWflWt5%E3Ek_i+9K~$bU#ZFOn6QF{esSPAJiIgi9mn0B}&4*)n z)-?!7MVt^C7;mbcST}c|c{`e&5zK-%4JV>HhkRBMN;>r8c!{O%@CQWH+NiV~5TI|^ zC;G&y;09KUk#UqyTgIPFHmKypLOJ6NV%sAOEATrNh&m#z@j2%?%UE66ao^?w_MHGoiY3k?8FZ7u&j9*nWiE-+~1gn z==q{ns$q5S0!y}}vJ(^R_;!&MYm4+*XvpAVTPmEyVJ&do>`fK(kj$e`INS&go)oaq{CF;Jic+7s2GeaMbdnV}bP&FB5zUx`yc~yFe%fvCwb!-`Z21q&X`5Ey5*pR) z`BT#0X4Yr1w5$NwXLI%OZJU#}7f>o6e2)?ISyd4RpkXf5i-bnpeiC1$>rb-n$X8*c zumS?iRqbWZdV#fmU4jy>2wfBEWe%WVKK&Umjm#(UWgr9Mi2>iGZ0f3w@M6-4Dtv&~ z#jYh;-BMfj+xvK(AC}*_VVBPT?_sREtW!gwhuy$6yOBb3|uN*`bY?3Xx$GEy##h7aX_mm0N|ZuZCNX~oDISy+e@u+z9Pen6@1l+NE!Z6 z>QMna2-jaQjT*G+hYnrEb_`Z)OK#w`QI37E*wE<1qVi_7*c+r^D;=U-v|7Ia3isqw5z z%tmF)B{tXNI3#bgCEPTpc1jyUo9Zn+6Q8)sc;~s&J+AUUK0K)jpj0w{yjdK z$qnVZV>Kno`auH$PeXiQMBc0s79Czq9kI&{#(!O#gLYg`1q4mBe%KsJ#n0qxMmkyT@A({g*krZwChu*Y#=*9~jg&J50c zx=$VmV@U-6g&xwctKaQpzt0|h?$$_GzuRfJn1o;!emdKN zl79cSUofXZ@eAZIH^RdNC1M%`SUZqyg{z&!NdKne5gtE7k7x=2O{l6^FifffxK~vH zjEyr=2pRtYCN8{+6r8qOTgVhmS|W}1M08eFZZ2b<4ZsZj3oE5Wtl{Q)P2dvlD-9*& zF!-ys$m*T!k10xcJE(w87uddoiEFi2e)OG^{h8Mh{)S8F1q-M|N7M~UhWI9mdr4b|>D4B1gnEI-Fp=}T`O1PVtl7M7G=~~>e}yFtRZmL> zx=Ync7{NLs))1XDDh$G=4bDzYP>{onI%w=@E8$;7}N>D!JI9#XT>~X z*_}vwAr^_Q;4;C?+ch25DXK@sUK%|$jy}LA(y!hCT(gFchGY0=Y5}jjOHgLc*!Yb zVXy%jvZj`2*uBeTjvu^T@bhoey4^0&5xIUtIlCIQZ(@BQ49+G_)3dJvt%TubD?zDcq#7%HK|wH1&mVUvV??Pn_q5V2lVKDZS}oiAW}ewv*gM{4 z_@y!=SJiSkL+9Vwn%vA@NCsd2%ALWDW=Q5B4{RMs_&=XOjv>Jxo}f(i8jdays1=!t z21Ncw#zO`tbMN#LP8IQPo37!WYu2D7gxKJTy=)q6_kpYK}MJ z3>$6bOeI?|Mq7~m8`TFf#Sz;$m|e!8berm8m+ia%a+hu477^(G%U!l|3jcrHW$SGZ z+aI{g_B?QHlK2+fX7;LZYS`OxLivbAB6m(B6|(=>wphk_{cBtNe)tr;Lw0Xvx zxQVr+tDC{*N5dUbto)oXFie0Tl3m{&}{C=C|wp z%JqthEf!{p^$W0;U>s`&!It+Rw#e_KM6U+9vDJM*Etjj7v#Et!g5D11?4Y{qJ5`yY z{0CX_37MpbKsBPFVl1Zy8%4x|9-ejbsX3%biuXju0->uQrCZsrPsT^C!-us+Ckln*Yk>{P>-EVGh*Dewc0KU9`Xd z?$2e@n@%GBx5>`lTnIQ_#tzGWgkzOq&Mpvt5j+JtDf z$Srt&UzsM82{){umP+kR|ql&Ay{0r)IO7;4&oKoc$u2ypo7uPEJH-6oU zI6o)1S=OEGcNmtr$jHeW*R*7TXS8g^rBIYDE@LvQno(AF`r9k*`PI(3Uq^Rlc(0wT z4On+mYKE8Wbf1t965d`Mr`c-#+sKl5K+J5bi0x)IJe_kQ6&k+TmmwwQ$1epe6xl~i zup_J94dt0ZcYP6;8$LV4pA$9MCATsGe0nwIkh`n5M$qyXr6h)Kb)Qh9%V`0W%?)Vd z{>j{KeNSX3KzMsX9X9jz>iwp-q>#MNzk!@IjF;Cb4A5*6P}eg}vh{YD?I{+(UVqI+ z#0&W%PdfLIxiUPjB7y2T2Ocz*H@ZT6r$3Zl1fSw3aqKzYPVK>Mtf{ga>AbPqrg;84 z1g4n3m~b159@}^Z(^yl_NE%;3%Vx52zu)z)tnY=^O5$?uHJ4j*q;xXJU=Z-ubu=b# z;5cwJKJJm(=YNvz=<^oA-xf~xbU#;S|2N&EotuuQN*y2GUyF+-rEh2~Kh#TZa4}&g zxfY&9x5X_Vk@;aFzNkgrvZsRA@f16+9r?n!sR3&a_SxK;1!%vg-yja^xasBLO#F6iS^Ne#0K2`O&7Q^I)1^Qqu7ozLZbuHX~3nV}9nM`iW=XqcwwjIvK z9GQq6$L9(@dav>+p7mYFw--L&!S^rtwDO7S&O3^8w3y7!c`rY951-%i*}!kjM|=4F zk9TeQBaC^}p}?7s+RiPVH&pRLF$BsH+KX>zeHRY71&rkXM zAD=G()1UG=_BiH;Pv+lz?%@3ce9A_0W|_|?Kaq&Nc}yZU?bt+Y4WFLy^CESw8)5se z`Kvp+|9SigjF)n!eligocYGptJD)>K60tAvxt31^i|9Lo(H*?|EA`By-j=XF!A|o! zjz0X3kA7S&`W{JhHdQJ+f0D*4Reb1xs|`B$H3$ z>Wu0?8+iRBo`_w;=aE<<_8>U-B6xXeh^xxC0o)x5UU!FhuC!n0+d9&GN1v$9=zBf% zuFtLTo_CllnY>Z|F)`INdULWKChC^V>sPuDUdr;pOKa|SO?VS;o$MyA-BhKV*?7gP zily1c5Fu?&x4nu__0DN`ADm*V@#d^`O=LyFjd{Hq@H7IM-}IcqfAlT%)~>wIUqpdmuUrd|Q*_8i|Xp7uW=ld0!nq<>v#$t3ClA=fQ9g}u4YNDVn|V~ThKT?FBrvCn)ceXJrrx3 zoFJjMwrw&7)7Hs{#)7=CJng+bglmlNK*W%RBlsQy6wgAP;Hx})$wqToMs8zRe!~h_jf62R1?@ZSKmEk>#kEE{kb+lFI zs0`pb5oU9ll2f9y>n8AdTRwIVCulP7ww^rb-EZu>yLqR{MD53ro9slN7?2OT$81z@ zvtAWt-R+i*@+x;5J{4RRrFMHWcY9@{TrB66dUmIisoQ2cJIa)xi2&CI+h!-&2}dYW zZiq$fB9~dc+i0_ZgI9%SkIetdS*RdR@Rnjyq`7LW)67RDwQUbxw27Ee@>Kbg{3OFz zCM?)!pO4q`@9p!6dj6Fy;#ER7D;fG}m7RtJR}nQ^eUbjV#J_6}=;H+Ql$on?jWxsA z+bnHkV{Xj6J~88u4)d3;Bcl`Gr1RnY%?S<7GtYdEh1(l$SIlIxyA2j5YZqyQLk1fmd+FsC`tvpS%sqF;oQQ`j> zk1HxERQtlm-C81tuqY}defH;cf@BjgkA4hdjb3F-I0J2*QHFmdJDqIdI0^^}i)F}K z;_oPh6jU#V&P)J&g-_}BH7IeI{ykd7Hn-2c+Y6{_ef^okZdK+blxUY0F6eJz@cLDtktMm@o8AdWL)u|QHL!kp z8o>M~xIh3Xh}zywVFB=awbHk;88BQd$&>pabS!hE2#9ZO#p_$6(zo$R;oEGW@;wN= z+S7SN6M=LDz>-TAU1&z-&p9W=vhM!?%Z{OEA(mBcw;&eI<^yx)BH4;YfbjwG5X^n(|7SR`(D^??|9YwmJN6Ouzfv7y_OG>I8U&VT_RB03`e*-E zi2cK}|HZIJw9q{WzlPfu%>INX!@s$QCY@jx>jFb?*3HyCqJtWSTZHKTxN4RB>{ad? zRIB!FDLt4h_sX(5vn3=;(d6Hh0-PWVmL_O*GsN9NB6py_KH4ULx^I5YLTKg=Y;`Bv zwm+7k_~Yo1g=IstH?tkF-kXV8YKN133*N>w)iXp!S3IbH35)5oO#iwE^e?FtE)Rdb z(DVi7`%St+kJZN1_fe7lWpC~c`%OF!dgBl1%@u=sb3LJa1qLG(U^HPpG6wy>Bh@Zy9G%)#lX_PhFve{H6)5 zt?YfP?l%WzAIwN}y9vV>*f08Lb|ln4%OFg9wz1v)9n0FH>t)aV$e1GLI!kTWG#c*e zm2bzBjLw#8V7i2Z_z%OmWZ?v>?Y+o%{rGP?+0|OgoZ!T;feSva0mG32+McrpHsF73 z1M|WLu8tb`t@yeVY*s9M*ktv92Kq-IwXj?*44jq-)EN~wGh_KKy}6WI<)92>mxe4J z79X~IJaO8{ygpJmX%;s!KS^eLI#*oMg8Ghm8cwHfWV!BSIthm5c^9&ZCUO<^@8uGU z8mAZ1^Ma2y{pY()(<%`ykLS|7s8X$JTOrtTE7?Xro)t&JtM$-UTtQWfY zP24ZI0D$5+kQz18Gh&j3u34HE1*H69eYZ$xIbmM$DlMDIUyR#xDwMI~9)( z8vjvP7KP5(3N$IoC^A}CZn9iU77#?+|H1d{v*s-LYE(4Q2pY}cS8K9!cu-}t;7T70 zCPrDPUHvK0a!>8*Poy}_p24srEhoI2yCGxohhxRWE;7ds3V3WRA3;~&dczJA4P$1v zf7cWtaPXo{{P)tFg#-ZUjsP4AET&tGwhCTMg|4lTyOL&h_Ag64v(3vZ!!Aho>h+@m6(0G zdghZEKaaisSBB&&783z#2zJ7v#_1Iqzk-89>0ParqlLZyWFp`$4E$e;)%^nPSH4J( zr?N0`#1)P=b$0|ariycV7L{dO6Z4D2&KItXK-l)W9g)NrAziTqL_-oSQAPbzKd3%` zd0!=qKc*5&8+NG5ECz$oqNqWHHJv)5m8ow%JXkB36O2}^NCv<=ueE*`v!{hs?xQIMxJBg%yK__}|D=wZdlZuLq4--~9vD^s&$+fD7C>X`1?h5{CTe z*x&>cZ58W5wZ29pd^W0`F_9j68sWYe?}xL<&4S^GahZIta#(2nJo3r!f-x8^AY^Ax z=pYeXM3`(CX52qor&r9-9`xyW^%C0+Yf5FooqSNgRIyvt#QpBdsK{a!p)xThm{+)- zwdlRh1^}?sCzxd%fQ*`8$yMa&cMzHb3j@$b%0AS|UaT|pMY+^1?|IV`ZhLOr1G2SQ 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 z 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