Skip to content

Commit d9aeae2

Browse files
gselzerctrueden
authored andcommitted
Abstract basic EnforcerRule functionality
This makes it much easier to write new rules
1 parent 0f9cf80 commit d9aeae2

File tree

4 files changed

+151
-173
lines changed

4 files changed

+151
-173
lines changed
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
2+
package org.scijava.packages.plugin;
3+
4+
import java.io.File;
5+
import java.io.IOException;
6+
import java.util.ArrayList;
7+
import java.util.List;
8+
9+
import org.apache.maven.enforcer.rule.api.EnforcerRule;
10+
import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
11+
import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
12+
import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
13+
14+
import jdepend.framework.JDepend;
15+
import jdepend.framework.PackageFilter;
16+
17+
/**
18+
* Common functionality for writing an {@link EnforcerRule} dealing with the
19+
* package hierarchy.
20+
*
21+
* @author Ben Romberg
22+
* @author David Burkhart
23+
* @author Gabriel Selzer
24+
*/
25+
public abstract class AbstractPackageEnforcementRule implements EnforcerRule {
26+
27+
private List<String> excludedPackages = new ArrayList<>();
28+
private List<String> includedPackages = new ArrayList<>();
29+
private boolean includeTests = true;
30+
31+
@Override
32+
public void execute(EnforcerRuleHelper helper) throws EnforcerRuleException {
33+
try {
34+
executePackageCycleCheckIfNecessary(helper);
35+
}
36+
catch (ExpressionEvaluationException e) {
37+
throw new EnforcerRuleException("Unable to lookup an expression " + e
38+
.getLocalizedMessage(), e);
39+
}
40+
catch (IOException e) {
41+
throw new EnforcerRuleException("Unable to access target directory " + e
42+
.getLocalizedMessage(), e);
43+
}
44+
}
45+
46+
@Override
47+
public String getCacheId() {
48+
return "";
49+
}
50+
51+
@Override
52+
public boolean isCacheable() {
53+
return false;
54+
}
55+
56+
@Override
57+
public boolean isResultValid(EnforcerRule arg0) {
58+
return false;
59+
}
60+
61+
public void setExcludedPackages(List<String> excludedPackages) {
62+
this.excludedPackages = excludedPackages;
63+
}
64+
65+
public void setIncludedPackages(List<String> includedPackages) {
66+
this.includedPackages = includedPackages;
67+
}
68+
69+
public void setIncludeTests(boolean includeTests) {
70+
this.includeTests = includeTests;
71+
}
72+
73+
private void executePackageCheck(EnforcerRuleHelper helper,
74+
Iterable<File> directories) throws IOException, EnforcerRuleException
75+
{
76+
JDepend jdepend = createJDepend(helper);
77+
for (File directory : directories) {
78+
jdepend.addDirectory(directory.getAbsolutePath());
79+
}
80+
jdepend.analyze();
81+
82+
enforceRule(jdepend);
83+
}
84+
85+
private void executePackageCycleCheckIfNecessary(EnforcerRuleHelper helper)
86+
throws ExpressionEvaluationException, IOException, EnforcerRuleException
87+
{
88+
DirectoriesWithClasses directories = new DirectoriesWithClasses(helper,
89+
"package cycles", includeTests);
90+
if (directories.directoriesWithClassesFound()) {
91+
executePackageCheck(helper, directories);
92+
}
93+
else {
94+
helper.getLog().info(
95+
"No directories with classes to check for cycles found.");
96+
}
97+
}
98+
99+
protected JDepend createJDepend(EnforcerRuleHelper helper) {
100+
if (!includedPackages.isEmpty()) {
101+
helper.getLog().warn(
102+
"Package cycles rule check is restricted to check only these packages: " +
103+
includedPackages);
104+
}
105+
if (!excludedPackages.isEmpty()) {
106+
helper.getLog().warn(
107+
"These packages were excluded from package cycle rule check: " +
108+
excludedPackages);
109+
}
110+
return new JDepend(PackageFilter.all().including(includedPackages)
111+
.excluding(excludedPackages));
112+
}
113+
114+
/**
115+
* Enforces the rule
116+
*
117+
* @param jdepend a {@link JDepend} containing relevant package information
118+
* @throws EnforcerRuleException iff the rule is invalid for the packages
119+
* described by {@code jdepend}
120+
*/
121+
abstract void enforceRule(JDepend jdepend) throws EnforcerRuleException;
122+
123+
}
Lines changed: 17 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -1,96 +1,32 @@
1+
12
package org.scijava.packages.plugin;
23

