]>
git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms/src/org/argeo/cms/acr/AbstractContent.java
fa8062f7c12ea4fa7c596df69ffb89541112444d
1 package org
.argeo
.cms
.acr
;
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
;
17 import org
.argeo
.api
.acr
.spi
.ProvidedContent
;
19 /** Partial reference implementation of a {@link ProvidedContent}. */
20 public abstract class AbstractContent
extends AbstractMap
<QName
, Object
> implements ProvidedContent
{
23 * ATTRIBUTES OPERATIONS
25 protected abstract Iterable
<QName
> keys();
27 protected abstract void removeAttr(QName key
);
30 public Set
<Entry
<QName
, Object
>> entrySet() {
31 Set
<Entry
<QName
, Object
>> result
= new AttrSet();
36 public Class
<?
> getType(QName key
) {
41 public boolean isMultiple(QName key
) {
45 @SuppressWarnings("unchecked")
47 public <A
> Optional
<List
<A
>> getMultiple(QName key
, Class
<A
> clss
) {
48 Object value
= get(key
);
51 if (value
instanceof List
) {
53 List
<A
> res
= (List
<A
>) value
;
54 return Optional
.of(res
);
55 } catch (ClassCastException e
) {
56 List
<A
> res
= new ArrayList
<>();
57 List
<?
> lst
= (List
<?
>) value
;
59 for (Object o
: lst
) {
63 return Optional
.of(res
);
64 } catch (ClassCastException e1
) {
65 return Optional
.empty();
71 return Optional
.of(Collections
.singletonList(res
));
72 } catch (ClassCastException e
) {
73 return Optional
.empty();
83 public String
getPath() {
84 List
<Content
> ancestors
= new ArrayList
<>();
85 collectAncestors(ancestors
, this);
86 StringBuilder path
= new StringBuilder();
87 for (Content c
: ancestors
) {
88 QName name
= c
.getName();
90 if (!CrName
.ROOT
.get().equals(name
))
91 path
.append('/').append(name
);
93 return path
.toString();
96 private void collectAncestors(List
<Content
> ancestors
, Content content
) {
99 ancestors
.add(0, content
);
100 collectAncestors(ancestors
, content
.getParent());
104 public int getDepth() {
105 List
<Content
> ancestors
= new ArrayList
<>();
106 collectAncestors(ancestors
, this);
107 return ancestors
.size();
111 public String
getSessionLocalId() {
118 protected boolean isDefaultAttrTypeRequested(Class
<?
> clss
) {
119 // check whether clss is Object.class
120 return clss
.isAssignableFrom(Object
.class);
124 // public String toString() {
125 // return "content " + getPath();
132 class AttrSet
extends AbstractSet
<Entry
<QName
, Object
>> {
135 public Iterator
<Entry
<QName
, Object
>> iterator() {
136 final Iterator
<QName
> keys
= keys().iterator();
137 Iterator
<Entry
<QName
, Object
>> it
= new Iterator
<Map
.Entry
<QName
, Object
>>() {
142 public boolean hasNext() {
143 return keys
.hasNext();
147 public Entry
<QName
, Object
> next() {
150 Optional
<?
> value
= get(key
, Object
.class);
151 assert !value
.isEmpty();
152 AbstractMap
.SimpleEntry
<QName
, Object
> entry
= new SimpleEntry
<>(key
, value
.get());
157 public void remove() {
159 AbstractContent
.this.removeAttr(key
);
161 throw new IllegalStateException("Iteration has not started");
173 for (Iterator
<QName
> it
= keys().iterator(); it
.hasNext();) {