package org.jboss.windup.bootstrap.commands.windup; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.attribute.FileTime; import java.util.concurrent.TimeUnit; import org.jboss.forge.furnace.Furnace; import org.jboss.forge.furnace.util.OperatingSystemUtils; import org.jboss.windup.bootstrap.commands.Command; import org.jboss.windup.bootstrap.commands.CommandPhase; import org.jboss.windup.bootstrap.commands.CommandResult; import org.jboss.windup.bootstrap.commands.FurnaceDependent; import org.jboss.windup.config.ConfigurationOption; import org.jboss.windup.config.InputType; import org.jboss.windup.exec.configuration.WindupConfiguration; import org.jboss.windup.util.PathUtil; /** * @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a> */ public class GenerateCompletionDataCommand implements Command, FurnaceDependent { private static final String NEW_LINE = OperatingSystemUtils.getLineSeparator(); private static final long MAX_COMPLETION_AGE = 10000L * 60L * 60L * 24L; private Furnace furnace; private boolean overwrite; public GenerateCompletionDataCommand(boolean overwrite) { this.overwrite = overwrite; } @Override public void setFurnace(Furnace furnace) { this.furnace = furnace; } @Override public CommandResult execute() { generateCompletionData(overwrite); return CommandResult.CONTINUE; } private void generateCompletionData(boolean overwrite) { Path completionPath = PathUtil.getWindupHome().resolve("cache").resolve("bash-completion").resolve("bash-completion.data"); if (!overwrite && Files.isRegularFile(completionPath)) { try { FileTime modifiedTime = Files.getLastModifiedTime(completionPath); long age = System.currentTimeMillis() - modifiedTime.to(TimeUnit.MILLISECONDS); if (age <= MAX_COMPLETION_AGE) return; } catch (IOException e) { // ignore it } } try { if (!Files.isDirectory(completionPath.getParent())) { Files.createDirectories(completionPath.getParent()); } try (FileWriter writer = new FileWriter(completionPath.toFile())) { writer.write("listTags:none" + NEW_LINE); writer.write("listSourceTechnologies:none" + NEW_LINE); writer.write("listTargetTechnologies:none" + NEW_LINE); writer.write("install:none" + NEW_LINE); writer.write("remove:none" + NEW_LINE); writer.write("addonDir:file" + NEW_LINE); writer.write("immutableAddonDir:file" + NEW_LINE); writer.write("batchMode:none" + NEW_LINE); writer.write("debug:none" + NEW_LINE); writer.write("help:none" + NEW_LINE); writer.write("version:none" + NEW_LINE); Iterable<ConfigurationOption> optionIterable = WindupConfiguration.getWindupConfigurationOptions(furnace); for (ConfigurationOption option : optionIterable) { StringBuilder line = new StringBuilder(); line.append(option.getName()).append(":"); if (File.class.isAssignableFrom(option.getType()) || Path.class.isAssignableFrom(option.getType())) line.append("file"); else if (option.getUIType() == InputType.SELECT_MANY || option.getUIType() == InputType.SELECT_ONE) { line.append("list").append(":"); for (Object availableValue : option.getAvailableValues()) line.append(availableValue).append(" "); } else line.append("none"); line.append(NEW_LINE); writer.write(line.toString()); } } } catch (IOException e) { System.err.println("WARNING: Unable to create bash completion file in \"" + completionPath + "\" due to: " + e.getMessage()); } } @Override public CommandPhase getPhase() { return CommandPhase.PRE_EXECUTION; } }