3-
import java.io.File;
4-
import java.io.IOException;
54
import java.util.ArrayList;
65
import java.util.Collection;
7-
import java.util.List;
86

9-
import jdepend.framework.JDepend;
10-
import jdepend.framework.JavaPackage;
11-
import jdepend.framework.PackageFilter;
12-
13-
import org.apache.maven.enforcer.rule.api.EnforcerRule;
147
import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
15-
import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
16-
import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
17-
18-
public class NoPackageCyclesRule implements EnforcerRule {
19-
20-
private boolean includeTests = true;
21-
private List<String> includedPackages = new ArrayList<>();
22-
private List<String> excludedPackages = new ArrayList<>();
23-
24-
public void execute(EnforcerRuleHelper helper) throws EnforcerRuleException {
25-
try {
26-
executePackageCycleCheckIfNecessary(helper);
27-
} catch (ExpressionEvaluationException e) {
28-
throw new EnforcerRuleException("Unable to lookup an expression " + e.getLocalizedMessage(), e);
29-
} catch (IOException e) {
30-
throw new EnforcerRuleException("Unable to access target directory " + e.getLocalizedMessage(), e);
31-
}
32-
}
338

34-
private void executePackageCycleCheckIfNecessary(EnforcerRuleHelper helper)
35-
throws ExpressionEvaluationException, IOException, EnforcerRuleException {
36-
DirectoriesWithClasses directories = new DirectoriesWithClasses(helper, "package cycles", includeTests);
37-
if (directories.directoriesWithClassesFound()) {
38-
executePackageCycleCheck(helper, directories);
39-
} else {
40-
helper.getLog().info("No directories with classes to check for cycles found.");
41-
}
42-
}
43-
44-
private void executePackageCycleCheck(EnforcerRuleHelper helper, Iterable<File> directories) throws IOException, EnforcerRuleException {
45-
JDepend jdepend = createJDepend(helper);
46-
for (File directory : directories) {
47-
jdepend.addDirectory(directory.getAbsolutePath());
48-
}
49-
jdepend.analyze();
50-
if (jdepend.containsCycles()) {
51-
throw new EnforcerRuleException("There are package cycles:" + getPackageCycles(jdepend));
52-
}
53-
}
9+
import jdepend.framework.JDepend;
10+
import jdepend.framework.JavaPackage;
5411

55-
protected JDepend createJDepend(EnforcerRuleHelper helper) {
56-
if (!includedPackages.isEmpty()) {
57-
helper.getLog().warn("Package cycles rule check is restricted to check only these packages: " + includedPackages);
58-
}
59-
if (!excludedPackages.isEmpty()) {
60-
helper.getLog().warn("These packages were excluded from package cycle rule check: " + excludedPackages);
61-
}
62-
return new JDepend(PackageFilter.all()
63-
.including(includedPackages)
64-
.excluding(excludedPackages));
65-
}
12+
/**
13+
* Detects the presence of cycles in the package hierarchy.
14+
*
15+
* @author Gabriel Selzer
16+
*/
17+
public class NoPackageCyclesRule extends AbstractPackageEnforcementRule {
6618

6719
private String getPackageCycles(JDepend jdepend) {
6820
Collection<JavaPackage> packages = jdepend.getPackages();
69-
return new PackageCycleOutput(new ArrayList<JavaPackage>(packages)).getOutput();
70-
}
71-
72-
public String getCacheId() {
73-
return "";
74-
}
75-
76-
public boolean isCacheable() {
77-
return false;
21+
return new PackageCycleOutput(new ArrayList<>(packages)).getOutput();
7822
}
7923

80-
public boolean isResultValid(EnforcerRule arg0) {
81-
return false;
82-
}
83-
84-
public void setIncludeTests(boolean includeTests) {
85-
this.includeTests = includeTests;
86-
}
87-
88-
public void setIncludedPackages(List<String> includedPackages) {
89-
this.includedPackages = includedPackages;
90-
}
91-
92-
public void setExcludedPackages(List<String> excludedPackages) {
93-
this.excludedPackages = excludedPackages;
24+
@Override
25+
void enforceRule(JDepend jdepend) throws EnforcerRuleException {
26+
if (jdepend.containsCycles()) {
27+
throw new EnforcerRuleException("There are package cycles:" +
28+
getPackageCycles(jdepend));
29+
}
9430
}
9531

96-
}
32+
}
Lines changed: 10 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1+
12
package org.scijava.packages.plugin;
23

3-
import java.io.File;
4-
import java.io.IOException;
54
import java.util.ArrayList;
65
import java.util.Collection;
76
import java.util.HashMap;
@@ -10,66 +9,34 @@
109
import java.util.Map.Entry;
1110
import java.util.stream.Collectors;
1211

13-
import org.apache.maven.enforcer.rule.api.EnforcerRule;
1412
import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
15-
import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
16-
import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
1713

1814
import jdepend.framework.JDepend;
1915
import jdepend.framework.JavaPackage;
20-
import jdepend.framework.PackageFilter;
21-
22-
public class NoSubpackageDependenceRule implements EnforcerRule {
2316

24-
private boolean includeTests = true;
25-
private List<String> includedPackages = new ArrayList<>();
26-
private List<String> excludedPackages = new ArrayList<>();
17+
public class NoSubpackageDependenceRule extends AbstractPackageEnforcementRule {
2718

2819
@Override
29-
public void execute(EnforcerRuleHelper helper) throws EnforcerRuleException {
30-
try {
31-
executeSubpackageDependenceCheckIfNecessary(helper);
32-
} catch (ExpressionEvaluationException e) {
33-
throw new EnforcerRuleException("Unable to lookup an expression " + e.getLocalizedMessage(), e);
34-
} catch (IOException e) {
35-
throw new EnforcerRuleException("Unable to access target directory " + e.getLocalizedMessage(), e);
36-
}
37-
}
38-
39-
private void executeSubpackageDependenceCheckIfNecessary(EnforcerRuleHelper helper)
40-
throws ExpressionEvaluationException, IOException, EnforcerRuleException {
41-
DirectoriesWithClasses directories = new DirectoriesWithClasses(helper, "subpackage dependence", includeTests);
42-
if (directories.directoriesWithClassesFound()) {
43-
executeSubpackageDependenceCheck(helper, directories);
44-
} else {
45-
helper.getLog().info("No directories with classes to check for subpackage dependence found.");
46-
}
47-
}
48-
49-
private void executeSubpackageDependenceCheck(EnforcerRuleHelper helper, Iterable<File> directories) throws IOException, EnforcerRuleException {
50-
JDepend jdepend = createJDepend(helper);
51-
for (File directory : directories) {
52-
jdepend.addDirectory(directory.getAbsolutePath());
53-
}
54-
jdepend.analyze();
55-
20+
void enforceRule(JDepend jdepend) throws EnforcerRuleException {
5621
Map<JavaPackage, List<JavaPackage>> subpackageLists = new HashMap<>();
5722
for (JavaPackage p : jdepend.getPackages()) {
58-
// create running List of subpackages, evaluate all previously added to the Map
23+
// create running List of subpackages, evaluate all previously added to
24+
// the Map
5925
List<JavaPackage> subpackages = new ArrayList<>();
6026
for (JavaPackage other : subpackageLists.keySet()) {
6127
String dString = p.getName();
6228
String oString = other.getName();
6329
if (dString == oString) continue;
64-
if (dString.contains(oString)) subpackageLists.get(other).add(p);
65-
if (oString.contains(dString)) subpackages.add(other);
30+
if (dString.startsWith(oString)) subpackageLists.get(other).add(p);
31+
if (oString.startsWith(dString)) subpackages.add(other);
6632
}
6733
subpackageLists.put(p, subpackages);
6834
}
6935
Map<JavaPackage, List<JavaPackage>> subpackageDependence = new HashMap<>();
7036
for (Entry<JavaPackage, List<JavaPackage>> e : subpackageLists.entrySet()) {
7137
Collection<JavaPackage> efferents = e.getKey().getEfferents();
72-
List<JavaPackage> subpackagesDependedUpon = efferents.stream().filter(e.getValue()::contains).collect(Collectors.toList());
38+
List<JavaPackage> subpackagesDependedUpon = efferents.stream().filter(e
39+
.getValue()::contains).collect(Collectors.toList());
7340
subpackageDependence.put(e.getKey(), subpackagesDependedUpon);
7441
}
7542
for (List<JavaPackage> l : subpackageDependence.values()) {
@@ -80,46 +47,4 @@ private void executeSubpackageDependenceCheck(EnforcerRuleHelper helper, Iterabl
8047
}
8148
}
8249

83-
protected JDepend createJDepend(EnforcerRuleHelper helper) {
84-
if (!includedPackages.isEmpty()) {
85-
helper.getLog().warn("Subpackage dependence rule check is restricted to check only these packages: " + includedPackages);
86-
}
87-
if (!excludedPackages.isEmpty()) {
88-
helper.getLog().warn("These packages were excluded from subpackage dependence rule check: " + excludedPackages);
89-
}
90-
return new JDepend(PackageFilter.all()
91-
.including(includedPackages)
92-
.excluding(excludedPackages));
93-
}
94-
95-
public void setIncludeTests(boolean includeTests) {
96-
this.includeTests = includeTests;
97-
}
98-
99-
public void setIncludedPackages(List<String> includedPackages) {
100-
this.includedPackages = includedPackages;
101-
}
102-
103-
public void setExcludedPackages(List<String> excludedPackages) {
104-
this.excludedPackages = excludedPackages;
105-
}
106-
107-
@Override
108-
public boolean isCacheable() {
109-
// TODO Auto-generated method stub
110-
return false;
111-
}
112-
113-
@Override
114-
public boolean isResultValid(EnforcerRule cachedRule) {
115-
// TODO Auto-generated method stub
116-
return false;
117-
}
118-
119-
@Override
120-
public String getCacheId() {
121-
// TODO Auto-generated method stub
122-
return null;
123-
}
124-
125-
}
50+
}

src/test/resources/fitnesse-expected-output-subpackage-dependence.txt

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,4 @@ Package fitnesse.wiki depends on subpackages:
6161

6262
Package fitnesse.wikitext depends on subpackages:
6363
fitnesse.wikitext.parser (PerformanceTest)
64-
fitnesse.wikitext.test (PerformanceTest)
65-
66-
Package util depends on subpackages:
67-
fitnesse.testutil (TemplateUtilTest)
68-
java.util (Clock, ClockTest, CommandLine, DateAlteringClock, DateAlteringClockTest, DateTimeUtil, FileUtil, FormattedExpression, ListUtility, MemoryFileSystem, Option, StringUtil, SystemTimeKeeper, TemplateUtil, TemplateUtilTest, TestTimeKeeper, TimeKeeper, TimeMeasurement, TimeMeasurementTest, WildcardTest)
69-
java.util.concurrent (CommandLine)
70-
java.util.regex (CommandLine, EnvironmentVariableTool, FormattedExpression, GracefulNamer, RegexTestCase)
64+
fitnesse.wikitext.test (PerformanceTest)

0 commit comments

Comments
 (0)