1 package org
.argeo
.cms
.acr
;
3 import java
.util
.Iterator
;
4 import java
.util
.Locale
;
7 import java
.util
.TreeSet
;
8 import java
.util
.concurrent
.CompletableFuture
;
9 import java
.util
.concurrent
.CompletionStage
;
10 import java
.util
.function
.Consumer
;
11 import java
.util
.stream
.Collectors
;
13 import javax
.security
.auth
.Subject
;
15 import org
.argeo
.api
.acr
.Content
;
16 import org
.argeo
.api
.acr
.ContentSession
;
17 import org
.argeo
.api
.acr
.NamespaceUtils
;
18 import org
.argeo
.api
.acr
.spi
.ContentProvider
;
19 import org
.argeo
.api
.acr
.spi
.ProvidedContent
;
20 import org
.argeo
.api
.acr
.spi
.ProvidedRepository
;
21 import org
.argeo
.api
.acr
.spi
.ProvidedSession
;
22 import org
.argeo
.cms
.acr
.xml
.DomContentProvider
;
24 /** Implements {@link ProvidedSession}. */
25 class CmsContentSession
implements ProvidedSession
{
26 final private CmsContentRepository contentRepository
;
28 private Subject subject
;
29 private Locale locale
;
31 private CompletableFuture
<ProvidedSession
> closed
= new CompletableFuture
<>();
33 private CompletableFuture
<ContentSession
> edition
;
35 private Set
<ContentProvider
> modifiedProviders
= new TreeSet
<>();
37 public CmsContentSession(CmsContentRepository contentRepository
, Subject subject
, Locale locale
) {
38 this.contentRepository
= contentRepository
;
39 this.subject
= subject
;
44 closed
.complete(this);
48 public CompletionStage
<ProvidedSession
> onClose() {
49 return closed
.minimalCompletionStage();
53 public Content
get(String path
) {
54 ContentProvider contentProvider
= contentRepository
.getMountManager().findContentProvider(path
);
55 String mountPath
= contentProvider
.getMountPath();
56 String relativePath
= path
.substring(mountPath
.length());
57 if (relativePath
.length() > 0 && relativePath
.charAt(0) == '/')
58 relativePath
= relativePath
.substring(1);
59 ProvidedContent content
= contentProvider
.get(CmsContentSession
.this, mountPath
, relativePath
);
64 public Subject
getSubject() {
69 public Locale
getLocale() {
74 public ProvidedRepository
getRepository() {
75 return contentRepository
;
82 public Content
getMountPoint(String path
) {
83 String
[] parent
= ContentUtils
.getParentPath(path
);
84 ProvidedContent mountParent
= (ProvidedContent
) get(parent
[0]);
85 // Content mountPoint = mountParent.getProvider().get(CmsContentSession.this, null, path);
86 return mountParent
.getMountPoint(parent
[1]);
94 public String
getNamespaceURI(String prefix
) {
95 return NamespaceUtils
.getNamespaceURI((p
) -> contentRepository
.getTypesManager().getPrefixes().get(p
), prefix
);
99 public Iterator
<String
> getPrefixes(String namespaceURI
) {
100 return NamespaceUtils
.getPrefixes((ns
) -> contentRepository
.getTypesManager().getPrefixes().entrySet().stream()
101 .filter(e
-> e
.getValue().equals(ns
)).map(Map
.Entry
::getKey
).collect(Collectors
.toUnmodifiableSet()),
106 public CompletionStage
<ContentSession
> edit(Consumer
<ContentSession
> work
) {
107 edition
= CompletableFuture
.supplyAsync(() -> {
110 }).thenApply((s
) -> {
112 for (ContentProvider provider
: modifiedProviders
) {
113 if (provider
instanceof DomContentProvider
) {
114 ((DomContentProvider
) provider
).persist(s
);
119 return edition
.minimalCompletionStage();
123 public boolean isEditing() {
124 return edition
!= null && !edition
.isDone();
128 public void notifyModification(ProvidedContent content
) {
129 ContentProvider contentProvider
= content
.getProvider();
130 modifiedProviders
.add(contentProvider
);
134 // public String findNamespace(String prefix) {
135 // return prefixes.get(prefix);
139 // public Set<String> findPrefixes(String namespaceURI) {
140 // Set<String> res = prefixes.entrySet().stream().filter(e -> e.getValue().equals(namespaceURI))
141 // .map(Map.Entry::getKey).collect(Collectors.toUnmodifiableSet());
147 // public String findPrefix(String namespaceURI) {
148 // if (CrName.CR_NAMESPACE_URI.equals(namespaceURI) && prefixes.containsKey(CrName.CR_DEFAULT_PREFIX))
149 // return CrName.CR_DEFAULT_PREFIX;
150 // return ProvidedSession.super.findPrefix(namespaceURI);