@openui5/sap.ui.core
Version:
OpenUI5 Core Library sap.ui.core
159 lines (136 loc) • 6.28 kB
JavaScript
/*!
* 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);