package org.jboss.windup.bootstrap.help; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.dom.DOMDocument; import org.dom4j.dom.DOMElement; import org.dom4j.io.SAXReader; import org.jboss.forge.furnace.Furnace; import org.jboss.windup.config.ConfigurationOption; import org.jboss.windup.exec.configuration.WindupConfiguration; import org.jboss.windup.util.PathUtil; /** * @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a> */ public class Help { private static final String HELP = "help"; private static final String OPTION = "option"; private static final String NAME = "name"; private static final String DESCRIPTION = "description"; public static final String TYPE = "type"; public static final String AVAILABLE_OPTIONS = "available-options"; public static final String AVAILABLE_OPTION = "option"; public static final String UI_TYPE = "ui-type"; private List<OptionDescription> options = new ArrayList<>(); public List<OptionDescription> getOptions() { return options; } private void addOption(OptionDescription optionDescription) { this.options.add(optionDescription); } private static File getDefaultFile() throws IOException { Path helpDirectory = PathUtil.getWindupHome().resolve("cache").resolve("help"); if (!Files.exists(helpDirectory)) Files.createDirectories(helpDirectory); Path helpPath = helpDirectory.resolve("help.xml"); return helpPath.toFile(); } public static Help load() { final Help result = new Help(); try { Document doc = new SAXReader().read(getDefaultFile()); Iterator optionElementIterator = doc.getRootElement().elementIterator(OPTION); while (optionElementIterator.hasNext()) { Element optionElement = (Element) optionElementIterator.next(); String name = optionElement.attributeValue(NAME); String description = optionElement.element(DESCRIPTION).getTextTrim(); String type = optionElement.element(TYPE).getTextTrim(); String uiType = optionElement.element(UI_TYPE).getTextTrim(); List<String> availableOptions = null; if (optionElement.element(AVAILABLE_OPTIONS) != null) { availableOptions = new ArrayList<>(); for (Element availableOption : (List<Element>)optionElement.element(AVAILABLE_OPTIONS).elements(AVAILABLE_OPTION)) { availableOptions.add(availableOption.getTextTrim()); } } OptionDescription option = new OptionDescription(name, description, type, uiType, availableOptions); result.addOption(option); } } catch (DocumentException | IOException e) { System.err.println("WARNING: Failed to load detailed help information!"); } return result; } public static void save(Furnace furnace) throws IOException { Document doc = new DOMDocument(new DOMElement(HELP)); Iterable<ConfigurationOption> windupOptions = WindupConfiguration.getWindupConfigurationOptions(furnace); for (ConfigurationOption option : windupOptions) { Element optionElement = new DOMElement(OPTION); optionElement.addAttribute(NAME, option.getName()); Element descriptionElement = new DOMElement(DESCRIPTION); descriptionElement.setText(option.getDescription()); optionElement.add(descriptionElement); // Type Element typeElement = new DOMElement(TYPE); typeElement.setText(option.getType().getSimpleName()); optionElement.add(typeElement); // UI Type Element uiTypeElement = new DOMElement(UI_TYPE); uiTypeElement.setText(option.getUIType().name()); optionElement.add(uiTypeElement); // Available Options Element availableOptionsElement = new DOMElement(AVAILABLE_OPTIONS); for (Object availableValueObject : option.getAvailableValues()) { if (availableValueObject == null) continue; Element availableOption = new DOMElement(AVAILABLE_OPTION); availableOption.setText(String.valueOf(availableValueObject)); availableOptionsElement.add(availableOption); } if (!availableOptionsElement.elements().isEmpty()) optionElement.add(availableOptionsElement); doc.getRootElement().add(optionElement); } try (FileWriter writer = new FileWriter(getDefaultFile())) { doc.write(writer); } } }