Skip to content
Snippets Groups Projects
Commit 9d32b76d authored by 邹毅贤's avatar 邹毅贤
Browse files

add comment and testcase

parent 7187ea49
No related branches found
No related tags found
No related merge requests found
......@@ -22,6 +22,7 @@ import (
"net/url"
"strconv"
"strings"
"sync"
)
import (
......@@ -33,10 +34,14 @@ import (
"github.com/apache/dubbo-go/common/constant"
)
// FileConditionRouter Use for parse config file of condition router
type FileConditionRouter struct {
listenableRouter
parseOnce sync.Once
url common.URL
}
// NewFileConditionRouter Create file condition router instance with content ( from config file)
func NewFileConditionRouter(content []byte) (*FileConditionRouter, error) {
fileRouter := &FileConditionRouter{}
rule, err := Parse(string(content))
......@@ -53,18 +58,22 @@ func NewFileConditionRouter(content []byte) (*FileConditionRouter, error) {
return fileRouter, nil
}
// URL Return URL in file condition router n
func (f *FileConditionRouter) URL() common.URL {
routerRule := f.routerRule
rule := parseCondition(routerRule.Conditions)
return *common.NewURLWithOptions(
common.WithProtocol(constant.ROUTE_PROTOCOL),
common.WithIp(constant.ANYHOST_VALUE),
common.WithParams(url.Values{}),
common.WithParamsValue(constant.RouterForce, strconv.FormatBool(routerRule.Force)),
common.WithParamsValue(constant.RouterPriority, strconv.Itoa(routerRule.Priority)),
common.WithParamsValue(constant.RULE_KEY, base64.URLEncoding.EncodeToString([]byte(rule))),
common.WithParamsValue(constant.ROUTER_KEY, "condition"),
common.WithParamsValue(constant.CATEGORY_KEY, constant.ROUTERS_CATEGORY))
f.parseOnce.Do(func() {
routerRule := f.routerRule
rule := parseCondition(routerRule.Conditions)
f.url = *common.NewURLWithOptions(
common.WithProtocol(constant.CONDITION_ROUTE_PROTOCOL),
common.WithIp(constant.ANYHOST_VALUE),
common.WithParams(url.Values{}),
common.WithParamsValue(constant.RouterForce, strconv.FormatBool(routerRule.Force)),
common.WithParamsValue(constant.RouterPriority, strconv.Itoa(routerRule.Priority)),
common.WithParamsValue(constant.RULE_KEY, base64.URLEncoding.EncodeToString([]byte(rule))),
common.WithParamsValue(constant.ROUTER_KEY, constant.CONDITION_ROUTE_PROTOCOL),
common.WithParamsValue(constant.CATEGORY_KEY, constant.ROUTERS_CATEGORY))
})
return f.url
}
func parseCondition(conditions []string) string {
......
......@@ -45,3 +45,14 @@ func TestParseCondition(t *testing.T) {
condition := parseCondition(s)
assert.Equal(t, "a & c => b & d", condition)
}
func TestFileRouterURL(t *testing.T) {
router, e := NewFileConditionRouter([]byte(`priority: 1
force: true
conditions :
- "a => b"
- "c => d"`))
assert.Nil(t, e)
assert.NotNil(t, router)
assert.Equal(t, "condition://0.0.0.0:?category=routers&force=true&priority=1&router=condition&rule=YSAmIGMgPT4gYiAmIGQ%3D", router.URL().String())
}
......@@ -30,6 +30,7 @@ type RouterFactory interface {
NewRouter(*common.URL) (Router, error)
}
// RouterFactory Router create factory use for parse config file
type FIleRouterFactory interface {
// NewFileRouters Create file router with config file
NewFileRouter([]byte) (Router, error)
......
......@@ -90,22 +90,23 @@ const (
)
const (
APPLICATION_KEY = "application"
ORGANIZATION_KEY = "organization"
NAME_KEY = "name"
MODULE_KEY = "module"
APP_VERSION_KEY = "app.version"
OWNER_KEY = "owner"
ENVIRONMENT_KEY = "environment"
METHOD_KEY = "method"
METHOD_KEYS = "methods"
RULE_KEY = "rule"
RUNTIME_KEY = "runtime"
BACKUP_KEY = "backup"
ROUTERS_CATEGORY = "routers"
ROUTE_PROTOCOL = "route"
PROVIDERS_CATEGORY = "providers"
ROUTER_KEY = "router"
APPLICATION_KEY = "application"
ORGANIZATION_KEY = "organization"
NAME_KEY = "name"
MODULE_KEY = "module"
APP_VERSION_KEY = "app.version"
OWNER_KEY = "owner"
ENVIRONMENT_KEY = "environment"
METHOD_KEY = "method"
METHOD_KEYS = "methods"
RULE_KEY = "rule"
RUNTIME_KEY = "runtime"
BACKUP_KEY = "backup"
ROUTERS_CATEGORY = "routers"
ROUTE_PROTOCOL = "route"
CONDITION_ROUTE_PROTOCOL = "condition"
PROVIDERS_CATEGORY = "providers"
ROUTER_KEY = "router"
)
const (
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment