From e1a37f9878a01c3a2a4ccd0314450fc78074e172 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Pluta?= Date: Sun, 31 Mar 2019 14:51:10 +0200 Subject: [PATCH 01/11] 5: Create BasePlugin and Issue --- .../bartek/esa/core/archetype/BasePlugin.java | 34 +++++++++++++++++++ .../java/com/bartek/esa/core/model/Issue.java | 15 ++++++++ 2 files changed, 49 insertions(+) create mode 100644 src/main/java/com/bartek/esa/core/archetype/BasePlugin.java create mode 100644 src/main/java/com/bartek/esa/core/model/Issue.java diff --git a/src/main/java/com/bartek/esa/core/archetype/BasePlugin.java b/src/main/java/com/bartek/esa/core/archetype/BasePlugin.java new file mode 100644 index 0000000..32d5338 --- /dev/null +++ b/src/main/java/com/bartek/esa/core/archetype/BasePlugin.java @@ -0,0 +1,34 @@ +package com.bartek.esa.core.archetype; + +import com.bartek.esa.core.model.Issue; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +public abstract class BasePlugin { + private List issues = new ArrayList<>(); + private File file; + + public void update(File file) { + this.file = file; + } + + public List runForIssues() { + run(file); + return issues; + } + + protected abstract void run(File file); + + protected void addIssue(int lineNumber, String line) { + Issue issue = Issue.builder() + .issuer(this.getClass()) + .file(file) + .lineNumber(lineNumber) + .line(line) + .build(); + + issues.add(issue); + } +} diff --git a/src/main/java/com/bartek/esa/core/model/Issue.java b/src/main/java/com/bartek/esa/core/model/Issue.java new file mode 100644 index 0000000..c364f6f --- /dev/null +++ b/src/main/java/com/bartek/esa/core/model/Issue.java @@ -0,0 +1,15 @@ +package com.bartek.esa.core.model; + +import lombok.Builder; +import lombok.Data; + +import java.io.File; + +@Data +@Builder +public class Issue { + private final Class issuer; + private final File file; + private final int lineNumber; + private final String line; +} From dc44f817837dc830c2fb421f256cbfc4adccd089 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Pluta?= Date: Sun, 31 Mar 2019 14:52:08 +0200 Subject: [PATCH 02/11] 5: Create PluginExecutor --- .../esa/core/executor/PluginExecutor.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/main/java/com/bartek/esa/core/executor/PluginExecutor.java diff --git a/src/main/java/com/bartek/esa/core/executor/PluginExecutor.java b/src/main/java/com/bartek/esa/core/executor/PluginExecutor.java new file mode 100644 index 0000000..0c3c8f9 --- /dev/null +++ b/src/main/java/com/bartek/esa/core/executor/PluginExecutor.java @@ -0,0 +1,35 @@ +package com.bartek.esa.core.executor; + +import com.bartek.esa.core.archetype.BasePlugin; +import com.bartek.esa.core.model.Issue; + +import javax.inject.Inject; +import java.io.File; +import java.util.List; + +import static java.util.stream.Collectors.toList; + +public class PluginExecutor { + + @Inject + public PluginExecutor() { + + } + + 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) { + return plugins.stream() + .map(plugin -> { + plugin.update(file); + return plugin.runForIssues(); + }) + .flatMap(List::stream) + .collect(toList()); + } +} From 68b9d87b4304d8fe9f7b1af2539c96d7167ba83c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Pluta?= Date: Sun, 31 Mar 2019 14:53:19 +0200 Subject: [PATCH 03/11] 5: Provide DI for core package --- .../java/com/bartek/esa/core/di/CoreModule.java | 14 ++++++++++++++ .../java/com/bartek/esa/di/DependencyInjector.java | 4 +++- 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/bartek/esa/core/di/CoreModule.java diff --git a/src/main/java/com/bartek/esa/core/di/CoreModule.java b/src/main/java/com/bartek/esa/core/di/CoreModule.java new file mode 100644 index 0000000..b58c78b --- /dev/null +++ b/src/main/java/com/bartek/esa/core/di/CoreModule.java @@ -0,0 +1,14 @@ +package com.bartek.esa.core.di; + +import com.bartek.esa.core.executor.PluginExecutor; +import dagger.Module; +import dagger.Provides; + +@Module +public class CoreModule { + + @Provides + public PluginExecutor pluginExecutor() { + return new PluginExecutor(); + } +} diff --git a/src/main/java/com/bartek/esa/di/DependencyInjector.java b/src/main/java/com/bartek/esa/di/DependencyInjector.java index e3c449e..b05f447 100644 --- a/src/main/java/com/bartek/esa/di/DependencyInjector.java +++ b/src/main/java/com/bartek/esa/di/DependencyInjector.java @@ -2,6 +2,7 @@ package com.bartek.esa.di; import com.bartek.esa.EsaMain; import com.bartek.esa.cli.di.CliModule; +import com.bartek.esa.core.di.CoreModule; import com.bartek.esa.decompiler.di.DecompilerModule; import com.bartek.esa.dispatcher.di.DispatcherModule; import com.bartek.esa.file.di.FileModule; @@ -11,7 +12,8 @@ import dagger.Component; CliModule.class, DispatcherModule.class, FileModule.class, - DecompilerModule.class + DecompilerModule.class, + CoreModule.class }) public interface DependencyInjector { EsaMain esa(); From 0c8a94903ab9e8ec21822eed9fa9235c4432c0d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Pluta?= Date: Sun, 31 Mar 2019 15:01:49 +0200 Subject: [PATCH 04/11] 5: Create FileContentProvider --- .../com/bartek/esa/file/di/FileModule.java | 6 ++ .../com/bartek/esa/file/model/FoundLine.java | 12 ++++ .../file/provider/FileContentProvider.java | 63 +++++++++++++++++++ .../esa/file/provider/FileProvider.java | 9 --- 4 files changed, 81 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/bartek/esa/file/model/FoundLine.java create mode 100644 src/main/java/com/bartek/esa/file/provider/FileContentProvider.java 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 adcbd99..5201de1 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.provider.FileContentProvider; import com.bartek.esa.file.provider.FileProvider; import dagger.Module; import dagger.Provides; @@ -11,4 +12,9 @@ public class FileModule { public FileProvider fileProvider() { return new FileProvider(); } + + @Provides + public FileContentProvider fileContentProvider() { + return new FileContentProvider(); + } } diff --git a/src/main/java/com/bartek/esa/file/model/FoundLine.java b/src/main/java/com/bartek/esa/file/model/FoundLine.java new file mode 100644 index 0000000..05cd59a --- /dev/null +++ b/src/main/java/com/bartek/esa/file/model/FoundLine.java @@ -0,0 +1,12 @@ +package com.bartek.esa.file.model; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class FoundLine { + private int number; + private String line; + private int position; +} diff --git a/src/main/java/com/bartek/esa/file/provider/FileContentProvider.java b/src/main/java/com/bartek/esa/file/provider/FileContentProvider.java new file mode 100644 index 0000000..195d908 --- /dev/null +++ b/src/main/java/com/bartek/esa/file/provider/FileContentProvider.java @@ -0,0 +1,63 @@ +package com.bartek.esa.file.provider; + +import com.bartek.esa.error.EsaException; +import com.bartek.esa.file.model.FoundLine; +import io.vavr.control.Try; + +import javax.inject.Inject; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.io.LineNumberReader; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Pattern; + +public class FileContentProvider { + + @Inject + public FileContentProvider() { + + } + + public List findPhraseByLines(File file, String regex) { + try { + return tryToFindPhraseByLines(file, regex); + } catch (IOException e) { + throw new EsaException(e); + } + } + + private List tryToFindPhraseByLines(File file, String regex) throws IOException { + LineNumberReader lineNumberReader = readForLines(file); + List foundLines = new ArrayList<>(); + + String line; + Pattern pattern = Pattern.compile(regex); + while ((line = lineNumberReader.readLine()) != null) { + if (pattern.matcher(line).find()) { + foundLines.add(FoundLine.builder() + .line(line) + .number(lineNumberReader.getLineNumber()) + .build()); + } + } + + return foundLines; + } + + private LineNumberReader readForLines(File file) { + return Try.of(() -> new LineNumberReader(new FileReader(file))) + .getOrElseThrow(EsaException::new); + } + + public String readFile(File file) { + StringBuilder content = new StringBuilder(); + Try.run(() -> Files.lines(file.toPath()) + .map(line -> line + "\n") + .forEach(content::append)); + + return content.toString(); + } +} 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 b3cbd3e..ceedf6a 100644 --- a/src/main/java/com/bartek/esa/file/provider/FileProvider.java +++ b/src/main/java/com/bartek/esa/file/provider/FileProvider.java @@ -24,15 +24,6 @@ public class FileProvider { .toFile(); } - public String readFile(File file) { - StringBuilder content = new StringBuilder(); - Try.run(() -> Files.lines(file.toPath()) - .map(line -> line + "\n") - .forEach(content::append)); - - return content.toString(); - } - public Set findFilesRecursively(String path, String globPattern) { return findFilesRecursivelyInSubpath(path, "", globPattern); } From 87ea6223092644481b44a5ec1802c18820fb2442 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Pluta?= Date: Sun, 31 Mar 2019 17:16:25 +0200 Subject: [PATCH 05/11] 5: Create basic plugin archetypes --- build.gradle | 1 + dependency-versions.gradle | 1 + .../core/archetype/AndroidManifestPlugin.java | 4 ++ .../bartek/esa/core/archetype/BasePlugin.java | 7 +++- .../JavaMethodBodyStatementPlugin.java | 39 +++++++++++++++++++ .../bartek/esa/core/archetype/JavaPlugin.java | 19 +++++++++ .../core/archetype/ResourceLayoutPlugin.java | 4 ++ .../bartek/esa/core/archetype/XmlPlugin.java | 29 ++++++++++++++ .../java/com/bartek/esa/core/model/Issue.java | 2 +- 9 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/bartek/esa/core/archetype/AndroidManifestPlugin.java create mode 100644 src/main/java/com/bartek/esa/core/archetype/JavaMethodBodyStatementPlugin.java create mode 100644 src/main/java/com/bartek/esa/core/archetype/JavaPlugin.java create mode 100644 src/main/java/com/bartek/esa/core/archetype/ResourceLayoutPlugin.java create mode 100644 src/main/java/com/bartek/esa/core/archetype/XmlPlugin.java diff --git a/build.gradle b/build.gradle index c64d2a7..58a64e2 100644 --- a/build.gradle +++ b/build.gradle @@ -20,6 +20,7 @@ dependencies { annotationProcessor "org.projectlombok:lombok:${lombokVersion}" compile "commons-cli:commons-cli:${commonCliVersion}" compile "io.vavr:vavr:${vavrVersion}" + compile "com.github.javaparser:javaparser-core:${javaParserVersion}" } jar { diff --git a/dependency-versions.gradle b/dependency-versions.gradle index a9c4422..879c4c0 100644 --- a/dependency-versions.gradle +++ b/dependency-versions.gradle @@ -3,4 +3,5 @@ ext { lombokVersion = '1.18.6' commonCliVersion = '1.4' vavrVersion = '1.0.0-alpha-2' + javaParserVersion = '3.13.4' } \ No newline at end of file diff --git a/src/main/java/com/bartek/esa/core/archetype/AndroidManifestPlugin.java b/src/main/java/com/bartek/esa/core/archetype/AndroidManifestPlugin.java new file mode 100644 index 0000000..4259507 --- /dev/null +++ b/src/main/java/com/bartek/esa/core/archetype/AndroidManifestPlugin.java @@ -0,0 +1,4 @@ +package com.bartek.esa.core.archetype; + +public abstract class AndroidManifestPlugin extends XmlPlugin { +} 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 32d5338..7dec1b1 100644 --- a/src/main/java/com/bartek/esa/core/archetype/BasePlugin.java +++ b/src/main/java/com/bartek/esa/core/archetype/BasePlugin.java @@ -12,6 +12,7 @@ public abstract class BasePlugin { public void update(File file) { this.file = file; + this.issues.clear(); } public List runForIssues() { @@ -21,7 +22,7 @@ public abstract class BasePlugin { protected abstract void run(File file); - protected void addIssue(int lineNumber, String line) { + protected void addIssue(Integer lineNumber, String line) { Issue issue = Issue.builder() .issuer(this.getClass()) .file(file) @@ -31,4 +32,8 @@ public abstract class BasePlugin { issues.add(issue); } + + protected File getOriginalFile() { + return file; + } } diff --git a/src/main/java/com/bartek/esa/core/archetype/JavaMethodBodyStatementPlugin.java b/src/main/java/com/bartek/esa/core/archetype/JavaMethodBodyStatementPlugin.java new file mode 100644 index 0000000..5a83cb1 --- /dev/null +++ b/src/main/java/com/bartek/esa/core/archetype/JavaMethodBodyStatementPlugin.java @@ -0,0 +1,39 @@ +package com.bartek.esa.core.archetype; + +import com.github.javaparser.ast.CompilationUnit; +import com.github.javaparser.ast.body.BodyDeclaration; +import com.github.javaparser.ast.body.MethodDeclaration; +import com.github.javaparser.ast.body.TypeDeclaration; +import com.github.javaparser.ast.stmt.BlockStmt; +import com.github.javaparser.ast.stmt.Statement; + +import java.util.Collection; +import java.util.Optional; +import java.util.stream.Stream; + +public abstract class JavaMethodBodyStatementPlugin extends JavaPlugin { + + @Override + public void run(CompilationUnit compilationUnit) { + Stream statements = compilationUnit.getTypes().stream() + .map(TypeDeclaration::getMembers) + .flatMap(Collection::stream) + .filter(BodyDeclaration::isMethodDeclaration) + .map(b -> (MethodDeclaration) b) + .map(MethodDeclaration::getBody) + .flatMap(Optional::stream) + .map(BlockStmt::getStatements) + .flatMap(Collection::stream); + + checkStatements(statements); + } + + protected abstract void checkStatements(Stream statements); + + protected Integer getLineNumberOfStatement(Statement statement) { + return statement.getRange() + .map(range -> range.begin) + .map(begin -> begin.line) + .orElse(null); + } +} diff --git a/src/main/java/com/bartek/esa/core/archetype/JavaPlugin.java b/src/main/java/com/bartek/esa/core/archetype/JavaPlugin.java new file mode 100644 index 0000000..e6c4384 --- /dev/null +++ b/src/main/java/com/bartek/esa/core/archetype/JavaPlugin.java @@ -0,0 +1,19 @@ +package com.bartek.esa.core.archetype; + +import com.bartek.esa.error.EsaException; +import com.github.javaparser.StaticJavaParser; +import com.github.javaparser.ast.CompilationUnit; +import io.vavr.control.Try; + +import java.io.File; + +public abstract class JavaPlugin extends BasePlugin { + + @Override + protected void run(File file) { + CompilationUnit compilationUnit = Try.of(() -> StaticJavaParser.parse(file)).getOrElseThrow(EsaException::new); + run(compilationUnit); + } + + public abstract void run(CompilationUnit compilationUnit); +} diff --git a/src/main/java/com/bartek/esa/core/archetype/ResourceLayoutPlugin.java b/src/main/java/com/bartek/esa/core/archetype/ResourceLayoutPlugin.java new file mode 100644 index 0000000..ac729a8 --- /dev/null +++ b/src/main/java/com/bartek/esa/core/archetype/ResourceLayoutPlugin.java @@ -0,0 +1,4 @@ +package com.bartek.esa.core.archetype; + +public abstract class ResourceLayoutPlugin extends XmlPlugin { +} diff --git a/src/main/java/com/bartek/esa/core/archetype/XmlPlugin.java b/src/main/java/com/bartek/esa/core/archetype/XmlPlugin.java new file mode 100644 index 0000000..0179365 --- /dev/null +++ b/src/main/java/com/bartek/esa/core/archetype/XmlPlugin.java @@ -0,0 +1,29 @@ +package com.bartek.esa.core.archetype; + +import com.bartek.esa.error.EsaException; +import io.vavr.control.Try; +import org.w3c.dom.Document; + +import javax.xml.namespace.QName; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.xpath.XPathFactory; +import java.io.File; + +public abstract class XmlPlugin extends BasePlugin { + + @Override + protected void run(File file) { + DocumentBuilderFactory factory = DocumentBuilderFactory.newDefaultInstance(); + DocumentBuilder builder = Try.of(factory::newDocumentBuilder).getOrElseThrow(EsaException::new); + Document document = Try.of(() -> builder.parse(file)).getOrElseThrow(EsaException::new); + run(document); + } + + protected abstract void run(Document xml); + + protected Object xPath(Document xml, String expression, QName returnType) { + return Try.of(() -> XPathFactory.newDefaultInstance().newXPath().evaluate(expression, xml, returnType)) + .getOrElseThrow(EsaException::new); + } +} diff --git a/src/main/java/com/bartek/esa/core/model/Issue.java b/src/main/java/com/bartek/esa/core/model/Issue.java index c364f6f..ba21463 100644 --- a/src/main/java/com/bartek/esa/core/model/Issue.java +++ b/src/main/java/com/bartek/esa/core/model/Issue.java @@ -10,6 +10,6 @@ import java.io.File; public class Issue { private final Class issuer; private final File file; - private final int lineNumber; + private final Integer lineNumber; private final String line; } From 2ebaef4c420158ed88b0a7182c6130bbb9b53ed9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Pluta?= Date: Sun, 31 Mar 2019 22:18:19 +0200 Subject: [PATCH 06/11] 5: Create JavaSyntaxRegexProvider --- .../java/com/bartek/esa/core/di/CoreModule.java | 6 ++++++ .../esa/core/java/JavaSyntaxRegexProvider.java | 17 +++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 src/main/java/com/bartek/esa/core/java/JavaSyntaxRegexProvider.java diff --git a/src/main/java/com/bartek/esa/core/di/CoreModule.java b/src/main/java/com/bartek/esa/core/di/CoreModule.java index b58c78b..fea4e7a 100644 --- a/src/main/java/com/bartek/esa/core/di/CoreModule.java +++ b/src/main/java/com/bartek/esa/core/di/CoreModule.java @@ -1,6 +1,7 @@ package com.bartek.esa.core.di; import com.bartek.esa.core.executor.PluginExecutor; +import com.bartek.esa.core.java.JavaSyntaxRegexProvider; import dagger.Module; import dagger.Provides; @@ -11,4 +12,9 @@ public class CoreModule { public PluginExecutor pluginExecutor() { return new PluginExecutor(); } + + @Provides + public JavaSyntaxRegexProvider javaSyntaxRegexProvider() { + return new JavaSyntaxRegexProvider(); + } } diff --git a/src/main/java/com/bartek/esa/core/java/JavaSyntaxRegexProvider.java b/src/main/java/com/bartek/esa/core/java/JavaSyntaxRegexProvider.java new file mode 100644 index 0000000..d15c375 --- /dev/null +++ b/src/main/java/com/bartek/esa/core/java/JavaSyntaxRegexProvider.java @@ -0,0 +1,17 @@ +package com.bartek.esa.core.java; + +import javax.inject.Inject; + +import static java.lang.String.format; + +public class JavaSyntaxRegexProvider { + + @Inject + public JavaSyntaxRegexProvider() { + + } + + public String methodInvocation(String methodName) { + return format("^%s\\s*\\($", methodName); + } +} From 844205f28036267e668d7e100eb2545a2239ffd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Pluta?= Date: Sun, 31 Mar 2019 22:33:18 +0200 Subject: [PATCH 07/11] 5: Create DescriptionProvider --- .../desc/provider/DescriptionProvider.java | 24 +++++++++++++++++++ .../com/bartek/esa/core/di/CoreModule.java | 6 +++++ src/main/resources/description.properties | 0 3 files changed, 30 insertions(+) create mode 100644 src/main/java/com/bartek/esa/core/desc/provider/DescriptionProvider.java create mode 100644 src/main/resources/description.properties diff --git a/src/main/java/com/bartek/esa/core/desc/provider/DescriptionProvider.java b/src/main/java/com/bartek/esa/core/desc/provider/DescriptionProvider.java new file mode 100644 index 0000000..7c9be67 --- /dev/null +++ b/src/main/java/com/bartek/esa/core/desc/provider/DescriptionProvider.java @@ -0,0 +1,24 @@ +package com.bartek.esa.core.desc.provider; + +import com.bartek.esa.error.EsaException; +import io.vavr.control.Try; + +import javax.inject.Inject; +import java.util.Optional; +import java.util.Properties; + +public class DescriptionProvider { + private static final String DESCRIPTION_FILE = "description.properties"; + private final Properties properties = new Properties(); + + @Inject + public DescriptionProvider() { + Optional.ofNullable(DescriptionProvider.class.getClassLoader().getResourceAsStream(DESCRIPTION_FILE)) + .ifPresent(p -> Try.run(() -> properties.load(p)).getOrElseThrow(EsaException::new)); + } + + public String getDescriptionForClass(Class clazz) { + String clazzCanonicalName = properties.getProperty(clazz.getCanonicalName()); + return clazzCanonicalName != null ? clazzCanonicalName : "No description provided."; + } +} diff --git a/src/main/java/com/bartek/esa/core/di/CoreModule.java b/src/main/java/com/bartek/esa/core/di/CoreModule.java index fea4e7a..29c133b 100644 --- a/src/main/java/com/bartek/esa/core/di/CoreModule.java +++ b/src/main/java/com/bartek/esa/core/di/CoreModule.java @@ -1,5 +1,6 @@ package com.bartek.esa.core.di; +import com.bartek.esa.core.desc.provider.DescriptionProvider; import com.bartek.esa.core.executor.PluginExecutor; import com.bartek.esa.core.java.JavaSyntaxRegexProvider; import dagger.Module; @@ -17,4 +18,9 @@ public class CoreModule { public JavaSyntaxRegexProvider javaSyntaxRegexProvider() { return new JavaSyntaxRegexProvider(); } + + @Provides + public DescriptionProvider descriptionProvider() { + return new DescriptionProvider(); + } } diff --git a/src/main/resources/description.properties b/src/main/resources/description.properties new file mode 100644 index 0000000..e69de29 From 779a6255d8cee91e558fbf0a703665a2577fb182 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Pluta?= Date: Mon, 1 Apr 2019 17:23:01 +0200 Subject: [PATCH 08/11] 5: Make plugins to have Plugin interface and add supports method to them --- .../core/archetype/AndroidManifestPlugin.java | 15 ++++++ .../bartek/esa/core/archetype/BasePlugin.java | 4 +- .../JavaMethodBodyStatementPlugin.java | 5 ++ .../bartek/esa/core/archetype/JavaPlugin.java | 11 +++++ .../com/bartek/esa/core/archetype/Plugin.java | 12 +++++ .../core/archetype/ResourceLayoutPlugin.java | 15 ++++++ .../bartek/esa/core/archetype/XmlPlugin.java | 11 +++++ .../esa/core/executor/PluginExecutor.java | 7 +-- .../com/bartek/esa/file/di/FileModule.java | 10 +++- .../bartek/esa/file/matcher/GlobMatcher.java | 22 +++++++++ .../esa/file/provider/FileProvider.java | 47 +++---------------- 11 files changed, 112 insertions(+), 47 deletions(-) create mode 100644 src/main/java/com/bartek/esa/core/archetype/Plugin.java create mode 100644 src/main/java/com/bartek/esa/file/matcher/GlobMatcher.java 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); - } - } } From b660752d6704cf8b61b45ad62922c3dda6fe8db6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Pluta?= Date: Mon, 1 Apr 2019 17:42:20 +0200 Subject: [PATCH 09/11] 5: Rebuild description system to allow many descriptions per plugin --- .../com/bartek/esa/core/archetype/BasePlugin.java | 5 +++++ .../esa/core/desc/provider/DescriptionProvider.java | 12 +++++++----- src/main/java/com/bartek/esa/core/model/Issue.java | 1 + 3 files changed, 13 insertions(+), 5 deletions(-) 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 53aa00f..f607889 100644 --- a/src/main/java/com/bartek/esa/core/archetype/BasePlugin.java +++ b/src/main/java/com/bartek/esa/core/archetype/BasePlugin.java @@ -25,8 +25,13 @@ public abstract class BasePlugin implements Plugin { protected abstract void run(File file); protected void addIssue(Integer lineNumber, String line) { + addIssue("", lineNumber, line); + } + + protected void addIssue(String descriptionCode, Integer lineNumber, String line) { Issue issue = Issue.builder() .issuer(this.getClass()) + .descriptionCode(descriptionCode) .file(file) .lineNumber(lineNumber) .line(line) diff --git a/src/main/java/com/bartek/esa/core/desc/provider/DescriptionProvider.java b/src/main/java/com/bartek/esa/core/desc/provider/DescriptionProvider.java index 7c9be67..a3931c8 100644 --- a/src/main/java/com/bartek/esa/core/desc/provider/DescriptionProvider.java +++ b/src/main/java/com/bartek/esa/core/desc/provider/DescriptionProvider.java @@ -1,5 +1,6 @@ package com.bartek.esa.core.desc.provider; +import com.bartek.esa.core.model.Issue; import com.bartek.esa.error.EsaException; import io.vavr.control.Try; @@ -9,16 +10,17 @@ import java.util.Properties; public class DescriptionProvider { private static final String DESCRIPTION_FILE = "description.properties"; - private final Properties properties = new Properties(); + private final Properties descriptions = new Properties(); @Inject public DescriptionProvider() { Optional.ofNullable(DescriptionProvider.class.getClassLoader().getResourceAsStream(DESCRIPTION_FILE)) - .ifPresent(p -> Try.run(() -> properties.load(p)).getOrElseThrow(EsaException::new)); + .ifPresent(p -> Try.run(() -> descriptions.load(p)).getOrElseThrow(EsaException::new)); } - public String getDescriptionForClass(Class clazz) { - String clazzCanonicalName = properties.getProperty(clazz.getCanonicalName()); - return clazzCanonicalName != null ? clazzCanonicalName : "No description provided."; + public String getDescriptionForIssue(Issue issue) { + String code = issue.getIssuer().getCanonicalName() + issue.getDescriptionCode(); + String description = descriptions.getProperty(code); + return description != null && !description.isEmpty() ? description : "No description provided."; } } diff --git a/src/main/java/com/bartek/esa/core/model/Issue.java b/src/main/java/com/bartek/esa/core/model/Issue.java index ba21463..ba5a11d 100644 --- a/src/main/java/com/bartek/esa/core/model/Issue.java +++ b/src/main/java/com/bartek/esa/core/model/Issue.java @@ -9,6 +9,7 @@ import java.io.File; @Builder public class Issue { private final Class issuer; + private final String descriptionCode; private final File file; private final Integer lineNumber; private final String line; From f6cbf89dbed1c082997cc83e8fcbdd650c137b1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Pluta?= Date: Tue, 2 Apr 2019 14:19:19 +0200 Subject: [PATCH 10/11] 5: Add Severity to Issue model --- .../core/archetype/AndroidManifestPlugin.java | 2 +- .../bartek/esa/core/archetype/BasePlugin.java | 10 +++-- .../JavaMethodBodyStatementPlugin.java | 44 ------------------- .../bartek/esa/core/archetype/JavaPlugin.java | 2 +- .../com/bartek/esa/core/archetype/Plugin.java | 2 +- .../bartek/esa/core/archetype/XmlPlugin.java | 2 +- .../desc/provider/DescriptionProvider.java | 2 +- .../esa/core/executor/PluginExecutor.java | 2 +- .../esa/core/model/enumeration/Severity.java | 6 +++ .../esa/core/model/{ => object}/Issue.java | 4 +- 10 files changed, 21 insertions(+), 55 deletions(-) delete mode 100644 src/main/java/com/bartek/esa/core/archetype/JavaMethodBodyStatementPlugin.java create mode 100644 src/main/java/com/bartek/esa/core/model/enumeration/Severity.java rename src/main/java/com/bartek/esa/core/model/{ => object}/Issue.java (67%) 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 cd257d5..b319569 100644 --- a/src/main/java/com/bartek/esa/core/archetype/AndroidManifestPlugin.java +++ b/src/main/java/com/bartek/esa/core/archetype/AndroidManifestPlugin.java @@ -7,7 +7,7 @@ import java.io.File; public abstract class AndroidManifestPlugin extends XmlPlugin { private final GlobMatcher globMatcher; - protected AndroidManifestPlugin(GlobMatcher globMatcher) { + public AndroidManifestPlugin(GlobMatcher globMatcher) { super(globMatcher); this.globMatcher = globMatcher; } 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 f607889..1ba596b 100644 --- a/src/main/java/com/bartek/esa/core/archetype/BasePlugin.java +++ b/src/main/java/com/bartek/esa/core/archetype/BasePlugin.java @@ -1,6 +1,7 @@ package com.bartek.esa.core.archetype; -import com.bartek.esa.core.model.Issue; +import com.bartek.esa.core.model.enumeration.Severity; +import com.bartek.esa.core.model.object.Issue; import java.io.File; import java.util.ArrayList; @@ -24,12 +25,13 @@ public abstract class BasePlugin implements Plugin { protected abstract void run(File file); - protected void addIssue(Integer lineNumber, String line) { - addIssue("", lineNumber, line); + protected void addIssue(Severity severity, Integer lineNumber, String line) { + addIssue(severity, "", lineNumber, line); } - protected void addIssue(String descriptionCode, Integer lineNumber, String line) { + protected void addIssue(Severity severity, String descriptionCode, Integer lineNumber, String line) { Issue issue = Issue.builder() + .severity(severity) .issuer(this.getClass()) .descriptionCode(descriptionCode) .file(file) diff --git a/src/main/java/com/bartek/esa/core/archetype/JavaMethodBodyStatementPlugin.java b/src/main/java/com/bartek/esa/core/archetype/JavaMethodBodyStatementPlugin.java deleted file mode 100644 index 64b9b4d..0000000 --- a/src/main/java/com/bartek/esa/core/archetype/JavaMethodBodyStatementPlugin.java +++ /dev/null @@ -1,44 +0,0 @@ -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; -import com.github.javaparser.ast.body.TypeDeclaration; -import com.github.javaparser.ast.stmt.BlockStmt; -import com.github.javaparser.ast.stmt.Statement; - -import java.util.Collection; -import java.util.Optional; -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() - .map(TypeDeclaration::getMembers) - .flatMap(Collection::stream) - .filter(BodyDeclaration::isMethodDeclaration) - .map(b -> (MethodDeclaration) b) - .map(MethodDeclaration::getBody) - .flatMap(Optional::stream) - .map(BlockStmt::getStatements) - .flatMap(Collection::stream); - - checkStatements(statements); - } - - protected abstract void checkStatements(Stream statements); - - protected Integer getLineNumberOfStatement(Statement statement) { - return statement.getRange() - .map(range -> range.begin) - .map(begin -> begin.line) - .orElse(null); - } -} 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 decd27a..f735329 100644 --- a/src/main/java/com/bartek/esa/core/archetype/JavaPlugin.java +++ b/src/main/java/com/bartek/esa/core/archetype/JavaPlugin.java @@ -11,7 +11,7 @@ import java.io.File; public abstract class JavaPlugin extends BasePlugin { private final GlobMatcher globMatcher; - protected JavaPlugin(GlobMatcher globMatcher) { + public JavaPlugin(GlobMatcher globMatcher) { this.globMatcher = globMatcher; } diff --git a/src/main/java/com/bartek/esa/core/archetype/Plugin.java b/src/main/java/com/bartek/esa/core/archetype/Plugin.java index 0541940..67928bb 100644 --- a/src/main/java/com/bartek/esa/core/archetype/Plugin.java +++ b/src/main/java/com/bartek/esa/core/archetype/Plugin.java @@ -1,6 +1,6 @@ package com.bartek.esa.core.archetype; -import com.bartek.esa.core.model.Issue; +import com.bartek.esa.core.model.object.Issue; import java.io.File; import java.util.List; 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 e21666c..bc839b1 100644 --- a/src/main/java/com/bartek/esa/core/archetype/XmlPlugin.java +++ b/src/main/java/com/bartek/esa/core/archetype/XmlPlugin.java @@ -14,7 +14,7 @@ import java.io.File; public abstract class XmlPlugin extends BasePlugin { private final GlobMatcher globMatcher; - protected XmlPlugin(GlobMatcher globMatcher) { + public XmlPlugin(GlobMatcher globMatcher) { this.globMatcher = globMatcher; } diff --git a/src/main/java/com/bartek/esa/core/desc/provider/DescriptionProvider.java b/src/main/java/com/bartek/esa/core/desc/provider/DescriptionProvider.java index a3931c8..b5ac646 100644 --- a/src/main/java/com/bartek/esa/core/desc/provider/DescriptionProvider.java +++ b/src/main/java/com/bartek/esa/core/desc/provider/DescriptionProvider.java @@ -1,6 +1,6 @@ package com.bartek.esa.core.desc.provider; -import com.bartek.esa.core.model.Issue; +import com.bartek.esa.core.model.object.Issue; import com.bartek.esa.error.EsaException; import io.vavr.control.Try; 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 025b235..5b363fa 100644 --- a/src/main/java/com/bartek/esa/core/executor/PluginExecutor.java +++ b/src/main/java/com/bartek/esa/core/executor/PluginExecutor.java @@ -1,7 +1,7 @@ package com.bartek.esa.core.executor; import com.bartek.esa.core.archetype.Plugin; -import com.bartek.esa.core.model.Issue; +import com.bartek.esa.core.model.object.Issue; import javax.inject.Inject; import java.io.File; diff --git a/src/main/java/com/bartek/esa/core/model/enumeration/Severity.java b/src/main/java/com/bartek/esa/core/model/enumeration/Severity.java new file mode 100644 index 0000000..78b81ea --- /dev/null +++ b/src/main/java/com/bartek/esa/core/model/enumeration/Severity.java @@ -0,0 +1,6 @@ +package com.bartek.esa.core.model.enumeration; + +public enum Severity { + WARNING, + ERROR +} diff --git a/src/main/java/com/bartek/esa/core/model/Issue.java b/src/main/java/com/bartek/esa/core/model/object/Issue.java similarity index 67% rename from src/main/java/com/bartek/esa/core/model/Issue.java rename to src/main/java/com/bartek/esa/core/model/object/Issue.java index ba5a11d..249250f 100644 --- a/src/main/java/com/bartek/esa/core/model/Issue.java +++ b/src/main/java/com/bartek/esa/core/model/object/Issue.java @@ -1,5 +1,6 @@ -package com.bartek.esa.core.model; +package com.bartek.esa.core.model.object; +import com.bartek.esa.core.model.enumeration.Severity; import lombok.Builder; import lombok.Data; @@ -9,6 +10,7 @@ import java.io.File; @Builder public class Issue { private final Class issuer; + private final Severity severity; private final String descriptionCode; private final File file; private final Integer lineNumber; From f2003389b594bde6305bdd4f67d807ac27051a98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Pluta?= Date: Tue, 2 Apr 2019 14:31:25 +0200 Subject: [PATCH 11/11] 5: Add Manifest to plugins --- .../core/archetype/AndroidManifestPlugin.java | 5 +-- .../bartek/esa/core/archetype/BasePlugin.java | 9 +++++- .../com/bartek/esa/core/archetype/Plugin.java | 3 +- .../core/archetype/ResourceLayoutPlugin.java | 5 +-- .../bartek/esa/core/archetype/XmlPlugin.java | 19 +++++------- .../com/bartek/esa/core/di/CoreModule.java | 10 ++++-- .../esa/core/executor/PluginExecutor.java | 16 ++++++---- .../com/bartek/esa/core/xml/XmlHelper.java | 31 +++++++++++++++++++ 8 files changed, 72 insertions(+), 26 deletions(-) create mode 100644 src/main/java/com/bartek/esa/core/xml/XmlHelper.java 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 b319569..b01718e 100644 --- a/src/main/java/com/bartek/esa/core/archetype/AndroidManifestPlugin.java +++ b/src/main/java/com/bartek/esa/core/archetype/AndroidManifestPlugin.java @@ -1,5 +1,6 @@ package com.bartek.esa.core.archetype; +import com.bartek.esa.core.xml.XmlHelper; import com.bartek.esa.file.matcher.GlobMatcher; import java.io.File; @@ -7,8 +8,8 @@ import java.io.File; public abstract class AndroidManifestPlugin extends XmlPlugin { private final GlobMatcher globMatcher; - public AndroidManifestPlugin(GlobMatcher globMatcher) { - super(globMatcher); + public AndroidManifestPlugin(GlobMatcher globMatcher, XmlHelper xmlHelper) { + super(globMatcher, xmlHelper); this.globMatcher = globMatcher; } 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 1ba596b..391ac16 100644 --- a/src/main/java/com/bartek/esa/core/archetype/BasePlugin.java +++ b/src/main/java/com/bartek/esa/core/archetype/BasePlugin.java @@ -2,6 +2,7 @@ package com.bartek.esa.core.archetype; import com.bartek.esa.core.model.enumeration.Severity; import com.bartek.esa.core.model.object.Issue; +import org.w3c.dom.Document; import java.io.File; import java.util.ArrayList; @@ -9,11 +10,13 @@ import java.util.List; public abstract class BasePlugin implements Plugin { private List issues = new ArrayList<>(); + private Document manifest; private File file; @Override - public void update(File file) { + public void update(File file, Document manifest) { this.file = file; + this.manifest = manifest; this.issues.clear(); } @@ -45,4 +48,8 @@ public abstract class BasePlugin implements Plugin { protected File getOriginalFile() { return file; } + + protected Document getManifest() { + return manifest; + } } diff --git a/src/main/java/com/bartek/esa/core/archetype/Plugin.java b/src/main/java/com/bartek/esa/core/archetype/Plugin.java index 67928bb..ddbf1d4 100644 --- a/src/main/java/com/bartek/esa/core/archetype/Plugin.java +++ b/src/main/java/com/bartek/esa/core/archetype/Plugin.java @@ -1,12 +1,13 @@ package com.bartek.esa.core.archetype; import com.bartek.esa.core.model.object.Issue; +import org.w3c.dom.Document; import java.io.File; import java.util.List; public interface Plugin { boolean supports(File file); - void update(File file); + void update(File file, Document manifest); 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 4c50792..aa924e7 100644 --- a/src/main/java/com/bartek/esa/core/archetype/ResourceLayoutPlugin.java +++ b/src/main/java/com/bartek/esa/core/archetype/ResourceLayoutPlugin.java @@ -1,5 +1,6 @@ package com.bartek.esa.core.archetype; +import com.bartek.esa.core.xml.XmlHelper; import com.bartek.esa.file.matcher.GlobMatcher; import java.io.File; @@ -7,8 +8,8 @@ import java.io.File; public abstract class ResourceLayoutPlugin extends XmlPlugin { private final GlobMatcher globMatcher; - public ResourceLayoutPlugin(GlobMatcher globMatcher) { - super(globMatcher); + public ResourceLayoutPlugin(GlobMatcher globMatcher, XmlHelper xmlHelper) { + super(globMatcher, xmlHelper); this.globMatcher = globMatcher; } 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 bc839b1..c1bbedd 100644 --- a/src/main/java/com/bartek/esa/core/archetype/XmlPlugin.java +++ b/src/main/java/com/bartek/esa/core/archetype/XmlPlugin.java @@ -1,21 +1,19 @@ package com.bartek.esa.core.archetype; -import com.bartek.esa.error.EsaException; +import com.bartek.esa.core.xml.XmlHelper; import com.bartek.esa.file.matcher.GlobMatcher; -import io.vavr.control.Try; import org.w3c.dom.Document; import javax.xml.namespace.QName; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.xpath.XPathFactory; import java.io.File; public abstract class XmlPlugin extends BasePlugin { private final GlobMatcher globMatcher; + private final XmlHelper xmlHelper; - public XmlPlugin(GlobMatcher globMatcher) { + public XmlPlugin(GlobMatcher globMatcher, XmlHelper xmlHelper) { this.globMatcher = globMatcher; + this.xmlHelper = xmlHelper; } @Override @@ -25,16 +23,13 @@ public abstract class XmlPlugin extends BasePlugin { @Override protected void run(File file) { - DocumentBuilderFactory factory = DocumentBuilderFactory.newDefaultInstance(); - DocumentBuilder builder = Try.of(factory::newDocumentBuilder).getOrElseThrow(EsaException::new); - Document document = Try.of(() -> builder.parse(file)).getOrElseThrow(EsaException::new); - run(document); + Document xml = xmlHelper.parseXml(file); + run(xml); } protected abstract void run(Document xml); protected Object xPath(Document xml, String expression, QName returnType) { - return Try.of(() -> XPathFactory.newDefaultInstance().newXPath().evaluate(expression, xml, returnType)) - .getOrElseThrow(EsaException::new); + return xmlHelper.xPath(xml, expression, returnType); } } diff --git a/src/main/java/com/bartek/esa/core/di/CoreModule.java b/src/main/java/com/bartek/esa/core/di/CoreModule.java index 29c133b..59d666d 100644 --- a/src/main/java/com/bartek/esa/core/di/CoreModule.java +++ b/src/main/java/com/bartek/esa/core/di/CoreModule.java @@ -3,6 +3,7 @@ package com.bartek.esa.core.di; import com.bartek.esa.core.desc.provider.DescriptionProvider; import com.bartek.esa.core.executor.PluginExecutor; import com.bartek.esa.core.java.JavaSyntaxRegexProvider; +import com.bartek.esa.core.xml.XmlHelper; import dagger.Module; import dagger.Provides; @@ -10,8 +11,8 @@ import dagger.Provides; public class CoreModule { @Provides - public PluginExecutor pluginExecutor() { - return new PluginExecutor(); + public PluginExecutor pluginExecutor(XmlHelper xmlHelper) { + return new PluginExecutor(xmlHelper); } @Provides @@ -23,4 +24,9 @@ public class CoreModule { public DescriptionProvider descriptionProvider() { return new DescriptionProvider(); } + + @Provides + public XmlHelper xmlHelper() { + return new XmlHelper(); + } } 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 5b363fa..e114489 100644 --- a/src/main/java/com/bartek/esa/core/executor/PluginExecutor.java +++ b/src/main/java/com/bartek/esa/core/executor/PluginExecutor.java @@ -2,6 +2,8 @@ package com.bartek.esa.core.executor; import com.bartek.esa.core.archetype.Plugin; import com.bartek.esa.core.model.object.Issue; +import com.bartek.esa.core.xml.XmlHelper; +import org.w3c.dom.Document; import javax.inject.Inject; import java.io.File; @@ -10,24 +12,26 @@ import java.util.List; import static java.util.stream.Collectors.toList; public class PluginExecutor { + private final XmlHelper xmlHelper; @Inject - public PluginExecutor() { - + public PluginExecutor(XmlHelper xmlHelper) { + this.xmlHelper = xmlHelper; } - public List executeForFiles(List files, List plugins) { + public List executeForFiles(File manifest, List files, List plugins) { return files.stream() - .map(file -> executeForFile(file, plugins)) + .map(file -> executeForFile(manifest, file, plugins)) .flatMap(List::stream) .collect(toList()); } - private List executeForFile(File file, List plugins) { + private List executeForFile(File manifest, File file, List plugins) { + Document xmlManifest = xmlHelper.parseXml(manifest); return plugins.stream() .filter(plugin -> plugin.supports(file)) .map(plugin -> { - plugin.update(file); + plugin.update(file, xmlManifest); return plugin.runForIssues(); }) .flatMap(List::stream) diff --git a/src/main/java/com/bartek/esa/core/xml/XmlHelper.java b/src/main/java/com/bartek/esa/core/xml/XmlHelper.java new file mode 100644 index 0000000..7a9ceee --- /dev/null +++ b/src/main/java/com/bartek/esa/core/xml/XmlHelper.java @@ -0,0 +1,31 @@ +package com.bartek.esa.core.xml; + +import com.bartek.esa.error.EsaException; +import io.vavr.control.Try; +import org.w3c.dom.Document; + +import javax.inject.Inject; +import javax.xml.namespace.QName; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.xpath.XPathFactory; +import java.io.File; + +public class XmlHelper { + + @Inject + public XmlHelper() { + + } + + public Document parseXml(File file) { + DocumentBuilderFactory factory = DocumentBuilderFactory.newDefaultInstance(); + DocumentBuilder builder = Try.of(factory::newDocumentBuilder).getOrElseThrow(EsaException::new); + return Try.of(() -> builder.parse(file)).getOrElseThrow(EsaException::new); + } + + public Object xPath(Document xml, String expression, QName returnType) { + return Try.of(() -> XPathFactory.newDefaultInstance().newXPath().evaluate(expression, xml, returnType)) + .getOrElseThrow(EsaException::new); + } +}