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