Search in sources :

Example 36 with SoftwareSystem

use of com.structurizr.model.SoftwareSystem in project tutorials by eugenp.

the class StructurizrSimple method addComponents.

private static void addComponents(Workspace workspace) {
    Model model = workspace.getModel();
    SoftwareSystem paymentTerminal = model.getSoftwareSystemWithName(PAYMENT_TERMINAL);
    Container jvm1 = paymentTerminal.getContainerWithName("JVM-1");
    Component jaxrs = jvm1.addComponent("jaxrs-jersey", "restful webservice implementation", "rest");
    Component gemfire = jvm1.addComponent("gemfire", "Clustered Cache Gemfire", "cache");
    Component hibernate = jvm1.addComponent("hibernate", "Data Access Layer", "jpa");
    jaxrs.uses(gemfire, "");
    gemfire.uses(hibernate, "");
    ComponentView componentView = workspace.getViews().createComponentView(jvm1, COMPONENT_VIEW, "JVM Components");
    componentView.addAllComponents();
}
Also used : Container(com.structurizr.model.Container) ComponentView(com.structurizr.view.ComponentView) Model(com.structurizr.model.Model) SoftwareSystem(com.structurizr.model.SoftwareSystem) Component(com.structurizr.model.Component)

Example 37 with SoftwareSystem

use of com.structurizr.model.SoftwareSystem in project tutorials by eugenp.

the class StructurizrSimple method getSoftwareSystem.

private static Workspace getSoftwareSystem() {
    Workspace workspace = new Workspace("Payment Gateway", "Payment Gateway");
    Model model = workspace.getModel();
    Person user = model.addPerson("Merchant", "Merchant");
    SoftwareSystem paymentTerminal = model.addSoftwareSystem(PAYMENT_TERMINAL, "Payment Terminal");
    user.uses(paymentTerminal, "Makes payment");
    SoftwareSystem fraudDetector = model.addSoftwareSystem(FRAUD_DETECTOR, "Fraud Detector");
    paymentTerminal.uses(fraudDetector, "Obtains fraud score");
    ViewSet viewSet = workspace.getViews();
    SystemContextView contextView = viewSet.createSystemContextView(workspace.getModel().getSoftwareSystemWithName(PAYMENT_TERMINAL), SOFTWARE_SYSTEM_VIEW, "Payment Gateway Diagram");
    contextView.addAllElements();
    return workspace;
}
Also used : ViewSet(com.structurizr.view.ViewSet) SystemContextView(com.structurizr.view.SystemContextView) Model(com.structurizr.model.Model) SoftwareSystem(com.structurizr.model.SoftwareSystem) Person(com.structurizr.model.Person) Workspace(com.structurizr.Workspace)

Example 38 with SoftwareSystem

use of com.structurizr.model.SoftwareSystem in project cia by Hack23.

the class AwsPublicSystemDocumentation method main.

/**
 * The main method.
 *
 * @param args
 *            the arguments
 * @throws Exception
 *             the exception
 */
