com.quancheng.saluki.core.grpc.router.internal.ScriptRouter.java Source code

Java tutorial

Introduction

Here is the source code for com.quancheng.saluki.core.grpc.router.internal.ScriptRouter.java

Source

/*
 * Copyright (c) 2017, Quancheng-ec.com All right reserved. This software is the
 * confidential and proprietary information of Quancheng-ec.com ("Confidential
 * Information"). You shall not disclose such Confidential Information and shall
 * use it only in accordance with the terms of the license agreement you entered
 * into with Quancheng-ec.com.
 */
package com.quancheng.saluki.core.grpc.router.internal;

import java.util.List;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.gson.Gson;
import com.quancheng.saluki.core.common.Constants;
import com.quancheng.saluki.core.common.GrpcURL;
import com.quancheng.saluki.core.grpc.router.GrpcRouter;

/**
 * @author shimingliu 201719 ?2:24:56
 * @version ScriptRouter.java, v 0.0.1 201719 ?2:24:56 shimingliu
 */
public class ScriptRouter extends GrpcRouter {

    private static final Logger log = LoggerFactory.getLogger(ScriptRouter.class);

    private ScriptEngine engine;

    public ScriptRouter(String type, String rule) {
        super(rule);
        engine = new ScriptEngineManager().getEngineByName(type);
        if (engine == null && StringUtils.equals(type, "javascript")) {
            engine = new ScriptEngineManager().getEngineByName("js");
        }
        if (engine == null) {
            throw new IllegalStateException("Unsupported route rule type: " + type + ", rule: " + rule);
        }
    }

    @Override
    protected void parseRouter() {
        // do nothing
    }

    @Override
    public boolean match(List<GrpcURL> providerUrls) {
        String rule = super.getRule();
        try {
            engine.eval(super.getRule());
            Invocable invocable = (Invocable) engine;
            GrpcURL refUrl = super.getRefUrl();
            Object arg = new Gson().fromJson(refUrl.getParameterAndDecoded(Constants.ARG_KEY), Object.class);
            Object obj = invocable.invokeFunction("route", refUrl.removeParameter(Constants.ARG_KEY), providerUrls,
                    arg);
            if (obj instanceof Boolean) {
                return (Boolean) obj;
            } else {
                return true;
            }
        } catch (ScriptException | NoSuchMethodException e) {
            log.error("route error , rule has been ignored. rule: " + rule + ", url: " + providerUrls, e);
            return true;
        }
    }

}