Start splitting Content in more abstract interfaces
[lgpl/argeo-commons.git] / org.argeo.api.acr / src / org / argeo / api / acr / Content.java
index 33ddeecedb2d07018cbdbd3d8248193350be3b1b..d6af2fe3de301e044f3f95e468b853d31a89c6a0 100644 (file)
@@ -13,9 +13,10 @@ 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<Content>, Map<QName, Object> {
+public interface Content extends QualifiedData<Content> {
        /** The base of a repository path. */
        String ROOT_PATH = "/";
 
@@ -90,7 +91,11 @@ public interface Content extends Iterable<Content>, Map<QName, Object> {
         * CONTENT OPERATIONS
         */
        /** Adds a new empty {@link Content} to this {@link Content}. */
-       Content add(QName name, QName... classes);
+       Content add(QName name, QName... contentClass);
+
+       default Content add(QName name, QNamed... contentClass) {
+               return add(name, toQNames(contentClass));
+       }
 
        /**
         * Adds a new {@link Content} to this {@link Content}, setting the provided
@@ -135,10 +140,7 @@ public interface Content extends Iterable<Content>, Map<QName, Object> {
 
        /** AND */
        default boolean isContentClass(QNamed... contentClass) {
-               List<QName> lst = new ArrayList<>();
-               for (QNamed qNamed : contentClass)
-                       lst.add(qNamed.qName());
-               return isContentClass(lst.toArray(new QName[lst.size()]));
+               return isContentClass(toQNames(contentClass));
        }
 
        /** OR */
@@ -153,10 +155,14 @@ public interface Content extends Iterable<Content>, Map<QName, Object> {
 
        /** OR */
        default boolean hasContentClass(QNamed... contentClass) {
-               List<QName> lst = new ArrayList<>();
-               for (QNamed qNamed : contentClass)
-                       lst.add(qNamed.qName());
-               return hasContentClass(lst.toArray(new QName[lst.size()]));
+               return hasContentClass(toQNames(contentClass));
+       }
+
+       static QName[] toQNames(QNamed... names) {
+               QName[] res = new QName[names.length];
+               for (int i = 0; i < names.length; i++)
+                       res[i] = names[i].qName();
+               return res;
        }
 
        /*
@@ -244,6 +250,10 @@ public interface Content extends Iterable<Content>, Map<QName, Object> {
                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();
        }