public static void main(final String[] args) throws Exception {
    final Workspace workspace = new Workspace("Citizen Intelligence Agency", "Public Aws System Documentation");
    final Model model = workspace.getModel();
    final ViewSet viewSet = workspace.getViews();
    final SoftwareSystem ciaSystem = model.addSoftwareSystem("Citizen Intelligence Agency", "Tracking politicians like bugs!");
    final DeploymentNode masterAccountNode = model.addDeploymentNode("Master Account", "AWS", "Aws Account");
    final Container awsAccountContainer = ciaSystem.addContainer("Master Account", "AWS", "Aws Account");
    final DeploymentNode iamAccountNode = model.addDeploymentNode("IAM Account", "AWS", "Aws Account");
    final Container iamAccountContainer = ciaSystem.addContainer("IAM Account", "AWS", "Aws Account");
    final DeploymentNode devAccountNode = model.addDeploymentNode("Development Account", "AWS", "Aws Account");
    final Container devAccountContainer = ciaSystem.addContainer("Development Account", "AWS", "Aws Account");
    final DeploymentNode opCenterAccountNode = model.addDeploymentNode("Operation Center Account", "AWS", "Aws Account");
    final Container opCenterAccountContainer = ciaSystem.addContainer("Operation Center Account", "AWS", "Aws Account");
    final DeploymentNode auditAccountNode = model.addDeploymentNode("Audit Account", "AWS", "Aws Account");
    final Container auditAccountContainer = ciaSystem.addContainer("Audit Account", "AWS", "Aws Account");
    final DeploymentNode appAccountNode = model.addDeploymentNode("Application Account", "AWS", "Aws Account");
    final Container appAccountContainer = ciaSystem.addContainer("Application Account", "AWS", "Aws Account");
    awsAccountContainer.uses(iamAccountContainer, "create/restrict");
    awsAccountContainer.uses(devAccountContainer, "create/restrict");
    awsAccountContainer.uses(opCenterAccountContainer, "create/restrict");
    awsAccountContainer.uses(auditAccountContainer, "create/restrict");
    awsAccountContainer.uses(appAccountContainer, "create/restrict");
    awsAccountContainer.uses(auditAccountContainer, "publish event/audit");
    iamAccountContainer.uses(auditAccountContainer, "publish event/audit");
    devAccountContainer.uses(auditAccountContainer, "publish event/audit");
    opCenterAccountContainer.uses(auditAccountContainer, "publish event/audit");
    appAccountContainer.uses(auditAccountContainer, "publish event/audit");
    opCenterAccountContainer.uses(auditAccountContainer, "Monitor event/audit");
    iamAccountContainer.uses(devAccountContainer, "manage access");
    iamAccountContainer.uses(appAccountContainer, "manage access");
    iamAccountContainer.uses(opCenterAccountContainer, "manage access");
    opCenterAccountNode.add(opCenterAccountContainer);
    devAccountNode.add(devAccountContainer);
    auditAccountNode.add(auditAccountContainer);
    appAccountNode.add(appAccountContainer);
    iamAccountNode.add(iamAccountContainer);
    masterAccountNode.add(awsAccountContainer);
    final DeploymentView developmentDeploymentView = viewSet.createDeploymentView(ciaSystem, "\"Production Aws Account structure\"", "\"Production Aws Account structure\"");
    developmentDeploymentView.add(masterAccountNode);
    developmentDeploymentView.add(iamAccountNode);
    developmentDeploymentView.add(devAccountNode);
    developmentDeploymentView.add(opCenterAccountNode);
    developmentDeploymentView.add(auditAccountNode);
    developmentDeploymentView.add(appAccountNode);
    final Styles styles = viewSet.getConfiguration().getStyles();
    styles.addElementStyle(Tags.COMPONENT).background("#1168bd").color("#ffffff");
    styles.addElementStyle(Tags.CONTAINER).background("#1168bd").color("#ffffff");
    styles.addElementStyle(Tags.SOFTWARE_SYSTEM).background("#1168bd").color("#ffffff");
    styles.addElementStyle(Tags.PERSON).background("#519823").color("#ffffff").shape(Shape.Person);
    styles.addElementStyle("Database").shape(Shape.Cylinder);
    printPlantUml(workspace);
    System.setProperty("PLANTUML_LIMIT_SIZE", "8192");
    Run.main(new String[] { Paths.get(".").toAbsolutePath().normalize().toString() + File.separator + "target" + File.separator + "site" + File.separator + "architecture" + File.separator });
}
Also used : Container(com.structurizr.model.Container) ViewSet(com.structurizr.view.ViewSet) DeploymentNode(com.structurizr.model.DeploymentNode) Model(com.structurizr.model.Model) SoftwareSystem(com.structurizr.model.SoftwareSystem) Workspace(com.structurizr.Workspace) DeploymentView(com.structurizr.view.DeploymentView) Styles(com.structurizr.view.Styles)

Example 39 with SoftwareSystem

use of com.structurizr.model.SoftwareSystem in project agile-architecture-documentation-system by Riduidel.

the class Architecture method describeArchitecture.

/**
 * Creates the workspace object and add in it both the architecture components
 * AND the views used to display it
 *
 * @return
 */
