import org.argeo.api.acr.Content;
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.util.LangUtils;
/** Partial reference implementation of a {@link ProvidedContent}. */
public abstract class AbstractContent extends AbstractMap<QName, Object> implements ProvidedContent {
+ private final ProvidedSession session;
+
+ // cache
+// private String _path = null;
+
+ public AbstractContent(ProvidedSession session) {
+ this.session = session;
+ }
/*
* ATTRIBUTES OPERATIONS
*/
- protected abstract Iterable<QName> keys();
-
- protected abstract void removeAttr(QName key);
+// protected abstract Iterable<QName> keys();
+//
+// protected abstract void removeAttr(QName key);
@Override
public Set<Entry<QName, Object>> entrySet() {
@SuppressWarnings("unchecked")
@Override
- public <A> Optional<List<A>> getMultiple(QName key, Class<A> clss) {
+ public <A> List<A> getMultiple(QName key, Class<A> clss) {
Object value = get(key);
if (value == null)
- return null;
+ return new ArrayList<>();
if (value instanceof List) {
- try {
- List<A> res = (List<A>) value;
- return Optional.of(res);
- } catch (ClassCastException e) {
- List<A> 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 (isDefaultAttrTypeRequested(clss))
+ return (List<A>) value;
+ List<A> res = new ArrayList<>();
+ List<?> lst = (List<?>) value;
+ for (Object o : lst) {
+ A item = clss.isAssignableFrom(String.class) ? (A) o.toString() : (A) o;
+ res.add(item);
}
+ return res;
} else {// singleton
- try {
- A res = (A) value;
- return Optional.of(Collections.singletonList(res));
- } catch (ClassCastException e) {
- return Optional.empty();
- }
+// try {
+ A res = (A) value;
+ return Collections.singletonList(res);
+// } catch (ClassCastException e) {
+// return Optional.empty();
+// }
}
}
@Override
public String getPath() {
+// if (_path != null)
+// return _path;
List<Content> 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();
}
collectAncestors(ancestors, content.getParent());
}
+ @Override
+ public int getDepth() {
+ List<Content> ancestors = new ArrayList<>();
+ collectAncestors(ancestors, this);
+ return ancestors.size();
+ }
+
+ @Override
+ public String getSessionLocalId() {
+ return getPath();
+ }
+
+ /*
+ * SESSION
+ */
+
+ @Override
+ public ProvidedSession getSession() {
+ return session;
+ }
+
+ /*
+ * TYPING
+ */
+
+ @Override
+ public List<QName> getContentClasses() {
+ return new ArrayList<>();
+ }
+
/*
* UTILITIES
*/
// return "content " + getPath();
// }
+ /*
+ * DEFAULTS
+ */
+ // - no children
+ // - no attributes
+ // - cannot be modified
+ @Override
+ public Iterator<Content> 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<QName> keys() {
+ return Collections.emptySet();
+ }
+
+ @Override
+ public <A> Optional<A> get(QName key, Class<A> clss) {
+ return null;
+ }
+
+ protected void removeAttr(QName key) {
+ throw new UnsupportedOperationException("Attributes cannot be removed.");
+ }
+
/*
* SUB CLASSES
*/
@Override
public int size() {
-
- int count = 0;
- for (Iterator<QName> it = keys().iterator(); it.hasNext();) {
- count++;
- }
- return count;
+ return LangUtils.size(keys());
}
}
+
+ /*
+ * OBJECT METHODS
+ */
+ @Override
+ public String toString() {
+ return "content " + getPath();
+ }
}