using System;
using System.Collections.Generic;
using System.Text;
using System.Globalization;
using System.Xml;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;
namespace Company.Moss.FeatureReceiver
{
class CustomFeatureReceiver : SPFeatureReceiver
{
protected SPFeatureReceiverProperties _properties;
#region base overrides
public override void FeatureInstalled(SPFeatureReceiverProperties properties)
{
//throw new Exception("The method or operation is not implemented.");
}
public override void FeatureUninstalling(SPFeatureReceiverProperties properties)
{
//throw new Exception("The method or operation is not implemented.");
}
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
//This is where the WebConfigChanges file should be
string fileLoc = properties.Definition.RootDirectory + "\\WebConfigChanges.xml";
//Check to see if a WebConfigChanges.xml file exists. If yes, we have work to do
if (System.IO.File.Exists(fileLoc))
{
//Grab the properties
_properties = properties;
this.ProcessChanges(fileLoc, false);
}
}
public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
{
//This is where the WebConfigChanges file should be
string fileLoc = properties.Definition.RootDirectory + "\\WebConfigChanges.xml";
//Check to see if a WebConfigChanges.xml file exists. If yes, we have work to do
if (System.IO.File.Exists(fileLoc))
{
//Grab the properties
_properties = properties;
this.ProcessChanges(fileLoc, true);
}
}
#endregion
private void ProcessChanges(string FileLocation, bool removeModification)
{
string xPathLocation;
string elementName;
Dictionary<string, string> attributes = new Dictionary<string, string>();
using (XmlReader reader = XmlReader.Create(FileLocation))
{
//Loop through all of the changes
while(reader.ReadToFollowing("WebConfigChange"))
{
//Clean out any attributes from past iterations
attributes.Clear();
xPathLocation = reader.GetAttribute("XPathLocation");
elementName = reader.GetAttribute("ElementName");
//Make sure we have at least a path and element
if (xPathLocation == null || elementName == null)
throw new Exception("WebConfigChange missing required XPathLocation or ElementName attributes");
//Get the Attributes to apply
if (reader.ReadToDescendant("Attribute"))
{
do
{
attributes.Add(reader.GetAttribute("Name"), reader.GetAttribute("Value"));
} while (reader.ReadToNextSibling("Attribute"));
}
//Do the update
UpdateWebConfig(xPathLocation, elementName, attributes, removeModification);
}
}
}
private void UpdateWebConfig(string XPathLocation, string ElementName,
Dictionary<string, string> Attributes, bool removeModification)
{
try
{
SPWebApplication webApp = null;
//Get the web app
//First check if it was deployed to a Site Collection
SPSiteCollection siteCol = _properties.Feature.Parent as SPSiteCollection;
if (siteCol == null)
{
//Check if it was deployed to a site
SPSite site = _properties.Feature.Parent as SPSite;
if (site == null)