X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Facr%2FAbstractContent.java;h=1acdcc3809ba3914a4c256fb814baed41ce3d880;hb=5724ab347ddfba8f2b21cdcc2fa0b8e1e2b4e527;hp=fa8062f7c12ea4fa7c596df69ffb89541112444d;hpb=fdf44255df56ae179b904e4ab326bf595674800e;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/acr/AbstractContent.java b/org.argeo.cms/src/org/argeo/cms/acr/AbstractContent.java index fa8062f7c..1acdcc380 100644 --- a/org.argeo.cms/src/org/argeo/cms/acr/AbstractContent.java +++ b/org.argeo.cms/src/org/argeo/cms/acr/AbstractContent.java @@ -13,25 +13,41 @@ import java.util.Set; import javax.xml.namespace.QName; import org.argeo.api.acr.Content; +import org.argeo.api.acr.CrAttributeType; import org.argeo.api.acr.CrName; +import org.argeo.api.acr.NamespaceUtils; import org.argeo.api.acr.spi.ProvidedContent; +import org.argeo.api.acr.spi.ProvidedSession; +import org.argeo.cms.util.LangUtils; /** Partial reference implementation of a {@link ProvidedContent}. */ public abstract class AbstractContent extends AbstractMap implements ProvidedContent { + private final ProvidedSession session; - /* - * ATTRIBUTES OPERATIONS - */ - protected abstract Iterable keys(); + // cache +// private String _path = null; - protected abstract void removeAttr(QName key); + public AbstractContent(ProvidedSession session) { + this.session = session; + } + /* + * ATTRIBUTES MAP IMPLEMENTATION + */ @Override public Set> entrySet() { Set> result = new AttrSet(); return result; } + @Override + public Object get(Object key) { + return get((QName) key, Object.class).orElse(null); + } + + /* + * ATTRIBUTES OPERATIONS + */ @Override public Class getType(QName key) { return String.class; @@ -44,34 +60,23 @@ public abstract class AbstractContent extends AbstractMap impleme @SuppressWarnings("unchecked") @Override - public Optional> getMultiple(QName key, Class clss) { + public List getMultiple(QName key, Class clss) { Object value = get(key); if (value == null) - return null; + return new ArrayList<>(); if (value instanceof List) { - try { - List res = (List) value; - return Optional.of(res); - } catch (ClassCastException e) { - List res = new ArrayList<>(); - List lst = (List) value; - try { - for (Object o : lst) { - A item = (A) o; - res.add(item); - } - return Optional.of(res); - } catch (ClassCastException e1) { - return Optional.empty(); - } + if (clss.isAssignableFrom(Object.class)) + return (List) value; + List res = new ArrayList<>(); + List lst = (List) value; + for (Object o : lst) { + A item = CrAttributeType.cast(clss, o).get(); + res.add(item); } + return res; } else {// singleton - try { - A res = (A) value; - return Optional.of(Collections.singletonList(res)); - } catch (ClassCastException e) { - return Optional.empty(); - } + A res = CrAttributeType.cast(clss, value).get(); + return Collections.singletonList(res); } } @@ -81,15 +86,24 @@ public abstract class AbstractContent extends AbstractMap impleme @Override public String getPath() { +// if (_path != null) +// return _path; List ancestors = new ArrayList<>(); collectAncestors(ancestors, this); StringBuilder path = new StringBuilder(); - for (Content c : ancestors) { + ancestors: for (Content c : ancestors) { QName name = c.getName(); - // FIXME - if (!CrName.ROOT.get().equals(name)) - path.append('/').append(name); + if (CrName.root.qName().equals(name)) + continue ancestors; + + path.append('/'); + path.append(NamespaceUtils.toPrefixedName(name)); + int siblingIndex = c.getSiblingIndex(); + if (siblingIndex != 1) + path.append('[').append(siblingIndex).append(']'); } +// _path = path.toString(); +// return _path; return path.toString(); } @@ -106,25 +120,82 @@ public abstract class AbstractContent extends AbstractMap impleme collectAncestors(ancestors, this); return ancestors.size(); } - + + @Override + public boolean isRoot() { + return CrName.root.qName().equals(getName()); + } + @Override public String getSessionLocalId() { return getPath(); } /* - * UTILITIES + * SESSION + */ + + @Override + public ProvidedSession getSession() { + return session; + } + + /* + * TYPING */ - protected boolean isDefaultAttrTypeRequested(Class clss) { - // check whether clss is Object.class - return clss.isAssignableFrom(Object.class); + + @Override + public List getContentClasses() { + return new ArrayList<>(); } + /* + * UTILITIES + */ +// protected boolean isDefaultAttrTypeRequested(Class clss) { +// // check whether clss is Object.class +// return clss.isAssignableFrom(Object.class); +// } + // @Override // public String toString() { // return "content " + getPath(); // } + /* + * DEFAULTS + */ + // - no children + // - no attributes + // - cannot be modified + @Override + public Iterator iterator() { + return Collections.emptyIterator(); + } + + @Override + public Content add(QName name, QName... classes) { + throw new UnsupportedOperationException("Content cannot be added."); + } + + @Override + public void remove() { + throw new UnsupportedOperationException("Content cannot be removed."); + } + + protected Iterable keys() { + return Collections.emptySet(); + } + + @Override + public Optional get(QName key, Class clss) { + return Optional.empty(); + } + + protected void removeAttr(QName key) { + throw new UnsupportedOperationException("Attributes cannot be removed."); + } + /* * SUB CLASSES */ @@ -168,13 +239,16 @@ public abstract class AbstractContent extends AbstractMap impleme @Override public int size() { - - int count = 0; - for (Iterator it = keys().iterator(); it.hasNext();) { - count++; - } - return count; + return LangUtils.size(keys()); } } + + /* + * OBJECT METHODS + */ + @Override + public String toString() { + return "content " + getPath(); + } }