X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Finternal%2Fkernel%2FCmsFsProvider.java;h=6cd0bf87415f7138c8d89c46370543f567c289d9;hb=10f1603677f125c014c06cfd3ab956b5589d6e55;hp=614ff6c497ebda2ce6dd0554c4dd11f8cd64ad71;hpb=12c44296992a48de65fe6864a6ed005f03264fcf;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsFsProvider.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsFsProvider.java index 614ff6c49..6cd0bf874 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsFsProvider.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsFsProvider.java @@ -2,31 +2,36 @@ package org.argeo.cms.internal.kernel; 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.cms.CmsException; +import org.argeo.api.NodeConstants; +import org.argeo.api.NodeUtils; import org.argeo.cms.auth.CurrentUser; import org.argeo.jackrabbit.fs.AbstractJackrabbitFsProvider; -import org.argeo.jcr.JcrUtils; import org.argeo.jcr.fs.JcrFileSystem; +import org.argeo.jcr.fs.JcrFileSystemProvider; import org.argeo.jcr.fs.JcrFsException; -import org.argeo.node.NodeConstants; -import org.argeo.node.NodeUtils; import org.osgi.framework.BundleContext; import org.osgi.framework.FrameworkUtil; +import org.osgi.framework.InvalidSyntaxException; +/** Implementation of an {@link FileSystemProvider} based on Jackrabbit. */ public class CmsFsProvider extends AbstractJackrabbitFsProvider { - private Map fileSystems = new HashMap<>(); - private BundleContext bc = FrameworkUtil.getBundle(CmsFsProvider.class).getBundleContext(); + private Map fileSystems = new HashMap<>(); @Override public String getScheme() { @@ -35,6 +40,7 @@ public class CmsFsProvider extends AbstractJackrabbitFsProvider { @Override public FileSystem newFileSystem(URI uri, Map env) throws IOException { + BundleContext bc = FrameworkUtil.getBundle(CmsFsProvider.class).getBundleContext(); String username = CurrentUser.getUsername(); if (username == null) { // TODO deal with anonymous @@ -49,20 +55,20 @@ public class CmsFsProvider extends AbstractJackrabbitFsProvider { 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 = NodeUtils.getRepositoryByUri(repositoryFactory, repoUri.toString()); - Session session = repository.login("main"); - JcrFileSystem fileSystem = new JcrFileSystem(this, session); + CmsFileSystem fileSystem = new CmsFileSystem(this, repository); fileSystems.put(username, fileSystem); return fileSystem; } else { Repository repository = bc.getService( - bc.getServiceReferences(Repository.class, "(cn=" + NodeConstants.HOME + ")").iterator().next()); - Session session = repository.login(); - JcrFileSystem fileSystem = new JcrFileSystem(this, session); + bc.getServiceReferences(Repository.class, "(cn=" + NodeConstants.EGO_REPOSITORY + ")") + .iterator().next()); +// Session session = repository.login(); + CmsFileSystem fileSystem = new CmsFileSystem(this, repository); fileSystems.put(username, fileSystem); return fileSystem; } - } catch (Exception e) { - throw new CmsException("Cannot open file system " + uri + " for user " + username, e); + } catch (InvalidSyntaxException | URISyntaxException e) { + throw new IllegalArgumentException("Cannot open file system " + uri + " for user " + username, e); } } @@ -89,7 +95,30 @@ public class CmsFsProvider extends AbstractJackrabbitFsProvider { return fileSystems.get(username); } - public Node getUserHome(Session session) { - return NodeUtils.getUserHome(session); + public Node getUserHome(Repository repository) { + try { + Session session = repository.login(NodeConstants.HOME_WORKSPACE); + return NodeUtils.getUserHome(session); + } catch (RepositoryException e) { + throw new IllegalStateException("Cannot get user home", e); + } + } + + 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; + } + } }