use of org.jgrapht.Graph in project waltz by khartec.
the class ShortestPath method main.
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(DIConfiguration.class);
LogicalFlowDao logicalFlowDao = ctx.getBean(LogicalFlowDao.class);
ApplicationDao applicationDao = ctx.getBean(ApplicationDao.class);
List<LogicalFlow> allActive = logicalFlowDao.findAllActive();
Graph<EntityReference, DefaultEdge> g = createGraph(allActive);
Application targetApp = findFirstMatchByCode(applicationDao, targetAssetCode);
Stream.of(sourceAssetCodes).map(assetCode -> findFirstMatchByCode(applicationDao, assetCode)).filter(Objects::nonNull).map(sourceApp -> {
System.out.printf("Route from: %s (%s)\n----------------------\n", sourceApp.name(), ExternalIdValue.orElse(sourceApp.assetCode(), ""));
return sourceApp.entityReference();
}).filter(sourceRef -> {
if (!g.containsVertex(sourceRef)) {
System.out.println("No flows defined for application\n\n");
return false;
}
return true;
}).map(sourceRef -> findShortestPath(g, sourceRef, targetApp.entityReference())).filter(route -> {
if (route == null) {
System.out.println("No route found\n\n");
return false;
}
return true;
}).forEach(route -> {
List<DefaultEdge> edgeList = route.getEdgeList();
Set<Long> appIds = edgeList.stream().flatMap(e -> Stream.of(g.getEdgeSource(e).id(), g.getEdgeTarget(e).id())).collect(toSet());
Map<Long, Application> appsById = MapUtilities.indexBy(a -> a.id().get(), applicationDao.findByIds(appIds));
edgeList.forEach(edge -> {
Application source = appsById.get(g.getEdgeSource(edge).id());
Application target = appsById.get(g.getEdgeTarget(edge).id());
System.out.printf("%s (%s) -> %s (%s) \n", source.name(), ExternalIdValue.orElse(source.assetCode(), ""), target.name(), ExternalIdValue.orElse(target.assetCode(), ""));
});
System.out.println();
System.out.println();
});
}
Aggregations