11package io .avaje .inject .generator ;
22
3- import java .util .ArrayList ;
4- import java .util .Collection ;
5- import java .util .HashMap ;
6- import java .util .Iterator ;
7- import java .util .List ;
8- import java .util .Map ;
9- import java .util .Set ;
10- import java .util .TreeSet ;
3+ import java .util .*;
114
125class MetaDataOrdering {
136
@@ -30,7 +23,8 @@ class MetaDataOrdering {
3023
3124 private final List <DependencyLink > circularDependencies = new ArrayList <>();
3225
33- private final List <String > missingDependencies = new ArrayList <>();
26+ private final Set <String > missingDependencyTypes = new LinkedHashSet <>();
27+ private final List <String > missingDependencyMsg = new ArrayList <>();
3428
3529 private String topPackage ;
3630
@@ -66,7 +60,6 @@ int processQueue() {
6660 int remaining = queue .size ();
6761 if (remaining != 0 ) {
6862 missingDependencies ();
69- detectCircularDependency (queue );
7063 orderedList .addAll (queue );
7164 }
7265 return remaining ;
@@ -77,17 +70,22 @@ int processQueue() {
7770 * in the queue with unsatisfied dependencies.
7871 */
7972 private void detectCircularDependency (List <MetaData > remainder ) {
73+ final List <DependencyLink > dependencyLinks = new ArrayList <>();
8074 for (MetaData metaData : remainder ) {
8175 final List <String > dependsOn = metaData .getDependsOn ();
8276 if (dependsOn != null ) {
8377 for (String dependency : dependsOn ) {
8478 final MetaData provider = findCircularDependency (remainder , dependency );
8579 if (provider != null ) {
86- circularDependencies .add (new DependencyLink (metaData , provider , dependency ));
80+ dependencyLinks .add (new DependencyLink (metaData , provider , dependency ));
8781 }
8882 }
8983 }
9084 }
85+ if (dependencyLinks .size () > 1 ) {
86+ // need minimum of 2 to form circular dependency
87+ circularDependencies .addAll (dependencyLinks );
88+ }
9189 }
9290
9391 private MetaData findCircularDependency (List <MetaData > remainder , String dependency ) {
@@ -106,14 +104,10 @@ private MetaData findCircularDependency(List<MetaData> remainder, String depende
106104 /**
107105 * Log a reasonable compile error for detected circular dependencies.
108106 */
109- void errorOnCircularDependencies () {
110- if (!missingDependencies .isEmpty ()) {
111- context .logError ("Unsatisfied dependencies %s %s" , missingDependencies , UNSAT_ERR_MSG );
112- } else {
113- context .logError ("Circular dependencies detected with beans %s %s" , circularDependencies , CIRC_ERR_MSG );
114- for (DependencyLink link : circularDependencies ) {
115- context .logError ("Circular dependency - %s dependsOn %s for %s" , link .metaData , link .provider , link .dependency );
116- }
107+ private void errorOnCircularDependencies () {
108+ context .logError ("Circular dependencies detected with beans %s %s" , circularDependencies , CIRC_ERR_MSG );
109+ for (DependencyLink link : circularDependencies ) {
110+ context .logError ("Circular dependency - %s dependsOn %s for %s" , link .metaData , link .provider , link .dependency );
117111 }
118112 }
119113
@@ -124,19 +118,39 @@ void missingDependencies() {
124118 for (MetaData m : queue ) {
125119 for (String dependency : m .getDependsOn ()) {
126120 if (providers .get (dependency ) == null ) {
127- missingDependencies .add (dependency + " dependency missing for " + m );
121+ missingDependencyTypes .add (dependency );
122+ missingDependencyMsg .add (dependency + " dependency missing for " + m );
128123 }
129124 }
130125 }
126+ if (missingDependencyTypes .isEmpty ()) {
127+ // only look for circular dependencies if there are no missing dependencies
128+ detectCircularDependency (queue );
129+ }
131130 }
132131
133132 /**
134- * Log a warning on unsatisfied dependencies that are expected to be
135- * provided by another module.
133+ * Log a warning on unsatisfied dependencies that are expected to be provided by another module.
136134 */
137- void warnOnDependencies () {
138- for (MetaData m : queue ) {
139- context .logWarn ("Unsatisfied dependencies on %s dependsOn %s" , m , m .getDependsOn ());
135+ private void warnOnDependencies () {
136+ if (missingDependencyTypes .isEmpty ()) {
137+ context .logWarn ("There are " + queue .size () + " beans with unsatisfied dependencies (assuming external dependencies)" );
138+ for (MetaData m : queue ) {
139+ context .logWarn ("Unsatisfied dependencies on %s dependsOn %s" , m , m .getDependsOn ());
140+ }
141+ } else {
142+ context .logWarn ("Dependencies %s are not provided - missing @Singleton (or external dependencies)" , missingDependencyTypes );
143+ for (String msg : missingDependencyMsg ) {
144+ context .logWarn (msg );
145+ }
146+ }
147+ }
148+
149+ void logWarnings () {
150+ if (hasCircularDependencies ()) {
151+ errorOnCircularDependencies ();
152+ } else {
153+ warnOnDependencies ();
140154 }
141155 }
142156
@@ -198,7 +212,6 @@ Set<String> getImportTypes() {
198212 * Return the MetaData for the bean that provides the (generic interface) dependency.
199213 */
200214 MetaData findProviderOf (String depend ) {
201-
202215 for (MetaData metaData : orderedList ) {
203216 List <String > provides = metaData .getProvides ();
204217 if (provides != null ) {
@@ -216,7 +229,7 @@ MetaData findProviderOf(String depend) {
216229 * Return true if the beans with unsatisfied dependencies seem
217230 * to form a circular dependency.
218231 */
219- boolean hasCircularDependencies () {
232+ private boolean hasCircularDependencies () {
220233 return !circularDependencies .isEmpty ();
221234 }
222235
0 commit comments