Beispiel #1
0
 private void Init()
 {
     using (var db = new AryaServicesDbDataContext())
     {
         //Restart tasks that were "working" in the previous run (if any)
         var workingTasks = db.AryaTasks.Where(t => t.Status == WorkerState.Working.ToString());
         workingTasks.ForEach(t => t.Status = WorkerState.New.ToString());
         db.SubmitChanges();
     }
 }
Beispiel #2
0
        private static IEnumerable <AryaTask> GetTasks(AryaDbDataContext aryaDc,
                                                       AryaServicesDbDataContext taskDc, User currUser, Guid userGroup, IEnumerable <string> jobTypes,
                                                       bool currentUserTasksOnly)
        {
            var projects =
                (from ug in aryaDc.UserProjects
                 where ug.GroupID == userGroup && ug.UserID == currUser.ID
                 select ug.ProjectID).ToList();

            return(projects.Any()
                ? taskDc.AryaTasks.Where(
                       task =>
                       projects.Contains(task.ProjectID) && jobTypes.Contains(task.JobType) &&
                       (!currentUserTasksOnly || task.SubmittedBy == currUser.ID))
                : Enumerable.Empty <AryaTask>());
        }
Beispiel #3
0
        protected void CancelCurrentJob(object sender, CommandEventArgs e)
        {
            var taskId = Guid.Parse(e.CommandArgument.ToString());

            using (var taskDc = new AryaServicesDbDataContext())
            {
                var task = taskDc.AryaTasks.First(t => t.ID == taskId);
                if (task.Status == WorkerState.New.ToString())
                {
                    task.Status = WorkerState.AbortedByUser.ToString();
                    taskDc.SubmitChanges();
                }
                else
                {
                    lblMessage.Text =
                        "Could not cancel Job - it had already started before cancel request was sent to server.";
                }
                BindGridView();
            }
        }
Beispiel #4
0
        public void SubmitJobs()
        {
            // get data context
            using (var db = new AryaServicesDbDataContext())
            {
                // get a list of jobs to be executed
                var now  = DateTime.Now;
                var jobs = db.AryaSchedules.Where(s => (s.NextExecution == null || s.NextExecution <= now));

                // add each job to the task queue
                foreach (var job in jobs)
                {
                    string newArgumentDirectoryPath = Path.Combine(job.ProjectID.ToString(), Guid.NewGuid().ToString());
                    DirectoryCopy(Path.Combine(Settings.Default.ArgumentFileBasePath, job.ArgumentDirectoryPath),
                                  Path.Combine(Settings.Default.ArgumentFileBasePath, newArgumentDirectoryPath), true);
                    //File.Copy();
                    var newJob = new AryaTask
                    {
                        ID                    = Guid.NewGuid(),
                        ScheduleID            = job.ID,
                        Description           = job.Description,
                        ArgumentDirectoryPath = newArgumentDirectoryPath,
                        Status                = "New",
                        SubmittedBy           = job.SubmittedBy,
                        SubmittedOn           = now,
                        ProjectID             = job.ProjectID,
                        LastUpdateOn          = now,
                        JobType               = job.JobType
                    };
                    db.AryaTasks.InsertOnSubmit(newJob);
                    Logger.GetLogWriter().Info("SchedueJobId:" + job.ID + "was submitted as regular job");
                    // update the date of execution of the selected job
                    job.NextExecution = now.AddMinutes(job.Interval);
                    job.LastExecution = now;

                    // update the database
                    db.SubmitChanges();
                }
            }
        }
Beispiel #5
0
        private bool LoadArguments()
        {
            try
            {
                using (var taskDc = new AryaServicesDbDataContext())
                    using (var aryaDc = new AryaDbDataContext())
                    {
                        var task     = taskDc.AryaTasks.Single(t => t.ID == TaskId);
                        var taskInfo = (from up in aryaDc.UserProjects
                                        where up.Project.ID == task.ProjectID && up.User.ID == task.SubmittedBy
                                        select
                                        new
                        {
                            JobType = task.DisplayJobType,
                            Project = up.Project.DisplayName,
                            SubmittedBy = up.User.FullName,
                            SubmittedOn = task.SubmittedOn.ToString(),
                            Status = task.Status.Spacify()
                        }).First();

                        _status = taskInfo.Status;

                        var properties = taskInfo.GetType().GetProperties();
                        foreach (var prop in properties)
                        {
                            var value = prop.GetValue(taskInfo).ToString();
                            phArguments.Controls.Add(new Label {
                                Text = prop.Name.Spacify() + ":", CssClass = "PropertyName"
                            });
                            phArguments.Controls.Add(new Label {
                                Text = value, CssClass = "PropertyValue"
                            });
                            phArguments.Controls.Add(new LiteralControl("<br />"));
                        }
                    }
            }
            catch (Exception ex)
            {
                return(false);
            }
            try
            {
                var arguments  = new SharpSerializer().Deserialize(Path.Combine(Basepath, ArgumentsPath, "Arguments.xml"));
                var properties = (from prop in arguments.GetType().GetProperties()
                                  let category =
                                      prop.IsDefined(typeof(CategoryAttribute), false)
                                          ? prop.GetCustomAttributes(typeof(CategoryAttribute), false)
                                      .Cast <CategoryAttribute>()
                                      .Single()
                                      .Category
                                          : "Other"
                                      let name =
                                          prop.IsDefined(typeof(DisplayNameAttribute), false)
                                          ? prop.GetCustomAttributes(typeof(DisplayNameAttribute), false)
                                          .Cast <DisplayNameAttribute>()
                                          .Single()
                                          .DisplayName
                                          : prop.Name
                                          let displayOrder =
                                              prop.IsDefined(typeof(PropertyOrderAttribute), false)
                                          ? prop.GetCustomAttributes(typeof(PropertyOrderAttribute), false)
                                              .Cast <PropertyOrderAttribute>()
                                              .Single()
                                              .Order
                                          : 999
                                              let shouldSerializeMethod = arguments.GetType().GetMethod("ShouldSerialize" + prop.Name)
                                                                          let shouldSerialize =
                                                  shouldSerializeMethod == null || (bool)shouldSerializeMethod.Invoke(arguments, new object[] { })
                                                  where shouldSerialize
                                                  orderby displayOrder
                                                  select new { Property = prop, Category = category, Name = name, displayOrder }).ToList();

                foreach (var prop in properties)
                {
                    var propertyType = prop.Property.PropertyType;
                    if (propertyType == typeof(Guid) || propertyType == typeof(Guid[]))
                    {
                        continue;
                    }

                    var basevalue = prop.Property.GetValue(arguments) ?? string.Empty;
                    if (string.IsNullOrWhiteSpace(basevalue.ToString()))
                    {
                        continue;
                    }

                    if (propertyType.IsGenericType && propertyType.GetGenericTypeDefinition() == typeof(Dictionary <,>))
                    {
                        phArguments.Controls.Add(new Label
                        {
                            Text     = prop.Name.Spacify() + ":",
                            CssClass = "PropertyName",
                        });

                        phArguments.Controls.Add(new LiteralControl("<br />"));

                        var kvps = (IDictionary)basevalue;
                        foreach (DictionaryEntry kvp in kvps)
                        {
                            phArguments.Controls.Add(new Label
                            {
                                Text     = kvp.Key.ToString().Spacify(),
                                CssClass = "PropertyValueLeft"
                            });
                            phArguments.Controls.Add(new Label
                            {
                                Text     = kvp.Value.ToString().Spacify(),
                                CssClass = "PropertyValue"
                            });
                            phArguments.Controls.Add(new LiteralControl("<br />"));
                        }
                        continue;
                    }

                    var stringValue = basevalue.ToString();
                    if (propertyType.IsArray)
                    {
                        stringValue = string.Empty;
                        var values = (Array)prop.Property.GetValue(arguments);
                        for (var i = 0; i < values.Length; i++)
                        {
                            stringValue += (i > 0 ? ", " : string.Empty) + values.GetValue(i);
                        }
                    }

                    if (string.IsNullOrWhiteSpace(stringValue) || stringValue == new DateTime().ToString())
                    {
                        continue;
                    }

                    if (prop.Name.ToLower().EndsWith("path"))
                    {
                        try
                        {
                            var path = Path.GetFullPath(stringValue);
                            stringValue = Path.GetFileName(stringValue);
                        }
                        catch (Exception ex)
                        {
                        }
                    }

                    phArguments.Controls.Add(new Label {
                        Text = prop.Name.Spacify() + ":", CssClass = "PropertyName"
                    });
                    phArguments.Controls.Add(new Label {
                        Text = stringValue, CssClass = "PropertyValue"
                    });
                    phArguments.Controls.Add(new LiteralControl("<br />"));
                }

                pnlArguments.Visible = true;
            }
            catch (Exception)
            {
                return(false);
            }
            return(true);
        }
