From 3ff141a7453b498d9d0efb55d2967d96fa71a680 Mon Sep 17 00:00:00 2001
From: uhensler <urs.hensler@frentix.com>
Date: Wed, 26 Feb 2020 08:36:52 +0100
Subject: [PATCH] OO-4536: Edit XML files with the internal document editor

---
 .../commons/editor/fileeditor/FileEditor.java |  2 +-
 .../doceditor/ContentProviderFactory.java     | 17 +++++++++++++
 .../services/doceditor/DocTemplates.java      | 25 +++++++++++++------
 .../ui/_i18n/LocalStrings_de.properties       |  1 +
 .../ui/_i18n/LocalStrings_en.properties       |  1 +
 5 files changed, 37 insertions(+), 9 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 d6f631e49ea..813c7b6b51b 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
@@ -50,7 +50,7 @@ import org.springframework.stereotype.Service;
 public class FileEditor implements DocEditor {
 	
 	private static final List<String> HTML_EDITOR_SUFFIX = Arrays.asList("html", "htm");
-	private static final List<String> TEXT_EDITOR_SUFFIX = Arrays.asList("txt", "css", "csv");
+	private static final List<String> TEXT_EDITOR_SUFFIX = Arrays.asList("txt", "css", "csv", "xml");
 	
 	@Autowired
 	private VFSLockManager lockManager;
diff --git a/src/main/java/org/olat/core/commons/services/doceditor/ContentProviderFactory.java b/src/main/java/org/olat/core/commons/services/doceditor/ContentProviderFactory.java
index cbb528405f9..64206967b4f 100644
--- a/src/main/java/org/olat/core/commons/services/doceditor/ContentProviderFactory.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/ContentProviderFactory.java
@@ -26,6 +26,7 @@ import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
+import java.nio.charset.StandardCharsets;
 import java.util.Locale;
 import java.util.zip.ZipOutputStream;
 
@@ -46,6 +47,7 @@ public class ContentProviderFactory {
 	private static final Logger log = Tracing.createLoggerFor(ContentProviderFactory.class);
 	
 	private static final ContentProvider EMPTY = new EmptyContentProvider();
+	private static final ContentProvider XML = new XmlContentProvider();
 	private static final ContentProvider DOCX = new DocxContentProvider();
 	private static final ContentProvider XLSX = new XlsxContentProvider();
 	private static final ContentProvider PPTX = new PptxContentProvider();
@@ -54,6 +56,11 @@ public class ContentProviderFactory {
 		return EMPTY;
 	}
 	
+	public static ContentProvider emptyXml() {
+		return XML;
+	}
+	
+	
 	public static ContentProvider emptyDocx() {
 		return DOCX;
 	}
@@ -76,6 +83,16 @@ public class ContentProviderFactory {
 		}
 	}
 	
+	private static final class XmlContentProvider implements ContentProvider {
+
+		private static final String XML_CONTENT = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>";
+		
+		@Override
+		public InputStream getContent(Locale locale) {
+			return new ByteArrayInputStream(XML_CONTENT.getBytes(StandardCharsets.UTF_8));
+		}
+	}
+	
 	private static final class DocxContentProvider implements ContentProvider {
 
 		@Override
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 72f953243ad..a362ee18e7a 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
@@ -23,6 +23,7 @@ import static org.olat.core.commons.services.doceditor.ContentProviderFactory.em
 import static org.olat.core.commons.services.doceditor.ContentProviderFactory.emptyDocx;
 import static org.olat.core.commons.services.doceditor.ContentProviderFactory.emptyPptx;
 import static org.olat.core.commons.services.doceditor.ContentProviderFactory.emptyXlsx;
+import static org.olat.core.commons.services.doceditor.ContentProviderFactory.emptyXml;
 import static org.olat.core.commons.services.doceditor.DocEditor.Mode.EDIT;
 
 import java.util.ArrayList;
@@ -72,6 +73,9 @@ public class DocTemplates {
 		if (docEditorService.hasEditor(identity, roles, "css", EDIT, hasMeta)) {
 			builder.addCss();
 		}
+		if (docEditorService.hasEditor(identity, roles, "xml", EDIT, hasMeta)) {
+			builder.addXml();
+		}
 		if (docEditorService.hasEditor(identity, roles, "docx", EDIT, hasMeta)) {
 			builder.addDocx();
 		}
@@ -97,23 +101,28 @@ public class DocTemplates {
 			this.translator = Util.createPackageTranslator(CreateDocumentController.class, locale);
 		}
 		
-		public Builder addCss() {
-			docTemplates.add(DocTemplate.of("css", translate("doc.type.css"), empty()));
+		public Builder addTxt() {
+			docTemplates.add(DocTemplate.of("txt", translate("doc.type.txt"), empty()));
 			return this;
 		}
 		
-		public Builder addDocx() {
-			docTemplates.add(DocTemplate.of("docx", translate("doc.type.docx"), emptyDocx()));
+		public Builder addHtml() {
+			docTemplates.add(DocTemplate.of("html", translate("doc.type.html"), empty()));
 			return this;
 		}
 		
-		public Builder addHtml() {
-			docTemplates.add(DocTemplate.of("html", translate("doc.type.html"), empty()));
+		public Builder addCss() {
+			docTemplates.add(DocTemplate.of("css", translate("doc.type.css"), empty()));
 			return this;
 		}
 		
-		public Builder addTxt() {
-			docTemplates.add(DocTemplate.of("txt", translate("doc.type.txt"), empty()));
+		public Builder addXml() {
+			docTemplates.add(DocTemplate.of("xml", translate("doc.type.xml"), emptyXml()));
+			return this;
+		}
+		
+		public Builder addDocx() {
+			docTemplates.add(DocTemplate.of("docx", translate("doc.type.docx"), emptyDocx()));
 			return this;
 		}
 		
diff --git a/src/main/java/org/olat/core/commons/services/doceditor/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/core/commons/services/doceditor/ui/_i18n/LocalStrings_de.properties
index 9a92ceadc8e..6266a1c4b6b 100644
--- a/src/main/java/org/olat/core/commons/services/doceditor/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/core/commons/services/doceditor/ui/_i18n/LocalStrings_de.properties
@@ -23,4 +23,5 @@ doc.type.html=HTML-Dokument
 doc.type.pptx=PowerPoint
 doc.type.txt=Text
 doc.type.xlsx=Excel
+doc.type.xml=Extensible Markup Language
 error.no.editor=Die Datei kann nicht angezeigt werden.
diff --git a/src/main/java/org/olat/core/commons/services/doceditor/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/core/commons/services/doceditor/ui/_i18n/LocalStrings_en.properties
index e990e2515e4..b18ca53a4bf 100644
--- a/src/main/java/org/olat/core/commons/services/doceditor/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/core/commons/services/doceditor/ui/_i18n/LocalStrings_en.properties
@@ -23,4 +23,5 @@ doc.type.html=HTML Document
 doc.type.pptx=PowerPoint
 doc.type.txt=Text
 doc.type.xlsx=Excel
+doc.type.xml=Extensible Markup Language
 error.no.editor=The content of the document cannot be displayed.
-- 
GitLab