From a2e69565ce725b16f340f8aa73103333913d4042 Mon Sep 17 00:00:00 2001 From: srosse <stephane.rosse@frentix.com> Date: Mon, 9 Sep 2019 18:19:01 +0200 Subject: [PATCH] OO-4229: only load metadata once per directory --- .../core/commons/editor/fileeditor/FileEditor.java | 9 +++++++++ .../modules/bc/components/FolderComponent.java | 14 +++++++------- .../modules/bc/components/ListRenderer.java | 8 ++++---- .../core/commons/services/doceditor/DocEditor.java | 3 +++ .../services/doceditor/DocumentEditorService.java | 14 ++++++++++++++ .../doceditor/collabora/CollaboraEditor.java | 9 +++++++++ .../doceditor/collabora/CollaboraService.java | 2 ++ .../collabora/manager/CollaboraServiceImpl.java | 5 +++++ .../manager/DocumentEditorServiceImpl.java | 13 ++++++++++++- .../doceditor/office365/Office365Editor.java | 9 +++++++++ .../doceditor/office365/Office365Service.java | 2 ++ .../office365/manager/Office365ServiceImpl.java | 5 +++++ .../doceditor/onlyoffice/OnlyOfficeEditor.java | 9 +++++++++ .../doceditor/onlyoffice/OnlyOfficeService.java | 2 ++ .../onlyoffice/manager/OnlyOfficeServiceImpl.java | 5 +++++ 15 files changed, 97 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/olat/core/commons/editor/fileeditor/FileEditor.java b/src/main/java/org/olat/core/commons/editor/fileeditor/FileEditor.java index 158c13ada87..d6f631e49ea 100644 --- a/src/main/java/org/olat/core/commons/editor/fileeditor/FileEditor.java +++ b/src/main/java/org/olat/core/commons/editor/fileeditor/FileEditor.java @@ -26,6 +26,7 @@ import java.util.Locale; import org.olat.core.commons.services.doceditor.DocEditor; import org.olat.core.commons.services.doceditor.DocEditorConfigs; import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback; +import org.olat.core.commons.services.vfs.VFSMetadata; import org.olat.core.gui.UserRequest; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; @@ -94,6 +95,14 @@ public class FileEditor implements DocEditor { return false; } + @Override + public boolean isLockedForMe(VFSLeaf vfsLeaf, VFSMetadata metadata, Identity identity, Mode mode) { + if (Mode.EDIT.equals(mode)) { + return lockManager.isLockedForMe(vfsLeaf, metadata, identity, VFSLockApplicationType.vfs, null); + } + return false; + } + @Override public Controller getRunController(UserRequest ureq, WindowControl wControl, Identity identity, VFSLeaf vfsLeaf, DocEditorSecurityCallback secCallback, DocEditorConfigs configs) { diff --git a/src/main/java/org/olat/core/commons/modules/bc/components/FolderComponent.java b/src/main/java/org/olat/core/commons/modules/bc/components/FolderComponent.java index ea892d27c3c..b8de142be5b 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/components/FolderComponent.java +++ b/src/main/java/org/olat/core/commons/modules/bc/components/FolderComponent.java @@ -34,6 +34,7 @@ import java.util.Iterator; import java.util.List; import java.util.Locale; +import org.apache.logging.log4j.Logger; import org.olat.core.CoreSpringFactory; import org.olat.core.commons.controllers.linkchooser.CustomLinkTreeModel; import org.olat.core.commons.modules.bc.FolderLoggingAction; @@ -43,6 +44,7 @@ import org.olat.core.commons.modules.bc.comparators.LockComparator; import org.olat.core.commons.services.analytics.AnalyticsModule; import org.olat.core.commons.services.analytics.AnalyticsSPI; import org.olat.core.commons.services.vfs.VFSMetadata; +import org.olat.core.commons.services.vfs.VFSRepositoryModule; import org.olat.core.commons.services.vfs.VFSRepositoryService; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.AbstractComponent; @@ -50,7 +52,6 @@ import org.olat.core.gui.components.ComponentRenderer; import org.olat.core.gui.control.Event; import org.olat.core.gui.translator.Translator; import org.olat.core.id.IdentityEnvironment; -import org.apache.logging.log4j.Logger; import org.olat.core.logging.Tracing; import org.olat.core.logging.activity.CoreLoggingResourceable; import org.olat.core.logging.activity.ThreadLocalUserActivityLogger; @@ -83,7 +84,6 @@ public class FolderComponent extends AbstractComponent { private IdentityEnvironment identityEnv; private VFSContainer rootContainer; private VFSContainer currentContainer; - private VFSMetadata currentMetadata; private String currentContainerPath; private String currentSortOrder; // need to know our children in advance in order to be able to identify them later... @@ -98,6 +98,7 @@ public class FolderComponent extends AbstractComponent { private final VFSContainer externContainerForCopy; private final AnalyticsSPI analyticsSpi; + private final VFSRepositoryModule vfsRepositoryModule; private final VFSRepositoryService vfsRepositoryService; /** @@ -127,6 +128,7 @@ public class FolderComponent extends AbstractComponent { super(name); analyticsSpi = CoreSpringFactory.getImpl(AnalyticsModule.class).getAnalyticsProvider(); vfsRepositoryService = CoreSpringFactory.getImpl(VFSRepositoryService.class); + vfsRepositoryModule = CoreSpringFactory.getImpl(VFSRepositoryModule.class); this.identityEnv = ureq.getUserSession().getIdentityEnvironment(); this.filter = filter; @@ -384,21 +386,19 @@ public class FolderComponent extends AbstractComponent { public boolean setCurrentContainerPath(String relPath) { // get the container setDirty(true); - currentMetadata = null; if (relPath == null) relPath = "/"; - if (!(relPath.charAt(0) == '/')) relPath = "/" + relPath; + if (relPath.charAt(0) != '/') relPath = "/" + relPath; VFSItem vfsItem = rootContainer.resolve(relPath); if (!(vfsItem instanceof VFSContainer)) { // unknown path, reset to root contaner... currentContainer = rootContainer; - relPath = ""; return false; } currentContainer = (VFSContainer)vfsItem; - if(currentContainer.canMeta() == VFSConstants.YES) { - currentMetadata = vfsRepositoryService.getMetadataFor(currentContainer); + if(currentContainer.canMeta() == VFSConstants.YES && !vfsRepositoryModule.isMigrated()) { + VFSMetadata currentMetadata = vfsRepositoryService.getMetadataFor(currentContainer); if(currentMetadata != null && !"migrated".equals(currentMetadata.getMigrated())) { vfsRepositoryService.migrate(currentContainer, currentMetadata); } diff --git a/src/main/java/org/olat/core/commons/modules/bc/components/ListRenderer.java b/src/main/java/org/olat/core/commons/modules/bc/components/ListRenderer.java index 4b6e42330d3..79f5d8d454d 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/components/ListRenderer.java +++ b/src/main/java/org/olat/core/commons/modules/bc/components/ListRenderer.java @@ -450,7 +450,7 @@ public class ListRenderer { if (!xssErrors) { Identity identity = fc.getIdentityEnvironnement().getIdentity(); Roles roles = fc.getIdentityEnvironnement().getRoles(); - String openIcon = getOpenIconCss(child, canWrite, identity, roles); + String openIcon = getOpenIconCss(child, metadata, canWrite, identity, roles); if (openIcon != null) { sb.append("<a "); ubu.buildHrefAndOnclick(sb, null, iframePostEnabled, false, false, @@ -513,7 +513,7 @@ public class ListRenderer { sb.append("</td></tr>"); } - private String getOpenIconCss(VFSItem child, boolean canWrite, Identity identity, Roles roles) { + private String getOpenIconCss(VFSItem child, VFSMetadata metadata, boolean canWrite, Identity identity, Roles roles) { if (child instanceof VFSLeaf) { VFSLeaf vfsLeaf = (VFSLeaf) child; boolean hasMeta = vfsLeaf.canMeta() == VFSConstants.YES; @@ -522,9 +522,9 @@ public class ListRenderer { .withHasMeta(hasMeta); DocEditorSecurityCallback editSecCallback = secCallbackBuilder.withMode(Mode.EDIT).build(); DocEditorSecurityCallback viewSecCallback = secCallbackBuilder.withMode(Mode.VIEW).build(); - if (canWrite && docEditorService.hasEditor(identity, roles, vfsLeaf, editSecCallback)) { + if (canWrite && docEditorService.hasEditor(identity, roles, vfsLeaf, metadata, editSecCallback)) { return "o_icon_edit"; - } else if (docEditorService.hasEditor(identity, roles, vfsLeaf, viewSecCallback)) { + } else if (docEditorService.hasEditor(identity, roles, vfsLeaf, metadata, viewSecCallback)) { return "o_icon_preview"; } } diff --git a/src/main/java/org/olat/core/commons/services/doceditor/DocEditor.java b/src/main/java/org/olat/core/commons/services/doceditor/DocEditor.java index 59784e083c9..abc521cd2d6 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/DocEditor.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/DocEditor.java @@ -21,6 +21,7 @@ package org.olat.core.commons.services.doceditor; import java.util.Locale; +import org.olat.core.commons.services.vfs.VFSMetadata; import org.olat.core.gui.UserRequest; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; @@ -75,6 +76,8 @@ public interface DocEditor { */ boolean isLockedForMe(VFSLeaf vfsLeaf, Identity identity, Mode mode); + boolean isLockedForMe(VFSLeaf vfsLeaf, VFSMetadata metadata, Identity identity, Mode mode); + Controller getRunController(UserRequest ureq, WindowControl wControl, Identity identity, VFSLeaf vfsLeaf, DocEditorSecurityCallback securityCallback, DocEditorConfigs configs); diff --git a/src/main/java/org/olat/core/commons/services/doceditor/DocumentEditorService.java b/src/main/java/org/olat/core/commons/services/doceditor/DocumentEditorService.java index 9ab921c30f7..f9da1785c68 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/DocumentEditorService.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/DocumentEditorService.java @@ -23,6 +23,7 @@ import java.util.List; import java.util.Optional; import org.olat.core.commons.services.doceditor.DocEditor.Mode; +import org.olat.core.commons.services.vfs.VFSMetadata; import org.olat.core.id.Identity; import org.olat.core.id.Roles; import org.olat.core.util.vfs.VFSLeaf; @@ -80,4 +81,17 @@ public interface DocumentEditorService { */ public boolean hasEditor(Identity identity, Roles roles, VFSLeaf vfsLeaf, DocEditorSecurityCallback secCallback); + /** + * This is an optimized version of the method for list where the metadata is + * loaded for a whole directory. + * + * @param identity The user identity + * @param roles The roles of the user + * @param vfsLeaf The file + * @param metadata The metadata + * @param secCallback + * @return + */ + public boolean hasEditor(Identity identity, Roles roles, VFSLeaf vfsLeaf, VFSMetadata metadata, DocEditorSecurityCallback secCallback); + } diff --git a/src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraEditor.java b/src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraEditor.java index 6650938c40e..c9d82901dd9 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraEditor.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraEditor.java @@ -26,6 +26,7 @@ import org.olat.core.commons.services.doceditor.DocEditorConfigs; import org.olat.core.commons.services.doceditor.DocEditorIdentityService; import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback; import org.olat.core.commons.services.doceditor.collabora.ui.CollaboraEditorController; +import org.olat.core.commons.services.vfs.VFSMetadata; import org.olat.core.gui.UserRequest; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; @@ -99,6 +100,14 @@ public class CollaboraEditor implements DocEditor { return false; } + @Override + public boolean isLockedForMe(VFSLeaf vfsLeaf, VFSMetadata metadata, Identity identity, Mode mode) { + if (collaboraService.isLockNeeded(mode)) { + return collaboraService.isLockedForMe(vfsLeaf, metadata, identity); + } + return false; + } + @Override public Controller getRunController(UserRequest ureq, WindowControl wControl, Identity identity, VFSLeaf vfsLeaf, DocEditorSecurityCallback securityCallback, DocEditorConfigs configs) { diff --git a/src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraService.java b/src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraService.java index a24e4cc9c32..8d2ac7ca173 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraService.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraService.java @@ -64,6 +64,8 @@ public interface CollaboraService { boolean isLockNeeded(Mode mode); boolean isLockedForMe(VFSLeaf vfsLeaf, Identity identity); + + boolean isLockedForMe(VFSLeaf vfsLeaf, VFSMetadata metadata, Identity identity); LockResult lock(VFSLeaf vfsLeaf, Identity identity); diff --git a/src/main/java/org/olat/core/commons/services/doceditor/collabora/manager/CollaboraServiceImpl.java b/src/main/java/org/olat/core/commons/services/doceditor/collabora/manager/CollaboraServiceImpl.java index 6c207e8dca8..59a3b4af809 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/collabora/manager/CollaboraServiceImpl.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/collabora/manager/CollaboraServiceImpl.java @@ -196,6 +196,11 @@ public class CollaboraServiceImpl implements CollaboraService, GenericEventListe public boolean isLockedForMe(VFSLeaf vfsLeaf, Identity identity) { return lockManager.isLockedForMe(vfsLeaf, identity, VFSLockApplicationType.collaboration, LOCK_APP); } + + @Override + public boolean isLockedForMe(VFSLeaf vfsLeaf, VFSMetadata metadata, Identity identity) { + return lockManager.isLockedForMe(vfsLeaf, metadata, identity, VFSLockApplicationType.collaboration, LOCK_APP); + } @Override public LockResult lock(VFSLeaf vfsLeaf, Identity identity) { diff --git a/src/main/java/org/olat/core/commons/services/doceditor/manager/DocumentEditorServiceImpl.java b/src/main/java/org/olat/core/commons/services/doceditor/manager/DocumentEditorServiceImpl.java index 9d6664523ee..d9ebf9be192 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/manager/DocumentEditorServiceImpl.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/manager/DocumentEditorServiceImpl.java @@ -27,6 +27,7 @@ import org.olat.core.commons.services.doceditor.DocEditor; import org.olat.core.commons.services.doceditor.DocEditor.Mode; import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback; import org.olat.core.commons.services.doceditor.DocumentEditorService; +import org.olat.core.commons.services.vfs.VFSMetadata; import org.olat.core.id.Identity; import org.olat.core.id.Roles; import org.olat.core.util.FileUtils; @@ -87,6 +88,16 @@ public class DocumentEditorServiceImpl implements DocumentEditorService { .isPresent(); } - + @Override + public boolean hasEditor(Identity identity, Roles roles, VFSLeaf vfsLeaf, VFSMetadata metadata, DocEditorSecurityCallback secCallback) { + String suffix = FileUtils.getFileSuffix(vfsLeaf.getName()); + return editors.stream() + .filter(DocEditor::isEnable) + .filter(editor -> editor.isEnabledFor(identity, roles)) + .filter(editor -> editor.isSupportingFormat(suffix, secCallback.getMode(), secCallback.hasMeta())) + .filter(editor -> !editor.isLockedForMe(vfsLeaf, metadata, identity, secCallback.getMode())) + .findFirst() + .isPresent(); + } } diff --git a/src/main/java/org/olat/core/commons/services/doceditor/office365/Office365Editor.java b/src/main/java/org/olat/core/commons/services/doceditor/office365/Office365Editor.java index 69c031678be..fef2420a1b2 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/office365/Office365Editor.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/office365/Office365Editor.java @@ -26,6 +26,7 @@ import org.olat.core.commons.services.doceditor.DocEditorConfigs; import org.olat.core.commons.services.doceditor.DocEditorIdentityService; import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback; import org.olat.core.commons.services.doceditor.office365.ui.Office365EditorController; +import org.olat.core.commons.services.vfs.VFSMetadata; import org.olat.core.gui.UserRequest; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; @@ -98,6 +99,14 @@ public class Office365Editor implements DocEditor { } return false; } + + @Override + public boolean isLockedForMe(VFSLeaf vfsLeaf, VFSMetadata metadata, Identity identity, Mode mode) { + if (office365Service.isLockNeeded(mode)) { + return office365Service.isLockedForMe(vfsLeaf, metadata, identity); + } + return false; + } @Override public Controller getRunController(UserRequest ureq, WindowControl wControl, Identity identity, VFSLeaf vfsLeaf, diff --git a/src/main/java/org/olat/core/commons/services/doceditor/office365/Office365Service.java b/src/main/java/org/olat/core/commons/services/doceditor/office365/Office365Service.java index bc49f5fd44a..53230fe632c 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/office365/Office365Service.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/office365/Office365Service.java @@ -64,6 +64,8 @@ public interface Office365Service { boolean isLockNeeded(Mode mode); boolean isLockedForMe(VFSLeaf vfsLeaf, Identity identity); + + boolean isLockedForMe(VFSLeaf vfsLeaf, VFSMetadata metadata, Identity identity); String getLockToken(VFSLeaf vfsLeaf); diff --git a/src/main/java/org/olat/core/commons/services/doceditor/office365/manager/Office365ServiceImpl.java b/src/main/java/org/olat/core/commons/services/doceditor/office365/manager/Office365ServiceImpl.java index 59082e5faca..87b2c94e3d6 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/office365/manager/Office365ServiceImpl.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/office365/manager/Office365ServiceImpl.java @@ -304,6 +304,11 @@ public class Office365ServiceImpl implements Office365Service, GenericEventListe public boolean isLockedForMe(VFSLeaf vfsLeaf, Identity identity) { return lockManager.isLockedForMe(vfsLeaf, identity, VFSLockApplicationType.collaboration, LOCK_APP); } + + @Override + public boolean isLockedForMe(VFSLeaf vfsLeaf, VFSMetadata metadata, Identity identity) { + return lockManager.isLockedForMe(vfsLeaf, metadata, identity, VFSLockApplicationType.collaboration, LOCK_APP); + } @Override public String getLockToken(VFSLeaf vfsLeaf) { diff --git a/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/OnlyOfficeEditor.java b/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/OnlyOfficeEditor.java index 2e8ea713429..5792510378c 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/OnlyOfficeEditor.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/OnlyOfficeEditor.java @@ -26,6 +26,7 @@ import org.olat.core.commons.services.doceditor.DocEditorConfigs; import org.olat.core.commons.services.doceditor.DocEditorIdentityService; import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback; import org.olat.core.commons.services.doceditor.onlyoffice.ui.OnlyOfficeEditorController; +import org.olat.core.commons.services.vfs.VFSMetadata; import org.olat.core.gui.UserRequest; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; @@ -99,6 +100,14 @@ public class OnlyOfficeEditor implements DocEditor { return false; } + @Override + public boolean isLockedForMe(VFSLeaf vfsLeaf, VFSMetadata metadata, Identity identity, Mode mode) { + if (onlyOfficeService.isLockNeeded(mode)) { + return onlyOfficeService.isLockedForMe(vfsLeaf, metadata, identity); + } + return false; + } + @Override public Controller getRunController(UserRequest ureq, WindowControl wControl, Identity identity, VFSLeaf vfsLeaf, DocEditorSecurityCallback securityCallback, DocEditorConfigs configs) { diff --git a/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/OnlyOfficeService.java b/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/OnlyOfficeService.java index 9c142186dec..202ddcff46d 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/OnlyOfficeService.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/OnlyOfficeService.java @@ -53,6 +53,8 @@ public interface OnlyOfficeService { boolean isLockNeeded(Mode mode); boolean isLockedForMe(VFSLeaf vfsLeaf, Identity identity); + + boolean isLockedForMe(VFSLeaf vfsLeaf, VFSMetadata metadata, Identity identity); LockResult lock(VFSLeaf vfsLeaf, Identity identity); diff --git a/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/manager/OnlyOfficeServiceImpl.java b/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/manager/OnlyOfficeServiceImpl.java index dae9c6df7df..4c97fb8e372 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/manager/OnlyOfficeServiceImpl.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/manager/OnlyOfficeServiceImpl.java @@ -279,6 +279,11 @@ public class OnlyOfficeServiceImpl implements OnlyOfficeService { return lockManager.isLockedForMe(vfsLeaf, identity, VFSLockApplicationType.collaboration, LOCK_APP_NAME); } + @Override + public boolean isLockedForMe(VFSLeaf vfsLeaf, VFSMetadata metadata, Identity identity) { + return lockManager.isLockedForMe(vfsLeaf, metadata, identity, VFSLockApplicationType.collaboration, LOCK_APP_NAME); + } + @Override public LockResult lock(VFSLeaf vfsLeaf, Identity identity) { LockResult lock = lockManager.lock(vfsLeaf, identity, VFSLockApplicationType.collaboration, LOCK_APP_NAME); -- GitLab