public static MeshRuleCache build()

in dubbo-cluster-extensions/dubbo-cluster-router-mesh/src/main/java/org/apache/dubbo/rpc/cluster/router/mesh/route/MeshRuleCache.java [90:142]


    public static <T> MeshRuleCache<T> build(
            String protocolServiceKey,
            BitList<Invoker<T>> invokers,
            Map<String, VsDestinationGroup> vsDestinationGroupMap) {
        if (CollectionUtils.isNotEmptyMap(vsDestinationGroupMap)) {
            BitList<Invoker<T>> unmatchedInvokers = new BitList<>(invokers.getOriginList(), true);
            Map<String, Map<String, BitList<Invoker<T>>>> totalSubsetMap = new HashMap<>();

            for (Invoker<T> invoker : invokers) {
                String remoteApplication = invoker.getUrl().getRemoteApplication();
                if (StringUtils.isEmpty(remoteApplication) || INVALID_APP_NAME.equals(remoteApplication)) {
                    unmatchedInvokers.add(invoker);
                    continue;
                }
                VsDestinationGroup vsDestinationGroup = vsDestinationGroupMap.get(remoteApplication);
                if (vsDestinationGroup == null) {
                    unmatchedInvokers.add(invoker);
                    continue;
                }
                Map<String, BitList<Invoker<T>>> subsetMap =
                        totalSubsetMap.computeIfAbsent(remoteApplication, (k) -> new HashMap<>());

                boolean matched = false;
                for (DestinationRule destinationRule : vsDestinationGroup.getDestinationRuleList()) {
                    DestinationRuleSpec destinationRuleSpec = destinationRule.getSpec();
                    List<Subset> subsetList = destinationRuleSpec.getSubsets();
                    for (Subset subset : subsetList) {
                        String subsetName = subset.getName();
                        List<Invoker<T>> subsetInvokers = subsetMap.computeIfAbsent(
                                subsetName, (k) -> new BitList<>(invokers.getOriginList(), true));

                        Map<String, String> labels = subset.getLabels();
                        if (isLabelMatch(invoker.getUrl(), protocolServiceKey, labels)) {
                            subsetInvokers.add(invoker);
                            matched = true;
                        }
                    }
                }
                if (!matched) {
                    unmatchedInvokers.add(invoker);
                }
            }

            return new MeshRuleCache<>(
                    new LinkedList<>(vsDestinationGroupMap.keySet()),
                    Collections.unmodifiableMap(vsDestinationGroupMap),
                    Collections.unmodifiableMap(totalSubsetMap),
                    unmatchedInvokers);
        } else {
            return new MeshRuleCache<>(
                    Collections.emptyList(), Collections.emptyMap(), Collections.emptyMap(), invokers);
        }
    }