From fbb0ee0ed9802522f9f63f5b39d0b0533250bb54 Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Fri, 18 Oct 2019 20:27:05 +0200
Subject: [PATCH] OO-4310: make sure the deleted metadata are really deleted

---
 .../commons/services/vfs/manager/VFSMetadataDAO.java   | 10 +++++++++-
 .../services/vfs/manager/VFSRepositoryServiceImpl.java |  2 +-
 .../services/vfs/model/VFSMetadataFileSaved.java       | 10 ++++++++++
 3 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/src/main/java/org/olat/core/commons/services/vfs/manager/VFSMetadataDAO.java b/src/main/java/org/olat/core/commons/services/vfs/manager/VFSMetadataDAO.java
index 50c94678b08..8581d109fe7 100644
--- a/src/main/java/org/olat/core/commons/services/vfs/manager/VFSMetadataDAO.java
+++ b/src/main/java/org/olat/core/commons/services/vfs/manager/VFSMetadataDAO.java
@@ -288,8 +288,16 @@ public class VFSMetadataDAO {
 			.executeUpdate();
 	}
 	
+	/**
+	 * Update existing files only.
+	 * 
+	 * @param fileSize The new file size (mandatory)
+	 * @param lastModified The modification date (mandatory)
+	 * @param relativePath The path to the file
+	 * @param filename The name of the file
+	 */
 	public void updateMetadata(long fileSize, Date lastModified, String relativePath, String filename) {
-		String updateQuery = "update vfsmetadatafilesaved set fileLastModified=:lastModified, fileSize=:fileSize where filename=:filename and relativePath=:relativePath";
+		String updateQuery = "update vfsmetadatafilesaved set fileLastModified=:lastModified, fileSize=:fileSize, deleted=false where filename=:filename and relativePath=:relativePath";
 		dbInstance.getCurrentEntityManager()
 			.createQuery(updateQuery)
 			.setParameter("filename", filename)
diff --git a/src/main/java/org/olat/core/commons/services/vfs/manager/VFSRepositoryServiceImpl.java b/src/main/java/org/olat/core/commons/services/vfs/manager/VFSRepositoryServiceImpl.java
index 0ebb6f12870..e09c462d741 100644
--- a/src/main/java/org/olat/core/commons/services/vfs/manager/VFSRepositoryServiceImpl.java
+++ b/src/main/java/org/olat/core/commons/services/vfs/manager/VFSRepositoryServiceImpl.java
@@ -212,7 +212,7 @@ public class VFSRepositoryServiceImpl implements VFSRepositoryService, GenericEv
 			
 			VFSMetadata parent = getMetadataFor(file.getParentFile());
 			metadata = metadataDao.createMetadata(uuid, relativePath, filename, new Date(), size, directory, uri, "file", parent);
-		} else if(file.isFile() && file.length() != metadata.getFileSize()) {
+		} else if(file.isFile() && (file.length() != metadata.getFileSize() || !file.exists() != metadata.isDeleted())) {
 			AsyncFileSizeUpdateEvent event = new AsyncFileSizeUpdateEvent(relativePath, filename);
 			coordinatorManager.getCoordinator().getEventBus().fireEventToListenersOf(event, fileSizeSubscription);
 		}
diff --git a/src/main/java/org/olat/core/commons/services/vfs/model/VFSMetadataFileSaved.java b/src/main/java/org/olat/core/commons/services/vfs/model/VFSMetadataFileSaved.java
index 5daac904964..3ff3ad65b1b 100644
--- a/src/main/java/org/olat/core/commons/services/vfs/model/VFSMetadataFileSaved.java
+++ b/src/main/java/org/olat/core/commons/services/vfs/model/VFSMetadataFileSaved.java
@@ -51,6 +51,8 @@ public class VFSMetadataFileSaved implements Persistable {
 	private Date fileLastModified;
 	@Column(name="f_size", nullable=false, insertable=true, updatable=true)
 	private long fileSize;
+	@Column(name="f_deleted", nullable=false, insertable=true, updatable=true)
+	private boolean deleted;
 	@Column(name="f_filename", nullable=false, insertable=false, updatable=false)
 	private String filename;
 	@Column(name="f_relative_path", nullable=false, insertable=false, updatable=false)
@@ -97,6 +99,14 @@ public class VFSMetadataFileSaved implements Persistable {
 		this.relativePath = relativePath;
 	}
 	
+	public boolean isDeleted() {
+		return deleted;
+	}
+
+	public void setDeleted(boolean deleted) {
+		this.deleted = deleted;
+	}
+
 	@Override
 	public int hashCode() {
 		return getKey().hashCode();
-- 
GitLab