@openui5/sap.ui.core
Version:
OpenUI5 Core Library sap.ui.core
690 lines (662 loc) • 27.9 kB
JavaScript
/*
* OpenUI5
* (c) Copyright 2026 SAP SE or an SAP affiliate company.
* Licensed under the Apache License, Version 2.0 - see LICENSE.txt.
*/
sap.ui.define([
"sap/ui/thirdparty/jquery",
"sap/base/util/isEmptyObject"
], function(jQuery, isEmptyObject) {
"use strict";
return {
_oConstants: {
COM_SAP_VOCABULARIES_COMMON_V1_DRAFTROOT: "com.sap.vocabularies.Common.v1.DraftRoot",
COM_SAP_VOCABULARIES_COMMON_V1_DRAFTNODE: "com.sap.vocabularies.Common.v1.DraftNode",
COM_SAP_VOCABULARIES_COMMON_V1_SEMANTICKEY: "com.sap.vocabularies.Common.v1.SemanticKey",
EMPTY_GUID: "00000000-0000-0000-0000-000000000000",
SIBLINGENTITY_NAVIGATION: "SiblingEntity",
DRAFT_ADMINISTRATIVE_DATA: "DraftAdministrativeData",
DRAFT_ADMINISTRATIVE_DATA_UUID: "DraftAdministrativeDataUUID",
ACTIVATION_ACTION: "ActivationAction",
EDIT_ACTION: "EditAction",
VALIDATE_ACTION: "ValidationFunction",
PREPARE_ACTION: "PreparationAction"
},
/**
* Enriches MockServer with draft capabilities based on the given OData service annotations.
* @param {object} oAnnotations annotation object of ODataModel
* @param {object} oMockServer
*/
handleDraft: function(oAnnotations, oMockServer) {
var MockServer = sap.ui.require("sap/ui/core/util/MockServer");
var syncAjax = MockServer._syncAjax;
// callback function to update draft specific properties post creation
var fnNewDraftPost = function(oEvent) {
var oNewEntity = oEvent.getParameter("oEntity");
oNewEntity.IsActiveEntity = false;
oNewEntity.HasActiveEntity = false;
oNewEntity.HasDraftEntity = false;
};
// callback function to update draft specific properties pre deletion
var fnDraftDelete = function(oEvent) {
var oXhr = oEvent.getParameter("oXhr");
var oEntry = syncAjax({
url: oXhr.url,
dataType: "json"
}).data.d;
// navigate to draft nodes and delete nodes
for (var i = 0; i < this._oDraftMetadata.draftNodes.length; i++) {
for (var navprop in this._mEntitySets[this._oDraftMetadata.draftRootName].navprops) {
if (this._mEntitySets[this._oDraftMetadata.draftRootName].navprops[navprop].to.entitySet === this._oDraftMetadata.draftNodes[i]) {
var oResponse = syncAjax({
url: oEntry[navprop].__deferred.uri,
dataType: "json"
});
if (oResponse.data && oResponse.data.d && oResponse.data.d.results) {
var oNode;
for (var j = 0; j < oResponse.data.d.results.length; j++) {
oNode = oResponse.data.d.results[j];
syncAjax({
url: oNode.__metadata.uri,
type: "DELETE"
});
}
}
}
}
}
};
const oDraftMetadata = oMockServer._oDraftMetadata || {};
if (oAnnotations && oAnnotations.EntityContainer) {
var oEntitySetsAnnotations = oAnnotations.EntityContainer[Object.keys(oAnnotations.EntityContainer)[0]];
//iterate over entitysets annotations
for (var sEntityset in oEntitySetsAnnotations) {
//get entity set annotations and look for DraftRoot annotation
var oEntitySetAnnotations = oEntitySetsAnnotations[sEntityset];
const sActivationAction = this._oConstants.ACTIVATION_ACTION;
const sCommonVocabularyDraftRoot = this._oConstants.COM_SAP_VOCABULARIES_COMMON_V1_DRAFTROOT;
if (oEntitySetAnnotations[sCommonVocabularyDraftRoot]) {
oDraftMetadata.draftRootName = sEntityset;
oDraftMetadata.annotations = oAnnotations;
oDraftMetadata.mockServerRootUri = oMockServer.getRootUri();
if (oEntitySetAnnotations[sCommonVocabularyDraftRoot][sActivationAction]) {
oDraftMetadata.draftRootActivationName = oEntitySetAnnotations[sCommonVocabularyDraftRoot]
[sActivationAction].String;
}
if (oDraftMetadata.draftRootActivationName) {
oDraftMetadata.draftRootActivationName = oDraftMetadata.draftRootActivationName
.substring(oDraftMetadata.draftRootActivationName.lastIndexOf("/") + 1);
}
oDraftMetadata.draftRootEditName = oEntitySetAnnotations[sCommonVocabularyDraftRoot]
[this._oConstants.EDIT_ACTION];
oDraftMetadata.draftRootEditName = oDraftMetadata.draftRootEditName
? oDraftMetadata.draftRootEditName.String
: undefined;
if (oDraftMetadata.draftRootEditName) {
oDraftMetadata.draftRootEditName = oDraftMetadata.draftRootEditName
.substring(oDraftMetadata.draftRootEditName.lastIndexOf("/") + 1);
}
oDraftMetadata.draftRootValidationName = oEntitySetAnnotations[sCommonVocabularyDraftRoot]
[this._oConstants.VALIDATE_ACTION];
oDraftMetadata.draftRootValidationName = oDraftMetadata.draftRootValidationName
? oDraftMetadata.draftRootValidationName.String
: undefined;
if (oDraftMetadata.draftRootValidationName) {
oDraftMetadata.draftRootValidationName = oDraftMetadata.draftRootValidationName
.substring(oDraftMetadata.draftRootValidationName.lastIndexOf("/") + 1);
}
oDraftMetadata.draftRootPreparationtionName = oEntitySetAnnotations[sCommonVocabularyDraftRoot]
[this._oConstants.PREPARE_ACTION];
oDraftMetadata.draftRootPreparationtionName = oDraftMetadata.draftRootPreparationtionName
? oDraftMetadata.draftRootPreparationtionName.String
: undefined;
if (oDraftMetadata.draftRootPreparationtionName) {
oDraftMetadata.draftRootPreparationtionName = oDraftMetadata.draftRootPreparationtionName
.substring(oDraftMetadata.draftRootPreparationtionName.lastIndexOf("/") + 1);
}
// extend the mockserver with addtional draft functionality encapsulated in this file
jQuery.extend(oMockServer, this);
oMockServer._oDraftMetadata = oDraftMetadata;
// A new draft is created with a POST request on the entity set for the root entities.
oMockServer.attachAfter(MockServer.HTTPMETHOD.POST, fnNewDraftPost,
oDraftMetadata.draftRootName);
// A new draft can be deleted with a DELETE request to the root entity of the new draft;
// the root entity and all dependent entities will be deleted
oMockServer.attachBefore(MockServer.HTTPMETHOD.DELETE, fnDraftDelete,
oDraftMetadata.draftRootName);
// Active documents without a related draft should return null for DraftAdministrativeData
oMockServer.attachAfter(MockServer.HTTPMETHOD.GET, this._fnDraftAdministrativeData,
oDraftMetadata.draftRootName);
}
}
}
},
/**
* Returns an array with key of the corresponding "draft-less" entity type
* @param {string} sEntityset name of the entityset
* @param {object} mEntitySets
* @return {object} array with key of the corresponding "draft-less" entity type
*/
_calcSemanticKeys: function(sEntityset, mEntitySets) {
var aSemanticKey = [];
for (var annotationsProperty in this._oDraftMetadata.annotations) {
if (annotationsProperty.lastIndexOf(mEntitySets[sEntityset].type) > -1) {
aSemanticKey = this._oDraftMetadata.annotations[annotationsProperty][this._oConstants.COM_SAP_VOCABULARIES_COMMON_V1_SEMANTICKEY] || [];
break;
}
}
var aSemanticKeys = [];
var element;
for (var i = 0; i < aSemanticKey.length; i++) {
element = aSemanticKey[i];
for (var key in element) {
aSemanticKeys.push(element[key]);
}
}
return aSemanticKeys;
},
/**
* Calculates the draft key of the draft root entityset and a list of all draft nodes
* @param {object} mEntitySets
*/
_prepareDraftMetadata: function(mEntitySets) {
var that = this;
var MockServer = sap.ui.require("sap/ui/core/util/MockServer");
this._oDraftMetadata.draftNodes = [];
this._oDraftMetadata.draftRootKey = mEntitySets[this._oDraftMetadata.draftRootName].keys.filter(function(x) {
return that._calcSemanticKeys(that._oDraftMetadata.draftRootName, mEntitySets).indexOf(x) < 0;
})[0];
var oAnnotations = that._oDraftMetadata.annotations;
var oEntitySetsAnnotations = oAnnotations.EntityContainer[Object.keys(oAnnotations.EntityContainer)[0]];
//iterate over entitysets annotations
for (var sEntityset in oEntitySetsAnnotations) {
//get entity set
var oEntitySetAnnotations = oEntitySetsAnnotations[sEntityset];
//iterate over annotations of entity set annotations and look for the draft node sets
if (oEntitySetAnnotations[that._oConstants.COM_SAP_VOCABULARIES_COMMON_V1_DRAFTNODE]) {
this._oDraftMetadata.draftNodes.push(sEntityset);
}
}
for (var j = 0; j < this._oDraftMetadata.draftNodes.length; j++) {
this.attachAfter(MockServer.HTTPMETHOD.GET, this._fnDraftAdministrativeData, this._oDraftMetadata.draftNodes[j]);
}
},
_fnDraftAdministrativeData: function(oEvent) {
var oEntry = {};
var aData = oEvent.getParameter("oFilteredData");
if (!aData) {
oEntry = oEvent.getParameter("oEntry");
if (oEntry.IsActiveEntity && !oEntry.HasDraftEntity) {
oEntry[this._oConstants.DRAFT_ADMINISTRATIVE_DATA] = null;
}
} else {
if (aData.results) {
aData = aData.results;
} else {
if (isEmptyObject(aData)) {
aData = null;
return;
}
}
for (var i = 0; i < aData.length; i++) {
oEntry = aData[i];
if (oEntry.IsActiveEntity && !oEntry.HasDraftEntity) {
oEntry[this._oConstants.DRAFT_ADMINISTRATIVE_DATA] = null;
}
}
}
},
/**
* Handles draft mock data generation
* @param {object} mEntitySets
*/
_handleDraftArtifacts: function(mEntitySets) {
var that = this;
var oMockdata = this._oMockdata;
var aDraftRoot = oMockdata[this._oDraftMetadata.draftRootName];
var fnGrep = function(aContains, aContained) {
return aContains.filter(function(x) {
return aContained.indexOf(x) < 0;
})[0];
};
if (aDraftRoot.length === 100) {
for (var i = 0; i < aDraftRoot.length; i++) {
var oEntity = aDraftRoot[i];
// active documents without a draft (0-24)
if (i < 25) {
oEntity.IsActiveEntity = true; // true for active documents
oEntity.HasActiveEntity = false; // false for new drafts and active documents
oEntity.HasDraftEntity = false; // false for active document without a draft
oEntity[this._oDraftMetadata.draftRootKey] = this._oConstants.EMPTY_GUID;
if (oEntity[this._oConstants.DRAFT_ADMINISTRATIVE_DATA_UUID]) {
oEntity[this._oConstants.DRAFT_ADMINISTRATIVE_DATA_UUID] = null;
}
var aDraftNodes = [];
var aSemanticDraftNodeKeys = [];
for (var j = 0; j < this._oDraftMetadata.draftNodes.length; j++) {
aSemanticDraftNodeKeys = this._calcSemanticKeys(this._oDraftMetadata.draftNodes[j], mEntitySets);
aDraftNodes = oMockdata[this._oDraftMetadata.draftNodes[j]];
// changing the values if there is a referential constraint
var oEntitySet = mEntitySets[this._oDraftMetadata.draftRootName];
for (var navprop in oEntitySet.navprops) {
var oNavProp = oEntitySet.navprops[navprop];
if (oNavProp.to.entitySet === this._oDraftMetadata.draftNodes[j]) {
var iPropRefLength = oNavProp.from.propRef.length;
for (var k = 0; k < iPropRefLength; k++) {
// copy the value from the principle to the dependant;
aDraftNodes[i][oNavProp.to.propRef[k]] = oEntity[oNavProp.from.propRef[k]];
}
}
}
aDraftNodes[i].IsActiveEntity = true;
aDraftNodes[i].HasActiveEntity = false;
aDraftNodes[i].HasDraftEntity = false;
aDraftNodes[i][this._oDraftMetadata.draftRootKey] = this._oConstants.EMPTY_GUID;
if (aDraftNodes[i][this._oConstants.DRAFT_ADMINISTRATIVE_DATA_UUID]) {
aDraftNodes[i][this._oConstants.DRAFT_ADMINISTRATIVE_DATA_UUID] = null;
}
var sDraftKey = fnGrep(mEntitySets[this._oDraftMetadata.draftNodes[j]].keys, aSemanticDraftNodeKeys);
aDraftNodes[i][sDraftKey] = this._oConstants.EMPTY_GUID;
}
// new drafts without corresponding active documents (25-49)
} else if (i < 50) {
oEntity.IsActiveEntity = false;
oEntity.HasActiveEntity = false;
oEntity.HasDraftEntity = false;
aDraftNodes = [];
aSemanticDraftNodeKeys = [];
for (var j = 0; j < this._oDraftMetadata.draftNodes.length; j++) {
aSemanticDraftNodeKeys = this._calcSemanticKeys(this._oDraftMetadata.draftNodes[j], mEntitySets);
aDraftNodes = oMockdata[this._oDraftMetadata.draftNodes[j]];
// changing the values if there is a referential constraint
var oEntitySet = mEntitySets[this._oDraftMetadata.draftRootName];
for (var navprop in oEntitySet.navprops) {
var oNavProp = oEntitySet.navprops[navprop];
if (oNavProp.to.entitySet === this._oDraftMetadata.draftNodes[j]) {
var iPropRefLength = oNavProp.from.propRef.length;
for (var k = 0; k < iPropRefLength; k++) {
// copy the value from the principle to the dependant;
aDraftNodes[i][oNavProp.to.propRef[k]] = oEntity[oNavProp.from.propRef[k]];
}
}
}
aDraftNodes[i].IsActiveEntity = false;
aDraftNodes[i].HasActiveEntity = false;
aDraftNodes[i].HasDraftEntity = false;
sDraftKey = fnGrep(mEntitySets[this._oDraftMetadata.draftNodes[j]].keys, aSemanticDraftNodeKeys);
}
// active documents with a corresponding draft document, a.k.a edit drafts (50-74)
} else if (i < 75) {
var oSiblingEntity = jQuery.extend(true, {}, oEntity);
oEntity.IsActiveEntity = true; // true for active documents
oEntity.HasActiveEntity = false; // false for new drafts and active documents
oEntity.HasDraftEntity = true; // false for active document without a draft
oEntity[this._oDraftMetadata.draftRootKey] = this._oConstants.EMPTY_GUID;
aDraftNodes = [];
aSemanticDraftNodeKeys = [];
for (var j = 0; j < this._oDraftMetadata.draftNodes.length; j++) {
aSemanticDraftNodeKeys = this._calcSemanticKeys(this._oDraftMetadata.draftNodes[j], mEntitySets);
aDraftNodes = oMockdata[this._oDraftMetadata.draftNodes[j]];
// changing the values if there is a referential constraint
var oEntitySet = mEntitySets[this._oDraftMetadata.draftRootName];
for (var navprop in oEntitySet.navprops) {
var oNavProp = oEntitySet.navprops[navprop];
if (oNavProp.to.entitySet === this._oDraftMetadata.draftNodes[j]) {
var iPropRefLength = oNavProp.from.propRef.length;
for (var k = 0; k < iPropRefLength; k++) {
// copy the value from the principle to the dependant;
aDraftNodes[i][oNavProp.to.propRef[k]] = oEntity[oNavProp.from.propRef[k]];
}
}
}
aDraftNodes[i].IsActiveEntity = true;
aDraftNodes[i].HasActiveEntity = false;
aDraftNodes[i].HasDraftEntity = true;
sDraftKey = fnGrep(mEntitySets[this._oDraftMetadata.draftNodes[j]].keys, aSemanticDraftNodeKeys);
aDraftNodes[i][sDraftKey] = this._oConstants.EMPTY_GUID;
}
oSiblingEntity.IsActiveEntity = false;
oSiblingEntity.HasActiveEntity = true;
oSiblingEntity.HasDraftEntity = false;
aDraftRoot[i + 25] = oSiblingEntity;
}
}
}
var sRootUri = this._getRootUri();
jQuery.each(mEntitySets, function(sEntitySetName, oEntitySet) {
jQuery.each(oMockdata[sEntitySetName], function(iIndex, oEntry) {
// add the metadata for the entry
oEntry.__metadata = oEntry.__metadata || {};
oEntry.__metadata.uri = sRootUri + sEntitySetName + "(" + that._createKeysString(oEntitySet, oEntry) + ")";
oEntry.__metadata.type = oEntitySet.schema + "." + oEntitySet.type;
// add the navigation properties
jQuery.each(oEntitySet.navprops, function(sKey) {
oEntry[sKey] = {
__deferred: {
uri: sRootUri + sEntitySetName + "(" + that._createKeysString(oEntitySet, oEntry) + ")/" + sKey
}
};
});
});
});
},
/**
* Activates a draft document
* @param {object} oEntry the draft document
*/
_activate: function(oEntry) {
var MockServer = sap.ui.require("sap/ui/core/util/MockServer");
var syncAjax = MockServer._syncAjax;
var oResponse;
var fnGrep = function(aContains, aContained) {
return aContains.filter(function(x) {
return aContained.indexOf(x) < 0;
})[0];
};
// navigate to draft nodes and activate nodes
for (var i = 0; i < this._oDraftMetadata.draftNodes.length; i++) {
for (var navprop in this._mEntitySets[this._oDraftMetadata.draftRootName].navprops) {
if (this._mEntitySets[this._oDraftMetadata.draftRootName].navprops[navprop].to.entitySet === this._oDraftMetadata.draftNodes[i]) {
oResponse = syncAjax({
url: oEntry[navprop].__deferred.uri,
dataType: "json"
});
if (oResponse.success && oResponse.data && oResponse.data.d && oResponse.data.d.results) {
var oNode;
for (var j = 0; j < oResponse.data.d.results.length; j++) {
oNode = oResponse.data.d.results[j];
oNode.IsActiveEntity = true;
oNode.HasActiveEntity = false;
oNode.HasDraftEntity = false;
oNode[this._oDraftMetadata.draftRootKey] = this._oConstants.EMPTY_GUID;
var aSemanticDraftNodeKeys = this._calcSemanticKeys(this._oDraftMetadata.draftNodes[i], this._mEntitySets);
var sDraftKey = fnGrep(this._mEntitySets[this._oDraftMetadata.draftNodes[i]].keys, aSemanticDraftNodeKeys);
oNode[sDraftKey] = this._oConstants.EMPTY_GUID;
syncAjax({
url: oNode.__metadata.uri,
type: "PATCH",
data: JSON.stringify(oNode)
});
}
}
}
}
}
oEntry.IsActiveEntity = true;
oEntry.HasActiveEntity = false;
oEntry.HasDraftEntity = false;
oEntry[this._oDraftMetadata.draftRootKey] = this._oConstants.EMPTY_GUID;
syncAjax({
url: oEntry.__metadata.uri,
type: "PATCH",
data: JSON.stringify(oEntry)
});
return oEntry;
},
// =================================
// overridden functions of MockServer
// =================================
setRequests: function(aRequests) {
var that = this;
var MockServer = sap.ui.require("sap/ui/core/util/MockServer");
var syncAjax = MockServer._syncAjax;
aRequests.push({
method: "POST",
path: new RegExp(that._oDraftMetadata.draftRootActivationName),
response: function(oXhr) {
var oRequestBody = JSON.parse(oXhr.requestBody);
var aFilter = [];
for (var property in oRequestBody) {
aFilter.push(property + " eq " + oRequestBody[property]);
}
var oResponse = syncAjax({
url: that._oDraftMetadata.mockServerRootUri + that._oDraftMetadata.draftRootName + "?$filter=" + aFilter.join(" and "),
dataType: "json"
});
if (!oResponse.success || !oResponse.data.d.results[0]) {
// respond negative - no entity found
oXhr.respond(404);
}
var oEntry = oResponse.data.d.results[0];
if (oEntry.IsActiveEntity) {
// respond negative - trying to activate an already active entity
oXhr.respond(400);
}
if (oEntry.HasActiveEntity) {
// edit draft activiation --> delete active sibling
var oSiblingEntityUri = oEntry.SiblingEntity.__deferred.uri;
oResponse = syncAjax({
url: oSiblingEntityUri,
dataType: "json"
});
if (oResponse.success && oResponse.data && oResponse.data.d.__metadata) {
var oSibling = oResponse.data.d;
oResponse = syncAjax({
url: oSibling.__metadata.uri,
type: "DELETE"
});
}
}
oEntry = that._activate(oEntry);
oXhr.respondJSON(200, {}, JSON.stringify({
d: oEntry
}));
return true;
}
});
if (that._oDraftMetadata.draftRootEditName) {
aRequests.push({
method: "POST",
path: new RegExp(that._oDraftMetadata.draftRootEditName + "(\\?(.*))?"),
response: function(oXhr, sUrlParams) {
var aFilter = [];
var oRequestBody = JSON.parse(oXhr.requestBody);
if (oRequestBody && !isEmptyObject(oRequestBody)) {
for (var property in oRequestBody) {
aFilter.push(property + " eq " + oRequestBody[property]);
}
} else {
var aUrlParams = decodeURIComponent(sUrlParams).replace("?", "&").split("&");
for (var param in aUrlParams) {
var sParamValue = aUrlParams[param];
var rKeyValue = new RegExp("(.*)=(.*)");
var aRes;
if (sParamValue) {
aRes = rKeyValue.exec(sParamValue);
aFilter.push(aRes[1] + " eq " + aRes[2]);
}
}
}
var oResponse = syncAjax({
url: that._oDraftMetadata.mockServerRootUri + that._oDraftMetadata.draftRootName + "?$filter=" + aFilter.join(" and "),
dataType: "json"
});
if (!oResponse.success || !oResponse.data.d.results[0]) {
// respond negative - no entity found
oXhr.respond(404);
}
var oEntry = oResponse.data.d.results[0];
if (!oEntry.IsActiveEntity || oEntry.HasDraftEntity) {
// respond negative - edit draft is only valid for an active document. If a business document already has an edit draft,
// the Edit action fails; there can be at most one edit draft per active business document.
oXhr.respond(400);
}
// creates a deep copy of the business document.
var oDraftEntry = jQuery.extend(true, {}, oEntry);
oDraftEntry.IsActiveEntity = false; // true for active documents
oDraftEntry.HasActiveEntity = true; // false for new drafts and active documents
oDraftEntry.HasDraftEntity = false;
oDraftEntry[that._oDraftMetadata.draftRootKey] = that._generatePropertyValue(that._oDraftMetadata.draftRootKey, "Guid");
// add the metadata for the entry
var sRootUri = that._getRootUri();
var oEntitySet = that._mEntitySets[that._oDraftMetadata.draftRootName];
oDraftEntry.__metadata = oDraftEntry.__metadata || {};
oDraftEntry.__metadata.uri = sRootUri + that._oDraftMetadata.draftRootName + "(" + that._createKeysString(oEntitySet,
oDraftEntry) + ")";
oDraftEntry.__metadata.type = oEntitySet.schema + "." + oEntitySet.type;
// add the navigation properties
jQuery.each(oEntitySet.navprops, function(sKey) {
oDraftEntry[sKey] = {
__deferred: {
uri: sRootUri + that._oDraftMetadata.draftRootName + "(" + that._createKeysString(oEntitySet, oDraftEntry) + ")/" + sKey
}
};
});
that._oMockdata[that._oDraftMetadata.draftRootName].push(oDraftEntry);
// update the active with HasDraftEntity = true
oResponse = syncAjax({
url: oEntry.__metadata.uri,
type: "PATCH",
data: JSON.stringify({
HasDraftEntity: true
})
});
oXhr.respondJSON(200, {}, JSON.stringify({
d: oDraftEntry
}));
return true;
}
});
}
if (that._oDraftMetadata.draftRootValidationName) {
aRequests.push({
method: "GET",
path: new RegExp(that._oDraftMetadata.draftRootValidationName + "(\\?(.*))?"),
response: function(oXhr, sUrlParams) {
var sValidation = that._oDraftMetadata.draftRootValidationName;
//trigger the before callback funtion
that.fireEvent(MockServer.HTTPMETHOD.GET + sValidation + ":before", {
oXhr: oXhr,
sUrlParams: sUrlParams
});
that.fireEvent(MockServer.HTTPMETHOD.GET + ":before", {
oXhr: oXhr,
sUrlParams: sUrlParams
});
var oResponse = {
d: {}
};
oResponse.d[sValidation] = {
"__metadata": {
"type": "ValidationResult"
},
"IsValid": true
};
//trigger the after callback funtion
that.fireEvent(MockServer.HTTPMETHOD.GET + sValidation + ":after", {
oXhr: oXhr,
oResult: oResponse
});
that.fireEvent(MockServer.HTTPMETHOD.GET + ":after", {
oXhr: oXhr,
oResult: oResponse
});
oXhr.respondJSON(200, {}, JSON.stringify(oResponse));
return true;
}
});
}
if (that._oDraftMetadata.draftRootPreparationtionName) {
aRequests.push({
method: "POST",
path: new RegExp(that._oDraftMetadata.draftRootPreparationtionName),
response: function(oXhr) {
//trigger the before callback funtion
that.fireEvent(MockServer.HTTPMETHOD.POST + that._oDraftMetadata.draftRootPreparationtionName + ":before", {
oXhr: oXhr
});
that.fireEvent(MockServer.HTTPMETHOD.POST + ":before", {
oXhr: oXhr
});
var oRequestBody = JSON.parse(oXhr.requestBody);
var aFilter = [];
for (var property in oRequestBody) {
aFilter.push(property + " eq " + oRequestBody[property]);
}
var oResponse = syncAjax({
url: that._oDraftMetadata.mockServerRootUri + that._oDraftMetadata.draftRootName + "?$filter=" + aFilter.join(" and "),
dataType: "json"
});
if (!oResponse.success || !oResponse.data.d.results[0]) {
// respond negative - no entity found
oXhr.respond(404);
}
var oEntry = oResponse.data.d.results[0];
//trigger the after callback funtion
that.fireEvent(MockServer.HTTPMETHOD.POST + that._oDraftMetadata.draftRootPreparationtionName + ":after", {
oXhr: oXhr,
oEntry: oEntry
});
that.fireEvent(MockServer.HTTPMETHOD.POST + ":after", {
oXhr: oXhr,
oEntry: oEntry
});
oXhr.respondJSON(200, {}, JSON.stringify({
d: oEntry
}));
return true;
}
});
}
MockServer.prototype.setRequests.apply(this, [aRequests]);
},
_generateMockdata: function(mEntitySets, sBaseUrl) {
var MockServer = sap.ui.require("sap/ui/core/util/MockServer");
MockServer.prototype._generateMockdata.apply(this, [mEntitySets, sBaseUrl]);
this._handleDraftArtifacts(mEntitySets);
},
_loadMockdata: function(mEntitySets, sBaseUrl) {
var MockServer = sap.ui.require("sap/ui/core/util/MockServer");
MockServer.prototype._loadMockdata.apply(this, [mEntitySets, sBaseUrl]);
this._handleDraftArtifacts(mEntitySets);
},
_resolveNavigation: function(sEntitySetName, oFromRecord, sNavProp, oEntry) {
var MockServer = sap.ui.require("sap/ui/core/util/MockServer");
var aEntries = MockServer.prototype._resolveNavigation.apply(this, [sEntitySetName, oFromRecord, sNavProp, oEntry]);
if (sNavProp === this._oConstants.SIBLINGENTITY_NAVIGATION) {
if (oEntry && oEntry.IsActiveEntity) {
aEntries.splice(0, 1);
} else {
aEntries.length > 1 ? aEntries.splice(1, 1) : aEntries.splice(0, 1);
}
} else if (sNavProp === this._oConstants.DRAFT_ADMINISTRATIVE_DATA) {
if (oEntry) {
if (oEntry.IsActiveEntity && !oEntry.HasDraftEntity) {
aEntries[0] = null;
}
} else {
aEntries[0] = null;
}
}
return aEntries;
},
_findEntitySets: function(oMetadata) {
var MockServer = sap.ui.require("sap/ui/core/util/MockServer");
var mEntitySets = MockServer.prototype._findEntitySets.apply(this, [oMetadata]);
this._prepareDraftMetadata(mEntitySets);
return mEntitySets;
},
getEntitySetData: function(sEntitySet) {
var MockServer = sap.ui.require("sap/ui/core/util/MockServer");
var aEntitySet = MockServer.prototype.getEntitySetData.apply(this, [sEntitySet]);
var fnGetParameter = function() {
return aEntitySet;
};
if (sEntitySet === this._oDraftMetadata.draftRootName) {
this._fnDraftAdministrativeData({
getParameter: fnGetParameter
});
return aEntitySet;
}
for (var j = 0; j < this._oDraftMetadata.draftNodes.length; j++) {
if (sEntitySet === this._oDraftMetadata.draftNodes[j]) {
this._fnDraftAdministrativeData({
getParameter: fnGetParameter
});
return aEntitySet;
}
}
return aEntitySet;
}
};
}, /* bExport= */ true);