TROIKA.ASP - the MVC framework

AppController.js

Summary

Contains AppController 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
AppController This is AppController class which implements Application Controller pattern for Command management.

/**
* @fileoverview Contains <tt>AppController</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 AppController class.
*
* @class This is <tt>AppController</tt> class which implements Application Controller pattern for Command management.
* This includes:
*
* <ul>
* <li>Authentication and security</li>
* <li>RequestContext validation and Error handling</li>
* <li>Locating and executing Command for specific request</li>
* </ul>
*
* @constructor
* @param {Config} config The instance of <tt>Config</tt> class.
* @param {Environment} environment The instance of <tt>Environment</tt> class.
*/
function AppController(config, environment) {

    /**
    * Handles the request and returns <tt>ResponseContext</tt> instance.
    *
    * @param {RequestContext} requestCxt The RequestContext instance.
    * @return <tt>ResponseContext</tt> instance or <tt>undefined</tt> value.
    */
    this.handleRequest = function (requestCxt) {

        var result =  new ResponseContext();
        var session = environment.session;

        var auth = authenticate(environment, requestCxt);
        if (auth.proceed) {

            var cmdMap = config.cmdMaps[requestCxt.action];
            if (cmdMap.validate) {

                var errors = requestCxt.validate();
                if (!errors.isEmpty()) {

                    result.forward =  new Forward(cmdMap.input.redirect, cmdMap.input.path);
                    result.errors = errors;

                    return result;
                }
            }

            var cmd = eval("new " + cmdMap.type + "()");

            cmd.init(config);

            result = cmd.execute(environment, requestCxt);
        }
        else {

            session.put("nextPageForward", auth.returnPath);
            result.forward =  new Forward(true, auth.loginFormPath);
        }

        if (result) {

            result.models.put("sessionId", session.getId());
            result.models.put("userId", session.get("user.id"));
            result.models.put("userName", session.get("user.name"));
            result.models.put("securityRole", auth.securityRole);
        }

        return result;
    };

    function authenticate(environment, requestCxt) {

        var result = {

            proceed : true};

        var session = environment.session;
        var securityRole = getSecurityRole(session);

        result.securityRole = securityRole;

        var securityConstraints = config.securityConstraints;
        if (securityConstraints) {

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

                var constraint = securityConstraints[i];
                var urlPatterns = constraint.urlPatterns;

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

                    var urlPattern = urlPatterns[j];

                    var requestCtxXpath = urlPattern.requestCtxXpath;
                    var matchPattern = urlPattern.matchPattern;

                    var parser =  new XPathParser(undefined, requestCxt.toXML());

                    var node = parser.apply(requestCtxXpath);

                    if (node(0) && node(0).text.match(matchPattern)) {

                        if (!constraint.authenticate.contains(securityRole)) {

                            // securityRole is not found
                            result.proceed = false;
                            result.returnPath = urlPattern.returnPath;
                            result.loginFormPath = constraint.loginFormPath;
                        }

                        return result;
                    }
                }
                //while
            }
            //while
        }

        return result;
    }

    function getSecurityRole(session) {

        var result = session.get("security.role");

        if (!result) {

            result = "guest";
        }

        return result;
    }
}

TROIKA.ASP - the MVC framework

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