using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Reflection;
using EPiServer.PlugIn;
using System.ComponentModel;
namespace EPiServer.Connectors
{
[GuiPlugIn(
Area = PlugInArea.ReportMenu,
Description = "Page Event Report",
Category = "Events", DisplayName = "Page Events",
Url = "~/Connectors/EventReport.aspx")]
public partial class EventReport : EPiServer.UI.SystemPageBase
{
protected global::System.Web.UI.WebControls.Repeater Outer;
object _events = null;
#region EventKeys
static Dictionary<string, object> eventKeys;
public static Dictionary<string, object> EventKeys
{
get
{
if (eventKeys == null)
{
Dictionary
<string,
object> tmp
= new Dictionary
<string,
object>();
Type t = EPiServer.DataFactory.Instance.GetType();
FieldInfo[] fields = t.GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
foreach (FieldInfo field in fields)
{
if (!field.Name.StartsWith("_"))
{
object keyObject = EventReport.GetPrivateField(field.Name, EPiServer.DataFactory.Instance);
if (!tmp.ContainsValue(keyObject))
tmp.Add(field.Name, keyObject);
}
}
eventKeys = tmp;
}
return eventKeys;
}
}
#endregion
protected void Page_Load(object sender, EventArgs e)
{
_events = GetPrivateField("_events", EPiServer.DataFactory.Instance);
//Type t = EPiServer.DataFactory.Instance.GetType();
//FieldInfo[] fields = t.GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
Outer.DataSource = EventKeys.Keys;
Outer.DataBind();
//Inner.DataBind();
}
public static object GetPrivateField(string key, object o)
{
Type t = o.GetType();
FieldInfo f = t.GetField(key, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy);
if (f == null)
{
f = t.BaseType.GetField(key, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy);
}
return f.GetValue(o);
}
#region Events
static EventHandlerList events;
public static EventHandlerList Events
{
get
{
if (events == null)
{
events = (EventHandlerList)EventReport.GetPrivateField("_events", EPiServer.DataFactory.Instance);
}
return events;
}
}
#endregion
#region GetEvents
public System.Delegate[] GetEvents(string key)
{
if (!EventKeys.ContainsKey(key))
return null;
object keyObject = EventKeys[key];
Type type = Events.GetType();
MethodInfo method = type.GetMethod("Find", BindingFlags.Instance | BindingFlags.NonPublic);
List
<object> args
= new List
<object>();
args.Add(keyObject);
object eventStore = method.Invoke(Events, args.ToArray());
if (eventStore == null) return null;
object handler = GetPrivateField("handler", eventStore);
System.MulticastDelegate originalDelegate = (System.MulticastDelegate)handler;
System.Delegate[] result = originalDelegate.GetInvocationList();
return result;
}
#endregion
public int GetCount(string key)
{
if (EventReportStartUp.CountList.ContainsKey(key))
return EventReportStartUp.CountList[key].GetCount;
return -1;
}
#region OnPreInit
protected override void OnPreInit(EventArgs e)
{
base.OnPreInit(e);
this.MasterPageFile = ResolveUrlFromUI("MasterPages/EPiServerUI.master");
}
#endregion
}
public class EventReportStartUp : EPiServer.PlugIn.PlugInAttribute
{
public static Dictionary
<string, EventReportCount
> CountList
= new Dictionary
<string, EventReportCount
>();
public static void Start()
{
Type t = EPiServer.DataFactory.Instance.GetType();
FieldInfo[] fields = t.GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
MethodInfo method = EventReport.Events.GetType().GetMethod("AddHandler", BindingFlags.Instance | BindingFlags.NonPublic);
foreach (string key in EventReport.EventKeys.Keys)
{
if (!key.Contains("Children"))
{
EventReportCount item
= new EventReportCount
();
PageEventHandler handler
= new PageEventHandler
(item.
Count);
EventReport.Events.AddHandler(EventReport.EventKeys[key], handler);
CountList.Add(key, item);
}
}
}
}
public class EventReportCount
{
int count = 0;
object lockObject
= new object();
public int GetCount
{
get { return count; }
}
public void Count(object sender, EventArgs e)
{
lock (lockObject)
{
count++;
}
}
}
}