package org.jboss.windup.reporting.service; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.HashSet; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import org.jboss.windup.graph.GraphContext; import org.jboss.windup.graph.model.WindupConfigurationModel; import org.jboss.windup.graph.model.WindupVertexFrame; import org.jboss.windup.graph.service.GraphService; import org.jboss.windup.graph.service.WindupConfigurationService; import org.jboss.windup.reporting.model.ReportModel; import org.jboss.windup.util.PathUtil; import org.jboss.windup.util.exception.WindupException; /** * Convenient search and creation methods for {@link ReportModel}. */ public class ReportService extends GraphService<ReportModel> { private static final String REPORTS_DIR = "reports"; private static final String DATA = "data"; private static final Set<String> usedFilenames = new HashSet<>(); /** * Used to insure uniqueness in report names */ private final AtomicInteger index = new AtomicInteger(1); public ReportService(GraphContext context) { super(context, ReportModel.class); } public Path getReportDataDirectory() { Path path = getReportDirectory().resolve(DATA); createDirectoryIfNeeded(path); return path; } /** * Returns the output directory for reporting. */ public Path getReportDirectory() { WindupConfigurationModel cfg = WindupConfigurationService.getConfigurationModel(getGraphContext()); Path path = cfg.getOutputPath().asFile().toPath().resolve(REPORTS_DIR); createDirectoryIfNeeded(path); return path.toAbsolutePath(); } private void createDirectoryIfNeeded(Path path) { if (!Files.isDirectory(path)) { try { Files.createDirectories(path); } catch (IOException e) { throw new WindupException("Failed to create directory: " + path.toString() + " due to: " + e.getMessage(), e); } } } /** * Returns the ReportModel with given name. */ @SuppressWarnings("unchecked") public <T extends ReportModel> T getReportByName(String name, Class<T> clazz) { WindupVertexFrame model = this.getUniqueByProperty(ReportModel.REPORT_NAME, name); try { return (T) model; } catch (ClassCastException ex) { throw new WindupException("The vertex is not of expected frame type " + clazz.getName() + ": " + model.toPrettyString()); } } /** * Gets a unique filename (that has not been used before in the output folder) for this report and sets it on the report model. */ public void setUniqueFilename(ReportModel model, String baseFilename, String extension) { String filename = PathUtil.cleanFileName(baseFilename) + "." + extension; // FIXME this looks nasty while (usedFilenames.contains(filename)) { filename = PathUtil.cleanFileName(baseFilename) + "." + index.getAndIncrement() + "." + extension; } usedFilenames.add(filename); model.setReportFilename(filename); } }