/*- * Copyright © 2009 Diamond Light Source Ltd. * * This file is part of GDA. * * GDA is free software: you can redistribute it and/or modify it under the * terms of the GNU General Public License version 3 as published by the Free * Software Foundation. * * GDA is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along * with GDA. If not, see <http://www.gnu.org/licenses/>. */ package uk.ac.gda.util.io; import java.io.File; import java.io.FileFilter; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.regex.Pattern; import uk.ac.gda.util.list.SortNatural; /** * @author Matthew Gerring * */ public class SortingUtils { /** * */ public static final Comparator<File> NATURAL_SORT = new SortNatural<File>(true); /** * */ public static final Comparator<Object> NATURAL_SORT_CASE_INSENSITIVE = new SortNatural<Object>(false); private static final Comparator<File> DEFAULT_COMPARATOR = new Comparator<File>() { @Override public int compare(File one, File two) { return one.compareTo(two); } }; /** * Lists folders before files * @param dir * @return List<File> */ public static List<File> getSortedFileList(final File dir) { return getSortedFileList(dir, DEFAULT_COMPARATOR); } /** * Lists folders before files * @param dir * @return List<File> */ public static List<File> getSortedFileList(final File dir, final boolean dirsFirst) { return getSortedFileList(dir, DEFAULT_COMPARATOR, dirsFirst); } /** * Lists folders before files * @param dir * @param comp * @return List<File> */ public static List<File> getSortedFileList(final File dir, final Comparator<File> comp) { return getSortedFileList(dir, comp, false); } private static List<File> getSortedFileList(final File dir, final Comparator<File> comp, final boolean dirsFirst) { if (!dir.isDirectory()) return null; if (dir.listFiles()==null) return null; final List<File> ret; if (dirsFirst) { ret = new ArrayList<File>(dir.listFiles().length); final List<File> dirs = getSortedFileList(dir.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return pathname.isDirectory(); } }), comp); if (dirs!=null) ret.addAll(dirs); final List<File> files = getSortedFileList(dir.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return !pathname.isDirectory(); } }), comp); if (files!=null) ret.addAll(files); } else { ret = getSortedFileList(dir.listFiles(), comp); } if (ret.isEmpty()) return null; return ret; } /** * @param dir * @param fileFilter * @param comp * @return List<File> */ public static List<File> getSortedFileList(final File dir, FileFilter fileFilter, final Comparator<File> comp) { return getSortedFileList(dir.listFiles(fileFilter), comp); } /** * @param dir * @param fileFilter * @return List<File> */ public static List<File> getSortedFileList(File dir, FileFilter fileFilter) { return getSortedFileList(dir.listFiles(fileFilter), DEFAULT_COMPARATOR); } /** * @param comp * @return List<File> */ private static List<File> getSortedFileList(final File[] fa, final Comparator<File> comp) { if (fa == null || fa.length<1) return null; final List<File> files = new ArrayList<File>(fa.length); files.addAll(Arrays.asList(fa)); Collections.sort(files, comp); return files; } public static void removeIgnoredNames(Collection<String> sets, Collection<Pattern> patterns) { if (patterns==null) return; if (sets==null) return; for (Iterator<String> it = sets.iterator(); it.hasNext();) { final String name = it.next(); PATTERN_LOOP: for (Pattern pattern : patterns) { if (pattern.matcher(name).matches()) { it.remove(); break PATTERN_LOOP; } } } } }