]> 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.spi.ContentProvider;
17 import org.argeo.api.acr.spi.ProvidedContent;
18 import org.argeo.api.acr.spi.ProvidedSession;
19 import org.argeo.cms.acr.CmsContentRepository;
20 import org.argeo.cms.acr.ContentUtils;
21 import org.argeo.cms.jcr.CmsJcrUtils;
22 import org.argeo.jcr.JcrException;
23 import org.argeo.jcr.JcrUtils;
24
25 /** A JCR workspace accessed as an {@link ContentProvider}. */
26 public class JcrContentProvider implements ContentProvider, NamespaceContext {
27 private Repository jcrRepository;
28 private Session adminSession;
29
30 private String mountPath;
31
32 private Map<ProvidedSession, JcrSessionAdapter> sessionAdapters = Collections.synchronizedMap(new HashMap<>());
33
34 public void start(Map<String, String> properties) {
35 mountPath = properties.get(CmsContentRepository.ACR_MOUNT_PATH_PROPERTY);
36 if ("/".equals(mountPath))
37 throw new IllegalArgumentException("JCR content provider cannot be root /");
38 Objects.requireNonNull(mountPath);
39 adminSession = CmsJcrUtils.openDataAdminSession(jcrRepository, null);
40 }
41
42 public void stop() {
43 JcrUtils.logoutQuietly(adminSession);
44 }
45
46 public void setJcrRepository(Repository jcrRepository) {
47 this.jcrRepository = jcrRepository;
48 }
49
50 @Override
51 public ProvidedContent get(ProvidedSession contentSession, String relativePath) {
52 String jcrWorkspace = ContentUtils.getParentPath(mountPath)[1];
53 String jcrPath = "/" + relativePath;
54 return new JcrContent(contentSession, this, jcrWorkspace, jcrPath);
55 }
56
57 @Override
58 public boolean exists(ProvidedSession contentSession, String relativePath) {
59 String jcrWorkspace = ContentUtils.getParentPath(mountPath)[1];
60 String jcrPath = "/" + relativePath;
61 return new JcrContent(contentSession, this, jcrWorkspace, jcrPath).exists();
62 }
63
64 public Session getJcrSession(ProvidedSession contentSession, String jcrWorkspace) {
65 JcrSessionAdapter sessionAdapter = sessionAdapters.get(contentSession);
66 if (sessionAdapter == null) {
67 final JcrSessionAdapter newSessionAdapter = new JcrSessionAdapter(jcrRepository, contentSession,
68 contentSession.getSubject());
69 sessionAdapters.put(contentSession, newSessionAdapter);
70 contentSession.onClose().thenAccept((s) -> newSessionAdapter.close());
71 sessionAdapter = newSessionAdapter;
72 }
73
74 Session jcrSession = sessionAdapter.getSession(jcrWorkspace);
75 return jcrSession;
76 }
77
78 public Session getJcrSession(Content content, String jcrWorkspace) {
79 return getJcrSession(((ProvidedContent) content).getSession(), jcrWorkspace);
80 }
81
82 @Override
83 public String getMountPath() {
84 return mountPath;
85 }
86
87 /*
88 * NAMESPACE CONTEXT
89 */
90 @Override
91 public String getNamespaceURI(String prefix) {
92 try {
93 return adminSession.getNamespaceURI(prefix);
94 } catch (RepositoryException e) {
95 throw new JcrException(e);
96 }
97 }
98
99 @Override
100 public String getPrefix(String namespaceURI) {
101 try {
102 return adminSession.getNamespacePrefix(namespaceURI);
103 } catch (RepositoryException e) {
104 throw new JcrException(e);
105 }
106 }
107
108 @Override
109 public Iterator<String> getPrefixes(String namespaceURI) {
110 try {
111 return Arrays.asList(adminSession.getNamespacePrefix(namespaceURI)).iterator();
112 } catch (RepositoryException e) {
113 throw new JcrException(e);
114 }
115 }
116
117 }