package net.hamnaberg.json; import javaslang.control.Option; import net.hamnaberg.json.extension.Extended; import net.hamnaberg.json.util.Iterables; import java.util.*; import java.util.function.Predicate; public abstract class DataContainer<A extends DataContainer> extends Extended<A> { protected DataContainer(Json.JObject delegate) { super(delegate); } public Data getData() { return new Data(Property.fromData(delegate.getAsArrayOrEmpty("data"))); } public Map<String, Property> getDataAsMap() { return getData().getDataAsMap(); } public Option<Property> findProperty(Predicate<Property> predicate) { return getData().findProperty(predicate); } public Option<Property> propertyByName(final String name) { return getData().propertyByName(name); } /** * Replaces all properties with the same name as the supplied property * @param property property to replace with * @return a new copy of the template, or this if nothing was modified. */ @SuppressWarnings("unchecked") public A replace(Property property) { Data data = getData(); Data replaced = data.replace(property); if (!replaced.isEmpty()) { return copy(delegate.put("data", Property.toArrayNode(replaced))); } return (A)this; } /** * Adds a property to the data. * @param property the property to add * @return a new copy of the template. */ public A add(Property property) { return addAll(Arrays.asList(property)); } /** * Adds properties to the data. * @param toAdd the properties to add * @return a new copy of the template. */ @SuppressWarnings("unchecked") public A addAll(Iterable<Property> toAdd) { Data data = getData(); Data modified = data.addAll(toAdd); if (data == modified) { return (A)this; } return copy(delegate.put("data", Property.toArrayNode(data))); } /** * Replaces all properties. * * @param props the property to add * @return a new copy of the template. */ @SuppressWarnings("unchecked") public A set(Iterable<Property> props) { if (Iterables.isEmpty(props)) { return (A) this; } return copy(delegate.put("data", Property.toArrayNode(props))); } }