blob: 7158fb00735bb30d1760c9bc3f7c8a1d4c1b391b [file] [log] [blame]
// Copyright (c) 2000-2019 Ericsson Telecom AB Telecom AB //
// All rights reserved. This program and the accompanying materials are made available under the //
// terms of the Eclipse Public License v2.0 which accompanies this distribution, and is available at //
// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html //
///////////////////////////////////////////////////////////////////////////////////////////////////////
function DataSourceUtils() {
"use strict";
var v_this = this;
this.convertHelpToTreeDataArray = function(p_help, p_elementIcon) {
var v_contents = [];
var info;
for (var i = 0; i < p_help.length; i++) {
var v_childrens = [];
var v_row = {};
if (p_help[i].dataElement != undefined) {
v_row.text = p_help[i].dataElement.name;
if (p_elementIcon)
v_row.icon = p_elementIcon;
}
else {
v_row.text = p_help[i].source;
}
if (p_help[i].dataElement != undefined) {
info = JSON.stringify(p_help[i].dataElement, null, 4);
info = replaceAll(info , '\\"', "'");
info = replaceAll(info , '"', "'");
} else {
info = "No description";
}
v_row.data = info;
if (p_help[i].children != undefined && p_help[i].children.length > 0) {
v_childrens = this.convertHelpToTreeDataArray(p_help[i].children, p_elementIcon);
} else if (p_help[i].dataElements != undefined && p_help[i].dataElements.length > 0) {
v_childrens = this.convertHelpToTreeDataArray(p_help[i].dataElements, p_elementIcon);
}
v_row.children = v_childrens;
v_contents.push(v_row);
}
return v_contents;
};
this.convertRequestToTreeDataArray = function(a_request) {
var v_content = [];
for (var i = 0; i < a_request.length; i++) {
var v_childrens = [];
var v_row = {};
var setOrGetData;
if (a_request[i].getData)
setOrGetData = "getData";
else if (a_request[i].setData)
setOrGetData = "setData";
if (setOrGetData && a_request[i][setOrGetData] && a_request[i][setOrGetData].children != undefined && a_request[i][setOrGetData].children.length > 0) {
v_childrens = this.convertRequestToTreeDataArray(a_request[i][setOrGetData].children);
}
if (a_request[i][setOrGetData])
v_row.text = a_request[i][setOrGetData].element;
if (v_childrens.length > 0) {
v_row.children = v_childrens;
}
v_content.push(v_row);
}
return v_content;
};
this.dataSkeletonEquals = function(response1, response2) {
if (response1 == undefined && response2 == undefined)
return true;
else if ((response1 == undefined && response2 != undefined) || (response2 == undefined && response1 != undefined))
return false;
else if (response1.node != undefined && response2.node != undefined)
{
if ((response1.node.childVals == undefined) && (response2.node.childVals == undefined))
return true;
else if ((response1.node.childVals != undefined) && (response2.node.childVals != undefined))
{
if (response1.node.childVals.length !== response2.node.childVals.length)
return false;
for (var i = 0; i < response1.node.childVals.length; i++)
if (!this.dataSkeletonEquals(response1.node.childVals[i], response2.node.childVals[i]))
return false;
return true;
}
else
return false;
}
else if (response1.list != undefined && response2.list != undefined)
{
if (response1.list.length !== response2.list.length)
return false;
for (var j = 0; j < response1.list.length; j++)
if (!this.dataSkeletonEquals(response1.list[j], response2.list[j]))
return false;
return true;
}
else if (response1.length != undefined)
{
if (response2.length == undefined)
return false;
if (response1.length !== response2.length)
return false;
for (var k = 0; k < response1.length; k++)
if (!this.dataSkeletonEquals(response1[k], response2[k]))
return false;
return true;
}
else
return false;
};
this.expandResponse = function(a_response, a_nestingLevel, a_parentList, a_parentIndexes, a_request, aIdxInList) {
var lParentList;
var lParentIndexes;
if (a_response)
{
if (a_response.length != undefined) // childVals or root list
{
if (a_request == undefined || a_response.length != a_request.length) {
return false;
}
for (var i = 0; i < a_response.length; i++)
{
lParentList = [];
for (var j = 0; j < a_parentList.length; j++)
lParentList[j] = a_parentList[j];
lParentIndexes = mcopy(a_parentIndexes);
if (a_request)
if (!this.expandResponse(a_response[i], a_nestingLevel + 1, lParentList, lParentIndexes, a_request[i])) {
return false;
}
}
}
else if (a_response.node != undefined && a_request != undefined)
{
var getOrSetData;
if (a_request.getData != undefined) {
getOrSetData = "getData";
} else if (a_request.setData != undefined) {
getOrSetData = "setData";
} else {
return false;
}
a_response.getData = {};
a_response.getData.tp = a_response.node.tp;
a_response.getData.source = a_request[getOrSetData].source;
a_response.getData.element = a_request[getOrSetData].element;
if (a_request[getOrSetData].ptcname != undefined)
a_response.getData.ptcname = a_request[getOrSetData].ptcname;
if (a_request[getOrSetData].params != undefined)
{
a_response.getData.params = [];
for (var j = 0; j < a_request[getOrSetData].params.length; j++)
{
a_response.getData.params[j] = {};
a_response.getData.params[j].paramName = a_request[getOrSetData].params[j].paramName;
a_response.getData.params[j].paramValue = a_request[getOrSetData].params[j].paramValue;
}
}
a_response.getData.idxInList = aIdxInList;
a_parentList[a_parentList.length] = a_response.node.val;
a_parentIndexes[a_parentIndexes.length] = aIdxInList;
completeGetDataParameters(a_response.getData, a_parentList, a_parentIndexes);
if (a_response.node.childVals != undefined) {
var ans = this.expandResponse(a_response.node.childVals, a_nestingLevel, a_parentList, a_parentIndexes, a_request[getOrSetData].children);
if (!ans) {
return false;
} else {
a_response.node.childVals = ans;
}
} else {
if (a_response.node.tp != 0 && a_request[getOrSetData].children != undefined && a_request[getOrSetData].children.length != 0 && (a_request[getOrSetData].selection == undefined || aIdxInList == a_request[getOrSetData].selection[0])) {
return false;
}
}
a_response.getData.origRq = a_request[getOrSetData];
}
else if (a_response.list != undefined)
{
for (var i = 0; i < a_response.list.length; i++)
{
lParentList = [];
for (var j = 0; j < a_parentList.length; j++)
lParentList[j] = a_parentList[j];
lParentIndexes = mcopy(a_parentIndexes);
if (!this.expandResponse(a_response.list[i], a_nestingLevel + 1, lParentList, lParentIndexes, a_request, i)) {
return false;
}
}
}
else
{
return false;
}
}
return a_response;
};
this.isResponseToRequest = function(p_contentList, p_requests) {
if (p_contentList.length != p_requests.length) {
// at least one response is missing
return false;
}
for (var i = 0; i < p_requests.length; ++i) {
var request = p_requests[i].getData;
var response = p_contentList[i];
if (response.node != undefined) {
if (request.children != undefined && response.node.childVals != undefined) {
if (!this.isResponseToRequest(response.node.childVals, request.children)) {
return false;
}
}
if (request.children != undefined && request.children.length > 0 && (response.node.childVals == undefined || response.node.childVals.length == 0) && request.filter == undefined) {
// the response is a node, the request has children and no filter but the response does not have childVals
return false;
} else if (response.node.childVals != undefined && response.node.childVals.length != 0 && (request.children == undefined || request.children.length == 0)) {
// the response has childVals but the request does not have children
return false;
}
} else if (response.list != undefined) {
if (request.selectionValues != undefined && request.selectionValues[0] != undefined && response.list[0] != undefined && request.selectionValues[0] != response.list[0].node.val) {
// response is a lisr, request has selection value but the response is different
return false;
}
for (var j = 0; j < response.list.length; ++j) {
var responseNode = response.list[j];
if (responseNode.node.childVals != undefined && responseNode.node.childVals.length > 0) {
if (request.children == undefined || request.children.length == 0) {
// response has childVals but the request does not have children
return false;
}
if (request.selectionValues != undefined) {
if (j > 0) {
// request has selection values and a response other than the first has childVals
return false;
}
} else if (request.selection != undefined) {
if (request.selection[0] != j) {
// request has selection and a response other than the one specified by the selection has childVals
return false;
}
}
if (!this.isResponseToRequest(responseNode.node.childVals, request.children)) {
return false;
}
}
}
} else {
// response is not a node and not a list
return false;
}
}
return true;
}
/*
// childVals or root response, children or root requests
this.expandResponse = function(p_contentList, p_requests, p_parentList) {
if (p_contentList != undefined) {
for (var i = 0; i < p_requests.length; ++i) {
expand(p_contentList[i], p_requests[i], p_parentList);
}
}
return p_contentList;
};
function expand(p_content, p_request, p_parentList) {
if (p_content != undefined && p_content.node != undefined) {
addRequestToResponse(p_content, p_request, undefined, p_parentList);
if (p_request.getData != undefined && p_request.getData.children != undefined) {
p_parentList.push(p_content.node.val);
v_this.expandResponse(p_content.node.childVals, p_request.getData.children, p_parentList);
p_parentList.pop();
}
} else if (p_content != undefined && p_content.list != undefined) {
for (var i = 0; i < p_content.list.length; ++i) {
addRequestToResponse(p_content.list[i], p_request, i, p_parentList);
if (p_request.getData != undefined && p_request.getData.children != undefined) {
p_parentList.push(p_content.list[i].node.val);
v_this.expandResponse(p_content.list[i].node.childVals, p_request.getData.children, p_parentList);
p_parentList.pop();
}
}
}
}
function addRequestToResponse(p_node, p_request, p_indexInList, p_parentList) {
var getOrSetData;
if (p_request.getData != undefined) {
getOrSetData = p_request.getData;
} else if (p_request.setData != undefined) {
getOrSetData = p_request.setData;
} else {
return;
}
p_node.getData = {};
p_node.getData.tp = p_node.node.tp;
p_node.getData.source = getOrSetData.source;
p_node.getData.element = getOrSetData.element;
p_node.getData.ptcname = getOrSetData.ptcname;
if (getOrSetData.params != undefined) {
p_node.getData.params = [];
for (var i = 0; i < getOrSetData.params.length; i++) {
p_node.getData.params[i] = {};
p_node.getData.params[i].paramName = getOrSetData.params[i].paramName;
p_node.getData.params[i].paramValue = getOrSetData.params[i].paramValue;
}
}
p_node.getData.idxInList = p_indexInList;
p_node.getData.origRq = getOrSetData;
completeGetDataParameters(p_node.getData, p_parentList);
}
*/
function completeGetDataParameters(pl_getData, pl_parentList, pl_parentIndexes) {
function replaceTemplate(pl_replaceTemplate, pl_replaceWith) {
if (pl_getData.source === pl_replaceTemplate)
pl_getData.source = pl_replaceWith;
if (pl_getData.element === pl_replaceTemplate)
pl_getData.element = pl_replaceWith;
if (pl_getData.ptcname === pl_replaceTemplate)
pl_getData.ptcname = pl_replaceWith;
if (pl_getData.params != undefined)
for (var i = 0; i < pl_getData.params.length; i++)
if (pl_getData.params[i].paramValue === pl_replaceTemplate)
pl_getData.params[i].paramValue = pl_replaceWith;
}
for (var vl_i = 0; vl_i < pl_parentList.length; vl_i++) {
replaceTemplate("%Parent" + vl_i + "%", pl_parentList[vl_i]);
replaceTemplate("%Parent" + vl_i + "::idx%", "" + pl_parentIndexes[vl_i]);
}
}
this.setValue = function(requestList, contentList, path, indexInList, value, additionalSelections) {
var nextSelectionIndex = 0;
var parents = [];
var parentIndexes = [];
var request;
var response;
for (var i = 0; i < path.length; ++i) {
if (requestList == undefined || contentList == undefined || requestList[path[i]] == undefined || contentList[path[i]] == undefined) {
// the response or the request has no more children, but the path points below the current element
return undefined;
}
request = requestList[path[i]];
response = contentList[path[i]];
if (response.node != undefined) {
parents.push(response.node.val);
parentIndexes.push(0);
} else if (response.list != undefined) {
if (request.getData.selectionValues != undefined && request.getData.selectionValues[0] != undefined) {
response = response.list[0];
if (response == undefined) {
// the response list is not long enough
return undefined;
}
parents.push(response.node.val);
parentIndexes.push(request.getData.selection[0]);
} else if (request.getData.selection != undefined && request.getData.selection[0] != undefined) {
response = response.list[request.getData.selection[0]];
if (response == undefined) {
return undefined;
}
parents.push(response.node.val);
parentIndexes.push(request.getData.selection[0]);
} else if (additionalSelections != undefined && additionalSelections[nextSelectionIndex] != undefined) {
response = response.list[additionalSelections[nextSelectionIndex]];
if (response == undefined) {
return undefined;
}
parents.push(response.node.val);
parentIndexes.push(additionalSelections[nextSelectionIndex]);
++nextSelectionIndex;
} else {
if (i == path.length - 1) {
// this is the last element and we might be setting a list in which case we do not need to go further
break;
} else {
// we could not find out the index of the element below which the path points
return undefined;
}
}
}
requestList = request.getData.children;
contentList = response.node.childVals;
}
if (request != undefined && response != undefined) {
return createSetData(request, response, parents, parentIndexes, indexInList, value);
} else {
return undefined;
}
};
function createSetData(request, response, parents, parentIndexes, indexInList, value) {
var setData = {"setData": {}};
setData.setData.source = request.getData.source;
setData.setData.element = request.getData.element;
setData.setData.ptcname = request.getData.ptcname;
if (indexInList != undefined) {
setData.setData.indxsInList = [indexInList];
}
setData.setData.content = value;
if (request.getData.params != undefined) {
setData.setData.params = mcopy(request.getData.params);
}
if (response.node != undefined) {
setData.setData.tp = response.node.tp;
} else if (response.list != undefined) {
setData.setData.tp = response.list[0].node.tp;
} else {
return undefined
}
for (var i = 0; i < parents.length; ++i) {
completeParams(setData.setData, parents, parentIndexes, i);
}
return setData;
}
function completeParams(setData, parents, parentIndexes, i) {
var patternForParent = new RegExp("%Parent" + i + "%");
var patternForParentIndex = new RegExp("%Parent" + i + "::idx%");
setData.source = setData.source.replace(patternForParentIndex, parentIndexes[i]);
setData.source = setData.source.replace(patternForParent, parents[i]);
setData.element = setData.element.replace(patternForParentIndex, parentIndexes[i]);
setData.element = setData.element.replace(patternForParent, parents[i]);
if (setData.ptcname != undefined) {
setData.ptcname = setData.ptcname.replace(patternForParentIndex, parentIndexes[i]);
setData.ptcname = setData.ptcname.replace(patternForParent, parents[i]);
}
if (setData.params != undefined) {
for (var j = 0; j < setData.params.length; ++j) {
setData.params[j].paramValue = setData.params[j].paramValue.replace(patternForParentIndex, parentIndexes[i]);
setData.params[j].paramValue = setData.params[j].paramValue.replace(patternForParent, parents[i]);
}
}
}
}