Merge remote-tracking branch 'Baeldung/master' into active_mq

# Conflicts:
#	.gitignore
#	LICENSE
#	README.md
#	core-java-modules/README.md
#	core-java-modules/core-java-11/README.md
#	core-java-modules/core-java-11/pom.xml
#	core-java-modules/core-java-8/README.md
#	core-java-modules/core-java-8/pom.xml
#	core-java-modules/core-java-8/src/main/resources/logback.xml
#	core-java-modules/core-java-annotations/README.md
#	core-java-modules/core-java-annotations/pom.xml
#	core-java-modules/core-java-collections-2/README.md
#	core-java-modules/core-java-collections-2/pom.xml
#	core-java-modules/core-java-collections-3/README.md
#	core-java-modules/core-java-collections-3/pom.xml
#	core-java-modules/core-java-collections-conversions-2/README.md
#	core-java-modules/core-java-collections-conversions-2/pom.xml
#	core-java-modules/core-java-collections-conversions/README.md
#	core-java-modules/core-java-collections-conversions/pom.xml
#	core-java-modules/core-java-collections-list/README.md
#	core-java-modules/core-java-collections-list/pom.xml
#	core-java-modules/core-java-collections/pom.xml
#	core-java-modules/core-java-datetime-conversion/README.md
#	core-java-modules/core-java-datetime-conversion/pom.xml
#	core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampUnitTest.java
#	core-java-modules/core-java-io-2/pom.xml
#	core-java-modules/core-java-io/README.md
#	core-java-modules/core-java-io/pom.xml
#	core-java-modules/core-java-io/src/test/resources/fileTest.txt
#	core-java-modules/core-java-io/src/test/resources/sampleTextFile.txt
#	core-java-modules/core-java-lambdas/README.md
#	core-java-modules/core-java-lambdas/pom.xml
#	core-java-modules/core-java-serialization/pom.xml
#	core-java-modules/core-java-streams/README.md
#	core-java-modules/core-java-streams/pom.xml
#	core-java-modules/core-java-strings/README.md
#	core-java-modules/core-java-strings/pom.xml
#	core-java-modules/core-java-strings/src/test/resources/stringtoolong.txt
#	core-java-modules/core-java-uuid/README.md
#	core-java-modules/core-java-uuid/pom.xml
#	core-java-modules/pom.xml
#	image-processing/README.md
#	image-processing/pom.xml
#	image-processing/src/main/java/com/baeldung/imageprocessing/addingtext/AddText.java
#	image-processing/src/main/java/com/baeldung/imageprocessing/opencv/CameraStream.java
#	jackson-modules/jackson-annotations/README.md
#	jackson-modules/jackson-annotations/pom.xml
#	jackson-modules/jackson-conversions-2/README.md
#	jackson-modules/jackson-conversions-2/pom.xml
#	jackson-modules/jackson-conversions/README.md
#	jackson-modules/jackson-conversions/pom.xml
#	jackson-modules/jackson-custom-conversions/README.md
#	jackson-modules/jackson-custom-conversions/pom.xml
#	jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/defaultserializercustomserializer/CallingDefaultSerializerUnitTest.java
#	jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/deserialization/CustomDeserializationUnitTest.java
#	jackson-modules/jackson-exceptions/README.md
#	jackson-modules/jackson-exceptions/pom.xml
#	jackson-modules/jackson-exceptions/src/test/java/com/baeldung/exceptions/JacksonExceptionsUnitTest.java
#	jackson-modules/jackson-exceptions/src/test/java/com/baeldung/mappingexception/JacksonMappingExceptionUnitTest.java
#	jackson-modules/pom.xml
#	parent-boot-1/pom.xml
#	parent-boot-2/pom.xml
#	parent-boot-3/pom.xml
#	patterns-modules/design-patterns-architectural/pom.xml
#	patterns-modules/design-patterns-architectural/src/main/java/com/baeldung/repositoryvsdaopattern/UserDaoImpl.java
#	patterns-modules/design-patterns-behavioral-2/README.md
#	patterns-modules/design-patterns-behavioral-2/pom.xml
#	patterns-modules/design-patterns-creational-2/README.md
#	patterns-modules/design-patterns-creational-2/pom.xml
#	patterns-modules/design-patterns-singleton/README.md
#	patterns-modules/design-patterns-structural/src/main/resources/log4jstructuraldp.properties
#	patterns-modules/enterprise-patterns/pom.xml
#	patterns-modules/intercepting-filter/pom.xml
#	patterns-modules/pom.xml
#	persistence-modules/activejdbc/pom.xml
#	persistence-modules/hibernate5/README.md
#	persistence-modules/hibernate5/pom.xml
#	persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/interceptors/CustomInterceptor.java
#	persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/interceptors/entity/User.java
#	persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/namingstrategy/CustomPhysicalNamingStrategy.java
#	persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/persistjson/Customer.java
#	persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/persistjson/HashMapConverter.java
#	persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pojo/OrderEntryIdClass.java
#	persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pojo/OrderEntryPK.java
#	persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/IdentifiersIntegrationTest.java
#	persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/bootstrap/BootstrapAPIIntegrationTest.java
#	persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/proxy/HibernateProxyUnitTest.java
#	persistence-modules/hibernate5/src/test/resources/hibernate-interceptors.properties
#	persistence-modules/hibernate5/src/test/resources/hibernate-lifecycle.properties
#	persistence-modules/hibernate5/src/test/resources/hibernate-namingstrategy.properties
#	persistence-modules/hibernate5/src/test/resources/hibernate-persistjson.properties
#	persistence-modules/hibernate5/src/test/resources/hibernate.properties
#	persistence-modules/pom.xml
#	persistence-modules/spring-data-jpa-crud/pom.xml
#	persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/repository/FruitRepository.java
#	persistence-modules/spring-data-jpa-repo-2/README.md
#	persistence-modules/spring-data-jpa-repo-2/pom.xml
#	persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/customrepository/model/User.java
#	persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/customrepository/repository/CustomUserRepositoryImpl.java
#	persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/saveperformance/Book.java
#	persistence-modules/spring-data-jpa-repo-2/src/main/resources/application.properties
#	persistence-modules/spring-data-mongodb-reactive/pom.xml
#	persistence-modules/spring-data-redis/README.md
#	persistence-modules/spring-data-redis/pom.xml
#	persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/reactive/redis/config/RedisConfig.java
#	persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/config/RedisConfig.java
#	persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/model/Student.java
#	persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/queue/RedisMessageSubscriber.java
#	persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/reactive/redis/template/RedisKeyCommandsManualTest.java
#	persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/reactive/redis/template/RedisTemplateListOpsManualTest.java
#	persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/reactive/redis/template/RedisTemplateValueOpsManualTest.java
#	persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/repo/StudentRepositoryManualTest.java
#	pom.xml
#	testing-modules/assertion-libraries/README.md
#	testing-modules/assertion-libraries/pom.xml
#	testing-modules/junit-5-basics/README.md
#	testing-modules/junit-5-basics/pom.xml
#	testing-modules/mockito-2/src/main/java/com/baeldung/nullmatcher/Helper.java
#	testing-modules/mockito-2/src/main/java/com/baeldung/nullmatcher/Main.java
#	testing-modules/mockito-2/src/main/java/com/baeldung/wantedbutnotinvocked/Helper.java
#	testing-modules/mockito-2/src/main/java/com/baeldung/wantedbutnotinvocked/Main.java
#	testing-modules/mockito-2/src/test/java/com/baeldung/nullmatcher/MainUnitTest.java
#	testing-modules/mockito-2/src/test/java/com/baeldung/wantedbutnotinvocked/MainUnitTest.java
#	testing-modules/pom.xml
#	testing-modules/spring-mockito/pom.xml
#	web-modules/dropwizard/pom.xml
#	web-modules/jakarta-ee/README.md
#	web-modules/jakarta-ee/pom.xml
#	web-modules/jakarta-ee/src/test/java/com/baeldung/eclipse/krazo/UserControllerUnitTest.java
#	web-modules/java-lite/pom.xml
#	web-modules/javax-servlets-2/README.md
#	web-modules/javax-servlets-2/pom.xml
#	web-modules/javax-servlets/pom.xml
#	web-modules/jee-7/pom.xml
#	web-modules/jooby/pom.xml
#	web-modules/ninja/pom.xml
#	web-modules/pom.xml
#	web-modules/ratpack/pom.xml
#	web-modules/resteasy/pom.xml
#	web-modules/restx/pom.xml
#	web-modules/spark-java/pom.xml
#	web-modules/vraptor/pom.xml
#	xml/README.md
#	xml/pom.xml
#	xml/src/main/resources/customer-binding.xml
#	xml/src/main/resources/sax/baeldung.xml
#	xml/src/test/resources/example_default_parser.xml
#	xml/src/test/resources/example_dom4j.xml
#	xml/src/test/resources/example_jaxb.xml
#	xml/src/test/resources/example_jaxen.xml
#	xml/src/test/resources/example_jdom.xml
#	xml/src/test/resources/example_stax.xml
#	xml/src/test/resources/sax/baeldung.xml
#	xml/src/test/resources/xml/websites.xml
#	xml/src/test/resources/xml/xee_attribute.xml
This commit is contained in:
2024-04-30 12:23:19 -04:00
27985 changed files with 1584039 additions and 0 deletions
@@ -0,0 +1,27 @@
package com.baeldung.memento;
public class TextEditor {
private TextWindow textWindow;
private TextWindowState savedTextWindow;
public TextEditor(TextWindow textWindow) {
this.textWindow = textWindow;
}
public void write(String text) {
textWindow.addText(text);
}
public String print() {
return textWindow.getCurrentText();
}
public void hitSave() {
savedTextWindow = textWindow.save();
}
public void hitUndo() {
textWindow.restore(savedTextWindow);
}
}
@@ -0,0 +1,26 @@
package com.baeldung.memento;
public class TextWindow {
private StringBuilder currentText;
public TextWindow() {
this.currentText = new StringBuilder();
}
public String getCurrentText() {
return currentText.toString();
}
public void addText(String text) {
currentText.append(text);
}
public TextWindowState save() {
return new TextWindowState(currentText.toString());
}
public void restore(TextWindowState save) {
currentText = new StringBuilder(save.getText());
}
}
@@ -0,0 +1,14 @@
package com.baeldung.memento;
public class TextWindowState {
private String text;
public TextWindowState(String text) {
this.text = text;
}
public String getText() {
return text;
}
}
@@ -0,0 +1,26 @@
package com.baeldung.nullconversion;
public class Address implements Cloneable {
private ZipCode zipCode;
public ZipCode getZipCode() {
return zipCode;
}
public void setZipCode(ZipCode zipCode) {
this.zipCode = zipCode;
}
@Override
protected Address clone() {
Address address;
try {
address = ((Address) super.clone());
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
zipCode = zipCode.clone();
return address;
}
}
@@ -0,0 +1,38 @@
package com.baeldung.nullconversion;
import java.util.Objects;
public class Delivery {
private String message;
public Delivery(String message) {
this.message = message;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Delivery delivery = (Delivery) o;
return Objects.equals(message, delivery.message);
}
@Override
public int hashCode() {
return message != null ? message.hashCode() : 0;
}
public static Delivery freeDelivery() {
return new Delivery("Free delivery");
}
public static Delivery defaultDelivery() {
return new Delivery("Default delivery");
}
}
@@ -0,0 +1,6 @@
package com.baeldung.nullconversion;
public interface DeliveryService {
Delivery calculateDeliveryForPerson(Long id);
}
@@ -0,0 +1,26 @@
package com.baeldung.nullconversion;
public class Person implements Cloneable {
private Address address;
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
protected Person clone() {
Person person;
try {
person = (Person) super.clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
address = address.clone();
return person;
}
}
@@ -0,0 +1,27 @@
package com.baeldung.nullconversion;
public class ZipCode implements Cloneable {
private String code;
public ZipCode(String code) {
this.code = code;
}
public String getCode() {
return code;
}
@Override
protected ZipCode clone() {
try {
return (ZipCode) super.clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
public void setCode(String code) {
this.code = code;
}
}
@@ -0,0 +1,20 @@
package com.baeldung.memento;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
class TextEditorUnitTest {
@Test
void givenTextEditor_whenAddTextSaveAddMoreAndUndo_thenSavecStateRestored() {
TextEditor textEditor = new TextEditor(new TextWindow());
textEditor.write("The Memento Design Pattern\n");
textEditor.write("How to implement it in Java?\n");
textEditor.hitSave();
textEditor.write("Buy milk and eggs before coming home\n");
textEditor.hitUndo();
assertThat(textEditor.print()).isEqualTo("The Memento Design Pattern\nHow to implement it in Java?\n");
}
}
@@ -0,0 +1,130 @@
package com.baeldung.nullconversion;
import static java.util.Objects.requireNonNullElse;
import static java.util.Objects.requireNonNullElseGet;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import com.google.common.base.MoreObjects;
import java.util.Optional;
import java.util.function.Supplier;
import org.apache.commons.lang3.ObjectUtils;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ArgumentsSource;
class NullConversionUnitTest {
@ParameterizedTest
@ArgumentsSource(ObjectsProvider.class)
void givenIfWhenNotNullThenReturnsDefault(String givenValue, String defaultValue) {
String actual = defaultValue;
if (givenValue != null) {
actual = givenValue;
}
assertDefaultConversion(givenValue, defaultValue, actual);
}
@ParameterizedTest
@ArgumentsSource(ObjectsSupplierProvider.class)
void givenIfWhenNotNullThenReturnsDefault(String givenValue, String expected,
Supplier<String> expensiveSupplier) {
String actual;
if (givenValue != null) {
actual = givenValue;
} else {
actual = expensiveSupplier.get();
}
assertDefaultConversion(givenValue, expected, actual);
}
@ParameterizedTest
@ArgumentsSource(ObjectsProvider.class)
void givenTernaryWhenNotNullThenReturnsDefault(String givenValue, String defaultValue) {
String actual = givenValue != null ? givenValue : defaultValue;
assertDefaultConversion(givenValue, defaultValue, actual);
}
@ParameterizedTest
@ArgumentsSource(ObjectsSupplierProvider.class)
void givenLazyTernaryWhenNotNullThenReturnsDefault(String givenValue, String expected,
Supplier<String> expensiveSupplier) {
String actual = givenValue != null ? givenValue : expensiveSupplier.get();
assertDefaultConversion(givenValue, expected, actual);
}
@ParameterizedTest
@ArgumentsSource(ObjectsProvider.class)
void givenObjectsWhenNotNullThenReturnsDefault(String givenValue, String defaultValue) {
String actual = requireNonNullElse(givenValue, defaultValue);
assertDefaultConversion(givenValue, defaultValue, actual);
}
@ParameterizedTest
@ArgumentsSource(ObjectsSupplierProvider.class)
void givenLazyObjectsWhenNotNullThenReturnsDefault(String givenValue, String expected,
Supplier<String> expensiveSupplier) {
String actual = requireNonNullElseGet(givenValue, expensiveSupplier);
assertDefaultConversion(givenValue, expected, actual);
}
@ParameterizedTest
@ArgumentsSource(ObjectsProvider.class)
void givenOptionalWhenNotNullThenReturnsDefault(String givenValue, String defaultValue) {
String actual = Optional.ofNullable(givenValue).orElse(defaultValue);
assertDefaultConversion(givenValue, defaultValue, actual);
}
@ParameterizedTest
@ArgumentsSource(ObjectsSupplierProvider.class)
void givenLazyOptionalWhenNotNullThenReturnsDefault(String givenValue, String expected,
Supplier<String> expensiveSupplier) {
String actual = Optional.ofNullable(givenValue).orElseGet(expensiveSupplier);
assertDefaultConversion(givenValue, expected, actual);
}
@ParameterizedTest
@ArgumentsSource(ObjectsProvider.class)
void givenGuavaWhenNotNullThenReturnsDefault(String givenValue, String defaultValue) {
String actual = MoreObjects.firstNonNull(givenValue, defaultValue);
assertDefaultConversion(givenValue, defaultValue, actual);
}
@ParameterizedTest
@ArgumentsSource(ObjectsProvider.class)
void givenGuavaOptionalWhenNotNullThenReturnsDefault(String givenValue, String defaultValue) {
String actual = com.google.common.base.Optional.fromNullable(givenValue).or(defaultValue);
assertDefaultConversion(givenValue, defaultValue, actual);
}
@ParameterizedTest
@ArgumentsSource(ObjectsProvider.class)
void givenApacheWhenNotNullThenReturnsDefault(String givenValue, String defaultValue) {
String actual = ObjectUtils.firstNonNull(givenValue, defaultValue);
assertDefaultConversion(givenValue, defaultValue, actual);
}
@ParameterizedTest
@ArgumentsSource(ObjectsSupplierProvider.class)
void givenLazyApacheWhenNotNullThenReturnsDefault(String givenValue, String expected,
Supplier<String> expensiveSupplier) {
String actual = ObjectUtils.getFirstNonNull(() -> givenValue, expensiveSupplier);
assertDefaultConversion(givenValue, expected, actual);
}
@Test
void givenAllNullsWithObjectsWhenNotNullThenThrowException() {
assertThatExceptionOfType(NullPointerException.class)
.isThrownBy(() -> requireNonNullElse(null, null));
}
private static void assertDefaultConversion(String given, String expected, String actual) {
if (given == null) {
assertThat(actual).isEqualTo(expected);
} else {
assertThat(actual).isEqualTo(given);
}
}
}
@@ -0,0 +1,26 @@
package com.baeldung.nullconversion;
import java.util.stream.Stream;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.ArgumentsProvider;
public class NullReturningPersonChainProvider implements ArgumentsProvider {
@Override
public Stream<? extends Arguments> provideArguments(ExtensionContext context) {
Person person = new Person();
Address address = new Address();
ZipCode zipCode = new ZipCode("98-323");
address.setZipCode(zipCode);
person.setAddress(address);
return Stream.of(
Arguments.of(PersonMutatorUtil.cloneAndMutate(person, p -> p.getAddress().getZipCode().setCode(""))),
Arguments.of(PersonMutatorUtil.cloneAndMutate(person, p -> p.getAddress().setZipCode(null))),
Arguments.of(PersonMutatorUtil.cloneAndMutate(person, p -> p.setAddress(null)))
);
}
}
@@ -0,0 +1,18 @@
package com.baeldung.nullconversion;
import java.util.stream.Stream;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.ArgumentsProvider;
public class ObjectsProvider implements ArgumentsProvider {
@Override
public Stream<? extends Arguments> provideArguments(ExtensionContext context) {
return Stream.of(
Arguments.of(null, "default"),
Arguments.of("not null", "default")
);
}
}
@@ -0,0 +1,20 @@
package com.baeldung.nullconversion;
import java.util.function.Supplier;
import java.util.stream.Stream;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.ArgumentsProvider;
public class ObjectsSupplierProvider implements ArgumentsProvider {
@Override
public Stream<? extends Arguments> provideArguments(ExtensionContext context) {
Supplier<String> supplier = () -> "default";
return Stream.of(
Arguments.of(null, "default", supplier),
Arguments.of("not null", "default", supplier)
);
}
}
@@ -0,0 +1,31 @@
package com.baeldung.nullconversion;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import com.baeldung.nullconversion.service.OnePersonExplicitDeliveryService;
import com.baeldung.nullconversion.service.OnePersonGuavaOptionalDeliveryService;
import com.baeldung.nullconversion.service.OnePersonOptionalDeliveryService;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ArgumentsSource;
class OnePersonDeliveryServiceUnitTest {
@ParameterizedTest
@ArgumentsSource(PersonProvider.class)
void givenMockDeliverServiceWhenNullValuesThenExplicitServiceHandleThem(Person person, Delivery expected) {
DeliveryService deliveryService = new OnePersonExplicitDeliveryService(person);
Delivery actual = deliveryService.calculateDeliveryForPerson(1L);
assertThat(actual).isEqualTo(expected);
}
@ParameterizedTest
@ArgumentsSource(PersonProvider.class)
void givenMockDeliverServiceWhenNullValuesThenOptionalServiceHandleThem(Person person, Delivery expected) {
DeliveryService deliveryService = new OnePersonOptionalDeliveryService(person);
Delivery actual = deliveryService.calculateDeliveryForPerson(1L);
assertThat(actual).isEqualTo(expected);
}
}
@@ -0,0 +1,12 @@
package com.baeldung.nullconversion;
import java.util.function.Consumer;
public class PersonMutatorUtil {
public static Person cloneAndMutate(Person person, Consumer<Person> mutator) {
Person clone = person.clone();
mutator.accept(clone);
return clone;
}
}
@@ -0,0 +1,34 @@
package com.baeldung.nullconversion;
import java.util.function.Consumer;
import java.util.stream.Stream;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.ArgumentsProvider;
public class PersonProvider implements ArgumentsProvider {
@Override
public Stream<? extends Arguments> provideArguments(ExtensionContext context) {
Person person = new Person();
Address address = new Address();
ZipCode zipCode = new ZipCode("98-323");
address.setZipCode(zipCode);
person.setAddress(address);
return Stream.of(
Arguments.of(person, Delivery.freeDelivery()),
Arguments.of(cloneAndMutate(person, p -> p.getAddress().getZipCode().setCode("")), Delivery.defaultDelivery()),
Arguments.of(cloneAndMutate(person, p -> p.getAddress().setZipCode(null)), Delivery.defaultDelivery()),
Arguments.of(cloneAndMutate(person, p -> p.setAddress(null)), Delivery.defaultDelivery()),
Arguments.of(null, Delivery.defaultDelivery())
);
}
private static Person cloneAndMutate(Person person, Consumer<Person> mutator) {
Person clone = person.clone();
mutator.accept(clone);
return clone;
}
}
@@ -0,0 +1,50 @@
package com.baeldung.nullconversion.service;
import com.baeldung.nullconversion.Address;
import com.baeldung.nullconversion.Delivery;
import com.baeldung.nullconversion.DeliveryService;
import com.baeldung.nullconversion.Person;
import com.baeldung.nullconversion.ZipCode;
import java.util.Optional;
public abstract class MockOnePersonDeliveryServiceBase implements DeliveryService {
private final Person person;
public MockOnePersonDeliveryServiceBase(Person person) {
this.person = person;
}
@Override
public Delivery calculateDeliveryForPerson(Long id) {
Person person = getPersonById(id);
if (person != null && person.getAddress() != null && person.getAddress().getZipCode() != null) {
ZipCode zipCode = person.getAddress().getZipCode();
String code = zipCode.getCode();
return calculateDeliveryForZipCode(code);
}
return Delivery.defaultDelivery();
}
public Delivery calculateDeliveryForPersonWithOptional(Long id) {
return Optional.ofNullable(getPersonById(id))
.map(Person::getAddress)
.map(Address::getZipCode)
.map(ZipCode::getCode)
.map(this::calculateDeliveryForZipCode)
.orElse(Delivery.defaultDelivery());
}
protected Person getPersonById(Long id) {
return person;
}
protected Delivery calculateDeliveryForZipCode(String zipCode) {
if (zipCode == null || zipCode.isEmpty()) {
return Delivery.defaultDelivery();
} else {
return Delivery.freeDelivery();
}
}
}
@@ -0,0 +1,24 @@
package com.baeldung.nullconversion.service;
import com.baeldung.nullconversion.Delivery;
import com.baeldung.nullconversion.Person;
import com.baeldung.nullconversion.ZipCode;
public class OnePersonExplicitDeliveryService extends MockOnePersonDeliveryServiceBase {
public OnePersonExplicitDeliveryService(Person person) {
super(person);
}
@Override
public Delivery calculateDeliveryForPerson(Long id) {
Person person = getPersonById(id);
if (person != null && person.getAddress() != null && person.getAddress().getZipCode() != null) {
ZipCode zipCode = person.getAddress().getZipCode();
String code = zipCode.getCode();
return calculateDeliveryForZipCode(code);
}
return Delivery.defaultDelivery();
}
}
@@ -0,0 +1,26 @@
package com.baeldung.nullconversion.service;
import com.baeldung.nullconversion.Address;
import com.baeldung.nullconversion.Delivery;
import com.baeldung.nullconversion.Person;
import com.baeldung.nullconversion.ZipCode;
import com.google.common.base.Optional;
public class OnePersonGuavaOptionalDeliveryService extends MockOnePersonDeliveryServiceBase {
public OnePersonGuavaOptionalDeliveryService(Person person) {
super(person);
}
@Override
public Delivery calculateDeliveryForPerson(Long id) {
return Optional.fromNullable(getPersonById(id))
.transform(Person::getAddress)
.transform(Address::getZipCode)
.transform(ZipCode::getCode)
.transform(this::calculateDeliveryForZipCode)
.or(Delivery.defaultDelivery());
}
}
@@ -0,0 +1,26 @@
package com.baeldung.nullconversion.service;
import com.baeldung.nullconversion.Address;
import com.baeldung.nullconversion.Delivery;
import com.baeldung.nullconversion.Person;
import com.baeldung.nullconversion.ZipCode;
import java.util.Optional;
public class OnePersonOptionalDeliveryService extends MockOnePersonDeliveryServiceBase {
public OnePersonOptionalDeliveryService(Person person) {
super(person);
}
@Override
public Delivery calculateDeliveryForPerson(Long id) {
return Optional.ofNullable(getPersonById(id))
.map(Person::getAddress)
.map(Address::getZipCode)
.map(ZipCode::getCode)
.map(this::calculateDeliveryForZipCode)
.orElse(Delivery.defaultDelivery());
}
}