]>
git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms/src/org/argeo/cms/acr/CmsContentRepository.java
1 package org
.argeo
.cms
.acr
;
3 import java
.security
.AccessController
;
4 import java
.util
.Locale
;
6 import java
.util
.NavigableMap
;
8 import java
.util
.TreeMap
;
9 import java
.util
.stream
.Collectors
;
11 import javax
.security
.auth
.Subject
;
13 import org
.argeo
.api
.acr
.Content
;
14 import org
.argeo
.api
.acr
.ContentSession
;
15 import org
.argeo
.api
.acr
.CrName
;
16 import org
.argeo
.api
.acr
.spi
.ContentProvider
;
17 import org
.argeo
.api
.acr
.spi
.ProvidedRepository
;
18 import org
.argeo
.api
.acr
.spi
.ProvidedSession
;
19 import org
.argeo
.cms
.internal
.runtime
.CmsContextImpl
;
21 public class CmsContentRepository
implements ProvidedRepository
{
22 private NavigableMap
<String
, ContentProvider
> partitions
= new TreeMap
<>();
25 private NavigableMap
<String
, String
> prefixes
= new TreeMap
<>();
27 public CmsContentRepository() {
28 prefixes
.put(CrName
.CR_DEFAULT_PREFIX
, CrName
.CR_NAMESPACE_URI
);
29 prefixes
.put("basic", CrName
.CR_NAMESPACE_URI
);
30 prefixes
.put("owner", CrName
.CR_NAMESPACE_URI
);
31 prefixes
.put("posix", CrName
.CR_NAMESPACE_URI
);
47 public ContentSession
get() {
48 return get(CmsContextImpl
.getCmsContext().getDefaultLocale());
52 public ContentSession
get(Locale locale
) {
53 Subject subject
= Subject
.getSubject(AccessController
.getContext());
54 return new CmsContentSession(subject
, locale
);
57 public void addProvider(String base
, ContentProvider provider
) {
58 partitions
.put(base
, provider
);
61 public void registerPrefix(String prefix
, String namespaceURI
) {
62 String registeredUri
= prefixes
.get(prefix
);
63 if (registeredUri
== null) {
64 prefixes
.put(prefix
, namespaceURI
);
67 if (!registeredUri
.equals(namespaceURI
))
68 throw new IllegalStateException("Prefix " + prefix
+ " is already registred for " + registeredUri
);
69 // do nothing if same namespace is already registered
80 class CmsContentSession
implements ProvidedSession
{
81 private Subject subject
;
82 private Locale locale
;
84 public CmsContentSession(Subject subject
, Locale locale
) {
85 this.subject
= subject
;
90 public Content
get(String path
) {
91 Map
.Entry
<String
, ContentProvider
> entry
= partitions
.floorEntry(path
);
92 String mountPath
= entry
.getKey();
93 ContentProvider provider
= entry
.getValue();
94 String relativePath
= path
.substring(mountPath
.length());
95 return provider
.get(CmsContentSession
.this, mountPath
, relativePath
);
99 public Subject
getSubject() {
104 public Locale
getLocale() {
109 public ProvidedRepository
getRepository() {
110 return CmsContentRepository
.this;
118 public String
findNamespace(String prefix
) {
119 return prefixes
.get(prefix
);
123 public Set
<String
> findPrefixes(String namespaceURI
) {
124 Set
<String
> res
= prefixes
.entrySet().stream().filter(e
-> e
.getValue().equals(namespaceURI
))
125 .map(Map
.Entry
::getKey
).collect(Collectors
.toUnmodifiableSet());
131 public String
findPrefix(String namespaceURI
) {
132 if (CrName
.CR_NAMESPACE_URI
.equals(namespaceURI
) && prefixes
.containsKey(CrName
.CR_DEFAULT_PREFIX
))
133 return CrName
.CR_DEFAULT_PREFIX
;
134 return ProvidedSession
.super.findPrefix(namespaceURI
);