package org.jboss.windup.exec.configuration.options;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Logger;
import org.apache.commons.lang3.StringUtils;
import org.jboss.windup.config.AbstractPathConfigurationOption;
import org.jboss.windup.config.InputType;
import org.jboss.windup.config.ValidationResult;
/**
* Specifies the Input path for Windup.
*
* @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a>
* @author Ondrej Zizka
*/
public class InputPathOption extends AbstractPathConfigurationOption
{
private static Logger LOG = Logger.getLogger(InputPathOption.class.getCanonicalName());
public static final String NAME = "input";
private static final long SIZE_WARNING_TRESHOLD_MB = 10;
public InputPathOption()
{
super(true);
}
@Override
public Class<?> getType()
{
return Path.class;
}
@Override
public String getName()
{
return NAME;
}
@Override
public String getLabel()
{
return "Input paths";
}
@Override
public String getDescription()
{
return "Input file or directory (a directory is required for source mode). Multiple paths can be specified separated by a space (for example, --input PATH_1 PATH_2).";
}
@Override
public ValidationResult validate(Object filesObject)
{
ValidationResult result = super.validate(filesObject);
if (!result.isSuccess())
return result;
List<Path> largeApps = new LinkedList<>();
for (Path path : (Iterable<Path>) filesObject)
{
ValidationResult resultFile = super.validate(path);
if (!resultFile.isSuccess())
return resultFile;
if (!Files.exists(path))
return new ValidationResult(ValidationResult.Level.ERROR, "Input path not found: " + path);
if (!Files.isDirectory(path))
{
try
{
long fileSize = Files.size(path);
if (fileSize > SIZE_WARNING_TRESHOLD_MB * 1024 * 1024)
{
largeApps.add(path);
}
}
catch (IOException e)
{
LOG.warning("Could not determine file size for: " + path);
}
}
}
if (!largeApps.isEmpty())
return new ValidationResult(ValidationResult.Level.PROMPT_TO_CONTINUE,
"These input applications or directories are large:"
+ "\n\t" + StringUtils.join(largeApps, "\n\t") + "\n"
+ " Processing may take a very long time."
+ " Please consult the Windup User Guide for performance tips."
+ " Would you like to continue?",
true);
return ValidationResult.SUCCESS;
}
@Override
public InputType getUIType()
{
return InputType.MANY;
}
@Override
public boolean isRequired()
{
return true;
}
@Override
public int getPriority()
{
return 10000;
}
}