UNPKG

@eclipse-emfcloud/model-service

Version:
209 lines 10.1 kB
import { ModelAccessorBus, Provider } from '@eclipse-emfcloud/model-accessor-bus'; import { ModelManager } from '@eclipse-emfcloud/model-manager'; import { ModelValidationService, Validator } from '@eclipse-emfcloud/model-validation'; import { ModelHub } from './model-hub'; import { ModelTrigger } from './model-trigger'; /** * Interface for an entity that contributes configuration and business logic * specific to a particular model or models to the {@link ModelHub}. * The hub delegates persistence and validation to the relevant contributions * provided by a model service contribution and clients of the hub may * access public model APIs via the provided {@link getModelService model service API}. */ export interface ModelServiceContribution<K = string, M extends object = object> { /** * An identifier for the contribution. * Must be unique within a {@link ModelHub}. */ readonly id: string; /** * The model persistence contribution to which the {@link ModelHub} delegates * loading and saving of models. */ readonly persistenceContribution: ModelPersistenceContribution<K, M>; /** * The model validation contribution which the {@link ModelHub} uses to obtain * validators for configuration of the model validation service. */ readonly validationContribution?: ModelValidationContribution<K, M>; /** * The model trigger contribution which the {@link ModelHub} uses to obtain * triggers for configuration of the model trigger patching engine. */ readonly triggerContribution?: ModelTriggerContribution<K, M>; /** * The model accessor contribution which the {@link ModelHub} uses to obtain * providers for configuration of the model accessor bus. */ readonly modelAccessorContribution?: ModelAccessorContribution; /** * Obtain a specific public API for access to and manipulation of the models * contributed by this model service contribution. * * @template S the public API interface type to retrieve * @returns the public model API */ getModelService<S = unknown>(): S; /** * Injects the model manager that the {@link ModelHub} uses to manage models. * This lets the model service contribution configure its {@link getModelService model service API} * with access to its models, should that be necessary. * * @param modelManager the hub's model manager */ setModelManager(modelManager: ModelManager<K>): void; /** * Injects the model validation service that the {@link ModelHub} uses to validate models. * This lets the model service contribution configure its {@link getModelService model service API} * with access to model validation state, should that be necessary. * * @param validationService the hub's model validation service */ setValidationService(validationService: ModelValidationService<K>): void; /** * Informs the model service contribution of the {@link ModelHub} to which it has been contributed. * At the time of this call, the hub is full configured and ready for any and all use, * including access to other model service contributions' {@link getModelService public APIs}. * * @param modelHub the model hub to which the model service contribution has been contributed */ setModelHub(modelHub: ModelHub<K>): void; /** * Injects the model accessor bus that the {@link ModelHub} uses for communication between * model services. * This lets the model service contribution configure the {@link getModelService model service API} * with access to the accessor bus, should that be necessary. * * @param modelAccessorBus the hub's model accessor bus */ setModelAccessorBus(modelAccessorBus: ModelAccessorBus): void; /** * Optional call-back for the `ModelHub` that owns the contribution to invoke when it is * itself disposed, for an opportunity to clean up any resources held by the contribution. */ dispose?(): void; } /** * Interface to which the {@link ModelHub} delegates loading and saving of models * from/to the persistence store used by the {@link ModelServiceContribution} providing it. */ export interface ModelPersistenceContribution<K = string, M extends object = object> { /** * Queries whether the persistence contribution is the one to which loading or saving * of a model shall be delegated. The {@link ModelHub} will always check this before * requesting load or save and, on returning `true`, the contribution must fulfill the * load or save request. * * @param modelId identification of a model that is to be loaded or saved * @returns whether the contribution implements loading and saving of the identified model */ canHandle(modelId: K): Promise<boolean>; /** * Loads a model from persistent storage. * The {@link ModelHub} will only call this method if a prior call to * {@link canHandle} for this `modelId` returned `true`. * * @param modelId identification of a model to load * @returns a promise of the loaded model */ loadModel(modelId: K): Promise<M>; /** * Saves a model to persistent storage. * The {@link ModelHub} will only call this method if a prior call to * {@link canHandle} for this `modelId` returned `true`. * * @param modelId identification of a model to save * @param model the model to save * @returns `true` if the model needed to be saved and was successfully saved; * `false` if the model did not need to be saved, or * a rejected promise if the model needed to be saved and save failed */ saveModel(modelId: K, model: M): Promise<boolean>; } /** * Interface to which the {@link ModelHub} delegates validation of models. */ export interface ModelValidationContribution<K = string, M extends object = object> { /** * Obtain validators to install in the model validation service. * As the validation service applies all registered validators to all of its models, * the validators returned by this method are free to provide diagnostics for any * and all models. * * The recommended practice is that a validator returns an `ok()` diagnostic * for every model ID that it does not recognize, analyzing and diagnosing only the * models for model IDs associated with the {@link ModelServiceContribution} * providing that validator. * * @returns zero or more validators to install in the model validation service */ getValidators(): Validator<K, M>[]; } /** * Interface to which the {@link ModelHub} delegates triggered patching of models. */ export interface ModelTriggerContribution<K = string, M extends object = object> { /** * Obtain triggers to install in the model's trigger engine to provide * proactive model integrity for computed values and other dependencies. * As the trigger engine applies all registered triggers to every model, * the triggers returned by this method are free to provide patches for any * and all models. * * The recommended practice is that a trigger returns `undefined` * for every model ID that it does not recognize, analyzing and computing patches * only for the models corresponding to model IDs associated with the * {@link ModelServiceContribution} providing that trigger. * * Triggers are installed into the _Trigger Engine_ in the order in which they * are listed in the returned array. This means that triggers are free to * implement interdependencies if that is helpful; in particular, a trigger may * reliably depend on another trigger having run before it if that trigger is * listed before it in this array. * * @returns zero or more triggers to install in the model trigger engine */ getTriggers(): ModelTrigger<K, M>[]; } export interface ModelAccessorContribution { /** * Obtain providers to register in the model accessor bus, to provide * synchronization between different models. * * @returns zero or more providers to register in the model accessor bus */ getProviders(): Provider[]; } export declare abstract class AbstractModelServiceContribution<K = string, M extends object = object> implements ModelServiceContribution<K, M> { private _id; private _persistenceContribution; private _validationContribution?; private _triggerContribution?; private _modelAccessorContribution?; protected modelManager: ModelManager<K>; protected validationService: ModelValidationService<K>; protected modelHub: ModelHub<K>; protected modelAccessorBus: ModelAccessorBus; /** * Initializes me with my required unique identifier and, optionally, * contribution delegates for persistence support and model validation. */ protected initialize({ id, persistenceContribution, validationContribution, triggerContribution, modelAccessorContribution, }: { id: string; persistenceContribution?: ModelPersistenceContribution<K, M>; validationContribution?: ModelValidationContribution<K, M>; triggerContribution?: ModelTriggerContribution<K, M>; modelAccessorContribution?: ModelAccessorContribution; }): void; get id(): string; get persistenceContribution(): ModelPersistenceContribution<K, M>; get validationContribution(): ModelValidationContribution<K, M> | undefined; get triggerContribution(): ModelTriggerContribution<K, M> | undefined; get modelAccessorContribution(): ModelAccessorContribution | undefined; setModelManager(modelManager: ModelManager<K>): void; setModelHub(modelHub: ModelHub<K>): void; setValidationService(validationService: ModelValidationService<K>): void; setModelAccessorBus(modelAccessorBus: ModelAccessorBus): void; abstract getModelService<S>(): S; } //# sourceMappingURL=model-service-contribution.d.ts.map