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] 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; }