TROIKA.ASP - the MVC framework

Config.js

Summary

Contains Config class.

This is part of Troika.ASP Framework - web development MVC framework for ASP 3.0. Please visit www.troika-asp.com for more details.



Version: $Revision: 1.3 $

Author: Pavel Chuchev pav@troika-asp.com


Class Summary
Config This is Config class which represents the application configuration information.

/**
* @fileoverview Contains <tt>Config</tt> class.
*
* <p>
* This is part of Troika.ASP Framework - web development MVC framework for ASP 3.0.
* Please visit {@link http://www.troika-asp.com www.troika-asp.com} for more details.
* </p>
*
* @author Pavel Chuchev pav@troika-asp.com
* @version $Revision: 1.3 $
*/
/**
* Constructs a new instance of Config class.
*
* @class This is <tt>Config</tt> class which represents the application configuration information.
* It parses WEB-INF/config.xml file when web application starts up.
*
* <p>The config.xml file can be used to define the following aspects of TROIKA.ASP framework:</p>
*
* <ul>
* <li>Database Connection strings</li>
* <li>Logger configurations</li>
* <li>RequestContext mappings</li>
* <li>Command mappings</li>
* <li>Security constraints</li>
* </ul>
*
* @constructor
* @param {String} xmlFile The config XML file.
* @param {String} root The root directory where config.xml resides.
*/
function Config(xmlFile, root) {

    if (arguments.length) {

        this.init(xmlFile, root);
    }
}
/**
* Initializes <tt>Config</tt> class, parsing the XML input file.
*
* @param {String} xmlFile The config XML file.
* @param {String} root The root directory where config.xml resides.
* @return <tt>XSLEngine</tt> object instance itself.
* @type Config
*/
Config.prototype.init = function (xmlFile, root) {

    var xPathParser =  new XPathParser(root + xmlFile);

    this.dBConnections = parseDBConnections();
    this.logger = parseLogger();
    this.reqCtxMaps = parseReqCtxMaps();
    this.cmdMaps = parseCmdMaps();
    this.securityConstraints = parseSecurityConstraints();

    function readChild(node, name, defValue) {

        var result = undefined;

        var kids = node.childNodes;
        for (var i = 0; i < kids.length; i++) {

            var kid = kids.item(i);
            var baseName = kid.baseName;

            if (baseName == name) {

                result = kid.text;
            }
        }

        if (result) {

            return result;
        }
        else {

            if (typeof (defValue) != "undefined") {

                return defValue;
            }
            else {

                throw new Error("Child '" + name + "' not found");
            }
        }
    }

    function parseDBConnections() {

        var result = {

        };

        var dbConns = xPathParser.apply("/config/db-connections/db-connection");

        for (var i = 0; i < dbConns.length; i++) {

            var dbConnAttr = dbConns(i).attributes;

            var name = dbConnAttr.getNamedItem("name").value;
            var connStr = dbConnAttr.getNamedItem("conn-string").value;

            result[name] = connStr.expandVar("root", root);
        }

        return result;
    }

    function parseLogger() {

        var loggerNode = xPathParser.apply("/config/logger");

        var fileName = readChild(loggerNode(0), "file-name");
        var maxSize = readChild(loggerNode(0), "max-size");
        var generations = readChild(loggerNode(0), "generations");
        var logLevel = readChild(loggerNode(0), "log-level");

        return {

            fileName : fileName.expandVar("root", root), maxSize : maxSize, generations : generations, logLevel : logLevel};
    }

    function parseForwards(xpath) {

        var result = {

        };

        var gFwds = xPathParser.apply(xpath);

        for (var i = 0; i < gFwds.length; i++) {

            var fwdAttr = gFwds(i).attributes;

            var name = fwdAttr.getNamedItem("name").value;
            var redirect = fwdAttr.getNamedItem("redirect").value == "true";
            var path = fwdAttr.getNamedItem("path").value;

            result[name] =  new Forward(redirect, path);
        }

        return result;
    }

    function parseReqCtxMaps() {

        var result = {

        };

        var reqCtxMaps = xPathParser.apply("/config/req-ctx-maps/req-ctx-map");

        for (var i = 0; i < reqCtxMaps.length; i++) {

            var name = reqCtxMaps(i).attributes.getNamedItem("name").value;
            var type = reqCtxMaps(i).attributes.getNamedItem("type").value;

            result[name] = type;
        }

        return result;
    }

    function parseCmdMaps() {

        var result = {

        };

        var cmdMaps = xPathParser.apply("/config/cmd-maps/cmd-map");

        for (var i = 0; i < cmdMaps.length; i++) {

            var cmdMapAttr = cmdMaps(i).attributes;

            var cmdMap = {

            };

            var action = cmdMapAttr.getNamedItem("action").value;

            var validAttr = cmdMapAttr.getNamedItem("validate");

            cmdMap.validate = validAttr ? validAttr.value == "true" : false;
            cmdMap.type = readChild(cmdMaps(i), "type");
            cmdMap.name = readChild(cmdMaps(i), "name", null);

            cmdMap.input = parseInput(action);
            cmdMap.forwards = parseForwards("/config/cmd-maps/cmd-map[@action='" + action + "']/forwards/forward");

            result[action] = cmdMap;
        }

        return result;
    }

    function parseInput(action) {

        var inputXpath = "/config/cmd-maps/cmd-map[@action='" + action + "']/input";
        var inputNode = xPathParser.apply(inputXpath);

        if ( inputNode(0)) {

            var redirect =  inputNode(0).attributes.getNamedItem("redirect").value == "true";
            var path =  inputNode(0).attributes.getNamedItem("path").value;

            return {

                redirect : redirect, path : path};
        }
        else {

            return undefined;
        }
    }

    function parseSecurityConstraints() {

        var security = xPathParser.apply("/config/security-constraints");

        if (!security) {

            return undefined;
        }

        var result = [];

        var constraints = xPathParser.apply("/config/security-constraints/constraint");

        for (var i = 0; i < constraints.length; i++) {

            result.push(parseConstraint(i));
        }

        return result;
    }

    function parseConstraint(index) {

        var result = {

        };

        result.urlPatterns = parseUrlPatterns(index);
        result.authenticate = parseAuthenticate(index);
        result.loginFormPath = parseLoginFormPath(index);

        return result;
    }

    function parseLoginFormPath(index) {

        var selector = "position() = " + (index + 1);

        var xPath = "/config/security-constraints/constraint[" + selector + "]/login-form-path";

        return xPathParser.apply(xPath)(0).text;
    }

    function parseUrlPatterns(index) {

        var result = [];

        var selector = "position() = " + (index + 1);

        var urlPatternXPath = "/config/security-constraints/constraint[" + selector + "]/url-patterns/url-pattern";

        var urlPatterns = xPathParser.apply(urlPatternXPath);

        for (var i = 0; i < urlPatterns.length; i++) {

            var urlPatternAttr = urlPatterns(i).attributes;

            var urlPattern = {

            };

            urlPattern.requestCtxXpath = urlPatternAttr.getNamedItem("request-ctx-xpath").value;
            urlPattern.matchPattern = readChild(urlPatterns(i), "match-pattern");
            urlPattern.returnPath = readChild(urlPatterns(i), "return-path");

            result.push(urlPattern);
        }

        return result;
    }

    function parseAuthenticate(index) {

        var result = [];

        var selector = "position() = " + (index + 1);

        var rolesXPath = "/config/security-constraints/constraint[" + selector + "]/authenticate/role";

        var roles = xPathParser.apply(rolesXPath);

        for (var i = 0; i < roles.length; i++) {

            result.push(roles(i).text);
        }

        return result;
    }

    return this;
};

TROIKA.ASP - the MVC framework

www.troika-asp.com
Documentation generated on Sun Jun 15 17:59:32 2008