Massive package refactoring
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / acr / AbstractContent.java
index fa8062f7c12ea4fa7c596df69ffb89541112444d..16f39609e8aafb1c9185dec0a274ef74431cdedf 100644 (file)
@@ -14,17 +14,28 @@ import javax.xml.namespace.QName;
 
 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.cms.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() {
@@ -44,34 +55,27 @@ 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 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();
+//                     }
                }
        }
 
@@ -81,15 +85,24 @@ public abstract class AbstractContent extends AbstractMap<QName, Object> impleme
 
        @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();
        }
 
@@ -106,12 +119,30 @@ public abstract class AbstractContent extends AbstractMap<QName, Object> impleme
                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
         */
@@ -125,6 +156,40 @@ public abstract class AbstractContent extends AbstractMap<QName, Object> impleme
 //             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
         */
@@ -168,13 +233,16 @@ public abstract class AbstractContent extends AbstractMap<QName, Object> impleme
 
                @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();
+       }
 }