dl
Version:
DreamLab Libs
176 lines (162 loc) • 6.74 kB
JavaScript
var Class = require('core').Class;
var CdfContainer = require('./CdfContainer.js').CdfContainer;
var CdfBlocks = require('./CdfBlocks.js').CdfBlocks;
var Response = require('core').http.Response;
var ErrorEvent = require('core').event.ErrorEvent;
//var CdfApplicationContainer = require('./CdfApplicationContainer.js').CdfApplicationContainer;
var CdfApplications = function () {
this.Extends = CdfContainer;
this.initialize = function (cdfpage) {
this.parent();
this._applicationContainers = {};
this._cdfpage = cdfpage;
this._appsByName = {};
};
this.isEmpty = function () {
return !Object.keys(this._appsByName).length;
};
/**
* add CdfApplication to right CdfApplicationContainer
* @method
* @param {CdfApplication} application
*/
this.add = function (application) {
var controller = application.controller, container;
if (!this._applicationContainers.hasOwnProperty(controller)) {
var CdfApplicationContainer = require('./CdfApplicationContainer.js').CdfApplicationContainer;
this._applicationContainers[controller] = new CdfApplicationContainer(controller);
}
container = this._applicationContainers[controller];
container.add(application);
this._appsByName[application.name] = application;
};
/**
* get CdfApplicationContainer with related CdfApplication
* @param {String} name
* @returns {CdfApplicationContainer}
*/
this.get = function (name) {
if (this._applicationContainers.hasOwnProperty(name)) {
return this._applicationContainers[name];
} else {
return false;
}
};
/**
* get CdfApplication by application name
* @param {String} name
* @returns {CdfApplication}
*/
this.getApplicationByName = function (name) {
if (this._appsByName.hasOwnProperty(name)) {
return this._appsByName[name];
} else {
return null;
}
};
/**
* return all known CdfApplicationContainers
* @method
*/
this.getApplicationContainers = function () {
var containers = [];
for (var i in this._applicationContainers) {
if (this._applicationContainers.hasOwnProperty(i)) {
containers.push(this._applicationContainers[i]);
}
}
return containers;
};
this.fetchApplications = function (request, logger, callback) {
var applications = 0, i, max;
var models = [];
var that = this;
if (logger) {
var apps_log = {};
var logStatus = 'info';
}
if (Object.keys(this._applicationContainers).length == 0) {
callback();
return;
}
if (logger) {
var startTime = Date.now();
}
for (var container in this._applicationContainers) {
if (!this._applicationContainers.hasOwnProperty(container)) {
continue;
}
applications++;
this._applicationContainers[container].fetchApplication(request, logger,
(function (c) {
return function (err, data) {
var apps, i, len, model = {};
applications--;
if (logger) {
apps_log[c] = {
requestTime: (Date.now() - startTime) + 'ms'
};
}
if (err) {
if (logger) {
logStatus = 'error';
apps_log[c].status ='ERROR';
apps_log[c].error = err.message;
}
apps = that._applicationContainers[c].getApplications();
for (i=0, max=apps.length; i<max; i++) {
var error = new ErrorEvent(err);
model = {};
model[apps[i].name] = error;
models.push(model);
}
} else if (data instanceof CdfBlocks) {
if (logger) {
apps_log[c].status ='BLOCKS';
apps_log[c].blocks = {};
for (i = 0, len = data._models.length; i < len; i++) {
data._models[i].name;
apps_log[c].blocks[data._models[i].name] = data._models[i];
}
}
for (i = 0, max = data._models.length; i < max; i++) {
models.push(data._models[i]);
}
} else if (data instanceof Response) {
if (logger) {
apps_log[c].status ='Response';
apps_log[c].response = data.toJson();
}
apps = that._applicationContainers[c].getApplications();
for (i=0, max=apps.length; i<max; i++) {
model = {};
model[apps[i].name] = data;
models.push(model);
}
}
if (!applications) {
if (logger) {
if (logStatus == 'info') {
logger.info(apps_log, 'CdfApplications');
} else {
logger.error(apps_log, 'CdfApplications');
}
}
callback(models);
}
};
})(container));
}
};
this.getNonrenderedApplications = function () {
var apps = [];
for (var name in this._appsByName) {
if (this._appsByName.hasOwnProperty(name) && this._appsByName[name].getRenderedData() == null) {
apps.push(this._appsByName[name]);
}
}
return apps;
}
};
CdfApplications = new Class(new CdfApplications());
exports.CdfApplications = CdfApplications;