github.com/mmatczuk/gohan@v0.0.0-20170206152520-30e45d9bdb69/extension/extension.go (about) 1 // Copyright (C) 2015 NTT Innovation Institute, Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 12 // implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 16 package extension 17 18 import ( 19 "fmt" 20 21 "github.com/cloudwan/gohan/schema" 22 ) 23 24 //Environment is a interface for extension environment 25 type Environment interface { 26 LoadExtensionsForPath(extensions []*schema.Extension, path string) error 27 HandleEvent(event string, context map[string]interface{}) error 28 Clone() Environment 29 } 30 31 var manager *Manager 32 33 //Manager takes care of mapping schemas to Environments. 34 //This is a singleton class. 35 type Manager struct { 36 environments map[string]Environment 37 } 38 39 //RegisterEnvironment registers a new environment for the given schema ID 40 func (manager *Manager) RegisterEnvironment(schemaID string, env Environment) error { 41 if _, ok := manager.environments[schemaID]; ok { 42 return fmt.Errorf("Environment already registered for this schema") 43 } 44 manager.environments[schemaID] = env 45 return nil 46 } 47 48 //UnRegisterEnvironment removes an environment registered for the given schema ID 49 func (manager *Manager) UnRegisterEnvironment(schemaID string) error { 50 if _, ok := manager.environments[schemaID]; !ok { 51 return fmt.Errorf("No environment registered for this schema") 52 } 53 delete(manager.environments, schemaID) 54 return nil 55 } 56 57 //GetEnvironment returns the environment registered for the given schema ID 58 func (manager *Manager) GetEnvironment(schemaID string) (env Environment, ok bool) { 59 env, ok = manager.environments[schemaID] 60 if ok { 61 env = env.Clone() 62 } 63 return 64 } 65 66 //GetManager gets manager 67 func GetManager() *Manager { 68 if manager == nil { 69 manager = &Manager{ 70 environments: map[string]Environment{}, 71 } 72 } 73 return manager 74 } 75 76 //ClearManager clears manager 77 func ClearManager() { 78 manager = nil 79 } 80 81 // Error is created when a problem has occurred during event handling. It contains the information 82 // required to reraise the javascript exception that caused this error. 83 type Error struct { 84 error 85 ExceptionInfo map[string]interface{} 86 } 87 88 //HandleEvent handles the event in the given environment 89 func HandleEvent(context map[string]interface{}, environment Environment, event string) error { 90 if err := environment.HandleEvent(event, context); err != nil { 91 return err 92 } 93 exceptionInfoRaw, ok := context["exception"] 94 if !ok { 95 return nil 96 } 97 exceptionInfo, ok := exceptionInfoRaw.(map[string]interface{}) 98 if !ok { 99 return fmt.Errorf("extension returned invalid error information") 100 } 101 exceptionMessage := context["exception_message"] 102 return Error{fmt.Errorf("%v", exceptionMessage), exceptionInfo} 103 } 104 105 //Errorf makes extension error 106 func Errorf(code int, name, message string) Error { 107 return Error{fmt.Errorf("%v", message), 108 map[string]interface{}{ 109 "code": code, 110 "name": name, 111 "message": message, 112 }} 113 }