import javax.jcr.Session;
import javax.xml.namespace.NamespaceContext;
+import org.argeo.api.acr.Content;
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.api.cms.CmsConstants;
import org.argeo.cms.acr.ContentUtils;
import org.argeo.cms.jcr.CmsJcrUtils;
import org.argeo.jcr.JcrException;
/** A JCR workspace accessed as an {@link ContentProvider}. */
public class JcrContentProvider implements ContentProvider, NamespaceContext {
+
private Repository jcrRepository;
private Session adminSession;
private String mountPath;
+ // cache
+ private String jcrWorkspace;
+
private Map<ProvidedSession, JcrSessionAdapter> sessionAdapters = Collections.synchronizedMap(new HashMap<>());
public void start(Map<String, String> properties) {
- mountPath = properties.get(CmsContentRepository.ACR_MOUNT_PATH_PROPERTY);
+ mountPath = properties.get(CmsConstants.ACR_MOUNT_PATH);
if ("/".equals(mountPath))
throw new IllegalArgumentException("JCR content provider cannot be root /");
Objects.requireNonNull(mountPath);
- adminSession = CmsJcrUtils.openDataAdminSession(jcrRepository, null);
+ jcrWorkspace = ContentUtils.getParentPath(mountPath)[1];
+ adminSession = CmsJcrUtils.openDataAdminSession(jcrRepository, jcrWorkspace);
}
public void stop() {
- JcrUtils.logoutQuietly(adminSession);
+ if (adminSession.isLive())
+ JcrUtils.logoutQuietly(adminSession);
}
public void setJcrRepository(Repository jcrRepository) {
}
@Override
- public ProvidedContent get(ProvidedSession contentSession, String mountPath, String relativePath) {
- String jcrWorkspace = ContentUtils.getParentPath(mountPath)[1];
+ public ProvidedContent get(ProvidedSession contentSession, String relativePath) {
String jcrPath = "/" + relativePath;
return new JcrContent(contentSession, this, jcrWorkspace, jcrPath);
}
+ @Override
+ public boolean exists(ProvidedSession contentSession, String relativePath) {
+ String jcrWorkspace = ContentUtils.getParentPath(mountPath)[1];
+ String jcrPath = "/" + relativePath;
+ return new JcrContent(contentSession, this, jcrWorkspace, jcrPath).exists();
+ }
+
public Session getJcrSession(ProvidedSession contentSession, String jcrWorkspace) {
JcrSessionAdapter sessionAdapter = sessionAdapters.get(contentSession);
if (sessionAdapter == null) {
return jcrSession;
}
+ public Session getJcrSession(Content content, String jcrWorkspace) {
+ return getJcrSession(((ProvidedContent) content).getSession(), jcrWorkspace);
+ }
+
@Override
public String getMountPath() {
return mountPath;