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 158c13ada874be8b571f5a0e7d138b05f4ca38c7..d6f631e49ea5613e8cd205167725f1ee01463726 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 ea892d27c3c284b9a9d24fa38647632c4337c2bb..b8de142be5b1fbcb904426261073c395b80e13c8 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 4b6e42330d3e5244b4c154efdb74b65f2a7ec1fb..79f5d8d454d38d4e8295b9bf803875bea9c5dae5 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 59784e083c947eeb5eca98b6170eaf2d59e7b806..abc521cd2d619fdff078e2689d2e7314aec41503 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 9ab921c30f7cdacc1f7ecb2f5c663df439752ec8..f9da1785c68171d93761228339f4c3f22c12876c 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 6650938c40e7afe4bf6ae384f1d957c62fea3b74..c9d82901dd9c4fd7aa0bc02d6be81525b2a9e248 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 a24e4cc9c327113406d422d50f9e9f06a2b2d96c..8d2ac7ca173d90e18e27a9ce9a281fadb42f0e0d 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 6c207e8dca8215b5e7c264d69a2da6d1142b70f3..59a3b4af809fabbabe15d1d8d4946a587e55f6e8 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 9d6664523ee7104254834e379592c3632d00fbf6..d9ebf9be1929d8a43b3229aaea5c636381f0f5a5 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 69c031678be952bdceb794ea5c217bdea909b494..fef2420a1b2edec1a32ee9c8b27b611efb66baf6 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 bc49f5fd44afa85274778aa27ed439a118fcf947..53230fe632c40277b1c64f3b3cbe7bb84b4933a8 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 59082e5facab46ad91485f203bdaf173f1b50d38..87b2c94e3d6771a9b29c05508c6311ff130fec28 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 2e8ea713429e616d18591560683e62dd9e7fa03b..5792510378cbd04d2191f807950388d2de422e48 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 9c142186decaa5ac3d0e6daad5d302724419a055..202ddcff46d691e45361d2f60cc3a37a4d45d1d4 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 dae9c6df7dfd1981432f42b4b560eca3506a97a8..4c97fb8e3720cd405ad5da0dd13e49c3cb0654c7 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);