All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.hekate.rpc.internal.RpcUtils Maven / Gradle / Ivy

There is a newer version: 4.1.3
Show newest version
/*
 * Copyright 2020 The Hekate Project
 *
 * The Hekate Project licenses this file to you under the Apache License,
 * version 2.0 (the "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at:
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 */

package io.hekate.rpc.internal;

import io.hekate.cluster.ClusterNodeFilter;
import io.hekate.core.ServiceInfo;
import io.hekate.rpc.RpcInterfaceInfo;
import io.hekate.rpc.RpcMethodInfo;
import io.hekate.rpc.RpcService;
import io.hekate.rpc.internal.RpcProtocol.RpcCallResult;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

final class RpcUtils {
    private RpcUtils() {
        // No-op.
    }

    public static String versionProperty(RpcInterfaceInfo rpc) {
        return rpc.versionedName();
    }

    public static String taggedVersionProperty(RpcInterfaceInfo rpc, String tag) {
        return rpc.versionedName() + '#' + tag;
    }

    public static String methodProperty(RpcInterfaceInfo rpc, RpcMethodInfo method) {
        return versionProperty(rpc) + ':' + method.signature();
    }

    public static String taggedMethodProperty(RpcInterfaceInfo rpc, RpcMethodInfo method, String tag) {
        return taggedVersionProperty(rpc, tag) + ':' + method.signature();
    }

    public static ClusterNodeFilter filterFor(RpcInterfaceInfo type, String tag) {
        String versionProp;

        if (tag == null) {
            versionProp = versionProperty(type);
        } else {
            versionProp = taggedVersionProperty(type, tag);
        }

        return node -> {
            ServiceInfo service = node.service(RpcService.class);

            Integer minClientVer = service.intProperty(versionProp);

            return minClientVer != null && minClientVer <= type.version();
        };
    }

    static void mergeToMap(RpcProtocol from, Map to) {
        if (from instanceof RpcCallResult) {
            @SuppressWarnings("unchecked")
            Map part = (Map)((RpcCallResult)from).result();

            to.putAll(part);
        }
    }

    static void mergeToSet(RpcProtocol from, Set to) {
        if (from instanceof RpcCallResult) {
            @SuppressWarnings("unchecked")
            Collection part = (Collection)((RpcCallResult)from).result();

            to.addAll(part);
        }
    }

    static void mergeToList(RpcProtocol from, List to) {
        if (from instanceof RpcCallResult) {
            @SuppressWarnings("unchecked")
            Collection part = (Collection)((RpcCallResult)from).result();

            to.addAll(part);
        }
    }
}