From 10f1603677f125c014c06cfd3ab956b5589d6e55 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sat, 24 Oct 2020 13:04:45 +0200 Subject: [PATCH] Improve CmsView capabilities. --- .../org/argeo/cms/web/CmsWebEntryPoint.java | 5 ++ .../src/org/argeo/cms/ui/CmsView.java | 9 +- .../src/org/argeo/cms/ui/util/CmsUiUtils.java | 2 +- .../org/argeo/cms/ui/widgets/TabbedArea.java | 4 +- .../src/org/argeo/cms/fs/CmsFsUtils.java | 88 +++++++++++++++++++ .../cms/internal/kernel/CmsFsProvider.java | 2 + .../argeo/cms/internal/kernel/CmsState.java | 12 +-- 7 files changed, 112 insertions(+), 10 deletions(-) create mode 100644 org.argeo.cms/src/org/argeo/cms/fs/CmsFsUtils.java diff --git a/org.argeo.cms.ui.rap/src/org/argeo/cms/web/CmsWebEntryPoint.java b/org.argeo.cms.ui.rap/src/org/argeo/cms/web/CmsWebEntryPoint.java index 2961eead9..62786f5af 100644 --- a/org.argeo.cms.ui.rap/src/org/argeo/cms/web/CmsWebEntryPoint.java +++ b/org.argeo.cms.ui.rap/src/org/argeo/cms/web/CmsWebEntryPoint.java @@ -39,6 +39,7 @@ import org.osgi.service.event.Event; import org.osgi.service.event.EventAdmin; /** The {@link CmsView} for a {@link CmsWebApp}. */ +@SuppressWarnings("restriction") public class CmsWebEntryPoint implements EntryPoint, CmsView, BrowserNavigationListener { private static final long serialVersionUID = 7733510691684570402L; private final static Log log = LogFactory.getLog(CmsWebEntryPoint.class); @@ -116,6 +117,10 @@ public class CmsWebEntryPoint implements EntryPoint, CmsView, BrowserNavigationL return loginContext.getSubject(); } + public T doAs(PrivilegedAction action) { + return Subject.doAs(getSubject(), action); + } + @Override public boolean isAnonymous() { return CurrentUser.isAnonymous(getSubject()); diff --git a/org.argeo.cms.ui/src/org/argeo/cms/ui/CmsView.java b/org.argeo.cms.ui/src/org/argeo/cms/ui/CmsView.java index 311d10fbe..8011dce59 100644 --- a/org.argeo.cms.ui/src/org/argeo/cms/ui/CmsView.java +++ b/org.argeo.cms.ui/src/org/argeo/cms/ui/CmsView.java @@ -1,5 +1,6 @@ package org.argeo.cms.ui; +import java.security.PrivilegedAction; import java.util.HashMap; import java.util.Map; @@ -51,9 +52,13 @@ public interface CmsView { properties.put(param, value); sendEvent(topic, properties); } - + default void applyStyles(Object widget) { - + + } + + default T doAs(PrivilegedAction action) { + throw new UnsupportedOperationException(); } static CmsView getCmsView(Control parent) { diff --git a/org.argeo.cms.ui/src/org/argeo/cms/ui/util/CmsUiUtils.java b/org.argeo.cms.ui/src/org/argeo/cms/ui/util/CmsUiUtils.java index e9ca4e5be..e72965893 100644 --- a/org.argeo.cms.ui/src/org/argeo/cms/ui/util/CmsUiUtils.java +++ b/org.argeo.cms.ui/src/org/argeo/cms/ui/util/CmsUiUtils.java @@ -164,7 +164,7 @@ public class CmsUiUtils implements CmsConstants { * FORM LAYOUT */ - public static FormData coversAll() { + public static FormData coverAll() { FormData fdLabel = new FormData(); fdLabel.top = new FormAttachment(0, 0); fdLabel.left = new FormAttachment(0, 0); diff --git a/org.argeo.cms.ui/src/org/argeo/cms/ui/widgets/TabbedArea.java b/org.argeo.cms.ui/src/org/argeo/cms/ui/widgets/TabbedArea.java index a9459519a..12ef97557 100644 --- a/org.argeo.cms.ui/src/org/argeo/cms/ui/widgets/TabbedArea.java +++ b/org.argeo.cms.ui/src/org/argeo/cms/ui/widgets/TabbedArea.java @@ -132,7 +132,7 @@ public class TabbedArea extends Composite { } currentUiProvider = uiProvider; section.setNode(context); - section.setLayoutData(CmsUiUtils.coversAll()); + section.setLayoutData(CmsUiUtils.coverAll()); build(section, uiProvider, context); if (sections.size() == 0) sections.add(section); @@ -159,7 +159,7 @@ public class TabbedArea extends Composite { int currentIndex = sections.indexOf(currentSection); Section previousSection = new Section(body, SWT.NONE, context); build(previousSection, previousUiProvider, previousNode); - previousSection.setLayoutData(CmsUiUtils.coversAll()); + previousSection.setLayoutData(CmsUiUtils.coverAll()); // sections.remove(currentSection); sections.add(currentIndex + 1, previousSection); // sections.add(currentSection); diff --git a/org.argeo.cms/src/org/argeo/cms/fs/CmsFsUtils.java b/org.argeo.cms/src/org/argeo/cms/fs/CmsFsUtils.java new file mode 100644 index 000000000..e152c002e --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/fs/CmsFsUtils.java @@ -0,0 +1,88 @@ +package org.argeo.cms.fs; + +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.file.FileSystem; +import java.nio.file.Path; +import java.nio.file.spi.FileSystemProvider; + +import javax.jcr.NoSuchWorkspaceException; +import javax.jcr.Node; +import javax.jcr.NodeIterator; +import javax.jcr.Repository; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.jcr.query.Query; +import javax.jcr.query.QueryManager; + +import org.argeo.api.NodeConstants; +import org.argeo.jcr.Jcr; + +/** Utilities around documents. */ +public class CmsFsUtils { + // TODO make it more robust and configurable + private static String baseWorkspaceName = NodeConstants.SYS_WORKSPACE; + + public static Node getNode(Repository repository, Path path) { + String workspaceName = path.getNameCount() == 0 ? baseWorkspaceName : path.getName(0).toString(); + String jcrPath = '/' + path.subpath(1, path.getNameCount()).toString(); + try { + Session newSession; + try { + newSession = repository.login(workspaceName); + } catch (NoSuchWorkspaceException e) { + // base workspace + newSession = repository.login(baseWorkspaceName); + jcrPath = path.toString(); + } + return newSession.getNode(jcrPath); + } catch (RepositoryException e) { + throw new IllegalStateException("Cannot get node from path " + path, e); + } + } + + public static NodeIterator getLastUpdatedDocuments(Session session) { + try { + String qStr = "//element(*, nt:file)"; + qStr += " order by @jcr:lastModified descending"; + QueryManager queryManager = session.getWorkspace().getQueryManager(); + @SuppressWarnings("deprecation") + Query xpathQuery = queryManager.createQuery(qStr, Query.XPATH); + xpathQuery.setLimit(8); + NodeIterator nit = xpathQuery.execute().getNodes(); + return nit; + } catch (RepositoryException e) { + throw new IllegalStateException("Unable to retrieve last updated documents", e); + } + } + + public static Path getPath(FileSystemProvider nodeFileSystemProvider, URI uri) { + try { + FileSystem fileSystem = nodeFileSystemProvider.getFileSystem(uri); + if (fileSystem == null) + fileSystem = nodeFileSystemProvider.newFileSystem(uri, null); + String path = uri.getPath(); + return fileSystem.getPath(path); + } catch (IOException e) { + throw new IllegalStateException("Unable to initialise file system for " + uri, e); + } + } + + public static Path getPath(FileSystemProvider nodeFileSystemProvider, Node node) { + String workspaceName = Jcr.getWorkspaceName(node); + String fullPath = baseWorkspaceName.equals(workspaceName) ? Jcr.getPath(node) + : '/' + workspaceName + Jcr.getPath(node); + URI uri; + try { + uri = new URI(NodeConstants.SCHEME_NODE, null, fullPath, null); + } catch (URISyntaxException e) { + throw new IllegalArgumentException("Cannot interpret " + fullPath + " as an URI", e); + } + return getPath(nodeFileSystemProvider, uri); + } + + /** Singleton. */ + private CmsFsUtils() { + } +} 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 e4ca87c12..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 @@ -6,6 +6,7 @@ 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; @@ -28,6 +29,7 @@ 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<>(); 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 7ff650254..53a3de8ef 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 @@ -17,7 +17,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.argeo.api.NodeConstants; import org.argeo.api.NodeState; -import org.argeo.cms.CmsException; import org.argeo.cms.LocaleUtils; import org.argeo.transaction.simple.SimpleTransactionManager; import org.argeo.util.LangUtils; @@ -26,6 +25,9 @@ import org.osgi.framework.Constants; import org.osgi.framework.FrameworkUtil; import org.osgi.service.cm.ManagedServiceFactory; +/** + * Implementation of a {@link NodeState}, initialising the required services. + */ public class CmsState implements NodeState { private final static Log log = LogFactory.getLog(CmsState.class); private final BundleContext bc = FrameworkUtil.getBundle(CmsState.class).getBundleContext(); @@ -88,7 +90,7 @@ public class CmsState implements NodeState { throw new UnsupportedOperationException( "Bitronix is not supported anymore, but could be again if there is enough interest."); } else { - throw new CmsException("Usupported transaction manager type " + tmType); + throw new IllegalArgumentException("Usupported transaction manager type " + tmType); } // POI @@ -109,7 +111,7 @@ public class CmsState implements NodeState { RepositoryServiceFactory repositoryServiceFactory = new RepositoryServiceFactory(); stopHooks.add(() -> repositoryServiceFactory.shutdown()); bc.registerService(ManagedServiceFactory.class, repositoryServiceFactory, - LangUtils.dico(Constants.SERVICE_PID, NodeConstants.NODE_REPOS_FACTORY_PID)); + LangUtils.dict(Constants.SERVICE_PID, NodeConstants.NODE_REPOS_FACTORY_PID)); NodeRepositoryFactory repositoryFactory = new NodeRepositoryFactory(); bc.registerService(RepositoryFactory.class, repositoryFactory, null); @@ -118,7 +120,7 @@ public class CmsState implements NodeState { NodeUserAdmin userAdmin = new NodeUserAdmin(NodeConstants.ROLES_BASEDN, NodeConstants.TOKENS_BASEDN); stopHooks.add(() -> userAdmin.destroy()); bc.registerService(ManagedServiceFactory.class, userAdmin, - LangUtils.dico(Constants.SERVICE_PID, NodeConstants.NODE_USER_ADMIN_PID)); + LangUtils.dict(Constants.SERVICE_PID, NodeConstants.NODE_USER_ADMIN_PID)); // File System CmsFsProvider cmsFsProvider = new CmsFsProvider(); @@ -133,7 +135,7 @@ public class CmsState implements NodeState { // log.debug("Installed FileSystemProvider " + fsp); // } bc.registerService(FileSystemProvider.class, cmsFsProvider, - LangUtils.dico(Constants.SERVICE_PID, NodeConstants.NODE_FS_PROVIDER_PID)); + LangUtils.dict(Constants.SERVICE_PID, NodeConstants.NODE_FS_PROVIDER_PID)); } private void initSimpleTransactionManager() { -- 2.30.2