| /*
|
| * Copyright 1999-2011 Alibaba Group.
|
| *
|
| * Licensed 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 com.alibaba.dubbo.rpc.cluster.router; |
| |
| import java.io.File; |
| import java.io.FileReader; |
| import java.io.IOException; |
| |
| import com.alibaba.dubbo.common.Extension; |
| import com.alibaba.dubbo.common.URL; |
| import com.alibaba.dubbo.common.utils.IOUtils; |
| import com.alibaba.dubbo.rpc.RpcConstants; |
| import com.alibaba.dubbo.rpc.cluster.Router; |
| import com.alibaba.dubbo.rpc.cluster.RouterFactory; |
| |
| @Extension(FileRouterFactory.NAME) |
| public class FileRouterFactory implements RouterFactory { |
| |
| public static final String NAME = "file"; |
| |
| private RouterFactory routerFactory; |
| |
| public void setRouterFactory(RouterFactory routerFactory) { |
| this.routerFactory = routerFactory; |
| } |
| |
| public Router getRouter(URL url) { |
| try { |
| // File URL 转换成 其它Route URL,然后Load |
| // file:///d:/path/to/route.js?router=script ==> script:///d:/path/to/route.js?type=js&rule=<file-content> |
| String protocol = url.getParameter(RpcConstants.ROUTER_KEY, ScriptRouterFactory.NAME); // 将原类型转为协议 |
| String type = null; // 使用文件后缀做为类型 |
| String path = url.getPath(); |
| if (path != null) { |
| int i = path.lastIndexOf('.'); |
| if (i > 0) { |
| type = path.substring(i + 1); |
| } |
| } |
| String rule = IOUtils.read(new FileReader(new File(url.getAbsolutePath()))); |
| URL script = url.setProtocol(protocol).addParameter(RpcConstants.TYPE_KEY, type).addParameterAndEncoded(RpcConstants.RULE_KEY, rule); |
| |
| return routerFactory.getRouter(script); |
| } catch (IOException e) { |
| throw new IllegalStateException(e.getMessage(), e); |
| } |
| } |
| |
| } |