UNPKG

@openui5/sap.ui.core

Version:

OpenUI5 Core Library sap.ui.core

894 lines (812 loc) 33.6 kB
/*! * OpenUI5 * (c) Copyright 2009-2021 SAP SE or an SAP affiliate company. * Licensed under the Apache License, Version 2.0 - see LICENSE.txt. */ // Provides class sap.ui.core.ComponentMetadata sap.ui.define([ 'sap/ui/base/ManagedObjectMetadata', 'sap/ui/core/Manifest', 'sap/base/Log', 'sap/base/util/extend', 'sap/base/util/deepExtend', 'sap/base/util/isPlainObject', 'sap/base/util/LoaderExtensions' ], function(ManagedObjectMetadata, Manifest, Log, extend, deepExtend, isPlainObject, LoaderExtensions) { "use strict"; var oCfgData = window["sap-ui-config"] || {}; var syncCallBehavior = 0; // ignore if (oCfgData['xx-nosync'] === 'warn' || /(?:\?|&)sap-ui-xx-nosync=(?:warn)/.exec(window.location.search)) { syncCallBehavior = 1; } if (oCfgData['xx-nosync'] === true || oCfgData['xx-nosync'] === 'true' || /(?:\?|&)sap-ui-xx-nosync=(?:x|X|true)/.exec(window.location.search)) { syncCallBehavior = 2; } /** * Creates a new metadata object for a Component subclass. * * @param {string} sClassName Fully qualified name of the class that is described by this metadata object * @param {object} oStaticInfo Static info to construct the metadata from * * @public * @class * @author SAP SE * @version 1.87.1 * @since 1.9.2 * @alias sap.ui.core.ComponentMetadata * @extends sap.ui.base.ManagedObjectMetadata */ var ComponentMetadata = function(sClassName, oClassInfo) { // call super constructor ManagedObjectMetadata.apply(this, arguments); }; //chain the prototypes ComponentMetadata.prototype = Object.create(ManagedObjectMetadata.prototype); ComponentMetadata.prototype.constructor = ComponentMetadata; ComponentMetadata.preprocessClassInfo = function(oClassInfo) { // if the component is a string we convert this into a "_src" metadata entry // the specific metadata object can decide to support this or gracefully ignore it // basically the ComponentMetadata makes use of this feature if (oClassInfo && typeof oClassInfo.metadata === "string") { oClassInfo.metadata = { _src: oClassInfo.metadata }; } return oClassInfo; }; ComponentMetadata.prototype.applySettings = function(oClassInfo) { var oStaticInfo = this._oStaticInfo = oClassInfo.metadata; // if the component metadata loadFromFile feature is active then // the component metadata will be loaded from the specified file // which needs to be located next to the Component.js file. var sName = this.getName(), sPackage = sName.replace(/\.\w+?$/, ""); if (oStaticInfo._src) { if (oStaticInfo._src == "component.json") { Log.warning("Usage of declaration \"metadata: 'component.json'\" is deprecated (component " + sName + "). Use \"metadata: 'json'\" instead."); } else if (oStaticInfo._src != "json") { throw new Error("Invalid metadata declaration for component " + sName + ": \"" + oStaticInfo._src + "\"! Use \"metadata: 'json'\" to load metadata from component.json."); } var sResource = sPackage.replace(/\./g, "/") + "/component.json"; Log.info("The metadata of the component " + sName + " is loaded from file " + sResource + "."); try { var oResponse = LoaderExtensions.loadResource(sResource, { dataType: "json" }); extend(oStaticInfo, oResponse); } catch (err) { Log.error("Failed to load component metadata from \"" + sResource + "\" (component " + sName + ")! Reason: " + err); } } ManagedObjectMetadata.prototype.applySettings.call(this, oClassInfo); // keep the information about the component name (for customizing) this._sComponentName = sPackage; // static initialization flag & instance count this._bInitialized = false; this._iInstanceCount = 0; // extract the manifest var oManifest = oStaticInfo["manifest"]; // if a manifest is available we switch to load the manifest for the // metadata instead of using the component metadata section if (oManifest) { // set the version of the metadata oStaticInfo.__metadataVersion = 2; // The manifest will be lazy loaded within #getManifestObject the first time it is accessed. // This allows the component factory (sap.ui.component / sap.ui.component.load) to inject a // manifest to prevent a sync request. // See: #_applyManifest if (typeof oManifest === "string" && oManifest === "json") { return; } } else { // set the version of the metadata // no manifest => metadata version 1 oStaticInfo.__metadataVersion = 1; oManifest = {}; } // Convert legacy metadata and create manifest object this._applyManifest(oManifest); }; /** * Applies the given manifest json to the ComponentMetadata instance * if there isn't already a manifest. * * This method is called from * - {@link #applySettings} in case there is a manifest object given from the metadata * - {@link #getManifestObject} after lazy loading the manifest (sync request) * - {@link sap.ui.component} / {@link sap.ui.component.load} with an existing manifest to prevent the sync request * * @param {object} oManifestJson manifest object (will be modified internally!) * @private * @ui5-restricted sap.ui.core.Component */ ComponentMetadata.prototype._applyManifest = function(oManifestJson) { // Make sure to not create the manifest object twice! // This could happen when the manifest is accessed (via #getManifestObject) while sap.ui.component is loading it. // Then the async request wouldn't be cancelled and the manifest already loaded (sync) should not be be overridden. if (this._oManifest) { Log.warning("Can't apply manifest to ComponentMetadata as it has already been created.", this.getName(), "sap.ui.core.ComponentMetadata"); return; } // ensure the general property name, the namespace sap.app with the id, // the namespace sap.ui5 and eventually the extends property oManifestJson["name"] = oManifestJson["name"] || this.getName(); oManifestJson["sap.app"] = oManifestJson["sap.app"] || { "id": this.getComponentName() // use the "package" namespace instead of the classname (without ".Component") }; oManifestJson["sap.ui5"] = oManifestJson["sap.ui5"] || {}; // the extends property will be added when the component is not a base class if (!this.isBaseClass()) { oManifestJson["sap.ui5"]["extends"] = oManifestJson["sap.ui5"]["extends"] || {}; } // convert the old legacy metadata and merge with the new manifest this._convertLegacyMetadata(this._oStaticInfo, oManifestJson); this._oManifest = new Manifest(oManifestJson, { componentName: this.getComponentName(), baseUrl: sap.ui.require.toUrl(this.getComponentName().replace(/\./g, "/")) + "/", process: this._oStaticInfo.__metadataVersion === 2 }); }; /** * Static initialization of Components. This function will be called by the * Component and the metadata decides whether to execute the static init code * or not. It will be called by each Component instance init. * @private */ ComponentMetadata.prototype.init = function() { if (this._iInstanceCount === 0) { // first we load the dependencies of the parent var oParent = this.getParent(); if (oParent instanceof ComponentMetadata) { oParent.init(); } // init the manifest this.getManifestObject().init(); this._bInitialized = true; } this._iInstanceCount++; }; /** * Static termination of Components. This function will be called by the * Component and the metadata decides whether to execute the static exit code * or not. It will be called by each Component instance exit. * @private */ ComponentMetadata.prototype.exit = function() { // ensure that the instance count is never negative var iInstanceCount = Math.max(this._iInstanceCount - 1, 0); if (iInstanceCount === 0) { // exit the manifest this.getManifestObject().exit(); // unload the includes of parent components var oParent = this.getParent(); if (oParent instanceof ComponentMetadata) { oParent.exit(); } this._bInitialized = false; } this._iInstanceCount = iInstanceCount; }; /** * Component instances need to register themselves in this method to enable * the customizing for this component. This will only be done for the first * instance and only if a customizing configuration is available. * @param {sap.ui.core.Component} oInstance reference to the Component instance * @private */ ComponentMetadata.prototype.onInitComponent = function(oInstance) { Log.error("The function ComponentMetadata#onInitComponent will be removed soon!"); }; /** * Component instances need to unregister themselves in this method to disable * the customizing for this component. This will only be done for the last * instance and only if a customizing configuration is available. * @param {sap.ui.core.Component} oInstance reference to the Component instance * @private */ ComponentMetadata.prototype.onExitComponent = function(oInstance) { Log.error("The function ComponentMetadata#onExitComponent will be removed soon!"); }; /** * Returns whether the class of this metadata is a component base class * or not. * @return {boolean} true if it is sap.ui.core.Component or sap.ui.core.UIComponent * @protected * @since 1.33.0 */ ComponentMetadata.prototype.isBaseClass = function() { return /^sap\.ui\.core\.(UI)?Component$/.test(this.getName()); }; /** * Returns the version of the metadata which could be 1 or 2. 1 is for legacy * metadata whereas 2 is for the manifest. * @return {int} metadata version (1: legacy metadata, 2: manifest) * @protected * @since 1.27.1 */ ComponentMetadata.prototype.getMetadataVersion = function() { return this._oStaticInfo.__metadataVersion; }; /** * Returns the manifest object. * @return {sap.ui.core.Manifest} manifest. * @public * @since 1.33.0 */ ComponentMetadata.prototype.getManifestObject = function() { // lazy loading when manifest isn't available, yet if (!this._oManifest) { var oManifest = this._oStaticInfo["manifest"]; if (typeof oManifest === "string" && oManifest === "json") { // In contrast to sap.ui.core.Manifest#load the sap-language parameter // won't be added here as the resource is expected to be served from the // preload module cache which does not contain any URL parameters var sName = this.getName(); var sPackage = this.getComponentName(); var sResource = sPackage.replace(/\./g, "/") + "/manifest.json"; // Check if resource is available in preload cache var bIsResourceLoaded = !!sap.ui.loader._.getModuleState(sResource); // Only handle sync behavior if resource is not taken from preload cache if (!bIsResourceLoaded && syncCallBehavior === 2) { Log.error("[nosync] Loading manifest of the component " + sName + " ignored.", sResource, "sap.ui.core.ComponentMetadata"); oManifest = {}; } else { if (!bIsResourceLoaded && syncCallBehavior === 1) { Log.error("[nosync] The manifest of the component " + sName + " is loaded with sync XHR.", sResource, "sap.ui.core.ComponentMetadata"); } else { Log.info("The manifest of the component " + sName + " is loaded from file " + sResource + "."); } try { // This sync loading should not happen in the following cases // - there is a Component-preload.js that contains the manifest.json // - OR // - sap.ui.component / sap.ui.component.load are used with "async=true" and/or // "manifest=true|String|Object" to create / load the component // (Also see #_applyManifest) var oResponse = LoaderExtensions.loadResource(sResource, { dataType: "json" }); oManifest = oResponse; } catch (err) { Log.error("Failed to load component manifest from \"" + sResource + "\" (component " + sName + ")! Reason: " + err); // in case of error the manifest is an empty object // to behave similar like for missing component.json oManifest = {}; } } this._applyManifest(oManifest); } } return this._oManifest; }; /** * Returns the manifest defined in the metadata of the Component. * If not specified, the return value is null. * @return {Object} manifest. * @public * @since 1.27.1 * @deprecated Since 1.33.0. Please use the sap.ui.core.Component#getManifest */ ComponentMetadata.prototype.getManifest = function() { // use raw manifest in case of legacy metadata if (this.getMetadataVersion() === 1) { return this.getManifestObject().getRawJson(); } return this.getManifestObject().getJson(); }; /** * Returns the processed manifest object (no copy). * Processing will be done in a "lazy" way. * * @return {object} manifest * @private * @since 1.29.0 * @deprecated Since 1.33.0. Please use the sap.ui.core.Component#getManifest */ ComponentMetadata.prototype._getManifest = function() { Log.warning("ComponentMetadata#_getManifest: do not use deprecated functions anymore!"); return this.getManifestObject().getJson(); }; /** * Returns the raw manifest defined in the metadata of the Component. * If not specified, the return value is null. * @return {Object} manifest * @public * @since 1.29.0 * @deprecated Since 1.33.0. Please use the sap.ui.core.Component#getManifest */ ComponentMetadata.prototype.getRawManifest = function() { return this.getManifestObject().getRawJson(); }; /** * Returns the raw manifest object (no copy). * * @return {object} manifest * @private * @since 1.29.0 * @deprecated Since 1.33.0. Please use the sap.ui.core.Component#getRawManifest */ ComponentMetadata.prototype._getRawManifest = function() { Log.warning("ComponentMetadata#_getRawManifest: do not use deprecated functions anymore!"); return this.getManifestObject().getRawJson(); }; /** * Returns the configuration of a manifest section or the value for a * specific path. If no section or key is specified, the return value is null. * * Example: * <code> * { * "sap.ui5": { * "dependencies": { * "libs": { * "sap.m": {} * }, * "components": { * "my.component.a": {} * } * } * }); * </code> * * The configuration above can be accessed in the following ways: * <ul> * <li><b>By section/namespace</b>: <code>oComponent.getMetadata().getManifestEntry("sap.ui5")</code></li> * <li><b>By path</b>: <code>oComponent.getMetadata().getManifestEntry("/sap.ui5/dependencies/libs")</code></li> * </ul> * * By section/namespace returns the configuration for the specified manifest * section and by path allows to specify a concrete path to a dedicated entry * inside the manifest. The path syntax always starts with a slash (/). * * @param {string} sKey Either the manifest section name (namespace) or a concrete path * @param {boolean} [bMerged=false] Indicates whether the custom configuration is merged with the parent custom configuration of the Component. * @return {any|null} Value of the manifest section or the key (could be any kind of value) * @public * @since 1.27.1 * @deprecated Since 1.33.0. Please use the sap.ui.core.Component#getManifest */ ComponentMetadata.prototype.getManifestEntry = function(sKey, bMerged) { var oData = this.getManifestObject().getEntry(sKey); // merge / extend should only be done for objects or when entry wasn't found if (oData !== undefined && !isPlainObject(oData)) { return oData; } // merge the configuration of the parent manifest with local manifest // the configuration of the static component metadata will be ignored var oParent, oParentData; if (bMerged && (oParent = this.getParent()) instanceof ComponentMetadata) { oParentData = oParent.getManifestEntry(sKey, bMerged); } // only extend / clone if there is data // otherwise "null" will be converted into an empty object if (oParentData || oData) { oData = deepExtend({}, oParentData, oData); } return oData; }; /** * Returns the custom Component configuration entry with the specified key (this must be a JSON object). * If no key is specified, the return value is null. * * Example: * <code> * sap.ui.core.Component.extend("sample.Component", { * metadata: { * "my.custom.config" : { * "property1" : true, * "property2" : "Something else" * } * } * }); * </code> * * The configuration above can be accessed via <code>sample.Component.getMetadata().getCustomEntry("my.custom.config")</code>. * * @param {string} sKey Key of the custom configuration (must be prefixed with a namespace) * @param {boolean} [bMerged=false] Indicates whether the custom configuration is merged with the parent custom configuration of the Component. * @return {Object} custom Component configuration with the specified key. * @public * @deprecated Since 1.27.1. Please use the sap.ui.core.ComponentMetadata#getManifestEntry */ ComponentMetadata.prototype.getCustomEntry = function(sKey, bMerged) { if (!sKey || sKey.indexOf(".") <= 0) { Log.warning("Component Metadata entries with keys without namespace prefix can not be read via getCustomEntry. Key: " + sKey + ", Component: " + this.getName()); return null; } var oParent, oData = this._oStaticInfo[sKey] || {}; if (!isPlainObject(oData)) { Log.warning("Custom Component Metadata entry with key '" + sKey + "' must be an object. Component: " + this.getName()); return null; } if (bMerged && (oParent = this.getParent()) instanceof ComponentMetadata) { return deepExtend({}, oParent.getCustomEntry(sKey, bMerged), oData); } return deepExtend({}, oData); }; /** * Returns the name of the Component (which is the namespace only with the module name) * @return {string} Component name * @public */ ComponentMetadata.prototype.getComponentName = function() { return this._sComponentName; }; /** * Returns the dependencies defined in the metadata of the Component. If not specified, the return value is null. * <p> * <b>Important:</b></br> * If a Component is loaded using the manifest URL (or according the * "manifest first" strategy), this function ignores the entries of the * manifest file! It returns only the entries which have been defined in * the Component metadata or in the proper Component manifest. * * @return {Object} Component dependencies. * @public * @deprecated Since 1.27.1. Please use {@link sap.ui.core.Component#getManifestEntry}("/sap.ui5/dependencies") */ ComponentMetadata.prototype.getDependencies = function() { // Log.warning("Usage of sap.ui.core.ComponentMetadata.protoype.getDependencies is deprecated!"); if (!this._oLegacyDependencies) { var mDependencies = this.getManifestEntry("/sap.ui5/dependencies"), sUI5Version = mDependencies && mDependencies.minUI5Version || null, mLibs = mDependencies && mDependencies.libs || {}, mComponents = mDependencies && mDependencies.components || {}; var mLegacyDependencies = { ui5version: sUI5Version, libs: [], components: [] }; for (var sLib in mLibs) { mLegacyDependencies.libs.push(sLib); } for (var sComponent in mComponents) { mLegacyDependencies.components.push(sComponent); } this._oLegacyDependencies = mLegacyDependencies; } return this._oLegacyDependencies; }; /** * Returns the array of the included files that the Component requires such * as CSS and JavaScript. If not specified or the array is empty, the return * value is null. * <p> * <b>Important:</b></br> * If a Component is loaded using the manifest URL (or according the * "manifest first" strategy), this function ignores the entries of the * manifest file! It returns only the entries which have been defined in * the Component metadata or in the proper Component manifest. * * @return {string[]} Included files. * @public * @deprecated Since 1.27.1. Please use {@link sap.ui.core.Component#getManifestEntry}("/sap.ui5/resources") */ ComponentMetadata.prototype.getIncludes = function() { // Log.warning("Usage of sap.ui.core.ComponentMetadata.protoype.getIncludes is deprecated!"); if (!this._aLegacyIncludes) { var aIncludes = [], mResources = this.getManifestEntry("/sap.ui5/resources") || {}, aCSSResources = mResources && mResources.css || [], aJSResources = mResources && mResources.js || []; for (var i = 0, l = aCSSResources.length; i < l; i++) { if (aCSSResources[i] && aCSSResources[i].uri) { aIncludes.push(aCSSResources[i].uri); } } for (var i = 0, l = aJSResources.length; i < l; i++) { if (aJSResources[i] && aJSResources[i].uri) { aIncludes.push(aJSResources[i].uri); } } this._aLegacyIncludes = (aIncludes.length > 0) ? aIncludes : null; } return this._aLegacyIncludes; }; /** * Returns the required version of SAPUI5 defined in the metadata of the * Component. If returned value is null, then no special UI5 version is * required. * <p> * <b>Important:</b></br> * If a Component is loaded using the manifest URL (or according the * "manifest first" strategy), this function ignores the entries of the * manifest file! It returns only the entries which have been defined in * the Component metadata or in the proper Component manifest. * * @return {string} Required version of UI5 or if not specified then null. * @public * @deprecated Since 1.27.1. Please use {@link sap.ui.core.Component#getManifestEntry}("/sap.ui5/dependencies/minUI5Version") */ ComponentMetadata.prototype.getUI5Version = function() { // Log.warning("Usage of sap.ui.core.ComponentMetadata.protoype.getUI5Version is deprecated!"); return this.getManifestEntry("/sap.ui5/dependencies/minUI5Version"); }; /** * Returns array of components specified in the metadata of the Component. * If not specified or the array is empty, the return value is null. * <p> * <b>Important:</b></br> * If a Component is loaded using the manifest URL (or according the * "manifest first" strategy), this function ignores the entries of the * manifest file! It returns only the entries which have been defined in * the Component metadata or in the proper Component manifest. * * @return {string[]} Required Components. * @public * @deprecated Since 1.27.1. Please use {@link sap.ui.core.Component#getManifestEntry}("/sap.ui5/dependencies/components") */ ComponentMetadata.prototype.getComponents = function() { // Log.warning("Usage of sap.ui.core.ComponentMetadata.protoype.getComponents is deprecated!"); return this.getDependencies().components; }; /** * Returns array of libraries specified in metadata of the Component, that * are automatically loaded when an instance of the component is created. * If not specified or the array is empty, the return value is null. * <p> * <b>Important:</b></br> * If a Component is loaded using the manifest URL (or according the * "manifest first" strategy), this function ignores the entries of the * manifest file! It returns only the entries which have been defined in * the Component metadata or in the proper Component manifest. * * @return {string[]} Required libraries. * @public * @deprecated Since 1.27.1. Please use {@link sap.ui.core.Component#getManifestEntry}("/sap.ui5/dependencies/libs") */ ComponentMetadata.prototype.getLibs = function() { // Log.warning("Usage of sap.ui.core.ComponentMetadata.protoype.getLibs is deprecated!"); return this.getDependencies().libs; }; /** * Returns the version of the component. If not specified, the return value * is null. * <p> * <b>Important:</b></br> * If a Component is loaded using the manifest URL (or according the * "manifest first" strategy), this function ignores the entries of the * manifest file! It returns only the entries which have been defined in * the Component metadata or in the proper Component manifest. * * @return {string} The version of the component. * @public * @deprecated Since 1.34.2. Please use {@link sap.ui.core.Component#getManifestEntry}("/sap.app/applicationVersion/version") */ ComponentMetadata.prototype.getVersion = function() { return this.getManifestEntry("/sap.app/applicationVersion/version"); }; /** * Returns a copy of the configuration property to disallow modifications. * If no key is specified it returns the complete configuration property * * @param {string} [sKey] Key of the configuration property * @param {boolean} [bDoNotMerge=false] If set to <code>true</code>, only the local configuration is returned * @return {object} the value of the configuration property * @public * @since 1.15.1 * @deprecated Since 1.27.1. Please use {@link sap.ui.core.Component#getManifestEntry}("/sap.ui5/config") */ ComponentMetadata.prototype.getConfig = function(sKey, bDoNotMerge) { //Log.warning("Usage of sap.ui.core.ComponentMetadata.protoype.getConfig is deprecated!"); var mConfig = this.getManifestEntry("/sap.ui5/config", !bDoNotMerge); if (!mConfig) { return {}; } if (!sKey) { return mConfig; } return mConfig.hasOwnProperty(sKey) ? mConfig[sKey] : {}; }; /** * Returns a copy of the Customizing property * <p> * <b>Important:</b></br> * If a Component is loaded using the manifest URL (or according the * "manifest first" strategy), this function ignores the entries of the * manifest file! It returns only the entries which have been defined in * the Component metadata or in the proper Component manifest. * * @param {boolean} [bDoNotMerge] If set to <code>true</code>, only the local configuration is returned * @return {object} the value of the Customizing property * @private * @since 1.15.1 * @experimental Since 1.15.1. Implementation might change. * @deprecated Since 1.27.1. Please use {@link sap.ui.core.Component#getManifestEntry}("/sap.ui5/extends/extensions") */ ComponentMetadata.prototype.getCustomizing = function(bDoNotMerge) { // Log.warning("Usage of sap.ui.core.ComponentMetadata.protoype.getCustomizing is deprecated!"); return this.getManifestEntry("/sap.ui5/extends/extensions", !bDoNotMerge); }; /** * Returns the models configuration which defines the available models of the * Component. * <p> * <b>Important:</b></br> * If a Component is loaded using the manifest URL (or according the * "manifest first" strategy), this function ignores the entries of the * manifest file! It returns only the entries which have been defined in * the Component metadata or in the proper Component manifest. * * @param {boolean} [bDoNotMerge] If set to <code>true</code>, only the local configuration is returned * @return {object} models configuration * @private * @since 1.15.1 * @experimental Since 1.15.1. Implementation might change. * @deprecated Since 1.27.1. Please use {@link sap.ui.core.Component#getManifestEntry}("/sap.ui5/models") */ ComponentMetadata.prototype.getModels = function(bDoNotMerge) { // Log.warning("Usage of sap.ui.core.ComponentMetadata.protoype.getModels is deprecated!"); if (!this._oLegacyModels) { this._oLegacyModels = {}; var mDataSources = this.getManifestEntry("/sap.ui5/models") || {}; for (var sDataSource in mDataSources) { var oDataSource = mDataSources[sDataSource]; this._oLegacyModels[sDataSource] = oDataSource.settings || {}; this._oLegacyModels[sDataSource].type = oDataSource.type; this._oLegacyModels[sDataSource].uri = oDataSource.uri; } } // deep copy of the legacy models object var oParent, mModels = deepExtend({}, this._oLegacyModels); // merge the models object if defined via parameter if (!bDoNotMerge && (oParent = this.getParent()) instanceof ComponentMetadata) { mModels = deepExtend({}, oParent.getModels(), mModels); } // return a clone of the models return mModels; }; /** * Returns messaging flag * <p> * <b>Important:</b></br> * If a Component is loaded using the manifest URL (or according the * "manifest first" strategy), this function ignores the entries of the * manifest file! It returns only the entries which have been defined in * the Component metadata or in the proper Component manifest. * * @return {boolean} bMessaging Messaging enabled/disabled * @private * @since 1.28.0 * @deprecated Since 1.28.1. Please use {@link sap.ui.core.Component#getManifestEntry}("/sap.ui5/handleValidation") */ ComponentMetadata.prototype.handleValidation = function() { // Log.warning("Usage of sap.ui.core.ComponentMetadata.protoype.handleValidation is deprecated!"); return this.getManifestEntry("/sap.ui5/handleValidation"); }; /** * Returns the services configuration which defines the available services * of the component. * <p> * <b>Important:</b></br> * If a Component is loaded using the manifest URL (or according the * "manifest first" strategy), this function ignores the entries of the * manifest file! It returns only the entries which have been defined in * the Component metadata or in the proper Component manifest. * * @return {object} services configuration * @private * @since 1.15.1 * @experimental Since 1.15.1. Implementation might change. * @deprecated Since 1.27.1. Please use the sap.ui.core.ComponentMetadata#getManifest */ ComponentMetadata.prototype.getServices = function() { Log.warning("Usage of sap.ui.core.ComponentMetadata.protoype.getServices is deprecated!"); // legacy API - for the manifest services has a different meaning! return this._oStaticInfo.services || {}; }; /** * Converts the legacy metadata into the new manifest format * @private */ ComponentMetadata.prototype._convertLegacyMetadata = function(oStaticInfo, oManifest) { // this function can be outsourced in future when the ComponentMetadata // is not used anymore and the new Application manifest is used - // but for now we keep it as it will be one of the common use cases // to have the classical ComponentMetadata and this should be // transformed into the new manifest structure for compatibility // converter for array with string values to object var fnCreateObject = function(a, fnCallback) { var o = {}; if (a) { for (var i = 0, l = a.length; i < l; i++) { var oValue = a[i]; if (typeof oValue === "string") { o[oValue] = typeof fnCallback === "function" && fnCallback(oValue) || {}; } } } return o; }; // add the old information on component metadata to the manifest info var oAppManifest = oManifest["sap.app"]; var oUI5Manifest = oManifest["sap.ui5"]; // we do not merge the manifest and the metadata - once a manifest // entry exists, the metadata entries will be ignored and the specific // metadata entry needs to be migrated into the manifest. for (var sName in oStaticInfo) { var oValue = oStaticInfo[sName]; if (oValue !== undefined) { switch (sName) { case "name": oManifest[sName] = oManifest[sName] || oValue; oAppManifest["id"] = oAppManifest["id"] || oValue; break; case "description": case "keywords": oAppManifest[sName] = oAppManifest[sName] || oValue; break; case "version": var mAppVersion = oAppManifest.applicationVersion = oAppManifest.applicationVersion || {}; mAppVersion.version = mAppVersion.version || oValue; break; case "config": oUI5Manifest[sName] = oUI5Manifest[sName] || oValue; break; case "customizing": var mExtends = oUI5Manifest["extends"] = oUI5Manifest["extends"] || {}; mExtends.extensions = mExtends.extensions || oValue; break; case "dependencies": if (!oUI5Manifest[sName]) { oUI5Manifest[sName] = {}; oUI5Manifest[sName].minUI5Version = oValue.ui5version; oUI5Manifest[sName].libs = fnCreateObject(oValue.libs); oUI5Manifest[sName].components = fnCreateObject(oValue.components); } break; case "includes": if (!oUI5Manifest["resources"]) { oUI5Manifest["resources"] = {}; if (oValue && oValue.length > 0) { for (var i = 0, l = oValue.length; i < l; i++) { var sResource = oValue[i]; var m = sResource.match(/\.(css|js)$/i); if (m) { oUI5Manifest["resources"][m[1]] = oUI5Manifest["resources"][m[1]] || []; oUI5Manifest["resources"][m[1]].push({ "uri": sResource }); } } } } break; case "handleValidation": if (oUI5Manifest[sName] === undefined) { oUI5Manifest[sName] = oValue; } break; case "models": if (!oUI5Manifest["models"]) { var oModels = {}; for (var sModel in oValue) { var oDS = oValue[sModel]; var oModel = {}; for (var sDSSetting in oDS) { var oDSSetting = oDS[sDSSetting]; switch (sDSSetting) { case "type": case "uri": oModel[sDSSetting] = oDSSetting; break; default: oModel.settings = oModel.settings || {}; oModel.settings[sDSSetting] = oDSSetting; } } oModels[sModel] = oModel; } oUI5Manifest["models"] = oModels; } break; // no default } } } }; return ComponentMetadata; }, /* bExport= */ true);