From ebbc89b9c189b739541a6fbe794892e4433b5bce Mon Sep 17 00:00:00 2001 From: Gunnar Morling Date: Sun, 20 Jan 2019 20:39:57 +0100 Subject: [PATCH] #28 wip --- .../main/resources/META-INF/deptective.json | 18 +++++---- .../internal/export/JsonSerializer.java | 14 +++++-- .../handler/PackageReferenceCollector.java | 2 +- .../deptective/internal/model/Component.java | 8 +++- .../internal/model/ConfigParser.java | 39 +++++++++++++------ .../internal/model/PackageDependencies.java | 5 +++ .../deptective/config/ConfigParsingTest.java | 31 +++++++++------ .../plugintest/analyze/AnalyzeTest.java | 14 ++++--- .../AnalyzeWhitelistAllExternalTest.java | 6 ++- .../plugintest/basic/deptective.json | 24 ++++++++---- .../plugintest/javac/deptective.json | 2 +- .../unconfiguredpackage/deptective.json | 2 +- .../plugintest/visualize/deptective.json | 4 +- .../plugintest/whitelist/deptective.json | 8 ++-- 14 files changed, 121 insertions(+), 56 deletions(-) diff --git a/integration-test/src/main/resources/META-INF/deptective.json b/integration-test/src/main/resources/META-INF/deptective.json index b1b868f..0344052 100644 --- a/integration-test/src/main/resources/META-INF/deptective.json +++ b/integration-test/src/main/resources/META-INF/deptective.json @@ -1,20 +1,24 @@ { - "packages" : [ + "components" : [ { - "name" : "com.example.ui", + "name" : "ui", + "contains" : [ "com.example.ui" ], "reads" : [ - "com.example.persistence", - "com.example.service" + "persistence", + "service" ] }, { - "name" : "com.example.persistence" + "name" : "persistence", + "contains" : [ "com.example.persistence" ] }, { - "name" : "com.example.service" + "name" : "service", + "contains" : [ "com.example.service" ] }, { - "name" : "com.example.rest" + "name" : "rest", + "contains" : [ "com.example.rest" ] } ], "whitelisted" : [ diff --git a/javac-plugin/src/main/java/org/moditect/deptective/internal/export/JsonSerializer.java b/javac-plugin/src/main/java/org/moditect/deptective/internal/export/JsonSerializer.java index 785ab93..b9a3c10 100644 --- a/javac-plugin/src/main/java/org/moditect/deptective/internal/export/JsonSerializer.java +++ b/javac-plugin/src/main/java/org/moditect/deptective/internal/export/JsonSerializer.java @@ -35,7 +35,7 @@ public class JsonSerializer implements ModelSerializer { private final ObjectMapper mapper; private final ObjectNode root; - private final ArrayNode packages; + private final ArrayNode components; private final ArrayNode whitelisted; public JsonSerializer() { @@ -43,13 +43,13 @@ public JsonSerializer() { mapper.enable(SerializationFeature.INDENT_OUTPUT); root = mapper.createObjectNode(); - packages = root.putArray("packages"); + components = root.putArray("components"); whitelisted = root.putArray("whitelisted"); } @Override public void addComponent(Component component) { - packages.add(toJsonNode(component, mapper)); + components.add(toJsonNode(component, mapper)); } @Override @@ -72,6 +72,14 @@ private JsonNode toJsonNode(Component component, ObjectMapper mapper) { node.put("name", component.getName()); + if (!component.getContained().isEmpty()) { + ArrayNode reads = node.putArray("contains"); + component.getContained() + .stream() + .sorted() + .forEach(r -> reads.add(r.toString())); + } + if (!component.getReads().isEmpty()) { ArrayNode reads = node.putArray("reads"); component.getReads() diff --git a/javac-plugin/src/main/java/org/moditect/deptective/internal/handler/PackageReferenceCollector.java b/javac-plugin/src/main/java/org/moditect/deptective/internal/handler/PackageReferenceCollector.java index 3395314..29e54d6 100644 --- a/javac-plugin/src/main/java/org/moditect/deptective/internal/handler/PackageReferenceCollector.java +++ b/javac-plugin/src/main/java/org/moditect/deptective/internal/handler/PackageReferenceCollector.java @@ -83,7 +83,7 @@ public boolean onEnteringCompilationUnit(CompilationUnitTree tree) { currentPackageName = packageNameTree.toString(); packagesOfCurrentCompilation.add(currentPackageName); - + builder.addContains(currentPackageName, PackagePattern.getPattern(currentPackageName)); return true; } diff --git a/javac-plugin/src/main/java/org/moditect/deptective/internal/model/Component.java b/javac-plugin/src/main/java/org/moditect/deptective/internal/model/Component.java index 2ea1ad0..fe5bcad 100644 --- a/javac-plugin/src/main/java/org/moditect/deptective/internal/model/Component.java +++ b/javac-plugin/src/main/java/org/moditect/deptective/internal/model/Component.java @@ -16,6 +16,7 @@ package org.moditect.deptective.internal.model; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -57,11 +58,16 @@ public Builder addRead(String read, ReadKind readKind) { return this; } - public Builder addContains(List contains) { + public Builder addContains(Collection contains) { contained.addAll(contains); return this; } + public Builder addContains(PackagePattern contains) { + contained.add(contains); + return this; + } + public Component build() { return new Component(name, contained, reads); } diff --git a/javac-plugin/src/main/java/org/moditect/deptective/internal/model/ConfigParser.java b/javac-plugin/src/main/java/org/moditect/deptective/internal/model/ConfigParser.java index fc65840..e9f829b 100644 --- a/javac-plugin/src/main/java/org/moditect/deptective/internal/model/ConfigParser.java +++ b/javac-plugin/src/main/java/org/moditect/deptective/internal/model/ConfigParser.java @@ -18,7 +18,6 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.Iterator; import java.util.List; @@ -71,23 +70,23 @@ public PackageDependencies getPackageDependencies() { private PackageDependencies parseConfig(InputStream config) throws Exception { ObjectMapper objectMapper = new ObjectMapper(); - return parsePackages(objectMapper.readTree(config)); + return parseComponents(objectMapper.readTree(config)); } private PackageDependencies parseConfig(String config) throws Exception { ObjectMapper objectMapper = new ObjectMapper(); - return parsePackages(objectMapper.readTree(config)); + return parseComponents(objectMapper.readTree(config)); } - private PackageDependencies parsePackages(JsonNode config) throws IOException { + private PackageDependencies parseComponents(JsonNode config) throws IOException { PackageDependencies.Builder builder = PackageDependencies.builder(); - ArrayNode packages = (ArrayNode) config.get("packages"); + ArrayNode components = (ArrayNode) config.get("components"); - if (packages != null) { - Iterator it = packages.iterator(); + if (components != null) { + Iterator it = components.iterator(); while (it.hasNext()) { - parsePackage(it.next(), builder); + parseComponent(it.next(), builder); } } @@ -104,11 +103,12 @@ private PackageDependencies parsePackages(JsonNode config) throws IOException { return builder.build(); } - private void parsePackage(JsonNode pakkage, Builder builder) { - String name = pakkage.get("name").asText(); - List reads = parseReads((ArrayNode) (pakkage.get("reads"))); + private void parseComponent(JsonNode component, Builder builder) { + String name = component.get("name").asText(); + List contains = parseContains((ArrayNode) (component.get("contains"))); + List reads = parseReads((ArrayNode) (component.get("reads"))); - builder.addComponent(name, Arrays.asList(PackagePattern.getPattern(name)), reads); + builder.addComponent(name, contains, reads); } private List parseReads(ArrayNode arrayNode) { @@ -125,4 +125,19 @@ private List parseReads(ArrayNode arrayNode) { return packages; } + + private List parseContains(ArrayNode arrayNode) { + if (arrayNode == null) { + return Collections.emptyList(); + } + + Iterator it = arrayNode.iterator(); + List components = new ArrayList<>(); + + while (it.hasNext()) { + components.add(PackagePattern.getPattern(it.next().asText())); + } + + return components; + } } diff --git a/javac-plugin/src/main/java/org/moditect/deptective/internal/model/PackageDependencies.java b/javac-plugin/src/main/java/org/moditect/deptective/internal/model/PackageDependencies.java index bfd26f9..b03ee96 100644 --- a/javac-plugin/src/main/java/org/moditect/deptective/internal/model/PackageDependencies.java +++ b/javac-plugin/src/main/java/org/moditect/deptective/internal/model/PackageDependencies.java @@ -53,6 +53,11 @@ public void addComponent(String name, List contains, List Component.builder(n)); + builder.addContains(contained); + } + public void addRead(String name, String readComponent, ReadKind readKind) { Component.Builder builder = componentsByName.computeIfAbsent(name, n -> Component.builder(n)); builder.addRead(readComponent, readKind); diff --git a/javac-plugin/src/test/java/org/moditect/deptective/config/ConfigParsingTest.java b/javac-plugin/src/test/java/org/moditect/deptective/config/ConfigParsingTest.java index 6f3d3eb..ea28754 100644 --- a/javac-plugin/src/test/java/org/moditect/deptective/config/ConfigParsingTest.java +++ b/javac-plugin/src/test/java/org/moditect/deptective/config/ConfigParsingTest.java @@ -30,19 +30,25 @@ public void shouldLoadConfig() throws Exception { PackageDependencies dependencies = new ConfigParser( lines( "{", - " \"packages\" : [", + " \"components\" : [", " {", - " \"name\" : \"com.example.ui\",", + " \"name\" : \"ui\",", + " \"contains\" : [ \"com.example.ui\" ],", " \"reads\" : [", - " \"com.example.service\",", - " \"com.example.persistence\"", + " \"service\",", + " \"persistence\"", " ]", " },", " {", - " \"name\" : \"com.example.service\",", + " \"name\" : \"service\",", + " \"contains\" : [ \"com.example.service\" ],", " \"reads\" : [", - " \"com.example.persistence\"", + " \"persistence\"", " ]", + " },", + " {", + " \"name\" : \"persistence\",", + " \"contains\" : [ \"com.example.persistence\" ]", " }", " ],", " \"whitelisted\" : [", @@ -56,14 +62,17 @@ public void shouldLoadConfig() throws Exception { Component ui = dependencies.getComponentByPackage("com.example.ui"); assertThat(ui).isNotNull(); - assertThat(ui.allowedToRead(component("com.example.service"))).isTrue(); - assertThat(ui.allowedToRead(component("com.example.persistence"))).isTrue(); + assertThat(ui.getName()).isEqualTo("ui"); + assertThat(ui.containsPackage("com.example.ui")).isTrue(); + assertThat(ui.allowedToRead(component("service"))).isTrue(); + assertThat(ui.allowedToRead(component("persistence"))).isTrue(); Component service = dependencies.getComponentByPackage("com.example.service"); assertThat(service).isNotNull(); - assertThat(service).isNotNull(); - assertThat(service.allowedToRead(component("com.example.ui"))).isFalse(); - assertThat(service.allowedToRead(component("com.example.persistence"))).isTrue(); + assertThat(service.getName()).isEqualTo("service"); + assertThat(service.containsPackage("com.example.service")).isTrue(); + assertThat(service.allowedToRead(component("ui"))).isFalse(); + assertThat(service.allowedToRead(component("persistence"))).isTrue(); assertThat(dependencies.isWhitelisted("java.awt")).isTrue(); assertThat(dependencies.isWhitelisted("java.awt.color")).isTrue(); diff --git a/javac-plugin/src/test/java/org/moditect/deptective/plugintest/analyze/AnalyzeTest.java b/javac-plugin/src/test/java/org/moditect/deptective/plugintest/analyze/AnalyzeTest.java index 3a1ea3e..055d088 100644 --- a/javac-plugin/src/test/java/org/moditect/deptective/plugintest/analyze/AnalyzeTest.java +++ b/javac-plugin/src/test/java/org/moditect/deptective/plugintest/analyze/AnalyzeTest.java @@ -61,17 +61,21 @@ public void shouldGenerateConfig() throws Exception { String expectedConfig = lines( "{", - " \"packages\" : [ {", + " \"components\" : [ {", " \"name\" : \"org.moditect.deptective.plugintest.analyze.bar\",", + " \"contains\" : [ \"org.moditect.deptective.plugintest.analyze.bar\" ],", " \"reads\" : [ \"org.moditect.deptective.plugintest.analyze.qux\" ]", " }, {", " \"name\" : \"org.moditect.deptective.plugintest.analyze.foo\",", + " \"contains\" : [ \"org.moditect.deptective.plugintest.analyze.foo\" ],", " \"reads\" : [", " \"org.moditect.deptective.plugintest.analyze.qux\",", - " \"org.moditect.deptective.plugintest.analyze.bar\" ]\n", - " } ],", - " \"whitelisted\" : [ \"java.math\" ]", - " }]" + " \"org.moditect.deptective.plugintest.analyze.bar\" ]", + " }, {", + " \"name\" : \"org.moditect.deptective.plugintest.analyze.qux\",", + " \"contains\" : [ \"org.moditect.deptective.plugintest.analyze.qux\" ]", + " } ]", + "}" ); Optional deptectiveFile = compilation diff --git a/javac-plugin/src/test/java/org/moditect/deptective/plugintest/analyzewhitelistallexternal/AnalyzeWhitelistAllExternalTest.java b/javac-plugin/src/test/java/org/moditect/deptective/plugintest/analyzewhitelistallexternal/AnalyzeWhitelistAllExternalTest.java index 4890f18..5dd9daa 100644 --- a/javac-plugin/src/test/java/org/moditect/deptective/plugintest/analyzewhitelistallexternal/AnalyzeWhitelistAllExternalTest.java +++ b/javac-plugin/src/test/java/org/moditect/deptective/plugintest/analyzewhitelistallexternal/AnalyzeWhitelistAllExternalTest.java @@ -59,10 +59,12 @@ public void shouldGenerateConfig() throws Exception { String expectedConfig = lines( "{", - " \"packages\" : [ {", - " \"name\" : \"org.moditect.deptective.plugintest.analyzewhitelistallexternal.bar\"", + " \"components\" : [ {", + " \"name\" : \"org.moditect.deptective.plugintest.analyzewhitelistallexternal.bar\",", + " \"contains\" : [ \"org.moditect.deptective.plugintest.analyzewhitelistallexternal.bar\" ]", " }, {", " \"name\" : \"org.moditect.deptective.plugintest.analyzewhitelistallexternal.foo\",", + " \"contains\" : [ \"org.moditect.deptective.plugintest.analyzewhitelistallexternal.foo\" ],", " \"reads\" : [ \"org.moditect.deptective.plugintest.analyzewhitelistallexternal.bar\" ]", " } ],", " \"whitelisted\" : [ \"java.io\", \"java.math\", \"java.net\" ]", diff --git a/javac-plugin/src/test/resources/org/moditect/deptective/plugintest/basic/deptective.json b/javac-plugin/src/test/resources/org/moditect/deptective/plugintest/basic/deptective.json index 684c058..43827ae 100644 --- a/javac-plugin/src/test/resources/org/moditect/deptective/plugintest/basic/deptective.json +++ b/javac-plugin/src/test/resources/org/moditect/deptective/plugintest/basic/deptective.json @@ -1,28 +1,36 @@ { - "packages" : [ + "components" : [ { - "name" : "org.moditect.deptective.plugintest.basic.barctorcall" + "name" : "org.moditect.deptective.plugintest.basic.barctorcall", + "contains" : [ "org.moditect.deptective.plugintest.basic.barctorcall" ] }, { - "name" : "org.moditect.deptective.plugintest.basic.barfield" + "name" : "org.moditect.deptective.plugintest.basic.barfield", + "contains" : [ "org.moditect.deptective.plugintest.basic.barfield" ] }, { - "name" : "org.moditect.deptective.plugintest.basic.barlocalvar" + "name" : "org.moditect.deptective.plugintest.basic.barlocalvar", + "contains" : [ "org.moditect.deptective.plugintest.basic.barlocalvar" ] }, { - "name" : "org.moditect.deptective.plugintest.basic.barloopvar" + "name" : "org.moditect.deptective.plugintest.basic.barloopvar", + "contains" : [ "org.moditect.deptective.plugintest.basic.barloopvar" ] }, { - "name" : "org.moditect.deptective.plugintest.basic.barparameter" + "name" : "org.moditect.deptective.plugintest.basic.barparameter", + "contains" : [ "org.moditect.deptective.plugintest.basic.barparameter" ] }, { - "name" : "org.moditect.deptective.plugintest.basic.barretval" + "name" : "org.moditect.deptective.plugintest.basic.barretval", + "contains" : [ "org.moditect.deptective.plugintest.basic.barretval" ] }, { - "name" : "org.moditect.deptective.plugintest.basic.bartypearg" + "name" : "org.moditect.deptective.plugintest.basic.bartypearg", + "contains" : [ "org.moditect.deptective.plugintest.basic.bartypearg" ] }, { "name" : "org.moditect.deptective.plugintest.basic.foo", + "contains" : [ "org.moditect.deptective.plugintest.basic.foo" ], "reads" : [ "java.util" ] diff --git a/javac-plugin/src/test/resources/org/moditect/deptective/plugintest/javac/deptective.json b/javac-plugin/src/test/resources/org/moditect/deptective/plugintest/javac/deptective.json index 62f2481..6ec3613 100644 --- a/javac-plugin/src/test/resources/org/moditect/deptective/plugintest/javac/deptective.json +++ b/javac-plugin/src/test/resources/org/moditect/deptective/plugintest/javac/deptective.json @@ -1,5 +1,5 @@ { - "packages" : [ + "components" : [ { "name" : "com.example.foo" } diff --git a/javac-plugin/src/test/resources/org/moditect/deptective/plugintest/unconfiguredpackage/deptective.json b/javac-plugin/src/test/resources/org/moditect/deptective/plugintest/unconfiguredpackage/deptective.json index 3411abf..db394a4 100644 --- a/javac-plugin/src/test/resources/org/moditect/deptective/plugintest/unconfiguredpackage/deptective.json +++ b/javac-plugin/src/test/resources/org/moditect/deptective/plugintest/unconfiguredpackage/deptective.json @@ -1,4 +1,4 @@ { - "packages" : [ + "components" : [ ] } diff --git a/javac-plugin/src/test/resources/org/moditect/deptective/plugintest/visualize/deptective.json b/javac-plugin/src/test/resources/org/moditect/deptective/plugintest/visualize/deptective.json index d696f73..1b5380b 100644 --- a/javac-plugin/src/test/resources/org/moditect/deptective/plugintest/visualize/deptective.json +++ b/javac-plugin/src/test/resources/org/moditect/deptective/plugintest/visualize/deptective.json @@ -1,13 +1,15 @@ { - "packages" : [ + "components" : [ { "name" : "org.moditect.deptective.plugintest.visualize.bar", + "contains" : [ "org.moditect.deptective.plugintest.visualize.bar" ], "reads" : [ "org.moditect.deptective.plugintest.visualize.qux" ] }, { "name" : "org.moditect.deptective.plugintest.visualize.foo", + "contains" : [ "org.moditect.deptective.plugintest.visualize.foo" ], "reads" : [ "org.moditect.deptective.plugintest.visualize.qux" ] diff --git a/javac-plugin/src/test/resources/org/moditect/deptective/plugintest/whitelist/deptective.json b/javac-plugin/src/test/resources/org/moditect/deptective/plugintest/whitelist/deptective.json index b774350..bd4fe59 100644 --- a/javac-plugin/src/test/resources/org/moditect/deptective/plugintest/whitelist/deptective.json +++ b/javac-plugin/src/test/resources/org/moditect/deptective/plugintest/whitelist/deptective.json @@ -1,10 +1,12 @@ { - "packages" : [ + "components" : [ { - "name" : "org.moditect.deptective.plugintest.whitelist.foo" + "name" : "org.moditect.deptective.plugintest.whitelist.foo", + "contains" : [ "org.moditect.deptective.plugintest.whitelist.foo" ] }, { - "name" : "org.moditect.deptective.plugintest.whitelist.bar" + "name" : "org.moditect.deptective.plugintest.whitelist.bar", + "contains" : [ "org.moditect.deptective.plugintest.whitelist.bar" ] } ], "whitelisted" : [