苏州瑞玛APS项目web后台
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.

114 lines
3.5 KiB

  1. // Copyright (c) Shenyang Leading Edge Intelligent Technology Co., Ltd. All rights reserved.
  2. package container
  3. import (
  4. "errors"
  5. "fmt"
  6. "leit.com/LAPP_CHEERSSON_BACKEND/global"
  7. "sync"
  8. )
  9. // 默认会话管理器
  10. // @Implement leit.com/LAPP_CHEERSSON_BACKEND/container/InformationManager
  11. type DefaultSessionManager struct {
  12. // 组件信息管理器
  13. informationManager InformationManager
  14. // 事务句柄工厂
  15. transactionHandlerFactory TransactionHandlerFactory
  16. // 同步锁
  17. locker sync.RWMutex
  18. // 用户会话映射: map[用户标识]会话
  19. user2SessionMapping map[string]*Session
  20. // 会话映射: map[会话标识]会话
  21. sessionMapping map[string]*Session
  22. }
  23. // 创建默认会话管理器
  24. // 参数:
  25. // 1.组件信息管理器
  26. // 2.事务句柄工厂
  27. // 返回值:
  28. // 1.默认会话管理器
  29. // 异常:
  30. // 1.组件信息管理器不能为空
  31. // 2.事务句柄工厂不能为空
  32. func NewDefaultSessionManager(informationManager InformationManager, transactionHandlerFactory TransactionHandlerFactory) *DefaultSessionManager {
  33. if informationManager == nil {
  34. panic(fmt.Sprintf("组件信息管理器不能为空!"))
  35. }
  36. if transactionHandlerFactory == nil {
  37. panic(fmt.Sprintf("事务句柄工厂不能为空!"))
  38. }
  39. return &DefaultSessionManager{informationManager, transactionHandlerFactory, sync.RWMutex{}, make(map[string]*Session, 100), make(map[string]*Session, 100)}
  40. }
  41. // @Reference leit.com/LAPP_CHEERSSON_BACKEND/container/SessionManager.ClearSession
  42. func (manager *DefaultSessionManager) ClearSession(sessionId string) {
  43. manager.locker.Lock()
  44. defer manager.locker.Unlock()
  45. session, ok := manager.sessionMapping[sessionId]
  46. if !ok {
  47. return
  48. }
  49. delete(manager.sessionMapping, sessionId)
  50. delete(manager.user2SessionMapping, session.user.UserId)
  51. }
  52. // @Reference leit.com/LAPP_CHEERSSON_BACKEND/container/SessionManager.GetSession
  53. func (manager *DefaultSessionManager) GetSession(sessionId string, user *global.User) (*Session, error) {
  54. if sessionId == "" {
  55. return nil, errors.New(fmt.Sprintf("会话标识不能为空!"))
  56. }
  57. if user == nil {
  58. return nil, errors.New(fmt.Sprintf("用户信息不能为空!"))
  59. }
  60. userId := user.UserId
  61. if userId == "" {
  62. return nil, errors.New(fmt.Sprintf("用户标识不能为空!"))
  63. }
  64. manager.locker.Lock()
  65. defer manager.locker.Unlock()
  66. session, ok := manager.sessionMapping[sessionId]
  67. if !ok {
  68. existingSession, ok := manager.user2SessionMapping[userId]
  69. if ok {
  70. delete(manager.user2SessionMapping, userId)
  71. delete(manager.sessionMapping, existingSession.SessionId())
  72. }
  73. sessionContext, err := NewSessionContext(user, manager.transactionHandlerFactory)
  74. if err != nil {
  75. return nil, err
  76. }
  77. handlerManager, err := manager.buildHandlerManager(sessionContext)
  78. if err != nil {
  79. return nil, err
  80. }
  81. session, err = NewSession(sessionContext, sessionId, handlerManager)
  82. if err != nil {
  83. return nil, err
  84. }
  85. manager.user2SessionMapping[userId] = session
  86. manager.sessionMapping[sessionId] = session
  87. }
  88. return session, nil
  89. }
  90. // 创建组件句柄管理器
  91. // 参数:
  92. // 1.会话上下文
  93. // 返回值:
  94. // 1.组件句柄管理器
  95. // 2.错误
  96. func (manager *DefaultSessionManager) buildHandlerManager(sessionContext *SessionContext) (*HandlerManager, error) {
  97. items := manager.informationManager.Items()
  98. handlerMapping := make(map[Interface]ComponentHandler, len(items))
  99. for _, component := range items {
  100. handler, err := component.BuildHandler(sessionContext)
  101. if err != nil {
  102. return nil, err
  103. }
  104. handlerMapping[component.Interface()] = handler
  105. }
  106. return NewHandlerManager(handlerMapping)
  107. }