blob: 8673468632cfe01c41668c9261556c3d6f796f73 [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 CSetup_Model(p_fileHandler) {
"use strict";
var v_setupDirectory = "";
var v_fileHandler = p_fileHandler;
var v_setup = {};
this.setSetupDirectory = function(directory) {
v_setupDirectory = directory;
};
this.newSetup = function() {
v_setup.request = new JsonLoader(undefined, v_fileHandler, []);
v_setup.viewmodels = new JsonLoader(undefined, v_fileHandler, []);
v_setup.views = new JsonLoader(undefined, v_fileHandler, []);
v_setup.imports = new JsonLoader(undefined, v_fileHandler, []);
v_setup.desktop = new JsonLoader(undefined, v_fileHandler, {});
v_setup.html = new FileLoader(undefined, v_fileHandler, '<div id="div_id"></div>');
v_setup.css = new FileLoader(undefined, v_fileHandler);
v_setup.name = undefined;
return v_setup;
};
this.loadSetup = function(setupName, callback, doNotResolveImports, setupParams) {
function importsResolved(ok) {
callback(ok, v_setup, setupName)
}
function setupLoaded(ok, setup, setupName) {
if (doNotResolveImports == undefined || doNotResolveImports == false) {
resolveImports(importsResolved)
} else {
callback(ok, setup, setupName);
}
}
loadSetupFromFiles(setupName, v_setup, setupParams, setupLoaded);
};
function loadSetupFromFiles(setupName, setup, setupParams, callback) {
var setupLocation = v_setupDirectory + "/" + setupName;
function jsonImported(ok, data) {
if (setupParams != undefined && Object.keys(setupParams).length > 0) {
replaceSetupParams(setup);
}
if (callback != undefined) {
callback(ok, setup, setupName);
}
}
setup.request = new JsonLoader(setupLocation + "/Request.json", v_fileHandler, []);
setup.viewmodels = new JsonLoader(setupLocation + "/ViewModelInstances.json", v_fileHandler, []);
setup.views = new JsonLoader(setupLocation + "/ViewInstances.json", v_fileHandler, []);
setup.imports = new JsonLoader(setupLocation + "/Imports.json", v_fileHandler, []);
setup.desktop = new JsonLoader(setupLocation + "/Desktop.json", v_fileHandler, {});
setup.html = new FileLoader(setupLocation + "/Setup.html", v_fileHandler);
setup.css = new FileLoader(setupLocation + "/Setup.css", v_fileHandler);
setup.name = setupName;
setup.setupParams = setupParams;
var taskList = new TaskList([setup.request, setup.viewmodels, setup.views, setup.imports, setup.desktop, setup.html, setup.css], jsonImported);
taskList.taskOperation();
}
this.getSetup = function() {
return v_setup;
};
this.saveSetup = function(callback) {
var taskList = new TaskList([
new JsonSaveTask(v_setup.request, undefined),
new JsonSaveTask(v_setup.viewmodels, undefined),
new JsonSaveTask(v_setup.views, undefined),
new JsonSaveTask(v_setup.imports, undefined),
new JsonSaveTask(v_setup.desktop, undefined),
new FileSaveTask(v_setup.html, undefined, undefined),
new FileSaveTask(v_setup.css, undefined, undefined),
], callback);
taskList.taskOperation();
};
this.saveSetupAs = function(setupName, callback) {
v_setup.name = setupName;
var directory = v_setupDirectory + "/" + setupName;
function directoryCreated(success) {
if (!success) {
callback(false);
return;
}
var taskList = new TaskList([
new JsonSaveTask(v_setup.request, directory + "/Request.json"),
new JsonSaveTask(v_setup.viewmodels, directory + "/ViewModelInstances.json"),
new JsonSaveTask(v_setup.views, directory + "/ViewInstances.json"),
new JsonSaveTask(v_setup.imports, directory + "/Imports.json"),
new JsonSaveTask(v_setup.desktop, directory + "/Desktop.json"),
new FileSaveTask(v_setup.html, undefined, directory + "/Setup.html"),
new FileSaveTask(v_setup.css, undefined, directory + "/Setup.css"),
], callback);
taskList.taskOperation();
}
function gotExistance(exists) {
if (exists) {
directoryCreated(true);
} else {
v_fileHandler.createDirectory(directory, directoryCreated);
}
}
this.setupExists(setupName, gotExistance);
};
this.deleteSetup = function(p_setupName, callback) {
var setupName = v_setupDirectory + "/" + p_setupName;
v_fileHandler.delDirectory(setupName, callback);
};
this.setupExists = function(p_setupName, callback) {
var setupLoaction = v_setupDirectory + "/" + p_setupName;
function setupsListed(setupDirs) {
for (var i = 0; i < setupDirs.length; ++i) {
if (setupLoaction === setupDirs[i].fileName) {
callback(true);
return;
}
}
callback(false);
}
listSetupDirs(setupsListed);
};
this.listSetups = function(a_callback) {
var callback = a_callback;
function setupsDirectoryLoaded(a_directories) {
var result = [];
for (var i = 0; i < a_directories.length; ++i) {
result.push(a_directories[i].fileName.substring(a_directories[i].fileName.lastIndexOf("/") + 1));
}
result.sort();
callback(result);
}
listSetupDirs(setupsDirectoryLoaded);
};
this.globalSetupSearch = function(input, choices, p_callback) {
input = input.toLowerCase();
var indexes = [];
var tasks = [];
function SearchTask(fileName, index) {
var v_fileName = fileName;
var v_index = index;
this.taskOperation = function(callback) {
v_fileHandler.loadFile(v_fileName, function(ok, data) {
if (data.toLowerCase().indexOf(input) != -1 && indexes.indexOf(v_index) == -1) {
indexes.push(v_index);
}
callback(true);
});
}
}
function searchComplete() {
p_callback(indexes);
}
for (var i = 0; i < choices.length; ++i) {
tasks.push(new SearchTask(v_setupDirectory + "/" + choices[i].value + "/Request.json", i));
tasks.push(new SearchTask(v_setupDirectory + "/" + choices[i].value + "/ViewModelInstances.json", i));
tasks.push(new SearchTask(v_setupDirectory + "/" + choices[i].value + "/ViewInstances.json", i));
tasks.push(new SearchTask(v_setupDirectory + "/" + choices[i].value + "/Imports.json", i));
tasks.push(new SearchTask(v_setupDirectory + "/" + choices[i].value + "/Setup.html", i));
tasks.push(new SearchTask(v_setupDirectory + "/" + choices[i].value + "/Setup.css", i));
}
var taskList = new TaskList(tasks, searchComplete);
taskList.taskOperation();
};
this.setAPI = function(a_api) {
v_fileHandler = a_api;
};
function replaceSetupParams(setup) {
var setupParts = ["request", "viewmodels", "views", "imports"];
for (var i = 0; i < setupParts.length; ++i) {
var data = JSON.stringify(setup[setupParts[i]].getData());
for (var key in setup.setupParams) {
data = data.replace(key, setup.setupParams[key]);
}
setup[setupParts[i]].setData(JSON.parse(data));
}
setupParts = ["html", "css"];
for (var i = 0; i < setupParts.length; ++i) {
var data = setup[setupParts[i]].getData();
for (var key in setup.setupParams) {
data = data.replace(key, setup.setupParams[key]);
}
setup[setupParts[i]].setData(data);
}
}
function listSetupDirs(a_callback) {
v_fileHandler.getDirectory(v_setupDirectory, a_callback);
}
function resolveImports(a_callback) {
var importResolver = new CImportResolver(v_setup, loadSetupFromFiles);
importResolver.resolveImports(a_callback);
}
}
function CImportResolver(a_setup, a_setupLoaderFunction) {
var v_setup = a_setup;
var loadSetupFromFiles = a_setupLoaderFunction;
this.resolveImports = function(a_callback) {
mergeSetups(v_setup.imports.getData(), [v_setup.name], a_callback);
};
function mergeSetups(importList, importedSetupsPath, callback) {
if (importList.length == 0) {
callback(true);
} else {
var mergeTasks = [];
for (var i = 0; i < importList.length; ++i) {
if (importedSetupsPath.indexOf(importList[i].setupName) != -1) {
alert("Circular importation of setups detected: " + importedSetupsPath + " " + importList[i].setupName);
} else {
var viewIdPrefixes = "i" + importedSetupsPath.length + "_" + i + "_";
mergeTasks.push(new MergeTask(importList[i].setupName, importedSetupsPath, viewIdPrefixes, importList[i].parentID, importList[i].requetsPath, importList[i].setupParams));
}
}
var taskList = new TaskList(mergeTasks, callback);
taskList.taskOperation();
}
}
function MergeTask(setupName, importedSetupsPath, viewIdPrefixes, parentID, requetsPath, setupParams) {
var name = setupName;
var path = mcopy(importedSetupsPath);
path.push(name);
var params = setupParams;
var prefix = viewIdPrefixes;
var idToCreate = parentID;
this.taskOperation = function(callback) {
function setupLoaded(ok, setup, setupName) {
if (ok) {
mergeSetup(setup, prefix, idToCreate, requetsPath);
mergeSetups(setup.imports.getData(), path, callback);
} else {
alert("Failed to load imported setup: " + name);
callback(true);
}
}
loadSetupFromFiles(name, {}, params, setupLoaded);
}
}
function mergeSetup(setup, viewIdPrefixes, parentID, requetsPath) {
var viewModelIndexOffset = v_setup.viewmodels.getData().length;
var requestPathPrefix = [];
if (requetsPath != undefined) {
requestPathPrefix = requetsPath;
}
var requestPathOffset = mergeRequest(setup.request.getData(), requestPathPrefix);
mergeViewmodels(setup.viewmodels.getData(), requestPathPrefix, requestPathOffset);
updateImportRequestPaths(setup.imports.getData(), requestPathPrefix, requestPathOffset);
addPrefixToIds(setup, viewIdPrefixes);
addViewForHtml(setup, parentID);
mergeViews(setup.views.getData(), viewModelIndexOffset);
mergeCss(setup.css.getData());
}
function mergeRequest(request, path) {
var requestsToExpand = v_setup.request.getData();
for (var i = 0; i < path.length; ++i) {
if (requestsToExpand[path[i]].getData.children == undefined) {
requestsToExpand[path[i]].getData.children = [];
}
requestsToExpand = requestsToExpand[path[i]].getData.children;
}
var requestPathOffset = requestsToExpand.length;
for (var i = 0; i < request.length; ++i) {
requestsToExpand.push(request[i]);
}
return requestPathOffset;
}
function mergeViewmodels(viewmodels, prefix, offset) {
var origViewmodels = v_setup.viewmodels.getData();
for (var i = 0; i < viewmodels.length; ++i) {
for (var j = 0; j < viewmodels[i].dataPathList.length; ++j) {
updatePath(viewmodels[i].dataPathList[j], prefix, offset);
}
for (var j = 0; j < viewmodels[i].selectionToControlPathList.length; ++j) {
updatePath(viewmodels[i].selectionToControlPathList[j], prefix, offset);
}
origViewmodels.push(viewmodels[i]);
}
}
function updatePath(path, prefix, offset) {
path[0] += offset;
for (var i = prefix.length - 1; i >= 0; --i) {
path.unshift(prefix[i]);
}
}
function updateImportRequestPaths(imports, prefix, offset) {
for (var i = 0; i < imports.length; ++i) {
if (imports[i].requestPath != undefined) {
updatePath(imports[i].requestPath, prefix, offset);
}
}
}
function addPrefixToIds(setup, viewIdPrefixes) {
var views = setup.views.getData();
var imports = setup.imports.getData();
var html = setup.html.getData();
for (var i = 0; i < views.length; ++i) {
views[i].parentID = viewIdPrefixes + views[i].parentID;
for (var j = 0; j < views[i].idsCreating.length; ++j) {
views[i].idsCreating[j] = viewIdPrefixes + views[i].idsCreating[j];
}
}
for (var i = 0; i < imports.length; ++i) {
imports[i].parentID = viewIdPrefixes + imports[i].parentID;
}
html = html.replace(/id="([^"]+)"/gm, function(matchedString, matchedPart, index) {
return 'id="' + viewIdPrefixes + matchedPart + '"';
});
setup.html.setData(html);
}
function addViewForHtml(setup, parentID) {
var html = setup.html.getData();
var idsCreating = [];
var pattern = new RegExp(/id="([^"]+)"/gm);
var str = html;
var match = pattern.exec(str);
while (match != undefined) {
idsCreating.push(match[1]);
match = pattern.exec(str);
}
var viewDescriptor = {
"class": "CView_Div",
"viewModelIndexes": [],
"parentID": parentID,
"idsCreating": idsCreating,
"customData": {
"text": html
}
}
setup.views.getData().unshift(viewDescriptor);
}
function mergeViews(views, offset) {
var origViews = v_setup.views.getData();
for (var i = 0; i < views.length; ++i) {
for (var j = 0; j < views[i].viewModelIndexes.length; ++j) {
views[i].viewModelIndexes[j] += offset;
}
origViews.push(views[i]);
}
}
function mergeCss(css) {
v_setup.css.setData(v_setup.css.getData() + "\n" + css);
}
}