From 97ea464a839e5d0cfc81b80acb81bc5c832b02e7 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Tue, 14 Oct 2014 14:52:29 +0200
Subject: [PATCH] OO-1235: show the business path to the current file ( with QR
 code )

---
 .../modules/bc/commands/CmdEditMeta.java      | 29 ++++++++++++++-----
 .../modules/bc/meta/MetaInfoController.java   | 28 +++++++++++++-----
 .../modules/bc/meta/MetaInfoFileImpl.java     |  4 +--
 .../bc/meta/MetaInfoFormController.java       | 21 ++++++++++----
 .../bc/meta/_content/external_url.html        |  8 +++++
 .../bc/meta/_i18n/LocalStrings_de.properties  |  1 +
 .../bc/meta/_i18n/LocalStrings_en.properties  |  1 +
 .../course/run/CourseRuntimeController.java   | 10 +++++--
 8 files changed, 78 insertions(+), 24 deletions(-)
 create mode 100644 src/main/java/org/olat/core/commons/modules/bc/meta/_content/external_url.html

diff --git a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdEditMeta.java b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdEditMeta.java
index e5feb875d30..35995dea582 100644
--- a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdEditMeta.java
+++ b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdEditMeta.java
@@ -42,8 +42,11 @@ import org.olat.core.gui.control.Event;
 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.id.OLATResourceable;
+import org.olat.core.id.context.BusinessControlFactory;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
+import org.olat.core.util.resource.OresHelper;
 import org.olat.core.util.vfs.VFSConstants;
 import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSItem;
