]> git.argeo.org Git - lgpl/argeo-commons.git/blob - gcr/Content.java
Prepare next development cycle
[lgpl/argeo-commons.git] / gcr / Content.java
1 package org.argeo.api.gcr;
2
3 import java.util.Map;
4
5 import javax.xml.XMLConstants;
6 import javax.xml.namespace.QName;
7
8 /**
9 * A semi-structured content, with attributes, within a hierarchical structure.
10 */
11 public interface Content extends Iterable<Content>, Map<QName, Object> {
12
13 QName getName();
14
15 String getPath();
16
17 Content getParent();
18
19 /*
20 * ATTRIBUTES OPERATIONS
21 */
22
23 <A> A get(QName key, Class<A> clss) throws IllegalArgumentException;
24
25 default Object get(String key) {
26 if (key.indexOf(':') >= 0)
27 throw new IllegalArgumentException("Name " + key + " has a prefix");
28 return get(new QName(XMLConstants.NULL_NS_URI, key, XMLConstants.DEFAULT_NS_PREFIX));
29 }
30
31 default Object put(String key, Object value) {
32 if (key.indexOf(':') >= 0)
33 throw new IllegalArgumentException("Name " + key + " has a prefix");
34 return put(new QName(XMLConstants.NULL_NS_URI, key, XMLConstants.DEFAULT_NS_PREFIX), value);
35 }
36
37 default Object remove(String key) {
38 if (key.indexOf(':') >= 0)
39 throw new IllegalArgumentException("Name " + key + " has a prefix");
40 return remove(new QName(XMLConstants.NULL_NS_URI, key, XMLConstants.DEFAULT_NS_PREFIX));
41 }
42
43 /*
44 * CONTENT OPERATIONS
45 */
46 Content add(QName name, QName... classes);
47
48 default Content add(String name, QName... classes) {
49 if (name.indexOf(':') >= 0)
50 throw new IllegalArgumentException("Name " + name + " has a prefix");
51 return add(new QName(XMLConstants.NULL_NS_URI, name, XMLConstants.DEFAULT_NS_PREFIX), classes);
52 }
53
54 void remove();
55
56 /*
57 * DEFAULT METHODS
58 */
59 default <A> A adapt(Class<A> clss) throws IllegalArgumentException {
60 throw new IllegalArgumentException("Cannot adapt content " + this + " to " + clss.getName());
61 }
62
63 default <C extends AutoCloseable> C open(Class<C> clss) throws Exception, IllegalArgumentException {
64 throw new IllegalArgumentException("Cannot open content " + this + " as " + clss.getName());
65 }
66
67 /*
68 * CONVENIENCE METHODS
69 */
70 // default String attr(String key) {
71 // return get(key, String.class);
72 // }
73 //
74 // default String attr(Object key) {
75 // return key != null ? attr(key.toString()) : attr(null);
76 // }
77 //
78 // default <A> A get(Object key, Class<A> clss) {
79 // return key != null ? get(key.toString(), clss) : get(null, clss);
80 // }
81
82 /*
83 * EXPERIMENTAL UNSUPPORTED
84 */
85 default boolean hasText() {
86 return false;
87 }
88
89 default String getText() {
90 throw new UnsupportedOperationException();
91 }
92
93 }