Beispiel #6
0
        public async Task ProcessJobs(object processBucket)
        {
            //CurrentLogWriter.Debug("Job assigner has started processing jobs.");
            try
            {
                AryaTask job;
                using (var aryaServicesDb = new AryaServicesDbDataContext())
                {
                    job =
                        aryaServicesDb.AryaTasks.FirstOrDefault(
                            s => s.Status.ToLower() == WorkerState.New.ToString().ToLower());

                    if (job == null)
                    {
                        return;
                    }
                    CurrentLogWriter.InfoFormat(
                        "Job ID: {0} Starting\tDescription:{1}\tSubmitted by:{2}\tSubmitted on:{3}\tJob type:{4}\tProcess bucket:{5}",
                        job.ID, job.Description, job.SubmittedBy, job.SubmittedOn, job.JobType, processBucket);
                    job.JobAssignedOn = DateTime.Now;
                    job.Status        = WorkerState.Working.ToString();

                    aryaServicesDb.SubmitChanges();
                }
                string currentJobStatus, emailAddresses = string.Empty;
                try
                {
                    if (JobProcessors.ContainsKey(job.JobType))
                    {
                        //create the job instance
                        var currentJobType = JobProcessors[job.JobType];

                        var jobExecutor =
                            (WorkerBase)
                            Activator.CreateInstance(currentJobType,
                                                     new object[]
                        {
                            Path.Combine(Settings.Default.ArgumentFileBasePath,
                                         job.ArgumentDirectoryPath)
                        });

                        jobExecutor.CurrentLogWriter    = CurrentLogWriter;
                        jobExecutor.WorkerStatusChange += AryaServices.UpdateWorkerStatusInDb;
                        emailAddresses = jobExecutor.Arguments.NotificationEmailAddresses;
                        ProcessEmailJobStatus(emailAddresses, job, true, "Started");
                        await Task.Run(() => jobExecutor.Run());

                        jobExecutor.SaveSummary();
                        currentJobStatus = jobExecutor.Summary.State.ToString();
                    }
                    else
                    {
                        currentJobStatus = WorkerState.Abort.ToString();
                        CurrentLogWriter.ErrorFormat("{0}: {1} not found in the dll provided", job.ID, job.JobType);
                    }
                }
                catch (Exception ex)
                {
                    var message = string.Empty;
                    var e       = ex;
                    while (e != null)
                    {
                        message = Environment.NewLine + e.Message;
                        e       = e.InnerException;
                    }
                    CurrentLogWriter.Error(ex.Source + message + Environment.NewLine + ex.StackTrace);
                    currentJobStatus = WorkerState.Abort.ToString();
                    CurrentLogWriter.Error(ex.SerializeObject());
                }

                using (var aryaServicesDb = new AryaServicesDbDataContext())
                {
                    job        = aryaServicesDb.AryaTasks.First(t => t.ID == job.ID);
                    job.Status = currentJobStatus;
                    ProcessEmailJobStatus(emailAddresses, job, true);
                    CurrentLogWriter.InfoFormat("Job Id: {0} Finished processing, Last Status: {1}", job.ID,
                                                currentJobStatus);
                    job.LastUpdateOn = DateTime.Now;
                    aryaServicesDb.SubmitChanges();
                }
            }
            catch (Exception ex)
            {
                CurrentLogWriter.Error(ex.SerializeObject());
            }

            CurrentLogWriter.Debug("Job assigner is exiting.");
        }
