diff --git a/structurizr/pom.xml b/structurizr/pom.xml new file mode 100644 index 0000000000..1656bb10ec --- /dev/null +++ b/structurizr/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + + com.baeldung + structurizr + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + 1.8 + 1.8 + + + + + com.structurizr + structurizr-core + 1.0.0-RC3 + + + com.structurizr + structurizr-spring + 1.0.0-RC3 + + + com.structurizr + structurizr-client + 0.6.0 + + + org.springframework + spring-context + 4.3.8.RELEASE + + + + + + + false + + central + bintray + http://jcenter.bintray.com + + + \ No newline at end of file diff --git a/structurizr/src/main/java/com/baeldung/structurizr/StructurizrSimple.java b/structurizr/src/main/java/com/baeldung/structurizr/StructurizrSimple.java new file mode 100644 index 0000000000..6eb0c7de73 --- /dev/null +++ b/structurizr/src/main/java/com/baeldung/structurizr/StructurizrSimple.java @@ -0,0 +1,155 @@ +package com.baeldung.structurizr; + +import java.io.File; +import java.io.StringWriter; + +import com.structurizr.Workspace; +import com.structurizr.api.StructurizrClient; +import com.structurizr.api.StructurizrClientException; +import com.structurizr.componentfinder.ComponentFinder; +import com.structurizr.componentfinder.ReferencedTypesSupportingTypesStrategy; +import com.structurizr.componentfinder.SourceCodeComponentFinderStrategy; +import com.structurizr.componentfinder.SpringComponentFinderStrategy; +import com.structurizr.io.WorkspaceWriterException; +import com.structurizr.io.plantuml.PlantUMLWriter; +import com.structurizr.model.Component; +import com.structurizr.model.Container; +import com.structurizr.model.Model; +import com.structurizr.model.Person; +import com.structurizr.model.SoftwareSystem; +import com.structurizr.model.Tags; +import com.structurizr.view.ComponentView; +import com.structurizr.view.ContainerView; +import com.structurizr.view.Routing; +import com.structurizr.view.Shape; +import com.structurizr.view.Styles; +import com.structurizr.view.SystemContextView; +import com.structurizr.view.View; +import com.structurizr.view.ViewSet; + +public class StructurizrSimple { + + public static final String PAYMENT_TERMINAL = "Payment Terminal"; + public static final String FRAUD_DETECTOR = "Fraud Detector"; + public static final String SOFTWARE_SYSTEM_VIEW = "SoftwareSystemView"; + public static final String CONTAINER_VIEW = "ContainerView"; + public static final String COMPONENT_VIEW = "ComponentView"; + public static final String JVM2_COMPONENT_VIEW = "JVM2ComponentView"; + + public static void main(String[] args) throws Exception { + Workspace workspace = getSoftwareSystem(); + + addContainers(workspace); + addComponents(workspace); + addSpringComponents(workspace); + exportToPlantUml(workspace.getViews().getViewWithKey(SOFTWARE_SYSTEM_VIEW)); + exportToPlantUml(workspace.getViews().getViewWithKey(CONTAINER_VIEW)); + exportToPlantUml(workspace.getViews().getViewWithKey(COMPONENT_VIEW)); + + exportToPlantUml(workspace.getViews().getViewWithKey(JVM2_COMPONENT_VIEW)); + + addStyles(workspace.getViews()); + //uploadToExternal(workspace); + } + + private static void addSpringComponents(Workspace workspace) throws Exception { + Container jvm2 = workspace.getModel().getSoftwareSystemWithName(PAYMENT_TERMINAL).getContainerWithName("JVM-2"); + findComponents(jvm2); + + ComponentView view = workspace.getViews().createComponentView(jvm2, JVM2_COMPONENT_VIEW, "JVM2ComponentView"); + view.addAllComponents(); + + } + + private static void findComponents(Container jvm) throws Exception { + ComponentFinder componentFinder = new ComponentFinder( + jvm, + "com.baeldung.structurizr", + new SpringComponentFinderStrategy( + new ReferencedTypesSupportingTypesStrategy() + ), + new SourceCodeComponentFinderStrategy(new File("."), 150)); + + componentFinder.findComponents(); + } + + 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(); + } + + private static void addContainers(Workspace workspace) { + Model model = workspace.getModel(); + + SoftwareSystem paymentTerminal = model.getSoftwareSystemWithName(PAYMENT_TERMINAL); + Container f5 = paymentTerminal.addContainer("Payment Load Balancer", "Payment Load Balancer", "F5"); + Container jvm1 = paymentTerminal.addContainer("JVM-1", "JVM-1", "Java Virtual Machine"); + Container jvm2 = paymentTerminal.addContainer("JVM-2", "JVM-2", "Java Virtual Machine"); + Container jvm3 = paymentTerminal.addContainer("JVM-3", "JVM-3", "Java Virtual Machine"); + Container oracle = paymentTerminal.addContainer("oracleDB", "Oracle Database", "RDBMS"); + + f5.uses(jvm1, "route"); + f5.uses(jvm2, "route"); + f5.uses(jvm3, "route"); + + jvm1.uses(oracle, "storage"); + jvm2.uses(oracle, "storage"); + jvm3.uses(oracle, "storage"); + + ContainerView view = workspace.getViews().createContainerView(paymentTerminal, CONTAINER_VIEW, "Container View"); + view.addAllContainers(); + } + + private static void uploadToExternal(Workspace workspace) throws StructurizrClientException { + StructurizrClient client = new StructurizrClient("e94bc0c9-76ef-41b0-8de7-82afc1010d04", "78d555dd-2a31-487c-952c-50508f1da495"); + client.putWorkspace(32961L, workspace); + } + + private static void exportToPlantUml(View view) throws WorkspaceWriterException { + StringWriter stringWriter = new StringWriter(); + PlantUMLWriter plantUMLWriter = new PlantUMLWriter(); + plantUMLWriter.write(view, stringWriter); + System.out.println(stringWriter.toString()); + } + + 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; + } + + private static void addStyles(ViewSet viewSet) { + Styles styles = viewSet.getConfiguration().getStyles(); + styles.addElementStyle(Tags.ELEMENT).color("#000000"); + styles.addElementStyle(Tags.PERSON).background("#ffbf00").shape(Shape.Person); + styles.addElementStyle(Tags.CONTAINER).background("#facc2E"); + styles.addRelationshipStyle(Tags.RELATIONSHIP).routing(Routing.Orthogonal); + + styles.addRelationshipStyle(Tags.ASYNCHRONOUS).dashed(true); + styles.addRelationshipStyle(Tags.SYNCHRONOUS).dashed(false); + } +} diff --git a/structurizr/src/main/java/com/baeldung/structurizr/spring/GenericComponent.java b/structurizr/src/main/java/com/baeldung/structurizr/spring/GenericComponent.java new file mode 100644 index 0000000000..56f2d52ce0 --- /dev/null +++ b/structurizr/src/main/java/com/baeldung/structurizr/spring/GenericComponent.java @@ -0,0 +1,7 @@ +package com.baeldung.structurizr.spring; + +import org.springframework.stereotype.Component; + +@Component +public class GenericComponent { +} diff --git a/structurizr/src/main/java/com/baeldung/structurizr/spring/PaymentController.java b/structurizr/src/main/java/com/baeldung/structurizr/spring/PaymentController.java new file mode 100644 index 0000000000..89a58b9885 --- /dev/null +++ b/structurizr/src/main/java/com/baeldung/structurizr/spring/PaymentController.java @@ -0,0 +1,14 @@ +package com.baeldung.structurizr.spring; + +import org.springframework.stereotype.Controller; + +import javax.annotation.Resource; + +@Controller +public class PaymentController { + @Resource + private PaymentRepository repository; + + @Resource + private GenericComponent component; +} diff --git a/structurizr/src/main/java/com/baeldung/structurizr/spring/PaymentRepository.java b/structurizr/src/main/java/com/baeldung/structurizr/spring/PaymentRepository.java new file mode 100644 index 0000000000..78b00495b6 --- /dev/null +++ b/structurizr/src/main/java/com/baeldung/structurizr/spring/PaymentRepository.java @@ -0,0 +1,7 @@ +package com.baeldung.structurizr.spring; + +import org.springframework.stereotype.Repository; + +@Repository +public class PaymentRepository { +}