From b30bea64add5a48814975e95f6cd382918305e91 Mon Sep 17 00:00:00 2001
From: Patrick <dreamlike.sky@foxmail.com>
Date: Sat, 11 Apr 2020 11:41:04 +0800
Subject: [PATCH] Merge remote-tracking branch 'upstream/feature/dubbo-2.7.5'
 into align-2.7.5

# Conflicts:
#	common/observer/event_listener.go
#	registry/event.go
#	registry/service_discovery.go
---
 common/constant/key.go        |  1 +
 common/observer/event.go      | 18 ++++++-------
 registry/event.go             | 49 +++++++++++++----------------------
 registry/event_listener.go    | 26 +++++++++++++++++++
 registry/service_discovery.go | 10 ++-----
 5 files changed, 56 insertions(+), 48 deletions(-)

diff --git a/common/constant/key.go b/common/constant/key.go
index 1479af230..16986c742 100644
--- a/common/constant/key.go
+++ b/common/constant/key.go
@@ -40,6 +40,7 @@ const (
 	TOKEN_KEY              = "token"
 	LOCAL_ADDR             = "local-addr"
 	REMOTE_ADDR            = "remote-addr"
+	PATH_SEPARATOR         = "/"
 	DUBBO_KEY              = "dubbo"
 	RELEASE_KEY            = "release"
 	ANYHOST_KEY            = "anyhost"
diff --git a/common/observer/event.go b/common/observer/event.go
index d63d7836b..8c3362fee 100644
--- a/common/observer/event.go
+++ b/common/observer/event.go
@@ -36,31 +36,31 @@ type Event interface {
 	GetTimestamp() time.Time
 }
 
-// baseEvent is the base implementation of Event
+// BaseEvent is the base implementation of Event
 // You should never use it directly
 type BaseEvent struct {
-	source    interface{}
-	timestamp time.Time
+	Source    interface{}
+	Timestamp time.Time
 }
 
 // GetSource return the source
 func (b *BaseEvent) GetSource() interface{} {
-	return b.source
+	return b.Source
 }
 
-// GetTimestamp return the timestamp when the event is created
+// GetTimestamp return the Timestamp when the event is created
 func (b *BaseEvent) GetTimestamp() time.Time {
-	return b.timestamp
+	return b.Timestamp
 }
 
 // String return a human readable string representing this event
 func (b *BaseEvent) String() string {
-	return fmt.Sprintf("baseEvent[source = %#v]", b.source)
+	return fmt.Sprintf("BaseEvent[source = %#v]", b.Source)
 }
 
 func newBaseEvent(source interface{}) *BaseEvent {
 	return &BaseEvent{
-		source:    source,
-		timestamp: time.Now(),
+		Source:    source,
+		Timestamp: time.Now(),
 	}
 }
diff --git a/registry/event.go b/registry/event.go
index 3a7d60695..94ada0cc8 100644
--- a/registry/event.go
+++ b/registry/event.go
@@ -19,6 +19,7 @@ package registry
 
 import (
 	"fmt"
+	"github.com/apache/dubbo-go/common/observer"
 	"math/rand"
 	"time"
 )
@@ -47,40 +48,26 @@ func (e ServiceEvent) String() string {
 	return fmt.Sprintf("ServiceEvent{Action{%s}, Path{%s}}", e.Action, e.Service)
 }
 
-// Event is align with Event interface in Java.
-// it's the top abstraction
-// Align with 2.7.5
-type Event interface {
-	fmt.Stringer
-	GetSource() interface{}
-	GetTimestamp() time.Time
+// ServiceInstancesChangedEvent represents service instances make some changing
+type ServiceInstancesChangedEvent struct {
+	observer.BaseEvent
+	ServiceName string
+	Instances   []ServiceInstance
 }
 
-// baseEvent is the base implementation of Event
-// You should never use it directly
-type baseEvent struct {
-	source    interface{}
-	timestamp time.Time
+// String return the description of the event
+func (s *ServiceInstancesChangedEvent) String() string {
+	return fmt.Sprintf("ServiceInstancesChangedEvent[source=%s]", s.ServiceName)
 }
 
-// GetSource return the source
-func (b *baseEvent) GetSource() interface{} {
-	return b.source
-}
-
-// GetTimestamp return the timestamp when the event is created
-func (b *baseEvent) GetTimestamp() time.Time {
-	return b.timestamp
-}
-
-// String return a human readable string representing this event
-func (b *baseEvent) String() string {
-	return fmt.Sprintf("baseEvent[source = %#v]", b.source)
-}
-
-func newBaseEvent(source interface{}) *baseEvent {
-	return &baseEvent{
-		source:    source,
-		timestamp: time.Now(),
+// NewServiceInstancesChangedEvent will create the ServiceInstanceChangedEvent instance
+func NewServiceInstancesChangedEvent(serviceName string, instances []ServiceInstance) *ServiceInstancesChangedEvent {
+	return &ServiceInstancesChangedEvent{
+		BaseEvent: observer.BaseEvent{
+			Source:    serviceName,
+			Timestamp: time.Now(),
+		},
+		ServiceName: serviceName,
+		Instances:   instances,
 	}
 }
diff --git a/registry/event_listener.go b/registry/event_listener.go
index e112325ca..0aaa081a4 100644
--- a/registry/event_listener.go
+++ b/registry/event_listener.go
@@ -16,3 +16,29 @@
  */
 
 package registry
+
+import (
+	"reflect"
+)
+
+import (
+	"github.com/apache/dubbo-go/common/observer"
+)
+
+// TODO (implement ConditionalEventListener)
+type ServiceInstancesChangedListener struct {
+	ServiceName string
+	observer.EventListener
+}
+
+func (sicl *ServiceInstancesChangedListener) OnEvent(e observer.Event) error {
+	return nil
+}
+
+func (sicl *ServiceInstancesChangedListener) GetPriority() int {
+	return -1
+}
+
+func (sicl *ServiceInstancesChangedListener) GetEventType() reflect.Type {
+	return reflect.TypeOf(&ServiceInstancesChangedEvent{})
+}
diff --git a/registry/service_discovery.go b/registry/service_discovery.go
index b7731d6b0..a8228a4ab 100644
--- a/registry/service_discovery.go
+++ b/registry/service_discovery.go
@@ -26,12 +26,6 @@ import (
 	gxpage "github.com/dubbogo/gost/page"
 )
 
-import (
-	"github.com/apache/dubbo-go/common"
-	"github.com/apache/dubbo-go/common/observer/event"
-	eventlistener "github.com/apache/dubbo-go/registry/listener"
-)
-
 const DefaultPageSize = 100
 
 type ServiceDiscovery interface {
@@ -79,7 +73,7 @@ type ServiceDiscovery interface {
 	// ----------------- event ----------------------
 	// AddListener adds a new ServiceInstancesChangedListener
 	// see addServiceInstancesChangedListener in Java
-	AddListener(listener *eventlistener.ServiceInstancesChangedListener) error
+	AddListener(listener *ServiceInstancesChangedListener) error
 
 	// DispatchEventByServiceName dispatches the ServiceInstancesChangedEvent to service instance whose name is serviceName
 	DispatchEventByServiceName(serviceName string) error
@@ -88,5 +82,5 @@ type ServiceDiscovery interface {
 	DispatchEventForInstances(serviceName string, instances []ServiceInstance) error
 
 	// DispatchEvent dispatches the event
-	DispatchEvent(event *event.ServiceInstancesChangedEvent) error
+	DispatchEvent(event *ServiceInstancesChangedEvent) error
 }
-- 
GitLab