package alien4cloud.cucumber.report; import org.apache.commons.io.FileUtils; import java.io.*; import java.util.Collection; import java.util.UUID; public class ReportMerger { private static String reportFileName = "report.js"; private static String reportImageExtension = "png"; public static void main(String[] args) throws Throwable { File reportDirectory = new File(args[0]); if (reportDirectory.exists()) { ReportMerger munger = new ReportMerger(); munger.mergeReports(reportDirectory); } } /** * Merge all reports together into master report in given reportDirectory * * @param reportDirectory * @throws Exception */ public void mergeReports(File reportDirectory) throws Throwable { Collection<File> existingReports = FileUtils.listFiles(reportDirectory, new String[] { "js" }, true); File mergedReport = null; for (File report : existingReports) { // only address report files if (report.getName().equals(reportFileName)) { // rename all the image files (to give unique names) in report directory and update report renameEmbededImages(report); // if we are on the first pass, copy the directory of the file to use as basis for merge if (mergedReport == null) { FileUtils.copyDirectory(report.getParentFile(), reportDirectory); mergedReport = new File(reportDirectory, reportFileName); // otherwise merge this report into existing master report } else { mergeFiles(mergedReport, report); } } } } /** * merge source file into target * * @param target * @param source */ public void mergeFiles(File target, File source) throws Throwable { // copy embeded images Collection<File> embeddedImages = FileUtils.listFiles(source.getParentFile(), new String[] { reportImageExtension }, true); for (File image : embeddedImages) { FileUtils.copyFileToDirectory(image, target.getParentFile()); } // merge report files String targetReport = FileUtils.readFileToString(target); String sourceReport = FileUtils.readFileToString(source); FileUtils.writeStringToFile(target, targetReport + sourceReport); } /** * Give unique names to embedded images to ensure they aren't lost during merge * Update report file to reflect new image names * * @param reportFile */ public void renameEmbededImages(File reportFile) throws Throwable { File reportDirectory = reportFile.getParentFile(); Collection<File> embeddedImages = FileUtils.listFiles(reportDirectory, new String[] { reportImageExtension }, true); String fileAsString = FileUtils.readFileToString(reportFile); for (File image : embeddedImages) { String curImageName = image.getName(); String uniqueImageName = UUID.randomUUID().toString() + "." + reportImageExtension; image.renameTo(new File(reportDirectory, uniqueImageName)); fileAsString = fileAsString.replace(curImageName, uniqueImageName); } FileUtils.writeStringToFile(reportFile, fileAsString); } }