蓝眼网盘定制版
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.

220 lines
4.8 KiB

package rest
8 years ago
import (
"fmt"
"github.com/eyebluecn/tank/code/config"
"github.com/eyebluecn/tank/code/core"
"github.com/eyebluecn/tank/code/tool/cache"
8 years ago
"github.com/jinzhu/gorm"
"net/http"
8 years ago
"reflect"
)
//上下文,管理数据库连接,管理所有路由请求,管理所有的单例component.
type Context struct {
//数据库连接
db *gorm.DB
//session缓存
SessionCache *cache.Table
8 years ago
//各类的Bean Map。这里面是包含ControllerMap中所有元素
BeanMap map[string]core.IBean
8 years ago
//只包含了Controller的map
ControllerMap map[string]core.IController
//处理所有路由请求
Router *Router
8 years ago
}
//初始化上下文
func (this *Context) Init() {
8 years ago
//创建一个用于存储session的缓存。
this.SessionCache = cache.NewTable()
8 years ago
//初始化Map
this.BeanMap = make(map[string]core.IBean)
this.ControllerMap = make(map[string]core.IController)
8 years ago
//注册各类Beans.在这个方法里面顺便把Controller装入ControllerMap中去。
this.registerBeans()
8 years ago
//初始化每个bean.
this.initBeans()
8 years ago
//初始化Router. 这个方法要在Bean注册好了之后才能。
this.Router = NewRouter()
//如果数据库信息配置好了,就直接打开数据库连接 同时执行Bean的ConfigPost方法
this.InstallOk()
8 years ago
}
//获取数据库对象
func (this *Context) GetDB() *gorm.DB {
return this.db
}
func (this *Context) GetSessionCache() *cache.Table {
return this.SessionCache
}
func (this *Context) GetControllerMap() map[string]core.IController {
return this.ControllerMap
}
func (this *Context) Cleanup() {
for _, bean := range this.BeanMap {
bean.Cleanup()
}
}
//响应http的能力
func (this *Context) ServeHTTP(writer http.ResponseWriter, request *http.Request) {
this.Router.ServeHTTP(writer, request)
}
func (this *Context) OpenDb() {
var err error = nil
this.db, err = gorm.Open("mysql", config.CONFIG.MysqlUrl)
if err != nil {
core.LOGGER.Panic("failed to connect mysql database")
}
//是否打开sql日志(在调试阶段可以打开,以方便查看执行的SQL)
this.db.LogMode(false)
}
func (this *Context) CloseDb() {
if this.db != nil {
err := this.db.Close()
if err != nil {
core.LOGGER.Error("关闭数据库连接出错 %s", err.Error())
}
}
}
8 years ago
//注册一个Bean
func (this *Context) registerBean(bean core.IBean) {
8 years ago
typeOf := reflect.TypeOf(bean)
typeName := typeOf.String()
if element, ok := bean.(core.IBean); ok {
8 years ago
err := fmt.Sprintf("【%s】已经被注册了,跳过。", typeName)
if _, ok := this.BeanMap[typeName]; ok {
core.LOGGER.Error(fmt.Sprintf(err))
8 years ago
} else {
this.BeanMap[typeName] = element
//看看是不是controller类型,如果是,那么单独放在ControllerMap中。
if controller, ok1 := bean.(core.IController); ok1 {
8 years ago
this.ControllerMap[typeName] = controller
}
}
} else {
core.LOGGER.Panic("注册的【%s】不是Bean类型。", typeName)
8 years ago
}
}
//注册各个Beans
func (this *Context) registerBeans() {
//alien
this.registerBean(new(AlienController))
this.registerBean(new(AlienService))
8 years ago
//dashboard
this.registerBean(new(DashboardController))
this.registerBean(new(DashboardDao))
this.registerBean(new(DashboardService))
8 years ago
//downloadToken
this.registerBean(new(DownloadTokenDao))
//imageCache
this.registerBean(new(ImageCacheController))
this.registerBean(new(ImageCacheDao))
this.registerBean(new(ImageCacheService))
//install
this.registerBean(new(InstallController))
8 years ago
//matter
this.registerBean(new(MatterController))
this.registerBean(new(MatterDao))
this.registerBean(new(MatterService))
//preference
this.registerBean(new(PreferenceController))
this.registerBean(new(PreferenceDao))
this.registerBean(new(PreferenceService))
//footprint
this.registerBean(new(FootprintController))
this.registerBean(new(FootprintDao))
this.registerBean(new(FootprintService))
8 years ago
//session
this.registerBean(new(SessionDao))
this.registerBean(new(SessionService))
8 years ago
//uploadToken
this.registerBean(new(UploadTokenDao))
//user
this.registerBean(new(UserController))
this.registerBean(new(UserDao))
this.registerBean(new(UserService))
8 years ago
//webdav
this.registerBean(new(DavController))
this.registerBean(new(DavService))
8 years ago
}
//从Map中获取某个Bean.
func (this *Context) GetBean(bean core.IBean) core.IBean {
8 years ago
typeOf := reflect.TypeOf(bean)
typeName := typeOf.String()
if val, ok := this.BeanMap[typeName]; ok {
return val
} else {
core.LOGGER.Panic("【%s】没有注册。", typeName)
return nil
8 years ago
}
}
//初始化每个Bean
func (this *Context) initBeans() {
for _, bean := range this.BeanMap {
bean.Init()
8 years ago
}
}
//系统如果安装好了就调用这个方法。
func (this *Context) InstallOk() {
if config.CONFIG.Installed {
this.OpenDb()
for _, bean := range this.BeanMap {
bean.Bootstrap()
}
}
8 years ago
}
//销毁的方法
func (this *Context) Destroy() {
this.CloseDb()
}