]>
git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.api.acr/src/org/argeo/api/acr/spi/AbstractContent.java
1 package org
.argeo
.api
.acr
.spi
;
3 import java
.util
.AbstractMap
;
4 import java
.util
.AbstractSet
;
5 import java
.util
.ArrayList
;
6 import java
.util
.Collections
;
7 import java
.util
.Iterator
;
10 import java
.util
.Optional
;
13 import javax
.xml
.namespace
.QName
;
15 import org
.argeo
.api
.acr
.Content
;
16 import org
.argeo
.api
.acr
.CrName
;
18 public abstract class AbstractContent
extends AbstractMap
<QName
, Object
> implements Content
{
21 * ATTRIBUTES OPERATIONS
23 protected abstract Iterable
<QName
> keys();
25 protected abstract void removeAttr(QName key
);
28 public Set
<Entry
<QName
, Object
>> entrySet() {
29 Set
<Entry
<QName
, Object
>> result
= new AttrSet();
34 public Class
<?
> getType(QName key
) {
39 public boolean isMultiple(QName key
) {
44 public <A
> Optional
<List
<A
>> getMultiple(QName key
, Class
<A
> clss
) {
45 Object value
= get(key
);
48 if (value
instanceof List
) {
50 List
<A
> res
= (List
<A
>) value
;
51 return Optional
.of(res
);
52 } catch (ClassCastException e
) {
53 List
<A
> res
= new ArrayList
<>();
54 List
<?
> lst
= (List
<?
>) value
;
56 for (Object o
: lst
) {
60 return Optional
.of(res
);
61 } catch (ClassCastException e1
) {
62 return Optional
.empty();
68 return Optional
.of(Collections
.singletonList(res
));
69 } catch (ClassCastException e
) {
70 return Optional
.empty();
80 public String
getPath() {
81 List
<Content
> ancestors
= new ArrayList
<>();
82 collectAncestors(ancestors
, this);
83 StringBuilder path
= new StringBuilder();
84 for (Content c
: ancestors
) {
85 QName name
= c
.getName();
87 if (!CrName
.ROOT
.get().equals(name
))
88 path
.append('/').append(name
);
90 return path
.toString();
93 private void collectAncestors(List
<Content
> ancestors
, Content content
) {
96 ancestors
.add(0, content
);
97 collectAncestors(ancestors
, content
.getParent());
103 protected boolean isDefaultAttrTypeRequested(Class
<?
> clss
) {
104 // check whether clss is Object.class
105 return clss
.isAssignableFrom(Object
.class);
109 public String
toString() {
110 return "content " + getPath();
117 class AttrSet
extends AbstractSet
<Entry
<QName
, Object
>> {
120 public Iterator
<Entry
<QName
, Object
>> iterator() {
121 final Iterator
<QName
> keys
= keys().iterator();
122 Iterator
<Entry
<QName
, Object
>> it
= new Iterator
<Map
.Entry
<QName
, Object
>>() {
127 public boolean hasNext() {
128 return keys
.hasNext();
132 public Entry
<QName
, Object
> next() {
135 Optional
<?
> value
= get(key
, Object
.class);
136 assert !value
.isEmpty();
137 AbstractMap
.SimpleEntry
<QName
, Object
> entry
= new SimpleEntry
<>(key
, value
.get());
142 public void remove() {
144 AbstractContent
.this.removeAttr(key
);
146 throw new IllegalStateException("Iteration has not started");
157 for (QName key
: keys()) {