Today I added the following changes to the solution:
1 – Added a ReplicatorLogger Class to the solution.
2 – Updated the Feature Receiver code to create a Replicator logger list in the Web.
3 – Updated the ItemUpdated method in the Event Receiver to write to the Replicator Logger list when an item is added or updated.
The following code is the new ReplicatorLogger Class:
internal class ReplicatorLogger
{
publicvoid writeToLog(string title, string logDate, string modifiedBy, string action, string copySource, string fileName, SPWeb web)
{
// Get the current httpcontext
System.Web.HttpContext currentContext = System.Web.HttpContext.Current;
// Set the httpcontext to null;
HttpContext.Current = null;
using (web)
{
try
{
// Create an item the Replicator Logger list to record the event
SPList spList = web.Lists[“Replicator Logger”];
SPListItem logItem = spList.Items.Add();
logItem[“Title”] = title;
logItem[“Log Date”] = logDate;
logItem[“Modified By”] = modifiedBy;
logItem[“Action”] = action;
logItem[“Copy Source”] = copySource;
logItem[“File Name”] = fileName;
logItem.Update();
}
catch (SPException spEx)
{
}
finally
{
// Set the httpcontext back to the original
System.Web.HttpContext.Current = currentContext;
}
}
}
}
The following code was added to the Feature Receiver to create the Replicator logger list:
// Create the replicator logging list
spWeb.Lists.Add(“Replicator Logger”, “Document Library Replicator Logging List”, spWeb.ListTemplates[“Custom List”]);
SPList replicatorLoggingList = spWeb.Lists[“Replicator Logger”];
replicatorLoggingList.NoCrawl = true;
replicatorLoggingList.Fields.Add(“Log Date”, SPFieldType.Text, true);
replicatorLoggingList.Fields.Add(“Modified By”, SPFieldType.Text, true);
replicatorLoggingList.Fields.Add(“Action”, SPFieldType.Text, true);
replicatorLoggingList.Fields.Add(“Copy Source”, SPFieldType.Text, true);
replicatorLoggingList.Fields.Add(“File Name”, SPFieldType.Text, true);
replicatorLoggingList.Update();
// Update the default view to show the new fields
SPView spLogView = replicatorLoggingList.DefaultView;
spLogView.ViewFields.Add(“Log Date”);
spLogView.ViewFields.Add(“Modified By”);
spLogView.ViewFields.Add(“Action”);
spLogView.ViewFields.Add(“Copy Source”);
spLogView.ViewFields.Add(“File Name”);
spLogView.Update();
The code below updates the Event Receiver to also write the properties to the Replicator Logger list:
public overridevoid ItemUpdated(SPItemEventProperties properties)
{
base.ItemUpdated(properties);
using (SPSite spsite = newSPSite(properties.WebUrl))
try
{
EventFiringEnabled = false;
if (properties.ListItem.ParentList.Title != “Replicator Logger”)
{
SPWeb siteForLogger = spsite.OpenWeb();
// determine target filename – the same as the source
string targetfilename = properties.ListItem.Name.ToString();
string SourceLib = properties.WebUrl + “/” + properties.ListItem.ParentList.ToString();
// Copy the file to the destination library (targetlibrary)
properties.ListItem.File.CopyTo(properties.WebUrl + “/” + “targetlibrary” + “/” + targetfilename, true
);
// Write to the Replicator Log – in test mode…
ReplicatorLogger replogger = newReplicatorLogger();
// Get the current Date and Time
DateTime dtime = DateTime.Now;
// Create the title for the logger list item
string title = (dtime.Date.ToString() + “_” + dtime.Hour.ToString() + “_” + dtime.Minute.ToString() + “_” + dtime.Second.ToString() + “_” + targetfilename.ToString());
// Write the information to the logger list
EventFiringEnabled = false;
replogger.writeToLog(title, dtime.ToShortDateString(), properties.UserDisplayName.ToString(),“New/Updated Document”, SourceLib, targetfilename, siteForLogger);
}
}
catch (SPException spEx) { }
finally
{
// Enable Event Firing
EventFiringEnabled = true;
}
}
Here is an example of the item created in the Replicator Logger list when an item is uploaded or updated: