Free cookie consent management tool by TermsFeed Policy Generator

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

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

#2839: Fixed several bugs and added project duration handling

  • fixed project duration handling (client- & service-side)
  • fixed tagging in HiveJobAdmin
  • added ProjectJobs view (under construction)
  • added necessary service methods
File size: 71.9 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 IEnumerable<DT.Job> GetJobsByProjectId(Guid projectId) {
369      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
370      var pm = PersistenceManager;
371      using (new PerformanceLogger("GetJobsByProjectId")) {
372        var currentUserId = UserManager.CurrentUserId;
373        var projectDao = pm.ProjectDao;
374        var jobDao = pm.JobDao;
375
376        return pm.UseTransaction(() => {
377          // check if user is granted to administer the requested projectId
378          var administrationGrantedProjects = projectDao
379            .GetAdministrationGrantedProjectsForUser(currentUserId)
380            .ToList();
381
382          if(administrationGrantedProjects.Select(x => x.ProjectId).Contains(projectId)) {
383            return jobDao.GetByProjectId(projectId)
384            .Select(x => x.ToDto())
385            .ToList();
386          } else {
387            return Enumerable.Empty<DT.Job>();
388          }
389        });
390      }
391    }
392
393    public IEnumerable<DT.Job> GetJobsByProjectIds(IEnumerable<Guid> projectIds) {
394      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
395      var pm = PersistenceManager;
396      using (new PerformanceLogger("GetJobsByProjectIds")) {
397        var currentUserId = UserManager.CurrentUserId;
398        var projectDao = pm.ProjectDao;
399        var jobDao = pm.JobDao;
400        return pm.UseTransaction(() => {
401          // check for which of requested projectIds the user is granted to administer
402          var administrationGrantedProjectIds = projectDao
403            .GetAdministrationGrantedProjectsForUser(currentUserId)
404            .Select(x => x.ProjectId)
405            .ToList();
406          var requestedAndGrantedProjectIds = projectIds.Intersect(administrationGrantedProjectIds);
407
408          if(requestedAndGrantedProjectIds.Any()) {
409            return jobDao.GetByProjectIds(requestedAndGrantedProjectIds)
410              .Select(x => x.ToDto())
411              .ToList();
412          } else {
413            return Enumerable.Empty<DT.Job>();
414          }
415        });
416      }
417    }
418
419    public Guid AddJob(DT.Job jobDto, IEnumerable<Guid> resourceIds) {
420      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
421      var dateCreated = DateTime.Now;
422      var pm = PersistenceManager;
423
424      // check project availability (cf. duration)
425      CheckProjectAvailability(pm, jobDto.ProjectId, dateCreated);
426
427      // check user - project
428      AuthorizationManager.AuthorizeUserForProjectUse(UserManager.CurrentUserId, jobDto.ProjectId);
429
430      // check project - resources
431      AuthorizationManager.AuthorizeProjectForResourcesUse(jobDto.ProjectId, resourceIds);
432     
433      using (new PerformanceLogger("AddJob")) {
434        var jobDao = pm.JobDao;
435        var userPriorityDao = pm.UserPriorityDao;
436
437        return pm.UseTransaction(() => {
438          var newJob = jobDto.ToEntity();
439          newJob.OwnerUserId = UserManager.CurrentUserId;
440          newJob.DateCreated = dateCreated;
441
442          // add resource assignments
443          if (resourceIds != null && resourceIds.Any()) {           
444            newJob.AssignedJobResources.AddRange(resourceIds.Select(
445              x => new DA.AssignedJobResource {
446                ResourceId = x
447              }));
448          }
449
450          var job = jobDao.Save(newJob);
451          if (userPriorityDao.GetById(newJob.OwnerUserId) == null) {
452            userPriorityDao.Save(new DA.UserPriority {
453              UserId = newJob.OwnerUserId,
454              DateEnqueued = newJob.DateCreated
455            });
456          }
457          pm.SubmitChanges();
458          return job.JobId;
459        });
460      }
461    }
462
463    public void UpdateJob(DT.Job jobDto, IEnumerable<Guid> resourceIds) {
464      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
465      AuthorizationManager.AuthorizeForJob(jobDto.Id, DT.Permission.Full);
466      var pm = PersistenceManager;
467      var dateUpdated = DateTime.Now;
468
469      // check project availability
470      CheckProjectAvailability(pm, jobDto.ProjectId, dateUpdated);
471      // check user - project permission
472      AuthorizationManager.AuthorizeUserForProjectUse(UserManager.CurrentUserId, jobDto.ProjectId);
473      // check project - resources permission
474      AuthorizationManager.AuthorizeProjectForResourcesUse(jobDto.ProjectId, resourceIds);
475
476      using (new PerformanceLogger("UpdateJob")) {
477        bool exists = true;
478        var jobDao = pm.JobDao;
479        pm.UseTransaction(() => {
480          var job = jobDao.GetById(jobDto.Id);
481          if (job == null) {
482            exists = false;
483            job = new DA.Job();
484          }
485          jobDto.CopyToEntity(job);
486
487          if (!exists) {
488            // add resource assignments
489            if (resourceIds != null && resourceIds.Any()) {
490              job.AssignedJobResources.AddRange(resourceIds.Select(
491                x => new DA.AssignedJobResource {
492                  ResourceId = x
493              }));
494            }
495            jobDao.Save(job);
496          } else if(resourceIds != null) {
497            var addedJobResourceIds = resourceIds.Except(job.AssignedJobResources.Select(x => x.ResourceId));
498            var removedJobResourceIds = job.AssignedJobResources
499              .Select(x => x.ResourceId)
500              .Except(resourceIds)
501              .ToArray();
502           
503            // remove resource assignments
504            foreach(var rid in removedJobResourceIds) {
505              var ajr = job.AssignedJobResources.Where(x => x.ResourceId == rid).SingleOrDefault();
506              if (ajr != null) job.AssignedJobResources.Remove(ajr);
507            }
508
509            // add resource assignments
510            job.AssignedJobResources.AddRange(addedJobResourceIds.Select(
511              x => new DA.AssignedJobResource {
512                ResourceId = x
513              }));
514          }
515          pm.SubmitChanges();
516        });
517      }
518    }
519
520    public void UpdateJobState(Guid jobId, DT.JobState jobState) {
521      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
522      AuthorizationManager.AuthorizeForJob(jobId, DT.Permission.Full);
523      var pm = PersistenceManager;
524      using (new PerformanceLogger("UpdateJobState")) {
525        var jobDao = pm.JobDao;
526        pm.UseTransaction(() => {
527          var job = jobDao.GetById(jobId);
528          if(job != null) {
529            var jobStateEntity = jobState.ToEntity();
530            // note: allow solely state changes from "Online" to "StatisticsPending" = deletion request by user for HiveStatisticGenerator
531            // and from "StatisticsPending" to "DeletionPending" = deletion request by HiveStatisticGenerator for EventManager
532            if (job.State == DA.JobState.Online && jobStateEntity == DA.JobState.StatisticsPending) {
533              job.State = jobStateEntity;
534              foreach(var task in job.Tasks
535              .Where(x => x.State == DA.TaskState.Waiting
536                || x.State == DA.TaskState.Paused
537                || x.State == DA.TaskState.Offline)) {
538                task.State = DA.TaskState.Aborted;
539              }
540              pm.SubmitChanges();
541            } else if(job.State == DA.JobState.StatisticsPending && jobStateEntity == DA.JobState.DeletionPending) {
542              job.State = jobStateEntity;
543              pm.SubmitChanges();
544            }
545          }
546        });
547      }
548    }
549
550    public IEnumerable<DT.AssignedJobResource> GetAssignedResourcesForJob(Guid jobId) {
551      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
552      AuthorizationManager.AuthorizeForJob(jobId, DT.Permission.Full);
553      var pm = PersistenceManager;
554      var assignedJobResourceDao = pm.AssignedJobResourceDao;
555      using (new PerformanceLogger("GetAssignedResourcesForProject")) {
556        return pm.UseTransaction(() =>
557          assignedJobResourceDao.GetByJobId(jobId)
558          .Select(x => x.ToDto())
559          .ToList()
560        );
561      }
562    }
563    #endregion
564
565    #region JobPermission Methods
566    public void GrantPermission(Guid jobId, Guid grantedUserId, DT.Permission permission) {
567      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
568      AuthorizationManager.AuthorizeForJob(jobId, Permission.Full);
569      var pm = PersistenceManager;
570      using (new PerformanceLogger("GrantPermission")) {
571        var jobPermissionDao = pm.JobPermissionDao;
572        var currentUserId = UserManager.CurrentUserId;
573        pm.UseTransaction(() => {
574          jobPermissionDao.SetJobPermission(jobId, currentUserId, grantedUserId, permission.ToEntity());
575          pm.SubmitChanges();
576        });
577      }
578    }
579
580    public void RevokePermission(Guid jobId, Guid grantedUserId) {
581      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
582      AuthorizationManager.AuthorizeForJob(jobId, Permission.Full);
583      var pm = PersistenceManager;
584      using (new PerformanceLogger("RevokePermission")) {
585        var jobPermissionDao = pm.JobPermissionDao;
586        var currentUserId = UserManager.CurrentUserId;
587        pm.UseTransaction(() => {
588          jobPermissionDao.SetJobPermission(jobId, currentUserId, grantedUserId, DA.Permission.NotAllowed);
589          pm.SubmitChanges();
590        });
591      }
592    }
593
594    public IEnumerable<JobPermission> GetJobPermissions(Guid jobId) {
595      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
596      AuthorizationManager.AuthorizeForJob(jobId, Permission.Full);
597      var pm = PersistenceManager;
598      using (new PerformanceLogger("GetJobPermissions")) {
599        var jobPermissionDao = pm.JobPermissionDao;
600        return pm.UseTransaction(() => jobPermissionDao.GetByJobId(jobId)
601          .Select(x => x.ToDto())
602          .ToList()
603        );
604      }
605    }
606
607    // BackwardsCompatibility3.3
608    #region Backwards compatible code, remove with 3.4
609    public bool IsAllowedPrivileged() {
610      return true;
611    }
612    #endregion
613    #endregion
614
615    #region Login Methods
616    public void Hello(DT.Slave slaveInfo) {
617      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Slave);
618      if (UserManager.CurrentUser.UserName != "hiveslave") {
619        slaveInfo.OwnerUserId = UserManager.CurrentUserId;
620      }
621      var pm = PersistenceManager;
622      using (new PerformanceLogger("Hello")) {
623        var slaveDao = pm.SlaveDao;
624        pm.UseTransaction(() => {
625          var slave = slaveDao.GetById(slaveInfo.Id);
626          if (slave == null) {
627            slaveDao.Save(slaveInfo.ToEntity());
628          } else {
629            bool oldIsAllowedToCalculate = slave.IsAllowedToCalculate;
630            Guid? oldParentResourceId = slave.ParentResourceId;
631            slaveInfo.CopyToEntity(slave);
632            slave.IsAllowedToCalculate = oldIsAllowedToCalculate;
633            slave.ParentResourceId = oldParentResourceId;
634            slave.LastHeartbeat = DateTime.Now;
635            slave.SlaveState = DA.SlaveState.Idle;
636          }
637          pm.SubmitChanges();
638        });
639      }
640    }
641
642    public void GoodBye(Guid slaveId) {
643      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Slave);
644      var pm = PersistenceManager;
645      using (new PerformanceLogger("GoodBye")) {
646        var slaveDao = pm.SlaveDao;
647        pm.UseTransaction(() => {
648          var slave = slaveDao.GetById(slaveId);
649          if (slave != null) {
650            slave.SlaveState = DA.SlaveState.Offline;
651            pm.SubmitChanges();
652          }
653        });
654      }
655    }
656    #endregion
657
658    #region Heartbeat Methods
659    public List<MessageContainer> Heartbeat(DT.Heartbeat heartbeat) {
660      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Slave);
661      List<MessageContainer> result = new List<MessageContainer>();
662      try {
663        using (new PerformanceLogger("ProcessHeartbeat")) {
664          result = HeartbeatManager.ProcessHeartbeat(heartbeat);
665        }
666      } catch (Exception ex) {
667        DA.LogFactory.GetLogger(this.GetType().Namespace).Log(string.Format("Exception processing Heartbeat: {0}", ex));
668      }
669      if (HeuristicLab.Services.Hive.Properties.Settings.Default.TriggerEventManagerInHeartbeat) {
670        TriggerEventManager(false);
671      }
672      return result;
673    }
674    #endregion
675
676    #region Plugin Methods
677    public DT.Plugin GetPlugin(Guid pluginId) {
678      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
679      var pm = PersistenceManager;
680      using (new PerformanceLogger("GetPlugin")) {
681        var pluginDao = pm.PluginDao;
682        return pm.UseTransaction(() => pluginDao.GetById(pluginId).ToDto());
683      }
684    }
685
686    public Guid AddPlugin(DT.Plugin plugin, List<DT.PluginData> pluginData) {
687      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
688      var pm = PersistenceManager;
689      using (new PerformanceLogger("AddPlugin")) {
690        var pluginDao = pm.PluginDao;
691        plugin.UserId = UserManager.CurrentUserId;
692        plugin.DateCreated = DateTime.Now;
693        return pm.UseTransaction(() => {
694          var pluginEntity = pluginDao.GetByHash(plugin.Hash).SingleOrDefault();
695          if (pluginEntity != null) {
696            throw new FaultException<PluginAlreadyExistsFault>(new PluginAlreadyExistsFault(pluginEntity.PluginId));
697          }
698          pluginEntity = plugin.ToEntity();
699          foreach (var data in pluginData) {
700            data.PluginId = default(Guid); // real id will be assigned from linq2sql
701            pluginEntity.PluginData.Add(data.ToEntity());
702          }
703          pluginDao.Save(pluginEntity);
704          pm.SubmitChanges();
705          return pluginEntity.PluginId;
706        });
707      }
708    }
709
710    public IEnumerable<DT.Plugin> GetPlugins() {
711      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
712      var pm = PersistenceManager;
713      using (new PerformanceLogger("GetPlugins")) {
714        var pluginDao = pm.PluginDao;
715        return pm.UseTransaction(() => pluginDao.GetAll()
716          .Where(x => x.Hash != null)
717          .Select(x => x.ToDto())
718          .ToList()
719        );
720      }
721    }
722
723    public IEnumerable<DT.PluginData> GetPluginDatas(List<Guid> pluginIds) {
724      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
725      var pm = PersistenceManager;
726      using (new PerformanceLogger("GetPluginDatas")) {
727        var pluginDataDao = pm.PluginDataDao;
728        return pm.UseTransaction(() => pluginDataDao.GetAll()
729            .Where(x => pluginIds.Contains(x.PluginId))
730            .Select(x => x.ToDto())
731            .ToList()
732        );
733      }
734    }
735    #endregion
736
737    #region Project Methods
738    public Guid AddProject(DT.Project projectDto) {
739      if (projectDto == null || projectDto.Id != Guid.Empty) return Guid.Empty;
740      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
741      // check if current (non-admin) user is owner of one of projectDto's-parents
742      if (!RoleVerifier.IsInRole(HiveRoles.Administrator)) {
743        if(projectDto.ParentProjectId.HasValue) {
744          AuthorizationManager.AuthorizeForProjectAdministration(projectDto.ParentProjectId.Value, false);
745        } else {
746          throw new SecurityException(NOT_AUTHORIZED_USERPROJECT);
747        }
748      }
749     
750      var pm = PersistenceManager;
751      using (new PerformanceLogger("AddProject")) {
752        var projectDao = pm.ProjectDao;
753
754        return pm.UseTransaction(() => {
755          var project = projectDao.Save(projectDto.ToEntity());
756          project.ProjectPermissions.Clear();
757          project.ProjectPermissions.Add(new DA.ProjectPermission {
758            GrantedUserId = project.OwnerUserId,
759            GrantedByUserId = UserManager.CurrentUserId
760          });
761
762          pm.SubmitChanges();
763          return project.ProjectId;
764        });
765      }
766    }
767
768    public void UpdateProject(DT.Project projectDto) {
769      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
770      // check if current (non-admin) user is owner of the project or the projectDto's-parents
771      if (!RoleVerifier.IsInRole(HiveRoles.Administrator)) {
772        AuthorizationManager.AuthorizeForProjectAdministration(projectDto.Id, false);
773      }
774
775      var pm = PersistenceManager;
776      using (new PerformanceLogger("UpdateProject")) {
777        var projectDao = pm.ProjectDao;
778        var assignedJobResourceDao = pm.AssignedJobResourceDao;
779        pm.UseTransaction(() => {
780          var project = projectDao.GetById(projectDto.Id);
781          if (project != null) { // update existent
782            var formerOwnerId = project.OwnerUserId;
783            projectDto.CopyToEntity(project);
784
785            // if owner has changed...
786            if(formerOwnerId != projectDto.OwnerUserId) {
787              var formerPermissionItem = project.ProjectPermissions.Where(x => x.GrantedUserId == formerOwnerId).FirstOrDefault();
788              if (formerPermissionItem != null) {
789                // remove permissions
790                project.ProjectPermissions.Remove(formerPermissionItem);
791                // remove jobs if former owner is no member of a still permitted group
792                var ugt = GetUserGroupTree();
793                var permittedGuids = new HashSet<Guid>(); // User- and Group-Guids
794                // get all member-Guids of all still permitted groups
795                foreach (var item in project.ProjectPermissions) {
796                  permittedGuids.Add(item.GrantedUserId);
797                  if(ugt.ContainsKey(item.GrantedUserId)) {
798                    ugt[item.GrantedUserId].ToList().ForEach(x => permittedGuids.Add(x));
799                  }
800
801                  // check if former owner Guid is in Member-Guids
802                  // if yes: do nothing, if not do:
803                  if (!permittedGuids.Contains(formerOwnerId)) {
804                    assignedJobResourceDao.DeleteByProjectIdAndUserIds(project.ProjectId, new List<Guid> { formerOwnerId });
805                  }
806                }
807              }
808              project.ProjectPermissions.Add(new DA.ProjectPermission {
809                GrantedUserId = projectDto.OwnerUserId,
810                GrantedByUserId = UserManager.CurrentUserId
811              });
812            }
813
814          } else { // save new
815            var newProject = projectDao.Save(projectDto.ToEntity());
816            newProject.ProjectPermissions.Clear();
817            newProject.ProjectPermissions.Add(new DA.ProjectPermission {
818              GrantedUserId = projectDto.OwnerUserId,
819              GrantedByUserId = UserManager.CurrentUserId
820            });
821          }
822          pm.SubmitChanges();
823        });
824      }
825    }
826
827    public void DeleteProject(Guid projectId) {
828      if (projectId == Guid.Empty) return;
829      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
830      // check if current (non-admin) user is owner of one of the projectDto's-parents
831      if (!RoleVerifier.IsInRole(HiveRoles.Administrator)) {
832        AuthorizationManager.AuthorizeForProjectAdministration(projectId, true);
833      }
834
835      var pm = PersistenceManager;
836      using (new PerformanceLogger("DeleteProject")) {
837        var projectDao = pm.ProjectDao;
838        var jobDao = pm.JobDao;
839        var assignedJobResourceDao = pm.AssignedJobResourceDao;
840        pm.UseTransaction(() => {
841          var projectIds = new HashSet<Guid> { projectId };
842          projectIds.Union(projectDao.GetChildProjectIdsById(projectId));
843
844          var jobs = jobDao.GetByProjectIds(projectIds)
845            .Select(x => x.ToDto())
846            .ToList();
847
848          if(jobs.Count > 0) {
849            throw new InvalidOperationException("There are " + jobs.Count + " job(s) using this project and/or child-projects. It is necessary to delete them before the project.");
850          } else {
851            assignedJobResourceDao.DeleteByProjectIds(projectIds);
852            projectDao.DeleteByIds(projectIds);
853            pm.SubmitChanges();
854          }
855        });
856      }
857    }
858
859    // query granted project for use (i.e. to calculate on)
860    public DT.Project GetProject(Guid projectId) {
861      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
862      var pm = PersistenceManager;
863      using (new PerformanceLogger("GetProject")) {
864        var projectDao = pm.ProjectDao;
865        var currentUserId = UserManager.CurrentUserId;
866        var userAndGroupIds = new List<Guid> { currentUserId };
867        userAndGroupIds.AddRange(UserManager.GetUserGroupIdsOfUser(currentUserId));
868        return pm.UseTransaction(() => {
869          return projectDao.GetUsageGrantedProjectsForUser(userAndGroupIds)
870          .Where(x => x.ProjectId == projectId)
871          .Select(x => x.ToDto())
872          .SingleOrDefault();
873        });
874      }
875    }
876
877    // query granted projects for use (i.e. to calculate on)
878    public IEnumerable<DT.Project> GetProjects() {
879      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
880      var pm = PersistenceManager;
881      using (new PerformanceLogger("GetProjects")) {
882        var projectDao = pm.ProjectDao;
883        var currentUserId = UserManager.CurrentUserId;
884        var userAndGroupIds = new List<Guid> { currentUserId };
885        userAndGroupIds.AddRange(UserManager.GetUserGroupIdsOfUser(currentUserId));
886        return pm.UseTransaction(() => {
887          var projects = projectDao.GetUsageGrantedProjectsForUser(userAndGroupIds)
888            .Select(x => x.ToDto()).ToList();
889          var now = DateTime.Now;
890          return projects.Where(x => x.StartDate <= now && x.EndDate >= now).ToList();
891        });
892      }
893    }
894
895    public IEnumerable<DT.Project> GetProjectsForAdministration() {
896      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
897      bool isAdministrator = RoleVerifier.IsInRole(HiveRoles.Administrator);
898      var pm = PersistenceManager;
899      using (new PerformanceLogger("GetProjectsForAdministration")) {
900        var projectDao = pm.ProjectDao;
901       
902        return pm.UseTransaction(() => {
903          if(isAdministrator) {
904            return projectDao.GetAll().Select(x => x.ToDto()).ToList();
905          } else {
906            var currentUserId = UserManager.CurrentUserId;
907            return projectDao.GetAdministrationGrantedProjectsForUser(currentUserId)
908              .Select(x => x.ToDto()).ToList();
909
910          }
911        });
912      }
913    }
914
915    public IDictionary<Guid, HashSet<Guid>> GetProjectGenealogy() {
916      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
917      var pm = PersistenceManager;
918      using(new PerformanceLogger("GetProjectGenealogy")) {
919        var projectDao = pm.ProjectDao;
920        var projectAncestors = new Dictionary<Guid, HashSet<Guid>>();
921        return pm.UseTransaction(() => {
922          var projects = projectDao.GetAll().ToList();
923          projects.ForEach(p => projectAncestors.Add(p.ProjectId, new HashSet<Guid>()));
924          foreach (var p in projects) {
925            var parentProject = p.ParentProject;
926            while(parentProject != null) {
927              projectAncestors[p.ProjectId].Add(parentProject.ProjectId);
928              parentProject = parentProject.ParentProject;
929            }
930          }
931          return projectAncestors;
932        });
933      }
934    }
935    #endregion
936
937    #region ProjectPermission Methods
938    public void SaveProjectPermissions(Guid projectId, List<Guid> grantedUserIds, bool reassign, bool cascading, bool reassignCascading) {
939      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
940      if (projectId == null || grantedUserIds == null) return;
941      AuthorizationManager.AuthorizeForProjectAdministration(projectId, false);
942      var pm = PersistenceManager;
943      using (new PerformanceLogger("SaveProjectPermissions")) {
944        var projectDao = pm.ProjectDao;
945        var projectPermissionDao = pm.ProjectPermissionDao;
946        var assignedJobResourceDao = pm.AssignedJobResourceDao;
947
948        pm.UseTransaction(() => {
949          var project = projectDao.GetById(projectId);
950          if (project == null) return;
951          var projectPermissions = project.ProjectPermissions.Select(x => x.GrantedUserId).ToArray();
952          //var addedPermissions = grantedUserIds.Except(projectPermissions);
953          var removedPermissions = projectPermissions.Except(grantedUserIds);
954
955          // remove job assignments and project permissions
956          if (reassign) {
957            assignedJobResourceDao.DeleteByProjectId(project.ProjectId);
958            project.ProjectPermissions.Clear();
959          } else {
960
961            var ugt = GetUserGroupTree();
962            var permittedGuids = new HashSet<Guid>(); // User- and Group-Guids
963            var notpermittedGuids = new HashSet<Guid>();
964
965            // remove job assignments:
966            // (1) get all member-Guids of all still or fresh permitted user/groups
967            foreach (var item in grantedUserIds) {
968              permittedGuids.Add(item);
969              if (ugt.ContainsKey(item)) {
970                ugt[item].ToList().ForEach(x => permittedGuids.Add(x));
971              }
972            }
973
974            // (2) get all member-Guids of users and groups in removedPermissions
975            foreach (var item in removedPermissions) {
976              notpermittedGuids.Add(item);
977              if (ugt.ContainsKey(item)) {
978                ugt[item].ToList().ForEach(x => notpermittedGuids.Add(x));
979              }
980            }
981
982            // (3) get all Guids which are in removedPermissions but not in grantedUserIds
983            var definatelyNotPermittedGuids = notpermittedGuids.Except(permittedGuids);
984
985            // (4) delete jobs of those
986            assignedJobResourceDao.DeleteByProjectIdAndUserIds(project.ProjectId, definatelyNotPermittedGuids);
987
988
989            // remove project permissions
990            foreach (var item in project.ProjectPermissions
991              .Where(x => removedPermissions.Contains(x.GrantedUserId))
992              .ToList()) {
993              project.ProjectPermissions.Remove(item);
994            }
995          }
996          pm.SubmitChanges();
997
998          // add project permissions
999          foreach (var id in grantedUserIds) {
1000            if(project.ProjectPermissions.All(x => x.GrantedUserId != id)) {
1001              project.ProjectPermissions.Add(new DA.ProjectPermission {
1002                GrantedUserId = id,
1003                GrantedByUserId = UserManager.CurrentUserId
1004              });
1005            }
1006          }
1007          pm.SubmitChanges();
1008
1009          if (cascading) {
1010            var childProjects = projectDao.GetChildProjectsById(projectId).ToList();
1011            var childProjectIds = childProjects.Select(x => x.ProjectId).ToList();
1012
1013            // remove job assignments
1014            if (reassignCascading) {
1015              assignedJobResourceDao.DeleteByProjectIds(childProjectIds);
1016            } else {
1017              assignedJobResourceDao.DeleteByProjectIdsAndUserIds(childProjectIds, removedPermissions);
1018            }
1019
1020            foreach(var p in childProjects) {
1021              // remove project permissions
1022              if(reassignCascading) {
1023                p.ProjectPermissions.Clear();
1024              } else {
1025                foreach(var item in p.ProjectPermissions
1026                  .Where(x => removedPermissions.Contains(x.GrantedUserId))
1027                  .ToList()) {
1028                  p.ProjectPermissions.Remove(item);
1029                }
1030              }
1031              pm.SubmitChanges();
1032
1033              // add project permissions
1034              foreach (var id in grantedUserIds) {
1035                if (p.ProjectPermissions.All(x => x.GrantedUserId != id)) {
1036                  p.ProjectPermissions.Add(new DA.ProjectPermission {
1037                    GrantedUserId = id,
1038                    GrantedByUserId = UserManager.CurrentUserId
1039                  });
1040                }
1041              }
1042            }
1043          }
1044          pm.SubmitChanges();
1045        });
1046      }
1047    }
1048
1049    //private void GrantProjectPermissions(Guid projectId, List<Guid> grantedUserIds, bool cascading) {
1050    //  throw new NotImplementedException();
1051    //}
1052
1053    //private void RevokeProjectPermissions(Guid projectId, List<Guid> grantedUserIds, bool cascading) {
1054    //  RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1055    //  if (projectId == null || grantedUserIds == null || !grantedUserIds.Any()) return;
1056    //  AuthorizationManager.AuthorizeForProjectAdministration(projectId, false);
1057    //  var pm = PersistenceManager;
1058    //  using (new PerformanceLogger("RevokeProjectPermissions")) {
1059    //    var projectPermissionDao = pm.ProjectPermissionDao;
1060    //    var projectDao = pm.ProjectDao;
1061    //    var assignedJobResourceDao = pm.AssignedJobResourceDao;
1062    //    pm.UseTransaction(() => {
1063    //      if (cascading) {
1064    //        var childProjectIds = projectDao.GetChildProjectIdsById(projectId).ToList();
1065    //        projectPermissionDao.DeleteByProjectIdsAndGrantedUserIds(childProjectIds, grantedUserIds);
1066    //        assignedJobResourceDao.DeleteByProjectIdsAndUserIds(childProjectIds, grantedUserIds);
1067    //      }
1068    //      projectPermissionDao.DeleteByProjectIdAndGrantedUserIds(projectId, grantedUserIds);
1069    //      assignedJobResourceDao.DeleteByProjectIdAndUserIds(projectId, grantedUserIds);
1070    //      pm.SubmitChanges();
1071    //    });
1072    //  }
1073    //}
1074
1075    public IEnumerable<DT.ProjectPermission> GetProjectPermissions(Guid projectId) {
1076      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1077      AuthorizationManager.AuthorizeForProjectAdministration(projectId, false);
1078      var pm = PersistenceManager;
1079      using (new PerformanceLogger("GetProjectPermissions")) {
1080        var projectPermissionDao = pm.ProjectPermissionDao;
1081        return pm.UseTransaction(() => projectPermissionDao.GetByProjectId(projectId)
1082          .Select(x => x.ToDto())
1083          .ToList()
1084        );
1085      }
1086    }
1087    #endregion
1088
1089    #region AssignedProjectResource Methods
1090    // basic: remove and add assignments (resourceIds) to projectId and its depending jobs
1091    // reassign: clear all assignments from project and its depending jobs, before adding new ones (resourceIds)
1092    // cascading: "basic" mode for child-projects
1093    // reassignCascading: "reassign" mode for child-projects
1094    public void SaveProjectResourceAssignments(Guid projectId, List<Guid> resourceIds, bool reassign, bool cascading, bool reassignCascading) {
1095      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1096      if (projectId == null || resourceIds == null) return;
1097      AuthorizationManager.AuthorizeForProjectResourceAdministration(projectId, resourceIds);
1098      var pm = PersistenceManager;
1099      using (new PerformanceLogger("SaveProjectResourceAssignments")) {
1100        var projectDao = pm.ProjectDao;
1101        var assignedProjectResourceDao = pm.AssignedProjectResourceDao;
1102        var assignedJobResourceDao = pm.AssignedJobResourceDao;
1103        pm.UseTransaction(() => {
1104          var project = projectDao.GetById(projectId);
1105          var assignedResources = project.AssignedProjectResources.Select(x => x.ResourceId).ToArray();
1106          var removedAssignments = assignedResources.Except(resourceIds);
1107
1108          // remove job and project assignments
1109          if (reassign) {
1110            assignedJobResourceDao.DeleteByProjectId(project.ProjectId);
1111            project.AssignedProjectResources.Clear();
1112          } else {
1113            assignedJobResourceDao.DeleteByProjectIdAndResourceIds(projectId, removedAssignments);
1114            foreach (var item in project.AssignedProjectResources
1115              .Where(x => removedAssignments.Contains(x.ResourceId))
1116              .ToList()) {
1117              project.AssignedProjectResources.Remove(item);
1118            }
1119          }
1120          pm.SubmitChanges();
1121
1122          // add project assignments
1123          foreach (var id in resourceIds) {
1124            if (project.AssignedProjectResources.All(x => x.ResourceId != id)) {
1125              project.AssignedProjectResources.Add(new DA.AssignedProjectResource {
1126                ResourceId = id
1127              });
1128            }
1129          }
1130          pm.SubmitChanges();
1131
1132          if (cascading) {
1133            var childProjects = projectDao.GetChildProjectsById(projectId).ToList();
1134
1135            // remove job assignments
1136            if (reassignCascading) {
1137              assignedJobResourceDao.DeleteByProjectIds(childProjects.Select(x => x.ProjectId).ToList());
1138            } else {
1139              var childProjectIds = childProjects.Select(x => x.ProjectId).ToList();
1140              assignedJobResourceDao.DeleteByProjectIdsAndResourceIds(childProjectIds, removedAssignments);
1141            }
1142            foreach (var p in childProjects) {
1143              // remove project assignments
1144              if (reassignCascading) {
1145                p.AssignedProjectResources.Clear();
1146              } else {
1147                foreach (var item in p.AssignedProjectResources
1148                  .Where(x => removedAssignments.Contains(x.ResourceId))
1149                  .ToList()) {
1150                  p.AssignedProjectResources.Remove(item);
1151                }
1152              }
1153              pm.SubmitChanges();
1154
1155              // add project assignments
1156              foreach (var id in resourceIds) {
1157                if(p.AssignedProjectResources.All(x => x.ResourceId != id)) {
1158                  p.AssignedProjectResources.Add(new DA.AssignedProjectResource {
1159                    ResourceId = id
1160                  });
1161                }
1162              }
1163            }
1164          }
1165          pm.SubmitChanges();
1166        });
1167      }
1168    }
1169
1170    //private void AssignProjectResources(Guid projectId, List<Guid> resourceIds, bool cascading) {
1171    //  throw new NotImplementedException();
1172    //}
1173
1174    //private void UnassignProjectResources(Guid projectId, List<Guid> resourceIds, bool cascading) {
1175    //  RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1176    //  if (projectId == null || resourceIds == null || !resourceIds.Any()) return;
1177    //  AuthorizationManager.AuthorizeForProjectResourceAdministration(projectId, resourceIds);
1178    //  var pm = PersistenceManager;
1179    //  using (new PerformanceLogger("UnassignProjectResources")) {
1180    //    var assignedProjectResourceDao = pm.AssignedProjectResourceDao;
1181    //    var assignedJobResourceDao = pm.AssignedJobResourceDao;
1182    //    var projectDao = pm.ProjectDao;
1183    //    pm.UseTransaction(() => {
1184    //      if (cascading) {
1185    //        var childProjectIds = projectDao.GetChildProjectIdsById(projectId).ToList();
1186    //        assignedProjectResourceDao.DeleteByProjectIdsAndResourceIds(childProjectIds, resourceIds);
1187    //        assignedJobResourceDao.DeleteByProjectIdsAndResourceIds(childProjectIds, resourceIds);
1188    //      }
1189    //      assignedProjectResourceDao.DeleteByProjectIdAndResourceIds(projectId, resourceIds);
1190    //      assignedJobResourceDao.DeleteByProjectIdAndResourceIds(projectId, resourceIds);
1191    //      pm.SubmitChanges();
1192    //    });
1193    //  }
1194    //}
1195
1196    public IEnumerable<DT.AssignedProjectResource> GetAssignedResourcesForProject(Guid projectId) {
1197      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1198      AuthorizationManager.AuthorizeUserForProjectUse(UserManager.CurrentUserId, projectId);
1199      var pm = PersistenceManager;
1200      using (new PerformanceLogger("GetAssignedResourcesForProject")) {
1201        var assignedProjectResourceDao = pm.AssignedProjectResourceDao;
1202        return pm.UseTransaction(() => assignedProjectResourceDao.GetByProjectId(projectId)
1203          .Select(x => x.ToDto())
1204          .ToList()
1205        );
1206      }
1207    }
1208
1209    public IEnumerable<DT.AssignedProjectResource> GetAssignedResourcesForProjectAdministration(Guid projectId) {
1210      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1211      AuthorizationManager.AuthorizeForProjectAdministration(projectId, false);
1212      var pm = PersistenceManager;
1213      using (new PerformanceLogger("GetAssignedResourcesForProject")) {
1214        var assignedProjectResourceDao = pm.AssignedProjectResourceDao;
1215        return pm.UseTransaction(() => assignedProjectResourceDao.GetByProjectId(projectId)
1216          .Select(x => x.ToDto())
1217          .ToList()
1218        );
1219      }
1220    }
1221
1222    public IEnumerable<DT.AssignedProjectResource> GetAssignedResourcesForProjectsAdministration(IEnumerable<Guid> projectIds) {
1223      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1224      foreach(var id in projectIds)
1225        AuthorizationManager.AuthorizeForProjectAdministration(id, false);
1226
1227      var pm = PersistenceManager;
1228      using (new PerformanceLogger("GetAssignedResourcesForProject")) {
1229        var assignedProjectResourceDao = pm.AssignedProjectResourceDao;
1230        var assignments = new List<DT.AssignedProjectResource>();
1231        pm.UseTransaction(() => {
1232          foreach (var id in projectIds) {
1233            assignments.AddRange(assignedProjectResourceDao.GetByProjectId(id)
1234              .Select(x => x.ToDto()));
1235          }
1236        });
1237        return assignments.Distinct();
1238      }
1239    }
1240
1241    #endregion
1242
1243    #region Slave Methods
1244    public Guid AddSlave(DT.Slave slaveDto) {
1245      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
1246      var pm = PersistenceManager;
1247      using (new PerformanceLogger("AddSlave")) {
1248        var slaveDao = pm.SlaveDao;
1249        return pm.UseTransaction(() => {
1250          var slave = slaveDao.Save(slaveDto.ToEntity());
1251          pm.SubmitChanges();
1252          return slave.ResourceId;
1253        });
1254      }
1255    }
1256
1257    public Guid AddSlaveGroup(DT.SlaveGroup slaveGroupDto) {
1258      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
1259      var pm = PersistenceManager;
1260      using (new PerformanceLogger("AddSlaveGroup")) {
1261        var slaveGroupDao = pm.SlaveGroupDao;
1262        return pm.UseTransaction(() => {
1263          if (slaveGroupDto.Id == Guid.Empty) {
1264            slaveGroupDto.Id = Guid.NewGuid();
1265          }
1266          var slaveGroup = slaveGroupDao.Save(slaveGroupDto.ToEntity());
1267          pm.SubmitChanges();
1268          return slaveGroup.ResourceId;
1269        });
1270      }
1271    }
1272
1273    public DT.Slave GetSlave(Guid slaveId) {
1274      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
1275      var pm = PersistenceManager;
1276      using (new PerformanceLogger("GetSlave")) {
1277        var slaveDao = pm.SlaveDao;
1278        return pm.UseTransaction(() => slaveDao.GetById(slaveId).ToDto());
1279      }
1280    }
1281
1282    // query granted slaves for use (i.e. to calculate on)
1283    public IEnumerable<DT.Slave> GetSlaves() {
1284      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1285      var pm = PersistenceManager;
1286      using (new PerformanceLogger("GetSlaves")) {
1287        var slaveDao = pm.SlaveDao;
1288        var projectDao = pm.ProjectDao;
1289        var assignedProjectResourceDao = pm.AssignedProjectResourceDao;
1290
1291        // collect user information
1292        var currentUserId = UserManager.CurrentUserId;
1293        var userAndGroupIds = new List<Guid> { currentUserId };
1294        userAndGroupIds.AddRange(UserManager.GetUserGroupIdsOfUser(currentUserId));
1295
1296        return pm.UseTransaction(() => {
1297          var slaves = slaveDao.GetAll()
1298            .Select(x => x.ToDto())
1299            .ToList();
1300          var grantedProjectIds = projectDao.GetUsageGrantedProjectsForUser(userAndGroupIds)
1301            .Select(x => x.ProjectId)
1302            .ToList();
1303          var grantedResourceIds = assignedProjectResourceDao.GetAllGrantedResourcesByProjectIds(grantedProjectIds)
1304            .Select(x => x.ResourceId)
1305            .ToList();
1306
1307          return slaves
1308            .Where(x => grantedResourceIds.Contains(x.Id))
1309            .ToList();
1310        });
1311      }
1312    }
1313
1314    // query granted slave groups for use (i.e. to calculate on)
1315    public IEnumerable<DT.SlaveGroup> GetSlaveGroups() {
1316      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1317      var pm = PersistenceManager;
1318      using (new PerformanceLogger("GetSlaveGroups")) {
1319        var slaveGroupDao = pm.SlaveGroupDao;
1320        var projectDao = pm.ProjectDao;
1321        var assignedProjectResourceDao = pm.AssignedProjectResourceDao;
1322
1323        // collect user information
1324        var currentUserId = UserManager.CurrentUserId;
1325        var userAndGroupIds = new List<Guid> { currentUserId };
1326        userAndGroupIds.AddRange(UserManager.GetUserGroupIdsOfUser(currentUserId));
1327
1328        return pm.UseTransaction(() => {
1329          var slaveGroups = slaveGroupDao.GetAll()
1330            .Select(x => x.ToDto())
1331            .ToList();
1332          var grantedProjectIds = projectDao.GetUsageGrantedProjectsForUser(userAndGroupIds)
1333            .Select(x => x.ProjectId)
1334            .ToList();
1335          var grantedResourceIds = assignedProjectResourceDao.GetAllGrantedResourcesByProjectIds(grantedProjectIds)
1336            .Select(x => x.ResourceId)
1337            .ToList();
1338
1339          return slaveGroups
1340            .Where(x => grantedResourceIds.Contains(x.Id))
1341            .ToList();
1342        });
1343      }
1344    }
1345
1346    // query granted slaves for resource administration
1347    public IEnumerable<DT.Slave> GetSlavesForAdministration() {
1348      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1349      bool isAdministrator = RoleVerifier.IsInRole(HiveRoles.Administrator);
1350      var pm = PersistenceManager;
1351      using (new PerformanceLogger("GetSlavesForAdministration")) {
1352        var slaveDao = pm.SlaveDao;
1353        var currentUserId = UserManager.CurrentUserId;
1354
1355        if (isAdministrator) {
1356          return pm.UseTransaction(() => {
1357            return slaveDao.GetAll()
1358              .Select(x => x.ToDto())
1359              .ToList();
1360          });
1361        } else {
1362          var slaves = slaveDao.GetAll()
1363            .Select(x => x.ToDto())
1364            .ToList();
1365          var projectDao = pm.ProjectDao;
1366          var assignedProjectResourceDao = pm.AssignedProjectResourceDao;
1367          var projects = projectDao.GetAdministrationGrantedProjectsForUser(currentUserId).ToList();
1368          var resourceIds = assignedProjectResourceDao
1369            .GetAllGrantedResourcesByProjectIds(projects.Select(x => x.ProjectId).ToList())
1370            .Select(x => x.ResourceId)
1371            .ToList();
1372
1373          return slaves
1374            .Where(x => resourceIds.Contains(x.Id))
1375            .ToList();
1376        }
1377      }
1378    }
1379
1380    // query granted slave groups for resource administration
1381    public IEnumerable<DT.SlaveGroup> GetSlaveGroupsForAdministration() {
1382      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1383      bool isAdministrator = RoleVerifier.IsInRole(HiveRoles.Administrator);
1384      var pm = PersistenceManager;
1385      using (new PerformanceLogger("GetSlaveGroupsForAdministration")) {
1386        var slaveGroupDao = pm.SlaveGroupDao;
1387        var currentUserId = UserManager.CurrentUserId;
1388
1389        if (isAdministrator) {
1390          return pm.UseTransaction(() => {
1391            return slaveGroupDao.GetAll()
1392              .Select(x => x.ToDto())
1393              .ToList();
1394          });
1395        } else {
1396          var slaveGroups = slaveGroupDao.GetAll()
1397            .Select(x => x.ToDto())
1398            .ToList();
1399          var projectDao = pm.ProjectDao;
1400          var assignedProjectResourceDao = pm.AssignedProjectResourceDao;
1401          var projects = projectDao.GetAdministrationGrantedProjectsForUser(currentUserId).ToList();
1402          var resourceIds = assignedProjectResourceDao
1403            .GetAllGrantedResourcesByProjectIds(projects.Select(x => x.ProjectId).ToList())
1404            .Select(x => x.ResourceId)
1405            .ToList();
1406
1407          return slaveGroups
1408            .Where(x => resourceIds.Contains(x.Id))
1409            .ToList();
1410        }
1411      }
1412    }
1413
1414    public IDictionary<Guid, HashSet<Guid>> GetResourceGenealogy() {
1415      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1416      var pm = PersistenceManager;
1417      using (new PerformanceLogger("GetResourceGenealogy")) {
1418        var resourceDao = pm.ResourceDao;
1419        var resourceAncestors = new Dictionary<Guid, HashSet<Guid>>();
1420        return pm.UseTransaction(() => {
1421          var resources = resourceDao.GetAll().ToList();
1422          resources.ForEach(r => resourceAncestors.Add(r.ResourceId, new HashSet<Guid>()));
1423         
1424          foreach(var r in resources) {
1425            var parentResource = r.ParentResource;
1426            while(parentResource != null) {
1427              resourceAncestors[r.ResourceId].Add(parentResource.ResourceId);
1428              parentResource = parentResource.ParentResource;
1429            }
1430          }
1431          return resourceAncestors;
1432        });
1433      }
1434    }
1435
1436    public void UpdateSlave(DT.Slave slaveDto) {
1437      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1438      if (slaveDto == null) return;
1439      AuthorizationManager.AuthorizeForResourceAdministration(slaveDto.Id);
1440      var pm = PersistenceManager;
1441      using (new PerformanceLogger("UpdateSlave")) {
1442        var slaveDao = pm.SlaveDao;
1443        pm.UseTransaction(() => {
1444          var slave = slaveDao.GetById(slaveDto.Id);
1445          if (slave != null) {
1446            slaveDto.CopyToEntity(slave);
1447          } else {
1448            slaveDao.Save(slaveDto.ToEntity());
1449          }
1450          pm.SubmitChanges();
1451        });
1452      }
1453    }
1454
1455    public void UpdateSlaveGroup(DT.SlaveGroup slaveGroupDto) {
1456      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1457      if (slaveGroupDto == null) return;
1458      AuthorizationManager.AuthorizeForResourceAdministration(slaveGroupDto.Id);
1459      var pm = PersistenceManager;
1460      using (new PerformanceLogger("UpdateSlaveGroup")) {
1461        var slaveGroupDao = pm.SlaveGroupDao;
1462        pm.UseTransaction(() => {
1463          var slaveGroup = slaveGroupDao.GetById(slaveGroupDto.Id);
1464          if (slaveGroup != null) {
1465            slaveGroupDto.CopyToEntity(slaveGroup);
1466          } else {
1467            slaveGroupDao.Save(slaveGroupDto.ToEntity());
1468          }
1469          pm.SubmitChanges();
1470        });
1471      }
1472    }
1473
1474    public void DeleteSlave(Guid slaveId) {
1475      if (slaveId == Guid.Empty) return;
1476      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1477      AuthorizationManager.AuthorizeForResourceAdministration(slaveId);
1478      var pm = PersistenceManager;
1479      using (new PerformanceLogger("DeleteSlave")) {
1480        var slaveDao = pm.SlaveDao;
1481        pm.UseTransaction(() => {
1482          slaveDao.Delete(slaveId);
1483          pm.SubmitChanges();
1484        });
1485      }
1486    }
1487
1488    public void DeleteSlaveGroup(Guid slaveGroupId) {
1489      if (slaveGroupId == Guid.Empty) return;
1490      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1491      AuthorizationManager.AuthorizeForResourceAdministration(slaveGroupId);
1492      var pm = PersistenceManager;
1493      using (new PerformanceLogger("DeleteSlaveGroup")) {
1494        var resourceDao = pm.ResourceDao;
1495        pm.UseTransaction(() => {
1496          var resourceIds = new HashSet<Guid> { slaveGroupId };
1497          resourceIds.Union(resourceDao.GetChildResourceIdsById(slaveGroupId));
1498          resourceDao.DeleteByIds(resourceIds);
1499          pm.SubmitChanges();
1500        });
1501      }
1502    }
1503
1504    public void AddResourceToGroup(Guid slaveGroupId, Guid resourceId) {
1505      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
1506      var pm = PersistenceManager;
1507      using (new PerformanceLogger("AddResourceToGroup")) {
1508        var resourceDao = pm.ResourceDao;
1509        pm.UseTransaction(() => {
1510          var resource = resourceDao.GetById(resourceId);
1511          resource.ParentResourceId = slaveGroupId;
1512          pm.SubmitChanges();
1513        });
1514      }
1515    }
1516
1517    public void RemoveResourceFromGroup(Guid slaveGroupId, Guid resourceId) {
1518      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
1519      var pm = PersistenceManager;
1520      using (new PerformanceLogger("RemoveResourceFromGroup")) {
1521        var resourceDao = pm.ResourceDao;
1522        pm.UseTransaction(() => {
1523          var resource = resourceDao.GetById(resourceId);
1524          resource.ParentResourceId = null;
1525          pm.SubmitChanges();
1526        });
1527      }
1528    }
1529
1530    public Guid GetResourceId(string resourceName) {
1531      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1532      var pm = PersistenceManager;
1533      using (new PerformanceLogger("GetResourceId")) {
1534        var resourceDao = pm.ResourceDao;
1535        return pm.UseTransaction(() => {
1536          var resource = resourceDao.GetByName(resourceName);
1537          return resource != null ? resource.ResourceId : Guid.Empty;
1538        });
1539      }
1540    }
1541
1542    public void TriggerEventManager(bool force) {
1543      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
1544      // use a serializable transaction here to ensure not two threads execute this simultaniously (mutex-lock would not work since IIS may use multiple AppDomains)
1545      bool cleanup;
1546      var pm = PersistenceManager;
1547      using (new PerformanceLogger("TriggerEventManager")) {
1548        cleanup = false;
1549        var lifecycleDao = pm.LifecycleDao;
1550        pm.UseTransaction(() => {
1551          var lastLifecycle = lifecycleDao.GetLastLifecycle();
1552          DateTime lastCleanup = lastLifecycle != null ? lastLifecycle.LastCleanup : DateTime.MinValue;
1553          if (force || DateTime.Now - lastCleanup > HeuristicLab.Services.Hive.Properties.Settings.Default.CleanupInterval) {
1554            lifecycleDao.UpdateLifecycle();
1555            cleanup = true;
1556            pm.SubmitChanges();
1557          }
1558        }, true);
1559      }
1560      if (cleanup) {
1561        EventManager.Cleanup();
1562      }
1563    }
1564
1565    public int GetNewHeartbeatInterval(Guid slaveId) {
1566      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Slave);
1567      var pm = PersistenceManager;
1568      using (new PerformanceLogger("GetNewHeartbeatInterval")) {
1569        var slaveDao = pm.SlaveDao;
1570        return pm.UseTransaction(() => {
1571          var slave = slaveDao.GetById(slaveId);
1572          if (slave != null) {
1573            return slave.HbInterval;
1574          }
1575          return -1;
1576        });
1577      }
1578    }
1579    #endregion
1580
1581    #region Downtime Methods
1582    public Guid AddDowntime(DT.Downtime downtimeDto) {
1583      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1584      AuthorizationManager.AuthorizeForResourceAdministration(downtimeDto.ResourceId);
1585      var pm = PersistenceManager;
1586      using (new PerformanceLogger("AddDowntime")) {
1587        var downtimeDao = pm.DowntimeDao;
1588        return pm.UseTransaction(() => {
1589          var downtime = downtimeDao.Save(downtimeDto.ToEntity());
1590          pm.SubmitChanges();
1591          return downtime.ResourceId;
1592        });
1593      }
1594    }
1595
1596    public void DeleteDowntime(Guid downtimeId) {
1597      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1598      var pm = PersistenceManager;
1599      using (new PerformanceLogger("DeleteDowntime")) {
1600        var downtimeDao = pm.DowntimeDao;
1601        pm.UseTransaction(() => {
1602          downtimeDao.Delete(downtimeId);
1603          pm.SubmitChanges();
1604        });
1605      }
1606    }
1607
1608    public void UpdateDowntime(DT.Downtime downtimeDto) {
1609      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1610      AuthorizationManager.AuthorizeForResourceAdministration(downtimeDto.ResourceId);
1611      var pm = PersistenceManager;
1612      using (new PerformanceLogger("UpdateDowntime")) {
1613        var downtimeDao = pm.DowntimeDao;
1614        pm.UseTransaction(() => {
1615          var downtime = downtimeDao.GetById(downtimeDto.Id);
1616          if (downtime != null) {
1617            downtimeDto.CopyToEntity(downtime);
1618          } else {
1619            downtimeDao.Save(downtimeDto.ToEntity());
1620          }
1621          pm.SubmitChanges();
1622        });
1623      }
1624    }
1625
1626    public IEnumerable<DT.Downtime> GetDowntimesForResource(Guid resourceId) {
1627      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1628      var pm = PersistenceManager;
1629      using (new PerformanceLogger("GetDowntimesForResource")) {
1630        var downtimeDao = pm.DowntimeDao;
1631        return pm.UseTransaction(() => downtimeDao.GetByResourceId(resourceId)
1632          .Select(x => x.ToDto())
1633          .ToList()
1634        );
1635      }
1636    }
1637    #endregion
1638
1639    #region User Methods
1640    public string GetUsernameByUserId(Guid userId) {
1641      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1642      var user = UserManager.GetUserById(userId);
1643      return user != null ? user.UserName : null;
1644    }
1645
1646    public Guid GetUserIdByUsername(string username) {
1647      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1648      var user = ServiceLocator.Instance.UserManager.GetUserByName(username);
1649      return user != null ? (Guid?)user.ProviderUserKey ?? Guid.Empty : Guid.Empty;
1650    }
1651   
1652    public Dictionary<Guid, HashSet<Guid>> GetUserGroupTree() {
1653      var userGroupTree = new Dictionary<Guid, HashSet<Guid>>();
1654      var userGroupMapping = UserManager.GetUserGroupMapping();
1655
1656      foreach(var ugm in userGroupMapping) {
1657        if (ugm.Parent == null || ugm.Child == null) continue;
1658
1659        if (!userGroupTree.ContainsKey(ugm.Parent)) {
1660          userGroupTree.Add(ugm.Parent, new HashSet<Guid>());
1661        }
1662        userGroupTree[ugm.Parent].Add(ugm.Child);
1663      }
1664
1665      return userGroupTree;
1666    }
1667
1668    public bool CheckAccessToAdminAreaGranted() {
1669      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1670      bool isAdministrator = RoleVerifier.IsInRole(HiveRoles.Administrator);
1671      var pm = PersistenceManager;
1672      using(new PerformanceLogger("CheckAccessToAdminAreaGranted")) {
1673        if (isAdministrator) {
1674          return true;
1675        } else {
1676          var projectDao = pm.ProjectDao;
1677          var currentUserId = UserManager.CurrentUserId;
1678          return projectDao.GetAdministrationGrantedProjectsForUser(currentUserId).Any();
1679        }
1680      }
1681    }
1682    #endregion
1683
1684    #region UserPriorities Methods
1685    public IEnumerable<DT.UserPriority> GetUserPriorities() {
1686      var pm = PersistenceManager;
1687      using (new PerformanceLogger("GetUserPriorities")) {
1688        var userPriorityDao = pm.UserPriorityDao;
1689        return pm.UseTransaction(() => userPriorityDao.GetAll()
1690          .Select(x => x.ToDto())
1691          .ToList()
1692        );
1693      }
1694    }
1695    #endregion
1696
1697    #region Private Helper Methods
1698    private void UpdateTaskState(IPersistenceManager pm, DA.Task task, DT.TaskState taskState, Guid? slaveId, Guid? userId, string exception) {
1699      var stateLogDao = pm.StateLogDao;
1700      var taskStateEntity = taskState.ToEntity();
1701
1702      if (task.State == DA.TaskState.Transferring && taskStateEntity == DA.TaskState.Paused && task.Command == null) {
1703        // slave paused and uploaded the task (no user-command) -> set waiting.
1704        taskStateEntity = DA.TaskState.Waiting;
1705      }
1706
1707      stateLogDao.Save(new DA.StateLog {
1708        State = taskStateEntity,
1709        DateTime = DateTime.Now,
1710        TaskId = task.TaskId,
1711        UserId = userId,
1712        SlaveId = slaveId,
1713        Exception = exception
1714      });
1715
1716      task.State = taskStateEntity;
1717
1718      if (task.Command == DA.Command.Pause && task.State == DA.TaskState.Paused
1719          || task.Command == DA.Command.Abort && task.State == DA.TaskState.Aborted
1720          || task.Command == DA.Command.Stop && task.State == DA.TaskState.Aborted) {
1721        task.Command = null;
1722      }
1723    }
1724
1725    private void CheckProjectAvailability(IPersistenceManager pm, Guid projectId, DateTime date) {
1726      var projectDao = pm.ProjectDao;
1727      using (new PerformanceLogger("UpdateJob")) {
1728        var project = pm.UseTransaction(() => {
1729          return projectDao.GetById(projectId);
1730        });
1731        if (project != null) {
1732          if (project.StartDate > date) throw new ArgumentException("Cannot add job to specified project. The start date of the project is still in the future.");
1733          else if (project.EndDate < date) throw new ArgumentException("Cannot add job to specified project. The end date of the project is already in the past.");
1734        } else {
1735          throw new ArgumentException("Cannot add job to specified project. The project seems not to be available anymore.");
1736        }
1737      }
1738    }
1739
1740    #endregion
1741  }
1742}
Note: See TracBrowser for help on using the repository browser.