package jnpf.elnService; import jnpf.elnEntity.runtime.ElnRecordFieldValueEntity; import jnpf.elnEntity.template.ElnTemplateBindingEntity; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; public interface ElnCrossTemplateSnapshotResolver { Map resolve(String tenantId, String targetTestWorkItemId, List targetBindings); /** * Re-resolves persisted cross-template targets by their immutable binding identity. * This keeps explicit synchronization independent from the currently editable template. */ default Map resolveByBindingIds(String tenantId, String targetTestWorkItemId, Set targetBindingIds) { return Collections.emptyMap(); } /** * Re-resolves persisted cross-template snapshots without changing them. * A caller can use every returned issue to block a state transition while * preserving the original snapshot as audit evidence. */ default List validatePersistedSnapshots(String tenantId, String targetTestWorkItemId, List targetValues) { return Collections.emptyList(); } final class SnapshotIssue { private final String code; private final String message; private final String targetBindingId; private final String targetFieldCode; private final String sourceTemplateCode; public SnapshotIssue(String code, String message, String targetBindingId, String targetFieldCode, String sourceTemplateCode) { this.code = code; this.message = message; this.targetBindingId = targetBindingId; this.targetFieldCode = targetFieldCode; this.sourceTemplateCode = sourceTemplateCode; } public String getCode() { return code; } public String getMessage() { return message; } public String getTargetBindingId() { return targetBindingId; } public String getTargetFieldCode() { return targetFieldCode; } public String getSourceTemplateCode() { return sourceTemplateCode; } } static ElnCrossTemplateSnapshotResolver none() { return (tenantId, testWorkItemId, bindings) -> Collections.emptyMap(); } }