X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Facr%2FCmsContentSession.java;h=f811642c7f7f4971b379ac2aca0c709c104b61cb;hb=5dd5ad8acfa6f78f98b8d8f082f0c1647d02ff2a;hp=5e5fb272c24aed96d9ca8d3126f56a3a0964ef15;hpb=eb4cc3db3bf141c229f0f7ff929daff108bee6d2;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/acr/CmsContentSession.java b/org.argeo.cms/src/org/argeo/cms/acr/CmsContentSession.java index 5e5fb272c..f811642c7 100644 --- a/org.argeo.cms/src/org/argeo/cms/acr/CmsContentSession.java +++ b/org.argeo.cms/src/org/argeo/cms/acr/CmsContentSession.java @@ -1,47 +1,57 @@ package org.argeo.cms.acr; -import java.util.Iterator; 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.NamespaceUtils; +import org.argeo.api.acr.CrName; 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}. */ class CmsContentSession implements ProvidedSession { final private AbstractContentRepository contentRepository; + private final UUID uuid; private Subject subject; private Locale locale; + private UuidFactory uuidFactory; + private CompletableFuture closed = new CompletableFuture<>(); private CompletableFuture edition; private Set modifiedProviders = new TreeSet<>(); - public CmsContentSession(AbstractContentRepository contentRepository, Subject subject, Locale locale) { + private Content sessionRunDir; + + 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() { closed.complete(this); + + if (sessionRunDir != null) + sessionRunDir.remove(); } @Override @@ -53,11 +63,24 @@ class CmsContentSession implements ProvidedSession { public Content get(String path) { ContentProvider contentProvider = contentRepository.getMountManager().findContentProvider(path); String mountPath = contentProvider.getMountPath(); + String relativePath = extractRelativePath(mountPath, path); + ProvidedContent content = contentProvider.get(CmsContentSession.this, relativePath); + return content; + } + + @Override + public boolean exists(String path) { + ContentProvider contentProvider = contentRepository.getMountManager().findContentProvider(path); + String mountPath = contentProvider.getMountPath(); + String relativePath = extractRelativePath(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); - ProvidedContent content = contentProvider.get(CmsContentSession.this, mountPath, relativePath); - return content; + return relativePath; } @Override @@ -75,6 +98,10 @@ class CmsContentSession implements ProvidedSession { return contentRepository; } + public UuidFactory getUuidFactory() { + return uuidFactory; + } + /* * MOUNT MANAGEMENT */ @@ -90,17 +117,19 @@ class CmsContentSession implements ProvidedSession { * NAMESPACE CONTEXT */ - @Override - public String getNamespaceURI(String prefix) { - return NamespaceUtils.getNamespaceURI((p) -> contentRepository.getTypesManager().getPrefixes().get(p), prefix); - } - - @Override - public Iterator getPrefixes(String 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 String getNamespaceURI(String prefix) { +// return RuntimeNamespaceContext.getNamespaceContext().getNamespaceURI(prefix); +//// return NamespaceUtils.getNamespaceURI((p) -> contentRepository.getTypesManager().getPrefixes().get(p), prefix); +// } +// +// @Override +// public Iterator 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 edit(Consumer work) { @@ -130,6 +159,26 @@ class CmsContentSession implements ProvidedSession { modifiedProviders.add(contentProvider); } + @Override + public UUID getUuid() { + return uuid; + } + + @Override + public Content getSessionRunDir() { + if (sessionRunDir == null) { + String runDirPath = CmsContentRepository.RUN_BASE + '/' + uuid.toString(); + if (exists(runDirPath)) + sessionRunDir = get(runDirPath); + else { + Content runDir = get(CmsContentRepository.RUN_BASE); + // TODO deal with no run dir available? + sessionRunDir = runDir.add(uuid.toString(), CrName.collection.qName()); + } + } + return sessionRunDir; + } + // @Override // public String findNamespace(String prefix) { // return prefixes.get(prefix);