#region License Information /* HeuristicLab * Copyright (C) Heuristic and Evolutionary Algorithms Laboratory (HEAL) * * This file is part of HeuristicLab. * * HeuristicLab is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * HeuristicLab is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with HeuristicLab. If not, see . */ #endregion using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Net.Http.Headers; using System.Web.Http; using HeuristicLab.Services.Access; using HeuristicLab.Services.Hive; using HeuristicLab.Services.Hive.DataAccess.Interfaces; using DA = HeuristicLab.Services.Hive.DataAccess; using DT = HeuristicLab.Services.WebApp.Statistics.WebApi.DataTransfer; namespace HeuristicLab.Services.WebApp.Statistics.WebApi { [Authorize] public class TaskController : ApiController { private IPersistenceManager PersistenceManager { get { return ServiceLocator.Instance.PersistenceManager; } } private IUserManager UserManager { get { return ServiceLocator.Instance.UserManager; } } private IRoleVerifier RoleVerifier { get { return ServiceLocator.Instance.RoleVerifier; } } [HttpPost] public DT.TaskPage GetTasksByJobId(Guid id, int page, int size, IEnumerable states) { var pm = PersistenceManager; var dimJobDao = pm.DimJobDao; var dimClientDao = pm.DimClientDao; var factTaskDao = pm.FactTaskDao; DA.DimJob job = pm.UseTransaction(() => dimJobDao.GetById(id)); if (job == null) { throw new ArgumentException("invalid job id"); } if (job.UserId != UserManager.CurrentUserId) { RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator); } return pm.UseTransaction(() => { var tasks = factTaskDao.GetByJobId(id).Where(x => states.Contains(x.TaskState.ToString())); return new DT.TaskPage { TotalTasks = tasks.Count(), Tasks = (from factTask in tasks join dimJob in dimJobDao.GetAll() on factTask.JobId equals dimJob.JobId join dimClient in dimClientDao.GetAll() on factTask.LastClientId equals dimClient.Id into taskClientJoin from a in taskClientJoin.DefaultIfEmpty() let startTime = factTask.StartTime ?? DateTime.Now let endTime = factTask.EndTime ?? DateTime.Now select new DT.Task { Id = factTask.TaskId, JobId = factTask.JobId, JobName = dimJob.JobName, TotalTime = (long)(endTime - startTime).TotalSeconds, CalculatingTime = factTask.CalculatingTime, WaitingTime = factTask.WaitingTime, TransferTime = factTask.TransferTime, InitialWaitingTime = factTask.InitialWaitingTime, NumCalculationRuns = factTask.NumCalculationRuns, NumRetries = factTask.NumRetries, CoresRequired = factTask.CoresRequired, MemoryRequired = factTask.MemoryRequired, Priority = factTask.Priority, State = factTask.TaskState.ToString(), LastClientId = factTask.LastClientId, LastClientName = a != null ? a.Name : string.Empty, UserId = dimJob.UserId, UserName = dimJob.UserName, StartTime = factTask.StartTime, EndTime = factTask.EndTime, Exception = factTask.Exception }) .Skip((page - 1) * size) .Take(size) .ToList() }; }); } [HttpPost] public DT.TaskPage GetTasksByClientId(Guid id, int page, int size, IEnumerable states, Guid userId = default(Guid)) { bool isAdministrator = User.IsInRole(HiveRoles.Administrator); var pm = PersistenceManager; var dimJobDao = pm.DimJobDao; var dimClientDao = pm.DimClientDao; var factTaskDao = pm.FactTaskDao; return pm.UseTransaction(() => { var tasks = factTaskDao.GetByClientId(id).Where(x => states.Contains(x.TaskState.ToString())); if (userId != Guid.Empty) { tasks = tasks.Where(x => x.DimJob.UserId == userId); } return new DT.TaskPage { TotalTasks = tasks.Count(), Tasks = (from factTask in tasks join dimJob in dimJobDao.GetAll() on factTask.JobId equals dimJob.JobId join dimClient in dimClientDao.GetAll() on factTask.LastClientId equals dimClient.Id into taskClientJoin from a in taskClientJoin.DefaultIfEmpty() let startTime = factTask.StartTime ?? DateTime.Now let endTime = factTask.EndTime ?? DateTime.Now select new DT.Task { Id = isAdministrator ? factTask.TaskId : default(Guid), JobId = isAdministrator ? factTask.JobId : default(Guid), JobName = isAdministrator ? dimJob.JobName : string.Empty, TotalTime = (long)(endTime - startTime).TotalSeconds, CalculatingTime = factTask.CalculatingTime, WaitingTime = factTask.WaitingTime, TransferTime = factTask.TransferTime, InitialWaitingTime = factTask.InitialWaitingTime, NumCalculationRuns = factTask.NumCalculationRuns, NumRetries = factTask.NumRetries, CoresRequired = factTask.CoresRequired, MemoryRequired = factTask.MemoryRequired, Priority = factTask.Priority, State = factTask.TaskState.ToString(), LastClientId = factTask.LastClientId, LastClientName = a != null ? a.Name : string.Empty, UserId = isAdministrator ? dimJob.UserId : default(Guid), UserName = isAdministrator ? dimJob.UserName : string.Empty, StartTime = factTask.StartTime, EndTime = factTask.EndTime, Exception = isAdministrator ? factTask.Exception : string.Empty }) .OrderByDescending(x => x.EndTime ?? DateTime.MaxValue) .Skip((page - 1) * size) .Take(size) .ToList() }; }); } public HttpResponseMessage GetTaskDataById(Guid id) { var pm = PersistenceManager; var taskDataDao = pm.TaskDataDao; return pm.UseTransaction(() => { var taskData = taskDataDao.GetById(id); if (taskData == null) return new HttpResponseMessage(HttpStatusCode.NotFound); HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK); var stream = new MemoryStream(taskData.Data); result.Content = new StreamContent(stream); result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = string.Format("{0}.hl", id) }; return result; }); } } }