XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEServerManager

【Java】我的世界XFE服务器管理器

公开
关注 0 Fork 0 Star 0
UTF-8
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;
    }
}