Clarify ACR API
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / acr / AbstractContent.java
index 1cffef40ef5cc77f5be0783bfd5087ba48c1a565..7eb4138ab64c8183a94143e8ff0780b0765540e4 100644 (file)
@@ -13,14 +13,15 @@ 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.util.LangUtils;
+import org.argeo.cms.util.LangUtils;
 
 /** Partial reference implementation of a {@link ProvidedContent}. */
-public abstract class AbstractContent extends AbstractMap<QName, Object> implements ProvidedContent {
+public abstract class AbstractContent extends AbstractMap<QName, Object> implements CmsContent {
        private final ProvidedSession session;
 
        // cache
@@ -31,18 +32,22 @@ public abstract class AbstractContent extends AbstractMap<QName, Object> impleme
        }
 
        /*
-        * ATTRIBUTES OPERATIONS
+        * ATTRIBUTES MAP IMPLEMENTATION
         */
-//     protected abstract Iterable<QName> keys();
-//
-//     protected abstract void removeAttr(QName key);
-
        @Override
        public Set<Entry<QName, Object>> entrySet() {
                Set<Entry<QName, Object>> 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;
@@ -55,34 +60,23 @@ public abstract class AbstractContent extends AbstractMap<QName, Object> impleme
 
        @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 Optional.empty();
+                       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 (clss.isAssignableFrom(Object.class))
+                               return (List<A>) value;
+                       List<A> 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);
                }
        }
 
@@ -102,7 +96,7 @@ public abstract class AbstractContent extends AbstractMap<QName, Object> impleme
                        if (CrName.root.qName().equals(name))
                                continue ancestors;
 
-                       path.append('/');
+                       path.append(PATH_SEPARATOR);
                        path.append(NamespaceUtils.toPrefixedName(name));
                        int siblingIndex = c.getSiblingIndex();
                        if (siblingIndex != 1)
@@ -127,6 +121,11 @@ public abstract class AbstractContent extends AbstractMap<QName, Object> impleme
                return ancestors.size();
        }
 
+       @Override
+       public boolean isRoot() {
+               return CrName.root.qName().equals(getName());
+       }
+
        @Override
        public String getSessionLocalId() {
                return getPath();
@@ -153,10 +152,10 @@ public abstract class AbstractContent extends AbstractMap<QName, Object> impleme
        /*
         * UTILITIES
         */
-       protected boolean isDefaultAttrTypeRequested(Class<?> clss) {
-               // check whether clss is Object.class
-               return clss.isAssignableFrom(Object.class);
-       }
+//     protected boolean isDefaultAttrTypeRequested(Class<?> clss) {
+//             // check whether clss is Object.class
+//             return clss.isAssignableFrom(Object.class);
+//     }
 
 //     @Override
 //     public String toString() {
@@ -190,7 +189,7 @@ public abstract class AbstractContent extends AbstractMap<QName, Object> impleme
 
        @Override
        public <A> Optional<A> get(QName key, Class<A> clss) {
-               return null;
+               return Optional.empty();
        }
 
        protected void removeAttr(QName key) {