org.sonar.plugins.delphi.utils.DirectoryFileFilter.java Source code

Java tutorial

Introduction

Here is the source code for org.sonar.plugins.delphi.utils.DirectoryFileFilter.java

Source

/*
 * Sonar Delphi Plugin
 * Copyright (C) 2011 Sabre Airline Solutions and Fabricio Colombo
 * Author(s):
 * Przemyslaw Kociolek (przemyslaw.kociolek@sabre.com)
 * Michal Wojcik (michal.wojcik@sabre.com)
 * Fabricio Colombo (fabricio.colombo.mva@gmail.com)
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or (at your option) any later version.
 *
 * This program 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02
 */
package org.sonar.plugins.delphi.utils;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.sonar.plugins.delphi.DelphiPlugin;
import org.sonar.plugins.delphi.core.DelphiLanguage;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

/**
 * Class for directory filtering with File::listFiles()
 */
class DirectoryFileFilter implements FileFilter {

    @Override
    public boolean accept(File pathname) {
        return pathname.isDirectory() && !".svn".equals(pathname.getName());
    }
}

/**
 * Class for file filtering with File::listFiles(), filters by file suffix
 */
class CustomFileFilter implements FileFilter {

    private String[] suffix;

    CustomFileFilter(String[] filterSuffix) {
        suffix = filterSuffix.clone();
    }

    @Override
    public boolean accept(File pathname) {
        for (String ending : suffix) {
            if (pathname.getAbsolutePath().endsWith(ending)) {
                return true;
            }
        }
        return false;
    }
}

/**
 * Some utilities
 */
public final class DelphiUtils {

    /**
     * Logger class, use it for logging/debugging at Sonar window
     */
    public static final Logger LOG = LoggerFactory.getLogger(DelphiPlugin.class.getName());

    private DelphiUtils() {
    }

    /**
     * Normalizes file name, changes all '\' into '/'
     *
     * @param fileName file name to normalize
     * @return normalized file name
     */
    public static String normalizeFileName(String fileName) {
        return fileName.replaceAll("\\\\", "/");
    }

    /**
     * Gets the resource from project workspace
     *
     * @param fileName Resource file name
     * @return Resource file
     */
    public static File getResource(String fileName) {
        URL url = DelphiUtils.class.getResource(fileName);
        if (url == null) {
            throw new IllegalStateException("Resource file not found: " + fileName);
        }
        String fName = url.getPath();
        File file = new File(fName);
        if (!file.exists()) {
            fName = fName.replaceAll("%20", " ");
            file = new File(fName);
        }
        return file;
    }

    /**
     * Checking value range
     *
     * @param value Value to check
     * @param min   Minimum range
     * @param max   Maximum range
     * @return Trims value to range, then returns it
     */
    public static double checkRange(double value, double min, double max) {
        double newValue = value;
        if (value < min) {
            newValue = min;
        } else if (value > max) {
            newValue = max;
        }
        return newValue;
    }

    /**
     * Gets custom file filter, the file must ends with provided suffix
     *
     * @param suffix File suffix
     * @return CustomFileFilter
     */
    public static CustomFileFilter getCustomFileFilter(String[] suffix) {
        return new CustomFileFilter(suffix);
    }

    /**
     * Gets directory file filter, it filters out directories
     *
     * @return DirectoryFileFilter
     */
    public static DirectoryFileFilter getDirectoryFileFilter() {
        return new DirectoryFileFilter();
    }

    /**
     * Gets FileFilter associated with DelphiLanguage source files (*.pas,
     * *.dpr, *.dpk)
     *
     * @return FileFilter
     */
    public static FileFilter getFileFilter() {
        return new FileFilter() {

            @Override
            public boolean accept(File pathname) {
                return pathname.isFile() && acceptFile(pathname.getAbsolutePath());
            }

        };
    }

    /**
     * Accept file based on file extension.
     *
     * @param fileName The file name
     * @return True if the file has a valid extension
     */
    public static boolean acceptFile(String fileName) {
        String[] endings = DelphiLanguage.instance.getFileSuffixes();
        for (String ending : endings) {
            if (fileName.toLowerCase().endsWith("." + ending)) {
                return true;
            }
        }
        return false;
    }

    /**
     * Gets FileFilter associated with directories
     *
     * @return FileFilter
     */
    public static FileFilter getDirectoryFilter() {
        return new FileFilter() {

            @Override
            public boolean accept(File pathname) {
                return pathname.isDirectory();
            }
        };
    }

    /**
     * Counts the number of substring in a string
     *
     * @param string String in which to look for substrings
     * @param sub    Substring to look for in a string
     * @return The count of substrings in a string
     */
    public static int countSubstrings(String string, String sub) {
        int count = 0;
        int index = -1;
        while ((index = string.indexOf(sub, index + 1)) != -1) {
            ++count;
        }
        return count;
    }

    /**
     * Adds root directory to path if path is relative, or returns path if
     * absolute
     *
     * @param root Root directory
     * @param path Pathname to resolve
     * @return Resolved file
     */
    public static File resolveAbsolutePath(String root, String path) {
        File file = new File(normalizeFileName(path));

        if (!file.isAbsolute()) {
            String rootPath = normalizeFileName(root);
            if (!rootPath.endsWith("/")) {
                rootPath = rootPath.concat("/");
            }
            file = new File(rootPath + path);
        }

        return file;
    }

    /**
     * Resolves ..\ in a path to a file, backtraces the currentDir the number of
     * '..' in a path. Example: currentDir = 'C:\my\dir' fileName =
     * '..\file.txt'; return = 'C:/my/file.txt'
     *
     * @param currentDir Current directory of a file
     * @param fileName   File name
     * @return Resolved file name
     */
    public static String resolveBacktracePath(String currentDir, String fileName) {
        String result = normalizeFileName(fileName);
        // number of '..' in file name
        int dotdotCount = DelphiUtils.countSubstrings(result, "..");
        // get rid of '../'
        result = result.replaceAll("\\.\\./", "");

        for (int i = 0; i < dotdotCount; ++i) {
            currentDir = currentDir.substring(0, currentDir.lastIndexOf('/'));
        }

        return currentDir + "/" + result;
    }

    /**
     * Reads file contents to string, transform it to lowercase
     *
     * @param file     File to be read
     * @param encoding File content encoding
     * @return File content readed to a string
     * @throws IOException When file not found
     */
    public static String readFileContent(File file, String encoding) throws IOException {
        if (file == null || !file.exists()) {
            throw new IOException();
        }

        return FileUtils.readFileToString(file, encoding).replace("\uFEFF", "");
    }

    public static String getRelativePath(File file, List<File> dirs) {
        List<String> stack = new ArrayList<>();
        String path = FilenameUtils.normalize(file.getAbsolutePath());
        File cursor = new File(path);
        while (cursor != null) {
            if (containsFile(dirs, cursor)) {
                return StringUtils.join(stack, "/");
            }
            stack.add(0, cursor.getName());
            cursor = cursor.getParentFile();
        }
        return null;
    }

    private static boolean containsFile(List<File> dirs, File cursor) {
        for (File dir : dirs) {
            if (FilenameUtils.equalsNormalizedOnSystem(dir.getAbsolutePath(), cursor.getAbsolutePath())) {
                return true;
            }
        }
        return false;
    }
}