Skip to content
Snippets Groups Projects
in_memory.go 3.09 KiB
Newer Older
vito.he's avatar
vito.he 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.
 */
package inmemory

import (
	"sync"
)

import (
	"github.com/emirpasic/gods/sets"
	"github.com/emirpasic/gods/sets/treeset"
)

import (
	"github.com/apache/dubbo-go/common"
	"github.com/apache/dubbo-go/metadata/service"
)

// InMemoryMetadataService is store and query the metadata info in memory when each service registry
type MetadataService struct {
	service.BaseMetadataService
	exportedServiceURLs   sync.Map
	subscribedServiceURLs sync.Map
}

// urlComparator: defined as utils.Comparator for treeset to compare the URL
func urlComparator(a, b interface{}) int {
	url1 := a.(common.URL)
	url2 := b.(common.URL)
	switch {
	case url1.String() > url2.String():
		return 1
	case url1.String() < url2.String():
		return -1
	default:
		return 0
	}
}

// addURL: add URL in memory
func addURL(targetMap sync.Map, url common.URL) bool {
	var (
		urlSet interface{}
		loaded bool
		lock   sync.RWMutex
	)
	if urlSet, loaded = targetMap.LoadOrStore(url.ServiceKey(), treeset.NewWith(urlComparator)); loaded {
		lock.RLock()
		if urlSet.(treeset.Set).Contains(url) {
			lock.RUnlock()
			return false
		}
		lock.RUnlock()
	}
	lock.Lock()
	urlSet.(treeset.Set).Add(url)
	lock.Unlock()
	return true
}

// name...
func removeURL(targetMap sync.Map, url common.URL) string {
	if value, loaded := targetMap.Load(url.ServiceKey()); loaded {
		value.(treeset.Set).Remove(url)
		if value.(treeset.Set).Empty() {
			targetMap.Delete(url.ServiceKey())
		}
	}
}

// ExportURL: store the in memory treeset
func (mts *MetadataService) ExportURL(url common.URL) bool {
	return addURL(mts.exportedServiceURLs, url)
}

func (MetadataService) UnexportURL(url common.URL) bool {
	panic("implement me")
}

func (mts *MetadataService) SubscribeURL(url common.URL) bool {
	return addURL(mts.subscribedServiceURLs, url)
}

func (MetadataService) UnsubscribeURL(url common.URL) bool {
	panic("implement me")
}

func (MetadataService) PublishServiceDefinition(url common.URL) {
	panic("implement me")
}

func (MetadataService) GetExportedURLs(serviceInterface string, group string, version string, protocol string) sets.Set {
	panic("implement me")
}

func (MetadataService) GetServiceDefinition(interfaceName string, version string, group string) string {
	panic("implement me")
}

func (MetadataService) GetServiceDefinitionByServiceKey(serviceKey string) string {
	panic("implement me")
}