X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms.jcr%2Fsrc%2Forg%2Fargeo%2Fcms%2Fjcr%2Finternal%2FCmsJcrFsProvider.java;fp=org.argeo.cms.jcr%2Fsrc%2Forg%2Fargeo%2Fcms%2Fjcr%2Finternal%2FCmsJcrFsProvider.java;h=0099b3bed68d6b391964a43ae3a25616fa0018e4;hb=bce03099b0d2f1758e7a3d74fba339d0200924d5;hp=0000000000000000000000000000000000000000;hpb=0ea2992e5f3803cd98b5981f27274faa922bc199;p=gpl%2Fargeo-jcr.git diff --git a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/CmsJcrFsProvider.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/CmsJcrFsProvider.java new file mode 100644 index 0000000..0099b3b --- /dev/null +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/CmsJcrFsProvider.java @@ -0,0 +1,133 @@ +package org.argeo.cms.jcr.internal; + +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.file.FileSystem; +import java.nio.file.FileSystemAlreadyExistsException; +import java.nio.file.Path; +import java.nio.file.spi.FileSystemProvider; +import java.util.HashMap; +import java.util.Map; + +import javax.jcr.Node; +import javax.jcr.Property; +import javax.jcr.Repository; +import javax.jcr.RepositoryException; +import javax.jcr.RepositoryFactory; +import javax.jcr.Session; +import javax.jcr.nodetype.NodeType; + +import org.argeo.api.cms.CmsConstants; +import org.argeo.cms.auth.CurrentUser; +import org.argeo.cms.jcr.CmsJcrUtils; +import org.argeo.jackrabbit.fs.AbstractJackrabbitFsProvider; +import org.argeo.jcr.fs.JcrFileSystem; +import org.argeo.jcr.fs.JcrFileSystemProvider; +import org.argeo.jcr.fs.JcrFsException; + +/** Implementation of an {@link FileSystemProvider} based on Jackrabbit. */ +public class CmsJcrFsProvider extends AbstractJackrabbitFsProvider { + private Map fileSystems = new HashMap<>(); + + private RepositoryFactory repositoryFactory; + private Repository repository; + + @Override + public String getScheme() { + return CmsConstants.SCHEME_NODE; + } + + @Override + public FileSystem newFileSystem(URI uri, Map env) throws IOException { +// BundleContext bc = FrameworkUtil.getBundle(CmsJcrFsProvider.class).getBundleContext(); + String username = CurrentUser.getUsername(); + if (username == null) { + // TODO deal with anonymous + return null; + } + if (fileSystems.containsKey(username)) + throw new FileSystemAlreadyExistsException("CMS file system already exists for user " + username); + + try { + String host = uri.getHost(); + if (host != null && !host.trim().equals("")) { + URI repoUri = new URI("http", uri.getUserInfo(), uri.getHost(), uri.getPort(), "/jcr/node", null, null); +// RepositoryFactory repositoryFactory = bc.getService(bc.getServiceReference(RepositoryFactory.class)); + Repository repository = CmsJcrUtils.getRepositoryByUri(repositoryFactory, repoUri.toString()); + CmsFileSystem fileSystem = new CmsFileSystem(this, repository); + fileSystems.put(username, fileSystem); + return fileSystem; + } else { +// Repository repository = bc.getService( +// bc.getServiceReferences(Repository.class, "(cn=" + CmsConstants.EGO_REPOSITORY + ")") +// .iterator().next()); + + // Session session = repository.login(); + CmsFileSystem fileSystem = new CmsFileSystem(this, repository); + fileSystems.put(username, fileSystem); + return fileSystem; + } + } catch (URISyntaxException e) { + throw new IllegalArgumentException("Cannot open file system " + uri + " for user " + username, e); + } + } + + @Override + public FileSystem getFileSystem(URI uri) { + return currentUserFileSystem(); + } + + @Override + public Path getPath(URI uri) { + JcrFileSystem fileSystem = currentUserFileSystem(); + String path = uri.getPath(); + if (fileSystem == null) + try { + fileSystem = (JcrFileSystem) newFileSystem(uri, new HashMap()); + } catch (IOException e) { + throw new JcrFsException("Could not autocreate file system", e); + } + return fileSystem.getPath(path); + } + + protected JcrFileSystem currentUserFileSystem() { + String username = CurrentUser.getUsername(); + return fileSystems.get(username); + } + + public Node getUserHome(Repository repository) { + try { + Session session = repository.login(CmsConstants.HOME_WORKSPACE); + return CmsJcrUtils.getUserHome(session); + } catch (RepositoryException e) { + throw new IllegalStateException("Cannot get user home", e); + } + } + + public void setRepositoryFactory(RepositoryFactory repositoryFactory) { + this.repositoryFactory = repositoryFactory; + } + + public void setRepository(Repository repository) { + this.repository = repository; + } + + static class CmsFileSystem extends JcrFileSystem { + public CmsFileSystem(JcrFileSystemProvider provider, Repository repository) throws IOException { + super(provider, repository); + } + + public boolean skipNode(Node node) throws RepositoryException { +// if (node.isNodeType(NodeType.NT_HIERARCHY_NODE) || node.isNodeType(NodeTypes.NODE_USER_HOME) +// || node.isNodeType(NodeTypes.NODE_GROUP_HOME)) + if (node.isNodeType(NodeType.NT_HIERARCHY_NODE)) + return false; + // FIXME Better identifies home + if (node.hasProperty(Property.JCR_ID)) + return false; + return true; + } + + } +}