Clarify ACR API
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / acr / CmsContentSession.java
index af7dca046ab636b014c7c601f0908ff3060661a6..04a6fea6cdf15ad231127f66b79c7153981289d1 100644 (file)
@@ -26,10 +26,11 @@ import org.argeo.api.acr.spi.ProvidedContent;
 import org.argeo.api.acr.spi.ProvidedRepository;
 import org.argeo.api.acr.spi.ProvidedSession;
 import org.argeo.api.uuid.UuidFactory;
-import org.argeo.cms.acr.xml.DomContentProvider;
+import org.argeo.api.uuid.UuidIdentified;
+import org.argeo.cms.CurrentUser;
 
 /** Implements {@link ProvidedSession}. */
-class CmsContentSession implements ProvidedSession {
+class CmsContentSession implements ProvidedSession, UuidIdentified {
        final private AbstractContentRepository contentRepository;
 
        private final UUID uuid;
@@ -69,32 +70,25 @@ class CmsContentSession implements ProvidedSession {
 
        @Override
        public Content get(String path) {
-               if (!path.startsWith(ContentUtils.ROOT_SLASH))
+               if (!path.startsWith(Content.ROOT_PATH))
                        throw new IllegalArgumentException(path + " is not an absolute path");
                ContentProvider contentProvider = contentRepository.getMountManager().findContentProvider(path);
                String mountPath = contentProvider.getMountPath();
-               String relativePath = extractRelativePath(mountPath, path);
+               String relativePath = CmsContent.relativize(mountPath, path);
                ProvidedContent content = contentProvider.get(CmsContentSession.this, relativePath);
                return content;
        }
 
        @Override
        public boolean exists(String path) {
-               if (!path.startsWith(ContentUtils.ROOT_SLASH))
+               if (!path.startsWith(Content.ROOT_PATH))
                        throw new IllegalArgumentException(path + " is not an absolute path");
                ContentProvider contentProvider = contentRepository.getMountManager().findContentProvider(path);
                String mountPath = contentProvider.getMountPath();
-               String relativePath = extractRelativePath(mountPath, path);
+               String relativePath = CmsContent.relativize(mountPath, path);
                return contentProvider.exists(this, relativePath);
        }
 
-       private String extractRelativePath(String mountPath, String path) {
-               String relativePath = path.substring(mountPath.length());
-               if (relativePath.length() > 0 && relativePath.charAt(0) == '/')
-                       relativePath = relativePath.substring(1);
-               return relativePath;
-       }
-
        @Override
        public Subject getSubject() {
                return subject;
@@ -119,7 +113,7 @@ class CmsContentSession implements ProvidedSession {
         */
        @Override
        public Content getMountPoint(String path) {
-               String[] parent = ContentUtils.getParentPath(path);
+               String[] parent = CmsContent.getParentPath(path);
                ProvidedContent mountParent = (ProvidedContent) get(parent[0]);
 //                     Content mountPoint = mountParent.getProvider().get(CmsContentSession.this, null, path);
                return mountParent.getMountPoint(parent[1]);
@@ -137,9 +131,10 @@ class CmsContentSession implements ProvidedSession {
                        synchronized (CmsContentSession.this) {
                                // TODO optimise
                                for (ContentProvider provider : modifiedProviders) {
-                                       if (provider instanceof DomContentProvider) {
-                                               ((DomContentProvider) provider).persist(s);
-                                       }
+                                       provider.persist(s);
+//                                     if (provider instanceof DomContentProvider) {
+//                                             ((DomContentProvider) provider).persist(s);
+//                                     }
                                }
                                modifiedProviders.clear();
                                return s;
@@ -160,7 +155,7 @@ class CmsContentSession implements ProvidedSession {
        }
 
        @Override
-       public UUID getUuid() {
+       public UUID uuid() {
                return uuid;
        }
 
@@ -179,6 +174,25 @@ class CmsContentSession implements ProvidedSession {
                return sessionRunDir;
        }
 
+       /*
+        * OBJECT METHODS
+        */
+
+       @Override
+       public boolean equals(Object o) {
+               return UuidIdentified.equals(this, o);
+       }
+
+       @Override
+       public int hashCode() {
+               return UuidIdentified.hashCode(this);
+       }
+
+       @Override
+       public String toString() {
+               return "Content Session " + uuid + " (" + CurrentUser.getUsername(subject) + ")";
+       }
+
        /*
         * SEARCH
         */
@@ -192,10 +206,12 @@ class CmsContentSession implements ProvidedSession {
                        NavigableMap<String, ContentProvider> contentProviders = contentRepository.getMountManager()
                                        .findContentProviders(scopePath);
                        for (Map.Entry<String, ContentProvider> contentProvider : contentProviders.entrySet()) {
+                               assert scopePath.startsWith(contentProvider.getKey())
+                                               : "scopePath=" + scopePath + ", contentProvider path=" + contentProvider.getKey();
                                // TODO deal with depth
                                String relPath;
-                               if (scopePath.startsWith(contentProvider.getKey())) {
-                                       relPath = scopePath.substring(contentProvider.getKey().length());
+                               if (!scopePath.equals(contentProvider.getKey())) {
+                                       relPath = scopePath.substring(contentProvider.getKey().length() + 1, scopePath.length());
                                } else {
                                        relPath = null;
                                }
@@ -203,6 +219,8 @@ class CmsContentSession implements ProvidedSession {
                                searchPartitions.put(contentProvider.getKey(), searchPartition);
                        }
                }
+               if (searchPartitions.isEmpty())
+                       return Stream.empty();
                return StreamSupport.stream(new SearchPartitionsSpliterator(searchPartitions), true);
        }