From 53fe9aad5c88f7c2818a992a71f80bcf6ebeee48 Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Wed, 14 Oct 2020 08:53:42 +0200
Subject: [PATCH] OO-4952: handle return value of file delete()

---
 .../org/olat/admin/layout/LayoutModule.java   |  7 +--
 .../memberlist/ui/MembersMailController.java  |  4 +-
 .../iframe/IframePortletRunController.java    | 14 +++---
 .../components/form/flexible/impl/Form.java   |  5 +-
 .../impl/elements/FileElementImpl.java        | 13 +++--
 ...CleanupAfterDeliveryFileMediaResource.java |  7 ++-
 .../gui/media/NamedFileMediaResource.java     | 17 ++-----
 .../java/org/olat/core/util/FileUtils.java    |  2 +-
 .../java/org/olat/core/util/WebappHelper.java | 17 +++++--
 .../org/olat/core/util/i18n/I18nManager.java  | 17 ++++---
 .../i18n/devtools/TranslationDevManager.java  | 29 +++++++----
 .../I18nConfigSubDeletePackageController.java | 49 +++++++++----------
 .../util/mail/manager/MailManagerImpl.java    |  8 +--
 .../manager/CourseAssessmentManagerImpl.java  |  4 +-
 .../manager/CertificatePhantomWorker.java     | 13 ++---
 .../course/nodes/ProjectBrokerCourseNode.java | 44 +++++++++--------
 .../nodes/gta/ui/EditSolutionController.java  |  2 +-
 .../nodes/gta/ui/EditTaskController.java      |  2 +-
 .../gta/ui/SubmitDocumentsController.java     |  9 ++--
 .../gui/demo/guidemo/GuiDemoFlexiForm.java    |  9 ++--
 .../java/org/olat/ims/cp/CPManagerImpl.java   |  4 +-
 .../ims/qti/editor/QTIEditorPackageImpl.java  | 14 +++---
 .../ims/qti21/manager/QTI21ServiceImpl.java   | 12 ++---
 .../handlers/CopyAndConvertVisitor.java       | 14 ++----
 .../java/org/olat/modules/co/ContactForm.java |  2 +-
 .../modules/fo/ui/MessageEditController.java  |  5 +-
 .../library/manager/LibraryManagerImpl.java   | 11 +++--
 .../manager/PortfolioServiceImpl.java         |  8 +--
 .../ui/AssignmentEditController.java          |  2 +-
 .../quality/manager/QualityMailing.java       |  2 +-
 .../olat/modules/scorm/ScormMainManager.java  |  5 +-
 .../scorm/archiver/ScormExportManager.java    |  2 +-
 .../server/servermodels/ScoDocument.java      |  4 +-
 .../video/ui/VideoPosterUploadForm.java       |  7 ++-
 .../ui/author/SendMailController.java         | 14 +++---
 .../olat/restapi/support/MultipartReader.java |  7 ++-
 .../olat/restapi/system/StatusWebservice.java |  7 +--
 .../service/document/file/PdfDocument.java    |  6 ++-
 .../org/olat/user/DisplayPortraitManager.java |  6 +--
 .../manager/HomePageConfigManagerImpl.java    |  3 +-
 40 files changed, 208 insertions(+), 199 deletions(-)

diff --git a/src/main/java/org/olat/admin/layout/LayoutModule.java b/src/main/java/org/olat/admin/layout/LayoutModule.java
index 9e1b4e6c04a..0d1836f0c9a 100644
--- a/src/main/java/org/olat/admin/layout/LayoutModule.java
+++ b/src/main/java/org/olat/admin/layout/LayoutModule.java
@@ -25,6 +25,7 @@ import java.nio.file.Paths;
 import org.olat.core.configuration.AbstractSpringModule;
 import org.olat.core.dispatcher.mapper.GlobalMapperRegistry;
 import org.olat.core.id.OLATResourceable;
+import org.olat.core.util.FileUtils;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.WebappHelper;
 import org.olat.core.util.coordinate.CoordinatorManager;
