package org.argeo.cms.acr;
-import java.util.Iterator;
+import java.util.HashSet;
import java.util.Locale;
-import java.util.Map;
import java.util.Set;
-import java.util.TreeSet;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;
import java.util.function.Consumer;
-import java.util.stream.Collectors;
import javax.security.auth.Subject;
import org.argeo.api.acr.Content;
import org.argeo.api.acr.ContentSession;
-import org.argeo.api.acr.CrName;
-import org.argeo.api.acr.NamespaceUtils;
-import org.argeo.api.acr.RuntimeNamespaceContext;
+import org.argeo.api.acr.DName;
import org.argeo.api.acr.spi.ContentProvider;
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;
/** Implements {@link ProvidedSession}. */
private Subject subject;
private Locale locale;
+ private UuidFactory uuidFactory;
+
private CompletableFuture<ProvidedSession> closed = new CompletableFuture<>();
private CompletableFuture<ContentSession> edition;
- private Set<ContentProvider> modifiedProviders = new TreeSet<>();
+ private Set<ContentProvider> modifiedProviders = new HashSet<>();
private Content sessionRunDir;
- public CmsContentSession(AbstractContentRepository contentRepository, UUID uuid, Subject subject, Locale locale) {
+ public CmsContentSession(AbstractContentRepository contentRepository, UUID uuid, Subject subject, Locale locale,
+ UuidFactory uuidFactory) {
this.contentRepository = contentRepository;
this.subject = subject;
this.locale = locale;
this.uuid = uuid;
-
+ this.uuidFactory = uuidFactory;
}
public void close() {
@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);
@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);
return contentRepository;
}
+ public UuidFactory getUuidFactory() {
+ return uuidFactory;
+ }
+
/*
* MOUNT MANAGEMENT
*/
}
/*
- * NAMESPACE CONTEXT
+ * EDITION
*/
-
-// @Override
-// public String getNamespaceURI(String prefix) {
-// return RuntimeNamespaceContext.getNamespaceContext().getNamespaceURI(prefix);
-//// return NamespaceUtils.getNamespaceURI((p) -> contentRepository.getTypesManager().getPrefixes().get(p), prefix);
-// }
-//
-// @Override
-// public Iterator<String> getPrefixes(String namespaceURI) {
-// return RuntimeNamespaceContext.getNamespaceContext().getPrefixes(namespaceURI);
-//// return NamespaceUtils.getPrefixes((ns) -> contentRepository.getTypesManager().getPrefixes().entrySet().stream()
-//// .filter(e -> e.getValue().equals(ns)).map(Map.Entry::getKey).collect(Collectors.toUnmodifiableSet()),
-//// namespaceURI);
-// }
-
@Override
public CompletionStage<ContentSession> edit(Consumer<ContentSession> work) {
edition = CompletableFuture.supplyAsync(() -> {
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();
}
}
@Override
- public void notifyModification(ProvidedContent content) {
+ public synchronized void notifyModification(ProvidedContent content) {
ContentProvider contentProvider = content.getProvider();
modifiedProviders.add(contentProvider);
}
return uuid;
}
- @Override
+// @Override
public Content getSessionRunDir() {
if (sessionRunDir == null) {
String runDirPath = CmsContentRepository.RUN_BASE + '/' + uuid.toString();
else {
Content runDir = get(CmsContentRepository.RUN_BASE);
// TODO deal with no run dir available?
- sessionRunDir = runDir.add(uuid.toString(), CrName.collection.qName());
+ sessionRunDir = runDir.add(uuid.toString(), DName.collection.qName());
}
}
return sessionRunDir;
}
-
-// @Override
-// public String findNamespace(String prefix) {
-// return prefixes.get(prefix);
-// }
-//
-// @Override
-// public Set<String> findPrefixes(String namespaceURI) {
-// Set<String> res = prefixes.entrySet().stream().filter(e -> e.getValue().equals(namespaceURI))
-// .map(Map.Entry::getKey).collect(Collectors.toUnmodifiableSet());
-//
-// return res;
-// }
-//
-// @Override
-// public String findPrefix(String namespaceURI) {
-// if (CrName.CR_NAMESPACE_URI.equals(namespaceURI) && prefixes.containsKey(CrName.CR_DEFAULT_PREFIX))
-// return CrName.CR_DEFAULT_PREFIX;
-// return ProvidedSession.super.findPrefix(namespaceURI);
-// }
-
}
\ No newline at end of file