forked from cloudwan/gohan
/
extension.go
113 lines (99 loc) · 3.2 KB
/
extension.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
// Copyright (C) 2015 NTT Innovation Institute, Inc.
//
// Licensed 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 extension
import (
"fmt"
"github.com/cloudwan/gohan/schema"
)
//Environment is a interface for extension environment
type Environment interface {
LoadExtensionsForPath(extensions []*schema.Extension, path string) error
HandleEvent(event string, context map[string]interface{}) error
Clone() Environment
}
var manager *Manager
//Manager takes care of mapping schemas to Environments.
//This is a singleton class.
type Manager struct {
environments map[string]Environment
}
//RegisterEnvironment registers a new environment for the given schema ID
func (manager *Manager) RegisterEnvironment(schemaID string, env Environment) error {
if _, ok := manager.environments[schemaID]; ok {
return fmt.Errorf("Environment already registered for this schema")
}
manager.environments[schemaID] = env
return nil
}
//UnRegisterEnvironment removes an environment registered for the given schema ID
func (manager *Manager) UnRegisterEnvironment(schemaID string) error {
if _, ok := manager.environments[schemaID]; !ok {
return fmt.Errorf("No environment registered for this schema")
}
delete(manager.environments, schemaID)
return nil
}
//GetEnvironment returns the environment registered for the given schema ID
func (manager *Manager) GetEnvironment(schemaID string) (env Environment, ok bool) {
env, ok = manager.environments[schemaID]
if ok {
env = env.Clone()
}
return
}
//GetManager gets manager
func GetManager() *Manager {
if manager == nil {
manager = &Manager{
environments: map[string]Environment{},
}
}
return manager
}
//ClearManager clears manager
func ClearManager() {
manager = nil
}
// Error is created when a problem has occurred during event handling. It contains the information
// required to reraise the javascript exception that caused this error.
type Error struct {
error
ExceptionInfo map[string]interface{}
}
//HandleEvent handles the event in the given environment
func HandleEvent(context map[string]interface{}, environment Environment, event string) error {
if err := environment.HandleEvent(event, context); err != nil {
return err
}
exceptionInfoRaw, ok := context["exception"]
if !ok {
return nil
}
exceptionInfo, ok := exceptionInfoRaw.(map[string]interface{})
if !ok {
return fmt.Errorf("extension returned invalid error information")
}
exceptionMessage := context["exception_message"]
return Error{fmt.Errorf("%v", exceptionMessage), exceptionInfo}
}
//Errorf makes extension error
func Errorf(code int, name, message string) Error {
return Error{fmt.Errorf("%v", message),
map[string]interface{}{
"code": code,
"name": name,
"message": message,
}}
}