tank/code/support/tank_context.go
2020-07-12 20:52:20 +08:00

222 lines
4.7 KiB
Go

package support
import (
"github.com/eyebluecn/tank/code/core"
"github.com/eyebluecn/tank/code/rest"
"github.com/eyebluecn/tank/code/tool/cache"
"github.com/jinzhu/gorm"
"net/http"
"reflect"
)
type TankContext struct {
//db connection
db *gorm.DB
//session cache
SessionCache *cache.Table
//bean map.
BeanMap map[string]core.Bean
//controller map
ControllerMap map[string]core.Controller
//router
Router *TankRouter
}
func (this *TankContext) Init() {
//create session cache
this.SessionCache = cache.NewTable()
//init map
this.BeanMap = make(map[string]core.Bean)
this.ControllerMap = make(map[string]core.Controller)
//register beans. This method will put Controllers to ControllerMap.
this.registerBeans()
//init every bean.
this.initBeans()
//create and init router.
this.Router = NewRouter()
//if the application is installed. Bean's Bootstrap method will be invoked.
this.InstallOk()
}
func (this *TankContext) GetDB() *gorm.DB {
return this.db
}
func (this *TankContext) GetSessionCache() *cache.Table {
return this.SessionCache
}
func (this *TankContext) GetControllerMap() map[string]core.Controller {
return this.ControllerMap
}
func (this *TankContext) Cleanup() {
for _, bean := range this.BeanMap {
bean.Cleanup()
}
}
//can serve as http server.
func (this *TankContext) ServeHTTP(writer http.ResponseWriter, request *http.Request) {
this.Router.ServeHTTP(writer, request)
}
func (this *TankContext) OpenDb() {
var err error = nil
this.db, err = gorm.Open("mysql", core.CONFIG.MysqlUrl())
if err != nil {
core.LOGGER.Panic("failed to connect mysql database")
}
//whether open the db sql log. (only true when debug)
this.db.LogMode(false)
}
func (this *TankContext) CloseDb() {
if this.db != nil {
err := this.db.Close()
if err != nil {
core.LOGGER.Error("occur error when closing db %s", err.Error())
}
}
}
func (this *TankContext) registerBean(bean core.Bean) {
typeOf := reflect.TypeOf(bean)
typeName := typeOf.String()
if element, ok := bean.(core.Bean); ok {
if _, ok := this.BeanMap[typeName]; ok {
core.LOGGER.Error("%s has been registerd, skip", typeName)
} else {
this.BeanMap[typeName] = element
//if is controller type, put into ControllerMap
if controller, ok1 := bean.(core.Controller); ok1 {
this.ControllerMap[typeName] = controller
}
}
} else {
core.LOGGER.Panic("%s is not the Bean type", typeName)
}
}
func (this *TankContext) registerBeans() {
//alien
this.registerBean(new(rest.AlienController))
this.registerBean(new(rest.AlienService))
//bridge
this.registerBean(new(rest.BridgeDao))
this.registerBean(new(rest.BridgeService))
//dashboard
this.registerBean(new(rest.DashboardController))
this.registerBean(new(rest.DashboardDao))
this.registerBean(new(rest.DashboardService))
//downloadToken
this.registerBean(new(rest.DownloadTokenDao))
//imageCache
this.registerBean(new(rest.ImageCacheController))
this.registerBean(new(rest.ImageCacheDao))
this.registerBean(new(rest.ImageCacheService))
//install
this.registerBean(new(rest.InstallController))
//matter
this.registerBean(new(rest.MatterController))
this.registerBean(new(rest.MatterDao))
this.registerBean(new(rest.MatterService))
//preference
this.registerBean(new(rest.PreferenceController))
this.registerBean(new(rest.PreferenceDao))
this.registerBean(new(rest.PreferenceService))
//footprint
this.registerBean(new(rest.FootprintController))
this.registerBean(new(rest.FootprintDao))
this.registerBean(new(rest.FootprintService))
//session
this.registerBean(new(rest.SessionDao))
this.registerBean(new(rest.SessionService))
//share
this.registerBean(new(rest.ShareController))
this.registerBean(new(rest.ShareDao))
this.registerBean(new(rest.ShareService))
//uploadToken
this.registerBean(new(rest.UploadTokenDao))
//task
this.registerBean(new(rest.TaskService))
//user
this.registerBean(new(rest.UserController))
this.registerBean(new(rest.UserDao))
this.registerBean(new(rest.UserService))
//webdav
this.registerBean(new(rest.DavController))
this.registerBean(new(rest.DavService))
}
func (this *TankContext) GetBean(bean core.Bean) core.Bean {
typeOf := reflect.TypeOf(bean)
typeName := typeOf.String()
if val, ok := this.BeanMap[typeName]; ok {
return val
} else {
core.LOGGER.Panic("%s not registered", typeName)
return nil
}
}
func (this *TankContext) initBeans() {
for _, bean := range this.BeanMap {
bean.Init()
}
}
//if application installed. invoke this method.
func (this *TankContext) InstallOk() {
if core.CONFIG.Installed() {
this.OpenDb()
for _, bean := range this.BeanMap {
bean.Bootstrap()
}
}
}
func (this *TankContext) Destroy() {
this.CloseDb()
}