diff --git a/src/main/java/org/olat/core/commons/controllers/linkchooser/FileLinkChooserController.java b/src/main/java/org/olat/core/commons/controllers/linkchooser/FileLinkChooserController.java index 0b0650c3e4d6d7473c305243936d5feebcc921a7..7c44930216e74afa929ea0f04ff707661c98ea6d 100644 --- a/src/main/java/org/olat/core/commons/controllers/linkchooser/FileLinkChooserController.java +++ b/src/main/java/org/olat/core/commons/controllers/linkchooser/FileLinkChooserController.java @@ -128,14 +128,16 @@ public class FileLinkChooserController extends BasicController { // create directory filter combined with suffix filter String[] dirFilters = { "_courseelementdata" }; VFSItemFilter customFilter = null; - VFSItemFilter dirFilter = new VFSItemExcludePrefixFilter(dirFilters); + VFSItemFilter dirFilter = new VFSItemExcludePrefixFilter(dirFilters, true); if (suffixes != null) { - VFSItemFileTypeFilter typeFilter = new VFSItemFileTypeFilter(suffixes, uriValidation); + VFSItemFileTypeFilter typeFilter = new VFSItemFileTypeFilter(suffixes, true, uriValidation); typeFilter.setCompositeFilter(dirFilter); customFilter = typeFilter; } else { customFilter = dirFilter; } + + // hide file chooser title, we have our own title fileChooserController = FileChooserUIFactory .createFileChooserControllerWithoutTitle(ureq, getWindowControl(), rootDir, diff --git a/src/main/java/org/olat/core/commons/modules/bc/components/FolderComponent.java b/src/main/java/org/olat/core/commons/modules/bc/components/FolderComponent.java index 9acdd0e0d2609176c6468558b61508b96f2af780..fc8de76942a38810a0813d434b1714b4ed3de9be 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/components/FolderComponent.java +++ b/src/main/java/org/olat/core/commons/modules/bc/components/FolderComponent.java @@ -59,7 +59,6 @@ import org.olat.core.util.vfs.VFSConstants; import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSItem; import org.olat.core.util.vfs.VFSLeaf; -import org.olat.core.util.vfs.filters.VFSItemExcludePrefixFilter; import org.olat.core.util.vfs.filters.VFSItemFilter; import org.olat.core.util.vfs.filters.VFSSystemItemFilter; @@ -76,15 +75,6 @@ public class FolderComponent extends AbstractComponent { public static final String SORT_DATE = "date"; public static final String SORT_REV = "revision"; public static final String SORT_LOCK = "lock"; - - // see MessagesEditController - // see OLAT-4182/OLAT-4219 and OLAT-4259 - // the filtering of .nfs is sort of temporary until we make sure that we no longer reference - // attached files anywhere at the time of deleting it - // likely to be resolved after user logs out, caches get cleared - and if not the server - // restart overnight definitely removes those .nfs files. - // fxdiff: FXOLAT-333 hide all shadow-files per default - public static final String[] ATTACHMENT_EXCLUDE_PREFIXES = new String[]{"."}; protected boolean sortAsc = true; // asc or desc? protected String sortCol = ""; // column to sort @@ -103,7 +93,7 @@ public class FolderComponent extends AbstractComponent { protected Translator translator; private VFSItemFilter filter; private final DateFormat dateTimeFormat; - private VFSItemExcludePrefixFilter exclFilter; + private VFSItemFilter exclFilter; private CustomLinkTreeModel customLinkTreeModel; private final VFSContainer externContainerForCopy; @@ -142,7 +132,7 @@ public class FolderComponent extends AbstractComponent { this.filter = filter; this.customLinkTreeModel = customLinkTreeModel; this.externContainerForCopy = externContainerForCopy; - exclFilter = new VFSItemExcludePrefixFilter(ATTACHMENT_EXCLUDE_PREFIXES); + exclFilter = new VFSSystemItemFilter(); Locale locale = ureq.getLocale(); collator = Collator.getInstance(locale); translator = Util.createPackageTranslator(FolderRunController.class, locale); diff --git a/src/main/java/org/olat/core/util/vfs/filters/VFSItemExcludePrefixFilter.java b/src/main/java/org/olat/core/util/vfs/filters/VFSItemExcludePrefixFilter.java index 9c281376e218de597983c171f4783382342c09cf..48c0b839a31957f80e4529c805c0f2055b36666c 100644 --- a/src/main/java/org/olat/core/util/vfs/filters/VFSItemExcludePrefixFilter.java +++ b/src/main/java/org/olat/core/util/vfs/filters/VFSItemExcludePrefixFilter.java @@ -26,8 +26,8 @@ package org.olat.core.util.vfs.filters; -import java.util.Enumeration; -import java.util.Hashtable; +import java.util.HashMap; +import java.util.Map; import org.olat.core.util.vfs.VFSItem; @@ -41,13 +41,15 @@ import org.olat.core.util.vfs.VFSItem; */ public class VFSItemExcludePrefixFilter implements VFSItemFilter { - private Hashtable<String,String> excludedPrefixes = new Hashtable<String,String>(); - + private final boolean excludeSystemFiles; + private final Map<String,String> excludedPrefixes = new HashMap<>(); + /** * Constrtuctor * @param prefixes */ - public VFSItemExcludePrefixFilter(String[] prefixes) { + public VFSItemExcludePrefixFilter(String[] prefixes, boolean excludeSystemFiles) { + this.excludeSystemFiles = excludeSystemFiles; for (int i = 0; i < prefixes.length; i++) { addExcludedPrefix(prefixes[i]); } @@ -68,19 +70,18 @@ public class VFSItemExcludePrefixFilter implements VFSItemFilter { excludedPrefixes.remove(prefix.toLowerCase()); } - /** - * @see org.olat.core.util.vfs.filters.VFSItemFilter#accept(org.olat.core.util.vfs.VFSItem) - */ + @Override public boolean accept(VFSItem vfsItem) { String name = vfsItem.getName().toLowerCase(); - Enumeration<String> elements = excludedPrefixes.elements(); - while (elements.hasMoreElements() ) { - String excludedPrefix = elements.nextElement(); + if(excludeSystemFiles && name.startsWith(".")) { + return false; + } + + for(String excludedPrefix : excludedPrefixes.keySet()) { if (name.startsWith(excludedPrefix)) { return false; } } return true; } - } diff --git a/src/main/java/org/olat/core/util/vfs/filters/VFSItemFileTypeFilter.java b/src/main/java/org/olat/core/util/vfs/filters/VFSItemFileTypeFilter.java index 74c6c47867a6a203d7c2fbd8e918a93bf80d5ec3..f9478f0874dc1e2b111441d77e25c7b7d49e1e8c 100644 --- a/src/main/java/org/olat/core/util/vfs/filters/VFSItemFileTypeFilter.java +++ b/src/main/java/org/olat/core/util/vfs/filters/VFSItemFileTypeFilter.java @@ -21,7 +21,7 @@ package org.olat.core.util.vfs.filters; import java.net.URI; -import java.util.Hashtable; +import java.util.HashMap; import java.util.Map; import org.olat.core.util.vfs.VFSContainer; @@ -37,15 +37,17 @@ import org.olat.core.util.vfs.VFSItem; public class VFSItemFileTypeFilter extends VFSItemCompositeFilter { private final boolean uriValidation; - private Map<String, String> fileTypes = new Hashtable<String, String>(); + private final boolean excludeSystemFiles; + private Map<String, String> fileTypes = new HashMap<>(); /** * Constrtuctor * * @param filetypes */ - public VFSItemFileTypeFilter(String[] fileTypes, boolean uriValidation) { + public VFSItemFileTypeFilter(String[] fileTypes, boolean excludeSystemFiles, boolean uriValidation) { this.uriValidation = uriValidation; + this.excludeSystemFiles = excludeSystemFiles; for (int i = 0; i < fileTypes.length; i++) { addFileType(fileTypes[i]); } @@ -66,9 +68,6 @@ public class VFSItemFileTypeFilter extends VFSItemCompositeFilter { fileTypes.remove(fileType.toLowerCase()); } - /** - * @see org.olat.core.util.vfs.filters.VFSItemCompositeFilter#acceptFilter(VFSItem) - */ @Override public boolean acceptFilter(VFSItem vfsItem) { if (vfsItem instanceof VFSContainer) { @@ -84,8 +83,12 @@ public class VFSItemFileTypeFilter extends VFSItemCompositeFilter { } } + if(excludeSystemFiles && name.startsWith(".")) { + return false; + } + name = name.toLowerCase(); - int dotPos = name.lastIndexOf("."); + int dotPos = name.lastIndexOf('.'); if (dotPos == -1) return false; return fileTypes.containsKey(name.substring(dotPos + 1)); } diff --git a/src/main/java/org/olat/course/nodes/pf/manager/CountingCallback.java b/src/main/java/org/olat/course/nodes/pf/manager/CountingCallback.java index 121ce465943ae22e6a9f603dd94a66ccb5454312..74dd24afeafc09bd006f9346f283589d5c8d1579 100644 --- a/src/main/java/org/olat/course/nodes/pf/manager/CountingCallback.java +++ b/src/main/java/org/olat/course/nodes/pf/manager/CountingCallback.java @@ -21,14 +21,13 @@ package org.olat.course.nodes.pf.manager; import java.util.List; -import org.olat.core.commons.modules.bc.components.FolderComponent; import org.olat.core.commons.services.notifications.SubscriptionContext; import org.olat.core.util.vfs.Quota; import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSItem; import org.olat.core.util.vfs.callbacks.VFSSecurityCallback; -import org.olat.core.util.vfs.filters.VFSItemExcludePrefixFilter; import org.olat.core.util.vfs.filters.VFSItemFilter; +import org.olat.core.util.vfs.filters.VFSSystemItemFilter; /** * * @author Fabian Kiefer, fabian.kiefer@frentix.com, http://www.frentix.com @@ -36,7 +35,7 @@ import org.olat.core.util.vfs.filters.VFSItemFilter; */ public class CountingCallback implements VFSSecurityCallback { - private static final VFSItemFilter attachmentExcludeFilter = new VFSItemExcludePrefixFilter(FolderComponent.ATTACHMENT_EXCLUDE_PREFIXES); + private static final VFSItemFilter attachmentExcludeFilter = new VFSSystemItemFilter(); private SubscriptionContext subsContext; private VFSContainer dropbox; diff --git a/src/main/java/org/olat/course/nodes/pf/manager/PFManager.java b/src/main/java/org/olat/course/nodes/pf/manager/PFManager.java index 8274c7f56fe5fd9df46b36cc9f15ce22e4ad0b7d..4c8d6f962e695007096da693cf0a6363b2bb75fb 100644 --- a/src/main/java/org/olat/course/nodes/pf/manager/PFManager.java +++ b/src/main/java/org/olat/course/nodes/pf/manager/PFManager.java @@ -37,7 +37,6 @@ import java.util.Set; import java.util.stream.Collectors; import org.olat.basesecurity.GroupRoles; -import org.olat.core.commons.modules.bc.components.FolderComponent; import org.olat.core.commons.services.notifications.SubscriptionContext; import org.olat.core.gui.translator.Translator; import org.olat.core.id.Identity; @@ -54,8 +53,8 @@ import org.olat.core.util.vfs.VFSLeaf; import org.olat.core.util.vfs.VFSManager; import org.olat.core.util.vfs.VirtualContainer; import org.olat.core.util.vfs.callbacks.VFSSecurityCallback; -import org.olat.core.util.vfs.filters.VFSItemExcludePrefixFilter; import org.olat.core.util.vfs.filters.VFSItemFilter; +import org.olat.core.util.vfs.filters.VFSSystemItemFilter; import org.olat.course.CourseModule; import org.olat.course.nodes.PFCourseNode; import org.olat.course.nodes.pf.ui.DropBoxRow; @@ -86,7 +85,7 @@ import org.springframework.stereotype.Service; public class PFManager { private static final OLog log = Tracing.createLoggerFor(PFManager.class); - private static final VFSItemFilter attachmentExcludeFilter = new VFSItemExcludePrefixFilter(FolderComponent.ATTACHMENT_EXCLUDE_PREFIXES); + private static final VFSItemFilter attachmentExcludeFilter = new VFSSystemItemFilter(); public static final String FILENAME_PARTICIPANTFOLDER = "participantfolder"; public static final String FILENAME_RETURNBOX = "returnbox"; diff --git a/src/main/java/org/olat/course/nodes/pf/ui/PFPeekviewController.java b/src/main/java/org/olat/course/nodes/pf/ui/PFPeekviewController.java index a546bf56a005326f677a0c2f163968855c1c4216..7e2e58202c346e9ca67f3d20318fb93dc55e25b2 100644 --- a/src/main/java/org/olat/course/nodes/pf/ui/PFPeekviewController.java +++ b/src/main/java/org/olat/course/nodes/pf/ui/PFPeekviewController.java @@ -27,7 +27,6 @@ import java.util.List; import org.olat.core.CoreSpringFactory; import org.olat.core.commons.modules.bc.FolderModule; -import org.olat.core.commons.modules.bc.components.FolderComponent; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.download.DownloadComponent; @@ -44,8 +43,8 @@ import org.olat.core.util.vfs.LocalFileImpl; import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSItem; import org.olat.core.util.vfs.VFSLeaf; -import org.olat.core.util.vfs.filters.VFSItemExcludePrefixFilter; import org.olat.core.util.vfs.filters.VFSItemFilter; +import org.olat.core.util.vfs.filters.VFSSystemItemFilter; /** * * @author Fabian Kiefer, fabian.kiefer@frentix.com, http://www.frentix.com @@ -61,7 +60,7 @@ public class PFPeekviewController extends BasicController implements Controller // the current course node id private final String nodeId; - private static final VFSItemFilter attachmentExcludeFilter = new VFSItemExcludePrefixFilter(FolderComponent.ATTACHMENT_EXCLUDE_PREFIXES); + private static final VFSItemFilter attachmentExcludeFilter = new VFSSystemItemFilter(); public PFPeekviewController(UserRequest ureq, WindowControl wControl, VFSContainer rootFolder, String nodeId, int itemsToDisplay) { super(ureq, wControl); @@ -69,14 +68,14 @@ public class PFPeekviewController extends BasicController implements Controller VelocityContainer peekviewVC = createVelocityContainer("peekview"); // add items, only as many as configured - List<VFSLeaf> allLeafs = new ArrayList<VFSLeaf>(); + List<VFSLeaf> allLeafs = new ArrayList<>(); addItems(rootFolder, allLeafs); // Sort messages by last modified date Collections.sort(allLeafs, dateSortingComparator); boolean forceDownload = CoreSpringFactory.getImpl(FolderModule.class).isForceDownload(); // only take the configured amount of messages - List<VFSLeaf> leafs = new ArrayList<VFSLeaf>(); + List<VFSLeaf> leafs = new ArrayList<>(); for (int i = 0; i < allLeafs.size(); i++) { if (leafs.size() == itemsToDisplay) { break; @@ -103,8 +102,6 @@ public class PFPeekviewController extends BasicController implements Controller putInitialPanel(peekviewVC); } - - @Override protected void event(UserRequest ureq, Component source, Event event) { if (source instanceof Link) { @@ -120,7 +117,7 @@ public class PFPeekviewController extends BasicController implements Controller @Override protected void doDispose() { - + // } private void addItems(VFSContainer container, List<VFSLeaf> allLeafs) { @@ -139,6 +136,4 @@ public class PFPeekviewController extends BasicController implements Controller } } } - - } diff --git a/src/main/java/org/olat/gui/demo/guidemo/GuiDemoFileChooserController.java b/src/main/java/org/olat/gui/demo/guidemo/GuiDemoFileChooserController.java index b30376e127049a3f955536e8494ac666ce8db17d..ce8e7929ee714e119c73c30c692346db958169de 100644 --- a/src/main/java/org/olat/gui/demo/guidemo/GuiDemoFileChooserController.java +++ b/src/main/java/org/olat/gui/demo/guidemo/GuiDemoFileChooserController.java @@ -37,8 +37,8 @@ import org.olat.core.util.vfs.LocalFolderImpl; import org.olat.core.util.vfs.LocalImpl; import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSItem; -import org.olat.core.util.vfs.filters.VFSItemExcludePrefixFilter; import org.olat.core.util.vfs.filters.VFSItemFilter; +import org.olat.core.util.vfs.filters.VFSSystemItemFilter; /** * Description:<br> @@ -68,7 +68,7 @@ public class GuiDemoFileChooserController extends BasicController { webappRootFile = new File(WebappHelper.getContextRealPath("/static")); VFSContainer webappRoot = new LocalFolderImpl(webappRootFile); // don't show cvs and hidden files meta files - VFSItemFilter filter = new VFSItemExcludePrefixFilter(new String[]{"CVS","cvs", "."}); + VFSItemFilter filter = new VFSSystemItemFilter(); // create file chooser with the filter and the web app root chooserCtr = FileChooserUIFactory.createFileChooserController(ureq, getWindowControl(), webappRoot, filter, false); listenTo(chooserCtr); diff --git a/src/main/java/org/olat/ims/cp/objects/CPFile.java b/src/main/java/org/olat/ims/cp/objects/CPFile.java index 4d5e0b08600c916c96dac94fd0946e118d9d7ccb..127904c45176dec1eaaeaa8a18026f10b8622c65 100644 --- a/src/main/java/org/olat/ims/cp/objects/CPFile.java +++ b/src/main/java/org/olat/ims/cp/objects/CPFile.java @@ -36,8 +36,8 @@ import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSItem; import org.olat.core.util.vfs.VFSLeaf; import org.olat.core.util.vfs.VFSManager; -import org.olat.core.util.vfs.filters.VFSItemExcludePrefixFilter; import org.olat.core.util.vfs.filters.VFSItemFilter; +import org.olat.core.util.vfs.filters.VFSSystemItemFilter; import org.olat.fileresource.FileResourceManager; import org.olat.ims.cp.CPCore; @@ -169,8 +169,7 @@ public class CPFile extends DefaultElement implements CPNode { * @param parentContainer */ private void deleteIfEmpty(VFSContainer container) { - String[] unwantedPrefixes = { "." }; - VFSItemFilter filter = new VFSItemExcludePrefixFilter(unwantedPrefixes); + VFSItemFilter filter = new VFSSystemItemFilter(); if (container != null) { List<VFSItem> items = container.getItems(filter); if (items == null || items.isEmpty()) { diff --git a/src/main/java/org/olat/ims/cp/ui/CPFileImportController.java b/src/main/java/org/olat/ims/cp/ui/CPFileImportController.java index 146f8a34e50ae1a93cfb3c1a0be3f18e84fa5d22..08f54b30ac799420ad3ea0141aef1a4e3d9d94d1 100644 --- a/src/main/java/org/olat/ims/cp/ui/CPFileImportController.java +++ b/src/main/java/org/olat/ims/cp/ui/CPFileImportController.java @@ -48,8 +48,8 @@ import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSItem; import org.olat.core.util.vfs.VFSLeaf; import org.olat.core.util.vfs.VFSManager; -import org.olat.core.util.vfs.filters.VFSItemExcludePrefixFilter; import org.olat.core.util.vfs.filters.VFSItemFilter; +import org.olat.core.util.vfs.filters.VFSSystemItemFilter; import org.olat.ims.cp.CPManager; import org.olat.ims.cp.ContentPackage; import org.springframework.beans.factory.annotation.Autowired; @@ -66,8 +66,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class CPFileImportController extends FormBasicController { private static final String ALL = "all"; - private static final String[] prefixes = new String[] { "." }; - private static final VFSItemFilter excludeMetaFilesFilter = new VFSItemExcludePrefixFilter(prefixes); + private static final VFSItemFilter excludeMetaFilesFilter = new VFSSystemItemFilter(); private FileElement file; private FormLink cancelButton;