Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HiveProjectManagement/HeuristicLab.Services.Hive/3.3/HiveService.cs @ 15497

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

#2839 worked on permission check at AddTask

File size: 45.4 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 static readonly DA.TaskState[] CompletedStates = { DA.TaskState.Finished, DA.TaskState.Aborted, DA.TaskState.Failed };
44
45    private IPersistenceManager PersistenceManager {
46      get { return ServiceLocator.Instance.PersistenceManager; }
47    }
48
49    private IUserManager UserManager {
50      get { return ServiceLocator.Instance.UserManager; }
51    }
52
53    private IRoleVerifier RoleVerifier {
54      get { return ServiceLocator.Instance.RoleVerifier; }
55    }
56
57    private IAuthorizationManager AuthorizationManager {
58      get { return ServiceLocator.Instance.AuthorizationManager; }
59    }
60    private IEventManager EventManager {
61      get { return ServiceLocator.Instance.EventManager; }
62    }
63    private HeartbeatManager HeartbeatManager {
64      get { return ServiceLocator.Instance.HeartbeatManager; }
65    }
66
67    #region Task Methods
68    public Guid AddTask(DT.Task task, DT.TaskData taskData, IEnumerable<Guid> resourceIds) {
69      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
70      var pm = PersistenceManager;
71      using (new PerformanceLogger("AddTask")) {
72        var taskDao = pm.TaskDao;
73        var stateLogDao = pm.StateLogDao;
74
75        var resourceDao = pm.ResourceDao;
76        var resourcePermissionDao = pm.ResourcePermissionDao;
77
78        var currentUserId = UserManager.CurrentUserId;
79
80        // V1 (without child check; with resourcePermission-oriented check for user grants)
81        // granted (parent) resources
82        var userGrantedResources = resourcePermissionDao.GetAll().ToList()
83          .Where(x => x.GrantedUserId == currentUserId
84          || UserManager.VerifyUser(currentUserId, new List<Guid> { x.GrantedUserId })
85          )
86          .Select(x => x.Resource)
87          .ToList();
88
89        //// children
90        //var userGrantedResourceChildren = userGrantedResources
91        //  .SelectMany(x => resourceDao.GetResourcesByParentId(x.ResourceId));
92        //// join parent and child resources
93        //userGrantedResources.AddRange(userGrantedResourceChildren);
94
95        var userGrantedResourceIds = resourceIds
96          .Where(x => userGrantedResources
97            .Select(y => y.ResourceId)
98            .Contains(x))
99          .Distinct().ToList();
100
101        var newTask = task.ToEntity();
102        newTask.JobData = taskData.ToEntity();
103        newTask.JobData.LastUpdate = DateTime.Now;
104        newTask.AssignedTaskResources.AddRange(resourceIds.Select(
105          x => new DA.AssignedTaskResource {
106            ResourceId = x
107          }));
108        newTask.State = DA.TaskState.Waiting;
109        return pm.UseTransaction(() => {
110          taskDao.Save(newTask);
111          pm.SubmitChanges();
112          stateLogDao.Save(new DA.StateLog {
113            State = DA.TaskState.Waiting,
114            DateTime = DateTime.Now,
115            TaskId = newTask.TaskId,
116            UserId = UserManager.CurrentUserId,
117            SlaveId = null,
118            Exception = null
119          });
120          pm.SubmitChanges();
121          return newTask.TaskId;
122        }, false, true);
123      }
124    }
125
126    public Guid AddChildTask(Guid parentTaskId, DT.Task task, DT.TaskData taskData) {
127      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
128      IEnumerable<Guid> resourceIds;
129      var pm = PersistenceManager;
130      using (new PerformanceLogger("AddChildTask")) {
131        var assignedTaskResourceDao = pm.AssignedTaskResourceDao;
132        resourceIds = pm.UseTransaction(() => {
133          return assignedTaskResourceDao.GetByTaskId(parentTaskId)
134            .Select(x => x.ResourceId)
135            .ToList();
136        });
137      }
138      task.ParentTaskId = parentTaskId;
139      return AddTask(task, taskData, resourceIds);
140    }
141
142    public DT.Task GetTask(Guid taskId) {
143      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
144      AuthorizationManager.AuthorizeForTask(taskId, Permission.Read);
145      var pm = PersistenceManager;
146      using (new PerformanceLogger("GetTask")) {
147        var taskDao = pm.TaskDao;
148        return pm.UseTransaction(() => {
149          var task = taskDao.GetById(taskId);
150          return task.ToDto();
151        });
152      }
153    }
154
155    public IEnumerable<DT.LightweightTask> GetLightweightJobTasks(Guid jobId) {
156      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
157      AuthorizationManager.AuthorizeForJob(jobId, Permission.Read);
158      var pm = PersistenceManager;
159      using (new PerformanceLogger("GetLightweightJobTasks")) {
160        var taskDao = pm.TaskDao;
161        return pm.UseTransaction(() => {
162          return taskDao.GetByJobId(jobId)
163            .ToList()
164            .Select(x => new DT.LightweightTask {
165              Id = x.TaskId,
166              ExecutionTime = TimeSpan.FromMilliseconds(x.ExecutionTimeMs),
167              ParentTaskId = x.ParentTaskId,
168              StateLog = x.StateLogs.OrderBy(y => y.DateTime)
169                                    .Select(z => z.ToDto())
170                                    .ToList(),
171              State = x.State.ToDto(),
172              Command = x.Command.ToDto(),
173              LastTaskDataUpdate = x.JobData.LastUpdate
174            })
175            .ToList();
176        }, false, true);
177      }
178    }
179
180    public IEnumerable<DT.LightweightTask> GetLightweightJobTasksWithoutStateLog(Guid jobId) {
181      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
182      AuthorizationManager.AuthorizeForJob(jobId, Permission.Read);
183      var pm = PersistenceManager;
184      using (new PerformanceLogger("GetLightweightJobTasksWithoutStateLog")) {
185        var taskDao = pm.TaskDao;
186        return pm.UseTransaction(() => {
187          return taskDao.GetByJobId(jobId)
188            .ToList()
189            .Select(x => new DT.LightweightTask {
190              Id = x.TaskId,
191              ExecutionTime = TimeSpan.FromMilliseconds(x.ExecutionTimeMs),
192              ParentTaskId = x.ParentTaskId,
193              StateLog = new List<DT.StateLog>(),
194              State = x.State.ToDto(),
195              Command = x.Command.ToDto(),
196              LastTaskDataUpdate = x.JobData.LastUpdate
197            })
198            .ToList();
199        }, false, true);
200      }
201    }
202
203    public DT.TaskData GetTaskData(Guid taskId) {
204      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
205      AuthorizationManager.AuthorizeForTask(taskId, Permission.Read);
206      var pm = PersistenceManager;
207      using (new PerformanceLogger("GetTaskData")) {
208        var taskDataDao = pm.TaskDataDao;
209        return pm.UseTransaction(() => taskDataDao.GetById(taskId).ToDto());
210      }
211    }
212
213    public void UpdateTask(DT.Task taskDto) {
214      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
215      AuthorizationManager.AuthorizeForTask(taskDto.Id, Permission.Full);
216      var pm = PersistenceManager;
217      using (new PerformanceLogger("UpdateTask")) {
218        var taskDao = pm.TaskDao;
219        pm.UseTransaction(() => {
220          var task = taskDao.GetById(taskDto.Id);
221          taskDto.CopyToEntity(task);
222          pm.SubmitChanges();
223        });
224      }
225    }
226
227    public void UpdateTaskData(DT.Task taskDto, DT.TaskData taskDataDto) {
228      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
229      AuthorizationManager.AuthorizeForTask(taskDto.Id, Permission.Full);
230      var pm = PersistenceManager;
231      using (new PerformanceLogger("UpdateTaskData")) {
232        var taskDao = pm.TaskDao;
233        var taskDataDao = pm.TaskDataDao;
234        pm.UseTransaction(() => {
235          var task = taskDao.GetById(taskDto.Id);
236          var taskData = taskDataDao.GetById(taskDataDto.TaskId);
237          taskDto.CopyToEntity(task);
238          taskDataDto.CopyToEntity(taskData);
239          taskData.LastUpdate = DateTime.Now;
240          pm.SubmitChanges();
241        });
242      }
243    }
244
245    public DT.Task UpdateTaskState(Guid taskId, DT.TaskState taskState, Guid? slaveId, Guid? userId, string exception) {
246      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
247      AuthorizationManager.AuthorizeForTask(taskId, Permission.Full);
248      var pm = PersistenceManager;
249      using (new PerformanceLogger("UpdateTaskState")) {
250        var taskDao = pm.TaskDao;
251        return pm.UseTransaction(() => {
252          var task = taskDao.GetById(taskId);
253          UpdateTaskState(pm, task, taskState, slaveId, userId, exception);
254          pm.SubmitChanges();
255          return task.ToDto();
256        });
257      }
258    }
259    #endregion
260
261    #region Task Control Methods
262    public void StopTask(Guid taskId) {
263      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
264      AuthorizationManager.AuthorizeForTask(taskId, Permission.Full);
265      var pm = PersistenceManager;
266      using (new PerformanceLogger("StopTask")) {
267        var taskDao = pm.TaskDao;
268        pm.UseTransaction(() => {
269          var task = taskDao.GetById(taskId);
270          if (task.State == DA.TaskState.Calculating || task.State == DA.TaskState.Transferring) {
271            task.Command = DA.Command.Stop;
272          } else if (task.State != DA.TaskState.Aborted
273                     && task.State != DA.TaskState.Finished
274                     && task.State != DA.TaskState.Failed) {
275            UpdateTaskState(pm, task, DT.TaskState.Aborted, null, null, string.Empty);
276          }
277          pm.SubmitChanges();
278        });
279      }
280    }
281
282    public void PauseTask(Guid taskId) {
283      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
284      AuthorizationManager.AuthorizeForTask(taskId, Permission.Full);
285      var pm = PersistenceManager;
286      using (new PerformanceLogger("PauseTask")) {
287        var taskDao = pm.TaskDao;
288        pm.UseTransaction(() => {
289          var task = taskDao.GetById(taskId);
290          if (task.State == DA.TaskState.Calculating || task.State == DA.TaskState.Transferring) {
291            task.Command = DA.Command.Pause;
292          } else if (task.State != DA.TaskState.Paused
293                     && task.State != DA.TaskState.Aborted
294                     && task.State != DA.TaskState.Finished
295                     && task.State != DA.TaskState.Failed) {
296            UpdateTaskState(pm, task, DT.TaskState.Paused, null, null, string.Empty);
297          }
298          pm.SubmitChanges();
299        });
300      }
301    }
302
303    public void RestartTask(Guid taskId) {
304      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
305      AuthorizationManager.AuthorizeForTask(taskId, Permission.Full);
306      var pm = PersistenceManager;
307      using (new PerformanceLogger("RestartTask")) {
308        var taskDao = pm.TaskDao;
309        pm.UseTransaction(() => {
310          var task = taskDao.GetById(taskId);
311          task.Command = null;
312          UpdateTaskState(pm, task, DT.TaskState.Waiting, null, UserManager.CurrentUserId, string.Empty);
313          pm.SubmitChanges();
314        });
315      }
316    }
317    #endregion
318
319    #region Job Methods
320    public DT.Job GetJob(Guid id) {
321      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
322      AuthorizationManager.AuthorizeForJob(id, DT.Permission.Read);
323      var pm = PersistenceManager;
324      using (new PerformanceLogger("GetJob")) {
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 job = jobDao.GetById(id).ToDto();
331          if (job != null) {
332            var statistics = taskDao.GetByJobId(job.Id)
333              .GroupBy(x => x.JobId)
334              .Select(x => new {
335                TotalCount = x.Count(),
336                CalculatingCount = x.Count(y => y.State == DA.TaskState.Calculating),
337                FinishedCount = x.Count(y => CompletedStates.Contains(y.State))
338              }).FirstOrDefault();
339            if (statistics != null) {
340              job.JobCount = statistics.TotalCount;
341              job.CalculatingCount = statistics.CalculatingCount;
342              job.FinishedCount = statistics.FinishedCount;
343            }
344            job.OwnerUsername = UserManager.GetUserNameById(job.OwnerUserId);
345            if (currentUserId == job.OwnerUserId) {
346              job.Permission = Permission.Full;
347            } else {
348              var jobPermission = jobPermissionDao.GetByJobAndUserId(job.Id, currentUserId);
349              job.Permission = jobPermission == null ? Permission.NotAllowed : jobPermission.Permission.ToDto();
350            }
351          }
352          return job;
353        });
354      }
355    }
356
357    public IEnumerable<DT.Job> GetJobs() {
358      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
359      var pm = PersistenceManager;
360      using (new PerformanceLogger("GetJobs")) {
361        var jobDao = pm.JobDao;
362        var jobPermissionDao = pm.JobPermissionDao;
363        var taskDao = pm.TaskDao;
364        var currentUserId = UserManager.CurrentUserId;
365        return pm.UseTransaction(() => {
366          var jobs = jobDao.GetAll()
367            .Where(x => x.OwnerUserId == currentUserId
368                     || x.JobPermissions.Count(y => y.Permission != DA.Permission.NotAllowed
369                                                 && y.GrantedUserId == currentUserId) > 0)
370            .Select(x => x.ToDto())
371            .ToList();
372          var statistics = taskDao.GetAll()
373              .GroupBy(x => x.JobId)
374              .Select(x => new {
375                x.Key,
376                TotalCount = x.Count(),
377                CalculatingCount = x.Count(y => y.State == DA.TaskState.Calculating),
378                FinishedCount = x.Count(y => CompletedStates.Contains(y.State))
379              })
380              .ToList();
381          foreach (var job in jobs) {
382            var statistic = statistics.FirstOrDefault(x => x.Key == job.Id);
383            if (statistic != null) {
384              job.JobCount = statistic.TotalCount;
385              job.CalculatingCount = statistic.CalculatingCount;
386              job.FinishedCount = statistic.FinishedCount;
387            }
388            job.OwnerUsername = UserManager.GetUserNameById(job.OwnerUserId);
389            if (currentUserId == job.OwnerUserId) {
390              job.Permission = Permission.Full;
391            } else {
392              var jobPermission = jobPermissionDao.GetByJobAndUserId(job.Id, currentUserId);
393              job.Permission = jobPermission == null ? Permission.NotAllowed : jobPermission.Permission.ToDto();
394            }
395          }
396          return jobs;
397        });
398      }
399    }
400
401    public Guid AddJob(DT.Job jobDto) {
402      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
403      var pm = PersistenceManager;
404      using (new PerformanceLogger("AddJob")) {
405        var jobDao = pm.JobDao;
406        var userPriorityDao = pm.UserPriorityDao;
407        return pm.UseTransaction(() => {
408          jobDto.OwnerUserId = UserManager.CurrentUserId;
409          jobDto.DateCreated = DateTime.Now;
410          var job = jobDao.Save(jobDto.ToEntity());
411          if (userPriorityDao.GetById(jobDto.OwnerUserId) == null) {
412            userPriorityDao.Save(new DA.UserPriority {
413              UserId = jobDto.OwnerUserId,
414              DateEnqueued = jobDto.DateCreated
415            });
416          }
417          pm.SubmitChanges();
418          return job.JobId;
419        });
420      }
421    }
422
423    public void UpdateJob(DT.Job jobDto) {
424      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
425      AuthorizationManager.AuthorizeForJob(jobDto.Id, DT.Permission.Full);
426      var pm = PersistenceManager;
427      using (new PerformanceLogger("UpdateJob")) {
428        bool exists = true;
429        var jobDao = pm.JobDao;
430        pm.UseTransaction(() => {
431          var job = jobDao.GetById(jobDto.Id);
432          if (job == null) {
433            exists = false;
434            job = new DA.Job();
435          }
436          jobDto.CopyToEntity(job);
437          if (!exists) {
438            jobDao.Save(job);
439          }
440          pm.SubmitChanges();
441        });
442      }
443    }
444
445    public void DeleteJob(Guid jobId) {
446      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
447      AuthorizationManager.AuthorizeForJob(jobId, DT.Permission.Full);
448      var pm = PersistenceManager;
449      using (new PerformanceLogger("DeleteJob")) {
450        var jobDao = pm.JobDao;
451        pm.UseTransaction(() => {
452          // child task will be deleted by db-trigger
453          jobDao.Delete(jobId);
454          pm.SubmitChanges();
455        });
456      }
457    }
458    #endregion
459
460    #region JobPermission Methods
461    public void GrantPermission(Guid jobId, Guid grantedUserId, DT.Permission permission) {
462      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
463      AuthorizationManager.AuthorizeForJob(jobId, Permission.Full);
464      var pm = PersistenceManager;
465      using (new PerformanceLogger("GrantPermission")) {
466        var jobPermissionDao = pm.JobPermissionDao;
467        var currentUserId = UserManager.CurrentUserId;
468        pm.UseTransaction(() => {
469          jobPermissionDao.SetJobPermission(jobId, currentUserId, grantedUserId, permission.ToEntity());
470          pm.SubmitChanges();
471        });
472      }
473    }
474
475    public void RevokePermission(Guid jobId, Guid grantedUserId) {
476      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
477      AuthorizationManager.AuthorizeForJob(jobId, Permission.Full);
478      var pm = PersistenceManager;
479      using (new PerformanceLogger("RevokePermission")) {
480        var jobPermissionDao = pm.JobPermissionDao;
481        var currentUserId = UserManager.CurrentUserId;
482        pm.UseTransaction(() => {
483          jobPermissionDao.SetJobPermission(jobId, currentUserId, grantedUserId, DA.Permission.NotAllowed);
484          pm.SubmitChanges();
485        });
486      }
487    }
488
489    public IEnumerable<JobPermission> GetJobPermissions(Guid jobId) {
490      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
491      AuthorizationManager.AuthorizeForJob(jobId, Permission.Full);
492      var pm = PersistenceManager;
493      using (new PerformanceLogger("GetJobPermissions")) {
494        var jobPermissionDao = pm.JobPermissionDao;
495        return pm.UseTransaction(() => jobPermissionDao.GetByJobId(jobId)
496          .Select(x => x.ToDto())
497          .ToList()
498        );
499      }
500    }
501
502    // BackwardsCompatibility3.3
503    #region Backwards compatible code, remove with 3.4
504    public bool IsAllowedPrivileged() {
505      return true;
506    }
507    #endregion
508    #endregion
509
510    #region Login Methods
511    public void Hello(DT.Slave slaveInfo) {
512      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Slave);
513      if (UserManager.CurrentUser.UserName != "hiveslave") {
514        slaveInfo.OwnerUserId = UserManager.CurrentUserId;
515      }
516      var pm = PersistenceManager;
517      using (new PerformanceLogger("Hello")) {
518        var slaveDao = pm.SlaveDao;
519        pm.UseTransaction(() => {
520          var slave = slaveDao.GetById(slaveInfo.Id);
521          if (slave == null) {
522            slaveDao.Save(slaveInfo.ToEntity());
523          } else {
524            bool oldIsAllowedToCalculate = slave.IsAllowedToCalculate;
525            Guid? oldParentResourceId = slave.ParentResourceId;
526            slaveInfo.CopyToEntity(slave);
527            slave.IsAllowedToCalculate = oldIsAllowedToCalculate;
528            slave.ParentResourceId = oldParentResourceId;
529            slave.LastHeartbeat = DateTime.Now;
530            slave.SlaveState = DA.SlaveState.Idle;
531          }
532          pm.SubmitChanges();
533        });
534      }
535    }
536
537    public void GoodBye(Guid slaveId) {
538      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Slave);
539      var pm = PersistenceManager;
540      using (new PerformanceLogger("GoodBye")) {
541        var slaveDao = pm.SlaveDao;
542        pm.UseTransaction(() => {
543          var slave = slaveDao.GetById(slaveId);
544          if (slave != null) {
545            slave.SlaveState = DA.SlaveState.Offline;
546            pm.SubmitChanges();
547          }
548        });
549      }
550    }
551    #endregion
552
553    #region Heartbeat Methods
554    public List<MessageContainer> Heartbeat(DT.Heartbeat heartbeat) {
555      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Slave);
556      List<MessageContainer> result = new List<MessageContainer>();
557      try {
558        using (new PerformanceLogger("ProcessHeartbeat")) {
559          result = HeartbeatManager.ProcessHeartbeat(heartbeat);
560        }
561      } catch (Exception ex) {
562        DA.LogFactory.GetLogger(this.GetType().Namespace).Log(string.Format("Exception processing Heartbeat: {0}", ex));
563      }
564      if (HeuristicLab.Services.Hive.Properties.Settings.Default.TriggerEventManagerInHeartbeat) {
565        TriggerEventManager(false);
566      }
567      return result;
568    }
569    #endregion
570
571    #region Plugin Methods
572    public DT.Plugin GetPlugin(Guid pluginId) {
573      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
574      var pm = PersistenceManager;
575      using (new PerformanceLogger("GetPlugin")) {
576        var pluginDao = pm.PluginDao;
577        return pm.UseTransaction(() => pluginDao.GetById(pluginId).ToDto());
578      }
579    }
580
581    public Guid AddPlugin(DT.Plugin plugin, List<DT.PluginData> pluginData) {
582      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
583      var pm = PersistenceManager;
584      using (new PerformanceLogger("AddPlugin")) {
585        var pluginDao = pm.PluginDao;
586        plugin.UserId = UserManager.CurrentUserId;
587        plugin.DateCreated = DateTime.Now;
588        return pm.UseTransaction(() => {
589          var pluginEntity = pluginDao.GetByHash(plugin.Hash).SingleOrDefault();
590          if (pluginEntity != null) {
591            throw new FaultException<PluginAlreadyExistsFault>(new PluginAlreadyExistsFault(pluginEntity.PluginId));
592          }
593          pluginEntity = plugin.ToEntity();
594          foreach (var data in pluginData) {
595            data.PluginId = default(Guid); // real id will be assigned from linq2sql
596            pluginEntity.PluginData.Add(data.ToEntity());
597          }
598          pluginDao.Save(pluginEntity);
599          pm.SubmitChanges();
600          return pluginEntity.PluginId;
601        });
602      }
603    }
604
605    public IEnumerable<DT.Plugin> GetPlugins() {
606      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
607      var pm = PersistenceManager;
608      using (new PerformanceLogger("GetPlugins")) {
609        var pluginDao = pm.PluginDao;
610        return pm.UseTransaction(() => pluginDao.GetAll()
611          .Where(x => x.Hash != null)
612          .Select(x => x.ToDto())
613          .ToList()
614        );
615      }
616    }
617
618    public IEnumerable<DT.PluginData> GetPluginDatas(List<Guid> pluginIds) {
619      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
620      var pm = PersistenceManager;
621      using (new PerformanceLogger("GetPluginDatas")) {
622        var pluginDataDao = pm.PluginDataDao;
623        return pm.UseTransaction(() => pluginDataDao.GetAll()
624            .Where(x => pluginIds.Contains(x.PluginId))
625            .Select(x => x.ToDto())
626            .ToList()
627        );
628      }
629    }
630    #endregion
631
632    #region Project Methods
633    public Guid AddProject(DT.Project projectDto) {
634      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
635      var pm = PersistenceManager;
636      using (new PerformanceLogger("AddProject")) {
637        var projectDao = pm.ProjectDao;
638        return pm.UseTransaction(() => {
639          var project = projectDao.Save(projectDto.ToEntity());
640          pm.SubmitChanges();
641          return project.ProjectId;
642        });
643      }
644    }
645
646    public void UpdateProject(DT.Project projectDto) {
647      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
648      var pm = PersistenceManager;
649      using (new PerformanceLogger("UpdateProject")) {
650        var projectDao = pm.ProjectDao;
651        pm.UseTransaction(() => {
652          var project = projectDao.GetById(projectDto.Id);
653          if (project != null) {
654            projectDto.CopyToEntity(project);
655          } else {
656            projectDao.Save(projectDto.ToEntity());
657          }
658          pm.SubmitChanges();
659        });
660      }
661    }
662
663    public void DeleteProject(Guid projectId) {
664      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
665      AuthorizationManager.AuthorizeForProjectAdministration(projectId);
666      var pm = PersistenceManager;
667      using (new PerformanceLogger("DeleteProject")) {
668        var projectDao = pm.ProjectDao;
669        pm.UseTransaction(() => {
670          projectDao.Delete(projectId);
671          pm.SubmitChanges();
672        });
673      }
674    }
675
676    public DT.Project GetProject(Guid projectId) {
677      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
678      var pm = PersistenceManager;
679      using (new PerformanceLogger("GetProject")) {
680        var projectDao = pm.ProjectDao;
681        return pm.UseTransaction(() => projectDao.GetById(projectId).ToDto());
682      }
683    }
684
685    public IEnumerable<DT.Project> GetProjects() {
686      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
687      bool isAdministrator = RoleVerifier.IsInRole(HiveRoles.Administrator);
688      var pm = PersistenceManager;
689      using (new PerformanceLogger("GetProjects")) {
690        var projectDao = pm.ProjectDao;
691        var projectPermissionDao = pm.ProjectPermissionDao;
692        var currentUserId = UserManager.CurrentUserId;
693        return pm.UseTransaction(() => {
694          var projectPermissions = projectPermissionDao.GetAll();
695          return projectDao.GetAll().ToList()
696            .Where(x => isAdministrator
697              || x.OwnerUserId == currentUserId
698              || UserManager.VerifyUser(currentUserId, projectPermissions
699                  .Where(y => y.ProjectId == x.ProjectId)
700                  .Select(z => z.GrantedUserId)
701                  .ToList())
702              )
703            .Select(x => x.ToDto())
704            .ToList();
705        });
706      }
707    }
708    #endregion
709
710    #region ProjectPermission Methods
711    public void GrantProjectPermissions(Guid projectId, Guid[] grantedUserIds) {
712      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
713      AuthorizationManager.AuthorizeForProjectAdministration(projectId);
714      var pm = PersistenceManager;
715      using (new PerformanceLogger("GrantProjectPermissions")) {
716        pm.UseTransaction(() => {
717          var project = AuthorizeForProject(pm, projectId);
718          var projectPermissions = project.ProjectPermissions.ToList();
719          foreach (var id in grantedUserIds) {
720            if (projectPermissions.All(x => x.GrantedUserId != id)) {
721              project.ProjectPermissions.Add(new DA.ProjectPermission {
722                GrantedUserId = id,
723                GrantedByUserId = UserManager.CurrentUserId
724              });
725            }
726          }
727          pm.SubmitChanges();
728        });
729      }
730    }
731
732    public void RevokeProjectPermissions(Guid projectId, Guid[] grantedUserIds) {
733      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
734      AuthorizationManager.AuthorizeForProjectAdministration(projectId);
735      var pm = PersistenceManager;
736      using (new PerformanceLogger("RevokeProjectPermissions")) {
737        var projectPermissionDao = pm.ProjectPermissionDao;
738        pm.UseTransaction(() => {
739          projectPermissionDao.DeleteByProjectAndGrantedUserId(projectId, grantedUserIds);
740          pm.SubmitChanges();
741        });
742      }
743    }
744
745    public IEnumerable<DT.ProjectPermission> GetProjectPermissions(Guid projectId) {
746      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
747      var pm = PersistenceManager;
748      using (new PerformanceLogger("GetProjectPermissions")) {
749        var projectPermissionDao = pm.ProjectPermissionDao;
750        return pm.UseTransaction(() => projectPermissionDao.GetByProjectId(projectId)
751          .Select(x => x.ToDto())
752          .ToList()
753        );
754      }
755    }
756    #endregion
757
758    #region AssignedProjectResource Methods
759    public void AssignProjectResources(Guid projectId, Guid[] resourceIds) {
760      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
761      AuthorizationManager.AuthorizeForProjectAdministration(projectId);
762      var pm = PersistenceManager;
763      using (new PerformanceLogger("AssignProjectResources")) {
764        pm.UseTransaction(() => {
765          var project = AuthorizeForProject(pm, projectId);
766          var assignedProjectResources = project.AssignedProjectResources.ToList();
767          foreach (var id in resourceIds) {
768            if (assignedProjectResources.All(x => x.ResourceId != id)) {
769              project.AssignedProjectResources.Add(new DA.AssignedProjectResource {
770                ResourceId = id
771              });
772            }
773          }
774          pm.SubmitChanges();
775        });
776      }
777    }
778
779    public void UnassignProjectResources(Guid projectId, Guid[] resourceIds) {
780      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
781      AuthorizationManager.AuthorizeForProjectAdministration(projectId);
782      var pm = PersistenceManager;
783      using (new PerformanceLogger("UnassignProjectResources")) {
784        var assignedProjectResourceDao = pm.AssignedProjectResourceDao;
785        pm.UseTransaction(() => {
786          assignedProjectResourceDao.DeleteByProjectAndGrantedUserId(projectId, resourceIds);
787          pm.SubmitChanges();
788        });
789      }
790    }
791
792    public IEnumerable<AssignedProjectResource> GetAssignedResourcesForProject(Guid projectId) {
793      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
794      var pm = PersistenceManager;
795      using (new PerformanceLogger("GetAssignedResourcesForProject")) {
796        var assignedProjectResourceDao = pm.AssignedProjectResourceDao;
797        return pm.UseTransaction(() => assignedProjectResourceDao.GetByProjectId(projectId)
798          .Select(x => x.ToDto())
799          .ToList()
800        );
801      }
802    }
803    #endregion
804
805    #region Slave Methods
806    public Guid AddSlave(DT.Slave slaveDto) {
807      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
808      var pm = PersistenceManager;
809      using (new PerformanceLogger("AddSlave")) {
810        var slaveDao = pm.SlaveDao;
811        return pm.UseTransaction(() => {
812          var slave = slaveDao.Save(slaveDto.ToEntity());
813          pm.SubmitChanges();
814          return slave.ResourceId;
815        });
816      }
817    }
818
819    public Guid AddSlaveGroup(DT.SlaveGroup slaveGroupDto) {
820      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
821      var pm = PersistenceManager;
822      using (new PerformanceLogger("AddSlaveGroup")) {
823        var slaveGroupDao = pm.SlaveGroupDao;
824        return pm.UseTransaction(() => {
825          if (slaveGroupDto.Id == Guid.Empty) {
826            slaveGroupDto.Id = Guid.NewGuid();
827          }
828          var slaveGroup = slaveGroupDao.Save(slaveGroupDto.ToEntity());
829          pm.SubmitChanges();
830          return slaveGroup.ResourceId;
831        });
832      }
833    }
834
835    public DT.Slave GetSlave(Guid slaveId) {
836      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
837      var pm = PersistenceManager;
838      using (new PerformanceLogger("GetSlave")) {
839        var slaveDao = pm.SlaveDao;
840        return pm.UseTransaction(() => slaveDao.GetById(slaveId).ToDto());
841      }
842    }
843
844    public IEnumerable<DT.Slave> GetSlaves() {
845      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
846      bool isAdministrator = RoleVerifier.IsInRole(HiveRoles.Administrator);
847      var pm = PersistenceManager;
848      using (new PerformanceLogger("GetSlaves")) {
849        var slaveDao = pm.SlaveDao;
850        var resourcePermissionDao = pm.ProjectPermissionDao;
851        var currentUserId = UserManager.CurrentUserId;
852        return pm.UseTransaction(() => {
853          var resourcePermissions = resourcePermissionDao.GetAll();
854          return slaveDao.GetAll().ToList()
855            .Where(x => isAdministrator
856              || x.OwnerUserId == null
857              || x.OwnerUserId == currentUserId
858              || UserManager.VerifyUser(currentUserId, resourcePermissions
859                  //.Where(y => y.ResourceId == x.ResourceId)
860                  .Select(z => z.GrantedUserId)
861                  .ToList())
862              )
863            .Select(x => x.ToDto())
864            .ToList();
865        });
866      }
867    }
868
869    public IEnumerable<DT.SlaveGroup> GetSlaveGroups() {
870      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
871      bool isAdministrator = RoleVerifier.IsInRole(HiveRoles.Administrator);
872      var pm = PersistenceManager;
873      using (new PerformanceLogger("GetSlaveGroups")) {
874        var slaveGroupDao = pm.SlaveGroupDao;
875        var resourcePermissionDao = pm.ProjectPermissionDao;
876        var currentUserId = UserManager.CurrentUserId;
877        return pm.UseTransaction(() => {
878          var resourcePermissions = resourcePermissionDao.GetAll();
879          return slaveGroupDao.GetAll().ToList()
880            .Where(x => isAdministrator
881              || x.OwnerUserId == null
882              || x.OwnerUserId == currentUserId
883              || UserManager.VerifyUser(currentUserId, resourcePermissions
884                  //.Where(y => y.ResourceId == x.ResourceId)
885                  .Select(z => z.GrantedUserId)
886                  .ToList())
887              )
888            .Select(x => x.ToDto())
889            .ToList();
890        });
891      }
892    }
893
894    public void UpdateSlave(DT.Slave slaveDto) {
895      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
896      var pm = PersistenceManager;
897      using (new PerformanceLogger("UpdateSlave")) {
898        var slaveDao = pm.SlaveDao;
899        pm.UseTransaction(() => {
900          var slave = slaveDao.GetById(slaveDto.Id);
901          if (slave != null) {
902            slaveDto.CopyToEntity(slave);
903          } else {
904            slaveDao.Save(slaveDto.ToEntity());
905          }
906          pm.SubmitChanges();
907        });
908      }
909    }
910
911    public void UpdateSlaveGroup(DT.SlaveGroup slaveGroupDto) {
912      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
913      var pm = PersistenceManager;
914      using (new PerformanceLogger("UpdateSlaveGroup")) {
915        var slaveGroupDao = pm.SlaveGroupDao;
916        pm.UseTransaction(() => {
917          var slaveGroup = slaveGroupDao.GetById(slaveGroupDto.Id);
918          if (slaveGroup != null) {
919            slaveGroupDto.CopyToEntity(slaveGroup);
920          } else {
921            slaveGroupDao.Save(slaveGroupDto.ToEntity());
922          }
923          pm.SubmitChanges();
924        });
925      }
926    }
927
928    public void DeleteSlave(Guid slaveId) {
929      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
930      AuthorizationManager.AuthorizeForResourceAdministration(slaveId);
931      var pm = PersistenceManager;
932      using (new PerformanceLogger("DeleteSlave")) {
933        var slaveDao = pm.SlaveDao;
934        pm.UseTransaction(() => {
935          slaveDao.Delete(slaveId);
936          pm.SubmitChanges();
937        });
938      }
939    }
940
941    public void DeleteSlaveGroup(Guid slaveGroupId) {
942      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
943      AuthorizationManager.AuthorizeForResourceAdministration(slaveGroupId);
944      var pm = PersistenceManager;
945      using (new PerformanceLogger("DeleteSlaveGroup")) {
946        var slaveGroupDao = pm.SlaveGroupDao;
947        pm.UseTransaction(() => {
948          slaveGroupDao.Delete(slaveGroupId);
949          pm.SubmitChanges();
950        });
951      }
952    }
953
954    public void AddResourceToGroup(Guid slaveGroupId, Guid resourceId) {
955      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
956      var pm = PersistenceManager;
957      using (new PerformanceLogger("AddResourceToGroup")) {
958        var resourceDao = pm.ResourceDao;
959        pm.UseTransaction(() => {
960          var resource = resourceDao.GetById(resourceId);
961          resource.ParentResourceId = slaveGroupId;
962          pm.SubmitChanges();
963        });
964      }
965    }
966
967    public void RemoveResourceFromGroup(Guid slaveGroupId, Guid resourceId) {
968      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
969      var pm = PersistenceManager;
970      using (new PerformanceLogger("RemoveResourceFromGroup")) {
971        var resourceDao = pm.ResourceDao;
972        pm.UseTransaction(() => {
973          var resource = resourceDao.GetById(resourceId);
974          resource.ParentResourceId = null;
975          pm.SubmitChanges();
976        });
977      }
978    }
979
980    public Guid GetResourceId(string resourceName) {
981      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
982      var pm = PersistenceManager;
983      using (new PerformanceLogger("GetResourceId")) {
984        var resourceDao = pm.ResourceDao;
985        return pm.UseTransaction(() => {
986          var resource = resourceDao.GetByName(resourceName);
987          return resource != null ? resource.ResourceId : Guid.Empty;
988        });
989      }
990    }
991
992    public void TriggerEventManager(bool force) {
993      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
994      // use a serializable transaction here to ensure not two threads execute this simultaniously (mutex-lock would not work since IIS may use multiple AppDomains)
995      bool cleanup;
996      var pm = PersistenceManager;
997      using (new PerformanceLogger("TriggerEventManager")) {
998        cleanup = false;
999        var lifecycleDao = pm.LifecycleDao;
1000        pm.UseTransaction(() => {
1001          var lastLifecycle = lifecycleDao.GetLastLifecycle();
1002          DateTime lastCleanup = lastLifecycle != null ? lastLifecycle.LastCleanup : DateTime.MinValue;
1003          if (force || DateTime.Now - lastCleanup > HeuristicLab.Services.Hive.Properties.Settings.Default.CleanupInterval) {
1004            lifecycleDao.UpdateLifecycle();
1005            cleanup = true;
1006            pm.SubmitChanges();
1007          }
1008        }, true);
1009      }
1010      if (cleanup) {
1011        EventManager.Cleanup();
1012      }
1013    }
1014
1015    public int GetNewHeartbeatInterval(Guid slaveId) {
1016      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Slave);
1017      var pm = PersistenceManager;
1018      using (new PerformanceLogger("GetNewHeartbeatInterval")) {
1019        var slaveDao = pm.SlaveDao;
1020        return pm.UseTransaction(() => {
1021          var slave = slaveDao.GetById(slaveId);
1022          if (slave != null) {
1023            return slave.HbInterval;
1024          }
1025          return -1;
1026        });
1027      }
1028    }
1029    #endregion
1030
1031    #region Downtime Methods
1032    public Guid AddDowntime(DT.Downtime downtimeDto) {
1033      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1034      AuthorizationManager.AuthorizeForResourceAdministration(downtimeDto.ResourceId);
1035      var pm = PersistenceManager;
1036      using (new PerformanceLogger("AddDowntime")) {
1037        var downtimeDao = pm.DowntimeDao;
1038        return pm.UseTransaction(() => {
1039          var downtime = downtimeDao.Save(downtimeDto.ToEntity());
1040          pm.SubmitChanges();
1041          return downtime.ResourceId;
1042        });
1043      }
1044    }
1045
1046    public void DeleteDowntime(Guid downtimeId) {
1047      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1048      var pm = PersistenceManager;
1049      using (new PerformanceLogger("DeleteDowntime")) {
1050        var downtimeDao = pm.DowntimeDao;
1051        pm.UseTransaction(() => {
1052          downtimeDao.Delete(downtimeId);
1053          pm.SubmitChanges();
1054        });
1055      }
1056    }
1057
1058    public void UpdateDowntime(DT.Downtime downtimeDto) {
1059      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1060      AuthorizationManager.AuthorizeForResourceAdministration(downtimeDto.ResourceId);
1061      var pm = PersistenceManager;
1062      using (new PerformanceLogger("UpdateDowntime")) {
1063        var downtimeDao = pm.DowntimeDao;
1064        pm.UseTransaction(() => {
1065          var downtime = downtimeDao.GetById(downtimeDto.Id);
1066          if (downtime != null) {
1067            downtimeDto.CopyToEntity(downtime);
1068          } else {
1069            downtimeDao.Save(downtimeDto.ToEntity());
1070          }
1071          pm.SubmitChanges();
1072        });
1073      }
1074    }
1075
1076    public IEnumerable<DT.Downtime> GetDowntimesForResource(Guid resourceId) {
1077      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1078      var pm = PersistenceManager;
1079      using (new PerformanceLogger("GetDowntimesForResource")) {
1080        var downtimeDao = pm.DowntimeDao;
1081        return pm.UseTransaction(() => downtimeDao.GetByResourceId(resourceId)
1082          .Select(x => x.ToDto())
1083          .ToList()
1084        );
1085      }
1086    }
1087    #endregion
1088
1089    #region User Methods
1090    public string GetUsernameByUserId(Guid userId) {
1091      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1092      var user = UserManager.GetUserById(userId);
1093      return user != null ? user.UserName : null;
1094    }
1095
1096    public Guid GetUserIdByUsername(string username) {
1097      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1098      var user = ServiceLocator.Instance.UserManager.GetUserByName(username);
1099      return user != null ? (Guid?)user.ProviderUserKey ?? Guid.Empty : Guid.Empty;
1100    }
1101    #endregion
1102
1103    #region UserPriorities Methods
1104    public IEnumerable<DT.UserPriority> GetUserPriorities() {
1105      var pm = PersistenceManager;
1106      using (new PerformanceLogger("GetUserPriorities")) {
1107        var userPriorityDao = pm.UserPriorityDao;
1108        return pm.UseTransaction(() => userPriorityDao.GetAll()
1109          .Select(x => x.ToDto())
1110          .ToList()
1111        );
1112      }
1113    }
1114    #endregion
1115
1116    #region Private Helper Methods
1117    private void UpdateTaskState(IPersistenceManager pm, DA.Task task, DT.TaskState taskState, Guid? slaveId, Guid? userId, string exception) {
1118      var stateLogDao = pm.StateLogDao;
1119      var taskStateEntity = taskState.ToEntity();
1120
1121      if (task.State == DA.TaskState.Transferring && taskStateEntity == DA.TaskState.Paused && task.Command == null) {
1122        // slave paused and uploaded the task (no user-command) -> set waiting.
1123        taskStateEntity = DA.TaskState.Waiting;
1124      }
1125
1126      stateLogDao.Save(new DA.StateLog {
1127        State = taskStateEntity,
1128        DateTime = DateTime.Now,
1129        TaskId = task.TaskId,
1130        UserId = userId,
1131        SlaveId = slaveId,
1132        Exception = exception
1133      });
1134
1135      task.State = taskStateEntity;
1136
1137      if (task.Command == DA.Command.Pause && task.State == DA.TaskState.Paused
1138          || task.Command == DA.Command.Abort && task.State == DA.TaskState.Aborted
1139          || task.Command == DA.Command.Stop && task.State == DA.TaskState.Aborted) {
1140        task.Command = null;
1141      }
1142    }
1143
1144    private DA.Project AuthorizeForProject(IPersistenceManager pm, Guid projectId) {
1145      var projectDao = pm.ProjectDao;
1146      var project = projectDao.GetById(projectId);
1147      if (project == null) throw new SecurityException("Not authorized");
1148      if (project.OwnerUserId != UserManager.CurrentUserId
1149          && !RoleVerifier.IsInRole(HiveRoles.Administrator)) {
1150        throw new SecurityException("Not authorized");
1151      }
1152      return project;
1153    }
1154    #endregion
1155  }
1156}
Note: See TracBrowser for help on using the repository browser.