1+ package org .scijava .packages .plugin ;
2+
3+ import java .io .File ;
4+ import java .io .IOException ;
5+ import java .util .ArrayList ;
6+ import java .util .Collection ;
7+ import java .util .HashMap ;
8+ import java .util .List ;
9+ import java .util .Map ;
10+ import java .util .Map .Entry ;
11+ import java .util .stream .Collectors ;
12+
13+ import org .apache .maven .enforcer .rule .api .EnforcerRule ;
14+ 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+ import jdepend .framework .JDepend ;
19+ import jdepend .framework .JavaPackage ;
20+ import jdepend .framework .PackageFilter ;
21+
22+ public class NoSubpackageDependenceRule implements EnforcerRule {
23+
24+ private boolean includeTests = true ;
25+ private List <String > includedPackages = new ArrayList <>();
26+ private List <String > excludedPackages = new ArrayList <>();
27+
28+ @ 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+
56+ Map <JavaPackage , List <JavaPackage >> subpackageLists = new HashMap <>();
57+ for (JavaPackage p : jdepend .getPackages ()) {
58+ // create running List of subpackages, evaluate all previously added to the Map
59+ List <JavaPackage > subpackages = new ArrayList <>();
60+ for (JavaPackage other : subpackageLists .keySet ()) {
61+ String dString = p .getName ();
62+ String oString = other .getName ();
63+ if (dString == oString ) continue ;
64+ if (dString .contains (oString )) subpackageLists .get (other ).add (p );
65+ if (oString .contains (dString )) subpackages .add (other );
66+ }
67+ subpackageLists .put (p , subpackages );
68+ }
69+ Map <JavaPackage , List <JavaPackage >> subpackageDependence = new HashMap <>();
70+ for (Entry <JavaPackage , List <JavaPackage >> e : subpackageLists .entrySet ()) {
71+ Collection <JavaPackage > efferents = e .getKey ().getEfferents ();
72+ List <JavaPackage > subpackagesDependedUpon = efferents .stream ().filter (e .getValue ()::contains ).collect (Collectors .toList ());
73+ subpackageDependence .put (e .getKey (), subpackagesDependedUpon );
74+ }
75+ for (List <JavaPackage > l : subpackageDependence .values ()) {
76+ if (!l .isEmpty ()) {
77+ throw new EnforcerRuleException ("Some packages depend on subpackages:" +
78+ new SubpackageDependenceOutput (subpackageDependence ).getOutput ());
79+ }
80+ }
81+ }
82+
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+ }
0 commit comments