@@ -75,10 +78,11 @@ public class CmdEditMeta extends BasicController implements FolderCommand {
 	 * 
 	 * @see org.olat.core.commons.modules.bc.commands.FolderCommand#execute(org.olat.core.commons.modules.bc.components.FolderComponent, org.olat.core.gui.UserRequest, org.olat.core.gui.control.WindowControl, org.olat.core.gui.translator.Translator)
 	 */
-	public Controller execute(FolderComponent folderComponent,
+	@Override
+	public Controller execute(FolderComponent fComponent,
 			UserRequest ureq, WindowControl wControl, Translator trans) {
 		this.translator = trans;
-		this.folderComponent = folderComponent;
+		this.folderComponent = fComponent;
 		String pos = ureq.getParameter(ListRenderer.PARAM_EDTID);
 		if (!StringHelper.containsNonWhitespace(pos)) {
 			// somehow parameter did not make it to us
@@ -87,9 +91,9 @@ public class CmdEditMeta extends BasicController implements FolderCommand {
 			return null;
 		}
 		
-		status = FolderCommandHelper.sanityCheck(wControl, folderComponent);
+		status = FolderCommandHelper.sanityCheck(wControl, fComponent);
 		if(status == FolderCommandStatus.STATUS_SUCCESS) {
-			currentItem = folderComponent.getCurrentContainerChildren().get(Integer.parseInt(pos));
+			currentItem = fComponent.getCurrentContainerChildren().get(Integer.parseInt(pos));
 		}
 		if(status == FolderCommandStatus.STATUS_FAILED) {
 			return null;
@@ -97,19 +101,30 @@ public class CmdEditMeta extends BasicController implements FolderCommand {
 
 		removeAsListenerAndDispose(metaCtr);
 		removeAsListenerAndDispose(metaInfoCtr);
-
 		if(vfsLockManager.isLockedForMe(currentItem, getIdentity(), ureq.getUserSession().getRoles())) {
 			//readonly
-			metaCtr = new MetaInfoController(ureq, wControl, currentItem);
+			String resourceUrl = getResourceURL(wControl);
+			metaCtr = new MetaInfoController(ureq, wControl, currentItem, resourceUrl);
 			listenTo(metaCtr);
 			putInitialPanel(metaCtr.getInitialComponent());
 		} else {
-			metaInfoCtr = new MetaInfoFormController(ureq, wControl, currentItem);
+			String resourceUrl = getResourceURL(wControl);
+			metaInfoCtr = new MetaInfoFormController(ureq, wControl, currentItem, resourceUrl);
 			listenTo(metaInfoCtr);
 			putInitialPanel(metaInfoCtr.getInitialComponent());
 		}
 		return this;
 	}
+	
+	private String getResourceURL(WindowControl wControl) {
+		String path = "path=" + folderComponent.getCurrentContainerPath();
+		if(currentItem != null) {
+			path += "/" + currentItem.getName();
+		}
+		OLATResourceable ores = OresHelper.createOLATResourceableTypeWithoutCheck(path);
+		WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, wControl);
+		return BusinessControlFactory.getInstance().getAsURIString(bwControl.getBusinessControl(), false);
+	}
 
 	@Override
 	public int getStatus() {
diff --git a/src/main/java/org/olat/core/commons/modules/bc/meta/MetaInfoController.java b/src/main/java/org/olat/core/commons/modules/bc/meta/MetaInfoController.java
index b4e279034a0..373afdacd02 100644
--- a/src/main/java/org/olat/core/commons/modules/bc/meta/MetaInfoController.java
+++ b/src/main/java/org/olat/core/commons/modules/bc/meta/MetaInfoController.java
@@ -46,6 +46,7 @@ import org.olat.core.util.vfs.VFSLeaf;
 import org.olat.core.util.vfs.VFSLockManager;
 import org.olat.core.util.vfs.lock.LockInfo;
 import org.olat.user.UserManager;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * Read only variant to show the meta datas of a file
@@ -56,12 +57,15 @@ import org.olat.user.UserManager;
 public class MetaInfoController extends FormBasicController {
 	private VFSItem item;
 	private FormLink moreMetaDataLink;
-	private StaticTextElement  publisher, creator, source, city, pages, language, url;
+	private StaticTextElement  publisher, creator, sourceEl, city, pages, language, url;
 	private SingleSelection locked;
 	private Set<FormItem> metaFields;
+	private String resourceUrl;
 	
-	private final UserManager userManager;
-	private final VFSLockManager vfsLockManager;
+	@Autowired
+	private UserManager userManager;
+	@Autowired
+	private VFSLockManager vfsLockManager;
 
 	/**
 	 * Use this controller for editing meta data of an existing file.
@@ -69,11 +73,10 @@ public class MetaInfoController extends FormBasicController {
 	 * @param ureq
 	 * @param control
 	 */
-	public MetaInfoController(UserRequest ureq, WindowControl control, VFSItem item) {
+	public MetaInfoController(UserRequest ureq, WindowControl control, VFSItem item, String resourceUrl) {
 		super(ureq, control);
 		this.item = item;
-		userManager = CoreSpringFactory.getImpl(UserManager.class);
-		vfsLockManager = CoreSpringFactory.getImpl(VFSLockManager.class);
+		this.resourceUrl = resourceUrl;
 		initForm(ureq);
 	}
 	
@@ -150,7 +153,7 @@ public class MetaInfoController extends FormBasicController {
 
 		// source/origin
 		String sourceVal = StringHelper.escapeHtml(meta != null ? meta.getSource() : null);
-		source = uifactory.addStaticTextElement("mf.source", sourceVal, formLayout);
+		sourceEl = uifactory.addStaticTextElement("mf.source", sourceVal, formLayout);
 
 		// city
 		String cityVal = StringHelper.escapeHtml(meta != null ? meta.getCity() : null);
@@ -192,7 +195,7 @@ public class MetaInfoController extends FormBasicController {
 		metaFields = new HashSet<FormItem>();
 		metaFields.add(creator);
 		metaFields.add(publisher);
-		metaFields.add(source);
+		metaFields.add(sourceEl);
 		metaFields.add(city);
 		metaFields.add(publicationDate);
 		metaFields.add(pages);
@@ -260,6 +263,15 @@ public class MetaInfoController extends FormBasicController {
 				moreMetaDataLink.setVisible(false);
 			}
 		}
+		
+		if(StringHelper.containsNonWhitespace(resourceUrl)) {
+			String externalUrlPage = velocity_root + "/external_url.html";
+			FormLayoutContainer extUrlCont = FormLayoutContainer.createCustomFormLayout("external.url", getTranslator(), externalUrlPage);
+			extUrlCont.setLabel("external.url", null);
+			extUrlCont.contextPut("resourceUrl", resourceUrl);
+			extUrlCont.setRootForm(mainForm);
+			formLayout.add(extUrlCont);
+		}
 
 		// cancel buttons
 		final FormLayoutContainer buttonLayout = FormLayoutContainer.createButtonLayout("buttonLayout", getTranslator());
diff --git a/src/main/java/org/olat/core/commons/modules/bc/meta/MetaInfoFileImpl.java b/src/main/java/org/olat/core/commons/modules/bc/meta/MetaInfoFileImpl.java
index c8c6a070788..82069ba8b7a 100644
--- a/src/main/java/org/olat/core/commons/modules/bc/meta/MetaInfoFileImpl.java
+++ b/src/main/java/org/olat/core/commons/modules/bc/meta/MetaInfoFileImpl.java
@@ -844,9 +844,9 @@ public class MetaInfoFileImpl extends DefaultHandler implements MetaInfo {
 		String name = originFile.getName();
 		String extension = FileUtils.getFileSuffix(name);
 		String nameOnly = name.substring(0, name.length() - extension.length() - 1);
-		String uuid = UUID.randomUUID().toString();
+		String randuuid = UUID.randomUUID().toString();
 		String thumbnailExtension = preferedThumbnailType(extension);
-		File thumbnailFile = new File(metaLoc, nameOnly + "_" + uuid + "_" + maxHeight + "x" + maxWidth + (fill ? "xfill" : "") + "." + thumbnailExtension);
+		File thumbnailFile = new File(metaLoc, nameOnly + "_" + randuuid + "_" + maxHeight + "x" + maxWidth + (fill ? "xfill" : "") + "." + thumbnailExtension);
 		
 		//generate thumbnail
 		long start = 0l;
diff --git a/src/main/java/org/olat/core/commons/modules/bc/meta/MetaInfoFormController.java b/src/main/java/org/olat/core/commons/modules/bc/meta/MetaInfoFormController.java
index f7accf6913c..b455fb0b996 100644
--- a/src/main/java/org/olat/core/commons/modules/bc/meta/MetaInfoFormController.java
+++ b/src/main/java/org/olat/core/commons/modules/bc/meta/MetaInfoFormController.java
@@ -70,11 +70,12 @@ public class MetaInfoFormController extends FormBasicController {
 	//private MetaInfo meta;
 	private FormLink moreMetaDataLink;
 	private String initialFilename;
-	private TextElement filename, title, publisher, creator, source, city, pages, language, url, comment, publicationMonth, publicationYear;
+	private TextElement filename, title, publisher, creator, sourceEl, city, pages, language, url, comment, publicationMonth, publicationYear;
 	private SingleSelection locked;
 	// Fields needed for upload dialog
 	private boolean isSubform;
 	private Set<FormItem> metaFields;
+	private String resourceUrl;
 	
 	private final Roles roles;
 	private final UserManager userManager;
@@ -87,10 +88,11 @@ public class MetaInfoFormController extends FormBasicController {
 	 * @param ureq
 	 * @param control
 	 */
-	public MetaInfoFormController(UserRequest ureq, WindowControl control, VFSItem item) {
+	public MetaInfoFormController(UserRequest ureq, WindowControl control, VFSItem item, String resourceUrl) {
 		super(ureq, control);
 		isSubform = false;
 		this.item = item;
+		this.resourceUrl = resourceUrl;
 		// load the metainfo
 		roles = ureq.getUserSession().getRoles();
 		userManager = CoreSpringFactory.getImpl(UserManager.class);
@@ -217,7 +219,7 @@ public class MetaInfoFormController extends FormBasicController {
 
 		// source/origin
 		String sourceVal = (meta != null ? meta.getSource() : null);
-		source = uifactory.addTextElement("source", "mf.source", -1, sourceVal, formLayout);
+		sourceEl = uifactory.addTextElement("source", "mf.source", -1, sourceVal, formLayout);
 
 		// city
 		String cityVal = (meta != null ? meta.getCity() : null);
@@ -263,7 +265,7 @@ public class MetaInfoFormController extends FormBasicController {
 		metaFields = new HashSet<FormItem>();
 		metaFields.add(creator);
 		metaFields.add(publisher);
-		metaFields.add(source);
+		metaFields.add(sourceEl);
 		metaFields.add(city);
 		metaFields.add(publicationDate);
 		metaFields.add(pages);
@@ -324,6 +326,15 @@ public class MetaInfoFormController extends FormBasicController {
 			String downloads = meta == null ? "" : String.valueOf(meta.getDownloadCount());
 			uifactory.addStaticTextElement("mf.downloads", downloads, formLayout);
 		}
+		
+		if(StringHelper.containsNonWhitespace(resourceUrl)) {
+			String externalUrlPage = velocity_root + "/external_url.html";
+			FormLayoutContainer extUrlCont = FormLayoutContainer.createCustomFormLayout("external.url", getTranslator(), externalUrlPage);
+			extUrlCont.setLabel("external.url", null);
+			extUrlCont.contextPut("resourceUrl", resourceUrl);
+			extUrlCont.setRootForm(mainForm);
+			formLayout.add(extUrlCont);
+		}
 
 		if (!isSubform && meta != null && meta.isDirectory()) {
 			// Don't show any meta data except title and comment if the item is
@@ -393,7 +404,7 @@ public class MetaInfoFormController extends FormBasicController {
 		meta.setPublicationDate(publicationMonth.getValue(), publicationYear.getValue());
 		meta.setCity(city.getValue());
 		meta.setLanguage(language.getValue());
-		meta.setSource(source.getValue());
+		meta.setSource(sourceEl.getValue());
 		meta.setUrl(url.getValue());
 		meta.setPages(pages.getValue());
 		return meta;
diff --git a/src/main/java/org/olat/core/commons/modules/bc/meta/_content/external_url.html b/src/main/java/org/olat/core/commons/modules/bc/meta/_content/external_url.html
new file mode 100644
index 00000000000..8c45abd1045
--- /dev/null
+++ b/src/main/java/org/olat/core/commons/modules/bc/meta/_content/external_url.html
@@ -0,0 +1,8 @@
+<div class="o_copy_code form-control-static"><a href="javascript:;" id="o_extlink"><i class="o_icon o_icon-lg o_icon-fw o_icon_qrcode"></i></a>$resourceUrl</div>
+<script type="text/javascript">
+/* <![CDATA[ */
+	jQuery(function() {
+		o_QRCodePopup('o_extlink', '$resourceUrl', 'right');
+	});
+/* ]]> */
+</script>
\ No newline at end of file
diff --git a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_de.properties
index a86966ddd48..f233cebc8a3 100644
--- a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_de.properties
@@ -39,6 +39,7 @@ mf.locked.description={0} am {1}
 mf.lockedBy=Gesperrt von
 mf.unlocked=Freigegeben
 mf.unlocked.description=Dokument momentan nicht gesperrt
+external.url=External link to this resource
 chelp.bc-metainfo.title = Metadaten
 chelp.bc-metainfo.hover=Hilfe zu den Metadaten von Dateien
 chelp.meta.intro = Jede Datei kann mit Metadaten versehen werden. Die Metadaten orientieren sich am Dublin Core Simple Standard. Weitere Informationen zu Dublin Core finden Sie hier: {0}.
diff --git a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_en.properties
index 312ed15d090..3d23114977a 100644
--- a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_en.properties
@@ -6,6 +6,7 @@ chelp.meta.locked=Here you can decide if you want to lock this file. Other users
 chelp.meta.optional=Metadata are optional. However, several meta data cannot be modified\: name of person who has uploaded a certain document, size of document, file type, and time of document upload.
 chelp.meta.purpose=Metadata additionally describe a file, e.g. its title, author or publisher. They serve as a means to clarify a document's purpose and are particularly suitable for file names that would otherwise be too long or for document titles containing special characters.
 chelp.meta.search=Metadata are indexed by the full-text search. Therefore you can search for metadata by means of keywords when trying to find relevant documents.
+external.url=External link to this resource
 file.name.notvalid=This file name contains invalid characters. Please remove all special characters such as /, \:, etc.
 mf.author=Created by
 mf.cancel=Cancel
diff --git a/src/main/java/org/olat/course/run/CourseRuntimeController.java b/src/main/java/org/olat/course/run/CourseRuntimeController.java
index 537e66b2cd5..663adc9a28f 100644
--- a/src/main/java/org/olat/course/run/CourseRuntimeController.java
+++ b/src/main/java/org/olat/course/run/CourseRuntimeController.java
@@ -782,7 +782,12 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 						//the wrong link to the wrong person
 					}
 				}
-			} 
+			} else if(type != null && type.startsWith("path=")) {
+				if (reSecurity.isEntryAdmin() || hasCourseRight(CourseRights.RIGHT_COURSEEDITOR)) {
+					String path = BusinessControlFactory.getInstance().getPath(entries.get(0));
+					doCourseFolder(ureq).activatePath(ureq, path);
+				}
+			}
 		}
 
 		if(getRunMainController() != null) {
@@ -889,7 +894,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 		}
 	}
 	
-	private void doCourseFolder(UserRequest ureq) {
+	private FolderRunController doCourseFolder(UserRequest ureq) {
 		removeCustomCSS(ureq);
 		// Folder for course with custom link model to jump to course nodes
 		ICourse course = CourseFactory.loadCourse(getOlatResourceable());
@@ -901,6 +906,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 		courseFolderCtrl = pushController(ureq, translate("command.coursefolder"), ctrl);
 		setActiveTool(folderLink);
 		currentToolCtr = courseFolderCtrl;
+		return courseFolderCtrl;
 	}
 	
 	private void doCourseAreas(UserRequest ureq) {
-- 
GitLab