All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.structurizr.dsl.DeploymentViewExpressionParser Maven / Gradle / Ivy

The newest version!
package com.structurizr.dsl;

import com.structurizr.model.*;

import java.util.LinkedHashSet;
import java.util.Set;
import java.util.stream.Collectors;

import static com.structurizr.dsl.StructurizrDslExpressions.ELEMENT_TYPE_EQUALS_EXPRESSION;

final class DeploymentViewExpressionParser extends ExpressionParser {

    @Override
    protected Set evaluateElementTypeExpression(String expr, DslContext context) {
        Set elements = new LinkedHashSet<>();

        String type = expr.substring(ELEMENT_TYPE_EQUALS_EXPRESSION.length());
        switch (type.toLowerCase()) {
            case "custom":
                context.getWorkspace().getModel().getElements().stream().filter(e -> e instanceof CustomElement).forEach(elements::add);
                break;
            case "deploymentnode":
                context.getWorkspace().getModel().getElements().stream().filter(e -> e instanceof DeploymentNode).forEach(elements::add);
                break;
            case "infrastructurenode":
                context.getWorkspace().getModel().getElements().stream().filter(e -> e instanceof InfrastructureNode).forEach(elements::add);
                break;
            case "softwaresystem":
                context.getWorkspace().getModel().getElements().stream().filter(e -> e instanceof SoftwareSystem).forEach(elements::add);
                break;
            case "softwaresysteminstance":
                context.getWorkspace().getModel().getElements().stream().filter(e -> e instanceof SoftwareSystemInstance).forEach(elements::add);
                break;
            case "container":
                context.getWorkspace().getModel().getElements().stream().filter(e -> e instanceof Container).forEach(elements::add);
                break;
            case "containerinstance":
                context.getWorkspace().getModel().getElements().stream().filter(e -> e instanceof ContainerInstance).forEach(elements::add);
                break;
            default:
                throw new RuntimeException("The element type of \"" + type + "\" is not valid for this view");
        }

        return elements;
    }

    @Override
    protected Set getElements(String identifier, DslContext context) {
        Set elements = new LinkedHashSet<>();
        for (Element element : super.getElements(identifier, context)) {
            if (element instanceof SoftwareSystem) {
                Set elementInstances = context.getWorkspace().getModel().getElements().stream().filter(e -> e instanceof SoftwareSystemInstance).map(e -> (SoftwareSystemInstance) e).filter(ssi -> ssi.getSoftwareSystem().equals(element)).collect(Collectors.toSet());
                elements.addAll(elementInstances);
            } else if (element instanceof Container) {
                Set elementInstances = context.getWorkspace().getModel().getElements().stream().filter(e -> e instanceof ContainerInstance).map(e -> (ContainerInstance)e).filter(ci -> ci.getContainer().equals(element)).collect(Collectors.toSet());
                elements.addAll(elementInstances);
            } else {
                elements.add(element);
            }
        }

        return elements;
    }

    protected Set findAfferentCouplings(Element element) {
        Set elements = new LinkedHashSet<>();

        elements.addAll(findAfferentCouplings(element, CustomElement.class));
        elements.addAll(findAfferentCouplings(element, DeploymentNode.class));
        elements.addAll(findAfferentCouplings(element, InfrastructureNode.class));
        elements.addAll(findAfferentCouplings(element, SoftwareSystemInstance.class));
        elements.addAll(findAfferentCouplings(element, ContainerInstance.class));

        return elements;
    }

    protected Set findEfferentCouplings(Element element) {
        Set elements = new LinkedHashSet<>();

        elements.addAll(findEfferentCouplings(element, CustomElement.class));
        elements.addAll(findEfferentCouplings(element, DeploymentNode.class));
        elements.addAll(findEfferentCouplings(element, InfrastructureNode.class));
        elements.addAll(findEfferentCouplings(element, SoftwareSystemInstance.class));
        elements.addAll(findEfferentCouplings(element, ContainerInstance.class));

        return elements;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy