This is an automated email from the ASF dual-hosted git repository.

iluo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git


The following commit(s) were added to refs/heads/master by this push:
     new 713a3ea  refactor ScriptRouter: (#3404)
713a3ea is described below

commit 713a3ea96ded46ec54571a55d3370420f1e12455
Author: wanghbxxxx <[email protected]>
AuthorDate: Thu Jan 31 14:12:10 2019 +0800

    refactor ScriptRouter: (#3404)
    
    1, remove priority field, the same as super class
    2, remove getUrl method, the same as super class
    3, refactor constructor, extract method: getRule, getEngine
    4, refactor route, extract method: createBindings, getRoutedInvokers
---
 .../rpc/cluster/router/script/ScriptRouter.java    | 97 +++++++++++++---------
 1 file changed, 56 insertions(+), 41 deletions(-)

diff --git 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/script/ScriptRouter.java
 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/script/ScriptRouter.java
index 8169169..74ef98b 100644
--- 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/script/ScriptRouter.java
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/script/ScriptRouter.java
@@ -39,6 +39,7 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
 
 /**
  * ScriptRouter
@@ -51,61 +52,49 @@ public class ScriptRouter extends AbstractRouter {
 
     private final ScriptEngine engine;
 
-    private final int priority;
-
     private final String rule;
 
     public ScriptRouter(URL url) {
         this.url = url;
-        String type = url.getParameter(Constants.TYPE_KEY);
         this.priority = url.getParameter(Constants.PRIORITY_KEY, 0);
-        String rule = url.getParameterAndDecoded(Constants.RULE_KEY);
-        if (StringUtils.isEmpty(type)) {
-            type = Constants.DEFAULT_SCRIPT_TYPE_KEY;
-        }
-        if (StringUtils.isEmpty(rule)) {
-            throw new IllegalStateException("route rule can not be empty. 
rule:" + rule);
-        }
-        ScriptEngine engine = engines.get(type);
-        if (engine == null) {
-            engine = new ScriptEngineManager().getEngineByName(type);
-            if (engine == null) {
-                throw new IllegalStateException("unsupported route rule type: 
" + type + ", rule: " + rule);
-            }
-            engines.put(type, engine);
-        }
-        this.engine = engine;
-        this.rule = rule;
+        
+        engine = getEngine(url);
+        rule = getRule(url);
     }
 
-    @Override
-    public URL getUrl() {
-        return url;
+    /**
+     * get rule from url parameters.
+     */
+    private String getRule(URL url) {
+        String vRule = url.getParameterAndDecoded(Constants.RULE_KEY);
+        if (StringUtils.isEmpty(vRule)) {
+            throw new IllegalStateException("route rule can not be empty.");
+        }
+        return vRule;
+    }
+    
+    /**
+     * create ScriptEngine instance by type from url parameters, then cache it
+     */
+    private ScriptEngine getEngine(URL url) {
+        String type = url.getParameter(Constants.TYPE_KEY, 
Constants.DEFAULT_SCRIPT_TYPE_KEY);
+        
+        return engines.computeIfAbsent(type, t -> {
+            ScriptEngine scriptEngine = new 
ScriptEngineManager().getEngineByName(type);
+            if (scriptEngine == null) {
+                throw new IllegalStateException("unsupported route engine 
type: " + type);
+            }
+            return scriptEngine;
+        });
     }
 
     @Override
-    @SuppressWarnings("unchecked")
     public <T> List<Invoker<T>> route(List<Invoker<T>> invokers, URL url, 
Invocation invocation) throws RpcException {
         try {
-            List<Invoker<T>> invokersCopy = new ArrayList<>(invokers);
+            Bindings bindings = createBindings(invokers, invocation);
             Compilable compilable = (Compilable) engine;
-            Bindings bindings = engine.createBindings();
-            bindings.put("invokers", invokersCopy);
-            bindings.put("invocation", invocation);
-            bindings.put("context", RpcContext.getContext());
             CompiledScript function = compilable.compile(rule);
-            Object obj = function.eval(bindings);
-            if (obj instanceof Invoker[]) {
-                invokersCopy = Arrays.asList((Invoker<T>[]) obj);
-            } else if (obj instanceof Object[]) {
-                invokersCopy = new ArrayList<Invoker<T>>();
-                for (Object inv : (Object[]) obj) {
-                    invokersCopy.add((Invoker<T>) inv);
-                }
-            } else {
-                invokersCopy = (List<Invoker<T>>) obj;
-            }
-            return invokersCopy;
+            return getRoutedInvokers(function.eval(bindings));
         } catch (ScriptException e) {
             logger.error("route error, rule has been ignored. rule: " + rule + 
", method:" +
                     invocation.getMethodName() + ", url: " + 
RpcContext.getContext().getUrl(), e);
@@ -113,6 +102,32 @@ public class ScriptRouter extends AbstractRouter {
         }
     }
 
+    /**
+     * get routed invokers from result of script rule evaluation
+     */
+    @SuppressWarnings("unchecked")
+    protected <T> List<Invoker<T>> getRoutedInvokers(Object obj) {
+        if (obj instanceof Invoker[]) {
+            return Arrays.asList((Invoker<T>[]) obj);
+        } else if (obj instanceof Object[]) {
+            return Arrays.stream((Object[]) obj).map(item -> (Invoker<T>) 
item).collect(Collectors.toList());
+        } else {
+            return (List<Invoker<T>>) obj;
+        }
+    }
+
+    /**
+     * create bindings for script engine
+     */
+    private <T> Bindings createBindings(List<Invoker<T>> invokers, Invocation 
invocation) {
+        Bindings bindings = engine.createBindings();
+        // create a new List of invokers
+        bindings.put("invokers", new ArrayList<>(invokers));
+        bindings.put("invocation", invocation);
+        bindings.put("context", RpcContext.getContext());
+        return bindings;
+    }
+
     @Override
     public boolean isRuntime() {
         return this.url.getParameter(Constants.RUNTIME_KEY, false);

Reply via email to