From 255654a72d48b875d71cea637532784953d80499 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Fri, 13 Jan 2017 15:13:22 +0100 Subject: [PATCH] Introduce node file system provider --- .../META-INF/spring/osgi.xml | 2 + .../META-INF/spring/parts.xml | 5 ++ org.argeo.cms.ui.workbench/plugin.xml | 8 +- .../ui/workbench/JcrBrowserPerspective.java | 2 + .../ui/workbench/jcr/NodeFsBrowserView.java | 51 +++++++++++++ .../argeo/cms/internal/kernel/Activator.java | 8 +- .../cms/internal/kernel/CmsFsProvider.java | 75 +++++++++++++++++++ .../argeo/cms/internal/kernel/CmsState.java | 8 +- .../src/org/argeo/node/NodeConstants.java | 1 + 9 files changed, 156 insertions(+), 4 deletions(-) create mode 100644 org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/jcr/NodeFsBrowserView.java create mode 100644 org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsFsProvider.java diff --git a/org.argeo.cms.ui.workbench/META-INF/spring/osgi.xml b/org.argeo.cms.ui.workbench/META-INF/spring/osgi.xml index b2b42fcf0..7fa7adb8f 100644 --- a/org.argeo.cms.ui.workbench/META-INF/spring/osgi.xml +++ b/org.argeo.cms.ui.workbench/META-INF/spring/osgi.xml @@ -19,6 +19,8 @@ + diff --git a/org.argeo.cms.ui.workbench/META-INF/spring/parts.xml b/org.argeo.cms.ui.workbench/META-INF/spring/parts.xml index 8fc1adb66..07dc01e53 100644 --- a/org.argeo.cms.ui.workbench/META-INF/spring/parts.xml +++ b/org.argeo.cms.ui.workbench/META-INF/spring/parts.xml @@ -47,6 +47,11 @@ + + + + + + diff --git a/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/JcrBrowserPerspective.java b/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/JcrBrowserPerspective.java index ce8985760..634a24ab4 100644 --- a/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/JcrBrowserPerspective.java +++ b/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/JcrBrowserPerspective.java @@ -16,6 +16,7 @@ package org.argeo.cms.ui.workbench; import org.argeo.cms.ui.workbench.jcr.JcrBrowserView; +import org.argeo.cms.ui.workbench.jcr.NodeFsBrowserView; import org.eclipse.ui.IFolderLayout; import org.eclipse.ui.IPageLayout; import org.eclipse.ui.IPerspectiveFactory; @@ -29,5 +30,6 @@ public class JcrBrowserPerspective implements IPerspectiveFactory { WorkbenchUiPlugin.PLUGIN_ID + ".upperLeft", IPageLayout.LEFT, 0.4f, layout.getEditorArea()); upperLeft.addView(JcrBrowserView.ID); + upperLeft.addView(NodeFsBrowserView.ID); } } diff --git a/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/jcr/NodeFsBrowserView.java b/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/jcr/NodeFsBrowserView.java new file mode 100644 index 000000000..cfbf5208e --- /dev/null +++ b/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/jcr/NodeFsBrowserView.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2007-2012 Argeo GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.argeo.cms.ui.workbench.jcr; + +import java.nio.file.spi.FileSystemProvider; + +import org.argeo.cms.ui.workbench.WorkbenchUiPlugin; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.part.ViewPart; + +/** + * Browse the node file system. + */ +public class NodeFsBrowserView extends ViewPart { + public final static String ID = WorkbenchUiPlugin.PLUGIN_ID + ".nodeFsBrowserView"; + + private FileSystemProvider nodeFileSystemProvider; + + @Override + public void createPartControl(Composite parent) { +// SimpleFsBrowser browser = new SimpleFsBrowser(parent, SWT.NO_FOCUS); +// Path path = Paths.get("/"); +// browser.setInput(path); +// browser.setLayoutData(EclipseUiUtils.fillAll()); + } + + @Override + public void setFocus() { + // TODO Auto-generated method stub + + } + + public void setNodeFileSystemProvider(FileSystemProvider nodeFileSystemProvider) { + this.nodeFileSystemProvider = nodeFileSystemProvider; + } + + +} diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/Activator.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/Activator.java index 44922aced..24c2f6bcc 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/Activator.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/Activator.java @@ -10,6 +10,8 @@ import java.util.Locale; import javax.security.auth.login.Configuration; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.argeo.cms.CmsException; import org.argeo.node.ArgeoLogger; import org.argeo.node.NodeConstants; @@ -28,6 +30,8 @@ import org.osgi.service.log.LogReaderService; * access to kernel information for the rest of the bundle (and only it) */ public class Activator implements BundleActivator { + private final static Log log = LogFactory.getLog(Activator.class); + private static Activator instance; private BundleContext bc; @@ -51,8 +55,8 @@ public class Activator implements BundleActivator { initArgeoLogger(); initNode(); } catch (Exception e) { - e.printStackTrace(); - throw new CmsException("Cannot initialize node", e); + log.error("## FATAL: CMS activator failed", e); + // throw new CmsException("Cannot initialize node", e); } } 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 new file mode 100644 index 000000000..6ad3e381a --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsFsProvider.java @@ -0,0 +1,75 @@ +package org.argeo.cms.internal.kernel; + +import java.io.IOException; +import java.net.URI; +import java.nio.file.FileSystem; +import java.nio.file.FileSystemAlreadyExistsException; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.Map; + +import javax.jcr.Repository; +import javax.jcr.Session; + +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.JcrFsException; +import org.osgi.framework.BundleContext; +import org.osgi.framework.FrameworkUtil; + +public class CmsFsProvider extends AbstractJackrabbitFsProvider { + private Map fileSystems = new HashMap<>(); + private BundleContext bc = FrameworkUtil.getBundle(CmsFsProvider.class).getBundleContext(); + + @Override + public String getScheme() { + return "node"; + } + + @Override + public FileSystem newFileSystem(URI uri, Map env) throws IOException { + 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 { + 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; + } catch (Exception e) { + throw new CmsException("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); + } +} diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsState.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsState.java index e01bd2c54..a5cc0b746 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsState.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsState.java @@ -7,6 +7,7 @@ import static java.util.Locale.ENGLISH; import java.io.File; import java.net.InetAddress; import java.net.UnknownHostException; +import java.nio.file.spi.FileSystemProvider; import java.util.ArrayList; import java.util.List; import java.util.Locale; @@ -60,7 +61,7 @@ public class CmsState implements NodeState { try { this.hostname = InetAddress.getLocalHost().getHostName(); } catch (UnknownHostException e) { - log.error("Cannot set hostname: "+ e); + log.error("Cannot set hostname: " + e); } availableSince = System.currentTimeMillis(); @@ -101,6 +102,11 @@ public class CmsState implements NodeState { shutdownHooks.add(() -> userAdmin.destroy()); bc.registerService(ManagedServiceFactory.class, userAdmin, LangUtils.dico(Constants.SERVICE_PID, NodeConstants.NODE_USER_ADMIN_PID)); + + // File System + CmsFsProvider cmsFsProvider = new CmsFsProvider(); + bc.registerService(FileSystemProvider.class, cmsFsProvider, + LangUtils.dico(Constants.SERVICE_PID, NodeConstants.NODE_FS_PROVIDER_PID)); } private void initTransactionManager() { diff --git a/org.argeo.node.api/src/org/argeo/node/NodeConstants.java b/org.argeo.node.api/src/org/argeo/node/NodeConstants.java index 2a221abe8..8b1a1d3cc 100644 --- a/org.argeo.node.api/src/org/argeo/node/NodeConstants.java +++ b/org.argeo.node.api/src/org/argeo/node/NodeConstants.java @@ -10,6 +10,7 @@ public interface NodeConstants { String NODE_USER_ADMIN_PID = "org.argeo.node.userAdmin"; String NODE_KEYRING_PID = "org.argeo.node.keyring"; + String NODE_FS_PROVIDER_PID = "org.argeo.node.fsProvider"; /* * FACTORY PIDs -- 2.30.2