public Workspace describeArchitecture() {
    // tag::structurizr-example-context[]
    String name = "agile-architecture-documentation-system";
    Workspace workspace = new Workspace(name, "This is the model of the agile architecture documentation system.");
    Model model = workspace.getModel();
    Person architect = model.addPerson("Architect", "The architect as team scribe is the writer of this kind of documentation.");
    Person stakeholder = model.addPerson("Stakeholder", "All project stakeholders are readers of this kind of documentation.");
    SoftwareSystem agileArchitecture = model.addSoftwareSystem(AGILE_ARCHITECTURE_DOCUMENTATION, "This software system generates the documentation.");
    agileArchitecture.addProperty(ModelElementKeys.ISSUE_MANAGER, "https://github.com/Riduidel/agile-architecture-documentation-system");
    agileArchitecture.addProperty(ADRExtractor.AGILE_ARCHITECTURE_TICKETS_PROJECT, name);
    agileArchitecture.addProperty(ADRExtractor.AGILE_ARCHITECTURE_TICKETS_ADR_LABEL, "decision");
    architect.uses(agileArchitecture, "Writes");
    stakeholder.uses(agileArchitecture, "Read");
    // end::structurizr-example-context[]
    // ///////////////////////////////////////////////////////////////////////////////////////
    // tag::structurizr-example-containers[]
    Container archetype = agileArchitecture.addContainer(CONTAINERS_ARCHETYPE, "Archetype generating a valid build", "maven archetype");
    archetype.addProperty(MavenEnhancer.AGILE_ARCHITECTURE_MAVEN_POM, locate("archetype/pom.xml"));
    architect.uses(archetype, "Bootstrap a valid project");
    Container maven = agileArchitecture.addContainer(CONTAINERS_MAVEN, "Maven build tool", "Maven build tool");
    architect.uses(maven, "Generates documentation");
    Container base = agileArchitecture.addContainer(CONTAINERS_BASE, "Architecture base", "Java executable");
    base.addProperty(MavenEnhancer.AGILE_ARCHITECTURE_MAVEN_POM, locate("base/pom.xml"));
    base.addProperty(ModelElementKeys.SCM_PATH, base.getName());
    // end::structurizr-example-containers[]
    // tag::structurizr-example-components[]
    ComponentFinder componentFinder = new ComponentFinder(base, // new SourceCodeComponentFinderStrategy(new File("../base/src/main/java")),
    ArchitectureModelProvider.class.getPackageName(), new StructurizrAnnotationsComponentFinderStrategy());
    // end::structurizr-example-components[]
    if (getClass().getClassLoader() instanceof URLClassLoader) {
        componentFinder.setUrlClassLoader((URLClassLoader) getClass().getClassLoader());
    }
    try {
        componentFinder.findComponents();
    } catch (Exception e) {
        throw new RuntimeException("Unable to locate components in ", e);
    }
    // model.addImplicitRelationships();
    // Damn, structurizr-annotations doesn't understand CDI. Let's supplement it!
    base.getComponentWithName("ArchitectureEnhancer").uses(base.getComponentWithName("DocumentsCollector"), "Collects documents in source folder");
    base.getComponentWithName("ArchitectureEnhancer").uses(base.getComponentWithName("SCMLinkGenerator"), "Generates links to SCM sources");
    base.getComponentWithName("ArchitectureEnhancer").uses(base.getComponentWithName("SCMReadmeReader"), "Includes elements readme when they exist");
    base.getComponentWithName("ArchitectureEnhancer").uses(base.getComponentWithName("ImplicitIncludeManager"), "Generates includes for all enhancers");
    base.getComponentWithName("ArchitectureEnhancer").uses(base.getComponentWithName("GraphEmitter"), "Generates diagrams in PlantUML format");
    maven.uses(base.getComponentWithName("ArchitectureDocumentationBuilder"), "Invokes that Java executable during maven build");
    Component gitHub = base.addComponent("github-scm-handler", "GitHub SCM Handler", "java");
    gitHub.addProperty(MavenEnhancer.AGILE_ARCHITECTURE_MAVEN_POM, locate("github-scm-handler/pom.xml"));
    gitHub.addProperty(ModelElementKeys.SCM_PATH, gitHub.getName());
    base.getComponentWithName("SCMLinkGenerator").uses(gitHub, "Get project source link");
    base.getComponentWithName("SCMReadmeReader").uses(gitHub, "Get project readme");
    Component gitLab = base.addComponent("gitlab-scm-handler", "GitLab SCM Handler", "java");
    gitLab.addProperty(MavenEnhancer.AGILE_ARCHITECTURE_MAVEN_POM, locate("gitlab-scm-handler/pom.xml"));
    gitLab.addProperty(ModelElementKeys.SCM_PATH, gitLab.getName());
    base.getComponentWithName("SCMLinkGenerator").uses(gitLab, "Get project source link");
    base.getComponentWithName("SCMReadmeReader").uses(gitLab, "Get project readme");
    Component adrTicketsExtractor = base.addComponent("adr-tickets-extractor", "enhanced by maven");
    adrTicketsExtractor.addProperty(MavenEnhancer.AGILE_ARCHITECTURE_MAVEN_POM, locate("adr-tickets-extractor/pom.xml"));
    adrTicketsExtractor.addProperty(ModelElementKeys.SCM_PATH, adrTicketsExtractor.getName());
    adrTicketsExtractor.uses(gitLab, "Read tickets from Gitlab if configured so");
    adrTicketsExtractor.uses(gitHub, "Read tickets from GitHub if configured so");
    base.getComponentWithName("ArchitectureEnhancer").uses(adrTicketsExtractor, "Produces ADR reporting");
    Component cdiConfigExtension = base.addComponent("cdi-config-extension", "CDI Config extensions", "java");
    cdiConfigExtension.addProperty(MavenEnhancer.AGILE_ARCHITECTURE_MAVEN_POM, locate("cdi-config-extension/pom.xml"));
    cdiConfigExtension.addProperty(ModelElementKeys.SCM_PATH, cdiConfigExtension.getName());
    base.getComponentWithName("ArchitectureDocumentationBuilder").uses(cdiConfigExtension, "Eases out some CDI code");
    Component mavenEnhancer = base.addComponent("maven-metadata-inferer", "Enhanced by Maven");
    cdiConfigExtension.addProperty(MavenEnhancer.AGILE_ARCHITECTURE_MAVEN_POM, locate("maven-metadata-inferer/pom.xml"));
    cdiConfigExtension.addProperty(ModelElementKeys.SCM_PATH, mavenEnhancer.getName());
    base.getComponentWithName("ArchitectureDocumentationBuilder").uses(mavenEnhancer, "Infer most of element details from Maven infos");
    Container asciidoc = agileArchitecture.addContainer("asciidoc", "Asciidoc tooling", "Maven plugin");
    maven.uses(base, "Generates diagrams and asciidoc includes");
    maven.uses(asciidoc, "Generates documentation as usable text in HTML/PDF/...");
    // ///////////////////////////////////////////////////////////////////////////////////////
    // tag::structurizr-example-views[]
    ViewSet views = workspace.getViews();
    SystemContextView contextView = views.createSystemContextView(agileArchitecture, "SystemContext", "Illustration of agile-architecture-documentation usage");
    contextView.addAllSoftwareSystems();
    contextView.addAllPeople();
    ContainerView agileArchitectureContainers = views.createContainerView(agileArchitecture, "agile.architecture.containers", "Agile architecture containers");
    agileArchitectureContainers.addAllContainersAndInfluencers();
    ComponentView agileArchitectureBaseComponents = views.createComponentView(base, "agile.architecture.base.components", "Agile architecture base components view");
    agileArchitectureBaseComponents.addAllComponents();
    // styles.addElementStyle(Tags.PERSON).background("#08427b").color("#ffffff").shape(Shape.Person);
    return workspace;
}
Also used : ArchitectureModelProvider(org.ndx.agile.architecture.base.ArchitectureModelProvider) ComponentFinder(com.structurizr.analysis.ComponentFinder) StructurizrAnnotationsComponentFinderStrategy(com.structurizr.analysis.StructurizrAnnotationsComponentFinderStrategy) Container(com.structurizr.model.Container) ComponentView(com.structurizr.view.ComponentView) ViewSet(com.structurizr.view.ViewSet) SystemContextView(com.structurizr.view.SystemContextView) URLClassLoader(java.net.URLClassLoader) Model(com.structurizr.model.Model) SoftwareSystem(com.structurizr.model.SoftwareSystem) ContainerView(com.structurizr.view.ContainerView) Component(com.structurizr.model.Component) Person(com.structurizr.model.Person) Workspace(com.structurizr.Workspace)

