X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Fgcr%2FCmsContentRepository.java;h=69f2e94d4f60dca6565993c19254748747156a3e;hb=e5a22cdc7d0f4918f2740c626e1ab6384bd5ee44;hp=0baae356ca2319dcdda0e8a958c0e732476c2628;hpb=51efb630db7314b67654a03d1bd983b45aa2f1ed;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/gcr/CmsContentRepository.java b/org.argeo.cms/src/org/argeo/cms/gcr/CmsContentRepository.java index 0baae356c..69f2e94d4 100644 --- a/org.argeo.cms/src/org/argeo/cms/gcr/CmsContentRepository.java +++ b/org.argeo.cms/src/org/argeo/cms/gcr/CmsContentRepository.java @@ -4,19 +4,45 @@ import java.security.AccessController; import java.util.Locale; import java.util.Map; import java.util.NavigableMap; +import java.util.Set; import java.util.TreeMap; +import java.util.stream.Collectors; import javax.security.auth.Subject; import org.argeo.api.gcr.Content; -import org.argeo.api.gcr.ContentRepository; import org.argeo.api.gcr.ContentSession; +import org.argeo.api.gcr.CrName; import org.argeo.api.gcr.spi.ContentProvider; +import org.argeo.api.gcr.spi.ProvidedRepository; +import org.argeo.api.gcr.spi.ProvidedSession; import org.argeo.cms.internal.runtime.CmsContextImpl; -public class CmsContentRepository implements ContentRepository { +public class CmsContentRepository implements ProvidedRepository { private NavigableMap partitions = new TreeMap<>(); + // TODO synchronize ? + private NavigableMap prefixes = new TreeMap<>(); + + public CmsContentRepository() { + prefixes.put(CrName.CR_DEFAULT_PREFIX, CrName.CR_NAMESPACE_URI); + prefixes.put("basic", CrName.CR_NAMESPACE_URI); + prefixes.put("owner", CrName.CR_NAMESPACE_URI); + prefixes.put("posix", CrName.CR_NAMESPACE_URI); + } + + public void start() { + + } + + public void stop() { + + } + + /* + * REPOSITORY + */ + @Override public ContentSession get() { return get(CmsContextImpl.getCmsContext().getDefaultLocale()); @@ -32,7 +58,26 @@ public class CmsContentRepository implements ContentRepository { partitions.put(base, provider); } - class CmsContentSession implements ContentSession { + public void registerPrefix(String prefix, String namespaceURI) { + String registeredUri = prefixes.get(prefix); + if (registeredUri == null) { + prefixes.put(prefix, namespaceURI); + return; + } + if (!registeredUri.equals(namespaceURI)) + throw new IllegalStateException("Prefix " + prefix + " is already registred for " + registeredUri); + // do nothing if same namespace is already registered + } + + /* + * NAMESPACE CONTEXT + */ + + /* + * SESSION + */ + + class CmsContentSession implements ProvidedSession { private Subject subject; private Locale locale; @@ -43,9 +88,11 @@ public class CmsContentRepository implements ContentRepository { @Override public Content get(String path) { - Map.Entry provider = partitions.floorEntry(path); - String relativePath = path.substring(provider.getKey().length()); - return provider.getValue().get(relativePath); + Map.Entry entry = partitions.floorEntry(path); + String mountPath = entry.getKey(); + ContentProvider provider = entry.getValue(); + String relativePath = path.substring(mountPath.length()); + return provider.get(CmsContentSession.this, mountPath, relativePath); } @Override @@ -58,6 +105,35 @@ public class CmsContentRepository implements ContentRepository { return locale; } + @Override + public ProvidedRepository getRepository() { + return CmsContentRepository.this; + } + + /* + * NAMESPACE CONTEXT + */ + + @Override + public String findNamespace(String prefix) { + return prefixes.get(prefix); + } + + @Override + public Set findPrefixes(String namespaceURI) { + Set 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); + } + } }