Clarify naming.
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / internal / kernel / CmsFsProvider.java
index 04db97833798f6b507952a1c73e47736dc626a90..99c219b51040b24652e8c16bccf74b4ad4b6c5d2 100644 (file)
@@ -8,21 +8,27 @@ import java.nio.file.Path;
 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.NodeConstants;
+import org.argeo.api.NodeUtils;
 import org.argeo.cms.CmsException;
 import org.argeo.cms.auth.CurrentUser;
 import org.argeo.jackrabbit.fs.AbstractJackrabbitFsProvider;
 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.osgi.framework.BundleContext;
 import org.osgi.framework.FrameworkUtil;
 
 public class CmsFsProvider extends AbstractJackrabbitFsProvider {
-       private Map<String, JcrFileSystem> fileSystems = new HashMap<>();
-       private BundleContext bc = FrameworkUtil.getBundle(CmsFsProvider.class).getBundleContext();
+       private Map<String, CmsFileSystem> fileSystems = new HashMap<>();
 
        @Override
        public String getScheme() {
@@ -31,6 +37,7 @@ public class CmsFsProvider extends AbstractJackrabbitFsProvider {
 
        @Override
        public FileSystem newFileSystem(URI uri, Map<String, ?> env) throws IOException {
+               BundleContext bc = FrameworkUtil.getBundle(CmsFsProvider.class).getBundleContext();
                String username = CurrentUser.getUsername();
                if (username == null) {
                        // TODO deal with anonymous
@@ -40,12 +47,23 @@ public class CmsFsProvider extends AbstractJackrabbitFsProvider {
                        throw new FileSystemAlreadyExistsException("CMS file system already exists for user " + username);
 
                try {
-                       Repository repository = bc
-                                       .getService(bc.getServiceReferences(Repository.class, "(cn=node)").iterator().next());
-                       Session session = repository.login();
-                       JcrFileSystem fileSystem = new JcrFileSystem(this, session);
-                       fileSystems.put(username, fileSystem);
-                       return fileSystem;
+                       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 = NodeUtils.getRepositoryByUri(repositoryFactory, repoUri.toString());
+//                             Session session = repository.login("main");
+                               CmsFileSystem fileSystem = new CmsFileSystem(this, repository);
+                               fileSystems.put(username, fileSystem);
+                               return fileSystem;
+                       } else {
+                               Repository repository = bc.getService(
+                                               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);
                }
@@ -73,4 +91,31 @@ public class CmsFsProvider extends AbstractJackrabbitFsProvider {
                String username = CurrentUser.getUsername();
                return fileSystems.get(username);
        }
+
+       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;
+               }
+
+       }
 }