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)); if (task == null) { return null; } task.Params = GetTaskParams(task.Id); return task; } public static List GetScheduleTasks(int scheduleId) { return ObjectUtils.CreateListFromDataReader( DataProvider.GetScheduleBackgroundTasks(SecurityContext.User.UserId, scheduleId)); } public static List GetTasks() { return GetTasks(SecurityContext.User.UserId); } public static List GetTasks(int actorId) { return ObjectUtils.CreateListFromDataReader( DataProvider.GetBackgroundTasks(actorId)); } public static List GetTasks(Guid guid) { return ObjectUtils.CreateListFromDataReader( DataProvider.GetBackgroundTasks(SecurityContext.User.UserId, guid)); } public static List GetProcessTasks(BackgroundTaskStatus status) { return ObjectUtils.CreateListFromDataReader( DataProvider.GetProcessBackgroundTasks(status)); } public static BackgroundTask GetTopTask(Guid guid) { BackgroundTask task = ObjectUtils.FillObjectFromDataReader( DataProvider.GetBackgroundTopTask(SecurityContext.User.UserId, guid)); if (task == null) { return null; } task.Params = GetTaskParams(task.Id); return task; } public static void AddTask(BackgroundTask task) { int taskId = DataProvider.AddBackgroundTask(task.Guid, 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.Guid, 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 || task.Status == BackgroundTaskStatus.Abort || task.Status == BackgroundTaskStatus.Stopping) { DeleteTaskStack(task.Id); } } public static void DeleteTaskStack(int taskId) { DataProvider.DeleteBackgroundTaskStack(taskId); } public static void AddTaskParams(int taskId, List parameters) { foreach (BackgroundTaskParameter param in SerializeParams(parameters)) { DataProvider.AddBackgroundTaskParam(taskId, param.Name, param.SerializerValue, param.TypeName); } } public static List 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 List SerializeParams(List parameters) { foreach (BackgroundTaskParameter param in parameters) { var type = param.Value.GetType(); param.TypeName = type.FullName; XmlSerializer serializer = new XmlSerializer(type); 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 List DeserializeParams(List parameters) { foreach (BackgroundTaskParameter param in parameters) { XmlSerializer deserializer = new XmlSerializer(Type.GetType(param.TypeName)); 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) { var textParameters = new List(); var xmlDoc = new XmlDocument(); xmlDoc.LoadXml(parameters); if (xmlDoc != null) { textParameters.AddRange(from XmlNode xmlParameter in xmlDoc.SelectNodes("parameters/parameter") select xmlParameter.Attributes.GetNamedItem("value").Value); } return textParameters.ToArray(); } } }