1818
1919import org .apache .commons .collections4 .MultiValuedMap ;
2020import org .apache .commons .collections4 .multimap .ArrayListValuedHashMap ;
21- import org .apache .logging .log4j .LogManager ;
2221import org .apache .logging .log4j .Logger ;
22+ import org .graphper .api .GraphResource ;
23+ import org .graphper .api .Graphviz ;
24+ import org .graphper .parser .DotParser ;
2325import org .junit .Assert ;
2426import org .junit .Test ;
2527import org .labkey .api .collections .CaseInsensitiveHashSet ;
26- import org .labkey .api .util .DotRunner ;
2728import org .labkey .api .util .FileUtil ;
2829import org .labkey .api .util .Pair ;
30+ import org .labkey .api .util .logging .LogHelper ;
2931
3032import java .io .File ;
3133import java .util .ArrayList ;
3436import java .util .stream .Collectors ;
3537
3638/**
37- * Orders modules so that each module will always be after all of the modules it depends on.
38- * User: jeckels
39- * Date: Jun 6, 2006
39+ * Orders modules so that each module will always be after all the modules it depends on.
4040 */
4141public class ModuleDependencySorter
4242{
43+ private static final Logger LOG = LogHelper .getLogger (ModuleDependencySorter .class , "Module dependency information" );
44+
4345 public List <Module > sortModulesByDependencies (List <Module > modules )
4446 {
4547 List <Pair <Module , Set <String >>> dependencies = new ArrayList <>();
@@ -101,7 +103,7 @@ public List<Module> sortModulesByDependencies(List<Module> modules)
101103 if (module .getName ().equalsIgnoreCase ("core" ))
102104 {
103105 result .remove (i );
104- result .add ( 0 , module );
106+ result .addFirst ( module );
105107 break ;
106108 }
107109 }
@@ -128,41 +130,36 @@ private Module findModuleWithoutDependencies(List<Pair<Module, Set<String>>> dep
128130 throw new IllegalArgumentException ("Module '" + moduleName + "' (" + entry .getKey ().getClass ().getName () + ") is listed as being dependent on itself." );
129131 }
130132
131- StringBuilder sb = new StringBuilder ();
132- for (Pair <Module , Set <String >> dependencyInfo : dependencies )
133- {
134- if (!sb .isEmpty ())
135- {
136- sb .append (", " );
137- }
138- sb .append (dependencyInfo .getKey ().getName ());
139- }
133+ String involved = dependencies .stream ()
134+ .map (pair -> pair .getKey ().getName ())
135+ .collect (Collectors .joining (", " ));
140136
141137 // Generate an SVG diagram that shows all remaining dependencies
142138 graphModuleDependencies (dependencies , "involved" );
143139
144- throw new IllegalArgumentException ("Unable to resolve module dependencies. The following modules are somehow involved: " + sb );
140+ throw new IllegalArgumentException ("Unable to resolve module dependencies. The following modules are somehow involved: " + involved );
145141 }
146142
147143
148144 private void graphModuleDependencies (List <Pair <Module , Set <String >>> dependencies , @ SuppressWarnings ("SameParameterValue" ) String adjective )
149145 {
150- Logger log = LogManager .getLogger (ModuleDependencySorter .class );
151-
152146 try
153147 {
154148 File dir = FileUtil .getTempDirectory ();
155149 String dot = buildDigraph (dependencies );
150+ Graphviz graph = DotParser .parse (dot );
156151 File svgFile = FileUtil .createTempFile ("modules" , ".svg" , dir );
157- DotRunner runner = new DotRunner (dir , dot );
158- runner .addSvgOutput (svgFile );
159- runner .execute ();
160152
161- log .info ("For a diagram of " + adjective + " module dependencies, see " + svgFile .getAbsolutePath ());
153+ try (GraphResource resource = graph .toSvg ())
154+ {
155+ resource .save (svgFile .getParent (), svgFile .getName ());
156+ }
157+
158+ LOG .info ("For a diagram of {} module dependencies, see {}" , adjective , svgFile .getAbsolutePath ());
162159 }
163160 catch (Exception e )
164161 {
165- log .error ("Error running dot" , e );
162+ LOG .error ("Error running dot" , e );
166163 }
167164 }
168165
0 commit comments