@Override protected RelationshipView findRelationshipView(@Nonnull RelationshipView sourceRelationshipView) { for (RelationshipView relationshipView : getRelationships()) { if (relationshipView.getRelationship().equals(sourceRelationshipView.getRelationship())) { if ((relationshipView.getDescription() != null && relationshipView.getDescription().equals(sourceRelationshipView.getDescription())) && relationshipView.getOrder().equals(sourceRelationshipView.getOrder())) { return relationshipView; } } } return null; }
/** * Removes a relationship from this view. * * @param relationship the Relationship to remove */ public void remove(Relationship relationship) { if (relationship != null) { RelationshipView relationshipView = new RelationshipView(relationship); relationshipViews.remove(relationshipView); } }
void copyLayoutInformationFrom(RelationshipView source) { if (source != null) { setVertices(source.getVertices()); setPosition(source.getPosition()); setRouting(source.getRouting()); } }
@Override public String toString() { StringBuilder buf = new StringBuilder(); List<RelationshipView> list = new ArrayList<>(getRelationships()); Collections.sort(list, (rv1, rv2) -> rv1.getOrder().compareTo(rv2.getOrder())); list.forEach(rv -> buf.append(rv.toString() + "\n")); return buf.toString(); }
protected RelationshipView findRelationshipView(@Nonnull RelationshipView sourceRelationshipView) { for (RelationshipView relationshipView : getRelationships()) { if (relationshipView.getRelationship().equals(sourceRelationshipView.getRelationship())) { return relationshipView; } } return null; }
@Test public void test_normalSequence() { workspace = new Workspace("Name", "Description"); model = workspace.getModel(); SoftwareSystem softwareSystem = model.addSoftwareSystem("Software System", "Description"); Container container1 = softwareSystem.addContainer("Container 1", "Description", "Technology"); Container container2 = softwareSystem.addContainer("Container 2", "Description", "Technology"); Container container3 = softwareSystem.addContainer("Container 3", "Description", "Technology"); container1.uses(container2, "Uses"); container1.uses(container3, "Uses"); DynamicView view = workspace.getViews().createDynamicView(softwareSystem, "key", "Description"); view.add(container1, container2); view.add(container1, container3); assertSame(container2, view.getRelationships().stream().filter(r -> r.getOrder().equals("1")).findFirst().get().getRelationship().getDestination()); assertSame(container3, view.getRelationships().stream().filter(r -> r.getOrder().equals("2")).findFirst().get().getRelationship().getDestination()); }
view.add(softwareSystemD, softwareSystemE); assertEquals(1, view.getRelationships().stream().filter(r -> r.getOrder().equals("1")).count()); assertEquals(2, view.getRelationships().stream().filter(r -> r.getOrder().equals("2")).count()); assertEquals(2, view.getRelationships().stream().filter(r -> r.getOrder().equals("3")).count()); assertEquals(1, view.getRelationships().stream().filter(r -> r.getOrder().equals("4")).count());
private HashSet<RelationshipView> relationshipViewsFor(Relationship... relationships) { HashSet<RelationshipView> set = new HashSet<>(); for (Relationship relationship : relationships) { RelationshipView relationshipView = new RelationshipView(); relationshipView.setId(relationship.getId()); set.add(relationshipView); } return set; }
/** * Removes all elements that have no relationships to other elements in this view. */ public void removeElementsWithNoRelationships() { Set<RelationshipView> relationships = getRelationships(); Set<String> elementIds = new HashSet<>(); relationships.forEach(rv -> elementIds.add(rv.getRelationship().getSourceId())); relationships.forEach(rv -> elementIds.add(rv.getRelationship().getDestinationId())); for (ElementView elementView : getElements()) { if (!elementIds.contains(elementView.getId())) { removeElement(elementView.getElement()); } } }
private void write(DynamicView view, Writer writer) { try { writer.write("title " + view.getName() + " - " + view.getKey()); writer.write(System.lineSeparator()); writer.write(System.lineSeparator()); Set<RelationshipView> relationships = new TreeSet<>((rv1, rv2) -> rv1.getOrder().compareTo(rv2.getOrder())); relationships.addAll(view.getRelationships()); for (RelationshipView relationshipView : relationships) { Relationship r = relationshipView.getRelationship(); // Thing A->Thing B: Description writer.write(String.format("%s%s%s: %s", r.getSource().getName(), r.getInteractionStyle() == InteractionStyle.Synchronous ? SYNCHRONOUS_INTERACTION : ASYNCHRONOUS_INTERACTION, r.getDestination().getName(), relationshipView.getDescription() )); writer.write(System.lineSeparator()); } writer.write(System.lineSeparator()); } catch (IOException ioe) { ioe.printStackTrace(); } }
view1.getElementView(person1).setX(456); view1.getElementView(person1).setY(654); view1.getRelationshipView(personUsesSoftwareSystem1).setVertices(Arrays.asList(new Vertex(123, 456))); view1.getRelationshipView(personUsesSoftwareSystem1).setPosition(70); view1.getRelationshipView(personUsesSoftwareSystem1).setRouting(Routing.Orthogonal); assertEquals(0, view2.getElementView(person2).getX()); assertEquals(0, view2.getElementView(person2).getY()); assertTrue(view2.getRelationshipView(personUsesSoftwareSystem2).getVertices().isEmpty()); assertEquals(456, view2.getElementView(person2).getX()); assertEquals(654, view2.getElementView(person2).getY()); Vertex vertex = view2.getRelationshipView(personUsesSoftwareSystem2).getVertices().iterator().next(); assertEquals(123, vertex.getX()); assertEquals(456, vertex.getY()); assertEquals(70, view2.getRelationshipView(personUsesSoftwareSystem2).getPosition().intValue()); assertEquals(Routing.Orthogonal, view2.getRelationshipView(personUsesSoftwareSystem2).getRouting());
(elementsInThisAnimationStep.contains(relationshipView.getRelationship().getSource()) && elementIdsInPreviousAnimationSteps.contains(relationshipView.getRelationship().getDestination().getId())) || (elementIdsInPreviousAnimationSteps.contains(relationshipView.getRelationship().getSource().getId()) && elementsInThisAnimationStep.contains(relationshipView.getRelationship().getDestination())) ) { relationshipsInThisAnimationStep.add(relationshipView.getRelationship());
private void addRelationships(Element element) { Set<Element> elements = getElements().stream() .map(ElementView::getElement) .collect(Collectors.toSet()); // add relationships where the destination exists in the view already for (Relationship relationship : element.getRelationships()) { if (elements.contains(relationship.getDestination())) { this.relationshipViews.add(new RelationshipView(relationship)); } } // add relationships where the source exists in the view already for (Element e : elements) { for (Relationship r : e.getRelationships()) { if (r.getDestination().equals(element)) { this.relationshipViews.add(new RelationshipView(r)); } } } }
.sorted((rv1, rv2) -> (rv1.getOrder().compareTo(rv2.getOrder()))) .forEach(relationship -> { try { writer.write( format("%s -[%s]> %s : %s. %s", idOf(relationship.getRelationship().getSource()), view.getViewSet().getConfiguration().getStyles().findRelationshipStyle(relationship.getRelationship()).getColor(), idOf(relationship.getRelationship().getDestination()), relationship.getOrder(), hasValue(relationship.getDescription()) ? relationship.getDescription() : hasValue(relationship.getRelationship().getDescription()) ? relationship.getRelationship().getDescription() : ""
protected void removeElement(Element element) { if (element == null) { throw new IllegalArgumentException("An element must be specified."); } if (!canBeRemoved(element)) { throw new IllegalArgumentException("The element named '" + element.getName() + "' cannot be removed from this view."); } ElementView elementView = new ElementView(element); elementViews.remove(elementView); for (RelationshipView relationshipView : getRelationships()) { if (relationshipView.getRelationship().getSource().equals(element) || relationshipView.getRelationship().getDestination().equals(element)) { remove(relationshipView.getRelationship()); } } }
protected RelationshipView addRelationship(Relationship relationship) { if (relationship == null) { throw new IllegalArgumentException("A relationship must be specified."); } if (isElementInView(relationship.getSource()) && isElementInView(relationship.getDestination())) { RelationshipView relationshipView = new RelationshipView(relationship); relationshipViews.add(relationshipView); return relationshipView; } return null; }
/** * <p>Adds all {@link com.structurizr.model.Container}s of the given {@link ContainerView} as well as all external influencers, that is all * persons and all other software systems with incoming or outgoing dependencies.</p> * <p>Additionally, all relationships of external dependencies are omitted to keep the diagram clean</p> */ public final void addAllInfluencers() { // add all software systems with incoming or outgoing dependencies getModel().getSoftwareSystems() .stream() .filter(softwareSystem -> softwareSystem.hasEfferentRelationshipWith(getSoftwareSystem()) || getSoftwareSystem().hasEfferentRelationshipWith(softwareSystem)) .forEach(this::add); // then add all people with incoming or outgoing dependencies getModel().getPeople() .stream() .filter(person -> person.hasEfferentRelationshipWith(getSoftwareSystem()) || getSoftwareSystem().hasEfferentRelationshipWith(person)) .forEach(this::add); // then remove all relationships of external elements to keep the container view clean getRelationships() .stream() .map(view -> view.getRelationship()) .filter(relationship -> !isPartOf(relationship.getDestination(), getSoftwareSystem()) && !isPartOf(relationship.getSource(), getSoftwareSystem())) .forEach(this::remove); }
@Test public void test_removeRelationship_RemovesARelationship_WhenAValidRelationshipIsSpecified() { SoftwareSystem softwareSystem1 = model.addSoftwareSystem("Software System 1", "Description"); SoftwareSystem softwareSystem2 = model.addSoftwareSystem("Software System 2", "Description"); SoftwareSystem softwareSystem3 = model.addSoftwareSystem("Software System 3", "Description"); Relationship relationship12 = softwareSystem1.uses(softwareSystem2, "Uses"); Relationship relationship23 = softwareSystem2.uses(softwareSystem3, "Uses"); Relationship relationship31 = softwareSystem3.uses(softwareSystem1, "Uses"); StaticView view = new SystemContextView(softwareSystem1, "context", "Description"); view.addAllElements(); assertEquals(3, view.getRelationships().size()); view.remove(relationship31); assertEquals(2, view.getRelationships().size()); assertTrue(view.getRelationships().contains(new RelationshipView(relationship12))); assertTrue(view.getRelationships().contains(new RelationshipView(relationship23))); }
Relationship relationship = relationshipView.getRelationship(); digraph.addAssociation( relationship.getSourceId(),
assertSame(person, systemLandscapeView.getElementView(person).getElement()); assertSame(softwareSystem, systemLandscapeView.getElementView(softwareSystem).getElement()); assertSame(personUsesSoftwareSystemRelationship, systemLandscapeView.getRelationshipView(personUsesSoftwareSystemRelationship).getRelationship());