package org.jboss.windup.config.parser; import org.jboss.forge.furnace.Furnace; import org.jboss.forge.furnace.util.Visitor; import org.jboss.windup.config.loader.RuleLoaderContext; import org.jboss.windup.config.metadata.TechnologyReferenceTransformer; import org.jboss.windup.config.metadata.TechnologyReferenceTransformerLoader; import org.jboss.windup.util.file.FileSuffixPredicate; import org.jboss.windup.util.file.FileVisit; import javax.inject.Inject; import java.io.File; import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; /** * Implements a {@link TechnologyReferenceTransformerLoader} using xml files. The XML files must end with the extension * ".windup.technologytransformer.xml". * * The format of the file is defined by {@link TechnologyReferenceTransformerHandler}. * * @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a> */ public class XMLTechnologyReferenceTransformerLoader implements TechnologyReferenceTransformerLoader { private static final String XML_EXTENSION = ".windup.technologytransformer.xml"; @Inject private Furnace furnace; @Override public Collection<TechnologyReferenceTransformer> loadTransformers(RuleLoaderContext ruleLoaderContext) { List<TechnologyReferenceTransformer> transformers = new ArrayList<>(); for (Path userRulesPath : ruleLoaderContext.getRulePaths()) { Visitor<File> visitor = new Visitor<File>() { @Override public void visit(File file) { transformers.addAll(loadTransformers(file)); } }; FileVisit.visit(userRulesPath.toFile(), new FileSuffixPredicate(XML_EXTENSION), visitor); } return transformers; } private List<TechnologyReferenceTransformer> loadTransformers(File file) { RuleLoaderContext loaderContext = new RuleLoaderContext(Collections.singleton(file.toPath()), null); ParserContext parser = new ParserContext(furnace, loaderContext); parser.setXmlInputPath(file.toPath()); parser.setXmlInputRootPath(file.getParentFile().toPath()); return parser.processDocument(file.toURI()); } }