package org.jboss.windup.exec.configuration.options; import java.io.File; import java.nio.file.Path; import java.util.Collection; import java.util.Collections; import org.jboss.windup.config.AbstractPathConfigurationOption; import org.jboss.windup.config.InputType; import org.jboss.windup.config.ValidationResult; /** * Indicates that output path for the windup report and other data produced by a Windup execution. * * @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a> * */ public class OutputPathOption extends AbstractPathConfigurationOption { public static final String NAME = "output"; public OutputPathOption() { super(false); } @Override public String getName() { return NAME; } @Override public String getLabel() { return "Output"; } @Override public String getDescription() { return "Output Directory (WARNING: any existing files will be removed)."; } @Override public InputType getUIType() { return InputType.DIRECTORY; } @Override public boolean isRequired() { return false; } @Override public int getPriority() { return 9000; } /** * <p> * This validates that the input and output options are compatible. * </p> * <p> * Examples of incompatibilities would include: * </p> * <ul> * <li>Input and Output path are the same</li> * <li>Input is a subdirectory of the output</li> * <li>Output is a subdirectory of the input</li> * </ul> */ public static ValidationResult validateInputAndOutputPath(Path inputPath, Path outputPath){ return validateInputsAndOutputPaths(Collections.singletonList(inputPath), outputPath); } public static ValidationResult validateInputsAndOutputPaths(Collection inputPaths, Path outputPath) { File outputFile = outputPath.toFile(); for (Object inputPath : inputPaths) { File inputFile = (inputPath instanceof Path) ? ((Path)inputPath).toFile() : (File) inputPath; if (inputFile.equals(outputFile)) { return new ValidationResult(ValidationResult.Level.ERROR, "Output file cannot be the same as the input file."); } File inputParent = inputFile.getParentFile(); while (inputParent != null) { if (inputParent.equals(outputFile)) { return new ValidationResult(ValidationResult.Level.ERROR, "Output path must not be a parent of input path."); } inputParent = inputParent.getParentFile(); } File outputParent = outputFile.getParentFile(); while (outputParent != null) { if (outputParent.equals(inputFile)) { return new ValidationResult(ValidationResult.Level.ERROR, "Input path must not be a parent of output path."); } outputParent = outputParent.getParentFile(); } } return ValidationResult.SUCCESS; } }