X-Git-Url: https://git.argeo.org/?p=lgpl%2Fargeo-commons.git;a=blobdiff_plain;f=org.argeo.api.acr%2Fsrc%2Forg%2Fargeo%2Fapi%2Facr%2FContent.java;fp=org.argeo.api.acr%2Fsrc%2Forg%2Fargeo%2Fapi%2Facr%2FContent.java;h=c69e76a193077207091e58ad0fbc4a7d8f16eaa1;hp=7ec29594713e885d8f39a2efa00c0a24b186f7f3;hb=b95462873703848193e56fcbe997693630db6121;hpb=55d88fba80cec198a0f11ba7545e19878c51fc5e diff --git a/org.argeo.api.acr/src/org/argeo/api/acr/Content.java b/org.argeo.api.acr/src/org/argeo/api/acr/Content.java index 7ec295947..c69e76a19 100644 --- a/org.argeo.api.acr/src/org/argeo/api/acr/Content.java +++ b/org.argeo.api.acr/src/org/argeo/api/acr/Content.java @@ -4,7 +4,6 @@ import static org.argeo.api.acr.NamespaceUtils.unqualified; import java.io.Closeable; import java.io.IOException; -import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Optional; @@ -13,77 +12,21 @@ import java.util.concurrent.CompletableFuture; import javax.xml.namespace.QName; /** - * A semi-structured content, with attributes, within a hierarchical structure. + * A semi-structured content, with attributes, within a hierarchical structure + * whose nodes are named. */ -public interface Content extends Iterable, Map { - /** The base of a repository path. */ - String ROOT_PATH = "/"; +public interface Content extends QualifiedData { + /** The path separator: '/' */ + char PATH_SEPARATOR = '/'; - QName getName(); + /** The base of a repository path. */ + String ROOT_PATH = Character.toString(PATH_SEPARATOR); String getPath(); - Content getParent(); - - /* - * ATTRIBUTES OPERATIONS - */ - - Optional get(QName key, Class clss); - - Class getType(QName key); - - boolean isMultiple(QName key); - - List getMultiple(QName key, Class clss); - - /* - * ATTRIBUTES OPERATION HELPERS - */ - default boolean containsKey(QNamed key) { - return containsKey(key.qName()); - } - - default Optional get(QNamed key, Class clss) { - return get(key.qName(), clss); - } - - default Object get(QNamed key) { - return get(key.qName()); - } - - default Object put(QNamed key, Object value) { - return put(key.qName(), value); - } - - default Object remove(QNamed key) { - return remove(key.qName()); - } - - // TODO do we really need the helpers below? - - default Object get(String key) { - return get(unqualified(key)); - } - - default Object put(String key, Object value) { - return put(unqualified(key), value); - } - - default Object remove(String key) { - return remove(unqualified(key)); - } - - @SuppressWarnings("unchecked") - default List getMultiple(QName key) { - Class type; - try { - type = (Class) getType(key); - } catch (ClassCastException e) { - throw new IllegalArgumentException("Requested type is not the default type"); - } - List res = getMultiple(key, type); - return res; + /** MUST be {@link Content#PATH_SEPARATOR}. */ + default char getPathSeparator() { + return PATH_SEPARATOR; } /* @@ -164,21 +107,9 @@ public interface Content extends Iterable, Map { return res; } - /* - * SIBLINGS - */ - - default int getSiblingIndex() { - return 1; - } - /* * DEFAULT METHODS */ - default A adapt(Class clss) { - throw new UnsupportedOperationException("Cannot adapt content " + this + " to " + clss.getName()); - } - default C open(Class clss) throws IOException { throw new UnsupportedOperationException("Cannot open content " + this + " as " + clss.getName()); } @@ -190,19 +121,6 @@ public interface Content extends Iterable, Map { /* * CHILDREN */ - - default boolean hasChild(QName name) { - for (Content child : this) { - if (child.getName().equals(name)) - return true; - } - return false; - } - - default boolean hasChild(QNamed name) { - return hasChild(name.qName()); - } - default Content anyOrAddChild(QName name, QName... classes) { Content child = anyChild(name); if (child != null) @@ -214,92 +132,10 @@ public interface Content extends Iterable, Map { return anyOrAddChild(unqualified(name), classes); } - /** Any child with this name, or null if there is none */ - default Content anyChild(QName name) { - for (Content child : this) { - if (child.getName().equals(name)) - return child; - } - return null; - } - - default List children(QName name) { - List res = new ArrayList<>(); - for (Content child : this) { - if (child.getName().equals(name)) - res.add(child); - } - return res; - } - - default List children(QNamed name) { - return children(name.qName()); - } - - default Optional soleChild(QNamed name) { - return soleChild(name.qName()); - } - - default Optional soleChild(QName name) { - List res = children(name); - if (res.isEmpty()) - return Optional.empty(); - if (res.size() > 1) - throw new IllegalStateException(this + " has multiple children with name " + name); - return Optional.of(res.get(0)); - } - default Content soleOrAddChild(QName name, QName... classes) { return soleChild(name).orElseGet(() -> this.add(name, classes)); } - default Content child(QName name) { - return soleChild(name).orElseThrow(); - } - - default Content child(QNamed name) { - return child(name.qName()); - } - - /* - * ATTR AS STRING - */ - /** - * Convenience method returning an attribute as a {@link String}. - * - * @param key the attribute name - * @return the attribute value as a {@link String} or null. - * - * @see Object#toString() - */ - default String attr(QName key) { - return get(key, String.class).orElse(null); - } - - /** - * Convenience method returning an attribute as a {@link String}. - * - * @param key the attribute name - * @return the attribute value as a {@link String} or null. - * - * @see Object#toString() - */ - default String attr(QNamed key) { - return attr(key.qName()); - } - - /** - * Convenience method returning an attribute as a {@link String}. - * - * @param key the attribute name - * @return the attribute value as a {@link String} or null. - * - * @see Object#toString() - */ - default String attr(String key) { - return attr(unqualified(key)); - } - /* * CONTEXT */