]>
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
;
7 import java
.util
.Optional
;
8 import java
.util
.concurrent
.CompletableFuture
;
10 import javax
.xml
.XMLConstants
;
11 import javax
.xml
.namespace
.QName
;
14 * A semi-structured content, with attributes, within a hierarchical structure.
16 public interface Content
extends Iterable
<Content
>, Map
<QName
, Object
> {
25 * ATTRIBUTES OPERATIONS
28 <A
> Optional
<A
> get(QName key
, Class
<A
> clss
);
30 default Object
get(String key
) {
31 if (key
.indexOf(':') >= 0)
32 throw new IllegalArgumentException("Name " + key
+ " has a prefix");
33 return get(new QName(XMLConstants
.NULL_NS_URI
, key
, XMLConstants
.DEFAULT_NS_PREFIX
));
36 default Object
put(String key
, Object value
) {
37 if (key
.indexOf(':') >= 0)
38 throw new IllegalArgumentException("Name " + key
+ " has a prefix");
39 return put(new QName(XMLConstants
.NULL_NS_URI
, key
, XMLConstants
.DEFAULT_NS_PREFIX
), value
);
42 default Object
remove(String key
) {
43 if (key
.indexOf(':') >= 0)
44 throw new IllegalArgumentException("Name " + key
+ " has a prefix");
45 return remove(new QName(XMLConstants
.NULL_NS_URI
, key
, XMLConstants
.DEFAULT_NS_PREFIX
));
48 Class
<?
> getType(QName key
);
50 boolean isMultiple(QName key
);
52 <A
> Optional
<List
<A
>> getMultiple(QName key
, Class
<A
> clss
);
54 @SuppressWarnings("unchecked")
55 default <A
> List
<A
> getMultiple(QName key
) {
58 type
= (Class
<A
>) getType(key
);
59 } catch (ClassCastException e
) {
60 throw new IllegalArgumentException("Requested type is not the default type");
62 Optional
<List
<A
>> res
= getMultiple(key
, type
);
67 throw new IllegalStateException("Metadata " + key
+ " is not availabel as list of type " + type
);
75 // default CompletionStage<Content> edit(Consumer<Content> work) {
76 // return CompletableFuture.supplyAsync(() -> {
79 // }).minimalCompletionStage();
82 Content
add(QName name
, QName
... classes
);
84 default Content
add(String name
, QName
... classes
) {
85 if (name
.indexOf(':') >= 0)
86 throw new IllegalArgumentException("Name " + name
+ " has a prefix");
87 return add(new QName(XMLConstants
.NULL_NS_URI
, name
, XMLConstants
.DEFAULT_NS_PREFIX
), classes
);
95 List
<QName
> getContentClasses();
98 default boolean isContentClass(QName
... contentClass
) {
99 List
<QName
> contentClasses
= getContentClasses();
100 for (QName cClass
: contentClass
) {
101 if (!contentClasses
.contains(cClass
))
108 default boolean hasContentClass(QName
... contentClass
) {
109 List
<QName
> contentClasses
= getContentClasses();
110 for (QName cClass
: contentClass
) {
111 if (contentClasses
.contains(cClass
))
120 default <A
> A
adapt(Class
<A
> clss
) {
121 throw new UnsupportedOperationException("Cannot adapt content " + this + " to " + clss
.getName());
124 default <C
extends Closeable
> C
open(Class
<C
> clss
) throws IOException
{
125 throw new UnsupportedOperationException("Cannot open content " + this + " as " + clss
.getName());
128 default <A
> CompletableFuture
<A
> write(Class
<A
> clss
) {
129 throw new UnsupportedOperationException("Cannot write content " + this + " as " + clss
.getName());
133 * CONVENIENCE METHODS
135 default String
attr(String key
) {
136 Object obj
= get(key
);
139 return obj
.toString();
143 default String
attr(QName key
) {
144 Object obj
= get(key
);
147 return obj
.toString();
151 // default String attr(Object key) {
152 // return key != null ? attr(key.toString()) : attr(null);
155 // default <A> A get(Object key, Class<A> clss) {
156 // return key != null ? get(key.toString(), clss) : get(null, clss);
160 * EXPERIMENTAL UNSUPPORTED
162 default boolean hasText() {
166 default String
getText() {
167 throw new UnsupportedOperationException();