Example 40 with SoftwareSystem

use of com.structurizr.model.SoftwareSystem in project dsl by structurizr.

the class ContainerParserTests method test_parse_CreatesAContainer.

@Test
void test_parse_CreatesAContainer() {
    SoftwareSystem softwareSystem = model.addSoftwareSystem("Software System", "Description");
    SoftwareSystemDslContext context = new SoftwareSystemDslContext(softwareSystem);
    parser.parse(context, tokens("container", "Name"));
    assertEquals(2, model.getElements().size());
    Container container = softwareSystem.getContainerWithName("Name");
    assertNotNull(container);
    assertEquals("", container.getDescription());
    assertEquals("", container.getTechnology());
    assertEquals("Element,Container", container.getTags());
}
Also used : Container(com.structurizr.model.Container) SoftwareSystem(com.structurizr.model.SoftwareSystem) Test(org.junit.jupiter.api.Test)

Aggregations

SoftwareSystem (com.structurizr.model.SoftwareSystem)69 Test (org.junit.jupiter.api.Test)38 Container (com.structurizr.model.Container)23 Workspace (com.structurizr.Workspace)22 Test (org.junit.Test)17 Person (com.structurizr.model.Person)9 Component (com.structurizr.model.Component)8 DynamicView (com.structurizr.view.DynamicView)8 ArrayList (java.util.ArrayList)8 Model (com.structurizr.model.Model)7 DeploymentView (com.structurizr.view.DeploymentView)6 SystemContextView (com.structurizr.view.SystemContextView)6 ViewSet (com.structurizr.view.ViewSet)5 Element (com.structurizr.model.Element)4 Relationship (com.structurizr.model.Relationship)4 ContainerView (com.structurizr.view.ContainerView)4 RelationshipView (com.structurizr.view.RelationshipView)4 DeploymentNode (com.structurizr.model.DeploymentNode)3 ComponentView (com.structurizr.view.ComponentView)3 EncryptedWorkspace (com.structurizr.encryption.EncryptedWorkspace)2