]>
git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms/src/org/argeo/cms/acr/AbstractContent.java
c6e07e638b9b24b7bd0ebee667446b5de25b05ed
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
.NamespaceUtils
;
18 import org
.argeo
.api
.acr
.spi
.ProvidedContent
;
19 import org
.argeo
.api
.acr
.spi
.ProvidedSession
;
20 import org
.argeo
.cms
.util
.LangUtils
;
22 /** Partial reference implementation of a {@link ProvidedContent}. */
23 public abstract class AbstractContent
extends AbstractMap
<QName
, Object
> implements ProvidedContent
{
24 private final ProvidedSession session
;
27 // private String _path = null;
29 public AbstractContent(ProvidedSession session
) {
30 this.session
= session
;
34 * ATTRIBUTES OPERATIONS
36 // protected abstract Iterable<QName> keys();
38 // protected abstract void removeAttr(QName key);
41 public Set
<Entry
<QName
, Object
>> entrySet() {
42 Set
<Entry
<QName
, Object
>> result
= new AttrSet();
47 public Class
<?
> getType(QName key
) {
52 public boolean isMultiple(QName key
) {
56 @SuppressWarnings("unchecked")
58 public <A
> List
<A
> getMultiple(QName key
, Class
<A
> clss
) {
59 Object value
= get(key
);
61 return new ArrayList
<>();
62 if (value
instanceof List
) {
63 if (isDefaultAttrTypeRequested(clss
))
64 return (List
<A
>) value
;
65 List
<A
> res
= new ArrayList
<>();
66 List
<?
> lst
= (List
<?
>) value
;
67 for (Object o
: lst
) {
68 A item
= clss
.isAssignableFrom(String
.class) ?
(A
) o
.toString() : (A
) o
;
75 return Collections
.singletonList(res
);
76 // } catch (ClassCastException e) {
77 // return Optional.empty();
87 public String
getPath() {
90 List
<Content
> ancestors
= new ArrayList
<>();
91 collectAncestors(ancestors
, this);
92 StringBuilder path
= new StringBuilder();
93 ancestors
: for (Content c
: ancestors
) {
94 QName name
= c
.getName();
95 if (CrName
.root
.qName().equals(name
))
99 path
.append(NamespaceUtils
.toPrefixedName(name
));
100 int siblingIndex
= c
.getSiblingIndex();
101 if (siblingIndex
!= 1)
102 path
.append('[').append(siblingIndex
).append(']');
104 // _path = path.toString();
106 return path
.toString();
109 private void collectAncestors(List
<Content
> ancestors
, Content content
) {
112 ancestors
.add(0, content
);
113 collectAncestors(ancestors
, content
.getParent());
117 public int getDepth() {
118 List
<Content
> ancestors
= new ArrayList
<>();
119 collectAncestors(ancestors
, this);
120 return ancestors
.size();
124 public boolean isRoot() {
125 return CrName
.root
.qName().equals(getName());
129 public String
getSessionLocalId() {
138 public ProvidedSession
getSession() {
147 public List
<QName
> getContentClasses() {
148 return new ArrayList
<>();
154 protected boolean isDefaultAttrTypeRequested(Class
<?
> clss
) {
155 // check whether clss is Object.class
156 return clss
.isAssignableFrom(Object
.class);
160 // public String toString() {
161 // return "content " + getPath();
169 // - cannot be modified
171 public Iterator
<Content
> iterator() {
172 return Collections
.emptyIterator();
176 public Content
add(QName name
, QName
... classes
) {
177 throw new UnsupportedOperationException("Content cannot be added.");
181 public void remove() {
182 throw new UnsupportedOperationException("Content cannot be removed.");
185 protected Iterable
<QName
> keys() {
186 return Collections
.emptySet();
190 public <A
> Optional
<A
> get(QName key
, Class
<A
> clss
) {
194 protected void removeAttr(QName key
) {
195 throw new UnsupportedOperationException("Attributes cannot be removed.");
202 class AttrSet
extends AbstractSet
<Entry
<QName
, Object
>> {
205 public Iterator
<Entry
<QName
, Object
>> iterator() {
206 final Iterator
<QName
> keys
= keys().iterator();
207 Iterator
<Entry
<QName
, Object
>> it
= new Iterator
<Map
.Entry
<QName
, Object
>>() {
212 public boolean hasNext() {
213 return keys
.hasNext();
217 public Entry
<QName
, Object
> next() {
220 Optional
<?
> value
= get(key
, Object
.class);
221 assert !value
.isEmpty();
222 AbstractMap
.SimpleEntry
<QName
, Object
> entry
= new SimpleEntry
<>(key
, value
.get());
227 public void remove() {
229 AbstractContent
.this.removeAttr(key
);
231 throw new IllegalStateException("Iteration has not started");
241 return LangUtils
.size(keys());
250 public String
toString() {
251 return "content " + getPath();