1313import jdepend .framework .JavaClass ;
1414import jdepend .framework .JavaPackage ;
1515import de .andrena .tools .nopackagecycles .CollectionOutput .Appender ;
16+ import de .andrena .tools .nopackagecycles .CollectionOutput .StringProvider ;
1617
1718public class PackageCycleOutput {
1819
@@ -28,90 +29,102 @@ public String getOutput() {
2829 orderPackagesByName ();
2930 while (!packages .isEmpty ()) {
3031 JavaPackage javaPackage = packages .get (0 );
31- packages .remove (0 );
32+ packages .remove (javaPackage );
3233 if (javaPackage .containsCycle ()) {
33- appendOutputForPackage (javaPackage );
34+ appendOutputForPackageCycle (javaPackage );
3435 }
3536 }
3637 return output .toString ();
3738 }
3839
40+ private void appendOutputForPackageCycle (JavaPackage javaPackage ) {
41+ List <JavaPackage > cyclicPackages = getCyclicPackages (javaPackage );
42+ packages .removeAll (cyclicPackages );
43+ appendHeaderForPackageCycle (cyclicPackages );
44+ for (JavaPackage cyclicPackage : cyclicPackages ) {
45+ appendOutputForPackage (cyclicPackage , cyclicPackages );
46+ }
47+ }
48+
49+ private void appendHeaderForPackageCycle (List <JavaPackage > cyclicPackages ) {
50+ output .append ("\n \n " ).append ("Package-cycle found involving " );
51+ output .append (joinCollection (cyclicPackages , new StringProvider <JavaPackage >() {
52+
53+ public String provide (JavaPackage javaPackage ) {
54+ return javaPackage .getName ();
55+ }
56+ }, ", " ));
57+ output .append (':' );
58+ }
59+
3960 private void orderPackagesByName () {
4061 List <JavaPackage > packageList = new ArrayList <JavaPackage >(packages );
4162 orderByPackageName (packageList );
4263 packages = packageList ;
4364 }
4465
45- private void appendOutputForPackage (final JavaPackage javaPackage ) {
46- output .append ("\n " ).append (javaPackage .getName ()).append (" has cyclic dependency to: " );
47- joinCollection (getAndPrependCyclicPackages (javaPackage ), output , new Appender <JavaPackage >() {
48- public void append (JavaPackage cyclicPackage ) {
49- appendOutputForCyclicPackage (javaPackage , cyclicPackage );
66+ private void appendOutputForPackage (final JavaPackage javaPackage , List <JavaPackage > cyclicPackages ) {
67+ output .append ("\n " ).append (javaPackage .getName ()).append (" depends on:" );
68+ for (JavaPackage cyclicPackage : cyclicPackages ) {
69+ appendOutputForCyclicPackage (javaPackage , cyclicPackage );
70+ }
71+ }
72+
73+ private void appendOutputForCyclicPackage (final JavaPackage javaPackage , JavaPackage cyclicPackage ) {
74+ if (javaPackage .equals (cyclicPackage )) {
75+ return ;
76+ }
77+ List <JavaClass > dependentClasses = getOrderedDependentClasses (javaPackage , cyclicPackage );
78+ if (!dependentClasses .isEmpty ()) {
79+ appendOutputForDependentCyclicPackage (javaPackage , cyclicPackage , dependentClasses );
80+ }
81+ }
82+
83+ private List <JavaClass > getOrderedDependentClasses (JavaPackage javaPackage , JavaPackage cyclicPackage ) {
84+ List <JavaClass > dependentClasses = new ArrayList <JavaClass >();
85+ @ SuppressWarnings ("unchecked" )
86+ Collection <JavaClass > allClasses = javaPackage .getClasses ();
87+ for (JavaClass javaClass : allClasses ) {
88+ if (javaClass .getImportedPackages ().contains (cyclicPackage )) {
89+ dependentClasses .add (javaClass );
5090 }
51- });
91+ }
92+ orderByClassName (dependentClasses );
93+ return dependentClasses ;
5294 }
5395
54- private void appendOutputForCyclicPackage (JavaPackage javaPackage , JavaPackage cyclicPackage ) {
55- output .append (cyclicPackage .getName ()).append (" (" );
56- appendOutputForCyclicPackageClasses (javaPackage , cyclicPackage );
96+ private void appendOutputForDependentCyclicPackage (JavaPackage javaPackage , JavaPackage cyclicPackage ,
97+ List <JavaClass > dependentClasses ) {
98+ output .append ("\n " ).append (cyclicPackage .getName ()).append (" (" );
99+ appendOutputForCyclicPackageClasses (javaPackage , cyclicPackage , dependentClasses );
57100 output .append (")" );
58101 }
59102
60- private void appendOutputForCyclicPackageClasses (JavaPackage javaPackage , final JavaPackage cyclicPackage ) {
61- joinCollection (getOrderedPackageClasses (javaPackage , cyclicPackage ), output , new Appender <JavaClass >() {
103+ private void appendOutputForCyclicPackageClasses (JavaPackage javaPackage , final JavaPackage cyclicPackage ,
104+ List <JavaClass > dependentClasses ) {
105+ joinCollection (dependentClasses , output , new Appender <JavaClass >() {
62106 public void append (JavaClass packageClass ) {
63107 output .append (packageClass .getName ().substring (cyclicPackage .getName ().length () + 1 ));
64108 }
65- });
109+ }, ", " );
66110 }
67111
68- private Collection <JavaClass > getOrderedPackageClasses (JavaPackage javaPackage , JavaPackage cyclicPackage ) {
69- List <JavaClass > classes = getClassesDependentOnPackage (javaPackage , cyclicPackage );
70- Collections .sort (classes , new Comparator <JavaClass >() {
112+ private void orderByClassName (List <JavaClass > dependentClasses ) {
113+ Collections .sort (dependentClasses , new Comparator <JavaClass >() {
71114 public int compare (JavaClass class1 , JavaClass class2 ) {
72115 return class1 .getName ().compareTo (class2 .getName ());
73116 }
74117 });
75- return classes ;
76- }
77-
78- private List <JavaClass > getClassesDependentOnPackage (JavaPackage javaPackage , JavaPackage cyclicPackage ) {
79- @ SuppressWarnings ("unchecked" )
80- Collection <JavaClass > allClasses = cyclicPackage .getClasses ();
81- List <JavaClass > dependentClasses = new ArrayList <JavaClass >();
82- for (JavaClass clazz : allClasses ) {
83- if (clazz .getImportedPackages ().contains (javaPackage )) {
84- dependentClasses .add (clazz );
85- }
86- }
87- return dependentClasses ;
88118 }
89119
90- private List <JavaPackage > getAndPrependCyclicPackages (JavaPackage javaPackage ) {
120+ private List <JavaPackage > getCyclicPackages (JavaPackage javaPackage ) {
91121 List <JavaPackage > cyclicPackages = new ArrayList <JavaPackage >();
92122 javaPackage .collectAllCycles (cyclicPackages );
93- removeSelfAndDuplications (javaPackage , cyclicPackages );
123+ removeDuplications (javaPackage , cyclicPackages );
94124 orderByPackageName (cyclicPackages );
95- prependPackages (cyclicPackages );
96125 return cyclicPackages ;
97126 }
98127
99- private void prependPackages (List <JavaPackage > cyclicPackages ) {
100- List <JavaPackage > pendingCyclicPackages = getPendingCyclicPackages (cyclicPackages );
101- packages .removeAll (pendingCyclicPackages );
102- packages .addAll (0 , pendingCyclicPackages );
103- }
104-
105- private List <JavaPackage > getPendingCyclicPackages (List <JavaPackage > cyclicPackages ) {
106- List <JavaPackage > pendingCyclicPackages = new ArrayList <JavaPackage >();
107- for (JavaPackage cyclicPackage : cyclicPackages ) {
108- if (packages .contains (cyclicPackage )) {
109- pendingCyclicPackages .add (cyclicPackage );
110- }
111- }
112- return pendingCyclicPackages ;
113- }
114-
115128 private void orderByPackageName (List <JavaPackage > cyclicPackages ) {
116129 Collections .sort (cyclicPackages , new Comparator <JavaPackage >() {
117130 public int compare (JavaPackage package1 , JavaPackage package2 ) {
@@ -120,9 +133,8 @@ public int compare(JavaPackage package1, JavaPackage package2) {
120133 });
121134 }
122135
123- private void removeSelfAndDuplications (JavaPackage javaPackage , List <JavaPackage > cyclicPackages ) {
136+ private void removeDuplications (JavaPackage javaPackage , List <JavaPackage > cyclicPackages ) {
124137 Set <JavaPackage > uniquePackages = new HashSet <JavaPackage >(cyclicPackages );
125- uniquePackages .remove (javaPackage );
126138 cyclicPackages .clear ();
127139 cyclicPackages .addAll (uniquePackages );
128140 }
0 commit comments