UNPKG

@openui5/sap.ui.core

Version:

OpenUI5 Core Library sap.ui.core

159 lines (136 loc) 6.28 kB
/*! * OpenUI5 * (c) Copyright 2009-2021 SAP SE or an SAP affiliate company. * Licensed under the Apache License, Version 2.0 - see LICENSE.txt. */ /** * Analytical Adapter for ODataModels * * @namespace * @name sap.ui.model.analytics * @public */ // Provides class ODataModelAdapter sap.ui.define(['./AnalyticalBinding', "./AnalyticalTreeBindingAdapter", './odata4analytics', './AnalyticalVersionInfo', "sap/base/Log"], function(AnalyticalBinding, AnalyticalTreeBindingAdapter, odata4analytics, AnalyticalVersionInfo, Log) { "use strict"; /** * If called on an instance of an (v1/v2) ODataModel it will enrich it with analytics capabilities. * * @alias sap.ui.model.analytics.ODataModelAdapter * @function * @experimental This module is only for experimental use! * @protected */ var ODataModelAdapter = function() { // "this" is the prototype now when called with apply() // make sure the version is set correctly, depending on the used ODataModel var iModelVersion = AnalyticalVersionInfo.getVersion(this); // ensure only ODataModel are enhanced which have not been enhanced yet if (iModelVersion === AnalyticalVersionInfo.NONE || this.getAnalyticalExtensions) { return; } // Keep a reference on the bindList and bindTree function before applying the Adapter-Functions, // this way the old functions do not get lost and the correct one is used for "prototype" calls. // Previously only the ODataModel V1 prototype functions would get called this._mPreadapterFunctions = { bindList: this.bindList, bindTree: this.bindTree }; // apply the methods of the adapters prototype to the ODataModelAdapter instance for (var fn in ODataModelAdapter.prototype) { if (ODataModelAdapter.prototype.hasOwnProperty(fn)) { this[fn] = ODataModelAdapter.prototype[fn]; } } //initialise the Analytical Extension during the metadata loaded Event of the v2.ODataModel /*if (iModelVersion === AnalyticalVersionInfo.V2 && !(this.oMetadata && this.oMetadata.isLoaded())) { var that = this; this.attachMetadataLoaded(function () { Log.info("ODataModelAdapter: Running on ODataModel V2, Metadata was loaded; initialising analytics model."); that.getAnalyticalExtensions(); }); }*/ // disable the count support (inline count is required for AnalyticalBinding) if (iModelVersion === AnalyticalVersionInfo.V1 && this.isCountSupported()) { Log.info("ODataModelAdapter: switched ODataModel to use inlinecount (mandatory for the AnalyticalBinding)"); this.setCountSupported(false); } }; /* * @see sap.ui.model.odata.ODataModel#bindList * @see sap.ui.model.odata.v2.ODataModel#bindList */ ODataModelAdapter.prototype.bindList = function(sPath, oContext, aSorters, aFilters, mParameters) { // detection for usage of AnalyticalBinding (aligned with AnalyticalTable#bindRows) if (mParameters && mParameters.analyticalInfo) { var oBinding = new AnalyticalBinding(this, sPath, oContext, aSorters, aFilters, mParameters); AnalyticalTreeBindingAdapter.apply(oBinding); // enhance the TreeBinding wit an adapter for the ListBinding return oBinding; } else { // calling the preadapter functions makes sure, that v1 or v2 ODataListBindings get instantiated, depending on the model return this._mPreadapterFunctions.bindList.apply(this, arguments); } }; /* * @see sap.ui.model.odata.ODataModel#bindTree * @see sap.ui.model.odata.v2.ODataModel#bindTree */ ODataModelAdapter.prototype.bindTree = function(sPath, oContext, aFilters, mParameters) { // detection for usage of AnalyticalBinding (aligned with AnalyticalTable#bindRows) if (mParameters && mParameters.analyticalInfo) { var oBinding = new AnalyticalBinding(this, sPath, oContext, [], aFilters, mParameters); return oBinding; } else { // calling the preadapter functions makes sure, that v1 or v2 ODataTreeBindings get instantiated, depending on the model return this._mPreadapterFunctions.bindTree.apply(this, arguments); } }; /** * @return {sap.ui.model.analytics.odata4analytics.Model} Model providing access to analytical * extensions of the OData model or null if the services does not * include analytical extensions * @public */ ODataModelAdapter.prototype.getAnalyticalExtensions = function() { // initialize API by loading the analytical OData model if (this.oOData4SAPAnalyticsModel != undefined && this.oOData4SAPAnalyticsModel != null) { return this.oOData4SAPAnalyticsModel; } var iModelVersion = AnalyticalVersionInfo.getVersion(this); // Throw Error if metadata was not loaded if (iModelVersion === AnalyticalVersionInfo.V2 && !(this.oMetadata && this.oMetadata.isLoaded())) { throw "Failed to get the analytical extensions. The metadata have not been loaded by the model yet." + "Register for the 'metadataLoaded' event of the ODataModel(v2) to know when the analytical extensions can be retrieved."; } var sAnnotationDoc = null; if (arguments.length == 1) { // hidden feature: load resource with additional analytical metadata // defined in a JSON format var sAnnotationDocURI = arguments[0]; // TODO: migration not possible. jQuery.sap.syncGetText is deprecated. Please use native <code>XMLHttpRequest</code> var oResult = jQuery.sap.syncGetText(sAnnotationDocURI); if (oResult.success) { sAnnotationDoc = oResult.data; } } // initialize API by loading the analytical OData model try { this.oOData4SAPAnalyticsModel = new odata4analytics.Model(new odata4analytics.Model.ReferenceByModel(this), {sAnnotationJSONDoc: sAnnotationDoc}); } catch (exception) { throw "Failed to instantiate analytical extensions for given OData model: " + exception.message; } return this.oOData4SAPAnalyticsModel; }; /** * Set the model to be used by the ODataModelAdapter for providing access to analytical * extensions of the OData model. * * @param {sap.ui.model.analytics.odata4analytics.Model} oOData4SAPAnalyticsModel The model to be used * @public */ ODataModelAdapter.prototype.setAnalyticalExtensions = function(oOData4SAPAnalyticsModel) { this.oOData4SAPAnalyticsModel = oOData4SAPAnalyticsModel; }; return ODataModelAdapter; }, /* bExport= */ true);