- //\r
- // otherwise, we put it back into the stack to check it later\r
- // to see if it consumes "lib2" or not. If the library instance\r
- // consumed by "lib1" consumes "lib2", we can also say that "lib1"\r
- // consumes "lib2"\r
- // \r
- if (consumedLib != null && !stack.contains(consumedLib)) {\r
- stack.offer(consumedLib);\r
- } else if (consumedLib == lib1) {\r
- //\r
- // found circular consume, do nothing now but just print\r
- // out message for debugging\r
- // \r
- String msg = "!!! Library consumes circularly: ";\r
- for (int k = 0; k < j; k++) {\r
- msg += stack.get(k).getName() + "->";\r
+ }\r
+\r
+ boolean circularlyConsumed = false;\r
+ while (noConsumerList.size() == 0 && !circularlyConsumed) {\r
+ circularlyConsumed = true;\r
+ for (int i = 0; i < libInstanceList.length; ++i) {\r
+ ModuleIdentification libInstance = libInstanceList[i];\r
+ if (!libInstance.hasConstructor()) {\r
+ continue;\r
+ }\r
+\r
+ HashSet<ModuleIdentification> consumedBy = libInstanceConsumedBy.get(libInstance);\r
+ if (consumedBy.size() == 0) {\r
+ continue;\r
+ }\r
+\r
+ ModuleIdentification[] consumedByList = consumedBy.toArray(new ModuleIdentification[consumedBy.size()]);\r
+ for (int j = 0; j < consumedByList.length; ++j) {\r
+ ModuleIdentification consumer = consumedByList[j];\r
+ if (consumer.hasConstructor()) {\r
+ continue;\r
+ }\r
+\r
+ //\r
+ // if there's no constructor in the library instance's consumer,\r
+ // remove it from the consumer list\r
+ //\r
+ consumedBy.remove(consumer);\r
+ circularlyConsumed = false;\r
+ if (consumedBy.size() == 0) {\r
+ noConsumerList.addLast(libInstance);\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (noConsumerList.size() > 0) {\r
+ break;\r