@@ -159,16 +160,16 @@ public class LayoutModule extends AbstractSpringModule  {
 	public void removeLogo() {
 		File logo = getLogo();
 		if(logo != null && logo.exists()) {
-			logo.delete();
+			FileUtils.deleteFile(logo);
 		}
 		File dir = getLogoDirectory();
 		File logo1x = new File(dir, "oo-logo@1x.png");
 		if(logo1x.exists()) {
-			logo1x.delete();
+			FileUtils.deleteFile(logo1x);
 		}
 		File logo2x = new File(dir, "oo-logo@2x.png");
 		if(logo2x.exists()) {
-			logo2x.delete();
+			FileUtils.deleteFile(logo2x);
 		}
 		setLogoFilename("");
 	}
diff --git a/src/main/java/org/olat/commons/memberlist/ui/MembersMailController.java b/src/main/java/org/olat/commons/memberlist/ui/MembersMailController.java
index 5ded8166554..c5d5b30b658 100644
--- a/src/main/java/org/olat/commons/memberlist/ui/MembersMailController.java
+++ b/src/main/java/org/olat/commons/memberlist/ui/MembersMailController.java
@@ -450,9 +450,9 @@ public class MembersMailController extends FormBasicController {
 	
 	private void doDeleteAttachment(Attachment attachment) {
 		attachmentSize -= attachment.getFile().length();
-		attachment.getFile().delete();
+		FileUtils.deleteFile(attachment.getFile());
 		attachments.remove(attachment);
-		uploadCont.setVisible(attachments.size() > 0);
+		uploadCont.setVisible(!attachments.isEmpty());
 		uploadCont.setDirty(true);
 	}
 	
diff --git a/src/main/java/org/olat/core/commons/portlets/iframe/IframePortletRunController.java b/src/main/java/org/olat/core/commons/portlets/iframe/IframePortletRunController.java
index 4bf3c4fa194..fe2487ecf9a 100644
--- a/src/main/java/org/olat/core/commons/portlets/iframe/IframePortletRunController.java
+++ b/src/main/java/org/olat/core/commons/portlets/iframe/IframePortletRunController.java
@@ -127,15 +127,15 @@ public class IframePortletRunController extends BasicController {
 		File editFile = new File(editFilePath);
 		File parent = editFile.getParentFile();
 		if(parent == null){
-			log.warn("initEditButton: no parent folder for "+editFilePath);
+			log.warn("initEditButton: no parent folder for {}", editFilePath);
 			return false;
 		}
 		if (!editFile.getParentFile().exists()) {
-			log.warn("editFilePath is wrong, not even parent dir exists::" + editFile.getParentFile().getAbsolutePath()); 
+			log.warn("editFilePath is wrong, not even parent dir exists: {}", editFile.getParentFile().getAbsolutePath()); 
 			return false;
 		}
 		if ( ! editFile.canWrite()) {
-			log.warn("Can not write to file::" + editFile.getAbsolutePath()); 
+			log.warn("Can not write to file: {}", editFile); 
 			return false;
 		}
 		
@@ -145,11 +145,13 @@ public class IframePortletRunController extends BasicController {
 		 */
 		
 		
-		if (! editFile.exists()) {
+		if (!editFile.exists()) {
 			try {
-				editFile.createNewFile();
+				if(!editFile.createNewFile()) {
+					log.warn("Cannot create file: {}", editFile);
+				}
 			} catch (IOException e) {
-				log.error("Cannot create file::" + editFile.getAbsolutePath()); 
+				log.error("Cannot create file: {}", editFile); 
 				return false;
 			}
 		}
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java
index 18a719c4f6a..052f9bcfdd2 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java
@@ -63,6 +63,7 @@ import org.olat.core.logging.AssertException;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.ArrayHelper;
 import org.olat.core.util.CodeHelper;
+import org.olat.core.util.FileUtils;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
 import org.olat.core.util.ValidationStatus;
@@ -422,7 +423,9 @@ public class Form {
 	private void doClearRequestParameterAndMultipartData() {
 		for (Entry<String, File> entry : requestMultipartFiles.entrySet()) {
 			File tmpFile = entry.getValue();
-			if (tmpFile.exists()) tmpFile.delete();
+			if (tmpFile.exists()) {
+				FileUtils.deleteFile(tmpFile);
+			}
 		}
 		requestMultipartFiles.clear();
 		requestMultipartFileNames.clear();
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/FileElementImpl.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/FileElementImpl.java
index c5c7e15113e..756786fb63c 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/FileElementImpl.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/FileElementImpl.java
@@ -148,7 +148,7 @@ public class FileElementImpl extends FormItemImpl
 		if (keys.size() > 0 && keys.contains(component.getFormDispatchId())) {
 			// Remove old files first
 			if (tempUploadFile != null && tempUploadFile.exists()) {
-				tempUploadFile.delete();
+				FileUtils.deleteFile(tempUploadFile);
 			}
 			// Move file from a temporary request scope location to a location
 			// with a
@@ -238,7 +238,7 @@ public class FileElementImpl extends FormItemImpl
 	@Override
 	public void reset() {
 		if (tempUploadFile != null && tempUploadFile.exists()) {
-			tempUploadFile.delete();
+			FileUtils.deleteFile(tempUploadFile);
 		}
 		tempUploadFile = null;
 		if (previewEl != null) {
@@ -247,7 +247,7 @@ public class FileElementImpl extends FormItemImpl
 				previewEl.setMedia(media);
 				previewEl.setMaxWithAndHeightToFitWithin(300, 200);
 				previewEl.setVisible(true);
-			} else if (previewEl != null) {
+			} else {
 				previewEl.setVisible(false);
 			}
 		}
@@ -573,13 +573,12 @@ public class FileElementImpl extends FormItemImpl
 				try {
 					success = VFSManager.copyContent(tempUploadFile, leaf);
 				} catch (Exception e) {
-					log.error("Error while copying content from temp file::"
-							+ (tempUploadFile == null ? "NULL" : tempUploadFile.getAbsolutePath()), e);
+					log.error("Error while copying content from temp file: {}", tempUploadFile, e);
 				}
 				if (success) {
 					// Delete original temp file after copy to simulate move
 					// behavior
-					tempUploadFile.delete();
+					FileUtils.deleteFile(tempUploadFile);
 					targetLeaf = leaf;
 				}
 			}
@@ -605,7 +604,7 @@ public class FileElementImpl extends FormItemImpl
 	@Override
 	public void dispose() {
 		if (tempUploadFile != null && tempUploadFile.exists()) {
-			tempUploadFile.delete();
+			FileUtils.deleteFile(tempUploadFile);
 		}
 	}
 
diff --git a/src/main/java/org/olat/core/gui/media/CleanupAfterDeliveryFileMediaResource.java b/src/main/java/org/olat/core/gui/media/CleanupAfterDeliveryFileMediaResource.java
index ba9ed00f483..dea0c9e5c47 100644
--- a/src/main/java/org/olat/core/gui/media/CleanupAfterDeliveryFileMediaResource.java
+++ b/src/main/java/org/olat/core/gui/media/CleanupAfterDeliveryFileMediaResource.java
@@ -28,6 +28,8 @@ package org.olat.core.gui.media;
 
 import java.io.File;
 
+import org.olat.core.util.FileUtils;
+
 /**
  * This media resource deletes the file as soon as it is delivered to the
  * client. The file is delivered as attachment.
@@ -51,11 +53,8 @@ public class CleanupAfterDeliveryFileMediaResource extends FileMediaResource {
 		return false;
 	}
 
-	/**
-	 * @see org.olat.core.gui.media.MediaResource#release()
-	 */
 	@Override
 	public void release() {
-		file.delete();
+		FileUtils.deleteFile(file);
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/core/gui/media/NamedFileMediaResource.java b/src/main/java/org/olat/core/gui/media/NamedFileMediaResource.java
index 1d3f80b9935..8b0ad40ceaf 100644
--- a/src/main/java/org/olat/core/gui/media/NamedFileMediaResource.java
+++ b/src/main/java/org/olat/core/gui/media/NamedFileMediaResource.java
@@ -28,6 +28,7 @@ import java.io.File;
 
 import javax.servlet.http.HttpServletResponse;
 
+import org.olat.core.util.FileUtils;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.WebappHelper;
 
@@ -69,18 +70,14 @@ public class NamedFileMediaResource extends FileMediaResource {
 		this.deleteAfterDelivery = deleteAfterDelivery;
 	}
 	
-	/**
-	 * @see org.olat.core.gui.media.MediaResource#getContentType()
-	 */
+	@Override
 	public String getContentType() {
 		String mimeType = WebappHelper.getMimeType(fileName);
 		if (mimeType == null) mimeType = "application/octet-stream";
 		return mimeType;
 	}
 
-	/**
-	 * @see org.olat.core.gui.media.MediaResource#prepare(javax.servlet.http.HttpServletResponse)
-	 */
+	@Override
 	public void prepare(HttpServletResponse hres) {
 		// encode filename in ISO8859-1; does not really help but prevents from filename not being displayed at all
 		// if it contains non-US-ASCII characters which are not allowed in header fields.
@@ -88,14 +85,10 @@ public class NamedFileMediaResource extends FileMediaResource {
 		hres.setHeader("Content-Description", StringHelper.urlEncodeUTF8(fileDescription));
 	}
 
-
-	/**
-	 * @see org.olat.core.gui.media.MediaResource#release()
-	 */
+	@Override
 	public void release() {
 		if (deleteAfterDelivery && file.exists()) {
-			file.delete();
+			FileUtils.deleteFile(file);
 		}
 	}
-
 }
diff --git a/src/main/java/org/olat/core/util/FileUtils.java b/src/main/java/org/olat/core/util/FileUtils.java
index 9ac62ae7b73..3923a777b3b 100644
--- a/src/main/java/org/olat/core/util/FileUtils.java
+++ b/src/main/java/org/olat/core/util/FileUtils.java
@@ -558,7 +558,7 @@ public class FileUtils {
 			}
 			deleted = Files.deleteIfExists(file.toPath());
 		} catch (IOException e) {
-			log.error("", e);
+			log.error("Cannot delete file: {}", file, e);
 			deleted = false;
 		}
 		return deleted;
diff --git a/src/main/java/org/olat/core/util/WebappHelper.java b/src/main/java/org/olat/core/util/WebappHelper.java
index 665ae10cf03..14dbbc7713f 100644
--- a/src/main/java/org/olat/core/util/WebappHelper.java
+++ b/src/main/java/org/olat/core/util/WebappHelper.java
@@ -31,6 +31,7 @@ package org.olat.core.util;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.file.Files;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
@@ -452,10 +453,16 @@ public class WebappHelper implements Initializable, Destroyable, ServletContextA
 		File writeFile = new File(tmpDir, "UTF-8 test läsÖiç-首页f新");
 		if (writeFile.exists()) {
 			// remove exising files first
-			writeFile.delete();
+			try {
+				Files.deleteIfExists(writeFile.toPath());
+			} catch (IOException e) {
+				log.warn("Cannot delete test file for UTF-8 file system.", e);
+			}
 		}
 		try {
-			writeFile.createNewFile();
+			if(!writeFile.createNewFile()) {
+				log.warn("No UTF-8 capable filesystem found! Error while writing testfile to filesystem");
+			}
 		} catch (IOException e) {
 			log.warn("No UTF-8 capable filesystem found! Error while writing testfile to filesystem", e);
 		}
@@ -483,7 +490,11 @@ public class WebappHelper implements Initializable, Destroyable, ServletContextA
 					+ System.getProperty("file.encoding") + " (the one configured)");
 		}
 		// try to delete file anyway
-		writeFile.delete();
+		try {
+			Files.deleteIfExists(writeFile.toPath());
+		} catch (IOException e) {
+			log.warn("Cannot delete test file for UTF-8 file system.", e);
+		}
 		
 		if (!foundUtf8File && WebappHelper.enforceUtf8Filesystem) {
 			throw new BeanInitializationException(
diff --git a/src/main/java/org/olat/core/util/i18n/I18nManager.java b/src/main/java/org/olat/core/util/i18n/I18nManager.java
index 4b24d4dc7a0..f339fe47188 100644
--- a/src/main/java/org/olat/core/util/i18n/I18nManager.java
+++ b/src/main/java/org/olat/core/util/i18n/I18nManager.java
@@ -34,6 +34,7 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.nio.file.Files;
 import java.text.DecimalFormat;
 import java.text.MessageFormat;
 import java.text.NumberFormat;
@@ -1056,7 +1057,11 @@ public class I18nManager {
 			return;// nothing to do
 		}
 		File f = getPropertiesFile(locale, bundleName, baseDir);
-		if (f.exists()) f.delete();
+		try {
+			Files.deleteIfExists(f.toPath());
+		} catch (IOException e) {
+			log.error("Cannot delete: {}", f);
+		}
 		// 3) Check if for this bundle any other language file exists, if
 		// not remove
 		// the bundle from the list of translatable bundles
@@ -1705,9 +1710,7 @@ public class I18nManager {
 		if (!i18nModule.isTransToolEnabled()) {
 			throw new AssertException("Programming error - can only copy i18n files from a language pack to the source when in translation mode");
 		}
-		JarFile jar = null;
-		try {
-			jar = new JarFile(jarFile);
+		try(JarFile jar = new JarFile(jarFile)) {
 			Enumeration<JarEntry> jarEntries = jar.entries();
 			while (jarEntries.hasMoreElements()) {
 				JarEntry jarEntry = jarEntries.nextElement();
@@ -1729,11 +1732,11 @@ public class I18nManager {
 						Properties props = new Properties();
 						props.load(new FileInputStream(targetFile));
 						if (props.size() == 0) {
-							targetFile.delete();
+							Files.deleteIfExists(targetFile.toPath());
 							// Delete empty parent dirs recursively
 							File parent = targetFile.getParentFile();
 							while (parent != null && parent.list() != null && parent.list().length == 0) {
-								parent.delete();
+								Files.deleteIfExists(parent.toPath());
 								parent = parent.getParentFile();
 							}
 						}
@@ -1744,8 +1747,6 @@ public class I18nManager {
 			}
 		} catch (IOException e) {
 			throw new OLATRuntimeException("Error when copying up i18n files from a jar::" + jarFile.getAbsolutePath(), e);
-		} finally {
-			IOUtils.closeQuietly(jar);
 		}
 	}
 
diff --git a/src/main/java/org/olat/core/util/i18n/devtools/TranslationDevManager.java b/src/main/java/org/olat/core/util/i18n/devtools/TranslationDevManager.java
index 79ed3f87510..b47dc576e5a 100644
--- a/src/main/java/org/olat/core/util/i18n/devtools/TranslationDevManager.java
+++ b/src/main/java/org/olat/core/util/i18n/devtools/TranslationDevManager.java
@@ -25,6 +25,7 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.nio.file.Files;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -687,7 +688,7 @@ public class TranslationDevManager {
 			}			
 		}
 		
-		log.info("found " + doupList.size() + " douplicated keys");		
+		log.info("found {} duplicated keys", doupList.size());		
 		return doupList;
 	}
 	
@@ -714,18 +715,22 @@ public class TranslationDevManager {
 			}			
 		}
 		
-		log.info("found " + doupList.size() + " douplicated values in keys");		
+		log.info("found {} douplicated values in keys", doupList.size());
 		return doupList;
 	}
 	
 	public void deletePackage(String bundleName) {
-		File path = getBundlePath(bundleName);
-		if (path.exists()) {
-			File[] files = path.listFiles();
-			for (int i = 0; i < files.length; i++) {
-				files[i].delete();
+		try {
+			File path = getBundlePath(bundleName);
+			if (path != null && path.exists()) {
+				File[] files = path.listFiles();
+				for (int i = 0; i < files.length; i++) {
+					Files.deleteIfExists(files[i].toPath());
+				}
+				Files.delete(path.toPath());
 			}
-			path.delete();
+		} catch (IOException e) {
+			log.error("Cannot delete bundle: {}", bundleName);
 		}
 	}
 
@@ -752,8 +757,12 @@ public class TranslationDevManager {
 
 	private void copyFile(File source, File dest) throws IOException {
 		if (!dest.exists()) {
-			if (!dest.getParentFile().exists()) dest.getParentFile().mkdirs();
-			dest.createNewFile();
+			if (!dest.getParentFile().exists()) {
+				dest.getParentFile().mkdirs();
+			}
+			if(!dest.createNewFile()) {
+				log.error("File cannot be created at: {}", dest);
+			}
 		}
 		
 		try(InputStream in = new FileInputStream(source);
diff --git a/src/main/java/org/olat/core/util/i18n/ui/I18nConfigSubDeletePackageController.java b/src/main/java/org/olat/core/util/i18n/ui/I18nConfigSubDeletePackageController.java
index 30308eea9c3..bc4654b7a4b 100644
--- a/src/main/java/org/olat/core/util/i18n/ui/I18nConfigSubDeletePackageController.java
+++ b/src/main/java/org/olat/core/util/i18n/ui/I18nConfigSubDeletePackageController.java
@@ -25,6 +25,8 @@
 package org.olat.core.util.i18n.ui;
 
 import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
 import java.util.Collection;
 
 import org.olat.core.gui.UserRequest;
@@ -97,13 +99,10 @@ class I18nConfigSubDeletePackageController extends FormBasicController {
 		submitButton.setEnabled(false); // enable as soon as something is checked
 	}
 
-	/**
-	 * @see org.olat.core.gui.components.form.flexible.impl.FormBasicController#formOK(org.olat.core.gui.UserRequest)
-	 */
 	@Override
 	protected void formOK(UserRequest ureq) {
 		Collection<String> toDelete = deleteLangPackSelection.getSelectedKeys();
-		if (toDelete.size() == 0) {
+		if (toDelete.isEmpty()) {
 			// should not happen since button disabled
 			return;
 		}
@@ -111,26 +110,12 @@ class I18nConfigSubDeletePackageController extends FormBasicController {
 				"configuration.management.package.delete.confirm", toDelete.toString()), dialogCtr);
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest,
-	 *      org.olat.core.gui.control.Controller, org.olat.core.gui.control.Event)
-	 */
+	@Override
 	public void event(UserRequest ureq, Controller source, Event event) {
 		if (source == dialogCtr) {
 			if (DialogBoxUIFactory.isYesEvent(event)) {
-				// Yes case, delete now
-				for (String deleteLangPack : deleteLangPackSelection.getSelectedKeys()) {
-					File file = new File(i18nModule.getLangPacksDirectory(), deleteLangPack);
-					if (file.exists()) file.delete();
-					logAudit("Deleted language pack::" + deleteLangPack);
-				}
-				// Reset i18n system
-				i18nModule.reInitializeAndFlushCache();
-				// wow, everything worked fine
-				showInfo("configuration.management.package.delete.success", deleteLangPackSelection.getSelectedKeys().toString());
+				doDelete();
 				fireEvent(ureq, Event.DONE_EVENT);
-			} else {
-				// No case, do nothing.
 			}
 		}
 	}
@@ -143,20 +128,32 @@ class I18nConfigSubDeletePackageController extends FormBasicController {
 			showInfo("configuration.management.package.delete.cancel");
 
 		} else if (source == deleteLangPackSelection) {
-			if (deleteLangPackSelection.getSelectedKeys().size() == 0) {
+			if (deleteLangPackSelection.getSelectedKeys().isEmpty()) {
 				submitButton.setEnabled(false);
 			} else {
 				submitButton.setEnabled(true);
 			}
 		}
 	}
+	
+	private void doDelete() {
+		try {
+			for (String deleteLangPack : deleteLangPackSelection.getSelectedKeys()) {
+				File file = new File(i18nModule.getLangPacksDirectory(), deleteLangPack);
+				Files.deleteIfExists(file.toPath());
+				logAudit("Deleted language pack::" + deleteLangPack);
+			}
+			// Reset i18n system
+			i18nModule.reInitializeAndFlushCache();
+			// wow, everything worked fine
+			showInfo("configuration.management.package.delete.success", deleteLangPackSelection.getSelectedKeys().toString());
+		} catch (IOException e) {
+			logError("", e);
+		}
+	}
 
-	/**
-	 * @see org.olat.core.gui.components.form.flexible.impl.FormBasicController#doDispose()
-	 */
 	@Override
 	protected void doDispose() {
-	// nothing to dispose
+		// nothing to dispose
 	}
-
 }
diff --git a/src/main/java/org/olat/core/util/mail/manager/MailManagerImpl.java b/src/main/java/org/olat/core/util/mail/manager/MailManagerImpl.java
index 47ef44323af..095f35dba89 100644
--- a/src/main/java/org/olat/core/util/mail/manager/MailManagerImpl.java
+++ b/src/main/java/org/olat/core/util/mail/manager/MailManagerImpl.java
@@ -615,13 +615,7 @@ public class MailManagerImpl implements MailManager, InitializingBean  {
 	public void deleteCustomMailTemplate() {
 		File baseFolder = new File(WebappHelper.getUserDataRoot(), MAIL_TEMPLATE_FOLDER);
 		File customTemplate = new File(baseFolder, "mail_template.html");
-		if (customTemplate.exists()) {
-			try {
-				customTemplate.delete();
-			} catch (Exception e) {
-				log.error("", e);
-			}
-		}
+		org.olat.core.util.FileUtils.deleteFile(customTemplate);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/assessment/manager/CourseAssessmentManagerImpl.java b/src/main/java/org/olat/course/assessment/manager/CourseAssessmentManagerImpl.java
index 3ee376efc64..e35ad6c7477 100644
--- a/src/main/java/org/olat/course/assessment/manager/CourseAssessmentManagerImpl.java
+++ b/src/main/java/org/olat/course/assessment/manager/CourseAssessmentManagerImpl.java
@@ -174,7 +174,7 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 
 		//node log
 		UserNodeAuditManager am = course.getCourseEnvironment().getAuditManager();
-		am.appendToUserNodeLog(courseNode, identity, assessedIdentity, "ATTEMPTS set to: " + String.valueOf(attempts), by);
+		am.appendToUserNodeLog(courseNode, identity, assessedIdentity, "ATTEMPTS set to: " + attempts, by);
 
 		// notify about changes
 		AssessmentChangedEvent ace = new AssessmentChangedEvent(AssessmentChangedEvent.TYPE_ATTEMPTS_CHANGED, assessedIdentity);
@@ -253,7 +253,7 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 	@Override
 	public void removeIndividualAssessmentDocument(CourseNode courseNode, Identity identity, Identity assessedIdentity, File document) {
 		if(document != null && document.exists()) {
-			document.delete();
+			FileUtils.deleteFile(document);
 			
 			//update counter
 			ICourse course = CourseFactory.loadCourse(cgm.getCourseEntry());
diff --git a/src/main/java/org/olat/course/certificate/manager/CertificatePhantomWorker.java b/src/main/java/org/olat/course/certificate/manager/CertificatePhantomWorker.java
index fb697d1d50a..d96b6bc3275 100644
--- a/src/main/java/org/olat/course/certificate/manager/CertificatePhantomWorker.java
+++ b/src/main/java/org/olat/course/certificate/manager/CertificatePhantomWorker.java
@@ -27,7 +27,7 @@ import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.Reader;
 import java.io.Writer;
-import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.util.ArrayList;
 import java.util.Date;
@@ -43,6 +43,7 @@ import org.olat.core.id.Identity;
 import org.olat.core.id.User;
 import org.olat.core.id.UserConstants;
 import org.olat.core.logging.Tracing;
+import org.olat.core.util.FileUtils;
 import org.olat.core.util.Formatter;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.i18n.I18nManager;
@@ -144,7 +145,7 @@ public class CertificatePhantomWorker {
 		VelocityContext context = getContext();
 		boolean result = false;
 		File htmlCertificate = new File(templateFile.getParent(), "c" + UUID.randomUUID() + ".html");
-		try(Reader in = Files.newBufferedReader(templateFile.toPath(), Charset.forName("UTF-8"));
+		try(Reader in = Files.newBufferedReader(templateFile.toPath(), StandardCharsets.UTF_8);
 			Writer output = new FileWriter(htmlCertificate)) {
 			result = certificatesManager.getVelocityEngine().evaluate(context, output, "mailTemplate", in);
 			output.flush();
@@ -371,7 +372,7 @@ public class CertificatePhantomWorker {
 				destroyProcess();
 			} finally {
 				if(htmlCertificateFile != null) {
-					htmlCertificateFile.delete();
+					FileUtils.deleteFile(htmlCertificateFile);
 				}
 			}
 		}
@@ -406,14 +407,14 @@ public class CertificatePhantomWorker {
 			}
 			
 			if(log.isDebugEnabled()) {
-				log.debug("Error: " + errors.toString());
-				log.debug("Output: " + output.toString());
+				log.debug("Error: {}", errors.toString());
+				log.debug("Output: {}", output.toString());
 			}
 
 			try {
 				exitValue = proc.waitFor();
 				if (exitValue != 0) {
-					log.warn("Problem with PhantomJS? " + exitValue);
+					log.warn("Problem with PhantomJS? {}", exitValue);
 				}
 			} catch (InterruptedException e) {
 				log.warn("Takes too long");
diff --git a/src/main/java/org/olat/course/nodes/ProjectBrokerCourseNode.java b/src/main/java/org/olat/course/nodes/ProjectBrokerCourseNode.java
index eecf5e079be..5d965201af0 100644
--- a/src/main/java/org/olat/course/nodes/ProjectBrokerCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/ProjectBrokerCourseNode.java
@@ -118,48 +118,48 @@ public class ProjectBrokerCourseNode extends AbstractAccessableCourseNode {
 	private static final long serialVersionUID = -8177448874150049173L;
 	private static final Logger log = Tracing.createLoggerFor(ProjectBrokerCourseNode.class);
 
-	private transient static final String PACKAGE_PROJECTBROKER = Util.getPackageName(ProjectListController.class);
-	private transient static final String PACKAGE = Util.getPackageName(ProjectBrokerCourseNode.class);
+	private static final transient String PACKAGE_PROJECTBROKER = Util.getPackageName(ProjectListController.class);
+	private static final transient String PACKAGE = Util.getPackageName(ProjectBrokerCourseNode.class);
 
-	public transient static final String TYPE = "projectbroker";
+	public static final transient String TYPE = "projectbroker";
 
 	// NLS support:
 
-	private transient static final String NLS_GUESTNOACCESS_TITLE = "guestnoaccess.title";
-	private transient static final String NLS_GUESTNOACCESS_MESSAGE = "guestnoaccess.message";
-	private transient static final String NLS_ERROR_MISSINGSCORECONFIG_SHORT = "error.missingscoreconfig.short";
-	private transient static final String NLS_WARN_NODEDELETE = "warn.nodedelete";
+	private static final transient String NLS_GUESTNOACCESS_TITLE = "guestnoaccess.title";
+	private static final transient String NLS_GUESTNOACCESS_MESSAGE = "guestnoaccess.message";
+	private static final transient String NLS_ERROR_MISSINGSCORECONFIG_SHORT = "error.missingscoreconfig.short";
+	private static final transient String NLS_WARN_NODEDELETE = "warn.nodedelete";
 
 	// MUST BE NON TRANSIENT
 	private static final int CURRENT_CONFIG_VERSION = 3;
 
 	/** CONF_DROPBOX_ENABLED configuration parameter key. */
-	public transient static final String CONF_DROPBOX_ENABLED = "dropbox_enabled";
+	public static final transient String CONF_DROPBOX_ENABLED = "dropbox_enabled";
 	/** CONF_DROPBOX_ENABLEMAIL configuration parameter key. */
-	public transient static final String CONF_DROPBOX_ENABLEMAIL = "dropbox_enablemail";
+	public static final transient String CONF_DROPBOX_ENABLEMAIL = "dropbox_enablemail";
 	/** CONF_DROPBOX_CONFIRMATION configuration parameter key. */
-	public transient static final String CONF_DROPBOX_CONFIRMATION = "dropbox_confirmation";
+	public static final transient String CONF_DROPBOX_CONFIRMATION = "dropbox_confirmation";
 
 	/** CONF_SCORING_ENABLED configuration parameter key. */
-	public transient static final String CONF_SCORING_ENABLED = "scoring_enabled";
+	public static final transient String CONF_SCORING_ENABLED = "scoring_enabled";
 
 	/** ACCESS_SCORING configuration parameter key. */
-	public transient static final String ACCESS_SCORING = "scoring";
+	public static final transient String ACCESS_SCORING = "scoring";
 	/** ACCESS_DROPBOX configuration parameter key. */
-	public transient static final String ACCESS_DROPBOX = "dropbox";
-	public transient static final String ACCESS_RETURNBOX = "returnbox";
-	public transient static final String ACCESS_PROJECTBROKER = "projectbroker";
+	public static final transient String ACCESS_DROPBOX = "dropbox";
+	public static final transient String ACCESS_RETURNBOX = "returnbox";
+	public static final transient String ACCESS_PROJECTBROKER = "projectbroker";
 
 	/** CONF_TASK_PREVIEW configuration parameter key used for task-form. */
-	public transient static final String CONF_TASK_PREVIEW = "task_preview";
+	public static final transient String CONF_TASK_PREVIEW = "task_preview";
 
-	public transient static final String CONF_RETURNBOX_ENABLED = "returnbox_enabled";
+	public static final transient String CONF_RETURNBOX_ENABLED = "returnbox_enabled";
 
-	public transient static final String CONF_ACCOUNTMANAGER_GROUP_KEY = "config_accountmanager_group_id";
+	public static final transient String CONF_ACCOUNTMANAGER_GROUP_KEY = "config_accountmanager_group_id";
 
-	public transient static final String CONF_PROJECTBROKER_KEY = "conf_projectbroker_id";
+	public static final transient String CONF_PROJECTBROKER_KEY = "conf_projectbroker_id";
 
-	public transient static final String CONF_NODE_SHORT_TITLE_KEY = "conf_node_short_title";
+	public static final transient String CONF_NODE_SHORT_TITLE_KEY = "conf_node_short_title";
 
 	// MUST BE NON TRANSIENT
 	private Condition conditionDrop, conditionScoring, conditionReturnbox;
@@ -582,7 +582,9 @@ public class ProjectBrokerCourseNode extends AbstractAccessableCourseNode {
 						Base64.encodeBase64String(project.getAttachmentFileName().getBytes()));
 				try {
 					attachmentFolder.mkdirs();
-					attachment.createNewFile();
+					if(!attachment.createNewFile()) {
+						log.error("Cannot create attachment file: {}", attachment);
+					}
 					FileOutputStream attachmentOutputStream = new FileOutputStream(attachment);
 					InputStream leafInputStream = itemLeaf.getInputStream();
 					FileUtils.copy(leafInputStream, attachmentOutputStream);
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/EditSolutionController.java b/src/main/java/org/olat/course/nodes/gta/ui/EditSolutionController.java
index c50c21665c3..f8073df4e78 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/EditSolutionController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/EditSolutionController.java
@@ -156,7 +156,7 @@ public class EditSolutionController extends FormBasicController {
 			if(replaceFile && StringHelper.containsNonWhitespace(solution.getFilename())) {
 				File currentFile = new File(solutionDir, solution.getFilename());
 				if(currentFile.exists()) {
-					currentFile.delete();
+					FileUtils.deleteFile(currentFile);
 				}
 			}
 
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/EditTaskController.java b/src/main/java/org/olat/course/nodes/gta/ui/EditTaskController.java
index ec6e83ac11d..ecce7f80c93 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/EditTaskController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/EditTaskController.java
@@ -179,7 +179,7 @@ public class EditTaskController extends FormBasicController {
 				if(usage == 1) {
 					File currentFile = new File(taskContainer, task.getFilename());
 					if(currentFile.exists()) {
-						currentFile.delete();
+						FileUtils.deleteFile(currentFile);
 					}
 				}
 			}
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/SubmitDocumentsController.java b/src/main/java/org/olat/course/nodes/gta/ui/SubmitDocumentsController.java
index 1b10c63bd6a..e592d98c3b6 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/SubmitDocumentsController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/SubmitDocumentsController.java
@@ -59,6 +59,7 @@ import org.olat.core.gui.control.generic.modal.DialogBoxController;
 import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
 import org.olat.core.gui.control.winmgr.CommandFactory;
 import org.olat.core.util.CodeHelper;
+import org.olat.core.util.FileUtils;
 import org.olat.core.util.io.SystemFileFilter;
 import org.olat.core.util.vfs.VFSConstants;
 import org.olat.core.util.vfs.VFSContainer;
@@ -398,9 +399,7 @@ class SubmitDocumentsController extends FormBasicController {
 
 	private void doDelete(UserRequest ureq, SubmittedSolution solution) {
 		File document = solution.getFile();
-		if(document.exists()) {
-			document.delete();
-		}
+		FileUtils.deleteFile(document);
 		updateModel(ureq);
 		updateWarnings();
 	}
@@ -433,9 +432,7 @@ class SubmitDocumentsController extends FormBasicController {
 	
 	private void doReplace(UserRequest ureq, SubmittedSolution solution, File file, String filename) {
 		File document = solution.getFile();
-		if(document.exists()) {
-			document.delete();
-		}
+		FileUtils.deleteFile(document);
 		doUpload(ureq, file, filename);
 	}
 	
diff --git a/src/main/java/org/olat/gui/demo/guidemo/GuiDemoFlexiForm.java b/src/main/java/org/olat/gui/demo/guidemo/GuiDemoFlexiForm.java
index d8df8749269..e4a7254b2a5 100644
--- a/src/main/java/org/olat/gui/demo/guidemo/GuiDemoFlexiForm.java
+++ b/src/main/java/org/olat/gui/demo/guidemo/GuiDemoFlexiForm.java
@@ -38,6 +38,7 @@ import org.olat.core.gui.components.form.flexible.impl.elements.FormSubmit;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
+import org.olat.core.util.FileUtils;
 import org.olat.core.util.WebappHelper;
 
 /**
@@ -78,9 +79,9 @@ public class GuiDemoFlexiForm extends FormBasicController {
 
 	@Override
 	protected void doDispose() {
-		// cleanup tempt files
-		if (tmpFile != null && tmpFile.exists()) {
-			tmpFile.delete();
+		// cleanup temp files
+		if (tmpFile != null) {
+			FileUtils.deleteFile(tmpFile);
 		}
 	}
 
@@ -99,7 +100,7 @@ public class GuiDemoFlexiForm extends FormBasicController {
 		personData.setReadOnly(true);
 
 		// get file and store it in temporary location
-		tmpFile = new File(WebappHelper.getTmpDir() + "/" + fileElement.getUploadFileName());
+		tmpFile = new File(WebappHelper.getTmpDir(), fileElement.getUploadFileName());
 		fileElement.moveUploadFileTo(tmpFile);
 		personData.setFile(tmpFile);
 		
diff --git a/src/main/java/org/olat/ims/cp/CPManagerImpl.java b/src/main/java/org/olat/ims/cp/CPManagerImpl.java
index cd18fa46f46..d96798c8ccf 100644
--- a/src/main/java/org/olat/ims/cp/CPManagerImpl.java
+++ b/src/main/java/org/olat/ims/cp/CPManagerImpl.java
@@ -114,9 +114,7 @@ public class CPManagerImpl implements CPManager {
 		File reFolder = frm.getFileResourceRoot(ores);
 		File configXml = new File(reFolder, PACKAGE_CONFIG_FILE_NAME);
 		if(config == null) {
-			if(configXml.exists()) {
-				configXml.delete();
-			}
+			FileUtils.deleteFile(configXml);
 		} else {
 			try(OutputStream out = new FileOutputStream(configXml)) {
 				configXstream.toXML(config, out);
diff --git a/src/main/java/org/olat/ims/qti/editor/QTIEditorPackageImpl.java b/src/main/java/org/olat/ims/qti/editor/QTIEditorPackageImpl.java
index 1898f501124..2092c7a06fa 100644
--- a/src/main/java/org/olat/ims/qti/editor/QTIEditorPackageImpl.java
+++ b/src/main/java/org/olat/ims/qti/editor/QTIEditorPackageImpl.java
@@ -185,6 +185,7 @@ public class QTIEditorPackageImpl implements QTIEditorPackage {
 	 * Return the media base URL for delivering media of this package.
 	 * @return Complete media base URL.
 	 */
+	@Override
 	public String getMediaBaseURL() {
 		return WebappHelper.getServletContextPath() + "/secstatic/qtieditor/" + packageSubDir;
 	}
@@ -204,8 +205,7 @@ public class QTIEditorPackageImpl implements QTIEditorPackage {
 			localDir.setLocalSecurityCallback(secCallback);
 		}
 		String dirName = translator.translate("qti.basedir.displayname");
-		NamedContainerImpl namedBaseDir = new NamedContainerImpl(dirName, localDir);
-		return namedBaseDir;
+		return new NamedContainerImpl(dirName, localDir);
 	}
 	
 	/**
@@ -266,14 +266,16 @@ public class QTIEditorPackageImpl implements QTIEditorPackage {
 		// move file from temp to repository root and rename
 		File fRepositoryZip = frm.getFileResource(fileResource);
 		if (!FileUtils.moveFileToDir(tmpZipFile, frm.getFileResourceRoot(fileResource))) {
-			tmpZipFile.delete();
+			FileUtils.deleteFile(tmpZipFile);
 			return false;
 		}
-		fRepositoryZip.delete();
-		new File(frm.getFileResourceRoot(fileResource), tmpZipFile.getName()).renameTo(fRepositoryZip);
+		FileUtils.deleteFile(fRepositoryZip);
+		if(!new File(frm.getFileResourceRoot(fileResource), tmpZipFile.getName()).renameTo(fRepositoryZip)) {
+			log.error("Cannot rename: {}", fRepositoryZip);
+		}
 		// delete old unzip content. If the repository entry gets called in the meantime,
 		// the package will get unzipped again.
-		tmpZipFile.delete();
+		FileUtils.deleteFile(tmpZipFile);
 		frm.deleteUnzipContent(fileResource);
 		// to be prepared for the next start, unzip right now.
 		return (frm.unzipFileResource(fileResource) != null);
diff --git a/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java b/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java
index 3a98891a7a9..1631bb85cea 100644
--- a/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java
+++ b/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java
@@ -316,9 +316,7 @@ public class QTI21ServiceImpl implements QTI21Service, UserDataDeletable, Initia
 		File reFolder = frm.getFileResourceRoot(testEntry.getOlatResource());
 		File configXml = new File(reFolder, PACKAGE_CONFIG_FILE_NAME);
 		if(options == null) {
-			if(configXml.exists()) {
-				configXml.delete();
-			}
+			FileUtils.deleteFile(configXml);
 		} else {
 			try (OutputStream out = new FileOutputStream(configXml)) {
 				configXstream.toXML(options, out);
@@ -1156,11 +1154,9 @@ public class QTI21ServiceImpl implements QTI21Service, UserDataDeletable, Initia
         final File resultFile = getAssessmentResultFile(candidateSession);
 
 		testSessionDao.deleteTestSession(candidateSession);
-		if(sessionState != null && sessionState.exists()) {
-			sessionState.delete();
-		}
-		if(resultFile != null && resultFile.exists()) {
-			resultFile.delete();
+		FileUtils.deleteFile(sessionState);
+		if(resultFile != null) {
+			FileUtils.deleteFile(resultFile);
 		}
 	}
 	
diff --git a/src/main/java/org/olat/ims/qti21/repository/handlers/CopyAndConvertVisitor.java b/src/main/java/org/olat/ims/qti21/repository/handlers/CopyAndConvertVisitor.java
index 3b2fb172247..7e837f6d0fd 100644
--- a/src/main/java/org/olat/ims/qti21/repository/handlers/CopyAndConvertVisitor.java
+++ b/src/main/java/org/olat/ims/qti21/repository/handlers/CopyAndConvertVisitor.java
@@ -45,6 +45,7 @@ import javax.xml.stream.XMLStreamWriter;
 import org.apache.logging.log4j.Logger;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.logging.Tracing;
+import org.olat.core.util.FileUtils;
 import org.olat.core.util.WebappHelper;
 import org.olat.core.util.xml.XMLFactories;
 import org.olat.fileresource.types.ImsQTI21Resource;
@@ -149,13 +150,10 @@ class CopyAndConvertVisitor extends SimpleFileVisitor<Path> {
 				fileInfos.setVersion(infos.getVersion());
 			}
 			if(onyx38Family(fileInfos)) {
-				validated = convertXmlFile(inputFile, outputFile, fileInfos.getType(), xtw -> {
-					return new Onyx38ToQtiWorksHandler(xtw);
-				});
+				validated = convertXmlFile(inputFile, outputFile, fileInfos.getType(), Onyx38ToQtiWorksHandler::new);
 			} else if(onyxWebFamily(fileInfos)) {
-				validated = convertXmlFile(inputFile, outputFile, fileInfos.getType(), xtw -> {
-					return new OnyxToQtiWorksHandler(xtw, infos);
-				});
+				validated = convertXmlFile(inputFile, outputFile, fileInfos.getType(), xtw ->
+					 new OnyxToQtiWorksHandler(xtw, infos));
 				
 				if(validated && fileInfos.getType() == InputType.assessmentItem) {
 					//check templateVariables
@@ -218,9 +216,7 @@ class CopyAndConvertVisitor extends SimpleFileVisitor<Path> {
 			log.error("", e1);
 			return false;
 		} finally {
-			if(tmpFile.exists()) {
-				tmpFile.delete();
-			}
+			FileUtils.deleteFile(tmpFile);
 		}
 	}
 	
diff --git a/src/main/java/org/olat/modules/co/ContactForm.java b/src/main/java/org/olat/modules/co/ContactForm.java
index 464d5bbfaaa..1f8b17fa883 100644
--- a/src/main/java/org/olat/modules/co/ContactForm.java
+++ b/src/main/java/org/olat/modules/co/ContactForm.java
@@ -419,7 +419,7 @@ public class ContactForm extends FormBasicController {
 			File uploadedFile = (File)source.getUserObject();
 			if(uploadedFile != null && uploadedFile.exists()) {
 				attachmentSize -= uploadedFile.length();
-				uploadedFile.delete();
+				FileUtils.deleteFile(uploadedFile);
 			}
 			attachmentLinks.remove(source);
 			uploadCont.remove(source);
diff --git a/src/main/java/org/olat/modules/fo/ui/MessageEditController.java b/src/main/java/org/olat/modules/fo/ui/MessageEditController.java
index c6e8abfe19e..ab119a4ea6d 100644
--- a/src/main/java/org/olat/modules/fo/ui/MessageEditController.java
+++ b/src/main/java/org/olat/modules/fo/ui/MessageEditController.java
@@ -60,6 +60,7 @@ import org.olat.core.id.Identity;
 import org.olat.core.logging.DBRuntimeException;
 import org.olat.core.logging.activity.ThreadLocalUserActivityLogger;
 import org.olat.core.util.CodeHelper;
+import org.olat.core.util.FileUtils;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
 import org.olat.core.util.WebappHelper;
@@ -630,7 +631,7 @@ public class MessageEditController extends FormBasicController {
 
 					if (fileExists) {
 						fileUpload.setErrorKey("attachments.error.file.exists", null);
-						fileUpload.getUploadFile().delete();
+						FileUtils.deleteFile(fileUpload.getUploadFile());
 						fileUpload.showError(true);
 					} else {
 						// files got stored in an extra tempFolder, to use the same
@@ -644,7 +645,7 @@ public class MessageEditController extends FormBasicController {
 					}
 				} else {
 					fileUpload.setErrorKey("attachments.too.big", new String[] { Long.toString((fileUpload.getMaxUploadSizeKB() / 1024)) });
-					fileUpload.getUploadFile().delete();
+					FileUtils.deleteFile(fileUpload.getUploadFile());
 					fileUpload.showError(true);
 				}
 			}
diff --git a/src/main/java/org/olat/modules/library/manager/LibraryManagerImpl.java b/src/main/java/org/olat/modules/library/manager/LibraryManagerImpl.java
index a0e8c97f2ea..223ba838c5e 100644
--- a/src/main/java/org/olat/modules/library/manager/LibraryManagerImpl.java
+++ b/src/main/java/org/olat/modules/library/manager/LibraryManagerImpl.java
@@ -42,6 +42,7 @@ import org.olat.core.gui.control.Event;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.logging.Tracing;
+import org.olat.core.util.FileUtils;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.event.GenericEventListener;
@@ -302,23 +303,23 @@ public class LibraryManagerImpl implements LibraryManager, InitializingBean, Gen
 	public void lockFolderAndPreventDoubleIndexing() {
 		File lockFile = new File(getSharedFolder().getBasefile(), NO_FOLDER_INDEXING_LOCKFILE);
 		try {
-			lockFile.createNewFile();
+			if(!lockFile.createNewFile()) {
+				log.error("Cannot create lock file: {}", lockFile);
+			}
 		} catch (IOException e) {
 			log.error("could not create lock-file in shared folder for library.", e);
 		}
 	}
 
 	/**
-	 * Remove old lockfile before changing linked resource folder
+	 * Remove old lock file before changing linked resource folder
 	 */
 	@Override
 	public void removeExistingLockFile(){
 		LocalFolderImpl folder = getSharedFolder();
 		if(folder != null && folder.exists()) {
 			File lockFile = new File(folder.getBasefile(), NO_FOLDER_INDEXING_LOCKFILE);
-			if (lockFile.exists()) {
-				lockFile.delete();
-			}
+			FileUtils.deleteFile(lockFile);
 		}
 	}
 	
diff --git a/src/main/java/org/olat/modules/portfolio/manager/PortfolioServiceImpl.java b/src/main/java/org/olat/modules/portfolio/manager/PortfolioServiceImpl.java
index 75b00155f91..986afdbe895 100644
--- a/src/main/java/org/olat/modules/portfolio/manager/PortfolioServiceImpl.java
+++ b/src/main/java/org/olat/modules/portfolio/manager/PortfolioServiceImpl.java
@@ -349,9 +349,7 @@ public class PortfolioServiceImpl implements PortfolioService {
 		File reFolder = frm.getFileResourceRoot(resource);
 		File configXml = new File(reFolder, PACKAGE_CONFIG_FILE_NAME);
 		if(options == null) {
-			if(configXml.exists()) {
-				configXml.delete();
-			}
+			FileUtils.deleteFile(configXml);
 		} else {
 			try (OutputStream out = new FileOutputStream(configXml)) {
 				configXstream.toXML(options, out);
@@ -1090,9 +1088,7 @@ public class PortfolioServiceImpl implements PortfolioService {
 		if(StringHelper.containsNonWhitespace(imagePath)) {
 			File bcroot = portfolioFileStorage.getRootDirectory();
 			File file = new File(bcroot, imagePath);
-			if(file.exists()) {
-				file.delete();
-			}
+			FileUtils.deleteFile(file);
 		}
 	}
 
diff --git a/src/main/java/org/olat/modules/portfolio/ui/AssignmentEditController.java b/src/main/java/org/olat/modules/portfolio/ui/AssignmentEditController.java
index b0980b00784..bf02738105c 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/AssignmentEditController.java
+++ b/src/main/java/org/olat/modules/portfolio/ui/AssignmentEditController.java
@@ -549,7 +549,7 @@ public class AssignmentEditController extends FormBasicController {
 
 		if (fileExists) {
 			documentUploadEl.setErrorKey("attachments.error.file.exists", null);
-			documentUploadEl.getUploadFile().delete();
+			FileUtils.deleteFile(documentUploadEl.getUploadFile());
 			documentUploadEl.showError(true);
 		} else {
 			// files got stored in an extra tempFolder, to use the same
diff --git a/src/main/java/org/olat/modules/quality/manager/QualityMailing.java b/src/main/java/org/olat/modules/quality/manager/QualityMailing.java
index c5a1145b415..52459901098 100644
--- a/src/main/java/org/olat/modules/quality/manager/QualityMailing.java
+++ b/src/main/java/org/olat/modules/quality/manager/QualityMailing.java
@@ -471,7 +471,7 @@ class QualityMailing {
 			if (reportPdf.length() > 0) {
 				return reportPdf;
 			}
-			reportPdf.delete();
+			FileUtils.deleteFile(reportPdf);
 		}
 		return null;
 	}
diff --git a/src/main/java/org/olat/modules/scorm/ScormMainManager.java b/src/main/java/org/olat/modules/scorm/ScormMainManager.java
index a857220ebff..28fd8973994 100644
--- a/src/main/java/org/olat/modules/scorm/ScormMainManager.java
+++ b/src/main/java/org/olat/modules/scorm/ScormMainManager.java
@@ -35,6 +35,7 @@ import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.iframe.DeliveryOptions;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.logging.Tracing;
+import org.olat.core.util.FileUtils;
 import org.olat.core.util.xml.XStreamHelper;
 import org.olat.fileresource.FileResourceManager;
 import org.springframework.stereotype.Service;
@@ -87,9 +88,7 @@ public class ScormMainManager {
 		File reFolder = frm.getFileResourceRoot(ores);
 		File configXml = new File(reFolder, PACKAGE_CONFIG_FILE_NAME);
 		if(config == null) {
-			if(configXml.exists()) {
-				configXml.delete();
-			}
+			FileUtils.deleteFile(configXml);
 		} else {
 			try(OutputStream out = new FileOutputStream(configXml)) {
 				configXstream.toXML(config, out);
diff --git a/src/main/java/org/olat/modules/scorm/archiver/ScormExportManager.java b/src/main/java/org/olat/modules/scorm/archiver/ScormExportManager.java
index 40d4a08a877..606b55de625 100644
--- a/src/main/java/org/olat/modules/scorm/archiver/ScormExportManager.java
+++ b/src/main/java/org/olat/modules/scorm/archiver/ScormExportManager.java
@@ -135,7 +135,7 @@ public class ScormExportManager {
 					document.loadDocument(((LocalFileImpl)file).getBasefile());
 				}
 				else {
-					logger.warn("Cannot use this type of VSFItem to load a SCO Datamodel: " + file.getClass().getName());
+					logger.warn("Cannot use this type of VSFItem to load a SCO Datamodel: {}", file.getClass().getName());
 					continue;
 				}
 
diff --git a/src/main/java/org/olat/modules/scorm/server/servermodels/ScoDocument.java b/src/main/java/org/olat/modules/scorm/server/servermodels/ScoDocument.java
index 9f04ea61c9c..82f6902cb84 100644
--- a/src/main/java/org/olat/modules/scorm/server/servermodels/ScoDocument.java
+++ b/src/main/java/org/olat/modules/scorm/server/servermodels/ScoDocument.java
@@ -71,7 +71,7 @@ public class ScoDocument extends XMLDocument {
 	 * split intot part_a and part_b so we can insert 'n' number of <objective>
 	 * nodes if the sco creates them during a session
 	 */
-	public static String[] _cmivalues_a = { "cmi.core.student_id", "cmi.core.student_name", "cmi.core.lesson_location", "cmi.core.credit",
+	private static String[] _cmivalues_a = { "cmi.core.student_id", "cmi.core.student_name", "cmi.core.lesson_location", "cmi.core.credit",
 			"cmi.core.lesson_status", "cmi.core.entry", "cmi.core.score.raw", "cmi.core.score.max", "cmi.core.score.min", "cmi.core.total_time",
 			"cmi.core.lesson_mode", "cmi.core.exit", "cmi.core.session_time", "cmi.suspend_data", "cmi.launch_data", "cmi.comments",
 			"cmi.comments_from_lms", };
@@ -79,7 +79,7 @@ public class ScoDocument extends XMLDocument {
 	/**
 	 * <objective> nodes go between part_a and part_b
 	 */
-	public static String[] _cmivalues_b = { "cmi.student_data.mastery_score", "cmi.student_data.max_time_allowed",
+	private static String[] _cmivalues_b = { "cmi.student_data.mastery_score", "cmi.student_data.max_time_allowed",
 			"cmi.student_data.time_limit_action", "cmi.student_preference.audio", "cmi.student_preference.language",
 			"cmi.student_preference.speed", "cmi.student_preference.text", };
 
diff --git a/src/main/java/org/olat/modules/video/ui/VideoPosterUploadForm.java b/src/main/java/org/olat/modules/video/ui/VideoPosterUploadForm.java
index a3807091532..107d1c1e2fa 100644
--- a/src/main/java/org/olat/modules/video/ui/VideoPosterUploadForm.java
+++ b/src/main/java/org/olat/modules/video/ui/VideoPosterUploadForm.java
@@ -32,6 +32,7 @@ import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
+import org.olat.core.util.FileUtils;
 import org.olat.core.util.vfs.LocalFolderImpl;
 import org.olat.core.util.vfs.Quota;
 import org.olat.core.util.vfs.VFSContainer;
@@ -47,7 +48,6 @@ import org.olat.resource.OLATResource;
 public class VideoPosterUploadForm extends FormBasicController {
 	private OLATResource videoResource;
 	private long remainingSpace;
-	private VFSContainer videoResourceFileroot;
 	private VFSContainer metaDataFolder;
 	private FileElement posterField;
 
@@ -69,7 +69,7 @@ public class VideoPosterUploadForm extends FormBasicController {
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
 		remainingSpace = Quota.UNLIMITED;
-		videoResourceFileroot = new LocalFolderImpl(FileResourceManager.getInstance().getFileResourceRootImpl(videoResource).getBasefile());
+		VFSContainer videoResourceFileroot = new LocalFolderImpl(FileResourceManager.getInstance().getFileResourceRootImpl(videoResource).getBasefile());
 		metaDataFolder = VFSManager.getOrCreateContainer(videoResourceFileroot, "media");
 
 		posterField = uifactory.addFileElement(getWindowControl(), "poster", "video.config.poster", formLayout);
@@ -92,8 +92,7 @@ public class VideoPosterUploadForm extends FormBasicController {
 			if (remainingSpace != -1) {
 				if (posterField.getUploadFile().length() / 1024 > remainingSpace) {
 					posterField.setErrorKey("QuotaExceeded", null);
-					posterField.getUploadFile().delete();
-					return;
+					FileUtils.deleteFile(posterField.getUploadFile());
 				}
 			} else {
 				fireEvent(ureq, new FolderEvent(FolderEvent.UPLOAD_EVENT, posterField.moveUploadFileTo(metaDataFolder)));
diff --git a/src/main/java/org/olat/repository/ui/author/SendMailController.java b/src/main/java/org/olat/repository/ui/author/SendMailController.java
index 13828cf30f8..376ff3d078e 100644
--- a/src/main/java/org/olat/repository/ui/author/SendMailController.java
+++ b/src/main/java/org/olat/repository/ui/author/SendMailController.java
@@ -78,7 +78,8 @@ public class SendMailController extends FormBasicController {
 	private RichTextElement bodyEl;
 	private FileElement attachmentEl;
 	private TextElement subjectEl;
-	private MultipleSelectionElement contactEl, copyFromEl;
+	private MultipleSelectionElement contactEl;
+	private MultipleSelectionElement copyFromEl;
 	private FormLayoutContainer uploadCont;
 	
 	private int counter = 0;
@@ -155,7 +156,7 @@ public class SendMailController extends FormBasicController {
 	
 	@Override
 	protected boolean validateFormLogic(UserRequest ureq) {
-		boolean allOk = true;
+		boolean allOk = super.validateFormLogic(ureq);
 		
 		subjectEl.clearError();
 		if(!StringHelper.containsNonWhitespace(subjectEl.getValue())) {
@@ -175,7 +176,7 @@ public class SendMailController extends FormBasicController {
 			allOk &= false;
 		}
 		
-		return allOk & super.validateFormLogic(ureq);
+		return allOk;
 	}
 	
 	private File[] getAttachments() {
@@ -190,7 +191,8 @@ public class SendMailController extends FormBasicController {
 	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
 		if(source == attachmentEl) {
 			doUploadAttachement();
-		} if(source instanceof FormLink) {
+		}
+		if(source instanceof FormLink) {
 			FormLink link = (FormLink)source;
 			String cmd = link.getCmd();
 			if("delete".equals(cmd)) {
@@ -203,9 +205,9 @@ public class SendMailController extends FormBasicController {
 	
 	private void doDeleteAttachment(Attachment attachment) {
 		attachmentSize -= attachment.getFile().length();
-		attachment.getFile().delete();
+		FileUtils.deleteFile(attachment.getFile());
 		attachments.remove(attachment);
-		uploadCont.setVisible(attachments.size() > 0);
+		uploadCont.setVisible(!attachments.isEmpty());
 		uploadCont.setDirty(true);
 	}
 	
diff --git a/src/main/java/org/olat/restapi/support/MultipartReader.java b/src/main/java/org/olat/restapi/support/MultipartReader.java
index 57e7eb2f10d..0aaccafa4ec 100644
--- a/src/main/java/org/olat/restapi/support/MultipartReader.java
+++ b/src/main/java/org/olat/restapi/support/MultipartReader.java
@@ -21,6 +21,7 @@ package org.olat.restapi.support;
 
 import java.io.File;
 import java.io.IOException;
+import java.nio.file.Files;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
@@ -131,7 +132,11 @@ public class MultipartReader {
 
 	public void close() {
 		if (file != null) {
-			file.delete();
+			try {
+				Files.deleteIfExists(file.toPath());
+			} catch (IOException e) {
+				log.error("", e);
+			}
 		}
 		fields.clear();
 	}
diff --git a/src/main/java/org/olat/restapi/system/StatusWebservice.java b/src/main/java/org/olat/restapi/system/StatusWebservice.java
index 1b393508bd4..235e66831f7 100644
--- a/src/main/java/org/olat/restapi/system/StatusWebservice.java
+++ b/src/main/java/org/olat/restapi/system/StatusWebservice.java
@@ -22,6 +22,7 @@ package org.olat.restapi.system;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.nio.file.Files;
 import java.util.List;
 import java.util.Set;
 
@@ -94,7 +95,7 @@ public class StatusWebservice {
 			WorkThreadInformations.unset();
 			stats.setWriteFileInMilliseconds(CodeHelper.nanoToMilliTime(startFile));
 			stats.setWriteFile(infoFile.exists());
-			infoFile.delete();
+			Files.deleteIfExists(infoFile.toPath());
 		} catch (Exception e) {
 			stats.setWriteFile(false);
 			stats.setWriteFileInMilliseconds(-1l);
@@ -107,12 +108,12 @@ public class StatusWebservice {
 			
 			PropertyManager propertyManager = CoreSpringFactory.getImpl(PropertyManager.class);
 			List<Property> props = propertyManager.findProperties((Identity)null, (BusinessGroup)null, PING_RESOURCE, PING_REF, PING_REF);
-			if(props != null && props.size() > 0) {
+			if(props != null && !props.isEmpty()) {
 				for(Property prop:props) {
 					propertyManager.deleteProperty(prop);
 				}
-				DBFactory.getInstance().commit();
 			}
+			DBFactory.getInstance().commit();
 			
 			long startDB = System.nanoTime();
 			Property prop = propertyManager.createPropertyInstance(null, null, PING_RESOURCE, PING_REF, PING_REF, 0f, 0l, "-", "-");
diff --git a/src/main/java/org/olat/search/service/document/file/PdfDocument.java b/src/main/java/org/olat/search/service/document/file/PdfDocument.java
index 4fb1c9de4cb..f0494b3dcef 100644
--- a/src/main/java/org/olat/search/service/document/file/PdfDocument.java
+++ b/src/main/java/org/olat/search/service/document/file/PdfDocument.java
@@ -35,6 +35,7 @@ import org.apache.lucene.document.Document;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.util.CSSHelper;
 import org.olat.core.logging.Tracing;
+import org.olat.core.util.FileUtils;
 import org.olat.core.util.io.LimitedContentWriter;
 import org.olat.core.util.vfs.VFSLeaf;
 import org.olat.search.service.SearchResourceContext;
@@ -89,7 +90,7 @@ public class PdfDocument extends FileDocument {
 		String hashCodeAsString = Integer.toString(hashCode);
 		String splitDirName = hashCodeAsString.substring(hashCodeAsString.length()-2);
 		String pdfTextTmpFilePath = splitDirName + File.separator + hashCodeAsString + leafResourceContext.getFilePath();
-		if (log.isDebugEnabled()) log.debug("PdfTextTmpFilePath=" + pdfTextTmpFilePath);
+		if (log.isDebugEnabled()) log.debug("PdfTextTmpFilePath={}", pdfTextTmpFilePath);
 		return pdfTextTmpFilePath;
 	}
 
@@ -144,6 +145,7 @@ public class PdfDocument extends FileDocument {
 	
 			return new FileContent(title, sb.toString());
 		} catch(IOException e) {
+			log.error("", e);
 			throw e;
 		}
 	}
@@ -161,7 +163,7 @@ public class PdfDocument extends FileDocument {
 		}	
 		if (leaf.getLastModified() > pdfTextFile.lastModified() ) {
 			// pdf file is newer => delete it
-			pdfTextFile.delete();
+			FileUtils.deleteFile(pdfTextFile);
 			return true;
 		}
 		return false;
diff --git a/src/main/java/org/olat/user/DisplayPortraitManager.java b/src/main/java/org/olat/user/DisplayPortraitManager.java
index d5c57fffcaf..515eec43da9 100644
--- a/src/main/java/org/olat/user/DisplayPortraitManager.java
+++ b/src/main/java/org/olat/user/DisplayPortraitManager.java
@@ -287,9 +287,9 @@ public class DisplayPortraitManager implements UserDataDeletable, UserDataExport
 		if(directory != null) {
 			for(File currentImage:directory.listFiles()) {
 				if(currentImage.equals(file)) {
-					continue;
+					// do nothing
 				} else if(currentImage.getName().startsWith(prefix)) {
-					currentImage.delete();
+					FileUtils.deleteFile(currentImage);
 				}
 			}
 		}
@@ -339,7 +339,7 @@ public class DisplayPortraitManager implements UserDataDeletable, UserDataExport
 			for(File file:directory.listFiles()) {
 				String filename = file.getName();
 				if(filename.startsWith(prefix)) {
-					file.delete();
+					FileUtils.deleteFile(file);
 				}
 			}
 		}
diff --git a/src/main/java/org/olat/user/manager/HomePageConfigManagerImpl.java b/src/main/java/org/olat/user/manager/HomePageConfigManagerImpl.java
index bd297051932..189d3a60813 100644
--- a/src/main/java/org/olat/user/manager/HomePageConfigManagerImpl.java
+++ b/src/main/java/org/olat/user/manager/HomePageConfigManagerImpl.java
@@ -31,6 +31,7 @@ import org.olat.core.commons.modules.bc.FolderConfig;
 import org.olat.core.id.Identity;
 import org.apache.logging.log4j.Logger;
 import org.olat.core.logging.Tracing;
+import org.olat.core.util.FileUtils;
 import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSManager;
 import org.olat.core.util.xml.XStreamHelper;
@@ -86,7 +87,7 @@ public class HomePageConfigManagerImpl implements HomePageConfigManager {
 			} catch (Exception e) {
 				log.error("Error while loading homepage config from path::" + configFile.getAbsolutePath() + ", fallback to default configuration",
 						e);
-				if (configFile.exists()) configFile.delete();
+				FileUtils.deleteFile(configFile);
 				retVal = loadAndSaveDefaults(identity);
 				// show message to user
 			}
-- 
GitLab