using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Xml; using System.Xml.Serialization; namespace WebsitePanel.EnterpriseServer { public class TaskController { public static BackgroundTask GetTask(string taskId) { BackgroundTask task = ObjectUtils.FillObjectFromDataReader( DataProvider.GetBackgroundTask(SecurityContext.User.UserId, taskId)); task.Params = GetTaskParams(task.Id); return task; } public static List GetTasks() { return ObjectUtils.CreateListFromDataReader( DataProvider.GetBackgroundTasks(SecurityContext.User.UserId)); } public static BackgroundTask GetTopTask() { BackgroundTask task = ObjectUtils.FillObjectFromDataReader( DataProvider.GetBackgroundTopTask(SecurityContext.User.UserId)); task.Params = GetTaskParams(task.Id); return task; } public static void AddTask(BackgroundTask task) { int taskId = DataProvider.AddBackgroundTask(task.TaskId, task.ScheduleId, task.PackageId, task.UserId, task.EffectiveUserId, task.TaskName, task.ItemId, task.ItemName, task.StartDate, task.IndicatorCurrent, task.IndicatorMaximum, task.MaximumExecutionTime, task.Source, task.Severity, task.Completed, task.NotifyOnComplete, task.Status); AddTaskParams(taskId, task.Params); DataProvider.AddBackgroundTaskStack(taskId); } public static void UpdateTask(BackgroundTask task) { DataProvider.UpdateBackgroundTask(task.Id, task.ScheduleId, task.PackageId, task.TaskName, task.ItemId, task.ItemName, task.FinishDate, task.IndicatorCurrent, task.IndicatorMaximum, task.MaximumExecutionTime, task.Source, task.Severity, task.Completed, task.NotifyOnComplete, task.Status); AddTaskParams(task.Id, task.Params); if (task.Completed) { DeleteTaskStack(task.Id); } } public static void DeleteTaskStack(int taskId) { DataProvider.DeleteBackgroundTaskParams(taskId); } public static void AddTaskParams(int taskId, IList parameters) { foreach (BackgroundTaskParameter param in SerializeParams(parameters)) { DataProvider.AddBackgroundTaskParam(taskId, param.Name, param.SerializerValue); } } public static IList GetTaskParams(int taskId) { List parameters = ObjectUtils.CreateListFromDataReader( DataProvider.GetBackgroundTaskParams(taskId)); return DeserializeParams(parameters); } public static void AddLog(BackgroundTaskLogRecord log) { DataProvider.AddBackgroundTaskLog(log.TaskId, log.Date, log.ExceptionStackTrace, log.InnerTaskStart, log.Severity, log.Text, log.TextIdent, BuildParametersXml(log.TextParameters)); } public static List GetLogs(int taskId, DateTime startLogTime) { List logs = ObjectUtils.CreateListFromDataReader( DataProvider.GetBackgroundTaskLogs(taskId, startLogTime)); foreach (BackgroundTaskLogRecord log in logs) { log.TextParameters = ReBuildParametersXml(log.XmlParameters); } return logs; } private static IList SerializeParams(IList parameters) { foreach (BackgroundTaskParameter param in parameters) { XmlSerializer serializer = new XmlSerializer(param.Value.GetType()); MemoryStream ms = new MemoryStream(); serializer.Serialize(ms, param.Value); ms.Position = 0; StreamReader sr = new StreamReader(ms); param.SerializerValue = sr.ReadToEnd(); } return parameters; } private static IList DeserializeParams(IList parameters) { foreach (BackgroundTaskParameter param in parameters) { XmlSerializer deserializer = new XmlSerializer(param.Value.GetType()); StringReader sr = new StringReader(param.SerializerValue); param.Value = deserializer.Deserialize(sr); } return parameters; } private static string BuildParametersXml(string[] parameters) { XmlDocument xmlDoc = new XmlDocument(); XmlElement nodeProps = xmlDoc.CreateElement("parameters"); if (parameters != null) { foreach (string parameter in parameters) { XmlElement nodeProp = xmlDoc.CreateElement("parameter"); nodeProp.SetAttribute("value", parameter); nodeProps.AppendChild(nodeProp); } } return nodeProps.OuterXml; } private static string[] ReBuildParametersXml(string parameters) { string[] textParameters = new string[] {}; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(parameters); if (xmlDoc != null) { int index = 0; foreach (XmlNode xmlParameter in xmlDoc.SelectNodes("parameters/parameter")) { textParameters[index] = xmlParameter.Attributes.GetNamedItem("value").Value; index++; } } return textParameters; } } }