From 9ba889f703212544deea18f0589a1ad40263a8ff Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Tue, 19 May 2020 13:17:14 +0200
Subject: [PATCH] OO-4698: create metadata by import of videos, upgrader to
 generate them

---
 .../org/olat/core/util/vfs/VFSManager.java    |   8 +-
 .../org/olat/modules/video/VideoManager.java  |   5 +-
 .../video/manager/VideoManagerImpl.java       |  23 ++-
 .../repository/handlers/VideoHandler.java     |   4 +-
 .../org/olat/upgrade/OLATUpgrade_14_2_10.java | 144 ++++++++++++++++++
 .../olat/upgrade/_spring/upgradeContext.xml   |   1 +
 6 files changed, 176 insertions(+), 9 deletions(-)
 create mode 100644 src/main/java/org/olat/upgrade/OLATUpgrade_14_2_10.java

diff --git a/src/main/java/org/olat/core/util/vfs/VFSManager.java b/src/main/java/org/olat/core/util/vfs/VFSManager.java
index 2cb16985534..987026ccb00 100644
--- a/src/main/java/org/olat/core/util/vfs/VFSManager.java
+++ b/src/main/java/org/olat/core/util/vfs/VFSManager.java
@@ -729,8 +729,12 @@ public class VFSManager {
 				successful = false;
 			}
 			
-			if(withMetadata && source.canMeta() == VFSConstants.YES && target.canMeta() == VFSConstants.YES) {
-				CoreSpringFactory.getImpl(VFSRepositoryService.class).copyTo(source, target, target.getParentContainer());
+			if(withMetadata) {
+				if(source.canMeta() == VFSConstants.YES && target.canMeta() == VFSConstants.YES) {
+					CoreSpringFactory.getImpl(VFSRepositoryService.class).copyTo(source, target, target.getParentContainer());
+				} else if(target.canMeta() == VFSConstants.YES)  {
+					CoreSpringFactory.getImpl(VFSRepositoryService.class).getMetadataFor(target);
+				}
 			}
 		} else {
 			// source or target is null
diff --git a/src/main/java/org/olat/modules/video/VideoManager.java b/src/main/java/org/olat/modules/video/VideoManager.java
index 40278a8eab4..38fdc162308 100644
--- a/src/main/java/org/olat/modules/video/VideoManager.java
+++ b/src/main/java/org/olat/modules/video/VideoManager.java
@@ -26,6 +26,7 @@ import java.util.Map;
 
 import org.olat.core.commons.services.image.Size;
 import org.olat.core.gui.translator.Translator;
+import org.olat.core.id.Identity;
 import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSLeaf;
 import org.olat.fileresource.types.ResourceEvaluation;
@@ -249,7 +250,7 @@ public interface VideoManager {
 	 *            The repository entry that represents the video in the repository
 	 * @param masterVideo The video file to be added to the repository. Must be an mp4 file.
 	 */
-	public VideoMeta importFromMasterFile(RepositoryEntry repoEntry, VFSLeaf masterVideo);
+	public VideoMeta importFromMasterFile(RepositoryEntry repoEntry, VFSLeaf masterVideo, Identity initialAuthor);
 
 	/**
 	 * Import the given export archive to the resource on disk
@@ -260,7 +261,7 @@ public interface VideoManager {
 	 *            The archive to be added to the repository. The archive must be
 	 *            created by the video export feature.
 	 */
-	public VideoMeta importFromExportArchive(RepositoryEntry repoEntry, VFSLeaf exportArchive);
+	public VideoMeta importFromExportArchive(RepositoryEntry repoEntry, VFSLeaf exportArchive, Identity initialAuthor);
 
 	/**
 	 * Update video transcoding
diff --git a/src/main/java/org/olat/modules/video/manager/VideoManagerImpl.java b/src/main/java/org/olat/modules/video/manager/VideoManagerImpl.java
index 8014041b254..ef6368e36bc 100644
--- a/src/main/java/org/olat/modules/video/manager/VideoManagerImpl.java
+++ b/src/main/java/org/olat/modules/video/manager/VideoManagerImpl.java
@@ -56,8 +56,11 @@ import org.olat.core.commons.persistence.DB;
 import org.olat.core.commons.services.image.Crop;
 import org.olat.core.commons.services.image.ImageService;
 import org.olat.core.commons.services.image.Size;
+import org.olat.core.commons.services.vfs.VFSMetadata;
+import org.olat.core.commons.services.vfs.VFSRepositoryService;
 import org.olat.core.commons.services.video.MovieService;
 import org.olat.core.gui.translator.Translator;
+import org.olat.core.id.Identity;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.FileUtils;
 import org.olat.core.util.Formatter;
@@ -152,6 +155,8 @@ public class VideoManagerImpl implements VideoManager {
 	@Autowired
 	private VideoMetadataDAO videoMetadataDao;
 	@Autowired
+	private VFSRepositoryService vfsRepositoryService;
+	@Autowired
 	private Scheduler scheduler;
 	@Autowired
 	private ImageService imageHelper;
@@ -665,13 +670,13 @@ public class VideoManagerImpl implements VideoManager {
 	}
 	
 	@Override
-	public VideoMeta importFromMasterFile(RepositoryEntry repoEntry, VFSLeaf masterVideo) {
+	public VideoMeta importFromMasterFile(RepositoryEntry repoEntry, VFSLeaf masterVideo, Identity initialAuthor) {
 		OLATResource videoResource = repoEntry.getOlatResource();
 		
 		// 1) copy master video to final destination with standard name
 		VFSContainer masterContainer = getMasterContainer(videoResource);
 		VFSLeaf targetFile = VFSManager.resolveOrCreateLeafFromPath(masterContainer, FILENAME_VIDEO_MP4);
-		VFSManager.copyContent(masterVideo, targetFile, false);
+		VFSManager.copyContent(masterVideo, targetFile, true);
 		masterVideo.delete();
 
 		// calculate video duration
@@ -694,12 +699,18 @@ public class VideoManagerImpl implements VideoManager {
 			createVideoMetadata(repoEntry, targetFile.getSize(), targetFile.getName());
 			dbInstance.commit();
 			meta = updateVideoMetadata(videoResource, targetFile);
+			
+			VFSMetadata vfsMetadata = targetFile.getMetaInfo();
+			if(vfsMetadata != null) {
+				vfsMetadata.setAuthor(initialAuthor);
+				vfsRepositoryService.updateMetadata(vfsMetadata);
+			}
 		}		
 		return meta;
 	}
 	
 	@Override
-	public VideoMeta importFromExportArchive(RepositoryEntry repoEntry, VFSLeaf exportArchive) {
+	public VideoMeta importFromExportArchive(RepositoryEntry repoEntry, VFSLeaf exportArchive, Identity initialAuthor) {
 		OLATResource videoResource = repoEntry.getOlatResource();
 		// 1) unzip archive
 		VFSContainer baseContainer= FileResourceManager.getInstance().getFileResourceRootImpl(videoResource);
@@ -746,6 +757,12 @@ public class VideoManagerImpl implements VideoManager {
 			if(meta != null && meta.getWidth() == 800 && meta.getHeight() == 600) {
 				meta = updateVideoMetadata(videoResource, videoFile);
 			}
+			
+			VFSMetadata vfsMetadata = videoFile.getMetaInfo();
+			if(vfsMetadata != null) {
+				vfsMetadata.setAuthor(initialAuthor);
+				vfsRepositoryService.updateMetadata(vfsMetadata);
+			}
 		}
 		return meta;
 	}
diff --git a/src/main/java/org/olat/repository/handlers/VideoHandler.java b/src/main/java/org/olat/repository/handlers/VideoHandler.java
index 4ac2dafc982..a9367906f24 100644
--- a/src/main/java/org/olat/repository/handlers/VideoHandler.java
+++ b/src/main/java/org/olat/repository/handlers/VideoHandler.java
@@ -172,10 +172,10 @@ public class VideoHandler extends FileHandler {
 		VideoMeta videoMeta = null;
 		if (fileName.endsWith(".mp4") || fileName.endsWith(".mov") || fileName.endsWith(".m4v")) {
 			// 2a) import video from raw mp4 master video file
-			videoMeta = videoManager.importFromMasterFile(repoEntry, importFile);
+			videoMeta = videoManager.importFromMasterFile(repoEntry, importFile, initialAuthor);
 		} else if (fileName.endsWith(".zip")) {
 			// 2b) import video from archive from another OpenOLAT instance
-			videoMeta = videoManager.importFromExportArchive(repoEntry, importFile);
+			videoMeta = videoManager.importFromExportArchive(repoEntry, importFile, initialAuthor);
 		}
 		dbInstance.commit();
 		
diff --git a/src/main/java/org/olat/upgrade/OLATUpgrade_14_2_10.java b/src/main/java/org/olat/upgrade/OLATUpgrade_14_2_10.java
new file mode 100644
index 00000000000..faf7c023ee1
--- /dev/null
+++ b/src/main/java/org/olat/upgrade/OLATUpgrade_14_2_10.java
@@ -0,0 +1,144 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.upgrade;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.logging.log4j.Logger;
+import org.olat.basesecurity.manager.IdentityDAO;
+import org.olat.core.commons.persistence.DB;
+import org.olat.core.commons.services.vfs.VFSMetadata;
+import org.olat.core.commons.services.vfs.manager.VFSRepositoryServiceImpl;
+import org.olat.core.id.Identity;
+import org.olat.core.logging.Tracing;
+import org.olat.core.util.StringHelper;
+import org.olat.core.util.vfs.VFSLeaf;
+import org.olat.fileresource.FileResourceManager;
+import org.olat.fileresource.types.VideoFileResource;
+import org.olat.modules.video.VideoManager;
+import org.olat.repository.RepositoryEntry;
+import org.olat.repository.RepositoryManager;
+import org.olat.resource.OLATResource;
+import org.olat.resource.OLATResourceManager;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * 
+ * Initial date: 19 mai 2020<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class OLATUpgrade_14_2_10 extends OLATUpgrade {
+
+	private static final Logger log = Tracing.createLoggerFor(OLATUpgrade_14_2_10.class);
+
+	private static final String VERSION = "OLAT_14.2.10";
+	private static final String VIDEO_VFS_METADATA = "VIDEO VFS METADATA";
+	
+	@Autowired
+	private DB dbInstance;
+	@Autowired
+	private IdentityDAO identityDao;
+	@Autowired
+	private VideoManager videoManager;
+	@Autowired
+	private RepositoryManager repositoryManager;
+	@Autowired
+	private VFSRepositoryServiceImpl vfsRepositoryService;
+
+	public OLATUpgrade_14_2_10() {
+		super();
+	}
+	
+	@Override
+	public String getVersion() {
+		return VERSION;
+	}
+
+	@Override
+	public boolean doPostSystemInitUpgrade(UpgradeManager upgradeManager) {
+		UpgradeHistoryData uhd = upgradeManager.getUpgradesHistory(VERSION);
+		if (uhd == null) {
+			// has never been called, initialize
+			uhd = new UpgradeHistoryData();
+		} else if (uhd.isInstallationComplete()) {
+			return false;
+		}
+		
+		boolean allOk = true;
+		allOk &= createVideoVfsMetadata(upgradeManager, uhd);
+
+		uhd.setInstallationComplete(allOk);
+		upgradeManager.setUpgradesHistory(uhd, VERSION);
+		if(allOk) {
+			log.info(Tracing.M_AUDIT, "Finished OLATUpgrade_14_2_10 successfully!");
+		} else {
+			log.info(Tracing.M_AUDIT, "OLATUpgrade_14_2_10 not finished, try to restart OpenOlat!");
+		}
+		return allOk;
+	}
+	
+	private boolean createVideoVfsMetadata(UpgradeManager upgradeManager, UpgradeHistoryData uhd) {
+		boolean allOk = true;
+		if (!uhd.getBooleanDataValue(VIDEO_VFS_METADATA)) {
+			
+			List<String> videoTypes = Arrays.asList(VideoFileResource.TYPE_NAME);
+			List<OLATResource> videos = OLATResourceManager.getInstance().findResourceByTypes(videoTypes);
+			log.info("Number of video to upgrade: {}", videos.size());
+			for (OLATResource ores : videos) {
+				createVideoVfsMetadata(ores);
+				dbInstance.commitAndCloseSession();
+			}
+
+			uhd.setBooleanDataValue(VIDEO_VFS_METADATA, allOk);
+			upgradeManager.setUpgradesHistory(uhd, VERSION);
+		}
+		return allOk;
+	}
+	
+	private void createVideoVfsMetadata(OLATResource ores) {
+		try {
+			File resourceDir = FileResourceManager.getInstance().getFileResourceRoot(ores);
+			vfsRepositoryService.migrateDirectories(resourceDir);
+			
+			VFSLeaf masterFile = videoManager.getMasterVideoFile(ores);
+			if(masterFile == null) {
+				return;
+			}
+			
+			VFSMetadata vfsMetadata = masterFile.getMetaInfo();
+			if(vfsMetadata != null && vfsMetadata.getAuthor() == null) {
+				RepositoryEntry entry = repositoryManager.lookupRepositoryEntry(ores, false);
+				if(entry != null && StringHelper.containsNonWhitespace(entry.getInitialAuthor())) {
+					Identity author = identityDao.findIdentityByName(entry.getInitialAuthor());
+					if(author != null) {
+						vfsMetadata.setAuthor(author);
+						vfsRepositoryService.updateMetadata(vfsMetadata);
+					}
+				}
+			}
+		} catch (IOException e) {
+			log.error("", e);
+		}
+	}
+}
diff --git a/src/main/java/org/olat/upgrade/_spring/upgradeContext.xml b/src/main/java/org/olat/upgrade/_spring/upgradeContext.xml
index daca3a1c382..078ae91edc9 100644
--- a/src/main/java/org/olat/upgrade/_spring/upgradeContext.xml
+++ b/src/main/java/org/olat/upgrade/_spring/upgradeContext.xml
@@ -56,6 +56,7 @@
 				<bean id="upgrade_14_2_0" class="org.olat.upgrade.OLATUpgrade_14_2_0"/>
 				<bean id="upgrade_14_2_6" class="org.olat.upgrade.OLATUpgrade_14_2_6"/>
 				<bean id="upgrade_14_2_7" class="org.olat.upgrade.OLATUpgrade_14_2_7"/>
+				<bean id="upgrade_14_2_10" class="org.olat.upgrade.OLATUpgrade_14_2_10"/>
 			</list>
 		</property>
 	</bean>
-- 
GitLab