Beispiel #7
0
        private void BindGridView(bool clearAllFilters = false)
        {
            using (var aryaDc = new AryaDbDataContext())
            {
                var currUser = (from u in aryaDc.Users where u.EmailAddress == Email select u).FirstOrDefault();
                if (currUser == null)
                {
                    FormsAuthentication.RedirectToLoginPage();
                    return;
                }

                using (var taskDc = new AryaServicesDbDataContext())
                {
                    var tasks = Enumerable.Empty <AryaTask>().AsQueryable();
                    if (currUser.IsAdmin)
                    {
                        tasks = taskDc.AryaTasks;
                    }
                    else
                    {
                        //Import Admin Tasks
                        tasks =
                            tasks.Union(GetTasks(aryaDc, taskDc, currUser, Group.ImportAdminGroup,
                                                 new[] { typeof(ImportWorker).Name }, false));
                        //Import User Tasks
                        tasks =
                            tasks.Union(GetTasks(aryaDc, taskDc, currUser, Group.ImportUserGroup,
                                                 new[] { typeof(ImportWorker).Name }, true));

                        var exportJobTypes = ExportWorkerBase.GetExports().Select(e => e.GetType().Name).ToList();
                        //Export Admin Tasks
                        tasks =
                            tasks.Union(GetTasks(aryaDc, taskDc, currUser, Group.ExportAdminGroup,
                                                 exportJobTypes.Union(typeof(CustomExportWorker).Name), false));
                        //Standard Export User Tasks
                        tasks =
                            tasks.Union(GetTasks(aryaDc, taskDc, currUser, Group.StandardExportUserGroup,
                                                 exportJobTypes, true));
                        //Custom Export User Tasks
                        tasks =
                            tasks.Union(GetTasks(aryaDc, taskDc, currUser, Group.CustomExportUserGroup,
                                                 new[] { typeof(CustomExportWorker).Name }, true));
                    }

                    if (!clearAllFilters)
                    {
                        Guid selectedProject, selectedUser;
                        if (Guid.TryParse(DdlProjects.SelectedValue, out selectedProject))
                        {
                            tasks = tasks.Where(task => task.ProjectID == selectedProject);
                        }

                        if (Guid.TryParse(DdlSubmittedBy.SelectedValue, out selectedUser))
                        {
                            tasks = tasks.Where(task => task.SubmittedBy == selectedUser);
                        }

                        var selectedJobType = DdlJobType.SelectedValue;
                        if (!string.IsNullOrWhiteSpace(selectedJobType) && selectedJobType != "ALL")
                        {
                            tasks = tasks.Where(task => task.JobType == DdlJobType.SelectedValue);
                        }

                        var selectedStatus = DdlStatus.SelectedValue;
                        if (!string.IsNullOrWhiteSpace(selectedStatus) && selectedStatus != "ALL")
                        {
                            tasks = tasks.Where(task => task.Status == DdlStatus.SelectedValue);
                        }
                    }
                    var allTasks = tasks.OrderByDescending(task => task.SubmittedOn).Take(100).ToList();

                    var distinctUserProjects =
                        allTasks.Select(t => t.SubmittedBy + "|" + t.ProjectID).Distinct().ToList();
                    var userProjects = (from up in aryaDc.UserProjects
                                        //from task in tasks.ToList()
                                        //where task.SubmittedBy == up.UserID && task.ProjectID == up.ProjectID
                                        where distinctUserProjects.Contains(up.UserID + "|" + up.ProjectID)
                                        select new { up.User, up.Project }).ToList();

                    var visibleTasks = from task in allTasks
                                       from up in userProjects
                                       where up.Project.ID == task.ProjectID && up.User.ID == task.SubmittedBy
                                       let project                                                           = up.Project
                                                                            let user                         = up.User
                                                                                                   let state =
                        WorkerBase.GetFriendlyWorkerState(
                            (WorkerState)Enum.Parse(typeof(WorkerState), task.Status))
                        orderby task.SubmittedOn descending
                        select
                        new
                    {
                        task.ID,
                        task.ProjectID,
                        ProjectName = project.DisplayName,
                        Type        = task.DisplayJobType,
                        task.JobType,
                        task.Description,
                        task.Status,
                        FriendlyStatus = state,
                        user.FullName,
                        task.SubmittedBy,
                        task.SubmittedOn
                    };

                    if (sortExpression != string.Empty)
                    {
                        visibleTasks = LinqExtensions.ApplyOrder(visibleTasks, sortExpression,
                                                                 sortOrder == "asc" ? "OrderBy" : "OrderByDescending");
                    }

                    var visibleTaskList = visibleTasks.Distinct().ToList();
                    GvStatus.DataSource = visibleTaskList;
                    GvStatus.DataBind();

                    if (visibleTaskList.Count == 0)
                    {
                        return;
                    }

                    if (!Page.IsPostBack)
                    {
                        var projects =
                            userProjects.Select(
                                up =>
                                new DropDownListItem
                        {
                            Text  = up.Project.DisplayName,
                            Value = up.Project.ID.ToString()
                        })
                            .Distinct(new KeyEqualityComparer <DropDownListItem>(item => item.Value))
                            .OrderBy(item => item.Text)
                            .ToList();
                        Session["projects"] = projects;

                        var users =
                            userProjects.Select(
                                up => new DropDownListItem {
                            Text = up.User.FullName, Value = up.User.ID.ToString()
                        })
                            .Distinct(new KeyEqualityComparer <DropDownListItem>(item => item.Value))
                            .OrderBy(item => item.Text)
                            .ToList();
                        Session["users"] = users;

                        var jobTypes =
                            allTasks.Select(
                                task => new DropDownListItem {
                            Text = task.DisplayJobType, Value = task.JobType
                        })
                            .Distinct(new KeyEqualityComparer <DropDownListItem>(item => item.Value))
                            .OrderBy(item => item.Text)
                            .ToList();
                        Session["jobTypes"] = jobTypes;

                        var statuses =
                            allTasks.Select(task => new DropDownListItem {
                            Text = task.Status, Value = task.Status
                        })
                            .Distinct(new KeyEqualityComparer <DropDownListItem>(item => item.Value))
                            .OrderBy(item => item.Text)
                            .ToList();
                        Session["statuses"] = statuses;
                    }

                    var prjs            = Session["projects"] as List <DropDownListItem> ?? new List <DropDownListItem>();
                    var visibleProjects =
                        prjs.Where(prj => visibleTaskList.Any(task => task.ProjectID.ToString() == prj.Value)).ToList();
                    visibleProjects.Insert(visibleProjects.Count > 1 ? 0 : 1,
                                           new DropDownListItem {
                        Text = "ALL", Value = "ALL"
                    });
                    visibleProjects.Add(new DropDownListItem {
                        Text = "-----", Value = "ALL"
                    });
                    visibleProjects.AddRange(prjs.Where(prj => !visibleProjects.Contains(prj)));
                    DdlProjects.DataSource = visibleProjects;
                    DdlProjects.DataBind();

                    var usrs         = Session["users"] as List <DropDownListItem> ?? new List <DropDownListItem>();
                    var visibleusers =
                        usrs.Where(usr => visibleTaskList.Any(task => task.SubmittedBy.ToString() == usr.Value))
                        .ToList();
                    visibleusers.Insert(visibleusers.Count > 1 ? 0 : 1,
                                        new DropDownListItem {
                        Text = "ALL", Value = "ALL"
                    });
                    visibleusers.Add(new DropDownListItem {
                        Text = "-----", Value = "ALL"
                    });
                    visibleusers.AddRange(usrs.Where(usr => !visibleusers.Contains(usr)));
                    DdlSubmittedBy.DataSource = visibleusers;
                    DdlSubmittedBy.DataBind();

                    var jbts            = Session["jobTypes"] as List <DropDownListItem> ?? new List <DropDownListItem>();
                    var visiblejobTypes =
                        jbts.Where(jbt => visibleTaskList.Any(task => task.JobType == jbt.Value)).ToList();
                    visiblejobTypes.Insert(visiblejobTypes.Count > 1 ? 0 : 1,
                                           new DropDownListItem {
                        Text = "ALL", Value = "ALL"
                    });
                    visiblejobTypes.Add(new DropDownListItem {
                        Text = "-----", Value = "ALL"
                    });
                    visiblejobTypes.AddRange(jbts.Where(jbt => !visiblejobTypes.Contains(jbt)));
                    DdlJobType.DataSource = visiblejobTypes;
                    DdlJobType.DataBind();

                    var stus            = Session["statuses"] as List <DropDownListItem> ?? new List <DropDownListItem>();
                    var visiblestatuses =
                        stus.Where(stu => visibleTaskList.Any(task => task.Status == stu.Value)).ToList();
                    visiblestatuses.Insert(visiblestatuses.Count > 1 ? 0 : 1,
                                           new DropDownListItem {
                        Text = "ALL", Value = "ALL"
                    });
                    visiblestatuses.Add(new DropDownListItem {
                        Text = "-----", Value = "ALL"
                    });
                    visiblestatuses.AddRange(stus.Where(stu => !visiblestatuses.Contains(stu)));
                    DdlStatus.DataSource = visiblestatuses;
                    DdlStatus.DataBind();
                }
            }
        }