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