]> git.argeo.org Git - lgpl/argeo-commons.git/blob - acr/JcrContentProvider.java
Prepare next development cycle
[lgpl/argeo-commons.git] / acr / JcrContentProvider.java
1 package org.argeo.cms.jcr.acr;
2
3 import java.util.Arrays;
4 import java.util.Collections;
5 import java.util.HashMap;
6 import java.util.Iterator;
7 import java.util.Map;
8 import java.util.Objects;
9
10 import javax.jcr.Repository;
11 import javax.jcr.RepositoryException;
12 import javax.jcr.Session;
13 import javax.xml.namespace.NamespaceContext;
14
15 import org.argeo.api.acr.Content;
16 import org.argeo.api.acr.ContentUtils;
17 import org.argeo.api.acr.spi.ContentProvider;
18 import org.argeo.api.acr.spi.ProvidedSession;
19 import org.argeo.cms.acr.CmsContentRepository;
20 import org.argeo.cms.jcr.CmsJcrUtils;
21 import org.argeo.jcr.JcrException;
22 import org.argeo.jcr.JcrUtils;
23
24 /** A JCR workspace accessed as an {@link ContentProvider}. */
25 public class JcrContentProvider implements ContentProvider, NamespaceContext {
26 private Repository jcrRepository;
27 private Session adminSession;
28
29 private String mountPath;
30
31 private Map<ProvidedSession, JcrSessionAdapter> sessionAdapters = Collections.synchronizedMap(new HashMap<>());
32
33 public void start(Map<String, String> properties) {
34 mountPath = properties.get(CmsContentRepository.ACR_MOUNT_PATH_PROPERTY);
35 Objects.requireNonNull(mountPath);
36 adminSession = CmsJcrUtils.openDataAdminSession(jcrRepository, null);
37 }
38
39 public void stop() {
40 JcrUtils.logoutQuietly(adminSession);
41 }
42
43 public void setJcrRepository(Repository jcrRepository) {
44 this.jcrRepository = jcrRepository;
45 }
46
47 @Override
48 public Content get(ProvidedSession contentSession, String mountPath, String relativePath) {
49 String jcrWorkspace = ContentUtils.getParentPath(mountPath)[1];
50 String jcrPath = "/" + relativePath;
51 return new JcrContent(contentSession, this, jcrWorkspace, jcrPath);
52 }
53
54 public Session getJcrSession(ProvidedSession contentSession, String jcrWorkspace) {
55 JcrSessionAdapter sessionAdapter = sessionAdapters.get(contentSession);
56 if (sessionAdapter == null) {
57 final JcrSessionAdapter newSessionAdapter = new JcrSessionAdapter(jcrRepository,
58 contentSession.getSubject());
59 sessionAdapters.put(contentSession, newSessionAdapter);
60 contentSession.onClose().thenAccept((s) -> newSessionAdapter.close());
61 sessionAdapter = newSessionAdapter;
62 }
63
64 Session jcrSession = sessionAdapter.getSession(jcrWorkspace);
65 return jcrSession;
66 }
67
68 @Override
69 public String getMountPath() {
70 return mountPath;
71 }
72
73 /*
74 * NAMESPACE CONTEXT
75 */
76 @Override
77 public String getNamespaceURI(String prefix) {
78 try {
79 return adminSession.getNamespaceURI(prefix);
80 } catch (RepositoryException e) {
81 throw new JcrException(e);
82 }
83 }
84
85 @Override
86 public String getPrefix(String namespaceURI) {
87 try {
88 return adminSession.getNamespacePrefix(namespaceURI);
89 } catch (RepositoryException e) {
90 throw new JcrException(e);
91 }
92 }
93
94 @Override
95 public Iterator<String> getPrefixes(String namespaceURI) {
96 try {
97 return Arrays.asList(adminSession.getNamespacePrefix(namespaceURI)).iterator();
98 } catch (RepositoryException e) {
99 throw new JcrException(e);
100 }
101 }
102
103 }