You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

161 lines
4.2 KiB

// Copyright (c) Shenyang Leading Edge Intelligent Technology Co., Ltd. All rights reserved.
package container
import (
"errors"
"fmt"
"reflect"
)
// 服务方法信息
type ServiceMethodInformation struct {
// 方法名
methodName string
// 方法类型
methodType Method
// 调用器代理创建器列表
callerBrokerBuilders []CallerBrokerBuilder
// Web解析器
webParser WebParser
}
// 创建服务方法信息
// 参数
// 1.方法元数据
// 返回值:
// 1.服务方法信息
// 异常
// 1.方法类型不能为空
// 2.方法名不能为空
// 3.返回值数量错误
// 4.最后一个返回值类型错误
func NewServiceMethodInformation(method *reflect.Method) *ServiceMethodInformation {
if method == nil {
panic(fmt.Sprintf("方法类型不能为空!"))
}
methodName := method.Name
methodType := method.Type
if methodName == "" {
panic(fmt.Sprintf("方法名不能为空!"))
}
if methodType.NumOut() < 1 || 2 < methodType.NumOut() {
panic(fmt.Sprintf("返回值数量错误! 返回值数量: %d", methodType.NumOut()))
}
if methodType.Out(methodType.NumOut()-1) != ErrorType {
panic(fmt.Sprintf("最后一个返回值类型错误! 类型:%s", methodType.Out(methodType.NumOut()-1)))
}
logBroker := NewLogBrokerBuilder("", methodName, "")
err := logBroker.Check(methodType)
if err != nil {
panic(err.Error())
}
return &ServiceMethodInformation{methodName, methodType, []CallerBrokerBuilder{logBroker}, nil}
}
// 获取方法名
// 返回值:
// 1.方法名
func (info *ServiceMethodInformation) MethodName() string {
return info.methodName
}
// 获取方法类型
// 返回值:
// 1.方法类型
func (info *ServiceMethodInformation) MethodType() Method {
return info.methodType
}
// 添加调用器代理创建器
// 参数
// 1.调用器代理创建器
// 异常
// 1.调用器代理创建器不能设置为空
func (info *ServiceMethodInformation) AppendBrokerBuilder(callerBrokerBuilder CallerBrokerBuilder) {
if callerBrokerBuilder == nil {
panic(fmt.Sprintf("调用器代理创建器不能设置为空!"))
}
if err := callerBrokerBuilder.Check(info.methodType); err != nil {
panic(err.Error())
}
info.callerBrokerBuilders = append(info.callerBrokerBuilders, callerBrokerBuilder)
}
// 获取Web解析器
// 返回值:
// 1.Web解析器
func (info *ServiceMethodInformation) WebParser() WebParser {
return info.webParser
}
// 设置Web解析器
// 参数
// 1.Web解析器
// 异常
// 1.Web解析器不能设置为空
// 2.已经设置Web解析器
func (info *ServiceMethodInformation) SetWebParser(value WebParser) {
if value == nil {
panic(fmt.Sprintf("Web解析器不能设置为空!"))
}
if info.webParser != nil {
panic(fmt.Sprintf("已经设置Web解析器!"))
}
info.webParser = value
}
// 设置调用器代理创建器和Web解析器
// 参数
// 1.创建器集合
// 返回值:
// 1.错误
// 异常
// 1.Web解析器不能设置为空
// 2.已经设置Web解析器
// 3.调用器代理创建器不能设置为空
func (info *ServiceMethodInformation) SetBuilders(builders BuilderSet) {
info.SetWebParser(builders.WebParser)
if builders.CallerBrokerBuilders != nil {
for _, brokerBuilder := range builders.CallerBrokerBuilders {
info.AppendBrokerBuilder(brokerBuilder)
}
}
}
// 创建方法句柄
// 参数
// 1.当前会话上下文
// 2.服务实例
// 返回值:
// 1.方法句柄
// 2.错误
func (info *ServiceMethodInformation) BuildHandler(sessionContext *SessionContext, instance Instance) (*ServiceMethodHandler, error) {
if sessionContext == nil {
return nil, errors.New(fmt.Sprintf("会话上下文不能为空!"))
}
caller, err := instance.GetCaller(info.methodName)
if err != nil {
return nil, err
}
if caller == nil {
return nil, errors.New(fmt.Sprintf("原始调用器不能为空!"))
}
for i := len(info.callerBrokerBuilders) - 1; i >= 0; i-- {
brokerBuilder := info.callerBrokerBuilders[i]
caller, err = brokerBuilder.Build(sessionContext, caller)
if err != nil {
return nil, err
}
if caller == nil {
return nil, errors.New(fmt.Sprintf("第%d个调用器不能为空!", i+1))
}
}
serviceMethodHandler, err := NewServiceMethodHandler(caller)
if err != nil {
return nil, err
}
return serviceMethodHandler, err
}