Files
BeWoPlaner/BeWoPlanerAndroid/Service/SoapHibernateSessionManager.cs
2016-09-30 10:19:11 +02:00

138 lines
4.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Globalization;
using System.IO;
using System.ServiceModel;
using System.Threading;
using System.Web;
using NHibernate;
using Configuration = NHibernate.Cfg.Configuration;
namespace BeWoPlanerAndroid.Service
{
public class SoapHibernateSessionManager : IHttpModule
{
private static readonly Dictionary<string, ISessionFactory> _SessionFactories = new Dictionary<string, ISessionFactory>();
private static readonly object _Lock = string.Empty;
private static ISessionFactory SessionFactory
{
get
{
try
{
Monitor.Enter(_Lock);
if (!_SessionFactories.ContainsKey(MobileSessionFacade.Tenant))
{
var serverPath = HttpContext.Current.Server.MapPath("");
serverPath = Path.Combine(serverPath, ConfigurationManager.AppSettings.Get("MultitenancyPath"));
serverPath = Path.Combine(serverPath, MobileSessionFacade.Tenant + ".config");
_SessionFactories[MobileSessionFacade.Tenant] = new Configuration().Configure(serverPath).SetInterceptor(new MobileUpdInstInterceptor()).BuildSessionFactory();
}
return _SessionFactories[MobileSessionFacade.Tenant];
}
catch (Exception e)
{
throw new FaultException(e.StackTrace + (e.InnerException != null ? e.InnerException.Message : string.Empty));
}
finally
{
Monitor.Exit(_Lock);
}
}
}
public void Dispose() { }
public void Init(HttpApplication context)
{
context.AcquireRequestState += (s, e) =>
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
if (ShouldConfigureHibernateSession(context))
{
// TEST FOR DEVEXPRESS. PROBLEMS WITH THIS MODULE WHEN USING AJAX!
if (HttpContext.Current.Session == null)
{
return;
}
ConfigureHibernateSession();
}
};
context.PreRequestHandlerExecute += (s, e) =>
{
if(HttpContext.Current.Session == null)
{
return;
}
var tenant = context.Request.Params["pTenant"];
var isNhibernateSessionExisting = HttpContext.Current.Items.Contains("hibernateSession");
if(isNhibernateSessionExisting)
{
return;
}
if (tenant != null && MobileSessionFacade.Tenant == null)
{
MobileSessionFacade.Tenant = tenant;
}
ConfigureHibernateSession();
};
context.EndRequest += (s, e) =>
{
if (HttpContext.Current.Items["hibernateSession"] != null)
{
((ISession) HttpContext.Current.Items["hibernateSession"]).Close();
}
};
}
private static bool ShouldConfigureHibernateSession(HttpApplication context)
{
return string.IsNullOrEmpty(context.Request.FilePath) || context.Request.FilePath.IndexOf("Admin.aspx") < 0;
}
public static bool ConfigureHibernateSession()
{
if(MobileSessionFacade.Tenant == null)
{
MobileSessionFacade.Tenant = AndroidSoapService.Tenant;
}
var lTenant = MobileSessionFacade.Tenant;
if (string.IsNullOrEmpty(lTenant) || HttpContext.Current.Items["hibernateSession"] != null)
{
return false;
}
HttpContext.Current.Items.Add("hibernateSession", SessionFactory.OpenSession());
return true;
}
public static bool TenantExists(string pTenant)
{
var path2config = HttpContext.Current.Server.MapPath("");
path2config = Path.Combine(path2config, ConfigurationManager.AppSettings.Get("MultitenancyPath"));
path2config = Path.Combine(path2config, pTenant + ".config");
return File.Exists(path2config);
}
}
}