package com.xfestudio.xfeservermanager.core.policy;
import com.xfestudio.xfeservermanager.api.policy.PolicyRule;
import com.xfestudio.xfeservermanager.api.policy.PolicySnapshot;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
public record PolicyDiff(Set<String> addedRuleIds, Set<String> removedRuleIds, Set<String> changedRuleIds) {
public PolicyDiff {
addedRuleIds = Set.copyOf(addedRuleIds);
removedRuleIds = Set.copyOf(removedRuleIds);
changedRuleIds = Set.copyOf(changedRuleIds);
}
public static PolicyDiff between(PolicySnapshot before, PolicySnapshot after) {
Map<String, PolicyRule> beforeRules = index(before);
Map<String, PolicyRule> afterRules = index(after);
Set<String> added = new LinkedHashSet<>(afterRules.keySet());
added.removeAll(beforeRules.keySet());
Set<String> removed = new LinkedHashSet<>(beforeRules.keySet());
removed.removeAll(afterRules.keySet());
Set<String> changed = new LinkedHashSet<>();
for (String id : beforeRules.keySet()) {
if (afterRules.containsKey(id) && !beforeRules.get(id).equals(afterRules.get(id))) {
changed.add(id);
}
}
return new PolicyDiff(added, removed, changed);
}
private static Map<String, PolicyRule> index(PolicySnapshot snapshot) {
Map<String, PolicyRule> result = new LinkedHashMap<>();
snapshot.rules().forEach(rule -> result.put(rule.id(), rule));
return result;
}
}
package com.xfestudio.xfeservermanager.core.policy;
import com.xfestudio.xfeservermanager.api.policy.PolicyRule;
import com.xfestudio.xfeservermanager.api.policy.PolicySnapshot;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
public record PolicyDiff(Set<String> addedRuleIds, Set<String> removedRuleIds, Set<String> changedRuleIds) {
public PolicyDiff {
addedRuleIds = Set.copyOf(addedRuleIds);
removedRuleIds = Set.copyOf(removedRuleIds);
changedRuleIds = Set.copyOf(changedRuleIds);
}
public static PolicyDiff between(PolicySnapshot before, PolicySnapshot after) {
Map<String, PolicyRule> beforeRules = index(before);
Map<String, PolicyRule> afterRules = index(after);
Set<String> added = new LinkedHashSet<>(afterRules.keySet());
added.removeAll(beforeRules.keySet());
Set<String> removed = new LinkedHashSet<>(beforeRules.keySet());
removed.removeAll(afterRules.keySet());
Set<String> changed = new LinkedHashSet<>();
for (String id : beforeRules.keySet()) {
if (afterRules.containsKey(id) && !beforeRules.get(id).equals(afterRules.get(id))) {
changed.add(id);
}
}
return new PolicyDiff(added, removed, changed);
}
private static Map<String, PolicyRule> index(PolicySnapshot snapshot) {
Map<String, PolicyRule> result = new LinkedHashMap<>();
snapshot.rules().forEach(rule -> result.put(rule.id(), rule));
return result;
}
}