Archive Browser
Download AzureContainerEcho.zip version 1.0.0.0, last updated 08/09/2013 (341.35 KB)
Download- md5: 08cb1fda4e8e679d8fec0608417e3910
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using Cyotek.TaskScheduler;
using Newtonsoft.Json;
namespace Cyotek.AzureContainerEcho
{
public class JobManager : IDisposable, IEnumerable<EchoScheduledTaskOptions>
{
#region Instance Fields
private readonly List<EchoScheduledTaskOptions> _jobData;
private readonly ITaskScheduler _scheduler;
private bool _enabled;
#endregion
#region Constructors
public JobManager()
{
_jobData = new List<EchoScheduledTaskOptions>();
_scheduler = TaskScheduleManager.CreateScheduler("AzureContainerEcho");
// HACK: Duplication of events for passthrough
_scheduler.TaskStarted += this.SchedulerTaskStartedHandler;
_scheduler.TaskCompleted += this.SchedulerTaskCompletedHandler;
_scheduler.TaskCancelled += this.SchedulerTaskCancelledHandler;
_scheduler.TaskException += this.SchedulerTaskExceptionHandler;
}
#endregion
#region Destructors
/// <summary>
/// Finalizes an instance of the <see cref="JobManager" /> class.
/// </summary>
~JobManager()
{
this.Dispose(false);
}
#endregion
#region Events
/// <summary>
/// Occurs when the Enabled property value changes
/// </summary>
[Category("Property Changed")]
public event EventHandler EnabledChanged;
public event EventHandler<ScheduledTaskEventArgs> TaskCancelled;
public event EventHandler<ScheduledTaskEventArgs> TaskCompleted;
public event EventHandler<ScheduledTaskExceptionEventArgs> TaskException;
public event EventHandler<ScheduledTaskEventArgs> TaskStarted;
#endregion
#region Properties
[Category("")]
[DefaultValue("")]
public virtual bool Enabled
{
get { return _enabled; }
set
{
if (this.Enabled != value)
{
_enabled = value;
this.OnEnabledChanged(EventArgs.Empty);
}
}
}
/// <summary>
/// Gets a value indicating whether this instance is disposed.
/// </summary>
/// <value><c>true</c> if this instance is disposed; otherwise, <c>false</c>.</value>
[Browsable(false)]
public bool IsDisposed { get; private set; }
public string StorageFileName
{
get { return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "cyotek.AzureContainerEcho.jobs.json"); }
}
#endregion
#region Members
/// <summary>
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
/// </summary>
public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
/// <summary>
/// Returns an enumerator that iterates through the collection.
/// </summary>
/// <returns>
/// A <see cref="T:System.Collections.Generic.IEnumerator`1"/> that can be used to iterate through the collection.
/// </returns>
public IEnumerator<EchoScheduledTaskOptions> GetEnumerator()
{
return _jobData.GetEnumerator();
}
public EchoScheduledTask GetJob(Guid id)
{
return (EchoScheduledTask)_scheduler.SingleOrDefault(j => ((EchoScheduledTaskOptions)j.Data["options"]).Id == id);
}
public IEnumerable<IScheduledTask> GetJobs()
{
return _scheduler;
}
public void KillJob(Guid id)
{
EchoScheduledTask job;
job = this.GetJob(id);
if (job != null)
{
if (job.InProgress)
job.Cancel();
_scheduler.Remove(job);
_jobData.Remove((EchoScheduledTaskOptions)job.Data["options"]);
}
}
public void Load()
{
string fileName;
fileName = this.StorageFileName;
if (File.Exists(fileName))
{
JsonSerializer serializer;
serializer = new JsonSerializer();
using (Stream file = File.OpenRead(fileName))
{
using (TextReader reader = new StreamReader(file))
{
IEnumerable<EchoScheduledTaskOptions> jobs;
jobs = (IEnumerable<EchoScheduledTaskOptions>)serializer.Deserialize(reader, typeof(IEnumerable<EchoScheduledTaskOptions>));
_jobData.Clear();
foreach (EchoScheduledTaskOptions job in jobs)
this.Schedule(job);
}
}
}
}
public void Save()
{
JsonSerializer serializer;
JsonSerializerSettings serializerSettings;
serializerSettings = new JsonSerializerSettings
{
Formatting = Formatting.Indented
};
serializer = JsonSerializer.Create(serializerSettings);
using (Stream file = File.Create(this.StorageFileName))
{
using (TextWriter writer = new StreamWriter(file))
serializer.Serialize(writer, _jobData);
}
}
public void Schedule(EchoScheduledTaskOptions options)
{
IScheduledTask job;
job = new EchoScheduledTask
{
Name = options.ContainerName,
RepeatingInterval = options.Interval
};
job.Data["Options"] = options;
_scheduler.Add(job);
_jobData.Add(options);
}
/// <summary>
/// Releases unmanaged and - optionally - managed resources.
/// </summary>
/// <param name="disposing"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
protected virtual void Dispose(bool disposing)
{
if (!this.IsDisposed)
{
if (disposing)
_scheduler.Stop();
this.IsDisposed = true;
}
}
/// <summary>
/// Raises the <see cref="EnabledChanged" /> event.
/// </summary>
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
protected virtual void OnEnabledChanged(EventArgs e)
{
EventHandler handler;
if (this.Enabled)
_scheduler.Start();
else
_scheduler.Stop();
handler = this.EnabledChanged;
if (handler != null)
handler(this, e);
}
/// <summary>
/// Raises the <see cref="TaskCancelled" /> event.
/// </summary>
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
protected virtual void OnTaskCancelled(ScheduledTaskEventArgs e)
{
EventHandler<ScheduledTaskEventArgs> handler;
handler = this.TaskCancelled;
if (handler != null)
handler(this, e);
}
/// <summary>
/// Raises the <see cref="TaskCompleted" /> event.
/// </summary>
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
protected virtual void OnTaskCompleted(ScheduledTaskEventArgs e)
{
EventHandler<ScheduledTaskEventArgs> handler;
handler = this.TaskCompleted;
if (handler != null)
handler(this, e);
}
/// <summary>
/// Raises the <see cref="TaskException" /> event.
/// </summary>
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
protected virtual void OnTaskException(ScheduledTaskExceptionEventArgs e)
{
EventHandler<ScheduledTaskExceptionEventArgs> handler;
handler = this.TaskException;
if (handler != null)
handler(this, e);
}
/// <summary>
/// Raises the <see cref="TaskStarted" /> event.
/// </summary>
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
protected virtual void OnTaskStarted(ScheduledTaskEventArgs e)
{
EventHandler<ScheduledTaskEventArgs> handler;
handler = this.TaskStarted;
if (handler != null)
handler(this, e);
}
private void Log(string text)
{
// TODO: Log to file
Debug.WriteLine(text);
}
#endregion
#region Event Handlers
private void SchedulerTaskCancelledHandler(object sender, ScheduledTaskEventArgs e)
{
this.OnTaskCancelled(e);
}
private void SchedulerTaskCompletedHandler(object sender, ScheduledTaskEventArgs e)
{
this.OnTaskCompleted(e);
}
private void SchedulerTaskExceptionHandler(object sender, ScheduledTaskExceptionEventArgs e)
{
this.Log(e.Exception.ToString());
this.OnTaskException(e);
}
private void SchedulerTaskStartedHandler(object sender, ScheduledTaskEventArgs e)
{
this.OnTaskStarted(e);
}
#endregion
#region IEnumerable<EchoScheduledTaskOptions> Members
/// <summary>
/// Returns an enumerator that iterates through a collection.
/// </summary>
/// <returns>
/// An <see cref="T:System.Collections.IEnumerator"/> object that can be used to iterate through the collection.
/// </returns>
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
#endregion
}
}
Donate
This software may be used free of charge, but as with all free software there are costs involved to develop and maintain.
If this site or its services have saved you time, please consider a donation to help with running costs and timely updates.
Donate