import { Dao, Job, Service } from './entities'; import { PluginManager } from './plugin.manager'; import { Constructable, Hashtable } from './structure'; export abstract class Plugin { // @ts-ignore public path: string; protected jobClasses: Array> = []; protected jobs: Hashtable = {}; protected daoClasses: Array>> = []; protected daos: Hashtable> = {}; protected serviceClasses: Array> = []; protected services: Hashtable = {}; constructor(protected pluginManager: PluginManager) {} public abstract getPluginId(): string; public abstract init(): void; public invoke(): void { for (const JobClass of this.jobClasses) { const JobConstructor = JobClass as Constructable; const jobInstance = new JobConstructor(this.pluginManager); this.jobs[jobInstance.getJobId()] = jobInstance; } for (const DaoClass of this.daoClasses) { const DaoConstructor = DaoClass as Constructable>; const daoInstance = this.invokeDao(DaoConstructor); this.daos[daoInstance.getDaoId()] = daoInstance; } for (const ServiceClass of this.serviceClasses) { const ServiceConstructor = ServiceClass as Constructable; const serviceInstance = new ServiceConstructor(this.pluginManager); this.services[serviceInstance.getServiceId()] = serviceInstance; } } public registerDao>(daoClass: Constructable): void { this.daoClasses.push(daoClass); } public async getDaos() { return this.daos; } public registerJob(jobClass: Constructable): void { this.jobClasses.push(jobClass); } public getJobs() { return this.jobs; } public registerService(serviceClass: Constructable): void { this.serviceClasses.push(serviceClass); } public getServices() { return this.services; } protected invokeDao(DaoConstructor: Constructable>): Dao { return new DaoConstructor(); } }