blob: ac0a48a4e74c64f5eb7c45c7f48e6c12a483304d [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 GenericTask(p_function) {
"use strict";
this.taskOperation = p_function;
}
/**
@param p_tasks: the list of tasks. Each task must have a taskOperation method.
@param callback: a callback function, callback(boolean success, string errorMessage) will be called when all tasks finish.
*/
function SyncTaskList(p_tasks, p_callback) {
"use strict";
var v_tasks = p_tasks;
var v_counter = -1;
var v_finished = false;
var v_success = true;
var v_data = [];
this.taskOperation = function() {
if (!v_finished) {
callback(true);
}
};
function callback(ok, data) {
if (ok && data != undefined) {
v_data[v_counter] = data;
}
if (!ok) {
v_success = false;
v_data[v_counter] = data;
p_callback(v_success, v_data);
} else if (v_counter === v_tasks.length - 1) {
v_finished = true;
p_callback(v_success, v_data);
} else {
v_counter++;
var task = v_tasks[v_counter];
if (task.taskOperation != undefined) {
task.taskOperation(callback);
} else {
if (window.console) console.error("No executable method found! " + Object.prototype.toString(task));
}
}
}
this.extend = function(p_tasks) {
for (var i = 0; i < p_tasks.length; ++i) {
v_tasks.push(p_tasks[i]);
}
};
this.push = function(p_task) {
v_tasks.push(p_task);
};
}
/**
@param p_tasks: the list of tasks. Each task must have a taskOperation method.
@param callback: a callback function, callback(boolean success, string errorMessage) will be called when all tasks finish.
*/
function TaskList(p_tasks, p_callback) {
"use strict";
var v_tasks = p_tasks;
var v_callback = p_callback;
var v_counter = v_tasks.length;
var v_finished = false;
var v_success = true;
var v_data = [];
function CTaskObject(index) {
var taskIndex = index;
this.callback = function(ok, data) {
v_data[taskIndex] = data;
v_counter--;
if (!ok) {
v_success = false;
}
checkStatus();
};
}
this.taskOperation = function() {
checkStatus();
if (!v_finished) {
for (var i = 0; i < v_tasks.length; ++i) {
if (v_tasks[i].taskOperation != undefined) {
v_tasks[i].taskOperation(new CTaskObject(i).callback);
} else {
if (window.console) console.error("No executable method found! " + Function.prototype.toString(v_tasks[i]));
}
}
}
};
function checkStatus() {
if (v_counter === 0) {
v_finished = true;
if (v_callback)
v_callback(v_success, v_data);
}
}
this.extend = function(p_tasks) {
for (var i = 0; i < p_tasks.length; ++i) {
v_tasks.push(p_tasks[i]);
++v_counter;
}
};
this.push = function(p_task) {
v_tasks.push(p_task);
++v_counter;
};
}
function JsImportTask(p_file, p_fileHandler) {
"use strict";
var v_file = p_file;
var v_fileHandler = p_fileHandler;
this.taskOperation = function(callback) {
v_fileHandler.importJsFile(v_file, callback);
};
}
function ListDirectoryTask(p_directory, p_fileHandler) {
"use strict";
/* path separator is / (like in the urls or the comment char) */
var v_directory = p_directory;
var v_fileHandler = p_fileHandler;
this.taskOperation = function(callback) {
function dirArrived(directories) {
callback(true, directories);
}
v_fileHandler.getDirectory(v_directory, dirArrived);
};
}
function JsonSaveTask(loader, name) {
var v_loader = loader;
var v_name = name;
this.taskOperation = function(callback) {
v_loader.save(v_name, callback);
};
}
function FileSaveTask(loader, content, name) {
var v_loader = loader;
var v_content = content;
var v_name = name;
this.taskOperation = function(callback) {
v_loader.save(v_content, v_name, callback);
};
}
function JsImportTaskList(p_files, p_fileHandler, p_callback) {
"use strict";
var v_fileHandler = p_fileHandler;
var tasks = [];
for (var i = 0; i < p_files.length; ++i) {
tasks.push(new JsImportTask(p_files[i], v_fileHandler));
}
var taskList = new TaskList(tasks, p_callback);
this.taskOperation = function() {
taskList.taskOperation();
};
}
function MultipleDirectoryListTask(p_loactions, p_fileHandler) {
var v_loactions = p_loactions;
var v_fileHandler = p_fileHandler;
this.taskOperation = function(callback) {
function directoriesListed(ok, data) {
var jsfiles = [];
var cssfiles = [];
var htmlfiles = [];
for (var i = 0; i < data.length; ++i) {
var files = data[i];
for (var j = 0; j < files.length; ++j) {
var fileName = files[j].fileName;
if (fileName.endsWith(".js")) {
jsfiles.push(fileName);
} else if (fileName.endsWith(".css")) {
cssfiles.push(fileName);
} else if (fileName.endsWith(".html")) {
htmlfiles.push(fileName);
}
}
}
callback(ok, {
"jsfiles": jsfiles,
"cssfiles": cssfiles,
"htmlfiles": htmlfiles
});
}
var tasks = [];
for (var i = 0; i < v_loactions.length; ++i) {
tasks.push(new ListDirectoryTask(v_loactions[i], v_fileHandler));
}
new TaskList(tasks, directoriesListed).taskOperation();
}
}
function JsImportFromConfigTask(p_configPath, p_fileHandler) {
var v_fileHandler = p_fileHandler;
var v_configPath = p_configPath;
var v_callback;
function configLoaded(ok, config) {
function imported(ok) {
v_callback(ok, config.apiExtension);
}
if (ok && config.filesToInclude != undefined) {
new JsImportTaskList(config.filesToInclude, v_fileHandler, imported).taskOperation();
} else {
v_callback(true, config.apiExtension);
}
}
this.taskOperation = function(callback) {
v_callback = callback;
new JsonLoader(v_configPath, v_fileHandler).taskOperation(configLoaded);
};
}