package org.jboss.windup.rules.apps.java.config; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; import org.jboss.windup.config.GraphRewrite; import org.jboss.windup.config.metadata.RuleMetadata; import org.jboss.windup.config.phase.InitializationPhase; import org.jboss.windup.config.query.Query; import org.jboss.windup.config.ruleprovider.IteratingRuleProvider; import org.jboss.windup.graph.GraphContext; import org.jboss.windup.graph.model.WindupConfigurationModel; import org.jboss.windup.graph.model.report.IgnoredFileRegexModel; import org.jboss.windup.graph.model.resource.FileModel; import org.jboss.windup.graph.service.GraphService; import org.jboss.windup.rules.apps.java.model.WindupJavaConfigurationModel; import org.jboss.windup.rules.apps.java.service.WindupJavaConfigurationService; import org.ocpsoft.rewrite.config.ConditionBuilder; import org.ocpsoft.rewrite.context.EvaluationContext; /** * Read and add all the ignore regexes (when a file matches the regex, it will not be scanned by windup) that are * present in the windup runtime. * * @author <a href="mailto:mbriskar@gmail.com">Matej Briskar</a> */ @RuleMetadata(phase = InitializationPhase.class, after = CopyJavaConfigToGraphRuleProvider.class) public class GatherIgnoredFileNamesRuleProvider extends IteratingRuleProvider<WindupConfigurationModel> { private final String IGNORE_FILE_EXTENSION = "windup-ignore.txt"; private static final Logger LOG = Logger.getLogger(GatherIgnoredFileNamesRuleProvider.class.getName()); @Override public void perform(GraphRewrite event, EvaluationContext context, WindupConfigurationModel payload) { WindupJavaConfigurationModel javaCfg = WindupJavaConfigurationService.getJavaConfigurationModel(event .getGraphContext()); final List<Path> filesUrl = new ArrayList<>(); for (FileModel ignoredRegexesFileModel : payload.getUserIgnorePaths()) { if (ignoredRegexesFileModel.isDirectory()) { try { Files.walkFileTree(Paths.get(ignoredRegexesFileModel.getFilePath()), new SimpleFileVisitor<Path>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { if (file.getFileName().toString().toLowerCase().endsWith(IGNORE_FILE_EXTENSION)) { filesUrl.add(file); } return FileVisitResult.CONTINUE; } }); } catch (IOException e1) { LOG.warning("IOException thrown when trying to access the ignored file regexes in " + ignoredRegexesFileModel.getFilePath()); } } else { filesUrl.add(Paths.get(ignoredRegexesFileModel.getFilePath())); } } for (Path filePath : filesUrl) { readAndAddFileRegexes(filePath, javaCfg, event.getGraphContext()); } } private void readAndAddFileRegexes(Path filePath, WindupJavaConfigurationModel javaCfg, GraphContext context) { File file = filePath.toFile(); if (file.exists()) { try (BufferedReader reader = new BufferedReader(new FileReader(file))) { String line = null; while ((line = reader.readLine()) != null) { GraphService<IgnoredFileRegexModel> graphService = new GraphService<>( context, IgnoredFileRegexModel.class); IgnoredFileRegexModel ignored = graphService.create(); ignored.setRegex(line); javaCfg.addIgnoredFileRegex(ignored); try { Pattern.compile(line); } catch (PatternSyntaxException exception) { ignored.setCompilationError(exception.getMessage()); } } } catch (FileNotFoundException e) { } catch (IOException e) { } } } @Override public ConditionBuilder when() { return Query.fromType(WindupConfigurationModel.class); } @Override public String toStringPerform() { return "Gather all the information about ignored files."; } }