package org.jboss.windup.reporting.category; import java.io.IOException; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.jboss.windup.config.AbstractRuleProvider; import org.jboss.windup.config.GraphRewrite; import org.jboss.windup.config.loader.RuleLoaderContext; import org.jboss.windup.config.metadata.RuleMetadata; import org.jboss.windup.config.operation.GraphOperation; import org.jboss.windup.config.phase.InitializationPhase; import org.jboss.windup.util.exception.WindupException; import org.ocpsoft.rewrite.config.Configuration; import org.ocpsoft.rewrite.config.ConfigurationBuilder; import org.ocpsoft.rewrite.context.EvaluationContext; /** * Loads issue categories into the registry. Also, this is responsible for attaching them to the graph. * * @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a> */ @RuleMetadata(phase = InitializationPhase.class) public class LoadIssueCategoriesRuleProvider extends AbstractRuleProvider { public static final String WINDUP_CATEGORIES_XML_SUFFIX = ".windup.categories.xml"; @Override public Configuration getConfiguration(RuleLoaderContext ruleLoaderContext) { loadIssueCategories(ruleLoaderContext); return ConfigurationBuilder.begin() .addRule() .perform(new GraphOperation() { @Override public void perform(GraphRewrite event, EvaluationContext context) { IssueCategoryRegistry.instance(event.getRewriteContext()).attachToGraph(event.getGraphContext()); } }).withId(LoadIssueCategoriesRuleProvider.class.getSimpleName() + "_attachToGraph"); } private void loadIssueCategories(RuleLoaderContext ruleLoaderContext) { if (ruleLoaderContext.getRulePaths() == null) return; final List<Path> filePaths = new ArrayList<>(); ruleLoaderContext.getRulePaths().forEach((path) -> { try { if (!Files.exists(path) || !Files.isReadable(path)) return; Files.walkFileTree(path, new SimpleFileVisitor<Path>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { if (Files.isReadable(file) && Files.isRegularFile(file) && file.getFileName().toString().toLowerCase().endsWith(WINDUP_CATEGORIES_XML_SUFFIX)) filePaths.add(file); return FileVisitResult.CONTINUE; } }); } catch (IOException e) { throw new WindupException("I/O Error during search for issue category files, due to: " + e.getMessage(), e); } }); filePaths.forEach((path) -> loadIssueCategory(ruleLoaderContext, path)); } @SuppressWarnings("unchecked") private void loadIssueCategory(RuleLoaderContext ruleLoaderContext, Path path) { // @formatter:off /* * Sample xml format: * * <categories> * <category id=”mandatory-for-ose3” priority=”100”> * <name>Mandatory for OpenShift 3</name> * <description>Items within this category must be addressed for a migration to an OpenShift 3 environment.</description> * </category> * </categories> */ // @formatter:on try { String origin = path.toAbsolutePath().normalize().toString(); Document doc = new SAXReader().read(path.toFile()); for (Element element : (List<Element>) doc.getRootElement().elements("category")) { String categoryID = element.attributeValue("id"); String priorityString = element.attributeValue("priority"); int priority = 0; if (StringUtils.isNotEmpty(priorityString)) { try { priority = Integer.valueOf(priorityString); } catch (NumberFormatException e) { String message = "Failed to parse issue category due to malformed priority string: \"" + priorityString + "\"" + " (origin: \"" + origin + "\", id: \"" + categoryID + "\")"; throw new WindupException(message); } } String name = element.elementText("name"); String description = element.elementText("description"); IssueCategory issueCategory = new IssueCategory(categoryID, origin, name, description, priority); IssueCategoryRegistry.instance(ruleLoaderContext.getContext()).addCategory(issueCategory); } } catch (DocumentException e) { throw new WindupException("Failed to load due to: " + e.getMessage(), e); } } }