ArchiMateModel.java

package com.taxonomy.archimate;

import java.util.List;
import java.util.Map;

/**
 * Top-level ArchiMate model containing elements, relationships, organization groups,
 * and zero or more diagram views. Original identities are distinct from XML IDs.
 */
public record ArchiMateModel(
        String id,
        String title,
        List<ArchiMateElement> elements,
        List<ArchiMateRelationship> relationships,
        Map<String, List<String>> organizations,
        List<ArchiMateView> views,
        Map<String, ArchiMateProperty> properties,
        List<ArchiMateLoss> losses) {
    public ArchiMateModel {
        elements = List.copyOf(elements);
        relationships = List.copyOf(relationships);
        organizations = organizations == null ? Map.of() : organizations.entrySet().stream()
                .collect(java.util.stream.Collectors.toUnmodifiableMap(Map.Entry::getKey,
                        entry -> List.copyOf(entry.getValue())));
        views = List.copyOf(views);
        properties = Map.copyOf(properties);
        losses = List.copyOf(losses);
    }

    public ArchiMateModel(String title, List<ArchiMateElement> elements,
                         List<ArchiMateRelationship> relationships,
                         Map<String, List<String>> organizations, ArchiMateView view) {
        this("architecture", title, elements, relationships, organizations,
                view == null ? List.of() : List.of(view), Map.of(), List.of());
    }

    public ArchiMateView view() {
        return views.isEmpty() ? null : views.getFirst();
    }
}