org.pitest.maven.report.ReportSourceLocator.java Source code

Java tutorial

Introduction

Here is the source code for org.pitest.maven.report.ReportSourceLocator.java

Source

/*
 * Copyright 2015 Jason Fehr
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and limitations under the License.
 */
package org.pitest.maven.report;

import java.io.File;
import java.io.FileFilter;
import java.util.Arrays;

import org.apache.commons.io.comparator.LastModifiedFileComparator;
import org.apache.commons.io.filefilter.AndFileFilter;
import org.apache.commons.io.filefilter.CanWriteFileFilter;
import org.apache.commons.io.filefilter.DirectoryFileFilter;
import org.apache.commons.io.filefilter.RegexFileFilter;
import org.apache.maven.plugin.logging.Log;
import org.pitest.util.PitError;

/**
 * Determines the directory where the most recent PIT reports are actually
 * located since the value of the timestamedReports parameter could impact where
 * the reports are stored.
 * 
 * @author jasonmfehr
 */
public class ReportSourceLocator {

    // a java.io.File object is considered to be representing a directory where a
    // timestamped pit report is located if
    // 1.) the java.io.File is a directory
    // 2.) the directory name contains only numbers
    // 3.) the directory is readable
    static final FileFilter TIMESTAMPED_REPORTS_FILE_FILTER = new AndFileFilter(Arrays
            .asList(DirectoryFileFilter.DIRECTORY, new RegexFileFilter("^\\d+$"), CanWriteFileFilter.CAN_WRITE));

    /**
     * Determines the directory where the most recent PIT reports are located. If
     * timestampedReports is set to true, then the latest reports directory is
     * located and returned. If timestampedReports is set to false, then the
     * provided reportsDirectory parameter is returned. If multiple runs of the
     * plugin have resulted in a combination of a non-timestamped report directory
     * and timestamped reports directories, then the latest of all those
     * directories is returned.
     * 
     * See {@link ReportSourceLocator#TIMESTAMPED_REPORTS_FILE_FILTER} for an
     * explanation of what constitutes a timestamped reports directory;
     * 
     * @param reportsDirectory
     *          {@link File} representing the directory where non-timestamped
     *          reports were written if the plugin's configuration has
     *          timestampedReports set to true;
     * @param log
     *          {@link Log} plugin logger for logging debug messages
     * 
     * @return {@link File} representing the directory where the latest PIT
     *         reports are located
     */
    public File locate(File reportsDirectory, Log log) {
        if (!reportsDirectory.exists()) {
            throw new PitError("could not find reports directory [" + reportsDirectory + "]");
        }

        if (!reportsDirectory.canRead()) {
            throw new PitError("reports directory [" + reportsDirectory + "] not readable");
        }

        if (!reportsDirectory.isDirectory()) {
            throw new PitError(
                    "reports directory [" + reportsDirectory + "] is actually a file, it must be a directory");
        }

        return executeLocator(reportsDirectory, log);
    }

    private File executeLocator(File reportsDirectory, Log log) {
        File[] subdirectories = reportsDirectory.listFiles(TIMESTAMPED_REPORTS_FILE_FILTER);
        File latest = reportsDirectory;

        log.debug("ReportSourceLocator starting search in directory [" + reportsDirectory.getAbsolutePath() + "]");

        if (subdirectories != null) {
            LastModifiedFileComparator c = new LastModifiedFileComparator();

            for (File f : subdirectories) {
                log.debug("comparing directory [" + f.getAbsolutePath() + "] with the current latest directory of ["
                        + latest.getAbsolutePath() + "]");
                if (c.compare(latest, f) < 0) {
                    latest = f;
                    log.debug("directory [" + f.getAbsolutePath() + "] is now the latest");
                }
            }
        } else {
            throw new PitError("could not list files in directory [" + reportsDirectory.getAbsolutePath()
                    + "] because of an unknown I/O error");
        }

        log.debug("ReportSourceLocator determined directory [" + latest.getAbsolutePath()
                + "] is the directory containing the latest pit reports");
        return latest;
    }

}