ApqcMappingProfile.java

package com.taxonomy.dsl.mapping.profiles;

import com.taxonomy.dsl.mapping.MappingProfile;

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

/**
 * Mapping profile for APQC Process Classification Framework (PCF).
 *
 * <p>APQC organizes processes in a hierarchy of levels (1 through 5).
 * Each level is mapped to one of the existing taxonomy root codes.
 *
 * <ul>
 *   <li>Level 1 (Category) → {@code CP} (Capability)</li>
 *   <li>Level 2 (Process Group) → {@code BP} (Business Process)</li>
 *   <li>Level 3 (Process) → {@code CR} (Core Service)</li>
 *   <li>Level 4 (Activity) → {@code CI} (COI Service)</li>
 *   <li>Level 5 (Task) → {@code BR} (Business Role)</li>
 * </ul>
 */
public class ApqcMappingProfile implements MappingProfile {

    private static final Map<String, String> ELEMENT_MAP = Map.of(
            "Category", "CP",
            "ProcessGroup", "BP",
            "Process", "CR",
            "Activity", "CI",
            "Task", "BR"
    );

    private static final Map<String, String> RELATION_MAP = Map.of(
            "ParentChild", "SUPPORTS",
            "Enables", "SUPPORTS",
            "Consumes", "CONSUMES",
            "Produces", "PRODUCES"
    );

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

    @Override
    public String displayName() {
        return "APQC PCF";
    }

    @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-apqc-level", externalType);
        String parentId = externalProperties.get("parentId");
        if (parentId != null) {
            extensions.put("x-apqc-parent", parentId);
        }
        String pcfId = externalProperties.get("pcfId");
        if (pcfId != null) {
            extensions.put("x-apqc-pcf-id", pcfId);
        }
        return extensions;
    }

    @Override
    public Map<String, String> relationExtensions(String externalRelType,
                                                   Map<String, String> externalProperties) {
        return Map.of("x-apqc-rel", externalRelType);
    }

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

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