]>
git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.api.acr/src/org/argeo/api/acr/Content.java
1 package org
.argeo
.api
.acr
;
3 import java
.io
.Closeable
;
4 import java
.io
.IOException
;
5 import java
.util
.Collection
;
8 import java
.util
.Optional
;
9 import java
.util
.concurrent
.CompletableFuture
;
11 import javax
.xml
.XMLConstants
;
12 import javax
.xml
.namespace
.QName
;
15 * A semi-structured content, with attributes, within a hierarchical structure.
17 public interface Content
extends Iterable
<Content
>, Map
<QName
, Object
> {
26 * ATTRIBUTES OPERATIONS
29 <A
> Optional
<A
> get(QName key
, Class
<A
> clss
);
31 default Object
get(String key
) {
32 if (key
.indexOf(':') >= 0)
33 throw new IllegalArgumentException("Name " + key
+ " has a prefix");
34 return get(new QName(XMLConstants
.NULL_NS_URI
, key
, XMLConstants
.DEFAULT_NS_PREFIX
));
37 default Object
put(String key
, Object value
) {
38 if (key
.indexOf(':') >= 0)
39 throw new IllegalArgumentException("Name " + key
+ " has a prefix");
40 return put(new QName(XMLConstants
.NULL_NS_URI
, key
, XMLConstants
.DEFAULT_NS_PREFIX
), value
);
43 default Object
remove(String key
) {
44 if (key
.indexOf(':') >= 0)
45 throw new IllegalArgumentException("Name " + key
+ " has a prefix");
46 return remove(new QName(XMLConstants
.NULL_NS_URI
, key
, XMLConstants
.DEFAULT_NS_PREFIX
));
49 Class
<?
> getType(QName key
);
51 boolean isMultiple(QName key
);
53 <A
> Optional
<List
<A
>> getMultiple(QName key
, Class
<A
> clss
);
55 @SuppressWarnings("unchecked")
56 default <A
> List
<A
> getMultiple(QName key
) {
59 type
= (Class
<A
>) getType(key
);
60 } catch (ClassCastException e
) {
61 throw new IllegalArgumentException("Requested type is not the default type");
63 Optional
<List
<A
>> res
= getMultiple(key
, type
);
68 throw new IllegalStateException("Metadata " + key
+ " is not availabel as list of type " + type
);
76 // default CompletionStage<Content> edit(Consumer<Content> work) {
77 // return CompletableFuture.supplyAsync(() -> {
80 // }).minimalCompletionStage();
83 Content
add(QName name
, QName
... classes
);
85 default Content
add(String name
, QName
... classes
) {
86 if (name
.indexOf(':') >= 0)
87 throw new IllegalArgumentException("Name " + name
+ " has a prefix");
88 return add(new QName(XMLConstants
.NULL_NS_URI
, name
, XMLConstants
.DEFAULT_NS_PREFIX
), classes
);
96 List
<QName
> getContentClasses();
99 default boolean isContentClass(QName
... contentClass
) {
100 List
<QName
> contentClasses
= getContentClasses();
101 for (QName cClass
: contentClass
) {
102 if (!contentClasses
.contains(cClass
))
109 default boolean hasContentClass(QName
... contentClass
) {
110 List
<QName
> contentClasses
= getContentClasses();
111 for (QName cClass
: contentClass
) {
112 if (contentClasses
.contains(cClass
))
121 default <A
> A
adapt(Class
<A
> clss
) {
122 throw new UnsupportedOperationException("Cannot adapt content " + this + " to " + clss
.getName());
125 default <C
extends Closeable
> C
open(Class
<C
> clss
) throws IOException
{
126 throw new UnsupportedOperationException("Cannot open content " + this + " as " + clss
.getName());
129 default <A
> CompletableFuture
<A
> write(Class
<A
> clss
) {
130 throw new UnsupportedOperationException("Cannot write content " + this + " as " + clss
.getName());
137 default boolean hasChild(QName name
) {
138 for (Content child
: this) {
139 if (child
.getName().equals(name
))
145 default Content
anyOrAddChild(QName name
, QName
... classes
) {
146 Content child
= anyChild(name
);
149 return this.add(name
, classes
);
152 /** Any child with this name, or null if there is none */
153 default Content
anyChild(QName name
) {
154 for (Content child
: this) {
155 if (child
.getName().equals(name
))
162 * CONVENIENCE METHODS
164 default String
attr(String key
) {
165 Object obj
= get(key
);
168 return obj
.toString();
172 default String
attr(QName key
) {
173 Object obj
= get(key
);
176 return obj
.toString();
180 // default String attr(Object key) {
181 // return key != null ? attr(key.toString()) : attr(null);
184 // default <A> A get(Object key, Class<A> clss) {
185 // return key != null ? get(key.toString(), clss) : get(null, clss);
189 * EXPERIMENTAL UNSUPPORTED
191 default boolean hasText() {
195 default String
getText() {
196 throw new UnsupportedOperationException();