Free cookie consent management tool by TermsFeed Policy Generator

source: branches/2839_HiveProjectManagement/HeuristicLab.Services.Hive/3.3/HiveService.cs @ 15954

Last change on this file since 15954 was 15954, checked in by jzenisek, 6 years ago

#2839: updated behavior of permission assignment for project owners (client and server side)

File size: 68.1 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Collections.Generic;
24using System.Linq;
25using System.Security;
26using System.ServiceModel;
27using HeuristicLab.Services.Access;
28using HeuristicLab.Services.Hive.DataAccess.Interfaces;
29using HeuristicLab.Services.Hive.DataTransfer;
30using HeuristicLab.Services.Hive.Manager;
31using HeuristicLab.Services.Hive.ServiceContracts;
32using DA = HeuristicLab.Services.Hive.DataAccess;
33using DT = HeuristicLab.Services.Hive.DataTransfer;
34
35namespace HeuristicLab.Services.Hive {
36  /// <summary>
37  /// Implementation of the Hive service (interface <see cref="IHiveService"/>).
38  /// We need 'IgnoreExtensionDataObject' Attribute for the slave to work.
39  /// </summary>
40  [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, IgnoreExtensionDataObject = true)]
41  [HiveOperationContextBehavior]
42  public class HiveService : IHiveService {
43    private const string NOT_AUTHORIZED_PROJECTRESOURCE = "Selected project is not authorized to access the requested resource";
44    private const string NOT_AUTHORIZED_USERPROJECT = "Current user is not authorized to access the requested project";
45
46    private static readonly DA.TaskState[] CompletedStates = { DA.TaskState.Finished, DA.TaskState.Aborted, DA.TaskState.Failed };
47
48    private IPersistenceManager PersistenceManager {
49      get { return ServiceLocator.Instance.PersistenceManager; }
50    }
51
52    private IUserManager UserManager {
53      get { return ServiceLocator.Instance.UserManager; }
54    }
55
56    private IRoleVerifier RoleVerifier {
57      get { return ServiceLocator.Instance.RoleVerifier; }
58    }
59
60    private IAuthorizationManager AuthorizationManager {
61      get { return ServiceLocator.Instance.AuthorizationManager; }
62    }
63    private IEventManager EventManager {
64      get { return ServiceLocator.Instance.EventManager; }
65    }
66    private HeartbeatManager HeartbeatManager {
67      get { return ServiceLocator.Instance.HeartbeatManager; }
68    }
69
70    #region Task Methods
71
72    public Guid AddTask(DT.Task task, DT.TaskData taskData) {
73      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
74      AuthorizationManager.AuthorizeForJob(task.JobId, DT.Permission.Full);
75      var pm = PersistenceManager;
76      using (new PerformanceLogger("AddTask")) {
77        var taskDao = pm.TaskDao;
78        var stateLogDao = pm.StateLogDao;
79        var newTask = task.ToEntity();
80        newTask.JobData = taskData.ToEntity();
81        newTask.JobData.LastUpdate = DateTime.Now;
82        newTask.State = DA.TaskState.Waiting;
83        return pm.UseTransaction(() => {
84          taskDao.Save(newTask);
85          pm.SubmitChanges();
86          stateLogDao.Save(new DA.StateLog {
87            State = DA.TaskState.Waiting,
88            DateTime = DateTime.Now,
89            TaskId = newTask.TaskId,
90            UserId = UserManager.CurrentUserId,
91            SlaveId = null,
92            Exception = null
93          });
94          pm.SubmitChanges();
95          return newTask.TaskId;
96        }, false, true);
97      }
98    }
99
100    public Guid AddChildTask(Guid parentTaskId, DT.Task task, DT.TaskData taskData) {
101      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
102      task.ParentTaskId = parentTaskId;
103      return AddTask(task, taskData);
104    }
105
106    public DT.Task GetTask(Guid taskId) {
107      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
108      AuthorizationManager.AuthorizeForTask(taskId, Permission.Read);
109      var pm = PersistenceManager;
110      using (new PerformanceLogger("GetTask")) {
111        var taskDao = pm.TaskDao;
112        return pm.UseTransaction(() => {
113          var task = taskDao.GetById(taskId);
114          return task.ToDto();
115        });
116      }
117    }
118
119    public IEnumerable<DT.LightweightTask> GetLightweightJobTasks(Guid jobId) {
120      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
121      AuthorizationManager.AuthorizeForJob(jobId, Permission.Read);
122      var pm = PersistenceManager;
123      using (new PerformanceLogger("GetLightweightJobTasks")) {
124        var taskDao = pm.TaskDao;
125        return pm.UseTransaction(() => {
126          return taskDao.GetByJobId(jobId)
127            .ToList()
128            .Select(x => new DT.LightweightTask {
129              Id = x.TaskId,
130              ExecutionTime = TimeSpan.FromMilliseconds(x.ExecutionTimeMs),
131              ParentTaskId = x.ParentTaskId,
132              StateLog = x.StateLogs.OrderBy(y => y.DateTime)
133                                    .Select(z => z.ToDto())
134                                    .ToList(),
135              State = x.State.ToDto(),
136              Command = x.Command.ToDto(),
137              LastTaskDataUpdate = x.JobData.LastUpdate
138            })
139            .ToList();
140        }, false, true);
141      }
142    }
143
144    public IEnumerable<DT.LightweightTask> GetLightweightJobTasksWithoutStateLog(Guid jobId) {
145      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
146      AuthorizationManager.AuthorizeForJob(jobId, Permission.Read);
147      var pm = PersistenceManager;
148      using (new PerformanceLogger("GetLightweightJobTasksWithoutStateLog")) {
149        var taskDao = pm.TaskDao;
150        return pm.UseTransaction(() => {
151          return taskDao.GetByJobId(jobId)
152            .ToList()
153            .Select(x => new DT.LightweightTask {
154              Id = x.TaskId,
155              ExecutionTime = TimeSpan.FromMilliseconds(x.ExecutionTimeMs),
156              ParentTaskId = x.ParentTaskId,
157              StateLog = new List<DT.StateLog>(),
158              State = x.State.ToDto(),
159              Command = x.Command.ToDto(),
160              LastTaskDataUpdate = x.JobData.LastUpdate
161            })
162            .ToList();
163        }, false, true);
164      }
165    }
166
167    public DT.TaskData GetTaskData(Guid taskId) {
168      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
169      AuthorizationManager.AuthorizeForTask(taskId, Permission.Read);
170      var pm = PersistenceManager;
171      using (new PerformanceLogger("GetTaskData")) {
172        var taskDataDao = pm.TaskDataDao;
173        return pm.UseTransaction(() => taskDataDao.GetById(taskId).ToDto());
174      }
175    }
176
177    public void UpdateTask(DT.Task taskDto) {
178      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
179      AuthorizationManager.AuthorizeForTask(taskDto.Id, Permission.Full);
180      var pm = PersistenceManager;
181      using (new PerformanceLogger("UpdateTask")) {
182        var taskDao = pm.TaskDao;
183        pm.UseTransaction(() => {
184          var task = taskDao.GetById(taskDto.Id);
185          taskDto.CopyToEntity(task);
186          pm.SubmitChanges();
187        });
188      }
189    }
190
191    public void UpdateTaskData(DT.Task taskDto, DT.TaskData taskDataDto) {
192      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
193      AuthorizationManager.AuthorizeForTask(taskDto.Id, Permission.Full);
194      var pm = PersistenceManager;
195      using (new PerformanceLogger("UpdateTaskData")) {
196        var taskDao = pm.TaskDao;
197        var taskDataDao = pm.TaskDataDao;
198        pm.UseTransaction(() => {
199          var task = taskDao.GetById(taskDto.Id);
200          var taskData = taskDataDao.GetById(taskDataDto.TaskId);
201          taskDto.CopyToEntity(task);
202          taskDataDto.CopyToEntity(taskData);
203          taskData.LastUpdate = DateTime.Now;
204          pm.SubmitChanges();
205        });
206      }
207    }
208
209    public DT.Task UpdateTaskState(Guid taskId, DT.TaskState taskState, Guid? slaveId, Guid? userId, string exception) {
210      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
211      AuthorizationManager.AuthorizeForTask(taskId, Permission.Full);
212      var pm = PersistenceManager;
213      using (new PerformanceLogger("UpdateTaskState")) {
214        var taskDao = pm.TaskDao;
215        return pm.UseTransaction(() => {
216          var task = taskDao.GetById(taskId);
217          UpdateTaskState(pm, task, taskState, slaveId, userId, exception);
218          pm.SubmitChanges();
219          return task.ToDto();
220        });
221      }
222    }
223    #endregion
224
225    #region Task Control Methods
226    public void StopTask(Guid taskId) {
227      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
228      AuthorizationManager.AuthorizeForTask(taskId, Permission.Full);
229      var pm = PersistenceManager;
230      using (new PerformanceLogger("StopTask")) {
231        var taskDao = pm.TaskDao;
232        pm.UseTransaction(() => {
233          var task = taskDao.GetById(taskId);
234          if (task.State == DA.TaskState.Calculating || task.State == DA.TaskState.Transferring) {
235            task.Command = DA.Command.Stop;
236          } else if (task.State != DA.TaskState.Aborted
237                     && task.State != DA.TaskState.Finished
238                     && task.State != DA.TaskState.Failed) {
239            UpdateTaskState(pm, task, DT.TaskState.Aborted, null, null, string.Empty);
240          }
241          pm.SubmitChanges();
242        });
243      }
244    }
245
246    public void PauseTask(Guid taskId) {
247      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
248      AuthorizationManager.AuthorizeForTask(taskId, Permission.Full);
249      var pm = PersistenceManager;
250      using (new PerformanceLogger("PauseTask")) {
251        var taskDao = pm.TaskDao;
252        pm.UseTransaction(() => {
253          var task = taskDao.GetById(taskId);
254          if (task.State == DA.TaskState.Calculating || task.State == DA.TaskState.Transferring) {
255            task.Command = DA.Command.Pause;
256          } else if (task.State != DA.TaskState.Paused
257                     && task.State != DA.TaskState.Aborted
258                     && task.State != DA.TaskState.Finished
259                     && task.State != DA.TaskState.Failed) {
260            UpdateTaskState(pm, task, DT.TaskState.Paused, null, null, string.Empty);
261          }
262          pm.SubmitChanges();
263        });
264      }
265    }
266
267    public void RestartTask(Guid taskId) {
268      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
269      AuthorizationManager.AuthorizeForTask(taskId, Permission.Full);
270      var pm = PersistenceManager;
271      using (new PerformanceLogger("RestartTask")) {
272        var taskDao = pm.TaskDao;
273        pm.UseTransaction(() => {
274          var task = taskDao.GetById(taskId);
275          task.Command = null;
276          UpdateTaskState(pm, task, DT.TaskState.Waiting, null, UserManager.CurrentUserId, string.Empty);
277          pm.SubmitChanges();
278        });
279      }
280    }
281    #endregion
282
283    #region Job Methods
284    public DT.Job GetJob(Guid id) {
285      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
286      AuthorizationManager.AuthorizeForJob(id, DT.Permission.Read);
287      var pm = PersistenceManager;
288      using (new PerformanceLogger("GetJob")) {
289        var jobDao = pm.JobDao;
290        var jobPermissionDao = pm.JobPermissionDao;
291        var taskDao = pm.TaskDao;
292        var currentUserId = UserManager.CurrentUserId;
293        return pm.UseTransaction(() => {
294          var job = jobDao.GetById(id).ToDto();
295          if (job != null) {
296            var statistics = taskDao.GetByJobId(job.Id)
297              .GroupBy(x => x.JobId)
298              .Select(x => new {
299                TotalCount = x.Count(),
300                CalculatingCount = x.Count(y => y.State == DA.TaskState.Calculating),
301                FinishedCount = x.Count(y => CompletedStates.Contains(y.State))
302              }).FirstOrDefault();
303            if (statistics != null) {
304              job.JobCount = statistics.TotalCount;
305              job.CalculatingCount = statistics.CalculatingCount;
306              job.FinishedCount = statistics.FinishedCount;
307            }
308            job.OwnerUsername = UserManager.GetUserNameById(job.OwnerUserId);
309            if (currentUserId == job.OwnerUserId) {
310              job.Permission = Permission.Full;
311            } else {
312              var jobPermission = jobPermissionDao.GetByJobAndUserId(job.Id, currentUserId);
313              job.Permission = jobPermission == null ? Permission.NotAllowed : jobPermission.Permission.ToDto();
314            }
315          }
316          return job;
317        });
318      }
319    }
320
321    public IEnumerable<DT.Job> GetJobs() {
322      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
323      var pm = PersistenceManager;
324      using (new PerformanceLogger("GetJobs")) {
325        var jobDao = pm.JobDao;
326        var jobPermissionDao = pm.JobPermissionDao;
327        var taskDao = pm.TaskDao;
328        var currentUserId = UserManager.CurrentUserId;
329        return pm.UseTransaction(() => {
330          var jobs = jobDao.GetAll()
331            .Where(x => x.State == DA.JobState.Online
332                          && (x.OwnerUserId == currentUserId
333                            || x.JobPermissions.Count(y => y.Permission != DA.Permission.NotAllowed
334                              && y.GrantedUserId == currentUserId) > 0)
335                          )
336            .Select(x => x.ToDto())
337            .ToList();
338          var statistics = taskDao.GetAll()
339              .Where(x => jobs.Select(y => y.Id).Contains(x.JobId))
340              .GroupBy(x => x.JobId)
341              .Select(x => new {
342                x.Key,
343                TotalCount = x.Count(),
344                CalculatingCount = x.Count(y => y.State == DA.TaskState.Calculating),
345                FinishedCount = x.Count(y => CompletedStates.Contains(y.State))
346              })
347              .ToList();
348          foreach (var job in jobs) {
349            var statistic = statistics.FirstOrDefault(x => x.Key == job.Id);
350            if (statistic != null) {
351              job.JobCount = statistic.TotalCount;
352              job.CalculatingCount = statistic.CalculatingCount;
353              job.FinishedCount = statistic.FinishedCount;
354            }
355            job.OwnerUsername = UserManager.GetUserNameById(job.OwnerUserId);
356            if (currentUserId == job.OwnerUserId) {
357              job.Permission = Permission.Full;
358            } else {
359              var jobPermission = jobPermissionDao.GetByJobAndUserId(job.Id, currentUserId);
360              job.Permission = jobPermission == null ? Permission.NotAllowed : jobPermission.Permission.ToDto();
361            }
362          }
363          return jobs;
364        });
365      }
366    }
367
368    public Guid AddJob(DT.Job jobDto, IEnumerable<Guid> resourceIds) {
369      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
370      // check user - project
371      AuthorizationManager.AuthorizeUserForProjectUse(UserManager.CurrentUserId, jobDto.ProjectId);
372      // check project - resources
373      AuthorizationManager.AuthorizeProjectForResourcesUse(jobDto.ProjectId, resourceIds);
374      var pm = PersistenceManager;
375      using (new PerformanceLogger("AddJob")) {
376        var jobDao = pm.JobDao;
377        var userPriorityDao = pm.UserPriorityDao;
378
379        return pm.UseTransaction(() => {
380          var newJob = jobDto.ToEntity();
381          newJob.OwnerUserId = UserManager.CurrentUserId;
382          newJob.DateCreated = DateTime.Now;
383
384          // add resource assignments
385          if (resourceIds != null && resourceIds.Any()) {           
386            newJob.AssignedJobResources.AddRange(resourceIds.Select(
387              x => new DA.AssignedJobResource {
388                ResourceId = x
389              }));
390          }
391
392          var job = jobDao.Save(newJob);
393          if (userPriorityDao.GetById(newJob.OwnerUserId) == null) {
394            userPriorityDao.Save(new DA.UserPriority {
395              UserId = newJob.OwnerUserId,
396              DateEnqueued = newJob.DateCreated
397            });
398          }
399          pm.SubmitChanges();
400          return job.JobId;
401        });
402      }
403    }
404
405    public void UpdateJob(DT.Job jobDto, IEnumerable<Guid> resourceIds) {
406      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
407      AuthorizationManager.AuthorizeForJob(jobDto.Id, DT.Permission.Full);
408      // check user - project permission
409      AuthorizationManager.AuthorizeUserForProjectUse(UserManager.CurrentUserId, jobDto.ProjectId);
410      // check project - resources permission
411      AuthorizationManager.AuthorizeProjectForResourcesUse(jobDto.ProjectId, resourceIds);
412
413      var pm = PersistenceManager;
414      using (new PerformanceLogger("UpdateJob")) {
415        bool exists = true;
416        var jobDao = pm.JobDao;
417        pm.UseTransaction(() => {
418          var job = jobDao.GetById(jobDto.Id);
419          if (job == null) {
420            exists = false;
421            job = new DA.Job();
422          }
423          jobDto.CopyToEntity(job);
424
425          if (!exists) {
426            // add resource assignments
427            if (resourceIds != null && resourceIds.Any()) {
428              job.AssignedJobResources.AddRange(resourceIds.Select(
429                x => new DA.AssignedJobResource {
430                  ResourceId = x
431              }));
432            }
433            jobDao.Save(job);
434          } else if(resourceIds != null) {
435            var addedJobResourceIds = resourceIds.Except(job.AssignedJobResources.Select(x => x.ResourceId));
436            var removedJobResourceIds = job.AssignedJobResources
437              .Select(x => x.ResourceId)
438              .Except(resourceIds)
439              .ToArray();
440           
441            // remove resource assignments
442            foreach(var rid in removedJobResourceIds) {
443              var ajr = job.AssignedJobResources.Where(x => x.ResourceId == rid).SingleOrDefault();
444              if (ajr != null) job.AssignedJobResources.Remove(ajr);
445            }
446
447            // add resource assignments
448            job.AssignedJobResources.AddRange(addedJobResourceIds.Select(
449              x => new DA.AssignedJobResource {
450                ResourceId = x
451              }));
452          }
453          pm.SubmitChanges();
454        });
455      }
456    }
457
458    public void UpdateJobState(Guid jobId, DT.JobState jobState) {
459      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
460      AuthorizationManager.AuthorizeForJob(jobId, DT.Permission.Full);
461      var pm = PersistenceManager;
462      using (new PerformanceLogger("UpdateJobState")) {
463        var jobDao = pm.JobDao;
464        pm.UseTransaction(() => {
465          var job = jobDao.GetById(jobId);
466          if(job != null) {
467            var jobStateEntity = jobState.ToEntity();
468            // note: allow solely state changes from "Online" to "StatisticsPending"
469            // and from "StatisticsPending" to "DeletionPending"
470            if (job.State == DA.JobState.Online && jobStateEntity == DA.JobState.StatisticsPending) {
471              job.State = jobStateEntity;
472              foreach(var task in job.Tasks
473              .Where(x => x.State == DA.TaskState.Waiting
474                || x.State == DA.TaskState.Paused
475                || x.State == DA.TaskState.Offline)) {
476                task.State = DA.TaskState.Aborted;
477              }
478              pm.SubmitChanges();
479            } else if(job.State == DA.JobState.StatisticsPending && jobStateEntity == DA.JobState.DeletionPending) {
480              job.State = jobStateEntity;
481              pm.SubmitChanges();
482            }
483          }
484        });
485      }
486    }
487
488    public IEnumerable<DT.AssignedJobResource> GetAssignedResourcesForJob(Guid jobId) {
489      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
490      AuthorizationManager.AuthorizeForJob(jobId, DT.Permission.Full);
491      var pm = PersistenceManager;
492      var assignedJobResourceDao = pm.AssignedJobResourceDao;
493      using (new PerformanceLogger("GetAssignedResourcesForProject")) {
494        return pm.UseTransaction(() =>
495          assignedJobResourceDao.GetByJobId(jobId)
496          .Select(x => x.ToDto())
497          .ToList()
498        );
499      }
500    }
501    #endregion
502
503    #region JobPermission Methods
504    public void GrantPermission(Guid jobId, Guid grantedUserId, DT.Permission permission) {
505      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
506      AuthorizationManager.AuthorizeForJob(jobId, Permission.Full);
507      var pm = PersistenceManager;
508      using (new PerformanceLogger("GrantPermission")) {
509        var jobPermissionDao = pm.JobPermissionDao;
510        var currentUserId = UserManager.CurrentUserId;
511        pm.UseTransaction(() => {
512          jobPermissionDao.SetJobPermission(jobId, currentUserId, grantedUserId, permission.ToEntity());
513          pm.SubmitChanges();
514        });
515      }
516    }
517
518    public void RevokePermission(Guid jobId, Guid grantedUserId) {
519      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
520      AuthorizationManager.AuthorizeForJob(jobId, Permission.Full);
521      var pm = PersistenceManager;
522      using (new PerformanceLogger("RevokePermission")) {
523        var jobPermissionDao = pm.JobPermissionDao;
524        var currentUserId = UserManager.CurrentUserId;
525        pm.UseTransaction(() => {
526          jobPermissionDao.SetJobPermission(jobId, currentUserId, grantedUserId, DA.Permission.NotAllowed);
527          pm.SubmitChanges();
528        });
529      }
530    }
531
532    public IEnumerable<JobPermission> GetJobPermissions(Guid jobId) {
533      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
534      AuthorizationManager.AuthorizeForJob(jobId, Permission.Full);
535      var pm = PersistenceManager;
536      using (new PerformanceLogger("GetJobPermissions")) {
537        var jobPermissionDao = pm.JobPermissionDao;
538        return pm.UseTransaction(() => jobPermissionDao.GetByJobId(jobId)
539          .Select(x => x.ToDto())
540          .ToList()
541        );
542      }
543    }
544
545    // BackwardsCompatibility3.3
546    #region Backwards compatible code, remove with 3.4
547    public bool IsAllowedPrivileged() {
548      return true;
549    }
550    #endregion
551    #endregion
552
553    #region Login Methods
554    public void Hello(DT.Slave slaveInfo) {
555      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Slave);
556      if (UserManager.CurrentUser.UserName != "hiveslave") {
557        slaveInfo.OwnerUserId = UserManager.CurrentUserId;
558      }
559      var pm = PersistenceManager;
560      using (new PerformanceLogger("Hello")) {
561        var slaveDao = pm.SlaveDao;
562        pm.UseTransaction(() => {
563          var slave = slaveDao.GetById(slaveInfo.Id);
564          if (slave == null) {
565            slaveDao.Save(slaveInfo.ToEntity());
566          } else {
567            bool oldIsAllowedToCalculate = slave.IsAllowedToCalculate;
568            Guid? oldParentResourceId = slave.ParentResourceId;
569            slaveInfo.CopyToEntity(slave);
570            slave.IsAllowedToCalculate = oldIsAllowedToCalculate;
571            slave.ParentResourceId = oldParentResourceId;
572            slave.LastHeartbeat = DateTime.Now;
573            slave.SlaveState = DA.SlaveState.Idle;
574          }
575          pm.SubmitChanges();
576        });
577      }
578    }
579
580    public void GoodBye(Guid slaveId) {
581      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Slave);
582      var pm = PersistenceManager;
583      using (new PerformanceLogger("GoodBye")) {
584        var slaveDao = pm.SlaveDao;
585        pm.UseTransaction(() => {
586          var slave = slaveDao.GetById(slaveId);
587          if (slave != null) {
588            slave.SlaveState = DA.SlaveState.Offline;
589            pm.SubmitChanges();
590          }
591        });
592      }
593    }
594    #endregion
595
596    #region Heartbeat Methods
597    public List<MessageContainer> Heartbeat(DT.Heartbeat heartbeat) {
598      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Slave);
599      List<MessageContainer> result = new List<MessageContainer>();
600      try {
601        using (new PerformanceLogger("ProcessHeartbeat")) {
602          result = HeartbeatManager.ProcessHeartbeat(heartbeat);
603        }
604      } catch (Exception ex) {
605        DA.LogFactory.GetLogger(this.GetType().Namespace).Log(string.Format("Exception processing Heartbeat: {0}", ex));
606      }
607      if (HeuristicLab.Services.Hive.Properties.Settings.Default.TriggerEventManagerInHeartbeat) {
608        TriggerEventManager(false);
609      }
610      return result;
611    }
612    #endregion
613
614    #region Plugin Methods
615    public DT.Plugin GetPlugin(Guid pluginId) {
616      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
617      var pm = PersistenceManager;
618      using (new PerformanceLogger("GetPlugin")) {
619        var pluginDao = pm.PluginDao;
620        return pm.UseTransaction(() => pluginDao.GetById(pluginId).ToDto());
621      }
622    }
623
624    public Guid AddPlugin(DT.Plugin plugin, List<DT.PluginData> pluginData) {
625      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
626      var pm = PersistenceManager;
627      using (new PerformanceLogger("AddPlugin")) {
628        var pluginDao = pm.PluginDao;
629        plugin.UserId = UserManager.CurrentUserId;
630        plugin.DateCreated = DateTime.Now;
631        return pm.UseTransaction(() => {
632          var pluginEntity = pluginDao.GetByHash(plugin.Hash).SingleOrDefault();
633          if (pluginEntity != null) {
634            throw new FaultException<PluginAlreadyExistsFault>(new PluginAlreadyExistsFault(pluginEntity.PluginId));
635          }
636          pluginEntity = plugin.ToEntity();
637          foreach (var data in pluginData) {
638            data.PluginId = default(Guid); // real id will be assigned from linq2sql
639            pluginEntity.PluginData.Add(data.ToEntity());
640          }
641          pluginDao.Save(pluginEntity);
642          pm.SubmitChanges();
643          return pluginEntity.PluginId;
644        });
645      }
646    }
647
648    public IEnumerable<DT.Plugin> GetPlugins() {
649      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
650      var pm = PersistenceManager;
651      using (new PerformanceLogger("GetPlugins")) {
652        var pluginDao = pm.PluginDao;
653        return pm.UseTransaction(() => pluginDao.GetAll()
654          .Where(x => x.Hash != null)
655          .Select(x => x.ToDto())
656          .ToList()
657        );
658      }
659    }
660
661    public IEnumerable<DT.PluginData> GetPluginDatas(List<Guid> pluginIds) {
662      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
663      var pm = PersistenceManager;
664      using (new PerformanceLogger("GetPluginDatas")) {
665        var pluginDataDao = pm.PluginDataDao;
666        return pm.UseTransaction(() => pluginDataDao.GetAll()
667            .Where(x => pluginIds.Contains(x.PluginId))
668            .Select(x => x.ToDto())
669            .ToList()
670        );
671      }
672    }
673    #endregion
674
675    #region Project Methods
676    public Guid AddProject(DT.Project projectDto) {
677      if (projectDto == null || projectDto.Id != Guid.Empty) return Guid.Empty;
678      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
679      // check if current (non-admin) user is owner of one of projectDto's-parents
680      if (!RoleVerifier.IsInRole(HiveRoles.Administrator)) {
681        if(projectDto.ParentProjectId.HasValue) {
682          AuthorizationManager.AuthorizeForProjectAdministration(projectDto.ParentProjectId.Value, false);
683        } else {
684          throw new SecurityException(NOT_AUTHORIZED_USERPROJECT);
685        }
686      }
687     
688      var pm = PersistenceManager;
689      using (new PerformanceLogger("AddProject")) {
690        var projectDao = pm.ProjectDao;
691
692        return pm.UseTransaction(() => {
693          var project = projectDao.Save(projectDto.ToEntity());
694          project.ProjectPermissions.Clear();
695          project.ProjectPermissions.Add(new DA.ProjectPermission {
696            GrantedUserId = project.OwnerUserId,
697            GrantedByUserId = UserManager.CurrentUserId
698          });
699
700          pm.SubmitChanges();
701          return project.ProjectId;
702        });
703      }
704    }
705
706    public void UpdateProject(DT.Project projectDto) {
707      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
708      // check if current (non-admin) user is owner of the project or the projectDto's-parents
709      if (!RoleVerifier.IsInRole(HiveRoles.Administrator)) {
710        AuthorizationManager.AuthorizeForProjectAdministration(projectDto.Id, false);
711      }
712
713      var pm = PersistenceManager;
714      using (new PerformanceLogger("UpdateProject")) {
715        var projectDao = pm.ProjectDao;
716        var assignedJobResourceDao = pm.AssignedJobResourceDao;
717        pm.UseTransaction(() => {
718          var project = projectDao.GetById(projectDto.Id);
719          if (project != null) { // update existent
720            var formerOwnerId = project.OwnerUserId;
721            projectDto.CopyToEntity(project);
722
723            // if owner has changed...
724            if(formerOwnerId != projectDto.OwnerUserId) {
725              var formerPermissionItem = project.ProjectPermissions.Where(x => x.GrantedUserId == formerOwnerId).FirstOrDefault();
726              if (formerPermissionItem != null) {
727                // remove permissions
728                project.ProjectPermissions.Remove(formerPermissionItem);
729                // remove jobs if former owner is no member of a still permitted group
730                var ugt = GetUserGroupTree();
731                var permittedGuids = new HashSet<Guid>(); // User- and Group-Guids
732                // get all member-Guids of all still permitted groups
733                foreach (var item in project.ProjectPermissions) {
734                  permittedGuids.Add(item.GrantedUserId);
735                  if(ugt.ContainsKey(item.GrantedUserId)) {
736                    ugt[item.GrantedUserId].ToList().ForEach(x => permittedGuids.Add(x));
737                  }
738
739                  // check if former owner Guid is in Member-Guids
740                  // if yes: do nothing, if not do:
741                  if (!permittedGuids.Contains(formerOwnerId)) {
742                    assignedJobResourceDao.DeleteByProjectIdAndUserIds(project.ProjectId, new List<Guid> { formerOwnerId });
743                  }
744                }
745              }
746              project.ProjectPermissions.Add(new DA.ProjectPermission {
747                GrantedUserId = projectDto.OwnerUserId,
748                GrantedByUserId = UserManager.CurrentUserId
749              });
750            }
751
752          } else { // save new
753            var newProject = projectDao.Save(projectDto.ToEntity());
754            newProject.ProjectPermissions.Clear();
755            newProject.ProjectPermissions.Add(new DA.ProjectPermission {
756              GrantedUserId = projectDto.OwnerUserId,
757              GrantedByUserId = UserManager.CurrentUserId
758            });
759          }
760          pm.SubmitChanges();
761        });
762      }
763    }
764
765    public void DeleteProject(Guid projectId) {
766      if (projectId == Guid.Empty) return;
767      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
768      // check if current (non-admin) user is owner of one of the projectDto's-parents
769      if (!RoleVerifier.IsInRole(HiveRoles.Administrator)) {
770        AuthorizationManager.AuthorizeForProjectAdministration(projectId, true);
771      }
772
773      var pm = PersistenceManager;
774      using (new PerformanceLogger("DeleteProject")) {
775        var projectDao = pm.ProjectDao;
776        var assignedJobResourceDao = pm.AssignedJobResourceDao;
777        pm.UseTransaction(() => {
778          var projectIds = new HashSet<Guid> { projectId };
779          projectIds.Union(projectDao.GetChildProjectIdsById(projectId));
780
781          assignedJobResourceDao.DeleteByProjectIds(projectIds);
782          projectDao.DeleteByIds(projectIds);
783          pm.SubmitChanges();
784        });
785      }
786    }
787
788    // query granted project for use (i.e. to calculate on)
789    public DT.Project GetProject(Guid projectId) {
790      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
791      var pm = PersistenceManager;
792      using (new PerformanceLogger("GetProject")) {
793        var projectDao = pm.ProjectDao;
794        var currentUserId = UserManager.CurrentUserId;
795        var userAndGroupIds = new List<Guid> { currentUserId };
796        userAndGroupIds.AddRange(UserManager.GetUserGroupIdsOfUser(currentUserId));
797        return pm.UseTransaction(() => {
798          return projectDao.GetUsageGrantedProjectsForUser(userAndGroupIds)
799          .Where(x => x.ProjectId == projectId)
800          .Select(x => x.ToDto())
801          .SingleOrDefault();
802        });
803      }
804    }
805
806    // query granted projects for use (i.e. to calculate on)
807    public IEnumerable<DT.Project> GetProjects() {
808      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
809      var pm = PersistenceManager;
810      using (new PerformanceLogger("GetProjects")) {
811        var projectDao = pm.ProjectDao;
812        var currentUserId = UserManager.CurrentUserId;
813        var userAndGroupIds = new List<Guid> { currentUserId };
814        userAndGroupIds.AddRange(UserManager.GetUserGroupIdsOfUser(currentUserId));
815        return pm.UseTransaction(() => {
816          return projectDao.GetUsageGrantedProjectsForUser(userAndGroupIds)
817            .Select(x => x.ToDto()).ToList();
818        });
819      }
820    }
821
822    public IEnumerable<DT.Project> GetProjectsForAdministration() {
823      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
824      bool isAdministrator = RoleVerifier.IsInRole(HiveRoles.Administrator);
825      var pm = PersistenceManager;
826      using (new PerformanceLogger("GetProjectsForAdministration")) {
827        var projectDao = pm.ProjectDao;
828       
829        return pm.UseTransaction(() => {
830          if(isAdministrator) {
831            return projectDao.GetAll().Select(x => x.ToDto()).ToList();
832          } else {
833            var currentUserId = UserManager.CurrentUserId;
834            return projectDao.GetAdministrationGrantedProjectsForUser(currentUserId)
835              .Select(x => x.ToDto()).ToList();
836
837          }
838        });
839      }
840    }
841
842    public IDictionary<Guid, HashSet<Guid>> GetProjectGenealogy() {
843      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
844      var pm = PersistenceManager;
845      using(new PerformanceLogger("GetProjectGenealogy")) {
846        var projectDao = pm.ProjectDao;
847        var projectAncestors = new Dictionary<Guid, HashSet<Guid>>();
848        return pm.UseTransaction(() => {
849          var projects = projectDao.GetAll().ToList();
850          projects.ForEach(p => projectAncestors.Add(p.ProjectId, new HashSet<Guid>()));
851          foreach (var p in projects) {
852            var parentProject = p.ParentProject;
853            while(parentProject != null) {
854              projectAncestors[p.ProjectId].Add(parentProject.ProjectId);
855              parentProject = parentProject.ParentProject;
856            }
857          }
858          return projectAncestors;
859        });
860      }
861    }
862    #endregion
863
864    #region ProjectPermission Methods
865    public void SaveProjectPermissions(Guid projectId, List<Guid> grantedUserIds, bool reassign, bool cascading, bool reassignCascading) {
866      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
867      if (projectId == null || grantedUserIds == null) return;
868      AuthorizationManager.AuthorizeForProjectAdministration(projectId, false);
869      var pm = PersistenceManager;
870      using (new PerformanceLogger("SaveProjectPermissions")) {
871        var projectDao = pm.ProjectDao;
872        var projectPermissionDao = pm.ProjectPermissionDao;
873        var assignedJobResourceDao = pm.AssignedJobResourceDao;
874
875        pm.UseTransaction(() => {
876          var project = projectDao.GetById(projectId);
877          if (project == null) return;
878          var projectPermissions = project.ProjectPermissions.Select(x => x.GrantedUserId).ToArray();
879          //var addedPermissions = grantedUserIds.Except(projectPermissions);
880          var removedPermissions = projectPermissions.Except(grantedUserIds);
881
882          // remove job assignments and project permissions
883          if (reassign) {
884            assignedJobResourceDao.DeleteByProjectId(project.ProjectId);
885            project.ProjectPermissions.Clear();
886          } else {
887
888            var ugt = GetUserGroupTree();
889            var permittedGuids = new HashSet<Guid>(); // User- and Group-Guids
890            var notpermittedGuids = new HashSet<Guid>();
891
892            // remove job assignments:
893            // (1) get all member-Guids of all still or fresh permitted user/groups
894            foreach (var item in grantedUserIds) {
895              permittedGuids.Add(item);
896              if (ugt.ContainsKey(item)) {
897                ugt[item].ToList().ForEach(x => permittedGuids.Add(x));
898              }
899            }
900
901            // (2) get all member-Guids of users and groups in removedPermissions
902            foreach (var item in removedPermissions) {
903              notpermittedGuids.Add(item);
904              if (ugt.ContainsKey(item)) {
905                ugt[item].ToList().ForEach(x => notpermittedGuids.Add(x));
906              }
907            }
908
909            // (3) get all Guids which are in removedPermissions but not in grantedUserIds
910            var definatelyNotPermittedGuids = notpermittedGuids.Except(permittedGuids);
911
912            // (4) delete jobs of those
913            assignedJobResourceDao.DeleteByProjectIdAndUserIds(project.ProjectId, definatelyNotPermittedGuids);
914
915
916            // remove project permissions
917            foreach (var item in project.ProjectPermissions
918              .Where(x => removedPermissions.Contains(x.GrantedUserId))
919              .ToList()) {
920              project.ProjectPermissions.Remove(item);
921            }
922          }
923          pm.SubmitChanges();
924
925          // add project permissions
926          foreach (var id in grantedUserIds) {
927            if(project.ProjectPermissions.All(x => x.GrantedUserId != id)) {
928              project.ProjectPermissions.Add(new DA.ProjectPermission {
929                GrantedUserId = id,
930                GrantedByUserId = UserManager.CurrentUserId
931              });
932            }
933          }
934          pm.SubmitChanges();
935
936          if (cascading) {
937            var childProjects = projectDao.GetChildProjectsById(projectId).ToList();
938            var childProjectIds = childProjects.Select(x => x.ProjectId).ToList();
939
940            // remove job assignments
941            if (reassignCascading) {
942              assignedJobResourceDao.DeleteByProjectIds(childProjectIds);
943            } else {
944              assignedJobResourceDao.DeleteByProjectIdsAndUserIds(childProjectIds, removedPermissions);
945            }
946
947            foreach(var p in childProjects) {
948              // remove project permissions
949              if(reassignCascading) {
950                p.ProjectPermissions.Clear();
951              } else {
952                foreach(var item in p.ProjectPermissions
953                  .Where(x => removedPermissions.Contains(x.GrantedUserId))
954                  .ToList()) {
955                  p.ProjectPermissions.Remove(item);
956                }
957              }
958              pm.SubmitChanges();
959
960              // add project permissions
961              foreach (var id in grantedUserIds) {
962                if (p.ProjectPermissions.All(x => x.GrantedUserId != id)) {
963                  p.ProjectPermissions.Add(new DA.ProjectPermission {
964                    GrantedUserId = id,
965                    GrantedByUserId = UserManager.CurrentUserId
966                  });
967                }
968              }
969            }
970          }
971          pm.SubmitChanges();
972        });
973      }
974    }
975
976    //private void GrantProjectPermissions(Guid projectId, List<Guid> grantedUserIds, bool cascading) {
977    //  throw new NotImplementedException();
978    //}
979
980    //private void RevokeProjectPermissions(Guid projectId, List<Guid> grantedUserIds, bool cascading) {
981    //  RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
982    //  if (projectId == null || grantedUserIds == null || !grantedUserIds.Any()) return;
983    //  AuthorizationManager.AuthorizeForProjectAdministration(projectId, false);
984    //  var pm = PersistenceManager;
985    //  using (new PerformanceLogger("RevokeProjectPermissions")) {
986    //    var projectPermissionDao = pm.ProjectPermissionDao;
987    //    var projectDao = pm.ProjectDao;
988    //    var assignedJobResourceDao = pm.AssignedJobResourceDao;
989    //    pm.UseTransaction(() => {
990    //      if (cascading) {
991    //        var childProjectIds = projectDao.GetChildProjectIdsById(projectId).ToList();
992    //        projectPermissionDao.DeleteByProjectIdsAndGrantedUserIds(childProjectIds, grantedUserIds);
993    //        assignedJobResourceDao.DeleteByProjectIdsAndUserIds(childProjectIds, grantedUserIds);
994    //      }
995    //      projectPermissionDao.DeleteByProjectIdAndGrantedUserIds(projectId, grantedUserIds);
996    //      assignedJobResourceDao.DeleteByProjectIdAndUserIds(projectId, grantedUserIds);
997    //      pm.SubmitChanges();
998    //    });
999    //  }
1000    //}
1001
1002    public IEnumerable<DT.ProjectPermission> GetProjectPermissions(Guid projectId) {
1003      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1004      AuthorizationManager.AuthorizeForProjectAdministration(projectId, false);
1005      var pm = PersistenceManager;
1006      using (new PerformanceLogger("GetProjectPermissions")) {
1007        var projectPermissionDao = pm.ProjectPermissionDao;
1008        return pm.UseTransaction(() => projectPermissionDao.GetByProjectId(projectId)
1009          .Select(x => x.ToDto())
1010          .ToList()
1011        );
1012      }
1013    }
1014    #endregion
1015
1016    #region AssignedProjectResource Methods
1017    // basic: remove and add assignments (resourceIds) to projectId and its depending jobs
1018    // reassign: clear all assignments from project and its depending jobs, before adding new ones (resourceIds)
1019    // cascading: "basic" mode for child-projects
1020    // reassignCascading: "reassign" mode for child-projects
1021    public void SaveProjectResourceAssignments(Guid projectId, List<Guid> resourceIds, bool reassign, bool cascading, bool reassignCascading) {
1022      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1023      if (projectId == null || resourceIds == null) return;
1024      AuthorizationManager.AuthorizeForProjectResourceAdministration(projectId, resourceIds);
1025      var pm = PersistenceManager;
1026      using (new PerformanceLogger("SaveProjectResourceAssignments")) {
1027        var projectDao = pm.ProjectDao;
1028        var assignedProjectResourceDao = pm.AssignedProjectResourceDao;
1029        var assignedJobResourceDao = pm.AssignedJobResourceDao;
1030        pm.UseTransaction(() => {
1031          var project = projectDao.GetById(projectId);
1032          var assignedResources = project.AssignedProjectResources.Select(x => x.ResourceId).ToArray();
1033          var removedAssignments = assignedResources.Except(resourceIds);
1034
1035          // remove job and project assignments
1036          if (reassign) {
1037            assignedJobResourceDao.DeleteByProjectId(project.ProjectId);
1038            project.AssignedProjectResources.Clear();
1039          } else {
1040            assignedJobResourceDao.DeleteByProjectIdAndResourceIds(projectId, removedAssignments);
1041            foreach (var item in project.AssignedProjectResources
1042              .Where(x => removedAssignments.Contains(x.ResourceId))
1043              .ToList()) {
1044              project.AssignedProjectResources.Remove(item);
1045            }
1046          }
1047          pm.SubmitChanges();
1048
1049          // add project assignments
1050          foreach (var id in resourceIds) {
1051            if (project.AssignedProjectResources.All(x => x.ResourceId != id)) {
1052              project.AssignedProjectResources.Add(new DA.AssignedProjectResource {
1053                ResourceId = id
1054              });
1055            }
1056          }
1057          pm.SubmitChanges();
1058
1059          if (cascading) {
1060            var childProjects = projectDao.GetChildProjectsById(projectId).ToList();
1061
1062            // remove job assignments
1063            if (reassignCascading) {
1064              assignedJobResourceDao.DeleteByProjectIds(childProjects.Select(x => x.ProjectId).ToList());
1065            } else {
1066              var childProjectIds = childProjects.Select(x => x.ProjectId).ToList();
1067              assignedJobResourceDao.DeleteByProjectIdsAndResourceIds(childProjectIds, removedAssignments);
1068            }
1069            foreach (var p in childProjects) {
1070              // remove project assignments
1071              if (reassignCascading) {
1072                p.AssignedProjectResources.Clear();
1073              } else {
1074                foreach (var item in p.AssignedProjectResources
1075                  .Where(x => removedAssignments.Contains(x.ResourceId))
1076                  .ToList()) {
1077                  p.AssignedProjectResources.Remove(item);
1078                }
1079              }
1080              pm.SubmitChanges();
1081
1082              // add project assignments
1083              foreach (var id in resourceIds) {
1084                if(p.AssignedProjectResources.All(x => x.ResourceId != id)) {
1085                  p.AssignedProjectResources.Add(new DA.AssignedProjectResource {
1086                    ResourceId = id
1087                  });
1088                }
1089              }
1090            }
1091          }
1092          pm.SubmitChanges();
1093        });
1094      }
1095    }
1096
1097    //private void AssignProjectResources(Guid projectId, List<Guid> resourceIds, bool cascading) {
1098    //  throw new NotImplementedException();
1099    //}
1100
1101    //private void UnassignProjectResources(Guid projectId, List<Guid> resourceIds, bool cascading) {
1102    //  RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1103    //  if (projectId == null || resourceIds == null || !resourceIds.Any()) return;
1104    //  AuthorizationManager.AuthorizeForProjectResourceAdministration(projectId, resourceIds);
1105    //  var pm = PersistenceManager;
1106    //  using (new PerformanceLogger("UnassignProjectResources")) {
1107    //    var assignedProjectResourceDao = pm.AssignedProjectResourceDao;
1108    //    var assignedJobResourceDao = pm.AssignedJobResourceDao;
1109    //    var projectDao = pm.ProjectDao;
1110    //    pm.UseTransaction(() => {
1111    //      if (cascading) {
1112    //        var childProjectIds = projectDao.GetChildProjectIdsById(projectId).ToList();
1113    //        assignedProjectResourceDao.DeleteByProjectIdsAndResourceIds(childProjectIds, resourceIds);
1114    //        assignedJobResourceDao.DeleteByProjectIdsAndResourceIds(childProjectIds, resourceIds);
1115    //      }
1116    //      assignedProjectResourceDao.DeleteByProjectIdAndResourceIds(projectId, resourceIds);
1117    //      assignedJobResourceDao.DeleteByProjectIdAndResourceIds(projectId, resourceIds);
1118    //      pm.SubmitChanges();
1119    //    });
1120    //  }
1121    //}
1122
1123    public IEnumerable<DT.AssignedProjectResource> GetAssignedResourcesForProject(Guid projectId) {
1124      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1125      AuthorizationManager.AuthorizeUserForProjectUse(UserManager.CurrentUserId, projectId);
1126      var pm = PersistenceManager;
1127      using (new PerformanceLogger("GetAssignedResourcesForProject")) {
1128        var assignedProjectResourceDao = pm.AssignedProjectResourceDao;
1129        return pm.UseTransaction(() => assignedProjectResourceDao.GetByProjectId(projectId)
1130          .Select(x => x.ToDto())
1131          .ToList()
1132        );
1133      }
1134    }
1135
1136    public IEnumerable<DT.AssignedProjectResource> GetAssignedResourcesForProjectAdministration(Guid projectId) {
1137      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1138      AuthorizationManager.AuthorizeForProjectAdministration(projectId, false);
1139      var pm = PersistenceManager;
1140      using (new PerformanceLogger("GetAssignedResourcesForProject")) {
1141        var assignedProjectResourceDao = pm.AssignedProjectResourceDao;
1142        return pm.UseTransaction(() => assignedProjectResourceDao.GetByProjectId(projectId)
1143          .Select(x => x.ToDto())
1144          .ToList()
1145        );
1146      }
1147    }
1148
1149    public IEnumerable<DT.AssignedProjectResource> GetAssignedResourcesForProjectsAdministration(IEnumerable<Guid> projectIds) {
1150      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1151      foreach(var id in projectIds)
1152        AuthorizationManager.AuthorizeForProjectAdministration(id, false);
1153
1154      var pm = PersistenceManager;
1155      using (new PerformanceLogger("GetAssignedResourcesForProject")) {
1156        var assignedProjectResourceDao = pm.AssignedProjectResourceDao;
1157        var assignments = new List<DT.AssignedProjectResource>();
1158        pm.UseTransaction(() => {
1159          foreach (var id in projectIds) {
1160            assignments.AddRange(assignedProjectResourceDao.GetByProjectId(id)
1161              .Select(x => x.ToDto()));
1162          }
1163        });
1164        return assignments.Distinct();
1165      }
1166    }
1167
1168    #endregion
1169
1170    #region Slave Methods
1171    public Guid AddSlave(DT.Slave slaveDto) {
1172      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
1173      var pm = PersistenceManager;
1174      using (new PerformanceLogger("AddSlave")) {
1175        var slaveDao = pm.SlaveDao;
1176        return pm.UseTransaction(() => {
1177          var slave = slaveDao.Save(slaveDto.ToEntity());
1178          pm.SubmitChanges();
1179          return slave.ResourceId;
1180        });
1181      }
1182    }
1183
1184    public Guid AddSlaveGroup(DT.SlaveGroup slaveGroupDto) {
1185      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
1186      var pm = PersistenceManager;
1187      using (new PerformanceLogger("AddSlaveGroup")) {
1188        var slaveGroupDao = pm.SlaveGroupDao;
1189        return pm.UseTransaction(() => {
1190          if (slaveGroupDto.Id == Guid.Empty) {
1191            slaveGroupDto.Id = Guid.NewGuid();
1192          }
1193          var slaveGroup = slaveGroupDao.Save(slaveGroupDto.ToEntity());
1194          pm.SubmitChanges();
1195          return slaveGroup.ResourceId;
1196        });
1197      }
1198    }
1199
1200    public DT.Slave GetSlave(Guid slaveId) {
1201      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
1202      var pm = PersistenceManager;
1203      using (new PerformanceLogger("GetSlave")) {
1204        var slaveDao = pm.SlaveDao;
1205        return pm.UseTransaction(() => slaveDao.GetById(slaveId).ToDto());
1206      }
1207    }
1208
1209    // query granted slaves for use (i.e. to calculate on)
1210    public IEnumerable<DT.Slave> GetSlaves() {
1211      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1212      var pm = PersistenceManager;
1213      using (new PerformanceLogger("GetSlaves")) {
1214        var slaveDao = pm.SlaveDao;
1215        var projectDao = pm.ProjectDao;
1216        var assignedProjectResourceDao = pm.AssignedProjectResourceDao;
1217
1218        // collect user information
1219        var currentUserId = UserManager.CurrentUserId;
1220        var userAndGroupIds = new List<Guid> { currentUserId };
1221        userAndGroupIds.AddRange(UserManager.GetUserGroupIdsOfUser(currentUserId));
1222
1223        return pm.UseTransaction(() => {
1224          var slaves = slaveDao.GetAll()
1225            .Select(x => x.ToDto())
1226            .ToList();
1227          var grantedProjectIds = projectDao.GetUsageGrantedProjectsForUser(userAndGroupIds)
1228            .Select(x => x.ProjectId)
1229            .ToList();
1230          var grantedResourceIds = assignedProjectResourceDao.GetAllGrantedResourcesByProjectIds(grantedProjectIds)
1231            .Select(x => x.ResourceId)
1232            .ToList();
1233
1234          return slaves
1235            .Where(x => grantedResourceIds.Contains(x.Id))
1236            .ToList();
1237        });
1238      }
1239    }
1240
1241    // query granted slave groups for use (i.e. to calculate on)
1242    public IEnumerable<DT.SlaveGroup> GetSlaveGroups() {
1243      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1244      var pm = PersistenceManager;
1245      using (new PerformanceLogger("GetSlaveGroups")) {
1246        var slaveGroupDao = pm.SlaveGroupDao;
1247        var projectDao = pm.ProjectDao;
1248        var assignedProjectResourceDao = pm.AssignedProjectResourceDao;
1249
1250        // collect user information
1251        var currentUserId = UserManager.CurrentUserId;
1252        var userAndGroupIds = new List<Guid> { currentUserId };
1253        userAndGroupIds.AddRange(UserManager.GetUserGroupIdsOfUser(currentUserId));
1254
1255        return pm.UseTransaction(() => {
1256          var slaveGroups = slaveGroupDao.GetAll()
1257            .Select(x => x.ToDto())
1258            .ToList();
1259          var grantedProjectIds = projectDao.GetUsageGrantedProjectsForUser(userAndGroupIds)
1260            .Select(x => x.ProjectId)
1261            .ToList();
1262          var grantedResourceIds = assignedProjectResourceDao.GetAllGrantedResourcesByProjectIds(grantedProjectIds)
1263            .Select(x => x.ResourceId)
1264            .ToList();
1265
1266          return slaveGroups
1267            .Where(x => grantedResourceIds.Contains(x.Id))
1268            .ToList();
1269        });
1270      }
1271    }
1272
1273    // query granted slaves for resource administration
1274    public IEnumerable<DT.Slave> GetSlavesForAdministration() {
1275      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1276      bool isAdministrator = RoleVerifier.IsInRole(HiveRoles.Administrator);
1277      var pm = PersistenceManager;
1278      using (new PerformanceLogger("GetSlavesForAdministration")) {
1279        var slaveDao = pm.SlaveDao;
1280        var currentUserId = UserManager.CurrentUserId;
1281
1282        if (isAdministrator) {
1283          return pm.UseTransaction(() => {
1284            return slaveDao.GetAll()
1285              .Select(x => x.ToDto())
1286              .ToList();
1287          });
1288        } else {
1289          var slaves = slaveDao.GetAll()
1290            .Select(x => x.ToDto())
1291            .ToList();
1292          var projectDao = pm.ProjectDao;
1293          var assignedProjectResourceDao = pm.AssignedProjectResourceDao;
1294          var projects = projectDao.GetAdministrationGrantedProjectsForUser(currentUserId).ToList();
1295          var resourceIds = assignedProjectResourceDao
1296            .GetAllGrantedResourcesByProjectIds(projects.Select(x => x.ProjectId).ToList())
1297            .Select(x => x.ResourceId)
1298            .ToList();
1299
1300          return slaves
1301            .Where(x => resourceIds.Contains(x.Id))
1302            .ToList();
1303        }
1304      }
1305    }
1306
1307    // query granted slave groups for resource administration
1308    public IEnumerable<DT.SlaveGroup> GetSlaveGroupsForAdministration() {
1309      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1310      bool isAdministrator = RoleVerifier.IsInRole(HiveRoles.Administrator);
1311      var pm = PersistenceManager;
1312      using (new PerformanceLogger("GetSlaveGroupsForAdministration")) {
1313        var slaveGroupDao = pm.SlaveGroupDao;
1314        var currentUserId = UserManager.CurrentUserId;
1315
1316        if (isAdministrator) {
1317          return pm.UseTransaction(() => {
1318            return slaveGroupDao.GetAll()
1319              .Select(x => x.ToDto())
1320              .ToList();
1321          });
1322        } else {
1323          var slaveGroups = slaveGroupDao.GetAll()
1324            .Select(x => x.ToDto())
1325            .ToList();
1326          var projectDao = pm.ProjectDao;
1327          var assignedProjectResourceDao = pm.AssignedProjectResourceDao;
1328          var projects = projectDao.GetAdministrationGrantedProjectsForUser(currentUserId).ToList();
1329          var resourceIds = assignedProjectResourceDao
1330            .GetAllGrantedResourcesByProjectIds(projects.Select(x => x.ProjectId).ToList())
1331            .Select(x => x.ResourceId)
1332            .ToList();
1333
1334          return slaveGroups
1335            .Where(x => resourceIds.Contains(x.Id))
1336            .ToList();
1337        }
1338      }
1339    }
1340
1341    public IDictionary<Guid, HashSet<Guid>> GetResourceGenealogy() {
1342      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1343      var pm = PersistenceManager;
1344      using (new PerformanceLogger("GetResourceGenealogy")) {
1345        var resourceDao = pm.ResourceDao;
1346        var resourceAncestors = new Dictionary<Guid, HashSet<Guid>>();
1347        return pm.UseTransaction(() => {
1348          var resources = resourceDao.GetAll().ToList();
1349          resources.ForEach(r => resourceAncestors.Add(r.ResourceId, new HashSet<Guid>()));
1350         
1351          foreach(var r in resources) {
1352            var parentResource = r.ParentResource;
1353            while(parentResource != null) {
1354              resourceAncestors[r.ResourceId].Add(parentResource.ResourceId);
1355              parentResource = parentResource.ParentResource;
1356            }
1357          }
1358          return resourceAncestors;
1359        });
1360      }
1361    }
1362
1363    public void UpdateSlave(DT.Slave slaveDto) {
1364      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1365      if (slaveDto == null) return;
1366      AuthorizationManager.AuthorizeForResourceAdministration(slaveDto.Id);
1367      var pm = PersistenceManager;
1368      using (new PerformanceLogger("UpdateSlave")) {
1369        var slaveDao = pm.SlaveDao;
1370        pm.UseTransaction(() => {
1371          var slave = slaveDao.GetById(slaveDto.Id);
1372          if (slave != null) {
1373            slaveDto.CopyToEntity(slave);
1374          } else {
1375            slaveDao.Save(slaveDto.ToEntity());
1376          }
1377          pm.SubmitChanges();
1378        });
1379      }
1380    }
1381
1382    public void UpdateSlaveGroup(DT.SlaveGroup slaveGroupDto) {
1383      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1384      if (slaveGroupDto == null) return;
1385      AuthorizationManager.AuthorizeForResourceAdministration(slaveGroupDto.Id);
1386      var pm = PersistenceManager;
1387      using (new PerformanceLogger("UpdateSlaveGroup")) {
1388        var slaveGroupDao = pm.SlaveGroupDao;
1389        pm.UseTransaction(() => {
1390          var slaveGroup = slaveGroupDao.GetById(slaveGroupDto.Id);
1391          if (slaveGroup != null) {
1392            slaveGroupDto.CopyToEntity(slaveGroup);
1393          } else {
1394            slaveGroupDao.Save(slaveGroupDto.ToEntity());
1395          }
1396          pm.SubmitChanges();
1397        });
1398      }
1399    }
1400
1401    public void DeleteSlave(Guid slaveId) {
1402      if (slaveId == Guid.Empty) return;
1403      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1404      AuthorizationManager.AuthorizeForResourceAdministration(slaveId);
1405      var pm = PersistenceManager;
1406      using (new PerformanceLogger("DeleteSlave")) {
1407        var slaveDao = pm.SlaveDao;
1408        pm.UseTransaction(() => {
1409          slaveDao.Delete(slaveId);
1410          pm.SubmitChanges();
1411        });
1412      }
1413    }
1414
1415    public void DeleteSlaveGroup(Guid slaveGroupId) {
1416      if (slaveGroupId == Guid.Empty) return;
1417      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1418      AuthorizationManager.AuthorizeForResourceAdministration(slaveGroupId);
1419      var pm = PersistenceManager;
1420      using (new PerformanceLogger("DeleteSlaveGroup")) {
1421        var resourceDao = pm.ResourceDao;
1422        pm.UseTransaction(() => {
1423          var resourceIds = new HashSet<Guid> { slaveGroupId };
1424          resourceIds.Union(resourceDao.GetChildResourceIdsById(slaveGroupId));
1425          resourceDao.DeleteByIds(resourceIds);
1426          pm.SubmitChanges();
1427        });
1428      }
1429    }
1430
1431    public void AddResourceToGroup(Guid slaveGroupId, Guid resourceId) {
1432      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
1433      var pm = PersistenceManager;
1434      using (new PerformanceLogger("AddResourceToGroup")) {
1435        var resourceDao = pm.ResourceDao;
1436        pm.UseTransaction(() => {
1437          var resource = resourceDao.GetById(resourceId);
1438          resource.ParentResourceId = slaveGroupId;
1439          pm.SubmitChanges();
1440        });
1441      }
1442    }
1443
1444    public void RemoveResourceFromGroup(Guid slaveGroupId, Guid resourceId) {
1445      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
1446      var pm = PersistenceManager;
1447      using (new PerformanceLogger("RemoveResourceFromGroup")) {
1448        var resourceDao = pm.ResourceDao;
1449        pm.UseTransaction(() => {
1450          var resource = resourceDao.GetById(resourceId);
1451          resource.ParentResourceId = null;
1452          pm.SubmitChanges();
1453        });
1454      }
1455    }
1456
1457    public Guid GetResourceId(string resourceName) {
1458      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1459      var pm = PersistenceManager;
1460      using (new PerformanceLogger("GetResourceId")) {
1461        var resourceDao = pm.ResourceDao;
1462        return pm.UseTransaction(() => {
1463          var resource = resourceDao.GetByName(resourceName);
1464          return resource != null ? resource.ResourceId : Guid.Empty;
1465        });
1466      }
1467    }
1468
1469    public void TriggerEventManager(bool force) {
1470      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
1471      // use a serializable transaction here to ensure not two threads execute this simultaniously (mutex-lock would not work since IIS may use multiple AppDomains)
1472      bool cleanup;
1473      var pm = PersistenceManager;
1474      using (new PerformanceLogger("TriggerEventManager")) {
1475        cleanup = false;
1476        var lifecycleDao = pm.LifecycleDao;
1477        pm.UseTransaction(() => {
1478          var lastLifecycle = lifecycleDao.GetLastLifecycle();
1479          DateTime lastCleanup = lastLifecycle != null ? lastLifecycle.LastCleanup : DateTime.MinValue;
1480          if (force || DateTime.Now - lastCleanup > HeuristicLab.Services.Hive.Properties.Settings.Default.CleanupInterval) {
1481            lifecycleDao.UpdateLifecycle();
1482            cleanup = true;
1483            pm.SubmitChanges();
1484          }
1485        }, true);
1486      }
1487      if (cleanup) {
1488        EventManager.Cleanup();
1489      }
1490    }
1491
1492    public int GetNewHeartbeatInterval(Guid slaveId) {
1493      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Slave);
1494      var pm = PersistenceManager;
1495      using (new PerformanceLogger("GetNewHeartbeatInterval")) {
1496        var slaveDao = pm.SlaveDao;
1497        return pm.UseTransaction(() => {
1498          var slave = slaveDao.GetById(slaveId);
1499          if (slave != null) {
1500            return slave.HbInterval;
1501          }
1502          return -1;
1503        });
1504      }
1505    }
1506    #endregion
1507
1508    #region Downtime Methods
1509    public Guid AddDowntime(DT.Downtime downtimeDto) {
1510      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1511      AuthorizationManager.AuthorizeForResourceAdministration(downtimeDto.ResourceId);
1512      var pm = PersistenceManager;
1513      using (new PerformanceLogger("AddDowntime")) {
1514        var downtimeDao = pm.DowntimeDao;
1515        return pm.UseTransaction(() => {
1516          var downtime = downtimeDao.Save(downtimeDto.ToEntity());
1517          pm.SubmitChanges();
1518          return downtime.ResourceId;
1519        });
1520      }
1521    }
1522
1523    public void DeleteDowntime(Guid downtimeId) {
1524      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1525      var pm = PersistenceManager;
1526      using (new PerformanceLogger("DeleteDowntime")) {
1527        var downtimeDao = pm.DowntimeDao;
1528        pm.UseTransaction(() => {
1529          downtimeDao.Delete(downtimeId);
1530          pm.SubmitChanges();
1531        });
1532      }
1533    }
1534
1535    public void UpdateDowntime(DT.Downtime downtimeDto) {
1536      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1537      AuthorizationManager.AuthorizeForResourceAdministration(downtimeDto.ResourceId);
1538      var pm = PersistenceManager;
1539      using (new PerformanceLogger("UpdateDowntime")) {
1540        var downtimeDao = pm.DowntimeDao;
1541        pm.UseTransaction(() => {
1542          var downtime = downtimeDao.GetById(downtimeDto.Id);
1543          if (downtime != null) {
1544            downtimeDto.CopyToEntity(downtime);
1545          } else {
1546            downtimeDao.Save(downtimeDto.ToEntity());
1547          }
1548          pm.SubmitChanges();
1549        });
1550      }
1551    }
1552
1553    public IEnumerable<DT.Downtime> GetDowntimesForResource(Guid resourceId) {
1554      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1555      var pm = PersistenceManager;
1556      using (new PerformanceLogger("GetDowntimesForResource")) {
1557        var downtimeDao = pm.DowntimeDao;
1558        return pm.UseTransaction(() => downtimeDao.GetByResourceId(resourceId)
1559          .Select(x => x.ToDto())
1560          .ToList()
1561        );
1562      }
1563    }
1564    #endregion
1565
1566    #region User Methods
1567    public string GetUsernameByUserId(Guid userId) {
1568      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1569      var user = UserManager.GetUserById(userId);
1570      return user != null ? user.UserName : null;
1571    }
1572
1573    public Guid GetUserIdByUsername(string username) {
1574      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1575      var user = ServiceLocator.Instance.UserManager.GetUserByName(username);
1576      return user != null ? (Guid?)user.ProviderUserKey ?? Guid.Empty : Guid.Empty;
1577    }
1578   
1579    public Dictionary<Guid, HashSet<Guid>> GetUserGroupTree() {
1580      var userGroupTree = new Dictionary<Guid, HashSet<Guid>>();
1581      var userGroupMapping = UserManager.GetUserGroupMapping();
1582
1583      foreach(var ugm in userGroupMapping) {
1584        if (ugm.Parent == null || ugm.Child == null) continue;
1585
1586        if (!userGroupTree.ContainsKey(ugm.Parent)) {
1587          userGroupTree.Add(ugm.Parent, new HashSet<Guid>());
1588        }
1589        userGroupTree[ugm.Parent].Add(ugm.Child);
1590      }
1591
1592      return userGroupTree;
1593    }
1594
1595    public bool CheckAccessToAdminAreaGranted() {
1596      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1597      bool isAdministrator = RoleVerifier.IsInRole(HiveRoles.Administrator);
1598      var pm = PersistenceManager;
1599      using(new PerformanceLogger("CheckAccessToAdminAreaGranted")) {
1600        if (isAdministrator) {
1601          return true;
1602        } else {
1603          var projectDao = pm.ProjectDao;
1604          var currentUserId = UserManager.CurrentUserId;
1605          return projectDao.GetAdministrationGrantedProjectsForUser(currentUserId).Any();
1606        }
1607      }
1608    }
1609    #endregion
1610
1611    #region UserPriorities Methods
1612    public IEnumerable<DT.UserPriority> GetUserPriorities() {
1613      var pm = PersistenceManager;
1614      using (new PerformanceLogger("GetUserPriorities")) {
1615        var userPriorityDao = pm.UserPriorityDao;
1616        return pm.UseTransaction(() => userPriorityDao.GetAll()
1617          .Select(x => x.ToDto())
1618          .ToList()
1619        );
1620      }
1621    }
1622    #endregion
1623
1624    #region Private Helper Methods
1625    private void UpdateTaskState(IPersistenceManager pm, DA.Task task, DT.TaskState taskState, Guid? slaveId, Guid? userId, string exception) {
1626      var stateLogDao = pm.StateLogDao;
1627      var taskStateEntity = taskState.ToEntity();
1628
1629      if (task.State == DA.TaskState.Transferring && taskStateEntity == DA.TaskState.Paused && task.Command == null) {
1630        // slave paused and uploaded the task (no user-command) -> set waiting.
1631        taskStateEntity = DA.TaskState.Waiting;
1632      }
1633
1634      stateLogDao.Save(new DA.StateLog {
1635        State = taskStateEntity,
1636        DateTime = DateTime.Now,
1637        TaskId = task.TaskId,
1638        UserId = userId,
1639        SlaveId = slaveId,
1640        Exception = exception
1641      });
1642
1643      task.State = taskStateEntity;
1644
1645      if (task.Command == DA.Command.Pause && task.State == DA.TaskState.Paused
1646          || task.Command == DA.Command.Abort && task.State == DA.TaskState.Aborted
1647          || task.Command == DA.Command.Stop && task.State == DA.TaskState.Aborted) {
1648        task.Command = null;
1649      }
1650    }
1651
1652    #endregion
1653  }
1654}
Note: See TracBrowser for help on using the repository browser.