blob: 57b61ea5c8faf0872df7beab4c3fac12b129e67d [file] [log] [blame]
// Copyright (c) 2000-2017 Ericsson 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 PlaylistEditor_Model(p_webAppModel) {
"use strict";
var v_baseModel = p_webAppModel;
var v_dsRestAPI = new DsRestAPI("appagent");
var v_currentName;
var v_playlist = {};
var v_this = this;
///////////////////// PLAYLIST HANDLING /////////////////////
this.newPlaylist = function() {
v_playlist = {};
v_currentName = undefined
return v_playlist;
};
this.deletePlaylist = function(name, callback) {
function playlistDeleted(response) {
if (response != undefined && response.node != undefined && response.node.tp == 1) {
callback(true);
} else {
callback(false);
}
}
v_dsRestAPI.setData(playlistDeleted, "Playlist", "Delete", "0", 1, [{
"paramName": "Playlist",
"paramValue": name
}]);
if (name == v_currentName) {
v_currentName = undefined;
}
};
this.loadPlaylist = function(name, callback) {
function playlistLoaded(response) {
if (response != undefined && response.node != undefined && response.node.tp == 4) {
try {
convertToVisualizablePlaylist(JSON.parse(response.node.val));
v_currentName = name;
callback(true);
} catch(e) {
callback(false);
}
} else {
callback(false);
}
}
v_dsRestAPI.getData(playlistLoaded, "Playlist", "Descriptor", [{
"paramName": "Playlist",
"paramValue": name
}]);
};
this.savePlaylist = function(callback) {
function playlistSaved(response) {
if (response != undefined && response.node != undefined && response.node.tp == 4) {
callback(true);
} else {
callback(false);
}
}
v_dsRestAPI.setData(playlistSaved, "Playlist", "Descriptor", JSON.stringify(convertToUsablePlaylist(), null, 4), 4, [{
"paramName": "Playlist",
"paramValue": v_currentName
}]);
};
this.savePlaylistAs = function(name, callback) {
var oldName = v_currentName;
v_currentName = name;
function playlistSaved(ok) {
if (!ok) {
v_currentName = oldName;
}
callback(ok);
}
v_this.savePlaylist(playlistSaved);
};
this.currentlyEdited = function() {
return v_currentName;
};
this.listPlaylists = function(callback) {
function playlistsListed(response) {
var list = [];
if (response != undefined && response.list != undefined) {
for (var i = 0; i < response.list.length; ++i) {
list.push(response.list[i].node.val);
}
callback(true, list);
} else {
callback(false);
}
}
v_dsRestAPI.getData(playlistsListed, "Playlist", "Playlists");
};
this.playlistExists = function(name, callback) {
function playlistsListed(ok, list) {
callback(ok && list.indexOf(name) != -1);
}
v_this.listPlaylists(playlistsListed);
};
this.listGroups = function(callback) {
function groupsListed(response) {
var list = [];
if (response != undefined && response.list != undefined) {
for (var i = 0; i < response.list.length; ++i) {
list.push(response.list[i].node.val);
}
callback(true, list);
} else {
callback(false);
}
}
v_dsRestAPI.getData(groupsListed, "Authentication", "ListGroupsOfUser", [{
"paramName": "User",
"paramValue": localStorage.username
}]);
};
function convertToVisualizablePlaylist(playlist) {
v_playlist = {};
for (var i = 0; i < playlist.length; ++i) {
var api = playlist[i].apiUrl;
for (var j = 0; j < playlist[i].playlist.length; ++j) {
var nextPlaylist = playlist[i].playlist[j];
nextPlaylist.api = api;
var filter = undefined;
if (nextPlaylist.condition != undefined) {
filter = nextPlaylist.condition.expression;
} else {
nextPlaylist.condition = {}
}
nextPlaylist.condition.expression = [{
"getData": {
"source": "DataSource",
"element": "Sources",
"filter": filter
}
}]
if (nextPlaylist.desktopData == undefined) {
nextPlaylist.desktopData = {
"top": i * 50,
"left": j * 50,
"visible": true
}
}
v_playlist[nextPlaylist.id] = nextPlaylist;
}
}
}
function convertToUsablePlaylist() {
var playlist = [];
var apis = {};
var insertedIds = {};
fillPlaylistByApi(playlist, apis);
var notAllInserted = true;
var inserted = true;
if (Object.keys(v_playlist).length > 0) {
while (notAllInserted && inserted) {
notAllInserted = false;
inserted = false;
for (var id in v_playlist) {
if (v_playlist[id].api != undefined && !insertedIds[id]) {
if (numberOfUnfulfilledReferences(v_playlist[id], insertedIds) == 0) {
var toInsert = mcopy(v_playlist[id]);
toInsert.api = undefined;
toInsert.condition.expression = toInsert.condition.expression[0].getData.filter;
playlist[apis[v_playlist[id].api]].playlist.push(toInsert);
insertedIds[id] = true;
inserted = true;
} else {
notAllInserted = true
}
}
}
}
}
if (!inserted) {
alert("Circular dependency found, using only the correct part.");
}
return playlist;
}
function fillPlaylistByApi(playlist, apis) {
var missingApi = false;
for (var id in v_playlist) {
var api = v_playlist[id].api;
if (api != undefined) {
if (apis[api] == undefined) {
apis[api] = playlist.length;
playlist.push({
"apiUrl": api,
"playlist": []
});
}
} else {
missingApi = true;
}
}
if (missingApi) {
alert("Some elements are missing an api, they will not be used.")
}
}
function numberOfUnfulfilledReferences(element, insertedIds) {
var count = 0;
if (element.relativeTo != undefined) {
for (var i = 0; i < element.relativeTo.length; ++i) {
if (!insertedIds[element.relativeTo[i]]) {
++count;
}
}
}
return count
}
///////////////////// EDITOR MODEL HANDLING /////////////////////
function getUnusedId() {
var i = 0;
while (v_playlist["" + i] != undefined) {
i += 1
}
return "" + i
}
this.getEditorModels = function() {
return v_playlist;
};
this.createEditorModel = function() {
var id = getUnusedId();
var playlist = {
"id": id,
"relativeTo": [],
"startTime": 0,
"api": window.location.protocol + "//" + window.location.host + "/api.appagent",
"requests": [],
"condition": {
"expression": [{
"getData": {
"source": "DataSource",
"element": "Sources"
}
}]
},
"desktopData": {
"top": 0,
"left": 300,
"visible": true,
"openNodes": []
}
};
v_playlist[id] = playlist;
return {
"id": id,
"model": playlist
};
};
this.deleteEditorModel = function(id) {
delete v_playlist[id];
for (var playlistId in v_playlist) {
var index = v_playlist[playlistId].relativeTo.indexOf(id);
if (index != -1) {
v_playlist[playlistId].relativeTo.splice(index, 1);
}
}
};
this.playlistConnection = function(p_from, p_to) {
var index = v_playlist[p_to].relativeTo.indexOf(p_from);
if (index == -1) {
v_playlist[p_to].relativeTo.push(p_from);
} else {
v_playlist[p_to].relativeTo.splice(index, 1);
}
};
///////////////////// CONFIG HANDLING /////////////////////
this.getAppConfig = v_baseModel.getAppConfig;
///////////////////// USEFUL FUNCTIONS FOR VIEWMODELS /////////////////////
function compareOptions(option1, option2) {
if (option1.text < option2.text) {
return -1;
} else if (option1.text > option2.text) {
return 1;
} else {
return 0;
}
}
this.sortOptions = function(options) {
options.sort(compareOptions);
};
this.getDsRestAPI = function() {
return v_dsRestAPI;
};
this.getFileHandler = v_baseModel.getFileHandler;
}