import RequestContext from "./RequestContext"; import SqlSession from "../session/SqlSession"; import { CONNECTION_END_TYPE, DEFAULT_CONTEXT, DEFAULT_HTTP_REQUEST, REQUEST_CONTEXT, SCAN_TYPE } from "../@types/types"; import CommonDao from "../database/CommonDao"; import {applicationContext} from "../context/ApplicationContext"; import {logger} from "../logger/Logger"; import {RequestSession} from "../session/RequestSession"; const DefaultApplicationRequest = {} const defaultRequestContext: RequestContext = new RequestContext(DefaultApplicationRequest, DEFAULT_CONTEXT); export class RequestContextHolder { public contextRequestMap: REQUEST_CONTEXT = { DEFAULT_CONTEXT: defaultRequestContext }; public getDefaultHttpRequest(): DEFAULT_HTTP_REQUEST { const req: DEFAULT_HTTP_REQUEST = {url:""}; return req; } public async requestIn(id: string, request?: any, bindTarget?:any[]) { if (!this.contextRequestMap[id]) { this.contextRequestMap[id] = new RequestContext(request, id); } try{ await this.contextRequestMap[id].getSqlSession().createDao(); }catch(e){ logger.error(e); } const processor: SCAN_TYPE = applicationContext.getTransactionProcessor(request); if (processor) { // const obj = new processor.CLASS(); // const obj = processor.CLASS.getInstance(); // await this.requestBind(id, [obj]); this.contextRequestMap[id].setTranctionProcesser(processor.CLASS.getInstance()); } if (bindTarget) { await this.requestBind(id, bindTarget); } } public async requestBind(id: string, obj: any[]) { if (obj && this.contextRequestMap[id]) { for (let i = 0; i < obj.length; i++) { const protos = [obj[i].prototype, Object.getPrototypeOf(obj[i]), Object.getPrototypeOf(obj[i]).__proto__]; protos.forEach((proto)=>{ if(!proto) return; Object.keys(proto).forEach((item) => { if (item.indexOf("__") == 0 && item.lastIndexOf("__") == item.length - 2 && proto[item].SCOPE == "request") { proto[item].INVOKE(id); } }); }); } } } public getRequestScopeBeans(id: string, className: string) { if (this.contextRequestMap[id]) { const ctx: RequestContext = this.contextRequestMap[id]; let ret: any; if (ctx.getScopeData(className)) { ret = ctx.getScopeData(className); } else { ret = applicationContext.getBean(className, {SCOPE: "request"}); ctx.addScopeData(className, ret); } return ret; } } public getSession(id: string): RequestSession | undefined { if (this.contextRequestMap[id]) { return this.contextRequestMap[id].session; } } public setSession(id: string, session:any) { if (!this.contextRequestMap[id] || !this.contextRequestMap[id].session) return; this.contextRequestMap[id].session.assignSessionObject(session) } public getSqlSession(id: string): SqlSession | null { if (this.contextRequestMap[id]) { return this.contextRequestMap[id].getSqlSession(); } return null; } public getDao(id: string) { if (this.contextRequestMap[id]) { const dao: CommonDao | null = this.contextRequestMap[id].getSqlSession().dao return dao; } return null; } public async destroy(id: string, mode?:CONNECTION_END_TYPE) { if (this.contextRequestMap[id]) { await this.contextRequestMap[id].destroy(mode); } delete this.contextRequestMap[id]; } public getRequestContext(id: string): RequestContext { return this.contextRequestMap[id]; } } export const requestHolder : RequestContextHolder = new RequestContextHolder();