package org.jboss.windup.rules.apps.java.config; import java.io.File; import java.io.FileInputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.commons.io.IOUtils; import org.apache.commons.io.LineIterator; import org.jboss.forge.furnace.util.Predicate; import org.jboss.forge.furnace.util.Visitor; 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.graph.GraphContext; import org.jboss.windup.graph.model.resource.FileModel; import org.jboss.windup.graph.service.FileService; import org.jboss.windup.rules.apps.java.model.WindupJavaConfigurationModel; import org.jboss.windup.rules.apps.java.service.WindupJavaConfigurationService; import org.jboss.windup.util.PathUtil; import org.jboss.windup.util.exception.WindupException; import org.jboss.windup.util.file.FileSuffixPredicate; import org.jboss.windup.util.file.FileVisit; import org.ocpsoft.rewrite.config.Configuration; import org.ocpsoft.rewrite.config.ConfigurationBuilder; import org.ocpsoft.rewrite.config.Rule; import org.ocpsoft.rewrite.context.EvaluationContext; /** * Copies configuration data from {@link GraphContext#getOptionMap()} to the graph itself for easy use by other {@link Rule}s. */ @RuleMetadata(phase = InitializationPhase.class, haltOnException = true) public class CopyJavaConfigToGraphRuleProvider extends AbstractRuleProvider { @Override public Configuration getConfiguration(RuleLoaderContext ruleLoaderContext) { GraphOperation copyConfigToGraph = new GraphOperation() { @Override public void perform(GraphRewrite event, EvaluationContext context) { Map<String, Object> config = event.getGraphContext().getOptionMap(); Boolean sourceMode = (Boolean) config.get(SourceModeOption.NAME); Boolean enableClassFoundFoundAnalysis = (Boolean) config.get(EnableClassNotFoundAnalysisOption.NAME); @SuppressWarnings("unchecked") List<String> includeJavaPackages = (List<String>) config.get(ScanPackagesOption.NAME); @SuppressWarnings("unchecked") final List<String> excludeJavaPackages; if (config.get(ExcludePackagesOption.NAME) == null) excludeJavaPackages = new ArrayList<>(); else excludeJavaPackages = new ArrayList<>((List<String>) config.get(ExcludePackagesOption.NAME)); Predicate<File> predicate = new FileSuffixPredicate("\\.package-ignore\\.txt"); Visitor<File> visitor = new Visitor<File>() { @Override public void visit(File file) { try (FileInputStream inputStream = new FileInputStream(file)) { LineIterator it = IOUtils.lineIterator(inputStream, "UTF-8"); while (it.hasNext()) { String line = it.next(); if (!line.startsWith("#") && !line.trim().isEmpty()) { excludeJavaPackages.add(line); } } } catch (Exception e) { throw new WindupException("Failed loading package ignore patterns from [" + file.toString() + "]", e); } } }; FileVisit.visit(PathUtil.getUserIgnoreDir().toFile(), predicate, visitor); FileVisit.visit(PathUtil.getWindupIgnoreDir().toFile(), predicate, visitor); WindupJavaConfigurationModel javaConfiguration = WindupJavaConfigurationService.getJavaConfigurationModel(event .getGraphContext()); javaConfiguration.setSourceMode(sourceMode == null ? false : sourceMode); javaConfiguration.setScanJavaPackageList(includeJavaPackages); javaConfiguration.setExcludeJavaPackageList(excludeJavaPackages); javaConfiguration.setClassNotFoundAnalysisEnabled(enableClassFoundFoundAnalysis == null ? false : enableClassFoundFoundAnalysis); List<File> additionalClasspaths = (List<File>) config.get(AdditionalClasspathOption.NAME); if (additionalClasspaths != null) { FileService fileService = new FileService(event.getGraphContext()); for (File file : additionalClasspaths) { FileModel fileModel = fileService.createByFilePath(file.getAbsolutePath()); javaConfiguration.addAdditionalClasspath(fileModel); } } } }; return ConfigurationBuilder.begin() .addRule() .perform(copyConfigToGraph); } }