#region License
/**
* Ingenious MVC : An MVC framework for .NET 2.0
* Copyright (C) 2006, JDP Group
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Authors: - Kent Boogaart (kentcb@internode.on.net)
*/
#endregion
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using Ingenious.Mvc;
using Ingenious.Mvc.Configuration.Configurators;
using Ingenious.Mvc.Util;
namespace Ingenious.Mvc.Web.Forms{
/// <include file='HttpApplication.doc.xml' path='/doc/member[@name="T:HttpApplication"]/*'/>
public abstract class HttpApplication : System.Web.HttpApplication
{
private const string _taskManagerKey = "Ingenious.Mvc.Web.Forms.HttpApplication#TaskManagerKey";
private static IHttpBridge _httpBridge;
private static readonly Log _log = Log.CreateForType(typeof(HttpApplication));
/// <include file='HttpApplication.doc.xml' path='/doc/member[@name="P:HttpBridge"]/*'/>
internal static IHttpBridge HttpBridge
{
get
{
if (_httpBridge == null)
{
_httpBridge = new HttpBridgeImpl();
}
return _httpBridge;
}
set
{
_httpBridge = value;
}
}
/// <include file='HttpApplication.doc.xml' path='/doc/member[@name="P:RootTaskId"]/*'/>
protected abstract Id<INavigator> RootTaskId
{
get;
}
internal void Session_Start(object sender, EventArgs e)
{
_log.Information("Session starting.");
ExceptionHelper.ThrowIf(RootTaskId.IsEmpty, "Session_Start.RootTaskId-empty", typeof(HttpApplication).FullName);
//start Ingenious MVC
TaskManager taskManager = GetTaskManager();
Configure(taskManager);
taskManager.StartTask(RootTaskId);
OnSessionStart(sender, e);
_log.Information("Session started.");
}
/// <include file='HttpApplication.doc.xml' path='/doc/member[@name="M:GetTaskManager()"]/*'/>
protected virtual TaskManager GetTaskManager()
{
//by default, we store a TaskManager for the user in the session
TaskManager taskManager = Session[_taskManagerKey] as TaskManager;
if (taskManager == null)
{
taskManager = new TaskManager();
Session[_taskManagerKey] = taskManager;
}
return taskManager;
}
/// <include file='HttpApplication.doc.xml' path='/doc/member[@name="M:Configure(Ingenious.Mvc.TaskManager)"]/*'/>
protected virtual void Configure(TaskManager taskManager)
{
//TODO: we could probably improve perf significantly here by configuring once and then taking a clone of that configuration for
//each new session
//use the config section configurator unless this method is overridden
ConfigSectionConfigurator.Configure(taskManager);
}
/// <include file='HttpApplication.doc.xml' path='/doc/member[@name="M:OnSessionStart(System.Object,System.EventArgs)"]/*'/>
protected virtual void OnSessionStart(object sender, EventArgs e)
{
}
internal interface IHttpBridge
{
string AppRelativeCurrentExecutionFilePath
{
get;
}
string RawUrl
{
get;
}
void Redirect(string url);
}
private sealed class HttpBridgeImpl : IHttpBridge
{
public string AppRelativeCurrentExecutionFilePath
{
get
{
return HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath;
}
}
public string RawUrl
{
get
{
return HttpContext.Current.Request.RawUrl;
}
}
public HttpBridgeImpl()
{
ExceptionHelper.ThrowIf(HttpContext.Current == null, "ctor.httpContextRequired");
}
public void Redirect(string url)
{
HttpContext.Current.Response.Redirect(url, false);
}
}
}
}
|