goserver_sync/core/loader.go

105 lines
2.5 KiB
Go

package core
import (
"encoding/json"
"io"
"io/ioutil"
"path"
"mongo.games.com/goserver/core/logger"
)
// Package 功能包
// 只做初始化,不要依赖其它功能包
type Package interface {
Name() string
Init() error
io.Closer
}
type ConfigFileEncryptorHook interface {
IsCipherText([]byte) bool
Encrypt([]byte) []byte
Decrtypt([]byte) []byte
}
var packages = make(map[string]Package)
var packagesLoaded = make(map[string]bool)
var configFileEH ConfigFileEncryptorHook
func RegistePackage(p Package) {
packages[p.Name()] = p
}
func IsPackageRegisted(name string) bool {
if _, exist := packages[name]; exist {
return true
}
return false
}
func IsPackageLoaded(name string) bool {
if _, exist := packagesLoaded[name]; exist {
return true
}
return false
}
func RegisterConfigEncryptor(h ConfigFileEncryptorHook) {
configFileEH = h
}
func LoadPackages(configFile string) {
//logger.Logger.Infof("Build time is: %s", BuildTime())
switch path.Ext(configFile) {
case ".json":
fileBuff, err := ioutil.ReadFile(configFile)
if err != nil {
logger.Logger.Errorf("Error while reading config file %s: %s", configFile, err)
break
}
if configFileEH != nil {
if configFileEH.IsCipherText(fileBuff) {
fileBuff = configFileEH.Decrtypt(fileBuff)
}
}
var fileData interface{}
err = json.Unmarshal(fileBuff, &fileData)
if err != nil {
break
}
fileMap := fileData.(map[string]interface{})
for name, pkg := range packages {
if moduleData, ok := fileMap[name]; ok {
if data, ok := moduleData.(map[string]interface{}); ok {
modelBuff, _ := json.Marshal(data)
err = json.Unmarshal(modelBuff, &pkg)
if err != nil {
logger.Logger.Errorf("Error while unmarshalling JSON from config file %s: %s", configFile, err)
} else {
err = pkg.Init()
if err != nil {
logger.Logger.Errorf("Error while initializing package %s: %s", pkg.Name(), err)
} else {
packagesLoaded[pkg.Name()] = true
logger.Logger.Infof("package [%16s] load success", pkg.Name())
}
}
} else {
logger.Logger.Errorf("Package %v init data unmarshal failed.", pkg.Name())
}
} else {
logger.Logger.Errorf("Package %v init data not exist.", pkg.Name())
}
}
default:
panic("Unsupported config file: " + configFile)
}
}
func ClosePackages() {
for _, pkg := range packages {
err := pkg.Close()
if err != nil {
logger.Logger.Errorf("Error while closing package %s: %s", pkg.Name(), err)
}
}
}