]>
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 default <A
> A
adapt(Class
<A
> clss
) throws IllegalArgumentException
{
96 throw new UnsupportedOperationException("Cannot adapt content " + this + " to " + clss
.getName());
99 default <C
extends Closeable
> C
open(Class
<C
> clss
) throws IOException
{
100 throw new UnsupportedOperationException("Cannot open content " + this + " as " + clss
.getName());
103 default <A
> CompletableFuture
<A
> write(Class
<A
> clss
) {
104 throw new UnsupportedOperationException("Cannot write content " + this + " as " + clss
.getName());
108 * CONVENIENCE METHODS
110 // default String attr(String key) {
111 // return get(key, String.class);
114 // default String attr(Object key) {
115 // return key != null ? attr(key.toString()) : attr(null);
118 // default <A> A get(Object key, Class<A> clss) {
119 // return key != null ? get(key.toString(), clss) : get(null, clss);
123 * EXPERIMENTAL UNSUPPORTED
125 default boolean hasText() {
129 default String
getText() {
130 throw new UnsupportedOperationException();