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 74b696fb196e3bdcae71957dcc25ff5b7ed9027a..7d2d41aae43ce04197df26d9a55bea9b1b7c9946 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 @@ -70,13 +70,13 @@ public class FileEditor implements DocEditor { } @Override - public boolean isSupportingFormat(String suffix, Mode mode) { + public boolean isSupportingFormat(String suffix, Mode mode, boolean hasMeta) { // Both the HTML editor and the text editor supports view and edit return HTML_EDITOR_SUFFIX.contains(suffix) || TEXT_EDITOR_SUFFIX.contains(suffix)? true: false; } @Override - public boolean isLockedForMe(VFSLeaf vfsLeaf, Mode mode, Identity identity) { + public boolean isLockedForMe(VFSLeaf vfsLeaf, Identity identity, Mode mode) { if (Mode.EDIT.equals(mode)) { return lockManager.isLockedForMe(vfsLeaf, identity, VFSLockApplicationType.vfs, null); } diff --git a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdCreateFile.java b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdCreateFile.java index de6661007953f72758524d08346f81071b36a1a3..a092b8770562219b4aeccaff168b991d44f95f45 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdCreateFile.java +++ b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdCreateFile.java @@ -29,7 +29,6 @@ import java.util.List; import org.olat.core.commons.editor.htmleditor.HTMLEditorConfig; import org.olat.core.commons.modules.bc.FolderEvent; -import org.olat.core.commons.modules.bc.FolderLicenseHandler; import org.olat.core.commons.modules.bc.components.FolderComponent; import org.olat.core.commons.services.doceditor.DocEditor; import org.olat.core.commons.services.doceditor.DocEditorConfigs; @@ -39,11 +38,8 @@ import org.olat.core.commons.services.doceditor.DocTemplates; import org.olat.core.commons.services.doceditor.DocumentEditorService; import org.olat.core.commons.services.doceditor.ui.CreateDocumentController; import org.olat.core.commons.services.doceditor.ui.DocEditorFullscreenController; -import org.olat.core.commons.services.license.LicenseModule; -import org.olat.core.commons.services.license.LicenseService; import org.olat.core.commons.services.notifications.NotificationsManager; import org.olat.core.commons.services.notifications.SubscriptionContext; -import org.olat.core.commons.services.vfs.VFSRepositoryService; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.control.Controller; @@ -81,14 +77,6 @@ public class CmdCreateFile extends BasicController implements FolderCommand { private VFSLeaf vfsLeaf; - @Autowired - private LicenseService licenseService; - @Autowired - private LicenseModule licenseModule; - @Autowired - private FolderLicenseHandler licenseHandler; - @Autowired - private VFSRepositoryService vfsRepositoryService; @Autowired private DocumentEditorService docEditorService; @@ -113,7 +101,8 @@ public class CmdCreateFile extends BasicController implements FolderCommand { return null; } - DocTemplates docTemplates = DocTemplates.editables(getLocale()).build(); + boolean hasMeta = folderComponent.getCurrentContainer().canMeta() == VFSConstants.YES; + DocTemplates docTemplates = DocTemplates.editables(getLocale(), hasMeta).build(); createCtrl = new CreateDocumentController(ureq, wControl, folderComponent.getCurrentContainer(), docTemplates); listenTo(createCtrl); @@ -164,8 +153,11 @@ public class CmdCreateFile extends BasicController implements FolderCommand { } private void doEdit(UserRequest ureq) { + VFSContainer currentContainer = folderComponent.getCurrentContainer(); + boolean hasMeta = currentContainer.canMeta() == VFSConstants.YES; + String suffix = FileUtils.getFileSuffix(vfsLeaf.getName()); - List<DocEditor> editors = docEditorService.getEditors(suffix, DocEditor.Mode.EDIT); + List<DocEditor> editors = docEditorService.getEditors(suffix, DocEditor.Mode.EDIT, hasMeta); // Not able to decide which editor to use -> show the folder list if (editors.size() != 1) { fireEvent(ureq, new FolderEvent(FolderEvent.NEW_FILE_EVENT, fileName)); @@ -175,6 +167,7 @@ public class CmdCreateFile extends BasicController implements FolderCommand { DocEditorSecurityCallback secCallback = DocEditorSecurityCallbackBuilder.builder() .withMode(DocEditor.Mode.EDIT) + .withHasMeta(hasMeta) .withVersionControlled(true) .build(); HTMLEditorConfig htmlEditorConfig = getHtmlEditorConfig(); diff --git a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdOpenContent.java b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdOpenContent.java index 95f798b810dfabf68b82ad2e208325a2c46cec7a..868eda8ce31092c649b628c3178c593f23d49df0 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdOpenContent.java +++ b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdOpenContent.java @@ -38,6 +38,7 @@ import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.controller.BasicController; import org.olat.core.gui.translator.Translator; import org.olat.core.util.StringHelper; +import org.olat.core.util.vfs.VFSConstants; import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSItem; import org.olat.core.util.vfs.VFSLeaf; @@ -103,12 +104,8 @@ public class CmdOpenContent extends BasicController implements FolderCommand { } VFSLeaf vfsLeaf = (VFSLeaf) currentItem; - VFSContainer container = VFSManager.findInheritingSecurityCallbackContainer(folderComponent.getCurrentContainer()); - VFSSecurityCallback containerSecCallback = container.getLocalSecurityCallback(); - DocEditorSecurityCallback secCallback = DocEditorSecurityCallbackBuilder.builder() - .withMode(getMode(vfsLeaf, containerSecCallback.canWrite())) - .withVersionControlled(true) - .build(); + + DocEditorSecurityCallback secCallback = getDocEditorSecCallback(vfsLeaf); HTMLEditorConfig htmlEditorConfig = getHtmlEditorConfig(vfsLeaf); DocEditorConfigs configs = DocEditorConfigs.builder() .addConfig(htmlEditorConfig) @@ -119,9 +116,26 @@ public class CmdOpenContent extends BasicController implements FolderCommand { return this; } - private DocEditor.Mode getMode(VFSLeaf vfsLeaf, boolean canWrite) { - if (canWrite && docEditorService.hasEditor(vfsLeaf, DocEditor.Mode.EDIT, getIdentity())) { - return DocEditor.Mode.EDIT; + private DocEditorSecurityCallback getDocEditorSecCallback(VFSLeaf vfsLeaf) { + VFSContainer currentContainer = folderComponent.getCurrentContainer(); + boolean hasMeta = currentContainer.canMeta() == VFSConstants.YES; + VFSContainer container = VFSManager.findInheritingSecurityCallbackContainer(currentContainer); + boolean canWrite = container.getLocalSecurityCallback().canWrite(); + + DocEditorSecurityCallbackBuilder secCallbackBuilder = DocEditorSecurityCallbackBuilder.builder() + .withVersionControlled(true) + .withHasMeta(hasMeta); + DocEditor.Mode mode = getMode(vfsLeaf, canWrite, secCallbackBuilder); + secCallbackBuilder.withMode(mode); + return secCallbackBuilder.build(); + } + + private DocEditor.Mode getMode(VFSLeaf vfsLeaf, boolean canWrite, DocEditorSecurityCallbackBuilder secCallbackBuilder) { + if (canWrite) { + DocEditorSecurityCallback editSecCallback = secCallbackBuilder.withMode(DocEditor.Mode.EDIT).build(); + if (docEditorService.hasEditor(vfsLeaf, getIdentity(), editSecCallback)) { + return DocEditor.Mode.EDIT; + } } return DocEditor.Mode.VIEW; } 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 fd7e28d4a7dd4b41cb11d08c2d8a623aa55ca5c9..4c8b99219154e50ad26829306a4d3470d2eb2ae1 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 @@ -38,6 +38,8 @@ import org.olat.core.commons.modules.bc.FileSelection; import org.olat.core.commons.modules.bc.FolderLicenseHandler; import org.olat.core.commons.modules.bc.FolderManager; import org.olat.core.commons.services.doceditor.DocEditor.Mode; +import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback; +import org.olat.core.commons.services.doceditor.DocEditorSecurityCallbackBuilder; import org.olat.core.commons.services.doceditor.DocumentEditorService; import org.olat.core.commons.services.license.License; import org.olat.core.commons.services.license.LicenseHandler; @@ -513,9 +515,15 @@ public class ListRenderer { private String getOpenIconCss(VFSItem child, boolean canWrite, Identity identity) { if (child instanceof VFSLeaf) { VFSLeaf vfsLeaf = (VFSLeaf) child; - if (canWrite && docEditorService.hasEditor(vfsLeaf, Mode.EDIT, identity)) { + boolean hasMeta = vfsLeaf.canMeta() == VFSConstants.YES; + DocEditorSecurityCallbackBuilder secCallbackBuilder = DocEditorSecurityCallbackBuilder.builder() + .withVersionControlled(true) + .withHasMeta(hasMeta); + DocEditorSecurityCallback editSecCallback = secCallbackBuilder.withMode(Mode.EDIT).build(); + DocEditorSecurityCallback viewSecCallback = secCallbackBuilder.withMode(Mode.VIEW).build(); + if (canWrite && docEditorService.hasEditor(vfsLeaf, identity, editSecCallback)) { return "o_icon_edit"; - } else if (docEditorService.hasEditor(vfsLeaf, Mode.VIEW, identity)) { + } else if (docEditorService.hasEditor(vfsLeaf, identity, 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 3720ab016f355b11c5fa812d52ef50f9f0d1d8dd..3f518075c31a8c06234cf60196aa74ed526f400b 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 @@ -48,19 +48,20 @@ public interface DocEditor { * * @param suffix * @param mode + * @param hasMeta * @return */ - boolean isSupportingFormat(String suffix, Mode mode); + boolean isSupportingFormat(String suffix, Mode mode, boolean hasMeta); /** * Checks whether a file is locked for this identity and editor. * * @param vfsLeaf - * @param mode * @param identity + * @param mode * @return true if the file is locked and therefore the identity is not able to edit the vfsLeaf with this editor. */ - boolean isLockedForMe(VFSLeaf vfsLeaf, Mode mode, Identity identity); + boolean isLockedForMe(VFSLeaf vfsLeaf, 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/DocEditorSecurityCallback.java b/src/main/java/org/olat/core/commons/services/doceditor/DocEditorSecurityCallback.java index b100e62146d852040b9434e21814100210d5bfac..0b7ef142970fa9a03ed3016bdb7ffddc48b3b9d3 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/DocEditorSecurityCallback.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/DocEditorSecurityCallback.java @@ -30,9 +30,11 @@ import org.olat.core.commons.services.doceditor.DocEditor.Mode; public interface DocEditorSecurityCallback { Mode getMode(); + + boolean hasMeta(); boolean isVersionControlled(); - + boolean canClose(); } diff --git a/src/main/java/org/olat/core/commons/services/doceditor/DocEditorSecurityCallbackBuilder.java b/src/main/java/org/olat/core/commons/services/doceditor/DocEditorSecurityCallbackBuilder.java index a82c7db4013b7c4889b2a78c6fc146d4bdc4ea70..c26b37f6fd4bd75688bbb47e8cc0ea9262a93b93 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/DocEditorSecurityCallbackBuilder.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/DocEditorSecurityCallbackBuilder.java @@ -30,6 +30,7 @@ import org.olat.core.commons.services.doceditor.DocEditor.Mode; public class DocEditorSecurityCallbackBuilder { private Mode mode = Mode.VIEW; + private boolean hasMeta = true; private boolean versionControlled = false; private boolean canClose = true; @@ -44,6 +45,17 @@ public class DocEditorSecurityCallbackBuilder { return this; } + /** + * Default: true + * + * @param hasMeta + * @return + */ + public DocEditorSecurityCallbackBuilder withHasMeta(boolean hasMeta) { + this.hasMeta = hasMeta; + return this; + } + /** * Default: false * @@ -69,6 +81,7 @@ public class DocEditorSecurityCallbackBuilder { public DocEditorSecurityCallback build() { VFSLeafEditorSecurityCallbackImpl secCallback = new VFSLeafEditorSecurityCallbackImpl(); secCallback.setMode(this.mode); + secCallback.setHasMeta(this.hasMeta); secCallback.setVersionControlled(this.versionControlled); secCallback.setCanClose(this.canClose); return secCallback; @@ -81,6 +94,7 @@ public class DocEditorSecurityCallbackBuilder { public static DocEditorSecurityCallbackBuilder clone(DocEditorSecurityCallback secCallback) { return builder() .withMode(secCallback.getMode()) + .withHasMeta(secCallback.hasMeta()) .withVersionControlled(secCallback.isVersionControlled()) .canClose(secCallback.canClose()); } @@ -91,6 +105,7 @@ public class DocEditorSecurityCallbackBuilder { private static class VFSLeafEditorSecurityCallbackImpl implements DocEditorSecurityCallback { private Mode mode; + private boolean hasMeta; private boolean versionControlled; private boolean canClose; @@ -103,6 +118,15 @@ public class DocEditorSecurityCallbackBuilder { this.mode = mode; } + @Override + public boolean hasMeta() { + return hasMeta; + } + + private void setHasMeta(boolean hasMeta) { + this.hasMeta = hasMeta; + } + @Override public boolean isVersionControlled() { return versionControlled; diff --git a/src/main/java/org/olat/core/commons/services/doceditor/DocTemplates.java b/src/main/java/org/olat/core/commons/services/doceditor/DocTemplates.java index b03bbc79e5139ac001446635d35b108d5fd82491..be40c55a462ccf6f6ee6e421da06dd380a39ab8a 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/DocTemplates.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/DocTemplates.java @@ -56,27 +56,27 @@ public class DocTemplates { return docTemplates.isEmpty(); } - public static Builder editables(Locale locale) { + public static Builder editables(Locale locale, boolean hasMeta) { Builder builder = new Builder(locale); DocumentEditorService docEditorService = CoreSpringFactory.getImpl(DocumentEditorService.class); - if (docEditorService.hasEditor("txt", EDIT)) { + if (docEditorService.hasEditor("txt", EDIT, hasMeta)) { builder.addTxt(); } - if (docEditorService.hasEditor("html", EDIT)) { + if (docEditorService.hasEditor("html", EDIT, hasMeta)) { builder.addHtml(); } - if (docEditorService.hasEditor("css", EDIT)) { + if (docEditorService.hasEditor("css", EDIT, hasMeta)) { builder.addCss(); } - if (docEditorService.hasEditor("docx", EDIT)) { + if (docEditorService.hasEditor("docx", EDIT, hasMeta)) { builder.addDocx(); } - if (docEditorService.hasEditor("xlsx", EDIT)) { + if (docEditorService.hasEditor("xlsx", EDIT, hasMeta)) { builder.addXlsx(); } - if (docEditorService.hasEditor("pptx", EDIT)) { + if (docEditorService.hasEditor("pptx", EDIT, hasMeta)) { builder.addPptx(); } 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 0b79e2d75fa9805778254838a32f82a711a704db..0780c89a4c63d02a11df264b34ac4544460d134e 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 @@ -39,18 +39,20 @@ public interface DocumentEditorService { * * @param suffix * @param mode + * @param hasMeta * @return */ - public boolean hasEditor(String suffix, Mode mode); + public boolean hasEditor(String suffix, Mode mode, boolean hasMeta); /** - * Get all enabled editors which support a file with a specific suffix. Support means usually edit or read. + * Get all enabled editors which support a file with a specific suffix. * * @param suffix * @param mode + * @param hasMeta * @return */ - public List<DocEditor> getEditors(String suffix, Mode mode); + public List<DocEditor> getEditors(String suffix, Mode mode, boolean hasMeta); /** * Get the editor of a specific type. @@ -63,13 +65,13 @@ public interface DocumentEditorService { /** * Checks whether a vfsLeaf can be opened in any editor by a user and in a * specific mode. This method checks not only if a file format is supported but - * also if the vfsLeaf is not locked by an other editor or user. + * also e.g. if the vfsLeaf is not locked by an other editor or user. * * @param vfsLeaf - * @param mode * @param identity + * @param secCallback * @return */ - public boolean hasEditor(VFSLeaf vfsLeaf, Mode mode, Identity identity); + public boolean hasEditor(VFSLeaf vfsLeaf, Identity identity, 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 ee71e6b32a823ed6c12807566958d730d9deb17a..9b99d38b9a59ebe0b53e2e0aa2c8ef41974aa234 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 @@ -66,12 +66,12 @@ public class CollaboraEditor implements DocEditor { } @Override - public boolean isSupportingFormat(String suffix, Mode mode) { - return collaboraService.accepts(suffix, mode); + public boolean isSupportingFormat(String suffix, Mode mode, boolean hasMeta) { + return hasMeta && collaboraService.accepts(suffix, mode); } @Override - public boolean isLockedForMe(VFSLeaf vfsLeaf, Mode mode, Identity identity) { + public boolean isLockedForMe(VFSLeaf vfsLeaf, Identity identity, Mode mode) { if (collaboraService.isLockNeeded(mode)) { return collaboraService.isLockedForMe(vfsLeaf, identity); } diff --git a/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/CollaboraEditorController.java b/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/CollaboraEditorController.java index f46bbe79da89e11a8bfb269e11bff6b6d161d9d8..3be987c5dd4592d1ddc400a31331231ab9f6e661 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/CollaboraEditorController.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/CollaboraEditorController.java @@ -19,11 +19,12 @@ */ package org.olat.core.commons.services.doceditor.collabora.ui; +import org.olat.core.commons.services.doceditor.DocEditor.Mode; import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback; import org.olat.core.commons.services.doceditor.DocEditorSecurityCallbackBuilder; -import org.olat.core.commons.services.doceditor.DocEditor.Mode; import org.olat.core.commons.services.doceditor.collabora.CollaboraService; import org.olat.core.commons.services.doceditor.wopi.Access; +import org.olat.core.commons.services.vfs.VFSMetadata; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.velocity.VelocityContainer; @@ -67,18 +68,22 @@ public class CollaboraEditorController extends BasicController { lock = collaboraService.lock(vfsLeaf, getIdentity()); } } - this.access = collaboraService.createAccess(vfsLeaf.getMetaInfo(), getIdentity(), secCallback); - VelocityContainer mainVC = createVelocityContainer("collabora"); - - String url = CollaboraEditorUrlBuilder - .builder(access.getFileId(), access.getToken()) - .withLang(ureq.getLocale().getLanguage()) - .withCloseButton(access.canClose()) - .build(); - - mainVC.contextPut("id", "o_" + CodeHelper.getRAMUniqueID()); - mainVC.contextPut("url", url); + + VFSMetadata vfsMetadata = vfsLeaf.getMetaInfo(); + if (vfsMetadata == null) { + mainVC.contextPut("warning", translate("editor.warning.no.metadata")); + } else { + this.access = collaboraService.createAccess(vfsMetadata, getIdentity(), secCallback); + String url = CollaboraEditorUrlBuilder + .builder(access.getFileId(), access.getToken()) + .withLang(ureq.getLocale().getLanguage()) + .withCloseButton(access.canClose()) + .build(); + + mainVC.contextPut("id", "o_" + CodeHelper.getRAMUniqueID()); + mainVC.contextPut("url", url); + } putInitialPanel(mainVC); } diff --git a/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/_content/collabora.html b/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/_content/collabora.html index 2186c33be094d50dab9ee8350336c9462d16827f..3d21dadf1a138b7faf459a9fe27395a8d9ca99be 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/_content/collabora.html +++ b/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/_content/collabora.html @@ -1,23 +1,29 @@ <div class="o_collabora"> - <iframe id="$id" src="$url" allowfullscreen="true" webkitallowfullscreen="true" mozallowfullscreen="true"></iframe> - <script type="text/javascript"> - /* <![CDATA[ */ - jQuery('$id').ready(function(){ - window.addEventListener('message', function(e){ - try { - var msg = JSON.parse(e.data); - var msgId = msg.MessageId; - var args = msg.Values; - var deprecated = !!args.Deprecated; - } catch(exc) { - msgId = e.data; - } - - if (msgId === 'UI_Close' || msgId === 'close' /* deprecated */) { - $r.openJavaScriptCommand("close")); - } + #if($r.notNull($warning)) + <div class="o_warning"> + $warning + </div> + #else + <iframe id="$id" src="$url" allowfullscreen="true" webkitallowfullscreen="true" mozallowfullscreen="true"></iframe> + <script type="text/javascript"> + /* <![CDATA[ */ + jQuery('$id').ready(function(){ + window.addEventListener('message', function(e){ + try { + var msg = JSON.parse(e.data); + var msgId = msg.MessageId; + var args = msg.Values; + var deprecated = !!args.Deprecated; + } catch(exc) { + msgId = e.data; + } + + if (msgId === 'UI_Close' || msgId === 'close' /* deprecated */) { + $r.openJavaScriptCommand("close")); + } + }); }); - }); - /* ]]> */ - </script> + /* ]]> */ + </script> + #end </div> diff --git a/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/_i18n/LocalStrings_de.properties index e3c05f86be29ade552dc780c50228a6cfcd8e9ab..a66c8a053efd7567486d19e3c59cf3b650d00d43 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/_i18n/LocalStrings_de.properties @@ -7,4 +7,5 @@ admin.url=URL admin.test=Test admin.title=Collabora Online editor.display.name=Collabora Online -editor.warning.locked=Das Dokument wird bereits in einem anderen Editor bearbeitet und kann deshalb in Collabora Online nicht mehr bearbeitet werden. \ No newline at end of file +editor.warning.locked=Das Dokument wird bereits in einem anderen Editor bearbeitet und kann deshalb in Collabora Online nicht mehr bearbeitet werden. +editor.warning.no.metadata=Dieses Dokument kann nicht angezeigt werden! \ No newline at end of file diff --git a/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/_i18n/LocalStrings_en.properties index 8f490c027cde0c05102239d3998435f870ab68c7..f3eb23101becaaf4fafa16068132337b7e7c354d 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/_i18n/LocalStrings_en.properties @@ -7,4 +7,5 @@ admin.url=URL admin.test=Test admin.title=Collabora Online editor.display.name=Collabora Online -editor.warning.locked=That document is already edited in another editor and therefore it is displayed in a read-onyl view. \ No newline at end of file +editor.warning.locked=That document is already edited in another editor and therefore it is displayed in a read-onyl view. +editor.warning.no.metadata=It is not possible to display that document. \ No newline at end of file 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 e94be29f5584cf3314ee3a118864567525837850..2078998887a292470146799df80f617450a3969d 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 @@ -24,8 +24,9 @@ import java.util.Optional; import java.util.stream.Collectors; import org.olat.core.commons.services.doceditor.DocEditor; -import org.olat.core.commons.services.doceditor.DocumentEditorService; 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.id.Identity; import org.olat.core.util.FileUtils; import org.olat.core.util.vfs.VFSLeaf; @@ -45,21 +46,21 @@ public class DocumentEditorServiceImpl implements DocumentEditorService { private List<DocEditor> editors; @Override - public boolean hasEditor(String suffix, Mode mode) { + public boolean hasEditor(String suffix, Mode mode, boolean hasMeta) { if (mode == null) return false; return editors.stream() .filter(DocEditor::isEnable) - .filter(editor -> editor.isSupportingFormat(suffix, mode)) + .filter(editor -> editor.isSupportingFormat(suffix, mode, hasMeta)) .findFirst() .isPresent(); } @Override - public List<DocEditor> getEditors(String suffix, Mode mode) { + public List<DocEditor> getEditors(String suffix, Mode mode, boolean hasMeta) { return editors.stream() .filter(DocEditor::isEnable) - .filter(editor -> editor.isSupportingFormat(suffix, mode)) + .filter(editor -> editor.isSupportingFormat(suffix, mode, hasMeta)) .collect(Collectors.toList()); } @@ -72,17 +73,14 @@ public class DocumentEditorServiceImpl implements DocumentEditorService { } @Override - public boolean hasEditor(VFSLeaf vfsLeaf, Mode mode, Identity identity) { - if (mode == null) return false; - + public boolean hasEditor(VFSLeaf vfsLeaf, Identity identity, DocEditorSecurityCallback secCallback) { String suffix = FileUtils.getFileSuffix(vfsLeaf.getName()); return editors.stream() .filter(DocEditor::isEnable) - .filter(editor -> editor.isSupportingFormat(suffix, mode)) - .filter(editor -> !editor.isLockedForMe(vfsLeaf, mode, identity)) + .filter(editor -> editor.isSupportingFormat(suffix, secCallback.getMode(), secCallback.hasMeta())) + .filter(editor -> !editor.isLockedForMe(vfsLeaf, identity, secCallback.getMode())) .findFirst() .isPresent(); - } } diff --git a/src/main/java/org/olat/core/commons/services/doceditor/ui/DocEditorConfigController.java b/src/main/java/org/olat/core/commons/services/doceditor/ui/DocEditorConfigController.java index 7ba262e4cdf34ea23af630037ddc6f885fe5d02f..c34c132099ab3af46d95b365e89d20580545d7db 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/ui/DocEditorConfigController.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/ui/DocEditorConfigController.java @@ -67,7 +67,7 @@ public class DocEditorConfigController extends BasicController implements Activa super(ureq, wControl); this.guiEditorKey = getGuiPrefixKey(vfsLeaf); String suffix = FileUtils.getFileSuffix(vfsLeaf.getName()); - editors = editorService.getEditors(suffix, secCallback.getMode()); + editors = editorService.getEditors(suffix, secCallback.getMode(), secCallback.hasMeta()); VelocityContainer mainVC = createVelocityContainer("editor_config"); diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTAUIFactory.java b/src/main/java/org/olat/course/nodes/gta/ui/GTAUIFactory.java index ba3c345b977c20f9a1768fa615144597865b84e3..104e9f7643cf10105d61b7eefffc550b6aff9722 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/GTAUIFactory.java +++ b/src/main/java/org/olat/course/nodes/gta/ui/GTAUIFactory.java @@ -26,10 +26,12 @@ import java.util.Locale; import org.olat.core.CoreSpringFactory; import org.olat.core.commons.editor.htmleditor.HTMLEditorConfig; import org.olat.core.commons.services.doceditor.DocEditor.Mode; -import org.olat.core.commons.services.doceditor.DocTemplates; import org.olat.core.commons.services.doceditor.DocEditorConfigs; -import org.olat.core.commons.services.doceditor.DocumentEditorService; +import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback; +import org.olat.core.commons.services.doceditor.DocEditorSecurityCallbackBuilder; +import org.olat.core.commons.services.doceditor.DocTemplates; import org.olat.core.commons.services.doceditor.DocTemplates.Builder; +import org.olat.core.commons.services.doceditor.DocumentEditorService; import org.olat.core.id.Identity; import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSLeaf; @@ -46,9 +48,11 @@ class GTAUIFactory { static Mode getOpenMode(VFSLeaf vfsLeaf, Identity identity, boolean readOnly) { DocumentEditorService docEditorService = CoreSpringFactory.getImpl(DocumentEditorService.class); - if (!readOnly && docEditorService.hasEditor(vfsLeaf, Mode.EDIT, identity)) { + DocEditorSecurityCallback editSC = DocEditorSecurityCallbackBuilder.builder().withMode(Mode.EDIT).build(); + DocEditorSecurityCallback viewSC = DocEditorSecurityCallbackBuilder.builder().withMode(Mode.VIEW).build(); + if (!readOnly && docEditorService.hasEditor(vfsLeaf, identity, editSC)) { return Mode.EDIT; - } else if (docEditorService.hasEditor(vfsLeaf, Mode.VIEW, identity)) { + } else if (docEditorService.hasEditor(vfsLeaf, identity, viewSC)) { return Mode.VIEW; } return null; @@ -72,16 +76,16 @@ class GTAUIFactory { static DocTemplates htmlOffice(Locale locale) { DocumentEditorService docEditorService = CoreSpringFactory.getImpl(DocumentEditorService.class); Builder builder = DocTemplates.builder(locale); - if (docEditorService.hasEditor("html", EDIT)) { + if (docEditorService.hasEditor("html", EDIT, true)) { builder.addHtml(); } - if (docEditorService.hasEditor("docx", EDIT)) { + if (docEditorService.hasEditor("docx", EDIT, true)) { builder.addDocx(); } - if (docEditorService.hasEditor("xlsx", EDIT)) { + if (docEditorService.hasEditor("xlsx", EDIT, true)) { builder.addXlsx(); } - if (docEditorService.hasEditor("pptx", EDIT)) { + if (docEditorService.hasEditor("pptx", EDIT, true)) { builder.addPptx(); } return builder.build(); diff --git a/src/main/java/org/olat/modules/portfolio/handler/CreateFileHandler.java b/src/main/java/org/olat/modules/portfolio/handler/CreateFileHandler.java index 4053153fe37a1dd7ba30e6da344f143bbe058edb..f2a58e3c0cd98d00b9d1adf9679ef0d35e3d3b9a 100644 --- a/src/main/java/org/olat/modules/portfolio/handler/CreateFileHandler.java +++ b/src/main/java/org/olat/modules/portfolio/handler/CreateFileHandler.java @@ -43,13 +43,13 @@ public class CreateFileHandler extends FileHandler { public static DocTemplates getEditableTemplates(Locale locale) { DocumentEditorService docEditorService = CoreSpringFactory.getImpl(DocumentEditorService.class); Builder builder = DocTemplates.builder(locale); - if (docEditorService.hasEditor("docx", EDIT)) { + if (docEditorService.hasEditor("docx", EDIT, true)) { builder.addDocx(); } - if (docEditorService.hasEditor("xlsx", EDIT)) { + if (docEditorService.hasEditor("xlsx", EDIT, true)) { builder.addXlsx(); } - if (docEditorService.hasEditor("pptx", EDIT)) { + if (docEditorService.hasEditor("pptx", EDIT, true)) { builder.addPptx(); } return builder.build(); diff --git a/src/main/java/org/olat/modules/portfolio/ui/PageRunController.java b/src/main/java/org/olat/modules/portfolio/ui/PageRunController.java index 39325491296d1f12b563c0fe5eb8297c4ebaf01f..c2f72f736151e46a25bbd2cbf4c32e205d47db94 100644 --- a/src/main/java/org/olat/modules/portfolio/ui/PageRunController.java +++ b/src/main/java/org/olat/modules/portfolio/ui/PageRunController.java @@ -806,7 +806,7 @@ public class PageRunController extends BasicController implements TooledControll private boolean isCreateFilePossible() { List<DocTemplate> editableTemplates = CreateFileHandler.getEditableTemplates(getLocale()).getTemplates(); for (DocTemplate docTemplate: editableTemplates) { - if (vfsRepositoryService.hasEditor(docTemplate.getSuffix(), Mode.EDIT)) { + if (vfsRepositoryService.hasEditor(docTemplate.getSuffix(), Mode.EDIT, true)) { return true; } } diff --git a/src/main/java/org/olat/modules/portfolio/ui/media/FileMediaController.java b/src/main/java/org/olat/modules/portfolio/ui/media/FileMediaController.java index fb492c9f32a5c7cd0584c883a03104683719bd52..4790429ac0c20a52caec42779695d40466286930 100644 --- a/src/main/java/org/olat/modules/portfolio/ui/media/FileMediaController.java +++ b/src/main/java/org/olat/modules/portfolio/ui/media/FileMediaController.java @@ -140,13 +140,13 @@ public class FileMediaController extends BasicController implements PageElementE if (editLink != null) mainVC.remove(editLink); if (vfsLeaf != null && !hints.isToPdf()) { - Mode mode = getOpenMode(); - if (docEditorService.hasEditor(vfsLeaf, mode, getIdentity())) { + DocEditorSecurityCallback secCallback = getSecurityCallback(); + if (secCallback != null) { editLink = LinkFactory.createCustomLink("edit", "edit", "", Link.NONTRANSLATED | Link.LINK, mainVC, this); - String editIcon = Mode.EDIT.equals(mode)? "o_icon_edit": "o_icon_preview"; + String editIcon = Mode.EDIT.equals(secCallback.getMode())? "o_icon_edit": "o_icon_preview"; editLink.setIconLeftCSS("o_icon " + editIcon); - editLink.setUserObject(mode); + editLink.setUserObject(secCallback); } } } @@ -162,13 +162,15 @@ public class FileMediaController extends BasicController implements PageElementE updateUI(); } - private Mode getOpenMode() { + private DocEditorSecurityCallback getSecurityCallback() { + DocEditorSecurityCallback editSC = DocEditorSecurityCallbackBuilder.builder().withMode(Mode.EDIT).build(); + DocEditorSecurityCallback viewSC = DocEditorSecurityCallbackBuilder.builder().withMode(Mode.VIEW).build(); if (isEditingExcluded()) { return null; - } else if (editMode && docEditorService.hasEditor(vfsLeaf, Mode.EDIT, getIdentity())) { - return Mode.EDIT; - } else if (docEditorService.hasEditor(vfsLeaf, Mode.VIEW, getIdentity())) { - return Mode.VIEW; + } else if (editMode && docEditorService.hasEditor(vfsLeaf, getIdentity(), editSC)) { + return editSC; + } else if (docEditorService.hasEditor(vfsLeaf, getIdentity(), viewSC)) { + return viewSC; } return null; } @@ -181,8 +183,8 @@ public class FileMediaController extends BasicController implements PageElementE @Override protected void event(UserRequest ureq, Component source, Event event) { if (source == editLink) { - Mode mode = (Mode)editLink.getUserObject(); - doOpen(ureq, mode); + DocEditorSecurityCallback secCallback = (DocEditorSecurityCallback)editLink.getUserObject(); + doOpen(ureq, secCallback); } } @@ -201,15 +203,12 @@ public class FileMediaController extends BasicController implements PageElementE docEditorCtrl = null; } - private void doOpen(UserRequest ureq, Mode mode) { + private void doOpen(UserRequest ureq, DocEditorSecurityCallback secCallback) { VFSContainer container = fileStorage.getMediaContainer(media); VFSItem vfsItem = container.resolve(media.getRootFilename()); if(vfsItem == null || !(vfsItem instanceof VFSLeaf)) { showError("error.missing.file"); } else { - DocEditorSecurityCallback secCallback = DocEditorSecurityCallbackBuilder.builder() - .withMode(mode) - .build(); DocEditorConfigs configs = DocEditorConfigs.builder().build(); docEditorCtrl = new DocEditorFullscreenController(ureq, getWindowControl(), (VFSLeaf)vfsItem, secCallback, configs); listenTo(docEditorCtrl); diff --git a/src/main/java/org/olat/repository/handlers/DocumentEditorDelegate.java b/src/main/java/org/olat/repository/handlers/DocumentEditorDelegate.java index fb0553ae9642b6a57dd75ab2d3dd5b4a8dab227c..8860b59066c181f382937fa14035b3b9eab0f907 100644 --- a/src/main/java/org/olat/repository/handlers/DocumentEditorDelegate.java +++ b/src/main/java/org/olat/repository/handlers/DocumentEditorDelegate.java @@ -79,7 +79,7 @@ public class DocumentEditorDelegate implements WebDocumentCreateDelegate, WebDoc private boolean canEdit() { DocumentEditorService docEditorService = CoreSpringFactory.getImpl(DocumentEditorService.class); - return docEditorService.hasEditor(type.getSuffix(), Mode.EDIT); + return docEditorService.hasEditor(type.getSuffix(), Mode.EDIT, true); } @Override diff --git a/src/main/java/org/olat/repository/ui/WebDocumentRunController.java b/src/main/java/org/olat/repository/ui/WebDocumentRunController.java index 37e147a97bb4ce9a022a6db9b1c280828bbee0eb..46ca748a839d12997d2d61e7648bb1d260dc4627 100644 --- a/src/main/java/org/olat/repository/ui/WebDocumentRunController.java +++ b/src/main/java/org/olat/repository/ui/WebDocumentRunController.java @@ -102,7 +102,7 @@ public class WebDocumentRunController extends BasicController { mainVC.contextPut("height", 480); mainVC.contextPut("width", 640); } - } else if (docEditorService.hasEditor(extension, Mode.VIEW)) { + } else if (docEditorService.hasEditor(extension, Mode.VIEW, true)) { DocEditorSecurityCallback secCallback = DocEditorSecurityCallbackBuilder.builder() .withMode(Mode.VIEW) .canClose(false)