]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms/src/org/argeo/cms/acr/CmsContentRepository.java
Systemd deployment
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / acr / CmsContentRepository.java
1 package org.argeo.cms.acr;
2
3 import java.security.AccessController;
4 import java.util.Locale;
5 import java.util.Map;
6 import java.util.NavigableMap;
7 import java.util.Set;
8 import java.util.TreeMap;
9 import java.util.stream.Collectors;
10
11 import javax.security.auth.Subject;
12
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;
20
21 public class CmsContentRepository implements ProvidedRepository {
22 private NavigableMap<String, ContentProvider> partitions = new TreeMap<>();
23
24 // TODO synchronize ?
25 private NavigableMap<String, String> prefixes = new TreeMap<>();
26
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);
32 }
33
34 public void start() {
35
36 }
37
38 public void stop() {
39
40 }
41
42 /*
43 * REPOSITORY
44 */
45
46 @Override
47 public ContentSession get() {
48 return get(CmsContextImpl.getCmsContext().getDefaultLocale());
49 }
50
51 @Override
52 public ContentSession get(Locale locale) {
53 Subject subject = Subject.getSubject(AccessController.getContext());
54 return new CmsContentSession(subject, locale);
55 }
56
57 public void addProvider(String base, ContentProvider provider) {
58 partitions.put(base, provider);
59 }
60
61 public void registerPrefix(String prefix, String namespaceURI) {
62 String registeredUri = prefixes.get(prefix);
63 if (registeredUri == null) {
64 prefixes.put(prefix, namespaceURI);
65 return;
66 }
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
70 }
71
72 /*
73 * NAMESPACE CONTEXT
74 */
75
76 /*
77 * SESSION
78 */
79
80 class CmsContentSession implements ProvidedSession {
81 private Subject subject;
82 private Locale locale;
83
84 public CmsContentSession(Subject subject, Locale locale) {
85 this.subject = subject;
86 this.locale = locale;
87 }
88
89 @Override
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);
96 }
97
98 @Override
99 public Subject getSubject() {
100 return subject;
101 }
102
103 @Override
104 public Locale getLocale() {
105 return locale;
106 }
107
108 @Override
109 public ProvidedRepository getRepository() {
110 return CmsContentRepository.this;
111 }
112
113 /*
114 * NAMESPACE CONTEXT
115 */
116
117 @Override
118 public String findNamespace(String prefix) {
119 return prefixes.get(prefix);
120 }
121
122 @Override
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());
126
127 return res;
128 }
129
130 @Override
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);
135 }
136
137 }
138
139 }