package org.jboss.windup.rules.apps.java.service; import java.util.ArrayList; import java.util.List; import org.apache.commons.io.FilenameUtils; import org.jboss.windup.graph.GraphContext; import org.jboss.windup.graph.model.report.IgnoredFileRegexModel; import org.jboss.windup.graph.service.GraphService; import org.jboss.windup.rules.apps.java.model.PackageModel; import org.jboss.windup.rules.apps.java.model.WindupJavaConfigurationModel; /** * Provides methods for loading and working with {@link WindupJavaConfigurationModel} objects. * * @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a> * */ public class WindupJavaConfigurationService extends GraphService<WindupJavaConfigurationModel> { private List<String> ignoredRegexes; public WindupJavaConfigurationService(GraphContext context) { super(context, WindupJavaConfigurationModel.class); } /** * Loads the single {@link WindupJavaConfigurationModel} from the graph. */ public static synchronized WindupJavaConfigurationModel getJavaConfigurationModel(GraphContext context) { WindupJavaConfigurationService service = new WindupJavaConfigurationService(context); WindupJavaConfigurationModel config = service.getUnique(); if (config == null) config = service.create(); return config; } public List<String> getIgnoredFileRegexes() { if (ignoredRegexes == null) { ignoredRegexes = new ArrayList<>(); WindupJavaConfigurationModel cfg = getJavaConfigurationModel(getGraphContext()); for (IgnoredFileRegexModel ignored : cfg.getIgnoredFileRegexes()) { //TODO: Consider having isCompilable() in case there is no message but is not compilable if(ignored.getCompilationError() == null) { ignoredRegexes.add(ignored.getRegex()); } } } return ignoredRegexes; } /** * This is similar to {@link WindupJavaConfigurationService#shouldScanPackage(String)}, except that it expects to be given a file path (for * example, "/path/to/file.class"). This will use a string.contains approach, as we cannot know for sure what type of path prefixes may exist * before the package name part of the path. * * Also, this can only work reliably for class files, though it will generally work with java files if they are in package appropriate folders. */ public boolean shouldScanFile(String path) { WindupJavaConfigurationModel configuration = getJavaConfigurationModel(getGraphContext()); path = FilenameUtils.separatorsToUnix(path); for (PackageModel excludePackage : configuration.getExcludeJavaPackages()) { String packageAsPath = excludePackage.getPackageName().replace(".", "/"); if (path.contains(packageAsPath)) return false; } boolean shouldScan = true; for (PackageModel includePackage : configuration.getScanJavaPackages()) { String packageAsPath = includePackage.getPackageName().replace(".", "/"); if (path.contains(packageAsPath)) { shouldScan = true; break; } else { shouldScan = false; } } return shouldScan; } /** * Indicates whether the provided package should be scanned (based upon the inclusion/exclusion lists). */ public boolean shouldScanPackage(String pkg) { // assume an empty string if it wasn't specified if (pkg == null) { pkg = ""; } WindupJavaConfigurationModel configuration = getJavaConfigurationModel(getGraphContext()); for (PackageModel pkgModel : configuration.getExcludeJavaPackages()) { String excludePkg = pkgModel.getPackageName(); if (pkg.startsWith(excludePkg)) { return false; } } // if the list is empty, assume it is intended to just accept all packages if (!configuration.getScanJavaPackages().iterator().hasNext()) { return true; } for (PackageModel pkgModel : configuration.getScanJavaPackages()) { String includePkg = pkgModel.getPackageName(); if (pkg.startsWith(includePkg)) { return true; } } return false; } }