X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Facr%2FCmsContentSession.java;h=34d683605ac4e81240be687a04e4371f7e325d79;hb=e023e9027edc0d734d11cb759259eaebb6d68bc9;hp=0255856344e34109d05c301465be74d1415c32d7;hpb=da9d144b6b241e1526a3bd255dff905a7969a5bc;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 025585634..34d683605 100644 --- a/org.argeo.cms/src/org/argeo/cms/acr/CmsContentSession.java +++ b/org.argeo.cms/src/org/argeo/cms/acr/CmsContentSession.java @@ -1,26 +1,24 @@ 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.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}. */ @@ -31,20 +29,23 @@ class CmsContentSession implements ProvidedSession { private Subject subject; private Locale locale; + private UuidFactory uuidFactory; + private CompletableFuture closed = new CompletableFuture<>(); private CompletableFuture edition; - private Set modifiedProviders = new TreeSet<>(); + private Set 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() { @@ -61,6 +62,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 +73,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); @@ -98,6 +103,10 @@ class CmsContentSession implements ProvidedSession { return contentRepository; } + public UuidFactory getUuidFactory() { + return uuidFactory; + } + /* * MOUNT MANAGEMENT */ @@ -113,17 +122,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) { @@ -131,13 +142,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(); } @@ -148,7 +162,7 @@ class CmsContentSession implements ProvidedSession { } @Override - public void notifyModification(ProvidedContent content) { + public synchronized void notifyModification(ProvidedContent content) { ContentProvider contentProvider = content.getProvider(); modifiedProviders.add(contentProvider); } @@ -167,7 +181,7 @@ class CmsContentSession implements ProvidedSession { else { Content runDir = get(CmsContentRepository.RUN_BASE); // TODO deal with no run dir available? - sessionRunDir = runDir.add(uuid.toString(), CrName.COLLECTION.get()); + sessionRunDir = runDir.add(uuid.toString(),DName.collection.qName()); } } return sessionRunDir;