private Node getParentNode(Node source) { Set<Dependency> incomingEdges = dependencyGraph.getIncomingEdges(source, DependencyType.CONTAINS); if (!incomingEdges.isEmpty()) { if (incomingEdges.size() > 1) { LOGGER.error("Node {} has more than one parent: {}", source.getName(), incomingEdges); } return incomingEdges.iterator().next().getSource(); } return null; }
private static void tagBaseRelationNumbers(Dependency dependency) { List<Dependency> baseDependencies = dependency.getBaseDependencies(); if (!baseDependencies.isEmpty()) { Set<String> sourceNames = baseDependencies.stream() .map(dep -> dep.getSource().getName()) .collect(Collectors.toSet()); Set<String> targetNames = baseDependencies.stream() .map(dep -> dep.getTarget().getName()) .collect(Collectors.toSet()); dependency.setProperty(Constants.BASE_REL_COUNT, baseDependencies.size()); dependency.setProperty(Constants.BASE_REL_COUNT_SOURCES, sourceNames.size()); dependency.setProperty(Constants.BASE_REL_COUNT_TARGETS, targetNames.size()); } } }
private void mapHierarchy(Dependency dependency) { ArchitectureNode from = (ArchitectureNode) nodeMap.get(dependency.getSource().getName()); AbstractNode to = nodeMap.get(dependency.getTarget().getName()); if (to instanceof ArchitectureNode) { ArchitectureNode child = (ArchitectureNode) to; from.getChildren().add(child); child.setParent(from); } else { ClassNode impl = (ClassNode) to; from.getImplementations().add(impl); impl.getImplementationFor().add(from); } }
private boolean isInSameScope(Dependency edge) { LOGGER.debug("Checking for same namespace access: {}", edge); Node source = edge.getSource(); String scopeName = architecture.getParentComponentName(edge.getTarget().getName()); Node scope = dependencyGraph.getNode(scopeName); if (scope == null) { throw new IllegalStateException("Scope " + scopeName + " has no corresponding node in the dependency graph."); } while (source != null) { if (source == scope) { LOGGER.debug("Same namespace for {}: true", edge); return true; } source = getParentNode(source); } LOGGER.debug("Same namespace for {}: false", edge); return false; }
private void mapReference(Dependency dependency) { ReferencesRelation referencesRelation = new ReferencesRelation(); referencesRelation.setReferenceType(dependency.getDependencyType().name()); referencesRelation.setFrom(nodeMap.get(dependency.getSource().getName())); referencesRelation.setTo(nodeMap.get(dependency.getTarget().getName())); referencesRelation.setLineNo(dependency.getProperty("lineNo", new ArrayList<>())); mapProperties(referencesRelation.getProperties(), dependency.getProperties()); referencesRelation.getProperties().remove("lineNo"); referencesRelation.getFrom().getReferencesRelations().add(referencesRelation); referencesRelations.add(referencesRelation); }
private boolean hasAllowedParentEdge(Dependency edge) { Node source = edge.getSource(); Node target = edge.getTarget(); Node targetParent = getParentNode(target); while (source != null && targetParent != null) { // also check relation to the parent because allowed dependencies are declared on the components, not on the leafs. LOGGER.debug("Checking: {} -> {} and {} -> {}", source.getName(), target.getName(), source.getName(), targetParent.getName()); if (isExplicitlyAllowed(source, target) || isExplicitlyAllowed(source, targetParent)) { return true; } source = getParentNode(source); } return false; }
private static void createArchitectureDependency(DependencyGraph dependencyGraph, String tag, Dependency dep) { Node baseFrom = dep.getSource(); Node baseTo = dep.getTarget(); // if the tag is not set on either of these two, the Node will be null, too, and no dependency will be mapped: Node parentFrom = dependencyGraph.getNode((String) baseFrom.getProperty(tag + Constants.PARENT_SUFFIX)); Node parentTo = dependencyGraph.getNode((String) baseTo.getProperty(tag + Constants.PARENT_SUFFIX)); if (parentFrom != null && parentTo != null && !parentFrom.equals(parentTo)) { Dependency architectureDependency = dependencyGraph.addDependency(parentFrom, parentTo, dep.getDependencyType()); architectureDependency.addBaseDependency(dep); // if there is at least one base dependency which depends on an Impl class, it's marked as DEPENDS_ON_IMPL boolean isImpl = architectureDependency.getProperty(DEPENDS_ON_IMPL, false) || baseTo.getProperty(tag + Constants.IMPL_SUFFIX, false); architectureDependency.setProperty(DEPENDS_ON_IMPL, isImpl); architectureDependency.addListProperty(Constants.TARGET_API, baseTo.getProperty(tag + Constants.PARENT_API_SUFFIX)); } } }
private StringTemplate createEdgeST(Dependency dependency) { noEdges++; StringTemplate edgeST = templates.getInstanceOf(EDGE_ST); edgeST.setAttribute("from", GraphExportStyles.getId(dependency.getSource().getName())); edgeST.setAttribute("to", GraphExportStyles.getId(dependency.getTarget().getName())); edgeST.setAttribute("style", DotExportStyles.getEdgeStyle(dependency)); if (createEdgeLabels) { if (dependency.hasProperty(Constants.BASE_REL_COUNT)) { edgeST.setAttribute(LABEL_ATT, dependency.getProperty(Constants.BASE_REL_COUNT)); } if (dependency.hasProperty(Constants.BASE_REL_COUNT_TARGETS)) { edgeST.setAttribute(HEAD_LABEL_ATT, dependency.getProperty(Constants.BASE_REL_COUNT_TARGETS)); } if (dependency.hasProperty(Constants.BASE_REL_COUNT_SOURCES)) { edgeST.setAttribute(TAIL_LABEL_ATT, dependency.getProperty(Constants.BASE_REL_COUNT_SOURCES)); } } return edgeST; }
private StringTemplate createEdgeST(Dependency dependency) { noEdges++; StringTemplate edgeST = templates.getInstanceOf(EDGE_ST); edgeST.setAttribute("from", GraphExportStyles.getId(dependency.getSource().getName())); edgeST.setAttribute("to", GraphExportStyles.getId(dependency.getTarget().getName())); edgeST.setAttribute("style", getEdgeStyle(dependency)); if (createEdgeLabels) { if (dependency.hasProperty(Constants.BASE_REL_COUNT)) { edgeST.setAttribute(LABEL_ATT, dependency.getProperty(Constants.BASE_REL_COUNT)); } if (dependency.hasProperty(Constants.BASE_REL_COUNT_TARGETS)) { edgeST.setAttribute(HEAD_LABEL_ATT, dependency.getProperty(Constants.BASE_REL_COUNT_TARGETS)); } if (dependency.hasProperty(Constants.BASE_REL_COUNT_SOURCES)) { edgeST.setAttribute(TAIL_LABEL_ATT, dependency.getProperty(Constants.BASE_REL_COUNT_SOURCES)); } } return edgeST; }
private StringTemplate createEdgeST(Dependency dependency) { noEdges++; StringTemplate edgeST = templates.getInstanceOf(EDGE_ST); edgeST.setAttribute("from", GraphExportStyles.getId(dependency.getSource().getName())); edgeST.setAttribute("to", GraphExportStyles.getId(dependency.getTarget().getName())); LineStyle style = GraphExportStyles.getEdgeStyle(dependency); edgeST.setAttribute("color", style.getColor()); edgeST.setAttribute("style", style.getLineStyle()); edgeST.setAttribute("width", style.getWidth()); if (createEdgeLabels) { if (dependency.hasProperty(Constants.BASE_REL_COUNT)) { edgeST.setAttribute(EDGE_LABEL_ATT, createEdgeLabelST(dependency.getProperty(Constants.BASE_REL_COUNT, 0), Position.MIDDLE, style.getColor())); } if (dependency.hasProperty(Constants.BASE_REL_COUNT_TARGETS)) { edgeST.setAttribute(EDGE_LABEL_ATT, createEdgeLabelST(dependency.getProperty(Constants.BASE_REL_COUNT_TARGETS, 0), Position.HEAD, style.getColor())); } if (dependency.hasProperty(Constants.BASE_REL_COUNT_SOURCES)) { edgeST.setAttribute(EDGE_LABEL_ATT, createEdgeLabelST(dependency.getProperty(Constants.BASE_REL_COUNT_SOURCES, 0), Position.TAIL, style.getColor())); } } return edgeST; }
private StringTemplate createEdgeST(Dependency dependency) { noEdges++; StringTemplate edgeST = templates.getInstanceOf(EDGE_ST); edgeST.setAttribute("from", GraphExportStyles.getId(dependency.getSource().getName())); edgeST.setAttribute("to", GraphExportStyles.getId(dependency.getTarget().getName())); LineStyle style = GraphExportStyles.getEdgeStyle(dependency); edgeST.setAttribute("color", style.getColor()); edgeST.setAttribute("style", style.getLineStyle()); edgeST.setAttribute("width", style.getWidth()); if (createEdgeLabels) { if (dependency.hasProperty(Constants.BASE_REL_COUNT)) { edgeST.setAttribute(EDGE_LABEL_ATT, createEdgeLabelST(dependency.getProperty(Constants.BASE_REL_COUNT, 0), Position.MIDDLE, style.getColor())); } if (dependency.hasProperty(Constants.BASE_REL_COUNT_TARGETS)) { edgeST.setAttribute(EDGE_LABEL_ATT, createEdgeLabelST(dependency.getProperty(Constants.BASE_REL_COUNT_TARGETS, 0), Position.HEAD, style.getColor())); } if (dependency.hasProperty(Constants.BASE_REL_COUNT_SOURCES)) { edgeST.setAttribute(EDGE_LABEL_ATT, createEdgeLabelST(dependency.getProperty(Constants.BASE_REL_COUNT_SOURCES, 0), Position.TAIL, style.getColor())); } } return edgeST; }