JamesonNetworks/Nirodha

View on GitHub
bin/libraryManager.js

Summary

Maintainability
C
1 day
Test Coverage
var fs = require('fs');
var logger = require('jslogging');
var async = require('async');
var testing = require('../testing.json');
var utils = require('./utilities.js');

var LibraryContainer;
var Libraries;
var JSFiles;
var CSSFiles;

var findCSSFiles = utils.findCSSFiles;
var findJsFiles = utils.findJsFiles;

var LIBRARY_NOT_FOUND = 'There is no view or library file which corresponds to the request';

/**
 * Expose the root.
 */

exports = module.exports = new LibraryManager();

/**
 * Expose `LibraryManager`.
 */

exports.LibraryManager = LibraryManager;

function LibraryManager() {

}

LibraryManager.prototype.init = function() {

    //debugger;
    if(typeof(this.includes) === 'undefined') {
        this.includes = [];
    }
    if(this.includes.length === 0 || typeof(this.includes[0].fileNames) === 'undefined') {
        // Start by searching the custom directories
        var searchDirectories = utils.getSearchDirectories(utils.getNirodhaPath());

        async.series(utils.deriveLibraries(searchDirectories),
        function(err, libraries) {
            var libraryContainer = {};

            for(var i = 0; i < libraries.length; i++) {
                for(var k = 0 ; k < libraries[i].length; k++) {
                    if(typeof(libraries[i][k].fileNames) !== 'undefined' && libraries[i][k].fileNames.length > 0) {
                        //debugger;
                        for(var l = 0; l < libraries[i][k].fileNames.length; l++) {
                            if(typeof(libraryContainer[libraries[i][k].fileNames[l]]) === 'undefined') {
                                libraryContainer[libraries[i][k].fileNames[l]] = {};
                                libraryContainer[libraries[i][k].fileNames[l]].dir = libraries[i][k].dir;                                
                            }
                            else {
                                logger.debug('Duplicate libraries were found, this could cause bad things to happen');
                                //throw new Error('Duplicate libraries exist');
                            }
                        }
                    }
                }
            }

            //debugger;

            if(err) {
                logger.warn(err);
            }
            //logger.info(JSON.stringify(libraries));
            if(utils.hasDuplicateLibraries(libraries)) {
                logger.debug('Mulitple libraries with the same name, ' + JSON.stringify(utils.getDuplicateLibraries(libraries)) + ', have been detected');
                //throw new Error('Duplicate libraries found. This occurs when two js or css libraries have conflicting names. Resolve the conflict in your libraries before continuing.');
            }
            
            var jsFiles = "";
            var cssFiles = "";

            jsFiles = findJsFiles(libraries[0]);
            jsFiles += ',' + findJsFiles(libraries[1]);
            logger.log('JS files is : ' + jsFiles, 7);
            jsFiles = jsFiles.split(',');

            cssFiles = findCSSFiles(libraries[0]);
            cssFiles += ',' + findCSSFiles(libraries[1]);
            logger.log('CSS files is : ' + cssFiles, 7);
            cssFiles = cssFiles.split(',');

            logger.log('Found the following list of JS files in Nirodha paths: ' + JSON.stringify(jsFiles), 7);
            logger.log('Found the following list of CSS files in Nirodha paths: ' + JSON.stringify(cssFiles), 7);

            logger.debug('Library manager init...');
            LibraryContainer = libraryContainer;
            Libraries = libraries;
            JSFiles = jsFiles === null ? [] : jsFiles;
            CSSFiles = cssFiles === null ? [] : cssFiles;
            logger.debug('Libraries contained in current lm: ' + JSON.stringify(Libraries));
        });
    }
};

var getLibraryContents = function(uri, callback) {
    logger.debug('Entering getLibraryContents...');
    logger.debug(JSON.stringify(Libraries));
    if(typeof(Libraries) === 'undefined') {
        throw new Error('No libraries defined, did you call LibraryManager.init first?');
    }
    for(var i = 0; i < Libraries.length; i++) {
        for(var k = 0; k < Libraries[i].length; k++) {
            logger.debug(Libraries[i][k].fileNames);
            if(typeof(Libraries[i][k].fileNames) !== 'undefined' && Libraries[i][k].fileNames.indexOf(uri) > -1) {
                var path  = Libraries[i][k].dir + '/' + uri;
                var pageText = fs.readFileSync(path).toString();
                logger.debug('Writing file from path: ' + path);
                callback(pageText, true);
                return;
            }
            else if((i === (Libraries.length - 1)) && (k === (Libraries[i].length - 1))) {
                callback(null, false);
            }
        }
    }
};

LibraryManager.prototype.getLibraryContentsAsString = function(uri, callback) {
    this.init();
    getLibraryContents(uri, callback);
};

function getLibraryContentsSync(uri) {
    logger.debug('Entering getLibraryContentsSync...');
    //logger.info(JSON.stringify(LibraryContainer));
    if(typeof(LibraryContainer) === 'undefined') {
        throw new Error('No libraries defined, did you call LibraryManager.init first?');
    }
    logger.debug('URI is ' + uri);

    if(typeof(LibraryContainer[uri]) !== 'undefined') {
        logger.debug('Found libray for ' + uri);
        var file = LibraryContainer[uri];
        return fs.readFileSync(file.dir + '/' + uri).toString();
    }
    else {
        return '';
    }
}

LibraryManager.prototype.getLibraryContentsSync = function(uri) {
    this.init();
    return getLibraryContentsSync(uri);
};

// Accepts a response object and parses a view into it
LibraryManager.prototype.serveLibrary = function(uri, res, callback) {
    var type = uri.indexOf('js') > 0 ? 'js' : 'css';
    getLibraryContents(uri, function(pageText, found) {
        if(found) {
            if(type === 'js') {
                res.writeHead(200, {
                    'Content-Type': 'application/javascript',
                    'cache-control':'no-cache'
                });
                res.end(pageText);
                if(typeof(callback) !== 'undefined') {
                    callback(null, testing.libraryManager.jscss);
                }
            }
            else {
                res.writeHead(200, {
                    'Content-Type': 'text/css',
                    'cache-control':'no-cache'
                });
                res.end(pageText);
                if(typeof(callback) !== 'undefined') {
                    callback(null, testing.libraryManager.jscss);
                }
            }
        }
        else {
            res.writeHead(404, {'Content-Type': 'text/plain'});
            res.end(LIBRARY_NOT_FOUND + ' ' + uri);
            if(typeof(callback) !== 'undefined') {
                callback(null, testing.libraryManager.notfound);
            }
        }
    });
};