Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive/3.4/HiveService.cs @ 6006

Last change on this file since 6006 was 6006, checked in by cneumuel, 13 years ago

#1233

  • changed relationship between Job and HiveExperiment. There is no more HiveExperiment.RootJobId, instead there is Job.HiveExperimentId.
  • One HiveExperiment can now have multiple Experiments.
  • TreeView supports multiple root nodes
  • HiveEngine creates a HiveExperiment for each set of jobs, so jobs cannot be without an parent experiment anymore (no more loose jobs)
  • updated ExperimentManager binaries
File size: 21.4 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.ServiceModel;
5using HeuristicLab.Services.Hive.Common;
6using HeuristicLab.Services.Hive.Common.DataTransfer;
7using HeuristicLab.Services.Hive.Common.ServiceContracts;
8
9namespace HeuristicLab.Services.Hive {
10
11  /// <summary>
12  /// Implementation of the Hive service (interface <see cref="IHiveService"/>).
13  /// We need 'IgnoreExtensionDataObject' Attribute for the slave to work.
14  /// </summary>
15  [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, IgnoreExtensionDataObject = true)]
16  public class HiveService : IHiveService {
17    private DataAccess.IHiveDao dao {
18      get { return ServiceLocator.Instance.HiveDao; }
19    }
20    private HeuristicLab.Services.Hive.DataAccess.TransactionManager trans {
21      get { return ServiceLocator.Instance.TransactionManager; }
22    }
23    private IAuthorizationManager auth {
24      get { return ServiceLocator.Instance.AuthorizationManager; }
25    }
26    private ILifecycleManager lifecycleManager {
27      get { return ServiceLocator.Instance.LifecycleManager; }
28    }
29    private HeartbeatManager heartbeatManager {
30      get { return ServiceLocator.Instance.HeartbeatManager; }
31    }
32
33    #region Job Methods
34    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
35    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
36    public Guid AddJob(Job job, JobData jobData, IEnumerable<Guid> resourceIds) {
37      return trans.UseTransaction(() => {
38        job.Id = dao.AddJob(job);
39        jobData.JobId = job.Id;
40        jobData.LastUpdate = DateTime.Now;
41        if (resourceIds != null) {
42          foreach (Guid slaveGroupId in resourceIds) {
43            dao.AssignJobToResource(job.Id, slaveGroupId);
44          }
45        } else {
46          // todo: use default group
47        }
48        dao.AddJobData(jobData);
49        dao.UpdateJobState(job.Id, JobState.Waiting, null, auth.UserId, null);
50        return jobData.JobId;
51      });
52    }
53
54    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
55    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
56    public Guid AddChildJob(Guid parentJobId, Job job, JobData jobData) {
57      return trans.UseTransaction(() => {
58        job.ParentJobId = parentJobId;
59        return AddJob(job, jobData, dao.GetAssignedResources(parentJobId).Select(x => x.Id));
60      });
61    }
62
63    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
64    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
65    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
66    public Job GetJob(Guid jobId) {
67      return dao.GetJob(jobId);
68    }
69
70    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
71    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
72    public IEnumerable<Job> GetJobs() {
73      return dao.GetJobs(x => true);
74    }
75
76    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
77    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
78    public IEnumerable<LightweightJob> GetLightweightJobs(IEnumerable<Guid> jobIds) {
79      return dao.GetJobs(x => jobIds.Contains(x.JobId)).Select(x => new LightweightJob(x)).ToArray();
80    }
81
82    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
83    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
84    public IEnumerable<LightweightJob> GetLightweightChildJobs(Guid? parentJobId, bool recursive, bool includeParent) {
85      return GetChildJobs(parentJobId, recursive, includeParent).Select(x => new LightweightJob(x)).ToArray();
86    }
87
88    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
89    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
90    public IEnumerable<LightweightJob> GetLightweightExperimentJobs(Guid experimentId) {
91      return dao.GetJobs(x => x.HiveExperimentId == experimentId).Select(x => new LightweightJob(x)).ToArray();
92    }
93
94    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
95    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
96    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
97    public JobData GetJobData(Guid jobId) {
98      return dao.GetJobData(jobId);
99    }
100
101    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
102    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
103    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
104    public void UpdateJob(Job job) {
105      trans.UseTransaction(() => {
106        dao.UpdateJob(job);
107      });
108    }
109
110    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
111    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
112    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
113    public void UpdateJobData(Job job, JobData jobData) {
114      trans.UseTransaction(() => {
115        jobData.LastUpdate = DateTime.Now;
116        dao.UpdateJob(job);
117        dao.UpdateJobData(jobData);
118      });
119    }
120
121    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
122    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
123    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
124    public void DeleteJob(Guid jobId) {
125      trans.UseTransaction(() => {
126        dao.DeleteJob(jobId);
127      });
128    }
129
130    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
131    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
132    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
133    public void DeleteChildJobs(Guid parentJobId) {
134      trans.UseTransaction(() => {
135        var jobs = GetChildJobs(parentJobId, true, false);
136        foreach (var job in jobs) {
137          dao.DeleteJob(job.Id);
138          dao.DeleteJobData(job.Id);
139        };
140      });
141    }
142
143    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
144    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
145    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
146    public Job UpdateJobState(Guid jobId, JobState jobState, Guid? slaveId, Guid? userId, string exception) {
147      return trans.UseTransaction(() => {
148        Job job = dao.UpdateJobState(jobId, jobState, slaveId, userId, exception);
149        if (job.Command.HasValue && job.Command.Value == Command.Pause && job.State == JobState.Paused) {
150          job.Command = null;
151        } else if (job.Command.HasValue && job.Command.Value == Command.Abort && job.State == JobState.Aborted) {
152          job.Command = null;
153        } else if (job.Command.HasValue && job.Command.Value == Command.Stop && job.State == JobState.Aborted) {
154          job.Command = null;
155        }
156        dao.UpdateJob(job);
157        return job;
158      });
159    }
160    #endregion
161
162    #region Job Control Methods
163    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
164    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
165    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
166    public void StopJob(Guid jobId) {
167      trans.UseTransaction(() => {
168        //dao.UpdateJobState(jobId, JobState.Aborted, null, auth.UserId, string.Empty);
169        var job = dao.GetJob(jobId);
170        job.Command = Command.Stop;
171        dao.UpdateJob(job);
172      });
173    }
174
175    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
176    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
177    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
178    public void PauseJob(Guid jobId) {
179      trans.UseTransaction(() => {
180        //dao.UpdateJobState(jobId, JobState.Paused, null, auth.UserId, string.Empty);
181        var job = dao.GetJob(jobId);
182        job.Command = Command.Pause;
183        dao.UpdateJob(job);
184      });
185    }
186
187    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
188    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
189    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
190    public void RestartJob(Guid jobId) {
191      trans.UseTransaction(() => {
192        Job job = dao.UpdateJobState(jobId, JobState.Waiting, null, auth.UserId, string.Empty);
193        job.Command = null;
194        dao.UpdateJob(job);
195      });
196    }
197    #endregion
198
199    #region HiveExperiment Methods
200    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
201    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
202    public HiveExperiment GetHiveExperiment(Guid id) {
203      return dao.GetHiveExperiments(x =>
204             x.HiveExperimentId == id
205          && (x.OwnerUserId == auth.UserId || x.HiveExperimentPermissions.Count(hep => hep.Permission != Permission.NotAllowed && hep.GrantedUserId == auth.UserId) > 0)
206          ).FirstOrDefault();
207    }
208
209    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
210    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
211    public IEnumerable<HiveExperiment> GetHiveExperiments() {
212      return dao.GetHiveExperiments(x => x.OwnerUserId == auth.UserId || x.HiveExperimentPermissions.Count(hep => hep.Permission != Permission.NotAllowed && hep.GrantedUserId == auth.UserId) > 0);
213    }
214
215    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]   
216    public IEnumerable<HiveExperiment> GetAllHiveExperiments() {
217      return dao.GetHiveExperiments(x => true);
218    }
219
220    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
221    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
222    public Guid AddHiveExperiment(HiveExperiment hiveExperimentDto) {
223      return trans.UseTransaction(() => {
224        hiveExperimentDto.OwnerUserId = auth.UserId;
225        hiveExperimentDto.DateCreated = DateTime.Now;
226        return dao.AddHiveExperiment(hiveExperimentDto);
227      });
228    }
229
230    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
231    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
232    public void UpdateHiveExperiment(HiveExperiment hiveExperimentDto) {
233      trans.UseTransaction(() => {
234        dao.UpdateHiveExperiment(hiveExperimentDto);
235      });
236    }
237
238    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
239    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
240    public void DeleteHiveExperiment(Guid hiveExperimentId) {
241      trans.UseTransaction(() => {
242        HiveExperiment he = dao.GetHiveExperiment(hiveExperimentId);
243        dao.DeleteHiveExperiment(hiveExperimentId); // child jobs will be deleted by db-trigger
244      });
245    }
246    #endregion
247
248    #region Login Methods
249    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
250    public void Hello(Slave slaveInfo) {
251      trans.UseTransaction(() => {
252        var slave = dao.GetSlave(slaveInfo.Id);
253
254        if (slave == null) {
255          dao.AddSlave(slaveInfo);
256        } else {
257          var dbSlave = dao.GetSlave(slaveInfo.Id);
258
259          dbSlave.Name = slaveInfo.Name;
260          dbSlave.Description = slaveInfo.Description;
261
262          dbSlave.Cores = slaveInfo.Cores;
263          dbSlave.CpuArchitecture = slaveInfo.CpuArchitecture;
264          dbSlave.CpuSpeed = slaveInfo.CpuSpeed;
265          dbSlave.FreeCores = slaveInfo.FreeCores;
266          dbSlave.FreeMemory = slaveInfo.FreeMemory;
267          dbSlave.Memory = slaveInfo.Memory;
268          dbSlave.OperatingSystem = slaveInfo.OperatingSystem;
269         
270          dbSlave.LastHeartbeat = DateTime.Now;         
271          dbSlave.SlaveState = SlaveState.Idle;
272
273          // don't update those properties:
274          // dbSlave.IsAllowedToCalculate = slaveInfo.IsAllowedToCalculate;
275          // dbSlave.ParentResourceId = slaveInfo.ParentResourceId;
276
277          dao.UpdateSlave(dbSlave);
278        }
279      });
280    }
281
282    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
283    public void GoodBye(Guid slaveId) {
284      trans.UseTransaction(() => {
285        var slave = dao.GetSlave(slaveId);
286        if (slave != null) {
287          slave.SlaveState = SlaveState.Offline;
288          dao.UpdateSlave(slave);
289        }
290      });
291    }
292    #endregion
293
294    #region Heartbeat Methods
295    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
296    public List<MessageContainer> Heartbeat(Heartbeat heartbeat) {
297      TriggerLifecycle(false);
298      return trans.UseTransaction(() => heartbeatManager.ProcessHeartbeat(heartbeat));
299    }
300    #endregion
301
302    #region Plugin Methods
303    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
304    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
305    public Guid AddPlugin(Plugin plugin, List<PluginData> pluginDatas) {
306      return trans.UseTransaction(() => {
307        plugin.UserId = auth.UserId;
308        plugin.DateCreated = DateTime.Now;
309        if (!plugin.IsLocal) {
310          var existing = dao.GetPlugins(x => x.Name == plugin.Name && x.Version == plugin.Version.ToString() && !x.IsLocal);
311          if (existing.Count() > 0) {
312            // a plugin with the same name and version already exists.
313            throw new FaultException<PluginAlreadyExistsFault>(new PluginAlreadyExistsFault(existing.Single().Id));
314          }
315        }
316        Guid pluginId = dao.AddPlugin(plugin);
317        foreach (PluginData pluginData in pluginDatas) {
318          pluginData.PluginId = pluginId;
319          dao.AddPluginData(pluginData);
320        }
321        return pluginId;
322      });
323    }
324
325    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
326    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
327    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
328    public Plugin GetPlugin(Guid pluginId) {
329      return dao.GetPlugin(pluginId);
330    }
331
332    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
333    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
334    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
335    public IEnumerable<Plugin> GetPlugins() {
336      return dao.GetPlugins(x => x.IsLocal == false);
337    }
338
339    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
340    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
341    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
342    public IEnumerable<PluginData> GetPluginDatas(List<Guid> pluginIds) {
343      List<PluginData> pluginDatas = new List<PluginData>();
344
345      return trans.UseTransaction(() => {
346        foreach (Guid guid in pluginIds) {
347          List<PluginData> pluginData = dao.GetPluginDatas(x => x.PluginId == guid).ToList();
348          if (pluginData != null) {
349            pluginDatas.AddRange(pluginData);
350          } else {
351            //ignore ?
352          }
353        }
354        return pluginDatas;
355      });
356    }
357
358    #endregion
359
360    #region Slave Methods
361    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
362    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
363    public Guid AddSlave(Slave slave) {
364      return trans.UseTransaction(() => dao.AddSlave(slave));
365    }
366
367    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
368    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
369    public Guid AddSlaveGroup(SlaveGroup slaveGroup) {
370      return trans.UseTransaction(() => dao.AddSlaveGroup(slaveGroup));
371    }
372
373    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
374    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
375    public Slave GetSlave(Guid slaveId) {
376      return dao.GetSlave(slaveId);
377    }
378
379    public SlaveGroup GetSlaveGroup(Guid slaveGroupId) {
380      return dao.GetSlaveGroup(slaveGroupId);
381    }
382
383    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
384    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
385    public IEnumerable<Slave> GetSlaves() {
386      return dao.GetSlaves(x => true);
387    }
388
389    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
390    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
391    public IEnumerable<SlaveGroup> GetSlaveGroups() {
392      return dao.GetSlaveGroups(x => true);
393    }
394
395    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
396    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
397    public void UpdateSlave(Slave slave) {
398      trans.UseTransaction(() => {
399        dao.UpdateSlave(slave);
400      });
401    }
402
403    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
404    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
405    public void UpdateSlaveGroup(SlaveGroup slaveGroup) {
406      trans.UseTransaction(() => {
407        dao.UpdateSlaveGroup(slaveGroup);
408      });
409    }
410
411    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
412    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
413    public void DeleteSlave(Guid slaveId) {
414      trans.UseTransaction(() => {
415        dao.DeleteSlave(slaveId);
416      });
417    }
418
419    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
420    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
421    public void DeleteSlaveGroup(Guid slaveGroupId) {
422      trans.UseTransaction(() => {
423        dao.DeleteSlaveGroup(slaveGroupId);
424      });
425    }
426
427    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
428    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
429    public void AddResourceToGroup(Guid slaveGroupId, Guid resourceId) {
430      trans.UseTransaction(() => {
431        var resource = dao.GetResource(resourceId);
432        resource.ParentResourceId = slaveGroupId;
433        dao.UpdateResource(resource);
434      });
435    }
436
437    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
438    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
439    public void RemoveResourceFromGroup(Guid slaveGroupId, Guid resourceId) {
440      trans.UseTransaction(() => {
441        var resource = dao.GetResource(resourceId);
442        resource.ParentResourceId = null;
443        dao.UpdateResource(resource);
444      });
445    }
446
447    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
448    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
449    public Guid GetResourceId(string resourceName) {
450      return trans.UseTransaction(() => {
451        var resource = dao.GetResources(x => x.Name == resourceName).FirstOrDefault();
452        if (resource != null) {
453          return resource.Id;
454        } else {
455          return Guid.Empty;
456        }
457      });
458    }
459
460    public void TriggerLifecycle(bool force) {
461      trans.UseTransaction(() => {
462        DateTime lastCleanup = dao.GetLastCleanup();
463        if (force || DateTime.Now - lastCleanup > TimeSpan.FromSeconds(59)) {
464          dao.SetLastCleanup(DateTime.Now);
465          lifecycleManager.Cleanup();
466        }
467      });
468    }
469    #endregion
470
471    #region Helper Methods
472    private IEnumerable<Job> GetChildJobs(Guid? parentJobId, bool recursive, bool includeParent) {
473      var jobs = new List<Job>(dao.GetJobs(x => parentJobId == null ? !x.ParentJobId.HasValue : x.ParentJobId.Value == parentJobId));
474
475      if (recursive) {
476        var childs = new List<Job>();
477        foreach (var job in jobs) {
478          childs.AddRange(GetChildJobs(job.Id, recursive, false));
479        }
480        jobs.AddRange(childs);
481      }
482
483      if (includeParent) jobs.Add(GetJob(parentJobId.Value));
484
485      return jobs;
486    }
487
488    #endregion
489
490    #region Appointment Methods
491
492    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
493    public Guid AddAppointment(Appointment appointment) {
494      return trans.UseTransaction(() => dao.AddAppointment(appointment));
495    }
496
497    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
498    public void DeleteAppointment(Guid appointmentId) {
499      trans.UseTransaction(() => {
500        dao.DeleteAppointment(appointmentId);
501      });
502    }
503
504    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
505    public void UpdateAppointment(Appointment appointment) {
506      trans.UseTransaction(() => {
507        dao.UpdateAppointment(appointment);
508      });
509    }
510
511    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
512    public IEnumerable<Appointment> GetScheduleForResource(Guid resourceId) {
513      return trans.UseTransaction(() => dao.GetAppointments(x => x.ResourceId == resourceId));
514    }
515    #endregion
516  }
517}
Note: See TracBrowser for help on using the repository browser.