C4MappingProfile.java

package com.taxonomy.dsl.mapping.profiles;

import com.taxonomy.dsl.mapping.MappingProfile;

import java.util.Map;
import java.util.Set;

/**
 * Mapping profile for C4 / Structurizr architecture models.
 *
 * <p>Maps the four C4 abstraction levels plus the Person concept:
 * <ul>
 *   <li>Person → {@code BR} (Business Role)</li>
 *   <li>SoftwareSystem → {@code SY} (System)</li>
 *   <li>Container → {@code UA} (User Application)</li>
 *   <li>Component → {@code CM} (Component)</li>
 *   <li>DeploymentNode → {@code CO} (Communications Service)</li>
 *   <li>InfrastructureNode → {@code CO} (Communications Service)</li>
 *   <li>ContainerInstance → {@code UA} (User Application)</li>
 * </ul>
 */
public class C4MappingProfile implements MappingProfile {

    private static final Map<String, String> ELEMENT_MAP = Map.of(
            "Person", "BR",
            "SoftwareSystem", "SY",
            "Container", "UA",
            "Component", "CM",
            "DeploymentNode", "CO",
            "InfrastructureNode", "CO",
            "ContainerInstance", "UA"
    );

    private static final Map<String, String> RELATION_MAP = Map.of(
            "Uses", "USES",
            "Delivers", "PRODUCES",
            "InteractsWith", "COMMUNICATES_WITH",
            "DependsOn", "DEPENDS_ON",
            "Contains", "CONTAINS",
            "Realizes", "REALIZES",
            "Supports", "SUPPORTS"
    );

    @Override
    public String profileId() {
        return "c4";
    }

    @Override
    public String displayName() {
        return "C4 / Structurizr";
    }

    @Override
    public String mapElementType(String externalType) {
        return ELEMENT_MAP.get(externalType);
    }

    @Override
    public String mapRelationType(String externalType) {
        return RELATION_MAP.get(externalType);
    }

    @Override
    public Map<String, String> elementExtensions(String externalType,
                                                  Map<String, String> externalProperties) {
        var extensions = new java.util.LinkedHashMap<String, String>();
        extensions.put("x-c4-kind", externalType);
        String technology = externalProperties.get("technology");
        if (technology != null) {
            extensions.put("x-c4-technology", technology);
        }
        return extensions;
    }

    @Override
    public Map<String, String> relationExtensions(String externalRelType,
                                                   Map<String, String> externalProperties) {
        var extensions = new java.util.LinkedHashMap<String, String>();
        extensions.put("x-c4-rel", externalRelType);
        String technology = externalProperties.get("technology");
        if (technology != null) {
            extensions.put("x-c4-technology", technology);
        }
        return extensions;
    }

    @Override
    public Set<String> supportedElementTypes() {
        return ELEMENT_MAP.keySet();
    }

    @Override
    public Set<String> supportedRelationTypes() {
        return RELATION_MAP.keySet();
    }
}