All Downloads are FREE. Search and download functionalities are using the official Maven repository.

hudson.plugins.testabilityexplorer.helpers.ReportParseDelegate Maven / Gradle / Ivy

package hudson.plugins.testabilityexplorer.helpers;

import hudson.FilePath;
import hudson.model.BuildListener;
import hudson.model.Result;
import hudson.plugins.testabilityexplorer.parser.StatisticsParser;
import hudson.plugins.testabilityexplorer.report.BuildIndividualReport;
import hudson.plugins.testabilityexplorer.report.costs.ClassCost;
import hudson.plugins.testabilityexplorer.report.costs.CostSummary;
import hudson.plugins.testabilityexplorer.report.costs.Statistic;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * Scans for report files using the specified reportFilenamePattern. Any report
 * files found that way, will be parsed and turned into {@link Statistic}'s.
 *
 * @author reik.schatz
 */
public class ReportParseDelegate implements ParseDelegate {

    /**
     *
     */
    private static final long serialVersionUID = 3310676483239523187L;

    private final String m_reportFilenamePattern;

    private final int m_threshold;

    private final int m_perClassThreshold;

    private final boolean m_aggregateFiles;

    private final double m_weightFactor;

    public ReportParseDelegate(String reportFilenamePattern, boolean aggregateFiles,
            double weightFactor, int threshold, int perClassThreshold) {
        m_reportFilenamePattern = reportFilenamePattern;
        m_threshold = threshold;
        m_perClassThreshold = perClassThreshold;
        m_aggregateFiles = aggregateFiles;
        m_weightFactor = weightFactor;
    }

    public ReportParseDelegate(String reportFilenamePattern, boolean aggregateFiles, int threshold,
            int perClassThreshold) {
        m_reportFilenamePattern = reportFilenamePattern;
        m_threshold = threshold;
        m_perClassThreshold = perClassThreshold;
        m_aggregateFiles = aggregateFiles;
        m_weightFactor = -1;
    }

    public ReportParseDelegate(String reportFilenamePattern, int threshold, int perClassThreshold) {
        m_reportFilenamePattern = reportFilenamePattern;
        m_threshold = threshold;
        m_perClassThreshold = perClassThreshold;
        m_aggregateFiles = false;
        m_weightFactor = -1;
    }

    /**
     * Uses the reportFilenamePattern in this {@link ReportParseDelegate} to look for
     * report files which will then be delegated for parsing.
     */
    public boolean perform(BuildProxy build, BuildListener listener) {
        List filesToParse = getFilesToParse(build);
        Collection results = null;

        for (FilePath filePath : filesToParse) {
            final String pathStr = filePath.getRemote();
            final StatisticsParser parser = build.getStatisticsParser();
            if (null == results) {
                results = parser.parse(new File(pathStr));
            } else {
                results.addAll(parser.parse(new File(pathStr)));
            }
        }
        if (m_aggregateFiles) {
            results = mergeStatistics(results);
        }
        boolean successful = isSuccessful(results);
        flagBuild(successful, build);

        build.addAction(new BuildIndividualReport(results, build.getReportBuilder(), build
                .getDetailBuilder()));

        return successful;
    }

    protected Collection mergeStatistics(Collection statistics) {
        Collection results = new ArrayList();
        if (null != statistics) {
            for (Statistic statistic : statistics) {
                if (results.isEmpty()) {
                    results.add(statistic);
                } else {
                    boolean merged = false;
                    for (Statistic stat : results) {
                        if ((null == stat.getOwner() && null == statistic.getOwner())
                                || (null != stat.getOwner() && stat.getOwner().equals(
                                        statistic.getOwner()))) {
                            stat.getCostSummary().merge(statistic.getCostSummary(), m_weightFactor);
                            merged = true;
                        }
                    }
                    if (!merged) {
                        results.add(statistic);
                    }
                }
            }
            for (Statistic stat : results) {
                stat.sort();
            }
        }
        return results;
    }

    protected void flagBuild(boolean successful, BuildProxy build) {
        if (!successful) {
            build.setResult(Result.UNSTABLE);
        }
    }

    /**
     * Returns a list of {@link FilePath}'s that are supposed to be parsed.
     *
     * @param build the BuildProxy
     * @return list of FilePath objects or empty list
     */
    protected List getFilesToParse(BuildProxy build) {
        FilePath[] paths;
        try {
            paths = build.getModuleRoot().list(m_reportFilenamePattern);
        } catch (IOException e) {
            throw new RuntimeException(
                    "Unable to get report files using the specified report file pattern ("
                            + m_reportFilenamePattern + ").");
        } catch (InterruptedException e) {
            throw new RuntimeException(
                    "Unable to get report files using the specified report file pattern ("
                            + m_reportFilenamePattern + ").");
        }

        List filesToParse = new ArrayList();
        for (FilePath path : paths) {
            if (!filesToParse.contains(path)) {
                filesToParse.add(path);
            }
        }
        return filesToParse;
    }

    /**
     * Returns true if:
     * 
    *
  • none of the {@link Statistic}'s in the given collection has a higher total testability * cost than the threshold in this {@link ReportParseDelegate} *
  • none of the ClassCost's in the given {@link Statistic}'s has a higher individual * testability cost than the per-class threshold in this {@link ReportParseDelegate} *
* * @param results a collection of {@link Statistic}'s * @return boolean */ boolean isSuccessful(Collection results) { boolean successful = true; if (results != null) { for (Statistic result : results) { CostSummary costSummary = result.getCostSummary(); int total = costSummary.getTotal(); successful = total <= m_threshold; if (!successful) { break; } for (ClassCost classCost : costSummary.getCostStack()) { int perClassCost = classCost.getCost(); successful = perClassCost <= m_perClassThreshold; if (!successful) { break; } } } } return successful; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy