From 913411773f708a5d3d73cc7953a75c596f9bd7cd Mon Sep 17 00:00:00 2001 From: qza Date: Wed, 1 Jun 2016 22:20:55 +0200 Subject: [PATCH] #355 document, abstract base, traits and example domain --- .../abstractdocument/AbstractDocument.java | 38 +++++++++++++++++++ .../iluwatar/abstractdocument/Document.java | 34 +++++++++++++++++ .../iluwatar/abstractdocument/domain/Car.java | 18 +++++++++ .../abstractdocument/domain/HasModel.java | 13 +++++++ .../abstractdocument/domain/HasParts.java | 13 +++++++ .../abstractdocument/domain/HasPrice.java | 13 +++++++ .../abstractdocument/domain/Part.java | 18 +++++++++ 7 files changed, 147 insertions(+) create mode 100644 abstract-document/src/main/java/com/iluwatar/abstractdocument/AbstractDocument.java create mode 100644 abstract-document/src/main/java/com/iluwatar/abstractdocument/Document.java create mode 100644 abstract-document/src/main/java/com/iluwatar/abstractdocument/domain/Car.java create mode 100644 abstract-document/src/main/java/com/iluwatar/abstractdocument/domain/HasModel.java create mode 100644 abstract-document/src/main/java/com/iluwatar/abstractdocument/domain/HasParts.java create mode 100644 abstract-document/src/main/java/com/iluwatar/abstractdocument/domain/HasPrice.java create mode 100644 abstract-document/src/main/java/com/iluwatar/abstractdocument/domain/Part.java diff --git a/abstract-document/src/main/java/com/iluwatar/abstractdocument/AbstractDocument.java b/abstract-document/src/main/java/com/iluwatar/abstractdocument/AbstractDocument.java new file mode 100644 index 000000000..d4aa8ed5b --- /dev/null +++ b/abstract-document/src/main/java/com/iluwatar/abstractdocument/AbstractDocument.java @@ -0,0 +1,38 @@ +package com.iluwatar.abstractdocument; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Stream; + +public abstract class AbstractDocument implements Document { + + private final Map properties; + + protected AbstractDocument(Map properties) { + Objects.requireNonNull(properties, "properties map is required"); + this.properties = properties; + } + + @Override + public Void put(String key, Object value) { + properties.put(key, value); + return null; + } + + @Override + public Object get(String key) { + return properties.get(key); + } + + @Override + public Stream children(String key, Function, T> constructor) { + return Stream.of(get(key)) + .filter(el -> el != null) + .map(el -> (List>) el) + .findFirst().get().stream() + .map(constructor); + } + +} diff --git a/abstract-document/src/main/java/com/iluwatar/abstractdocument/Document.java b/abstract-document/src/main/java/com/iluwatar/abstractdocument/Document.java new file mode 100644 index 000000000..8d4db30b9 --- /dev/null +++ b/abstract-document/src/main/java/com/iluwatar/abstractdocument/Document.java @@ -0,0 +1,34 @@ +package com.iluwatar.abstractdocument; + +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Stream; + +public interface Document { + + /** + * Puts the value related to the key + * + * @param key + * @param value + * @return Void + */ + Void put(String key, Object value); + + /** + * Gets the value for the key + * + * @param key + * @return value or null + */ + Object get(String key); + + /** + * Gets the stream of child documents + * + * @param key + * @param constructor + * @return child documents + */ + Stream children(String key, Function, T> constructor); +} diff --git a/abstract-document/src/main/java/com/iluwatar/abstractdocument/domain/Car.java b/abstract-document/src/main/java/com/iluwatar/abstractdocument/domain/Car.java new file mode 100644 index 000000000..70e31e70e --- /dev/null +++ b/abstract-document/src/main/java/com/iluwatar/abstractdocument/domain/Car.java @@ -0,0 +1,18 @@ +package com.iluwatar.abstractdocument.domain; + +import java.util.HashMap; +import java.util.Map; + +import com.iluwatar.abstractdocument.AbstractDocument; + +public class Car extends AbstractDocument implements HasModel, HasPrice, HasParts { + + protected Car() { + super(new HashMap()); + } + + protected Car(Map properties) { + super(properties); + } + +} diff --git a/abstract-document/src/main/java/com/iluwatar/abstractdocument/domain/HasModel.java b/abstract-document/src/main/java/com/iluwatar/abstractdocument/domain/HasModel.java new file mode 100644 index 000000000..635f80abf --- /dev/null +++ b/abstract-document/src/main/java/com/iluwatar/abstractdocument/domain/HasModel.java @@ -0,0 +1,13 @@ +package com.iluwatar.abstractdocument.domain; + +import java.util.Optional; + +import com.iluwatar.abstractdocument.Document; + +public interface HasModel extends Document { + + default Optional getModel() { + return Optional.ofNullable((String) get("model")); + } + +} diff --git a/abstract-document/src/main/java/com/iluwatar/abstractdocument/domain/HasParts.java b/abstract-document/src/main/java/com/iluwatar/abstractdocument/domain/HasParts.java new file mode 100644 index 000000000..92c7dc7d9 --- /dev/null +++ b/abstract-document/src/main/java/com/iluwatar/abstractdocument/domain/HasParts.java @@ -0,0 +1,13 @@ +package com.iluwatar.abstractdocument.domain; + +import java.util.stream.Stream; + +import com.iluwatar.abstractdocument.Document; + +public interface HasParts extends Document { + + default Stream getParts() { + return children("parts", Part::new); + } + +} diff --git a/abstract-document/src/main/java/com/iluwatar/abstractdocument/domain/HasPrice.java b/abstract-document/src/main/java/com/iluwatar/abstractdocument/domain/HasPrice.java new file mode 100644 index 000000000..7c9e8e6a1 --- /dev/null +++ b/abstract-document/src/main/java/com/iluwatar/abstractdocument/domain/HasPrice.java @@ -0,0 +1,13 @@ +package com.iluwatar.abstractdocument.domain; + +import java.util.Optional; + +import com.iluwatar.abstractdocument.Document; + +public interface HasPrice extends Document { + + default Optional getPartner() { + return Optional.ofNullable((Number) get("price")); + } + +} diff --git a/abstract-document/src/main/java/com/iluwatar/abstractdocument/domain/Part.java b/abstract-document/src/main/java/com/iluwatar/abstractdocument/domain/Part.java new file mode 100644 index 000000000..fa252a7bc --- /dev/null +++ b/abstract-document/src/main/java/com/iluwatar/abstractdocument/domain/Part.java @@ -0,0 +1,18 @@ +package com.iluwatar.abstractdocument.domain; + +import java.util.HashMap; +import java.util.Map; + +import com.iluwatar.abstractdocument.AbstractDocument; + +public class Part extends AbstractDocument implements HasModel, HasPrice { + + protected Part() { + super(new HashMap()); + } + + protected Part(Map properties) { + super(properties); + } + +}