import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
+import java.util.Objects;
-import javax.jcr.Node;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.xml.namespace.NamespaceContext;
-import org.argeo.api.acr.Content;
-import org.argeo.api.acr.ContentUtils;
import org.argeo.api.acr.spi.ContentProvider;
+import org.argeo.api.acr.spi.ProvidedContent;
import org.argeo.api.acr.spi.ProvidedSession;
+import org.argeo.cms.acr.CmsContentRepository;
+import org.argeo.cms.acr.ContentUtils;
import org.argeo.cms.jcr.CmsJcrUtils;
import org.argeo.jcr.JcrException;
import org.argeo.jcr.JcrUtils;
private Repository jcrRepository;
private Session adminSession;
+ private String mountPath;
+
private Map<ProvidedSession, JcrSessionAdapter> sessionAdapters = Collections.synchronizedMap(new HashMap<>());
- public void start() {
+ public void start(Map<String, String> properties) {
+ mountPath = properties.get(CmsContentRepository.ACR_MOUNT_PATH_PROPERTY);
+ if ("/".equals(mountPath))
+ throw new IllegalArgumentException("JCR content provider cannot be root /");
+ Objects.requireNonNull(mountPath);
adminSession = CmsJcrUtils.openDataAdminSession(jcrRepository, null);
}
}
@Override
- public Content get(ProvidedSession contentSession, String mountPath, String relativePath) {
- String workspace = ContentUtils.getParentPath(mountPath)[1];
+ public ProvidedContent get(ProvidedSession contentSession, String mountPath, String relativePath) {
+ String jcrWorkspace = ContentUtils.getParentPath(mountPath)[1];
+ String jcrPath = "/" + relativePath;
+ return new JcrContent(contentSession, this, jcrWorkspace, jcrPath);
+ }
+
+ public Session getJcrSession(ProvidedSession contentSession, String jcrWorkspace) {
JcrSessionAdapter sessionAdapter = sessionAdapters.get(contentSession);
if (sessionAdapter == null) {
- final JcrSessionAdapter newSessionAdapter = new JcrSessionAdapter(jcrRepository,
+ final JcrSessionAdapter newSessionAdapter = new JcrSessionAdapter(jcrRepository, contentSession,
contentSession.getSubject());
sessionAdapters.put(contentSession, newSessionAdapter);
contentSession.onClose().thenAccept((s) -> newSessionAdapter.close());
sessionAdapter = newSessionAdapter;
}
- Session jcrSession = sessionAdapter.getSession(workspace);
- String jcrPath = "/" + relativePath;
- try {
- Node node = jcrSession.getNode(jcrPath);
- return new JcrContent(contentSession, this, node);
- } catch (RepositoryException e) {
- throw new JcrException("Cannot get JCR content '" + jcrPath + ", mounted from '" + mountPath
- + "' with JCR session " + jcrSession, e);
- }
+ Session jcrSession = sessionAdapter.getSession(jcrWorkspace);
+ return jcrSession;
+ }
+
+ @Override
+ public String getMountPath() {
+ return mountPath;
}
/*