]> git.argeo.org Git - lgpl/argeo-commons.git/blob - jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContentProvider.java
198a2a3ed4480054cc87e738d770c818489d2774
[lgpl/argeo-commons.git] / jcr / org.argeo.cms.jcr / src / org / argeo / cms / jcr / 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.spi.ContentProvider;
16 import org.argeo.api.acr.spi.ProvidedContent;
17 import org.argeo.api.acr.spi.ProvidedSession;
18 import org.argeo.cms.acr.CmsContentRepository;
19 import org.argeo.cms.acr.ContentUtils;
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 if ("/".equals(mountPath))
36 throw new IllegalArgumentException("JCR content provider cannot be root /");
37 Objects.requireNonNull(mountPath);
38 adminSession = CmsJcrUtils.openDataAdminSession(jcrRepository, null);
39 }
40
41 public void stop() {
42 JcrUtils.logoutQuietly(adminSession);
43 }
44
45 public void setJcrRepository(Repository jcrRepository) {
46 this.jcrRepository = jcrRepository;
47 }
48
49 @Override
50 public ProvidedContent get(ProvidedSession contentSession, String mountPath, String relativePath) {
51 String jcrWorkspace = ContentUtils.getParentPath(mountPath)[1];
52 String jcrPath = "/" + relativePath;
53 return new JcrContent(contentSession, this, jcrWorkspace, jcrPath);
54 }
55
56 public Session getJcrSession(ProvidedSession contentSession, String jcrWorkspace) {
57 JcrSessionAdapter sessionAdapter = sessionAdapters.get(contentSession);
58 if (sessionAdapter == null) {
59 final JcrSessionAdapter newSessionAdapter = new JcrSessionAdapter(jcrRepository, contentSession,
60 contentSession.getSubject());
61 sessionAdapters.put(contentSession, newSessionAdapter);
62 contentSession.onClose().thenAccept((s) -> newSessionAdapter.close());
63 sessionAdapter = newSessionAdapter;
64 }
65
66 Session jcrSession = sessionAdapter.getSession(jcrWorkspace);
67 return jcrSession;
68 }
69
70 @Override
71 public String getMountPath() {
72 return mountPath;
73 }
74
75 /*
76 * NAMESPACE CONTEXT
77 */
78 @Override
79 public String getNamespaceURI(String prefix) {
80 try {
81 return adminSession.getNamespaceURI(prefix);
82 } catch (RepositoryException e) {
83 throw new JcrException(e);
84 }
85 }
86
87 @Override
88 public String getPrefix(String namespaceURI) {
89 try {
90 return adminSession.getNamespacePrefix(namespaceURI);
91 } catch (RepositoryException e) {
92 throw new JcrException(e);
93 }
94 }
95
96 @Override
97 public Iterator<String> getPrefixes(String namespaceURI) {
98 try {
99 return Arrays.asList(adminSession.getNamespacePrefix(namespaceURI)).iterator();
100 } catch (RepositoryException e) {
101 throw new JcrException(e);
102 }
103 }
104
105 }