diff options
author | Marius David Wieschollek <passwords.public@mdns.eu> | 2020-12-02 02:08:30 +0300 |
---|---|---|
committer | Marius David Wieschollek <passwords.public@mdns.eu> | 2020-12-02 02:08:30 +0300 |
commit | 16ac1f3d221b49b09001bda1d5f1194c5a7cafdd (patch) | |
tree | 1b649deddff18be74f0bb309573283a7d122b202 /src/ClassLoader | |
parent | a64a98d9bee2db06a270f418692c81b417437baf (diff) |
Refactor class loading system
Signed-off-by: Marius David Wieschollek <passwords.public@mdns.eu>
Diffstat (limited to 'src/ClassLoader')
-rw-r--r-- | src/ClassLoader/BaseClassLoader.js | 95 | ||||
-rw-r--r-- | src/ClassLoader/DefaultClassLoader.js | 161 | ||||
-rw-r--r-- | src/ClassLoader/EnhancedClassLoader.js | 20 |
3 files changed, 276 insertions, 0 deletions
diff --git a/src/ClassLoader/BaseClassLoader.js b/src/ClassLoader/BaseClassLoader.js new file mode 100644 index 0000000..067536c --- /dev/null +++ b/src/ClassLoader/BaseClassLoader.js @@ -0,0 +1,95 @@ +import ObjectMerger from "../Utility/ObjectMerger"; + +export default class BaseClassLoader { + + constructor(classes = {}) { + this._classes = ObjectMerger.merge(this._getDefaultClasses(), classes); + this._instances = {}; + } + + + /** + * + * @param {String} name + * @param {*} properties + * @return {Object} + * @api + */ + getInstance(name, ...properties) { + if(!this._instances.hasOwnProperty(name) || !this._instances[name]) { + this._instances[name] = this.getClass(name, ...properties); + } + + return this._instances[name]; + } + + /** + * + * @param {String} name + * @param {Object} object + * @return {BaseClassLoader} + * @api + */ + setInstance(name, object) { + this._instances[name] = object; + + return this; + } + + /** + * + * @param {String} name + * @param {*} properties + * @return {Object} + */ + getClass(name, ...properties) { + let path = name.split('.'); + + if(!this._classes.hasOwnProperty(path[0]) || !this._classes[path[0]].hasOwnProperty(path[1])) { + throw new Error(`The class ${name} does not exist`); + } + + let creator = this._classes[path[0]][path[1]]; + if(creator instanceof Function) { + if(!creator.prototype || creator.hasOwnProperty('arguments') && creator.hasOwnProperty('caller')) { + return creator(...properties); + } + + return new creator(...properties); + } else { + return creator; + } + } + + /** + * + * @param {String} name + * @param {Object} constructor + * @return {BaseClassLoader} + * @api + */ + registerClass(name, constructor) { + let path = name.split('.'); + + if(!this._classes.hasOwnProperty(path[0])) { + this._classes[path[0]] = {}; + } + + if(!this._classes[path[0]].hasOwnProperty(path[1])) { + this._classes[path[1]] = {}; + } + + this._classes[path[0]][path[1]] = constructor; + + return this; + } + + /** + * + * @return {Object} + * @protected + */ + _getDefaultClasses() { + return {}; + } +}
\ No newline at end of file diff --git a/src/ClassLoader/DefaultClassLoader.js b/src/ClassLoader/DefaultClassLoader.js new file mode 100644 index 0000000..47ff54c --- /dev/null +++ b/src/ClassLoader/DefaultClassLoader.js @@ -0,0 +1,161 @@ +import PasswordRepository from "../Repositories/PasswordRepository"; +import FolderRepository from "../Repositories/FolderRepository"; +import TagRepository from "../Repositories/TagRepository"; +import SettingRepository from "../Repositories/SettingRepository"; +import PasswordCollection from "../Collection/PasswordCollection"; +import FolderCollection from "../Collection/FolderCollection"; +import CustomFieldCollection from "../Collection/CustomFieldCollection"; +import TagCollection from "../Collection/TagCollection"; +import SettingCollection from "../Collection/SettingCollection"; +import PasswordConverter from "../Converter/PasswordConverter"; +import FolderConverter from "../Converter/FolderConverter"; +import CustomFieldConverter from "../Converter/CustomFieldConverter"; +import TagConverter from "../Converter/TagConverter"; +import SettingConverter from "../Converter/SettingConverter"; +import Password from "../Model/Password/Password"; +import Folder from "../Model/Folder/Folder"; +import Tag from "../Model/Tag/Tag"; +import Server from "../Model/Server/Server"; +import Session from "../Model/Session/Session"; +import DataField from "../Model/CustomField/DataField"; +import EmailField from "../Model/CustomField/EmailField"; +import FileField from "../Model/CustomField/FileField"; +import SecretField from "../Model/CustomField/SecretField"; +import TextField from "../Model/CustomField/TextField"; +import UrlField from "../Model/CustomField/UrlField"; +import Setting from "../Model/Setting/Setting"; +import ApiRequest from "../Network/ApiRequest"; +import ApiResponse from "../Network/ApiResponse"; +import SessionAuthorization from "../Authorization/SessionAuthorization"; +import PWDv1Challenge from "../Authorization/Challenge/PWDv1Challenge"; +import UserToken from "../Authorization/Token/UserToken"; +import RequestToken from "../Authorization/Token/RequestToken"; +import NoEncryption from "../Encryption/NoEncryption"; +import CSEv1Encryption from "../Encryption/CSEv1Encryption"; +import ExportV1Encryption from "../Encryption/ExportV1Encryption"; +import CSEv1Keychain from "../Encryption/Keychain/CSEv1Keychain"; +import Cache from "../Cache/Cache"; +import BooleanState from "../State/BooleanState"; +import EventEmitter from "eventemitter3"; +import ConfigurationError from "../Exception/ConfigruationError"; +import ResponseContentTypeError from "../Exception/ResponseContentTypeError"; +import ResponseDecodingError from "../Exception/ResponseDecodingError"; +import UnknownPropertyError from "../Exception/UnknownPropertyError"; +import TokenTypeNotSupported from "../Exception/TokenTypeNotSupported"; +import EncryptionTypeNotSupported from "../Exception/EncryptionTypeNotSupported"; +import NetworkError from "../Exception/NetworkError"; +import HttpError from "../Exception/Http/HttpError"; +import BadRequestError from "../Exception/Http/BadRequestError"; +import UnauthorizedError from "../Exception/Http/UnauthorizedError"; +import ForbiddenError from "../Exception/Http/ForbiddenError"; +import NotFoundError from "../Exception/Http/NotFoundError"; +import MethodNotAllowedError from "../Exception/Http/MethodNotAllowedError"; +import TooManyRequestsError from "../Exception/Http/TooManyRequestsError"; +import InternalServerError from "../Exception/Http/InternalServerError"; +import BadGatewayError from "../Exception/Http/BadGatewayError"; +import ServiceUnavailableError from "../Exception/Http/ServiceUnavailableError"; +import GatewayTimeoutError from "../Exception/Http/GatewayTimeoutError"; +import BaseClassLoader from "./BaseClassLoader"; +import ModelService from "../Services/ModelService"; + +export default class DefaultClassLoader extends BaseClassLoader { + + /** + * + * @return {Object} + * @protected + */ + _getDefaultClasses() { + return { + repository : { + password: () => { return new PasswordRepository(this.getInstance('api')); }, + folder : () => { return new FolderRepository(this.getInstance('api')); }, + tag : () => { return new TagRepository(this.getInstance('api')); }, + setting : () => { return new SettingRepository(this.getInstance('api')); } + }, + collection : { + password: (...e) => { return new PasswordCollection(this.getInstance('converter.password'), ...e); }, + folder : (...e) => { return new FolderCollection(this.getInstance('converter.folder'), ...e); }, + field : (...e) => { return new CustomFieldCollection(this.getInstance('converter.field'), ...e); }, + tag : (...e) => { return new TagCollection(this.getInstance('converter.tag'), ...e); }, + setting : (...e) => { return new SettingCollection(this.getInstance('converter.setting'), ...e); } + }, + converter : { + password: () => { return new PasswordConverter(this.getInstance('api')); }, + folder : () => { return new FolderConverter(this.getInstance('api')); }, + field : () => { return new CustomFieldConverter(this.getInstance('api')); }, + tag : () => { return new TagConverter(this.getInstance('api')); }, + setting : () => { return new SettingConverter(this.getInstance('api')); } + }, + model : { + password : Password, + folder : Folder, + tag : Tag, + server : Server, + session : Session, + dataField : DataField, + emailField : EmailField, + fileField : FileField, + secretField: SecretField, + textField : TextField, + urlField : UrlField, + setting : Setting + }, + network : { + request : ApiRequest, + response: ApiResponse + }, + authorization: { + session: () => { return new SessionAuthorization(this.getInstance('api')); } + }, + challenge : { + pwdv1: PWDv1Challenge + }, + token : { + user : UserToken, + request: RequestToken + }, + encryption : { + none : NoEncryption, + csev1: CSEv1Encryption, + expv1: ExportV1Encryption + }, + keychain : { + csev1: CSEv1Keychain + }, + service : { + model: () => { return new ModelService(this); } + }, + cache : { + cache: Cache + }, + state : { + boolean: BooleanState + }, + event : { + event: EventEmitter + }, + exception : { + configuration: ConfigurationError, + contenttype : ResponseContentTypeError, + decoding : ResponseDecodingError, + property : UnknownPropertyError, + challenge : TokenTypeNotSupported, + token : TokenTypeNotSupported, + encryption : EncryptionTypeNotSupported, + network : NetworkError, + http : HttpError, + 400 : BadRequestError, + 401 : UnauthorizedError, + 403 : ForbiddenError, + 404 : NotFoundError, + 405 : MethodNotAllowedError, + 429 : TooManyRequestsError, + 500 : InternalServerError, + 502 : BadGatewayError, + 503 : ServiceUnavailableError, + 504 : GatewayTimeoutError + } + }; + } +}
\ No newline at end of file diff --git a/src/ClassLoader/EnhancedClassLoader.js b/src/ClassLoader/EnhancedClassLoader.js new file mode 100644 index 0000000..04dfa2e --- /dev/null +++ b/src/ClassLoader/EnhancedClassLoader.js @@ -0,0 +1,20 @@ +import DefaultClassLoader from "./DefaultClassLoader"; +import EnhancedPassword from "../Model/Password/EnhancedPassword"; +import EnhancedFolder from "../Model/Folder/EnhancedFolder"; +import EnhancedTag from "../Model/Tag/EnhancedTag"; + +export default class EnhancedClassLoader extends DefaultClassLoader { + /** + * + * @return {Object} + * @protected + */ + _getDefaultClasses() { + let classes = super._getDefaultClasses(); + classes.model.password = EnhancedPassword; + classes.model.folder = EnhancedFolder; + classes.model.tag = EnhancedTag; + + return classes; + } +}
\ No newline at end of file |