+
+ /**
+ * Create nodes from the list of models and their dependencies.
+ *
+ * @param models what the nodes creation is based upon
+ * @return Collection of Node objects
+ */
+ private Collection<Node> createNodes(Collection<Artifact> models) {
+
+ // load list of models into a map, so we can later replace referenceIds with real Models
+ Map<String, AbstractModelArtifact> versionIdToModelMap = new HashMap<>();
+ for (Artifact art : models) {
+ AbstractModelArtifact ma = (AbstractModelArtifact) art;
+ versionIdToModelMap.put(ma.getUniqueIdentifier(), ma);
+ }
+
+ Map<String, Node> nodes = new HashMap<>();
+ // create a node for each model and its referenced models
+ for (Artifact art : models) {
+
+ AbstractModelArtifact model = (AbstractModelArtifact) art;
+
+ // node might have been created by another model referencing it
+ Node node = nodes.get(model.getUniqueIdentifier());
+
+ if (null == node) {
+ node = new Node(model);
+ nodes.put(model.getUniqueIdentifier(), node);
+ }
+
+ for (String referencedModelId : model.getDependentModelIds()) {
+ // node might have been created by another model referencing it
+ Node referencedNode = nodes.get(referencedModelId);
+
+ if (null == referencedNode) {
+ // create node
+ AbstractModelArtifact referencedModel = versionIdToModelMap.get(referencedModelId);
+ if (referencedModel == null) {
+ logger.debug("ignoring " + referencedModelId);
+ continue; // referenced model not supplied, no need to sort it
+ }
+ referencedNode = new Node(referencedModel);
+ nodes.put(referencedModelId, referencedNode);
+ }
+ referencedNode.addEdge(node);
+ }
+ }
+
+ return nodes.values();