+/*\r
+ * Projekt:\r
+ * Dateiname: DirectoryManager.java\r
+ * Erzeugt: 07.01.2010\r
+ * Beschreibung:\r
+ * ***********************************************************************\r
+ * Modification History:\r
+ * ***********************************************************************\r
+ */\r
+package de.laktatnebel.libs.filelib;\r
+\r
+import de.laktatnebel.libs.filelib.exception.AbstractFileLibException;\r
+import de.laktatnebel.libs.filelib.exception.DirectoryManagerException;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.nio.file.FileVisitOption;\r
+import java.nio.file.FileVisitResult;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.SimpleFileVisitor;\r
+import java.nio.file.attribute.BasicFileAttributes;\r
+import java.util.ArrayList;\r
+import java.util.HashSet;\r
+import java.util.List;\r
+import java.util.Set;\r
+import java.util.regex.Matcher;\r
+import java.util.regex.Pattern;\r
+\r
+/**\r
+ * @author olgehrma\r
+ */\r
+public class DirectoryManager {\r
+\r
+ protected static class PatternMatcher {\r
+ /**\r
+ * \r
+ * @param mimePattern\r
+ * @param listOfFiles\r
+ * @param path\r
+ * @return\r
+ * @throws IOException\r
+ */\r
+ protected static boolean getNamePattern(final String namePattern, final List<Path> listOfFiles, final Path path)\r
+ throws IOException {\r
+ final String name = path.toFile().getAbsolutePath();\r
+ return getPattern(namePattern, listOfFiles, path, name);\r
+ }\r
+\r
+ /**\r
+ * \r
+ * @param mimePattern\r
+ * @param listOfFiles\r
+ * @param path\r
+ * @return\r
+ * @throws IOException\r
+ */\r
+ protected static boolean getMimePattern(final String mimePattern, final List<Path> listOfFiles, final Path path)\r
+ throws IOException {\r
+ final String mime = Files.probeContentType(path);\r
+ return getPattern(mimePattern, listOfFiles, path, mime);\r
+ }\r
+\r
+ /**\r
+ * \r
+ * @param patternToFind\r
+ * @param listOfFiles\r
+ * @param path\r
+ * @param candidate\r
+ * @return\r
+ */\r
+ private static boolean getPattern(final String patternToFind, final List<Path> listOfFiles, final Path path,\r
+ final String candidate) {\r
+ if (candidate == null) {\r
+ return true;\r
+ } else {\r
+ Pattern pattern = Pattern.compile(patternToFind);\r
+ Matcher matcher = pattern.matcher(candidate);\r
+ if (matcher.find()) {\r
+ return true;\r
+ }\r
+ }\r
+ return false;\r
+ }\r
+ }\r
+\r
+ private static final String FIND_ALL_PATTERN = ".*?";\r
+\r
+ /**\r
+ * Liefert ArrayList<Path> von Files in einem Verzeichnis.\r
+ * \r
+ * @param pathName\r
+ * Pfadname\r
+ * @return List of Filenames\r
+ * @throws AbstractFileLibException\r
+ * DirectoryManagerException\r
+ */\r
+ public static List<Path> readPathAsListOfPath(final String pathName) throws AbstractFileLibException {\r
+ final File directorySources = new File(pathName);\r
+\r
+ if (!directorySources.isDirectory()) {\r
+ throw new DirectoryManagerException("FEHLER - Pfad ist kein Verzeichnis!");\r
+ }\r
+\r
+ String[] arrayOfFileNames = directorySources.list();\r
+\r
+ List<Path> listOfFiles = new ArrayList<Path>();\r
+\r
+ for (String fileName : arrayOfFileNames) {\r
+ listOfFiles.add(new File(fileName).toPath());\r
+ }\r
+\r
+ return listOfFiles;\r
+ }\r
+\r
+ public static void makeNewDirectory(final String targetDirectory) throws DirectoryManagerException {\r
+ if (targetDirectory != null) {\r
+ final File newPath = new File(targetDirectory);\r
+ newPath.mkdirs();\r
+ } else {\r
+ throw new DirectoryManagerException("\"targetDirectory\" ist nicht angegeben.");\r
+ }\r
+ }\r
+\r
+ private static List<Path> getPathListFromPath(final Path startPath, final String namePattern, final String mimePattern,\r
+ final DirectoryFilesSwitch directoryFilesSwitch, boolean recursivly) throws AbstractFileLibException {\r
+\r
+ if (namePattern == null || namePattern.isEmpty()) {\r
+ throw new DirectoryManagerException("Invalid parameter \"namePattern\": null or empty!");\r
+ }\r
+\r
+ final List<Path> listOfFiles = new ArrayList<Path>();\r
+\r
+ final Set<FileVisitOption> options = new HashSet<FileVisitOption>();\r
+ options.add(FileVisitOption.FOLLOW_LINKS);\r
+\r
+ int maxValue = 1;\r
+ if (recursivly) {\r
+ maxValue = Integer.MAX_VALUE;\r
+ }\r
+\r
+ try {\r
+\r
+ switch (directoryFilesSwitch) {\r
+ case DIRECTORIES:\r
+ Files.walkFileTree(startPath, options, maxValue, new SimpleFileVisitor<Path>() {\r
+ @Override\r
+ public FileVisitResult visitFileFailed(final Path path, final IOException ioe) {\r
+ return FileVisitResult.SKIP_SUBTREE;\r
+ }\r
+\r
+ @Override\r
+ public FileVisitResult preVisitDirectory(final Path path, final BasicFileAttributes attribs) {\r
+\r
+ try {\r
+ if (PatternMatcher.getNamePattern(namePattern, listOfFiles, path)) {\r
+ listOfFiles.add(path);\r
+ }\r
+ } catch (final IOException ioe) {\r
+ throw (RuntimeException) new RuntimeException().initCause(ioe);\r
+ }\r
+\r
+ return FileVisitResult.CONTINUE;\r
+ }\r
+\r
+ });\r
+ break;\r
+ case FILES:\r
+ Files.walkFileTree(startPath, options, maxValue, new SimpleFileVisitor<Path>() {\r
+ @Override\r
+ public FileVisitResult visitFileFailed(final Path path, final IOException ioe) {\r
+ return FileVisitResult.SKIP_SUBTREE;\r
+ }\r
+\r
+ @Override\r
+ public FileVisitResult visitFile(final Path path, final BasicFileAttributes attribs) {\r
+\r
+ try {\r
+ if (PatternMatcher.getNamePattern(namePattern, listOfFiles, path)\r
+ && PatternMatcher.getMimePattern(mimePattern, listOfFiles, path)) {\r
+ listOfFiles.add(path);\r
+ }\r
+ } catch (final IOException ioe) {\r
+ throw (RuntimeException) new RuntimeException().initCause(ioe);\r
+ }\r
+\r
+ return FileVisitResult.CONTINUE;\r
+ }\r
+\r
+ });\r
+ break;\r
+ case DIRECRTORIES_FILES:\r
+ Files.walkFileTree(startPath, options, maxValue, new SimpleFileVisitor<Path>() {\r
+ @Override\r
+ public FileVisitResult visitFileFailed(final Path path, final IOException ioe) {\r
+ return FileVisitResult.SKIP_SUBTREE;\r
+ }\r
+\r
+ @Override\r
+ public FileVisitResult preVisitDirectory(final Path path, final BasicFileAttributes attribs) {\r
+\r
+ try {\r
+ if (PatternMatcher.getNamePattern(namePattern, listOfFiles, path)) {\r
+ listOfFiles.add(path);\r
+ }\r
+ } catch (final IOException ioe) {\r
+ throw (RuntimeException) new RuntimeException().initCause(ioe);\r
+ }\r
+\r
+ return FileVisitResult.CONTINUE;\r
+ }\r
+\r
+ @Override\r
+ public FileVisitResult visitFile(final Path path, final BasicFileAttributes attribs) {\r
+\r
+ try {\r
+ if (PatternMatcher.getNamePattern(namePattern, listOfFiles, path)\r
+ && PatternMatcher.getMimePattern(mimePattern, listOfFiles, path)) {\r
+ listOfFiles.add(path);\r
+ }\r
+ } catch (final IOException ioe) {\r
+ throw (RuntimeException) new RuntimeException().initCause(ioe);\r
+ }\r
+\r
+ return FileVisitResult.CONTINUE;\r
+ }\r
+ });\r
+ break;\r
+ }\r
+\r
+ } catch (final IOException ioe) {\r
+ throw new DirectoryManagerException(ioe.getMessage(), ioe);\r
+ }\r
+\r
+ return listOfFiles;\r
+ }\r
+\r
+ /**\r
+ * Liefert Liste von Files und Verzeichnissen als ArrayList<java.nio.file.Path>\r
+ * \r
+ * @param startPath\r
+ * Path Startpunkt (Verzeichnis) der rekursiven Suche als java.nio.file.Path\r
+ * @param mimePattern\r
+ * String Filter-Pattern. Nur Namen von Files, die zum Pattern passen, werden genommen, null oder empty liefert\r
+ * Exception!\r
+ * @return ArrayList<java.nio.file.Path> Liste von File-Objeten\r
+ * @throws AbstractFileLibException\r
+ * DirectoryManagerException\r
+ */\r
+ public static List<Path> getPathListRecursivlyFromPath(final Path startPath, final String mimePattern)\r
+ throws AbstractFileLibException {\r
+\r
+ return DirectoryManager.getPathListFromPath(startPath, FIND_ALL_PATTERN, mimePattern, DirectoryFilesSwitch.FILES, true);\r
+ }\r
+\r
+ public static List<Path> getPathListNoneRecursivlyFromPath(final Path startPath, final String mimePattern)\r
+ throws AbstractFileLibException {\r
+\r
+ return DirectoryManager.getPathListFromPath(startPath, FIND_ALL_PATTERN, mimePattern, DirectoryFilesSwitch.FILES, false);\r
+ }\r
+\r
+ /**\r
+ * Liefert Liste von Files und Verzeichnissen als ArrayList<java.nio.file.Path>\r
+ * \r
+ * @param startPath\r
+ * Path Startpunkt (Verzeichnis) der rekursiven Suche als java.nio.file.Path\r
+ * @param mimePattern\r
+ * String Filter-Pattern. Nur Namen von Files, die zum Pattern passen, werden genommen, null oder empty liefert\r
+ * Exception!\r
+ * @return ArrayList<java.nio.file.Path> Liste von File-Objeten\r
+ * @throws AbstractFileLibException\r
+ * DirectoryManagerException\r
+ */\r
+ public static List<Path> getPathListRecursivlyFromPath(final Path startPath, final DirectoryFilesSwitch directoryFilesSwitch,\r
+ final String mimePattern) throws AbstractFileLibException {\r
+\r
+ return DirectoryManager.getPathListFromPath(startPath, FIND_ALL_PATTERN, mimePattern, directoryFilesSwitch, true);\r
+ }\r
+\r
+ public static List<Path> getPathListNoneRecursivlyFromPath(final Path startPath,\r
+ final DirectoryFilesSwitch directoryFilesSwitch, final String mimePattern) throws AbstractFileLibException {\r
+\r
+ return DirectoryManager.getPathListFromPath(startPath, FIND_ALL_PATTERN, mimePattern, directoryFilesSwitch, false);\r
+ }\r
+\r
+ public static List<Path> getPathListRecursivlyFromPath(final Path startPath, final DirectoryFilesSwitch directoryFilesSwitch)\r
+ throws AbstractFileLibException {\r
+ return DirectoryManager.getPathListFromPath(startPath, FIND_ALL_PATTERN, FIND_ALL_PATTERN, directoryFilesSwitch, true);\r
+ }\r
+\r
+ public static List<Path> getPathListNoneRecursivlyFromPath(final Path startPath, final DirectoryFilesSwitch directoryFilesSwitch)\r
+ throws AbstractFileLibException {\r
+ return DirectoryManager.getPathListFromPath(startPath, FIND_ALL_PATTERN, FIND_ALL_PATTERN, directoryFilesSwitch, false);\r
+ }\r
+\r
+ /**\r
+ * Liefert Liste von Files und Verzeichnissen als ArrayList<java.nio.file.Path>\r
+ * \r
+ * @param startPath\r
+ * Path Startpunkt (Verzeichnis) der rekursiven Suche als java.nio.file.Path\r
+ * @param mimePattern\r
+ * String Filter-Pattern. Nur Namen von Files, die zum Pattern passen, werden genommen, null oder empty liefert\r
+ * Exception!\r
+ * @return ArrayList<java.nio.file.Path> Liste von File-Objeten\r
+ * @throws AbstractFileLibException\r
+ * DirectoryManagerException\r
+ */\r
+ public static List<Path> getFilteredPathListRecursivlyFromPath(final Path startPath, final String namePattern,\r
+ final String mimePattern) throws AbstractFileLibException {\r
+\r
+ return DirectoryManager.getPathListFromPath(startPath, namePattern, mimePattern, DirectoryFilesSwitch.FILES, true);\r
+ }\r
+\r
+ public static List<Path> getFilteredPathListNoneRecursivlyFromPath(final Path startPath, final String namePattern,\r
+ final String mimePattern) throws AbstractFileLibException {\r
+\r
+ return DirectoryManager.getPathListFromPath(startPath, namePattern, mimePattern, DirectoryFilesSwitch.FILES, false);\r
+ }\r
+\r
+ /**\r
+ * Liefert Liste von Files und Verzeichnissen als ArrayList<java.nio.file.Path>\r
+ * \r
+ * @param startPath\r
+ * Path Startpunkt (Verzeichnis) der rekursiven Suche als java.nio.file.Path\r
+ * @param mimePattern\r
+ * String Filter-Pattern. Nur Namen von Files, die zum Pattern passen, werden genommen, null oder empty liefert\r
+ * Exception!\r
+ * @return ArrayList<java.nio.file.Path> Liste von File-Objeten\r
+ * @throws AbstractFileLibException\r
+ * DirectoryManagerException\r
+ */\r
+ public static List<Path> getFilteredPathListRecursivlyFromPath(final Path startPath,\r
+ final DirectoryFilesSwitch directoryFilesSwitch, final String namePattern, final String mimePattern)\r
+ throws AbstractFileLibException {\r
+\r
+ return DirectoryManager.getPathListFromPath(startPath, namePattern, mimePattern, directoryFilesSwitch, true);\r
+ }\r
+\r
+ public static List<Path> getFilteredPathListNoneRecursivlyFromPath(final Path startPath,\r
+ final DirectoryFilesSwitch directoryFilesSwitch, final String namePattern, final String mimePattern)\r
+ throws AbstractFileLibException {\r
+\r
+ return DirectoryManager.getPathListFromPath(startPath, namePattern, mimePattern, directoryFilesSwitch, false);\r
+ }\r
+\r
+ public static List<Path> getFilteredPathListRecursivlyFromPath(final Path startPath,\r
+ final DirectoryFilesSwitch directoryFilesSwitch, final String namePattern) throws AbstractFileLibException {\r
+ return DirectoryManager.getPathListFromPath(startPath, namePattern, FIND_ALL_PATTERN, directoryFilesSwitch, true);\r
+ }\r
+\r
+ public static List<Path> getFilteredPathListNoneRecursivlyFromPath(final Path startPath,\r
+ final DirectoryFilesSwitch directoryFilesSwitch, final String namePattern) throws AbstractFileLibException {\r
+ return DirectoryManager.getPathListFromPath(startPath, namePattern, FIND_ALL_PATTERN, directoryFilesSwitch, false);\r
+ }\r
+\r
+ public List<File> getFilesFromPathes(List<Path> pathes) {\r
+\r
+ List<File> files = new ArrayList<File>();\r
+ for (Path path : pathes) {\r
+ files.add(path.toFile());\r
+ }\r
+ return files;\r
+ }\r
+\r
+ public List<String> getFileNamesFromPathes(List<Path> pathes) throws AbstractFileLibException {\r
+\r
+ List<String> files = new ArrayList<String>();\r
+ try {\r
+ for (Path path : pathes) {\r
+ files.add(path.toFile().getCanonicalPath());\r
+ }\r
+ } catch (IOException ioe) {\r
+ throw new DirectoryManagerException(ioe.getMessage(), ioe);\r
+ }\r
+ return files;\r
+ }\r
+\r
+}\r