/* * 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. */ package directory import ( 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 { var url *common.URL if len(invokers) > 0 { url = invokers[0].GetUrl() } dir := &staticDirectory{ BaseDirectory: NewBaseDirectory(url), invokers: invokers, } 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 { if len(dir.invokers) == 0 { return false } for _, invoker := range dir.invokers { if !invoker.IsAvailable() { return false } } return true } // List List invokers func (dir *staticDirectory) List(invocation protocol.Invocation) []protocol.Invoker { l := len(dir.invokers) invokers := make([]protocol.Invoker, l) copy(invokers, dir.invokers) routerChain := dir.RouterChain() if routerChain == nil { return invokers } dirUrl := dir.GetUrl() 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{} }) } // 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() routerChain, e := chain.NewRouterChain(url) if e != nil { return e } routerChain.SetInvokers(dir.invokers) dir.SetRouterChain(routerChain) return nil }