Skip to content
Snippets Groups Projects
static_directory.go 2.63 KiB
Newer Older
AlexStocks's avatar
AlexStocks committed
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.
 */
fangyincheng's avatar
fangyincheng committed

邹毅贤's avatar
邹毅贤 committed
import (
邹毅贤's avatar
邹毅贤 committed
	perrors "github.com/pkg/errors"
)

import (
	"github.com/apache/dubbo-go/cluster/router/chain"
	"github.com/apache/dubbo-go/common"
	"github.com/apache/dubbo-go/protocol"
type staticDirectory struct {
	BaseDirectory
	invokers []protocol.Invoker
}

// NewStaticDirectory Create a new staticDirectory with invokers
func NewStaticDirectory(invokers []protocol.Invoker) *staticDirectory {
haohongfan's avatar
haohongfan committed
	var url *common.URL

	if len(invokers) > 0 {
		url = invokers[0].GetUrl()
	}
haohongfan's avatar
haohongfan committed
		BaseDirectory: NewBaseDirectory(url),

	dir.routerChain.SetInvokers(invokers)
	return dir
}

//for-loop invokers ,if all invokers is available ,then it means directory is available
func (dir *staticDirectory) IsAvailable() bool {
vito.he's avatar
vito.he committed
	if len(dir.invokers) == 0 {
		return false
	}
	for _, invoker := range dir.invokers {
		if !invoker.IsAvailable() {
			return false
		}
	}
	return true
}

// List List invokers
aliiohs's avatar
aliiohs committed
func (dir *staticDirectory) List(invocation protocol.Invocation) []protocol.Invoker {
邹毅贤's avatar
邹毅贤 committed
	l := len(dir.invokers)
	invokers := make([]protocol.Invoker, l)
邹毅贤's avatar
邹毅贤 committed
	copy(invokers, dir.invokers)
邹毅贤's avatar
邹毅贤 committed
	routerChain := dir.RouterChain()
aliiohs's avatar
aliiohs committed

邹毅贤's avatar
邹毅贤 committed
	if routerChain == nil {
		return invokers
aliiohs's avatar
aliiohs committed
	}
邹毅贤's avatar
邹毅贤 committed
	dirUrl := dir.GetUrl()
haohongfan's avatar
haohongfan committed
	return routerChain.Route(dirUrl, invocation)
// Destroy Destroy
func (dir *staticDirectory) Destroy() {
	dir.BaseDirectory.Destroy(func() {
		for _, ivk := range dir.invokers {
			ivk.Destroy()
		}
		dir.invokers = []protocol.Invoker{}
	})
}
邹毅贤's avatar
邹毅贤 committed

// BuildRouterChain build router chain by invokers
func (dir *staticDirectory) BuildRouterChain(invokers []protocol.Invoker) error {
	if len(invokers) == 0 {
		return perrors.Errorf("invokers == null")
	}
	url := invokers[0].GetUrl()
haohongfan's avatar
haohongfan committed
	routerChain, e := chain.NewRouterChain(url)
邹毅贤's avatar
邹毅贤 committed
	if e != nil {
		return e
	}
	routerChain.SetInvokers(dir.invokers)
邹毅贤's avatar
邹毅贤 committed
	dir.SetRouterChain(routerChain)
	return nil
}