#region License Information /* HeuristicLab * Copyright (C) 2002-2008 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.Linq; using System.Text; using HeuristicLab.Hive.Contracts.Interfaces; using HeuristicLab.Hive.Contracts.BusinessObjects; using HeuristicLab.Hive.Contracts; using HeuristicLab.Hive.Server.Core.InternalInterfaces.DataAccess; using HeuristicLab.Hive.Server.Core.InternalInterfaces; namespace HeuristicLab.Hive.Server.Core { class JobManager: IJobManager, IInternalJobManager { IJobAdapter jobAdapter; IJobResultsAdapter jobResultAdapter; ILifecycleManager lifecycleManager; #region IJobManager Members public JobManager() { jobAdapter = ServiceLocator.GetJobAdapter(); jobResultAdapter = ServiceLocator.GetJobResultsAdapter(); lifecycleManager = ServiceLocator.GetLifecycleManager(); lifecycleManager.RegisterStartup(new EventHandler(lifecycleManager_OnStartup)); lifecycleManager.RegisterStartup(new EventHandler(lifecycleManager_OnShutdown)); } public void ResetJobsDependingOnResults(Job job) { List allJobResults = new List(jobResultAdapter.GetResultsOf(job)); JobResult lastJobResult = null; foreach (JobResult jR in allJobResults) { // if lastJobResult was before the current jobResult the lastJobResult must be updated if (lastJobResult == null || (jR.timestamp > lastJobResult.timestamp)) lastJobResult = jR; } if (lastJobResult != null) { job.Percentage = lastJobResult.Percentage; job.SerializedJob = lastJobResult.Result; } else { job.Percentage = 0; } job.Client = null; job.State = State.offline; jobAdapter.Update(job); } void checkForDeadJobs() { List allJobs = new List(jobAdapter.GetAll()); foreach (Job curJob in allJobs) { if (curJob.State == State.calculating) { ResetJobsDependingOnResults(curJob); } } } void lifecycleManager_OnStartup(object sender, EventArgs e) { checkForDeadJobs(); } void lifecycleManager_OnShutdown(object sender, EventArgs e) { checkForDeadJobs(); } /// /// returns all jobs stored in the database /// /// public ResponseList GetAllJobs() { ResponseList response = new ResponseList(); response.List = new List(jobAdapter.GetAll()); response.Success = true; response.StatusMessage = ApplicationConstants.RESPONSE_JOB_ALL_JOBS; return response; } /// /// Adds a new job into the database /// /// /// public ResponseObject AddNewJob(Job job) { ResponseObject response = new ResponseObject(); if (job != null) { if (job.State != State.offline) { response.Success = false; response.StatusMessage = ApplicationConstants.RESPONSE_JOB_JOBSTATE_MUST_BE_OFFLINE; return response; } if (job.Id != 0) { response.Success = false; response.StatusMessage = ApplicationConstants.RESPONSE_JOB_ID_MUST_NOT_BE_SET; return response; } if (job.SerializedJob == null) { response.StatusMessage = ApplicationConstants.RESPONSE_JOB_JOB_NULL; response.Success = false; return response; } jobAdapter.Update(job); response.Success = true; response.Obj = job; response.StatusMessage = ApplicationConstants.RESPONSE_JOB_JOB_ADDED; } else { response.Success = false; response.StatusMessage = ApplicationConstants.RESPONSE_JOB_JOB_NULL; } return response; } /// /// Removes a job from the database /// /// /// public Response RemoveJob(long jobId) { Response response = new Response(); Job job = jobAdapter.GetById(jobId); if (job == null) { response.Success = false; response.StatusMessage = ApplicationConstants.RESPONSE_JOB_JOB_DOESNT_EXIST; return response; } jobAdapter.Delete(job); response.Success = false; response.StatusMessage = ApplicationConstants.RESPONSE_JOB_JOB_REMOVED; return response; } #endregion } }