UNPKG

@sap/odata-v4

Version:

OData V4.0 server library

545 lines (461 loc) 15.3 kB
'use strict'; const EdmAnnotation = require('./EdmAnnotation'); const EdmEntitySet = require('./EdmEntitySet'); const EdmSingleton = require('./EdmSingleton'); const EdmActionImport = require('./EdmActionImport'); const EdmFunctionImport = require('./EdmFunctionImport'); const validateThat = require('../validator/ParameterValidator').validateThat; /** * <a href="./../ODataSpecification/odata-v4.0-errata03-os/complete/part3-csdl/odata-v4.0-errata03-os-part3-csdl-complete.html#_Toc453752597"> * OData CSDL # 13.1 Element edm:EntityContainer * </a> * @hideconstructor */ class EdmEntityContainer { /** * Constructor * Use factory method EdmEntityContainer.createWithFQN or * EdmEntityContainer.createWithContainerInfo to create an entity container * * @param {Edm} edm The edm itself * @param {CsdlProvider} provider Provider for the Csdl artifacts * @param {CsdlEntityContainerInfo} [entityContainerInfo] Entity container info * @param {FullQualifiedName} [fqn] Full qualified name * @param {CsdlEntityContainer} [entityContainer] Entity container * @param {Object} [configuration] Edm configuration object */ constructor(edm, provider, entityContainerInfo, fqn, entityContainer, configuration = {}) { validateThat('edm', edm).truthy(); validateThat('provider', provider).truthy(); if (!entityContainerInfo) { validateThat('fqn', fqn).truthy(); validateThat('entityContainer', entityContainer).truthy(); } /** * @type {Edm} * @private */ this._edm = edm; /** * @type {string} * @private */ this._name = null; /** * @type {FullQualifiedName} * @private */ this._entityContainerName = null; /** * @type {FullQualifiedName} * @private */ this._parentContainerName = null; /** * @type {CsdlEntityContainer} * @private */ this.container = null; /** * @type {CsdlProvider} * @private */ this._provider = provider; if (entityContainerInfo) { this._name = entityContainerInfo.name.name; this._entityContainerName = entityContainerInfo.name; this._parentContainerName = entityContainerInfo.extends; } else { this._name = fqn.name; this.container = entityContainer; this._entityContainerName = fqn; this._parentContainerName = entityContainer.extends; } /** * @type {EdmSingleton[]} * @private */ this.singletons = null; /** * @type {Map.<string, EdmSingleton>} * @private */ this.singletonCache = new Map(); /** * @type {EdmEntitySet[]} * @private */ this.entitySets = null; /** * @type {Map.<string, EdmEntitySet>} * @private */ this.entitySetCache = new Map(); /** * @type {EdmActionImport[]} * @private */ this.actionImports = null; /** * @type {Map.<string, EdmActionImport>} * @private */ this.actionImportCache = new Map(); /** * @type {EdmFunctionImport[]} * @private */ this.functionImports = null; /** * @type {Map.<string, EdmFunctionImport>} * @private */ this.functionImportCache = new Map(); /** * @type {EdmAnnotation[]} * @private */ this.annotations = null; this._configuration = configuration; } /** * Return Namespace * * @returns {string} */ getNamespace() { return this._entityContainerName.namespace; } /** * Return name * * @returns {string} */ getName() { return this._entityContainerName.name; } /** * Return full qualified name * * @returns {FullQualifiedName} */ getFullQualifiedName() { return this._entityContainerName; } /** * Get contained singleton by name. * * @param {string} singletonName Name of singleton, or null if not found * @returns {?EdmSingleton} */ getSingleton(singletonName) { let singleton = this.singletonCache.get(singletonName); // EdmSingleton if (singleton) { return singleton; } singleton = this.createSingleton(singletonName); if (singleton) { this.singletonCache.set(singletonName, singleton); } return singleton; } /** * Get contained entity set by name. * * @param {string} entitySetName Name of entity set, or null if not found * @returns {?EdmEntitySet} */ getEntitySet(entitySetName) { let entitySet = this.entitySetCache.get(entitySetName); if (entitySet) { return entitySet; } entitySet = this.createEntitySet(entitySetName); if (entitySet) { this.entitySetCache.set(entitySetName, entitySet); } return entitySet; } /** * Get contained action import by name, or null if not found * * @param {string} actionImportName Name of action import * @returns {?EdmActionImport} */ getActionImport(actionImportName) { let actionImport = this.actionImportCache.get(actionImportName); if (actionImport) { return actionImport; } actionImport = this.createActionImport(actionImportName); if (actionImport) { this.actionImportCache.set(actionImportName, actionImport); } return actionImport; } /** * Get contained function import by name. * * @param {string} functionImportName Name of function import * @returns {?EdmFunctionImport} */ getFunctionImport(functionImportName) { let functionImport = this.functionImportCache.get(functionImportName); if (functionImport) { return functionImport; } functionImport = this.createFunctionImport(functionImportName); if (functionImport != null) { this.functionImportCache.set(functionImportName, functionImport); } return functionImport; } /** * Returns all singletons * * @returns {EdmSingleton[]} */ getSingletons() { if (!this.singletons) { this._loadAllSingletons(); } return this.singletons; } /** * Returns all entity sets * * @returns {EdmEntitySet[]} */ getEntitySets() { if (!this.entitySets) { this._loadAllEntitySets(); } return this.entitySets; } /** * Loads and returns all action imports * * @returns {EdmActionImport[]} */ getActionImports() { if (!this.actionImports) { this._loadAllActionImports(); } return this.actionImports; } /** * Loads and returns all function imports * * @returns {EdmFunctionImport[]} */ getFunctionImports() { if (!this.functionImports) { this._loadAllFunctionImports(); } return this.functionImports; } /** * Returns the {@link FullQualifiedName} of the parent container or null * if no parent is specified * * @returns {FullQualifiedName} */ getParentContainerName() { return this._parentContainerName; } /** * Creates a EdmSingleton instance using the Csdl provider * @param {string} singletonName Name of the singleton * @returns {EdmSingleton} * @private */ createSingleton(singletonName) { const providerSingleton = this._provider.getSingleton(this._entityContainerName, singletonName); let config = this._getArtifactConfiguration(this.getNamespace(), singletonName); let singleton = null; if (providerSingleton) { singleton = new EdmSingleton(this._edm, this, providerSingleton, config); } return singleton; } /** * Creates a EdmEntitySet instance using the Csdl provider * * @param {string} entitySetName Name of the entity set * @returns {EdmEntitySet} * @private */ createEntitySet(entitySetName) { const providerEntitySet = this._provider.getEntitySet(this._entityContainerName, entitySetName); let config = this._getArtifactConfiguration(this.getNamespace(), entitySetName); let entitySet = null; if (providerEntitySet) { entitySet = new EdmEntitySet(this._edm, this, providerEntitySet, config); } return entitySet; } /** * Creates a EdmActionImport instance using the Csdl provider * * @param {string} actionImportName Name of the action import * @returns {EdmActionImport} * @private */ createActionImport(actionImportName) { let actionImport = null; let providerImport = this._provider.getActionImport(this._entityContainerName, actionImportName); if (providerImport) { actionImport = new EdmActionImport(this._edm, this, providerImport); } return actionImport; } /** * Creates a EdmFunctionImport instance using the Csdl provider * * @param {string} functionImportName Name of the function import * @returns {EdmFunctionImport} * @private */ createFunctionImport(functionImportName) { let functionImport = null; let providerImport = this._provider.getFunctionImport(this._entityContainerName, functionImportName); if (providerImport) { functionImport = new EdmFunctionImport(this._edm, this, providerImport); } return functionImport; } /** * Load all singletons from the Csdl provider into the caches. * @private */ _loadAllSingletons() { this._loadContainer(); let providerSingletons = this.container.singletons; this.singletons = []; if (providerSingletons) { for (let csdlSingleton of providerSingletons) { // CsdlSingleton let config = this._getArtifactConfiguration(this.getNamespace(), csdlSingleton.name); let singleton = new EdmSingleton(this._edm, this, csdlSingleton, config); // EdmSingletonImpl this.singletonCache.set(csdlSingleton.name, singleton); this.singletons.push(singleton); } } } /** * Load all entity sets from the Csdl provider into the caches. * @private */ _loadAllEntitySets() { this._loadContainer(); let providerEntitySets = this.container.entitySets; // CsdlEntitySet this.entitySets = []; if (providerEntitySets) { for (let csdlEntitySet of providerEntitySets) { let config = this._getArtifactConfiguration(this.getNamespace(), csdlEntitySet.name); let entitySet = new EdmEntitySet(this._edm, this, csdlEntitySet, config); this.entitySetCache[entitySet.getName()] = entitySet; this.entitySets.push(entitySet); } } } /** * Load all action imports from the Csdl provider into the caches. * @private */ _loadAllActionImports() { this._loadContainer(); let providerActionImports = this.container.actionImports; this.actionImports = []; if (providerActionImports) { for (let csdlActionImport of providerActionImports) { let actionImport = new EdmActionImport(this._edm, this, csdlActionImport); this.actionImportCache.set(actionImport.name, actionImport); this.actionImports.push(actionImport); } } } /** * Load all function imports from the Csdl provider into the caches. * @private */ _loadAllFunctionImports() { this._loadContainer(); let providerFunctionImports = this.container.functionImports; this.functionImports = []; if (providerFunctionImports) { for (let csdlFunctionImport of providerFunctionImports) { let functionImport = new EdmFunctionImport(this._edm, this, csdlFunctionImport); this.functionImportCache.set(functionImport.name, functionImport); this.functionImports.push(functionImport); } } } /** * Load CsdlEntityContainer object from the Csdl provider if the EdmEntityContainer * was created with an CsdlContainerInfo object. * @private */ _loadContainer() { if (this.container) { return; } /** * @type {CsdlEntityContainer} * @private */ this.container = this._provider.getEntityContainer(this._entityContainerName); } /** * Returns the annotations for this object * * @returns {EdmAnnotation[]} */ getAnnotations() { this._loadContainer(); if (this.annotations) { return this.annotations; } this.annotations = []; for (let item of this.container.annotations) { this.annotations.push(new EdmAnnotation(this._edm, item)); } return this.annotations; } /** * Creates a EdmEntityContainer instance from an ContainerInfo instance * * @param {Edm} edm The edm itself * @param {CsdlProvider} provider Provider for the Csdl artifacts * @param {CsdlEntityContainerInfo} entityContainerInfo Entity container info * @param {Object} configuration a configuration object * @returns {EdmEntityContainer} * @package */ static createWithContainerInfo(edm, provider, entityContainerInfo, configuration) { return new EdmEntityContainer(edm, provider, entityContainerInfo, null, null, configuration); } /** * Creates a EdmEntityContainer instance from full qualified name and the CsdlEntityContainer * * @param {Edm} edm The edm itself * @param {CsdlProvider} provider Provider for the Csdl artifacts * @param {FullQualifiedName} fqn Full qualified name of container * @param {CsdlEntityContainer} entityContainer Entity container * @param {Object} configuration a configuration object * @returns {EdmEntityContainer} * @package */ static createWithFQN(edm, provider, fqn, entityContainer, configuration) { return new EdmEntityContainer(edm, provider, null, fqn, entityContainer, configuration); } /** * @param {string} namespace * @param {string} name * @returns {?Object} configuration */ _getArtifactConfiguration(namespace, name) { const nsConfig = this._configuration[namespace]; return nsConfig ? nsConfig[name] : undefined; } } module.exports = EdmEntityContainer;