/** * <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); }
/** * Adds all people, software systems and containers that belong to the software system in scope. */ @Override public void addAllElements() { addAllSoftwareSystems(); addAllPeople(); addAllContainers(); }
/** * Creates a container view, where the scope of the view is the specified software system. * * @param softwareSystem the SoftwareSystem object representing the scope of the view * @param key the key for the view (must be unique) * @param description a description of the view * @return a ContainerView object * @throws IllegalArgumentException if the software system is null or the key is not unique */ public ContainerView createContainerView(SoftwareSystem softwareSystem, String key, String description) { assertThatTheSoftwareSystemIsNotNull(softwareSystem); assertThatTheViewKeyIsSpecifiedAndUnique(key); ContainerView view = new ContainerView(softwareSystem, key, description); view.setViewSet(this); containerViews.add(view); return view; }
/** * <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 addAllContainersAndInfluencers() { // first add all containers of the underlying software system this.addAllContainers(); addAllInfluencers(); }
/** * Adds a software system to this view. Please note that you cannot add the software system * that is the scope of this view. * * @param softwareSystem the SoftwareSystem to add * @param addRelationships whether to add relationships to/from the software system */ @Override public void add(@Nonnull SoftwareSystem softwareSystem, boolean addRelationships) { if (softwareSystem != null && !softwareSystem.equals(getSoftwareSystem())) { addElement(softwareSystem, addRelationships); } }
@Test public void test_construction() { assertEquals("The System - Containers", view.getName()); assertEquals("Description", view.getDescription()); assertEquals(0, view.getElements().size()); assertSame(softwareSystem, view.getSoftwareSystem()); assertEquals(softwareSystem.getId(), view.getSoftwareSystemId()); assertSame(model, view.getModel()); }
views.setSystemContextViews(Collections.singleton(systemContextView)); ContainerView containerView = new ContainerView(); containerView.setSoftwareSystemId(softwareSystem.getId()); containerView.setElements(elementViewsFor(container)); views.setContainerViews(Collections.singleton(containerView)); assertSame(softwareSystem, systemContextView.getElementView(softwareSystem).getElement()); assertSame(model, containerView.getModel()); assertSame(views, containerView.getViewSet()); assertSame(softwareSystem, containerView.getSoftwareSystem()); assertSame(container, containerView.getElementView(container).getElement());
@Test public void test_copyLayoutInformationFrom_WhenTheContainerViewKeysMatch() { Workspace workspace1 = createWorkspace(); SoftwareSystem softwareSystem1 = workspace1.getModel().getSoftwareSystemWithName("Software System"); ContainerView view1 = workspace1.getViews().createContainerView(softwareSystem1, "containers", "Description"); view1.addAllElements(); view1.getElements().iterator().next().setX(100); view1.setPaperSize(PaperSize.A3_Landscape); Workspace workspace2 = createWorkspace(); SoftwareSystem softwareSystem2 = workspace2.getModel().getSoftwareSystemWithName("Software System"); ContainerView view2 = workspace2.getViews().createContainerView(softwareSystem2, "containers", "Description"); view2.addAllElements(); workspace2.getViews().copyLayoutInformationFrom(workspace1.getViews()); assertEquals(100, view2.getElements().iterator().next().getX()); assertEquals(PaperSize.A3_Landscape, view2.getPaperSize()); }
containerView.add(customer); containerView.addAllContainers(); containerView.add(mainframeBankingSystem); containerView.add(emailSystem); containerView.setPaperSize(PaperSize.A5_Landscape); systemContextView.addAnimation(emailSystem); containerView.addAnimation(customer, mainframeBankingSystem, emailSystem); containerView.addAnimation(webApplication); containerView.addAnimation(singlePageApplication); containerView.addAnimation(mobileApp); containerView.addAnimation(apiApplication); containerView.addAnimation(database);
@Test public void test_remove_RelationshipWithTag() { final String TAG = "myTag"; Container webApplication = softwareSystem.addContainer("Web Application", "", ""); Container database = softwareSystem.addContainer("Database", "", ""); webApplication.uses(database, "").addTags(TAG); view.addAllContainers(); assertEquals(2, view.getElements().size()); assertEquals(1, view.getRelationships().size()); view.removeRelationshipsWithTag(TAG); assertEquals(2, view.getElements().size()); assertEquals(0, view.getRelationships().size()); }
@Test public void test_addDependentSoftwareSystem2() { Container container1a = softwareSystem.addContainer("Container 1A", "", ""); SoftwareSystem softwareSystem2 = model.addSoftwareSystem(Location.External, "SoftwareSystem 2", ""); Container container2a = softwareSystem2.addContainer("Container 2-A", "", ""); container2a.uses(container1a, ""); model.addImplicitRelationships(); view.addDependentSoftwareSystems(); view.addAllContainers(); assertEquals(2, view.getElements().size()); assertEquals(1, view.getRelationships().size()); } }
@Test public void test_createContainerView() { Workspace workspace = new Workspace("Name", "Description"); SoftwareSystem softwareSystem = workspace.getModel().addSoftwareSystem("Software System", "Description"); ContainerView containerView = workspace.getViews().createContainerView(softwareSystem, "key", "Description"); assertEquals("key", containerView.getKey()); assertEquals("Description", containerView.getDescription()); assertSame(softwareSystem, containerView.getSoftwareSystem()); }
public final void addDependentSoftwareSystems() { getModel().getSoftwareSystems().stream() .filter(softwareSystem -> softwareSystem.hasEfferentRelationshipWith(this.getSoftwareSystem())) .forEach(this::add); }
@Test public void test_addAllSoftwareSystems_DoesNothing_WhenThereAreNoOtherSoftwareSystems() { assertEquals(0, view.getElements().size()); view.addAllSoftwareSystems(); assertEquals(0, view.getElements().size()); }
@Test public void test_addAllContainers_DoesNothing_WhenThereAreNoContainers() { assertEquals(0, view.getElements().size()); view.addAllContainers(); assertEquals(0, view.getElements().size()); }
@Test public void test_addAllElements_DoesNothing_WhenThereAreNoSoftwareSystemsOrPeople() { assertEquals(0, view.getElements().size()); view.addAllElements(); assertEquals(0, view.getElements().size()); }
@Test public void test_addAllPeople_DoesNothing_WhenThereAreNoPeople() { assertEquals(0, view.getElements().size()); view.addAllPeople(); assertEquals(0, view.getElements().size()); }
/** * Adds all containers within the software system in scope to this view. */ public void addAllContainers() { getSoftwareSystem().getContainers().forEach(this::add); }
protected void write(ContainerView view, Writer writer) { try { writeHeader(view, writer); view.getElements().stream() .filter(ev -> !(ev.getElement() instanceof Container)) .map(ElementView::getElement) .sorted((e1, e2) -> e1.getName().compareTo(e2.getName())) .forEach(e -> write(view, e, writer, false)); writer.write("package \"" + view.getSoftwareSystem().getName() + "\" <<" + typeOf(view.getSoftwareSystem()) + ">> {"); writer.write(System.lineSeparator()); view.getElements().stream() .filter(ev -> ev.getElement() instanceof Container) .map(ElementView::getElement) .sorted((e1, e2) -> e1.getName().compareTo(e2.getName())) .forEach(e -> write(view, e, writer, true)); writer.write("}"); writer.write(System.lineSeparator()); writeRelationships(view, writer); writeFooter(writer); } catch (IOException e) { e.printStackTrace(); } }
public static void main(String[] args) throws Exception { Workspace workspace = new Workspace("Styling Relationships", "This is a model of my software system."); Model model = workspace.getModel(); Person user = model.addPerson("User", "A user of my software system."); SoftwareSystem softwareSystem = model.addSoftwareSystem("Software System", "My software system."); Container webApplication = softwareSystem.addContainer("Web Application", "My web application.", "Java and Spring MVC"); Container database = softwareSystem.addContainer("Database", "My database.", "Relational database schema"); user.uses(webApplication, "Uses", "HTTPS"); webApplication.uses(database, "Reads from and writes to", "JDBC"); ViewSet views = workspace.getViews(); ContainerView containerView = views.createContainerView(softwareSystem, "containers", "An example of a container diagram."); containerView.addAllElements(); Styles styles = workspace.getViews().getConfiguration().getStyles(); // example 1 // styles.addRelationshipStyle(Tags.RELATIONSHIP).color("#ff0000"); // example 2 // model.getRelationships().stream().filter(r -> "HTTPS".equals(r.getTechnology())).forEach(r -> r.addTags("HTTPS")); // model.getRelationships().stream().filter(r -> "JDBC".equals(r.getTechnology())).forEach(r -> r.addTags("JDBC")); // styles.addRelationshipStyle("HTTPS").color("#ff0000"); // styles.addRelationshipStyle("JDBC").color("#0000ff"); StructurizrClient structurizrClient = new StructurizrClient(API_KEY, API_SECRET); structurizrClient.putWorkspace(WORKSPACE_ID, workspace); }