]>
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 /** Partial reference implementation of a {@link ProvidedContent}. */
19 public abstract class AbstractContent
extends AbstractMap
<QName
, Object
> implements ProvidedContent
{
22 * ATTRIBUTES OPERATIONS
24 protected abstract Iterable
<QName
> keys();
26 protected abstract void removeAttr(QName key
);
29 public Set
<Entry
<QName
, Object
>> entrySet() {
30 Set
<Entry
<QName
, Object
>> result
= new AttrSet();
35 public Class
<?
> getType(QName key
) {
40 public boolean isMultiple(QName key
) {
44 @SuppressWarnings("unchecked")
46 public <A
> Optional
<List
<A
>> getMultiple(QName key
, Class
<A
> clss
) {
47 Object value
= get(key
);
50 if (value
instanceof List
) {
52 List
<A
> res
= (List
<A
>) value
;
53 return Optional
.of(res
);
54 } catch (ClassCastException e
) {
55 List
<A
> res
= new ArrayList
<>();
56 List
<?
> lst
= (List
<?
>) value
;
58 for (Object o
: lst
) {
62 return Optional
.of(res
);
63 } catch (ClassCastException e1
) {
64 return Optional
.empty();
70 return Optional
.of(Collections
.singletonList(res
));
71 } catch (ClassCastException e
) {
72 return Optional
.empty();
82 public String
getPath() {
83 List
<Content
> ancestors
= new ArrayList
<>();
84 collectAncestors(ancestors
, this);
85 StringBuilder path
= new StringBuilder();
86 for (Content c
: ancestors
) {
87 QName name
= c
.getName();
89 if (!CrName
.ROOT
.get().equals(name
))
90 path
.append('/').append(name
);
92 return path
.toString();
95 private void collectAncestors(List
<Content
> ancestors
, Content content
) {
98 ancestors
.add(0, content
);
99 collectAncestors(ancestors
, content
.getParent());
105 protected boolean isDefaultAttrTypeRequested(Class
<?
> clss
) {
106 // check whether clss is Object.class
107 return clss
.isAssignableFrom(Object
.class);
111 public String
toString() {
112 return "content " + getPath();
119 class AttrSet
extends AbstractSet
<Entry
<QName
, Object
>> {
122 public Iterator
<Entry
<QName
, Object
>> iterator() {
123 final Iterator
<QName
> keys
= keys().iterator();
124 Iterator
<Entry
<QName
, Object
>> it
= new Iterator
<Map
.Entry
<QName
, Object
>>() {
129 public boolean hasNext() {
130 return keys
.hasNext();
134 public Entry
<QName
, Object
> next() {
137 Optional
<?
> value
= get(key
, Object
.class);
138 assert !value
.isEmpty();
139 AbstractMap
.SimpleEntry
<QName
, Object
> entry
= new SimpleEntry
<>(key
, value
.get());
144 public void remove() {
146 AbstractContent
.this.removeAttr(key
);
148 throw new IllegalStateException("Iteration has not started");
160 for (Iterator
<QName
> it
= keys().iterator(); it
.hasNext();) {