ClaimTransitionPolicy.java
Browserlesbare Ansicht der unveränderten Java-Quelldatei. Die Originaldatei bleibt im Maven-Projekt erhalten.
Zuordnung
Policy / Domain Service
Quellcode
package com.seb4u.demo.claims.domain;
/**
* Entwurfsmuster: Policy / State Transition. Kapselt erlaubte Statuswechsel der Claim-Domain.
*/
import java.util.EnumMap;
import java.util.EnumSet;
import java.util.Map;
import java.util.Set;
public class ClaimTransitionPolicy {
private final Map<ClaimStatus, Set<ClaimStatus>> transitions = new EnumMap<>(ClaimStatus.class);
public ClaimTransitionPolicy() {
transitions.put(ClaimStatus.CREATED, EnumSet.of(ClaimStatus.DOCUMENTS_PENDING, ClaimStatus.DOCUMENTS_VERIFIED, ClaimStatus.REJECTED));
transitions.put(ClaimStatus.DOCUMENTS_PENDING, EnumSet.of(ClaimStatus.DOCUMENTS_VERIFIED, ClaimStatus.REJECTED));
transitions.put(ClaimStatus.DOCUMENTS_VERIFIED, EnumSet.of(ClaimStatus.COVERAGE_CHECKED, ClaimStatus.FRAUD_REVIEW_REQUIRED, ClaimStatus.REJECTED));
transitions.put(ClaimStatus.COVERAGE_CHECKED, EnumSet.of(ClaimStatus.APPROVAL_REQUIRED, ClaimStatus.REJECTED));
transitions.put(ClaimStatus.APPROVAL_REQUIRED, EnumSet.of(ClaimStatus.APPROVED, ClaimStatus.REJECTED, ClaimStatus.ESCALATED));
transitions.put(ClaimStatus.APPROVED, EnumSet.of(ClaimStatus.PAYMENT_RELEASED));
}
public void requireAllowed(ClaimStatus current, ClaimStatus next) {
if (!transitions.getOrDefault(current, Set.of()).contains(next)) {
throw new IllegalStateException("Illegal claim transition: " + current + " -> " + next);
}
}
}