First WebDav PROPFIND implementation server-side
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / acr / CmsContentSession.java
index f811642c7f7f4971b379ac2aca0c709c104b61cb..ba7dfa32d59f7244bef7e417f39c66105c216545 100644 (file)
@@ -1,8 +1,8 @@
 package org.argeo.cms.acr;
 
+import java.util.HashSet;
 import java.util.Locale;
 import java.util.Set;
-import java.util.TreeSet;
 import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CompletionStage;
@@ -34,7 +34,7 @@ class CmsContentSession implements ProvidedSession {
 
        private CompletableFuture<ContentSession> edition;
 
-       private Set<ContentProvider> modifiedProviders = new TreeSet<>();
+       private Set<ContentProvider> modifiedProviders = new HashSet<>();
 
        private Content sessionRunDir;
 
@@ -61,6 +61,8 @@ class CmsContentSession implements ProvidedSession {
 
        @Override
        public Content get(String path) {
+               if (!path.startsWith(ContentUtils.ROOT_SLASH))
+                       throw new IllegalArgumentException(path + " is not an absolute path");
                ContentProvider contentProvider = contentRepository.getMountManager().findContentProvider(path);
                String mountPath = contentProvider.getMountPath();
                String relativePath = extractRelativePath(mountPath, path);
@@ -70,6 +72,8 @@ class CmsContentSession implements ProvidedSession {
 
        @Override
        public boolean exists(String path) {
+               if (!path.startsWith(ContentUtils.ROOT_SLASH))
+                       throw new IllegalArgumentException(path + " is not an absolute path");
                ContentProvider contentProvider = contentRepository.getMountManager().findContentProvider(path);
                String mountPath = contentProvider.getMountPath();
                String relativePath = extractRelativePath(mountPath, path);
@@ -137,13 +141,16 @@ class CmsContentSession implements ProvidedSession {
                        work.accept(this);
                        return this;
                }).thenApply((s) -> {
-                       // TODO optimise
-                       for (ContentProvider provider : modifiedProviders) {
-                               if (provider instanceof DomContentProvider) {
-                                       ((DomContentProvider) provider).persist(s);
+                       synchronized (CmsContentSession.this) {
+                               // TODO optimise
+                               for (ContentProvider provider : modifiedProviders) {
+                                       if (provider instanceof DomContentProvider) {
+                                               ((DomContentProvider) provider).persist(s);
+                                       }
                                }
+                               modifiedProviders.clear();
+                               return s;
                        }
-                       return s;
                });
                return edition.minimalCompletionStage();
        }
@@ -154,7 +161,7 @@ class CmsContentSession implements ProvidedSession {
        }
 
        @Override
-       public void notifyModification(ProvidedContent content) {
+       public synchronized void notifyModification(ProvidedContent content) {
                ContentProvider contentProvider = content.getProvider();
                modifiedProviders.add(contentProvider);
        }