/* * SK's Minecraft Launcher * Copyright (C) 2010-2014 Albert Pham <http://www.sk89q.com> and contributors * Please see LICENSE.txt for license information. */ package com.skcraft.launcher.builder; import lombok.NonNull; import java.io.File; import java.io.IOException; /** * Abstract class to recursively walk a directory, keep track of a relative * path (which may be modified by dropping certain directory entries), * and call {@link #onFile(java.io.File, String)} with each file. */ public abstract class DirectoryWalker { public enum DirectoryBehavior { /** * Continue and add the given directory to the relative path. */ CONTINUE, /** * Continue but don't add the given directory to the relative path. */ IGNORE, /** * Don't walk this directory. */ SKIP } /** * Walk the given directory. * * @param dir the directory * @throws IOException thrown on I/O error */ public final void walk(@NonNull File dir) throws IOException { walk(dir, ""); } /** * Recursively walk the given directory and keep track of the relative path. * * @param dir the directory * @param basePath the base path * @throws IOException */ private void walk(@NonNull File dir, @NonNull String basePath) throws IOException { if (!dir.isDirectory()) { throw new IllegalArgumentException(dir.getAbsolutePath() + " is not a directory"); } File[] files = dir.listFiles(); if (files != null) { for (File file : files) { if (file.isDirectory()) { String newPath = basePath; switch (getBehavior(file.getName())) { case CONTINUE: newPath += file.getName() + "/"; case IGNORE: walk(file, newPath); break; case SKIP: break; } } else { onFile(file, basePath + file.getName()); } } } } /** * Return the behavior for the given directory name. * * @param name the directory name * @return the behavor */ protected DirectoryBehavior getBehavior(String name) { return DirectoryBehavior.CONTINUE; } /** * Callback on each file. * * @param file the file * @param relPath the relative path * @throws IOException thrown on I/O error */ protected abstract void onFile(File file, String relPath) throws IOException; }