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

org.bdware.doip.cluster.util.RouteJoinUtil Maven / Gradle / Ivy

The newest version!
package org.bdware.doip.cluster.util;

import com.google.gson.JsonElement;
import com.google.gson.JsonNull;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.bdware.doip.cluster.callback.AsyncJSResultCallback;
import org.bdware.doip.cluster.callback.JoinCountCallback;
import org.bdware.doip.cluster.client.DoaClusterClient;
import org.bdware.doip.codec.doipMessage.DoipMessage;
import org.bdware.doip.endpoint.client.DoipMessageCallback;
import org.bdware.sc.bean.ForkInfo;
import org.bdware.sc.bean.JoinInfo;
import org.bdware.sc.bean.RouteInfo;
import org.bdware.sc.util.JsonUtil;
import wrp.jdk.nashorn.api.scripting.NashornScriptEngineUtil;

import java.util.Map;

public class RouteJoinUtil {
    public static final Logger LOGGER = LogManager.getLogger(RouteJoinUtil.class);

    public static  void route(DoipMessage doipParam, RouteInfo routeInfo, NashornScriptEngineUtil engineUtil, AsyncJSResultCallback asyncJSResultCallback) {
        try {
            // If the operation truly has routeInfo
            String[] BDRepoIDs = engineUtil.doipClusterUtil.getMembers();
            if (routeInfo != null) {
                if (routeInfo.useDefault == null) {
                    engineUtil.invokeFunctionWithObjectAsync(routeInfo.funcName, asyncJSResultCallback, doipParam);
                    return;
                }
                switch (routeInfo.useDefault) {
                    case byRequester:
                        int val = 0;
                        if (doipParam.credential != null && doipParam.credential.getSigner() != null) {
                            val = doipParam.credential.getSigner().hashCode() % BDRepoIDs.length;
                            while (val < 0 && BDRepoIDs.length > 0) {
                                val = val + BDRepoIDs.length;
                            }
                        }
                        asyncJSResultCallback.onResult(new String[]{BDRepoIDs[val]});
                        return;
                    case byArgHash:
                        val = JsonUtil.toJson(doipParam).hashCode();
                        val = val % BDRepoIDs.length;
                        while (val < 0) {
                            val += BDRepoIDs.length;
                        }
                        asyncJSResultCallback.onResult(new String[]{BDRepoIDs[val]});
                        return;
                    case byJsonPropHash:
                        JsonElement jo = tryLoadJsonProp(JsonUtil.parseObject(doipParam).getAsJsonObject(), routeInfo.param);
                        val = jo.toString().hashCode() % BDRepoIDs.length;
                        while (val < 0) {
                            val += BDRepoIDs.length;
                        }
                        asyncJSResultCallback.onResult(new String[]{BDRepoIDs[val]});
                        return;
                    default:
                        asyncJSResultCallback.onResult(BDRepoIDs);
                        return;
                }
                // 如果没有RouteInfo,默认随机选择一台机器发送
            } else {
                LOGGER.warn("Not RouteInfo in the function");
                String[] retVal = BDRepoIDs.length != 0 ? new String[]{BDRepoIDs[(int) (Math.random() * BDRepoIDs.length)]} : BDRepoIDs;
                asyncJSResultCallback.onResult(retVal);
                return;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        asyncJSResultCallback.onResult(null);
    }

    public static JsonElement tryLoadJsonProp(JsonObject routeInfoArg, String param) {
        try {
            if (routeInfoArg == null)
                return JsonNull.INSTANCE;
            JsonObject arg;
            if (routeInfoArg.isJsonPrimitive()) {
                arg = JsonUtil.parseString(routeInfoArg.getAsString()).getAsJsonObject();
            } else arg = routeInfoArg.getAsJsonObject();
            if (!param.contains(".")) {
                return arg.get(param);
            } else {
                String[] props = param.split("\\.");
                JsonElement result = arg;
                for (String str : props)
                    result = result.getAsJsonObject().get(str);
                return result;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return JsonNull.INSTANCE;
        }
    }

    public static void ddoSendMsgAndJoin(Map cookie, DoaClusterClient doaClusterClient, NashornScriptEngineUtil engineUtil, DoipMessage msg, JoinInfo joinInfo, ForkInfo forkInfo, String[] doidList, DoipMessageCallback cb, JsonObject appendixes) {
        JoinCountCallback callback = new JoinCountCallback(cookie, doaClusterClient, engineUtil, msg, joinInfo, forkInfo, doidList, cb, appendixes);
        getJoinCount(engineUtil, msg, joinInfo, doidList, callback);
    }


    public static void getJoinCount(NashornScriptEngineUtil engineUtil, DoipMessage msg, JoinInfo joinInfo, String[] doidList, JoinCountCallback callback) {
        try {
            if (joinInfo == null) {
                callback.onResult(doidList.length);
                return;
            }
            if (joinInfo.joinCountFuncName != null) {
                engineUtil.invokeFunctionWithObjectAsync(joinInfo.joinCountFuncName, callback, msg, doidList);
                return;
            }
            if (joinInfo.joinCount != 0) {
                callback.onResult(joinInfo.joinCount);
                return;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        callback.onResult(doidList.length);
        return;
    }

    public static int getJoinCount(String publicKey, NashornScriptEngineUtil engineUtil, JoinInfo joinInfo, int serversNum, JsonObject joinParams) {
        try {
            if (joinInfo == null) return serversNum;
            if (joinInfo.joinCountFuncName != null) {
                JsonElement requester = publicKey == null ? JsonNull.INSTANCE : new JsonPrimitive(publicKey);
                return engineUtil.invokeFunction(joinInfo.joinCountFuncName, Integer.class, joinParams, requester);
            }
            if (joinInfo.joinCount != 0) return joinInfo.joinCount;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return serversNum;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy