* A semi-structured content, with attributes, within a hierarchical structure.
*/
public interface Content extends Iterable<Content>, Map<QName, Object> {
+ /** The base of a repository path. */
+ String ROOT_PATH = "/";
QName getName();
}
List<A> res = getMultiple(key, type);
return res;
-// if (res == null)
-// return null;
-// else {
-// if (res.isEmpty())
-// throw new IllegalStateException("Metadata " + key + " is not availabel as list of type " + type);
-// return res.get();
-// }
}
/*
* CONTENT OPERATIONS
*/
-// default CompletionStage<Content> edit(Consumer<Content> work) {
-// return CompletableFuture.supplyAsync(() -> {
-// work.accept(this);
-// return this;
-// }).minimalCompletionStage();
-// }
-
Content add(QName name, QName... classes);
default Content add(String name, QName... classes) {
return res;
}
+ default List<Content> children(QNamed name) {
+ return children(name.qName());
+ }
+
+ default Optional<Content> soleChild(QNamed name) {
+ return soleChild(name.qName());
+ }
+
default Optional<Content> soleChild(QName name) {
List<Content> res = children(name);
if (res.isEmpty())
* @see Object#toString()
*/
default String attr(QName key) {
- // TODO check String type?
- Object obj = get(key);
- if (obj == null)
- return null;
- return obj.toString();
+ return get(key, String.class).orElse(null);
}
/**
return attr(unqualified(key));
}
+ /*
+ * CONTEXT
+ */
+ /**
+ * A content within this repository
+ *
+ * @param path either an absolute path or a path relative to this content
+ */
+ Optional<Content> getContent(String path);
+
/*
* EXPERIMENTAL UNSUPPORTED
*/