diff --git a/src/main/java/com/bartek/esa/core/archetype/AndroidManifestPlugin.java b/src/main/java/com/bartek/esa/core/archetype/AndroidManifestPlugin.java index 4259507..cd257d5 100644 --- a/src/main/java/com/bartek/esa/core/archetype/AndroidManifestPlugin.java +++ b/src/main/java/com/bartek/esa/core/archetype/AndroidManifestPlugin.java @@ -1,4 +1,19 @@ package com.bartek.esa.core.archetype; +import com.bartek.esa.file.matcher.GlobMatcher; + +import java.io.File; + public abstract class AndroidManifestPlugin extends XmlPlugin { + private final GlobMatcher globMatcher; + + protected AndroidManifestPlugin(GlobMatcher globMatcher) { + super(globMatcher); + this.globMatcher = globMatcher; + } + + @Override + public boolean supports(File file) { + return globMatcher.fileMatchesGlobPattern(file, "**/AndroidManifest.xml"); + } } diff --git a/src/main/java/com/bartek/esa/core/archetype/BasePlugin.java b/src/main/java/com/bartek/esa/core/archetype/BasePlugin.java index 7dec1b1..53aa00f 100644 --- a/src/main/java/com/bartek/esa/core/archetype/BasePlugin.java +++ b/src/main/java/com/bartek/esa/core/archetype/BasePlugin.java @@ -6,15 +6,17 @@ import java.io.File; import java.util.ArrayList; import java.util.List; -public abstract class BasePlugin { +public abstract class BasePlugin implements Plugin { private List issues = new ArrayList<>(); private File file; + @Override public void update(File file) { this.file = file; this.issues.clear(); } + @Override public List runForIssues() { run(file); return issues; diff --git a/src/main/java/com/bartek/esa/core/archetype/JavaMethodBodyStatementPlugin.java b/src/main/java/com/bartek/esa/core/archetype/JavaMethodBodyStatementPlugin.java index 5a83cb1..64b9b4d 100644 --- a/src/main/java/com/bartek/esa/core/archetype/JavaMethodBodyStatementPlugin.java +++ b/src/main/java/com/bartek/esa/core/archetype/JavaMethodBodyStatementPlugin.java @@ -1,5 +1,6 @@ package com.bartek.esa.core.archetype; +import com.bartek.esa.file.matcher.GlobMatcher; import com.github.javaparser.ast.CompilationUnit; import com.github.javaparser.ast.body.BodyDeclaration; import com.github.javaparser.ast.body.MethodDeclaration; @@ -13,6 +14,10 @@ import java.util.stream.Stream; public abstract class JavaMethodBodyStatementPlugin extends JavaPlugin { + public JavaMethodBodyStatementPlugin(GlobMatcher globMatcher) { + super(globMatcher); + } + @Override public void run(CompilationUnit compilationUnit) { Stream statements = compilationUnit.getTypes().stream() diff --git a/src/main/java/com/bartek/esa/core/archetype/JavaPlugin.java b/src/main/java/com/bartek/esa/core/archetype/JavaPlugin.java index e6c4384..decd27a 100644 --- a/src/main/java/com/bartek/esa/core/archetype/JavaPlugin.java +++ b/src/main/java/com/bartek/esa/core/archetype/JavaPlugin.java @@ -1,6 +1,7 @@ package com.bartek.esa.core.archetype; import com.bartek.esa.error.EsaException; +import com.bartek.esa.file.matcher.GlobMatcher; import com.github.javaparser.StaticJavaParser; import com.github.javaparser.ast.CompilationUnit; import io.vavr.control.Try; @@ -8,6 +9,16 @@ import io.vavr.control.Try; import java.io.File; public abstract class JavaPlugin extends BasePlugin { + private final GlobMatcher globMatcher; + + protected JavaPlugin(GlobMatcher globMatcher) { + this.globMatcher = globMatcher; + } + + @Override + public boolean supports(File file) { + return globMatcher.fileMatchesGlobPattern(file, "**/*.java"); + } @Override protected void run(File file) { diff --git a/src/main/java/com/bartek/esa/core/archetype/Plugin.java b/src/main/java/com/bartek/esa/core/archetype/Plugin.java new file mode 100644 index 0000000..0541940 --- /dev/null +++ b/src/main/java/com/bartek/esa/core/archetype/Plugin.java @@ -0,0 +1,12 @@ +package com.bartek.esa.core.archetype; + +import com.bartek.esa.core.model.Issue; + +import java.io.File; +import java.util.List; + +public interface Plugin { + boolean supports(File file); + void update(File file); + List runForIssues(); +} diff --git a/src/main/java/com/bartek/esa/core/archetype/ResourceLayoutPlugin.java b/src/main/java/com/bartek/esa/core/archetype/ResourceLayoutPlugin.java index ac729a8..4c50792 100644 --- a/src/main/java/com/bartek/esa/core/archetype/ResourceLayoutPlugin.java +++ b/src/main/java/com/bartek/esa/core/archetype/ResourceLayoutPlugin.java @@ -1,4 +1,19 @@ package com.bartek.esa.core.archetype; +import com.bartek.esa.file.matcher.GlobMatcher; + +import java.io.File; + public abstract class ResourceLayoutPlugin extends XmlPlugin { + private final GlobMatcher globMatcher; + + public ResourceLayoutPlugin(GlobMatcher globMatcher) { + super(globMatcher); + this.globMatcher = globMatcher; + } + + @Override + public boolean supports(File file) { + return globMatcher.fileMatchesGlobPattern(file, "**/res/layout*/*.xml"); + } } diff --git a/src/main/java/com/bartek/esa/core/archetype/XmlPlugin.java b/src/main/java/com/bartek/esa/core/archetype/XmlPlugin.java index 0179365..e21666c 100644 --- a/src/main/java/com/bartek/esa/core/archetype/XmlPlugin.java +++ b/src/main/java/com/bartek/esa/core/archetype/XmlPlugin.java @@ -1,6 +1,7 @@ package com.bartek.esa.core.archetype; import com.bartek.esa.error.EsaException; +import com.bartek.esa.file.matcher.GlobMatcher; import io.vavr.control.Try; import org.w3c.dom.Document; @@ -11,6 +12,16 @@ import javax.xml.xpath.XPathFactory; import java.io.File; public abstract class XmlPlugin extends BasePlugin { + private final GlobMatcher globMatcher; + + protected XmlPlugin(GlobMatcher globMatcher) { + this.globMatcher = globMatcher; + } + + @Override + public boolean supports(File file) { + return globMatcher.fileMatchesGlobPattern(file, "**/*.xml"); + } @Override protected void run(File file) { diff --git a/src/main/java/com/bartek/esa/core/executor/PluginExecutor.java b/src/main/java/com/bartek/esa/core/executor/PluginExecutor.java index 0c3c8f9..025b235 100644 --- a/src/main/java/com/bartek/esa/core/executor/PluginExecutor.java +++ b/src/main/java/com/bartek/esa/core/executor/PluginExecutor.java @@ -1,6 +1,6 @@ package com.bartek.esa.core.executor; -import com.bartek.esa.core.archetype.BasePlugin; +import com.bartek.esa.core.archetype.Plugin; import com.bartek.esa.core.model.Issue; import javax.inject.Inject; @@ -16,15 +16,16 @@ public class PluginExecutor { } - public List executeForFiles(List files, List plugins) { + public List executeForFiles(List files, List plugins) { return files.stream() .map(file -> executeForFile(file, plugins)) .flatMap(List::stream) .collect(toList()); } - private List executeForFile(File file, List plugins) { + private List executeForFile(File file, List plugins) { return plugins.stream() + .filter(plugin -> plugin.supports(file)) .map(plugin -> { plugin.update(file); return plugin.runForIssues(); diff --git a/src/main/java/com/bartek/esa/file/di/FileModule.java b/src/main/java/com/bartek/esa/file/di/FileModule.java index 5201de1..815b3d4 100644 --- a/src/main/java/com/bartek/esa/file/di/FileModule.java +++ b/src/main/java/com/bartek/esa/file/di/FileModule.java @@ -1,5 +1,6 @@ package com.bartek.esa.file.di; +import com.bartek.esa.file.matcher.GlobMatcher; import com.bartek.esa.file.provider.FileContentProvider; import com.bartek.esa.file.provider.FileProvider; import dagger.Module; @@ -9,12 +10,17 @@ import dagger.Provides; public class FileModule { @Provides - public FileProvider fileProvider() { - return new FileProvider(); + public FileProvider fileProvider(GlobMatcher globMatcher) { + return new FileProvider(globMatcher); } @Provides public FileContentProvider fileContentProvider() { return new FileContentProvider(); } + + @Provides + public GlobMatcher globMatcher() { + return new GlobMatcher(); + } } diff --git a/src/main/java/com/bartek/esa/file/matcher/GlobMatcher.java b/src/main/java/com/bartek/esa/file/matcher/GlobMatcher.java new file mode 100644 index 0000000..58d9a1d --- /dev/null +++ b/src/main/java/com/bartek/esa/file/matcher/GlobMatcher.java @@ -0,0 +1,22 @@ +package com.bartek.esa.file.matcher; + +import javax.inject.Inject; +import java.io.File; +import java.nio.file.FileSystems; +import java.nio.file.Path; + +public class GlobMatcher { + + @Inject + public GlobMatcher() { + + } + + public boolean fileMatchesGlobPattern(File file, String globPattern) { + return pathMatchesGlobPattern(file.toPath(), globPattern); + } + + public boolean pathMatchesGlobPattern(Path path, String globPattern) { + return FileSystems.getDefault().getPathMatcher("glob:" + globPattern).matches(path); + } +} diff --git a/src/main/java/com/bartek/esa/file/provider/FileProvider.java b/src/main/java/com/bartek/esa/file/provider/FileProvider.java index ceedf6a..b058d37 100644 --- a/src/main/java/com/bartek/esa/file/provider/FileProvider.java +++ b/src/main/java/com/bartek/esa/file/provider/FileProvider.java @@ -1,6 +1,7 @@ package com.bartek.esa.file.provider; import com.bartek.esa.error.EsaException; +import com.bartek.esa.file.matcher.GlobMatcher; import io.vavr.control.Try; import javax.inject.Inject; @@ -12,10 +13,12 @@ import java.util.Set; import java.util.stream.Collectors; public class FileProvider { + private final GlobMatcher globMatcher; @Inject - public FileProvider() { + public FileProvider(GlobMatcher globMatcher) { + this.globMatcher = globMatcher; } public File createTemporaryDirectory() { @@ -24,49 +27,11 @@ public class FileProvider { .toFile(); } - public Set findFilesRecursively(String path, String globPattern) { - return findFilesRecursivelyInSubpath(path, "", globPattern); - } - - public Set findFilesRecursivelyInSubpath(String path, String subpath, String globPattern) { + public Set getGlobMatchedFiles(String path, String globPattern) { return Try.of(() -> Files.walk(Paths.get(path)) - .filter(p -> p.toString().contains(subpath)) - .filter(p -> matchesGlobPattern(p.getFileName().toString(), globPattern)) + .filter(p -> globMatcher.pathMatchesGlobPattern(p, globPattern)) .map(Path::toFile) .collect(Collectors.toSet())) .getOrElseThrow(EsaException::new); } - - public boolean matchesGlobPattern(String filename, String globPattern) { - return filename.matches(createRegexFromGlob(globPattern)); - } - - private String createRegexFromGlob(String glob) { - StringBuilder out = new StringBuilder("^"); - - glob - .chars() - .mapToObj(i -> (char) i) - .map(this::globCharacterToRegexString) - .forEach(out::append); - - out.append('$'); - - return out.toString(); - } - - private String globCharacterToRegexString(char character) { - switch (character) { - case '*': - return ".*"; - case '?': - return "."; - case '.': - return "\\."; - case '\\': - return "\\\\"; - default: - return String.valueOf(character); - } - } }