Taylohtio/AlertManager/SPSolutions.SharePoint.Aler.../SPSolutions.SharePoint/SPSolutions.SharePoint.Aler.../AlertParamsTokenizer.cs

317 lines
10 KiB
C#

using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;
using SPSolutions.SharePoint.Logging;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Xml.Xsl;
namespace SPSolutions.SharePoint.Alerts.Tokenization
{
public class AlertParamsTokenizer : Tokenizer
{
private SPAlertHandlerParams m_alertHandlerParams;
private string m_notificationMessageXslt;
private SPList m_list;
private List<SPListItem> m_items;
private Hashtable m_eventXmlTokens;
public SPList List
{
get
{
return this.m_list;
}
set
{
this.m_list = value;
}
}
public List<SPListItem> Items
{
get
{
if (this.m_items == null)
{
this.m_items = new List<SPListItem>();
}
return this.m_items;
}
set
{
this.m_items = value;
}
}
public Hashtable EventXmlTokens
{
get
{
if (this.m_eventXmlTokens == null && !string.IsNullOrEmpty(this.m_alertHandlerParams.eventData[0].eventXml))
{
this.m_eventXmlTokens = SPAlertTemplateUtil.GetTokensForeventXml(this.m_alertHandlerParams.eventData[0].eventXml);
}
return this.m_eventXmlTokens;
}
set
{
this.m_eventXmlTokens = value;
}
}
public AlertParamsTokenizer()
{
}
public AlertParamsTokenizer(SPAlertHandlerParams alertHandlerParams, string notificationMessageXslt)
{
this.m_alertHandlerParams = alertHandlerParams;
this.m_notificationMessageXslt = notificationMessageXslt;
base.Tokens = new Hashtable();
using (SPSite sPSite = new SPSite(alertHandlerParams.siteId))
{
using (SPWeb sPWeb = sPSite.OpenWeb(alertHandlerParams.webId))
{
this.List = sPWeb.Lists[this.m_alertHandlerParams.a.ListID];
for (int i = 0; i < this.m_alertHandlerParams.eventData.Length; i++)
{
try
{
if (this.m_alertHandlerParams.eventData[i].eventType != 4)
{
this.Items.Add(this.List.GetItemById(this.m_alertHandlerParams.eventData[i].itemId));
}
}
catch (Exception ex)
{
TraceProvider.WriteTrace(0u, TraceProvider.TraceSeverity.Monitorable, Guid.Empty, "w3wp.exe", "Alert Manager", "CustomAlertHandler", "Error getting ListItem:" + this.m_alertHandlerParams.eventData[i].eventType.ToString() + ", " + ex.Message);
}
}
}
}
}
public override void PopulateTokenValues()
{
for (int i = 0; i < this.m_alertHandlerParams.eventData.Length; i++)
{
try
{
if (this.m_alertHandlerParams.eventData[i].eventType == 1)
{
base.Tokens["EventDescription"] = "has been added";
}
else
{
if (this.m_alertHandlerParams.eventData[i].eventType == 4)
{
base.Tokens["EventDescription"] = "has been deleted";
}
else
{
if (this.m_alertHandlerParams.eventData[i].eventType == 4080)
{
base.Tokens["EventDescription"] = "has been replied to";
}
else
{
if (this.m_alertHandlerParams.eventData[i].eventType == 2 || this.m_alertHandlerParams.eventData[i].eventType == -1)
{
base.Tokens["EventDescription"] = "has been changed";
}
}
}
}
}
catch (Exception innerException)
{
throw new Exception("Error setting EventDescription fom eventType.", innerException);
}
using (SPSite sPSite = new SPSite(this.m_alertHandlerParams.siteId))
{
using (SPWeb sPWeb = sPSite.OpenWeb(this.m_alertHandlerParams.webId))
{
SPList sPList = sPWeb.Lists[this.List.ID];
try
{
base.Tokens["WebTitle"] = sPWeb.Title;
base.Tokens["ListTitle"] = sPList.Title;
base.Tokens["ListId"] = sPList.ID.ToString();
}
catch (Exception innerException2)
{
throw new Exception("Error setting title tokens.", innerException2);
}
try
{
base.Tokens["SiteAbsoluteUrl"] = sPSite.Url;
base.Tokens["WebAbsoluteUrl"] = sPWeb.Url;
// 2017-12-05: possibility to add public web urls to alert templates
try
{
using (var ps = new SPSite(sPSite.ID, SPUrlZone.Extranet))
{
using (var pw = ps.OpenWeb(sPWeb.ID))
{
base.Tokens["SiteAbsolutePublicUrl"] = ps.Url;
base.Tokens["WebAbsolutePublicUrl"] = pw.Url;
}
using (var rs = new SPSite(ps.WebApplication.Sites[0].ID, SPUrlZone.Extranet))
{
base.Tokens["WebAppAbsolutePublicUrl"] = rs.Url;
}
}
}
catch
{
throw;
}
base.Tokens["ListAbsoluteUrl"] = sPSite.MakeFullUrl(sPList.DefaultViewUrl);
base.Tokens["MobileAbsoluteUrl"] = base.Tokens["WebAbsoluteUrl"] + "/_layouts/15/mobile/mbllists.aspx";
}
catch (Exception innerException3)
{
throw new Exception("Error setting absolute tokens.", innerException3);
}
try
{
base.Tokens["WebLink"] = string.Format("<a href=\"{1}\">{0}</a>", base.Tokens["WebTitle"], base.Tokens["WebAbsoluteUrl"]);
base.Tokens["ListLink"] = string.Format("<a href=\"{1}\">{0}</a>", base.Tokens["ListTitle"], base.Tokens["ListAbsoluteUrl"]);
}
catch (Exception innerException4)
{
throw new Exception("Error setting link tokens.", innerException4);
}
try
{
if (this.m_alertHandlerParams.eventData[i].eventType != 4)
{
var item = sPList.GetItemById(this.m_alertHandlerParams.eventData[i].itemId);
if (item != null && sPList.BaseTemplate == SPListTemplateType.DiscussionBoard)
{
if (item.ContentTypeId.IsChildOf(new SPContentTypeId("0x0107"))) // message
{
try
{
int parentDiscussionId = (int) item["ParentFolderId"];
var parentDiscussionItem = sPList.GetItemById(parentDiscussionId);
if (parentDiscussionItem != null)
{
base.Tokens["ParentDiscussionTitle"] = parentDiscussionItem.Title;
}
}
catch
{
}
}
else if (item.ContentTypeId.IsChildOf(new SPContentTypeId("0x012002"))) // discussion
{
base.Tokens["ParentDiscussionTitle"] = item.Title;
}
}
}
}
catch (Exception innerException5)
{
throw new Exception("Error setting item tokens.", innerException5);
}
}
}
}
XsltArgumentList xsltArgumentList = new XsltArgumentList();
try
{
foreach (DictionaryEntry dictionaryEntry in base.Tokens)
{
if ((string)dictionaryEntry.Key != "AlertDetailsTable")
{
xsltArgumentList.AddParam(((string)dictionaryEntry.Key).Replace(" ", "_").Replace("{", "").Replace("}", ""), string.Empty, (base.Tokens[(string)dictionaryEntry.Key] == null) ? string.Empty : base.Tokens[(string)dictionaryEntry.Key]);
}
}
for (int j = 0; j < this.m_alertHandlerParams.eventData.Length; j++)
{
Hashtable tokens;
object key;
(tokens = base.Tokens)[key = "AlertDetailsTable"] = tokens[key] + SPAlertTemplateUtil.TransformXmlToHtmlUsingXsl(this.m_alertHandlerParams.eventData[j].eventXml, this.m_notificationMessageXslt, xsltArgumentList);
}
}
catch (Exception innerException6)
{
throw new Exception("Error populating AlertDetailsTable.", innerException6);
}
}
private void AddListItemTokens(SPSite site, SPWeb web, SPListItem item, SPAlertEventData eventData)
{
int num = 0;
string text = string.Empty;
string text2 = string.Empty;
string arg = string.Empty;
try
{
if (item != null)
{
num = eventData.itemId;
}
}
catch (Exception innerException)
{
throw new Exception("Error setting itemId", innerException);
}
try
{
if (item == null)
{
arg = site.Url + "/" + eventData.itemFullUrl;
}
else
{
if (!string.IsNullOrEmpty(this.m_alertHandlerParams.a.Properties["dispformurl"]))
{
arg = this.m_alertHandlerParams.a.Properties["dispformurl"];
}
else
{
if (item.ContentType != null && !string.IsNullOrEmpty(item.ContentType.DisplayFormUrl))
{
arg = item.ContentType.DisplayFormUrl;
}
else
{
arg = this.List.Forms[4].Url;
}
}
}
text = string.Format("{0}/{1}?ID={2}", web.Url, arg, num.ToString());
}
catch (Exception innerException2)
{
throw new Exception("Error setting item Url", innerException2);
}
try
{
if (item != null)
{
text2 = item.Title;
}
else
{
text2 = eventData.itemFullUrl;
text2 = text2.Substring(text2.LastIndexOf("/") + 1, text2.Length - (text2.LastIndexOf("/") + 1));
}
}
catch (Exception innerException3)
{
throw new Exception("Error setting item Title", innerException3);
}
base.Tokens["ItemId"] = num.ToString();
base.Tokens["ItemTitle"] = text2;
base.Tokens["ItemDisplayFormAbsoluteUrl"] = text;
base.Tokens["ItemLink"] = string.Format("<a href=\"{1}\">{0}</a>", text2, text);
}
public override Hashtable AddTokens(Hashtable tokens)
{
foreach (DictionaryEntry dictionaryEntry in base.Tokens)
{
tokens[dictionaryEntry.Key] = dictionaryEntry.Value;
}
return tokens;
}
}
}