diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9ce2b40
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+obj/
+bin/
+*.user
+*.suo
\ No newline at end of file
diff --git a/ClickForensics.Quartz.Manager.Tests/ClickForensics.Quartz.Manager.Tests.csproj b/ClickForensics.Quartz.Manager.Tests/ClickForensics.Quartz.Manager.Tests.csproj
new file mode 100644
index 0000000..f4af3f1
--- /dev/null
+++ b/ClickForensics.Quartz.Manager.Tests/ClickForensics.Quartz.Manager.Tests.csproj
@@ -0,0 +1,61 @@
+
+
+
+ Debug
+ AnyCPU
+ 8.0.30703
+ 2.0
+ {B8B682CC-3E41-4810-86BF-B6728FB26D3A}
+ Library
+ Properties
+ ClickForensics.Quartz.Manager.Tests
+ ClickForensics.Quartz.Manager.Tests
+ v4.0
+ 512
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {D23DACFA-11A1-480E-A6C4-1F37B564523D}
+ ClickForensics.Quartz.Manager
+
+
+
+
+
\ No newline at end of file
diff --git a/ClickForensics.Quartz.Manager.Tests/Properties/AssemblyInfo.cs b/ClickForensics.Quartz.Manager.Tests/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..51142ed
--- /dev/null
+++ b/ClickForensics.Quartz.Manager.Tests/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("ClickForensics.Quartz.Manager.Tests")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft")]
+[assembly: AssemblyProduct("ClickForensics.Quartz.Manager.Tests")]
+[assembly: AssemblyCopyright("Copyright © Microsoft 2010")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("7f77159f-68ea-4291-83b2-1cd71e6c9d70")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/ClickForensics.Quartz.Manager.Tests/QuartzScehdulerTests.cs b/ClickForensics.Quartz.Manager.Tests/QuartzScehdulerTests.cs
new file mode 100644
index 0000000..4f7adea
--- /dev/null
+++ b/ClickForensics.Quartz.Manager.Tests/QuartzScehdulerTests.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using NUnit.Framework;
+
+namespace ClickForensics.Quartz.Manager.Tests
+{
+ [TestFixture]
+ public class QuartzScehdulerTests
+ {
+ [Test]
+ public void BackupToFileTests()
+ {
+ QuartzScheduler scheduler = new QuartzScheduler("app01", 555, "QuartzScheduler");
+ scheduler.BackupToFile(new System.IO.FileInfo(@"C:\Users\jvilalta\Documents\toto.xml"));
+
+ }
+ }
+}
diff --git a/ClickForensics.Quartz.Manager/AddJobForm.Designer.cs b/ClickForensics.Quartz.Manager/AddJobForm.Designer.cs
new file mode 100644
index 0000000..692fece
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/AddJobForm.Designer.cs
@@ -0,0 +1,390 @@
+namespace ClickForensics.Quartz.Manager
+{
+ partial class AddJobForm
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.btnAdd = new System.Windows.Forms.Button();
+ this.btnCancel = new System.Windows.Forms.Button();
+ this.cboJobType = new System.Windows.Forms.ComboBox();
+ this.cboTriggerType = new System.Windows.Forms.ComboBox();
+ this.label1 = new System.Windows.Forms.Label();
+ this.txtJobGroup = new System.Windows.Forms.TextBox();
+ this.txtJobName = new System.Windows.Forms.TextBox();
+ this.txtTriggerName = new System.Windows.Forms.TextBox();
+ this.txtTriggerDescription = new System.Windows.Forms.TextBox();
+ this.txtCronExpression = new System.Windows.Forms.TextBox();
+ this.txtTriggerGroup = new System.Windows.Forms.TextBox();
+ this.label2 = new System.Windows.Forms.Label();
+ this.label3 = new System.Windows.Forms.Label();
+ this.label4 = new System.Windows.Forms.Label();
+ this.label5 = new System.Windows.Forms.Label();
+ this.label6 = new System.Windows.Forms.Label();
+ this.label7 = new System.Windows.Forms.Label();
+ this.label8 = new System.Windows.Forms.Label();
+ this.lblJobDescription = new System.Windows.Forms.Label();
+ this.txtJobDescription = new System.Windows.Forms.TextBox();
+ this.jobDataListView = new System.Windows.Forms.ListView();
+ this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+ this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+ this.label10 = new System.Windows.Forms.Label();
+ this.label11 = new System.Windows.Forms.Label();
+ this.txtKey = new System.Windows.Forms.TextBox();
+ this.label12 = new System.Windows.Forms.Label();
+ this.txtValue = new System.Windows.Forms.TextBox();
+ this.btnAddKeyValue = new System.Windows.Forms.Button();
+ this.btnDelete = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // btnAdd
+ //
+ this.btnAdd.Location = new System.Drawing.Point(32, 273);
+ this.btnAdd.Name = "btnAdd";
+ this.btnAdd.Size = new System.Drawing.Size(75, 23);
+ this.btnAdd.TabIndex = 0;
+ this.btnAdd.Text = "Add";
+ this.btnAdd.UseVisualStyleBackColor = true;
+ this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click);
+ //
+ // btnCancel
+ //
+ this.btnCancel.Location = new System.Drawing.Point(140, 273);
+ this.btnCancel.Name = "btnCancel";
+ this.btnCancel.Size = new System.Drawing.Size(75, 23);
+ this.btnCancel.TabIndex = 1;
+ this.btnCancel.Text = "Cancel";
+ this.btnCancel.UseVisualStyleBackColor = true;
+ this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
+ //
+ // cboJobType
+ //
+ this.cboJobType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.cboJobType.FormattingEnabled = true;
+ this.cboJobType.Location = new System.Drawing.Point(131, 13);
+ this.cboJobType.Name = "cboJobType";
+ this.cboJobType.Size = new System.Drawing.Size(277, 21);
+ this.cboJobType.TabIndex = 2;
+ //
+ // cboTriggerType
+ //
+ this.cboTriggerType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.cboTriggerType.FormattingEnabled = true;
+ this.cboTriggerType.Location = new System.Drawing.Point(131, 122);
+ this.cboTriggerType.Name = "cboTriggerType";
+ this.cboTriggerType.Size = new System.Drawing.Size(277, 21);
+ this.cboTriggerType.TabIndex = 3;
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(29, 17);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(54, 13);
+ this.label1.TabIndex = 4;
+ this.label1.Text = "Job Type:";
+ //
+ // txtJobGroup
+ //
+ this.txtJobGroup.Location = new System.Drawing.Point(131, 41);
+ this.txtJobGroup.Name = "txtJobGroup";
+ this.txtJobGroup.Size = new System.Drawing.Size(277, 20);
+ this.txtJobGroup.TabIndex = 5;
+ //
+ // txtJobName
+ //
+ this.txtJobName.Location = new System.Drawing.Point(131, 68);
+ this.txtJobName.Name = "txtJobName";
+ this.txtJobName.Size = new System.Drawing.Size(277, 20);
+ this.txtJobName.TabIndex = 6;
+ //
+ // txtTriggerName
+ //
+ this.txtTriggerName.Location = new System.Drawing.Point(131, 177);
+ this.txtTriggerName.Name = "txtTriggerName";
+ this.txtTriggerName.Size = new System.Drawing.Size(277, 20);
+ this.txtTriggerName.TabIndex = 8;
+ //
+ // txtTriggerDescription
+ //
+ this.txtTriggerDescription.Location = new System.Drawing.Point(131, 204);
+ this.txtTriggerDescription.Name = "txtTriggerDescription";
+ this.txtTriggerDescription.Size = new System.Drawing.Size(277, 20);
+ this.txtTriggerDescription.TabIndex = 7;
+ //
+ // txtCronExpression
+ //
+ this.txtCronExpression.Location = new System.Drawing.Point(131, 231);
+ this.txtCronExpression.Name = "txtCronExpression";
+ this.txtCronExpression.Size = new System.Drawing.Size(277, 20);
+ this.txtCronExpression.TabIndex = 10;
+ //
+ // txtTriggerGroup
+ //
+ this.txtTriggerGroup.Location = new System.Drawing.Point(131, 150);
+ this.txtTriggerGroup.Name = "txtTriggerGroup";
+ this.txtTriggerGroup.Size = new System.Drawing.Size(277, 20);
+ this.txtTriggerGroup.TabIndex = 9;
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(29, 44);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(59, 13);
+ this.label2.TabIndex = 11;
+ this.label2.Text = "Job Group:";
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.Location = new System.Drawing.Point(29, 71);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(58, 13);
+ this.label3.TabIndex = 12;
+ this.label3.Text = "Job Name:";
+ //
+ // label4
+ //
+ this.label4.AutoSize = true;
+ this.label4.Location = new System.Drawing.Point(29, 125);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(70, 13);
+ this.label4.TabIndex = 13;
+ this.label4.Text = "Trigger Type:";
+ //
+ // label5
+ //
+ this.label5.AutoSize = true;
+ this.label5.Location = new System.Drawing.Point(29, 207);
+ this.label5.Name = "label5";
+ this.label5.Size = new System.Drawing.Size(99, 13);
+ this.label5.TabIndex = 14;
+ this.label5.Text = "Trigger Description:";
+ //
+ // label6
+ //
+ this.label6.AutoSize = true;
+ this.label6.Location = new System.Drawing.Point(29, 180);
+ this.label6.Name = "label6";
+ this.label6.Size = new System.Drawing.Size(74, 13);
+ this.label6.TabIndex = 15;
+ this.label6.Text = "Trigger Name:";
+ //
+ // label7
+ //
+ this.label7.AutoSize = true;
+ this.label7.Location = new System.Drawing.Point(29, 153);
+ this.label7.Name = "label7";
+ this.label7.Size = new System.Drawing.Size(75, 13);
+ this.label7.TabIndex = 16;
+ this.label7.Text = "Trigger Group:";
+ //
+ // label8
+ //
+ this.label8.AutoSize = true;
+ this.label8.Location = new System.Drawing.Point(29, 234);
+ this.label8.Name = "label8";
+ this.label8.Size = new System.Drawing.Size(86, 13);
+ this.label8.TabIndex = 17;
+ this.label8.Text = "Cron Expression:";
+ //
+ // lblJobDescription
+ //
+ this.lblJobDescription.AutoSize = true;
+ this.lblJobDescription.Location = new System.Drawing.Point(29, 98);
+ this.lblJobDescription.Name = "lblJobDescription";
+ this.lblJobDescription.Size = new System.Drawing.Size(83, 13);
+ this.lblJobDescription.TabIndex = 19;
+ this.lblJobDescription.Text = "Job Description:";
+ //
+ // txtJobDescription
+ //
+ this.txtJobDescription.Location = new System.Drawing.Point(131, 95);
+ this.txtJobDescription.Name = "txtJobDescription";
+ this.txtJobDescription.Size = new System.Drawing.Size(277, 20);
+ this.txtJobDescription.TabIndex = 18;
+ //
+ // jobDataListView
+ //
+ this.jobDataListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+ this.columnHeader1,
+ this.columnHeader2});
+ this.jobDataListView.FullRowSelect = true;
+ this.jobDataListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
+ this.jobDataListView.Location = new System.Drawing.Point(559, 43);
+ this.jobDataListView.MultiSelect = false;
+ this.jobDataListView.Name = "jobDataListView";
+ this.jobDataListView.Size = new System.Drawing.Size(233, 99);
+ this.jobDataListView.TabIndex = 20;
+ this.jobDataListView.UseCompatibleStateImageBehavior = false;
+ this.jobDataListView.View = System.Windows.Forms.View.Details;
+ //
+ // columnHeader1
+ //
+ this.columnHeader1.Text = "Key";
+ this.columnHeader1.Width = 82;
+ //
+ // columnHeader2
+ //
+ this.columnHeader2.Text = "Value";
+ this.columnHeader2.Width = 145;
+ //
+ // label10
+ //
+ this.label10.AutoSize = true;
+ this.label10.Location = new System.Drawing.Point(556, 17);
+ this.label10.Name = "label10";
+ this.label10.Size = new System.Drawing.Size(53, 13);
+ this.label10.TabIndex = 21;
+ this.label10.Text = "Job Data:";
+ //
+ // label11
+ //
+ this.label11.AutoSize = true;
+ this.label11.Location = new System.Drawing.Point(560, 162);
+ this.label11.Name = "label11";
+ this.label11.Size = new System.Drawing.Size(28, 13);
+ this.label11.TabIndex = 23;
+ this.label11.Text = "Key:";
+ //
+ // txtKey
+ //
+ this.txtKey.Location = new System.Drawing.Point(604, 159);
+ this.txtKey.Name = "txtKey";
+ this.txtKey.Size = new System.Drawing.Size(188, 20);
+ this.txtKey.TabIndex = 22;
+ //
+ // label12
+ //
+ this.label12.AutoSize = true;
+ this.label12.Location = new System.Drawing.Point(560, 188);
+ this.label12.Name = "label12";
+ this.label12.Size = new System.Drawing.Size(37, 13);
+ this.label12.TabIndex = 25;
+ this.label12.Text = "Value:";
+ //
+ // txtValue
+ //
+ this.txtValue.Location = new System.Drawing.Point(604, 185);
+ this.txtValue.Name = "txtValue";
+ this.txtValue.Size = new System.Drawing.Size(188, 20);
+ this.txtValue.TabIndex = 24;
+ //
+ // btnAddKeyValue
+ //
+ this.btnAddKeyValue.Location = new System.Drawing.Point(559, 211);
+ this.btnAddKeyValue.Name = "btnAddKeyValue";
+ this.btnAddKeyValue.Size = new System.Drawing.Size(50, 23);
+ this.btnAddKeyValue.TabIndex = 26;
+ this.btnAddKeyValue.Text = "Add";
+ this.btnAddKeyValue.UseVisualStyleBackColor = true;
+ this.btnAddKeyValue.Click += new System.EventHandler(this.btnAddKeyValue_Click);
+ //
+ // btnDelete
+ //
+ this.btnDelete.Location = new System.Drawing.Point(798, 41);
+ this.btnDelete.Name = "btnDelete";
+ this.btnDelete.Size = new System.Drawing.Size(52, 23);
+ this.btnDelete.TabIndex = 27;
+ this.btnDelete.Text = "Delete";
+ this.btnDelete.UseVisualStyleBackColor = true;
+ this.btnDelete.Click += new System.EventHandler(this.btnDelete_Click);
+ //
+ // AddJobForm
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(1044, 338);
+ this.Controls.Add(this.btnDelete);
+ this.Controls.Add(this.btnAddKeyValue);
+ this.Controls.Add(this.label12);
+ this.Controls.Add(this.txtValue);
+ this.Controls.Add(this.label11);
+ this.Controls.Add(this.txtKey);
+ this.Controls.Add(this.label10);
+ this.Controls.Add(this.jobDataListView);
+ this.Controls.Add(this.lblJobDescription);
+ this.Controls.Add(this.txtJobDescription);
+ this.Controls.Add(this.label8);
+ this.Controls.Add(this.label7);
+ this.Controls.Add(this.label6);
+ this.Controls.Add(this.label5);
+ this.Controls.Add(this.label4);
+ this.Controls.Add(this.label3);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.txtCronExpression);
+ this.Controls.Add(this.txtTriggerGroup);
+ this.Controls.Add(this.txtTriggerName);
+ this.Controls.Add(this.txtTriggerDescription);
+ this.Controls.Add(this.txtJobName);
+ this.Controls.Add(this.txtJobGroup);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.cboTriggerType);
+ this.Controls.Add(this.cboJobType);
+ this.Controls.Add(this.btnCancel);
+ this.Controls.Add(this.btnAdd);
+ this.Name = "AddJobForm";
+ this.Text = "AddJobForm";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Button btnAdd;
+ private System.Windows.Forms.Button btnCancel;
+ private System.Windows.Forms.ComboBox cboJobType;
+ private System.Windows.Forms.ComboBox cboTriggerType;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.TextBox txtJobGroup;
+ private System.Windows.Forms.TextBox txtJobName;
+ private System.Windows.Forms.TextBox txtTriggerName;
+ private System.Windows.Forms.TextBox txtTriggerDescription;
+ private System.Windows.Forms.TextBox txtCronExpression;
+ private System.Windows.Forms.TextBox txtTriggerGroup;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.Label label4;
+ private System.Windows.Forms.Label label5;
+ private System.Windows.Forms.Label label6;
+ private System.Windows.Forms.Label label7;
+ private System.Windows.Forms.Label label8;
+ private System.Windows.Forms.Label lblJobDescription;
+ private System.Windows.Forms.TextBox txtJobDescription;
+ private System.Windows.Forms.ListView jobDataListView;
+ private System.Windows.Forms.Label label10;
+ private System.Windows.Forms.Label label11;
+ private System.Windows.Forms.TextBox txtKey;
+ private System.Windows.Forms.Label label12;
+ private System.Windows.Forms.TextBox txtValue;
+ private System.Windows.Forms.Button btnAddKeyValue;
+ private System.Windows.Forms.Button btnDelete;
+ private System.Windows.Forms.ColumnHeader columnHeader1;
+ private System.Windows.Forms.ColumnHeader columnHeader2;
+ }
+}
\ No newline at end of file
diff --git a/ClickForensics.Quartz.Manager/AddJobForm.cs b/ClickForensics.Quartz.Manager/AddJobForm.cs
new file mode 100644
index 0000000..f5f7b07
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/AddJobForm.cs
@@ -0,0 +1,176 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using Quartz;
+using System.Reflection;
+using Quartz.Job;
+using System.IO;
+
+namespace ClickForensics.Quartz.Manager
+{
+ public partial class AddJobForm : Form
+ {
+ public AddJobForm()
+ {
+ InitializeComponent();
+ loadJobAssemblies();
+ cboTriggerType.Items.Add("Cron");
+ cboTriggerType.SelectedItem = "Cron";
+ if (cboJobType.SelectedText == "NativeJob")
+ {
+ jobDataListView.Items.Add(new ListViewItem(new string[] { "consumeStreams", "true" }));
+ jobDataListView.Items.Add(new ListViewItem(new string[] { "waitForProcess", "true" }));
+ txtKey.Text = "command";
+ }
+ }
+ private void loadJobAssemblies()
+ {
+ FileStream stream = File.OpenRead("JobAssemblies.txt");
+ StreamReader reader = new StreamReader(stream);
+ string line;
+ SortedList jobTypes = new SortedList();
+ while ((line = reader.ReadLine()) != null)
+ {
+ Assembly assembly = Assembly.LoadFile(Environment.CurrentDirectory + "\\" + line);
+ foreach (Type type in assembly.GetTypes())
+ {
+ if (typeof(IJob).IsAssignableFrom(type))
+ {
+ jobTypes.Add(type.FullName, assembly.GetName().Name);
+ }
+ }
+ }
+ foreach (var item in jobTypes)
+ {
+ cboJobType.Items.Add(new JobType() { AssemblyName = item.Value, FullName = item.Key });
+ }
+ //cboJobType.Items.AddRange(jobTypes.Values.ToArray());
+
+ }
+
+ public AddJobForm(TriggerNode node)
+ : this()
+ {
+ setTriggerData((CronTrigger)node.Trigger);
+ setJobData(((JobNode)node.Parent.Parent).Detail);
+ }
+
+ private void setTriggerData(CronTrigger trigger)
+ {
+ setTriggerType();
+ txtCronExpression.Text = trigger.CronExpressionString;
+ txtTriggerDescription.Text = trigger.Description;
+ txtTriggerGroup.Text = trigger.Group;
+ txtTriggerName.Text = trigger.Name;
+ }
+
+ private void setJobData(JobDetail detail)
+ {
+ setJobType(detail);
+ txtJobDescription.Text = detail.Description;
+ txtJobGroup.Text = detail.Group;
+ txtJobName.Text = detail.Name;
+ setJobDataMap(detail);
+ }
+
+ private void setJobDataMap(JobDetail detail)
+ {
+ jobDataListView.Items.Clear();
+ foreach (var item in detail.JobDataMap.GetKeys())
+ {
+ jobDataListView.Items.Add(new ListViewItem(new string[] { item, detail.JobDataMap.Get(item).ToString() }));
+ }
+ }
+
+ private void setJobType(JobDetail detail)
+ {
+ cboJobType.SelectedItem = detail.JobType.FullName;
+
+ }
+
+ private void setTriggerType()
+ {
+ //nothing to do right now
+ }
+ public JobDetail JobDetail { get; set; }
+ public Trigger Trigger { get; set; }
+ private void btnCancel_Click(object sender, EventArgs e)
+ {
+ this.Close();
+ }
+
+ private void btnAdd_Click(object sender, EventArgs e)
+ {
+ JobDetail = getJobDetail();
+ Trigger = getTrigger();
+ Trigger.JobGroup = JobDetail.Group;
+ Trigger.JobName = JobDetail.Name;
+ this.Close();
+ }
+
+ private JobDetail getJobDetail()
+ {
+ JobDetail detail = new JobDetail();
+ detail.Description = txtJobDescription.Text;
+ detail.Group = txtJobGroup.Text;
+ detail.JobDataMap = getJobDataMap();
+ detail.JobType = getJobType();
+ detail.Name = txtJobName.Text;
+ return detail;
+ }
+
+ private Trigger getTrigger()
+ {
+ Trigger trigger;
+ if (cboTriggerType.SelectedText == "Simple")
+ {
+ trigger = new SimpleTrigger();
+ }
+ else
+ {
+ trigger = new CronTrigger();
+ ((CronTrigger)trigger).CronExpressionString = txtCronExpression.Text;
+ }
+ trigger.Description = txtTriggerDescription.Text;
+ trigger.Group = txtTriggerGroup.Text;
+ trigger.Name = txtTriggerName.Text;
+ return trigger;
+ }
+
+ private Type getJobType()
+ {
+ JobType type = (JobType)cboJobType.SelectedItem;
+ return Type.GetType(type.FullName + "," + type.AssemblyName, true);
+ }
+
+ private JobDataMap getJobDataMap()
+ {
+ JobDataMap map = new JobDataMap();
+ foreach (ListViewItem item in jobDataListView.Items)
+ {
+ map.Add(item.SubItems[0].Text, item.SubItems[1].Text);
+ }
+
+ return map;
+ }
+
+ private void btnAddKeyValue_Click(object sender, EventArgs e)
+ {
+ ListViewItem item = new ListViewItem(new string[] { txtKey.Text, txtValue.Text });
+ jobDataListView.Items.Add(item);
+ }
+
+ private void btnDelete_Click(object sender, EventArgs e)
+ {
+ foreach (ListViewItem item in jobDataListView.SelectedItems)
+ {
+ jobDataListView.Items.Remove(item);
+ }
+ }
+ }
+}
diff --git a/ClickForensics.Quartz.Manager/AddJobForm.resx b/ClickForensics.Quartz.Manager/AddJobForm.resx
new file mode 100644
index 0000000..d58980a
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/AddJobForm.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/ClickForensics.Quartz.Manager/AddListenerForm.Designer.cs b/ClickForensics.Quartz.Manager/AddListenerForm.Designer.cs
new file mode 100644
index 0000000..c858f48
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/AddListenerForm.Designer.cs
@@ -0,0 +1,118 @@
+namespace ClickForensics.Quartz.Manager
+{
+ partial class AddListenerForm
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.txtListenerName = new System.Windows.Forms.TextBox();
+ this.label1 = new System.Windows.Forms.Label();
+ this.label2 = new System.Windows.Forms.Label();
+ this.btnAdd = new System.Windows.Forms.Button();
+ this.btnCancel = new System.Windows.Forms.Button();
+ this.txtListenerType = new System.Windows.Forms.TextBox();
+ this.SuspendLayout();
+ //
+ // txtListenerName
+ //
+ this.txtListenerName.Location = new System.Drawing.Point(98, 12);
+ this.txtListenerName.Name = "txtListenerName";
+ this.txtListenerName.Size = new System.Drawing.Size(100, 20);
+ this.txtListenerName.TabIndex = 7;
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(21, 15);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(38, 13);
+ this.label1.TabIndex = 6;
+ this.label1.Text = "Name:";
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(21, 41);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(74, 13);
+ this.label2.TabIndex = 9;
+ this.label2.Text = "Listener Type:";
+ //
+ // btnAdd
+ //
+ this.btnAdd.Location = new System.Drawing.Point(24, 75);
+ this.btnAdd.Name = "btnAdd";
+ this.btnAdd.Size = new System.Drawing.Size(75, 23);
+ this.btnAdd.TabIndex = 10;
+ this.btnAdd.Text = "Add";
+ this.btnAdd.UseVisualStyleBackColor = true;
+ this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click);
+ //
+ // btnCancel
+ //
+ this.btnCancel.Location = new System.Drawing.Point(123, 75);
+ this.btnCancel.Name = "btnCancel";
+ this.btnCancel.Size = new System.Drawing.Size(75, 23);
+ this.btnCancel.TabIndex = 11;
+ this.btnCancel.Text = "Cancel";
+ this.btnCancel.UseVisualStyleBackColor = true;
+ this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
+ //
+ // txtListenerType
+ //
+ this.txtListenerType.Location = new System.Drawing.Point(98, 38);
+ this.txtListenerType.Name = "txtListenerType";
+ this.txtListenerType.Size = new System.Drawing.Size(100, 20);
+ this.txtListenerType.TabIndex = 12;
+ //
+ // AddListenerForm
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(360, 110);
+ this.Controls.Add(this.txtListenerType);
+ this.Controls.Add(this.btnCancel);
+ this.Controls.Add(this.btnAdd);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.txtListenerName);
+ this.Controls.Add(this.label1);
+ this.Name = "AddListenerForm";
+ this.Text = "AddListenerForm";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.TextBox txtListenerName;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Button btnAdd;
+ private System.Windows.Forms.Button btnCancel;
+ private System.Windows.Forms.TextBox txtListenerType;
+ }
+}
\ No newline at end of file
diff --git a/ClickForensics.Quartz.Manager/AddListenerForm.cs b/ClickForensics.Quartz.Manager/AddListenerForm.cs
new file mode 100644
index 0000000..24605f3
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/AddListenerForm.cs
@@ -0,0 +1,68 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using System.Reflection;
+//using ClickForensics.Quartz.Jobs;
+
+namespace ClickForensics.Quartz.Manager
+{
+ public partial class AddListenerForm : Form
+ {
+ public AddListenerForm()
+ {
+ InitializeComponent();
+ this.Load += new EventHandler(AddListenerForm_Load);
+ }
+
+ void AddListenerForm_Load(object sender, EventArgs e)
+ {
+ //loadListenerTypes();
+ }
+
+ private List getListenerTypes()
+ {
+ //JobHistoryListener listener = new JobHistoryListener();
+ List types = new List();
+ Type theThing = ListenerInterface.BaseType;
+ foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
+ {
+ foreach (Type type in assembly.GetTypes())
+ {
+ if (ListenerInterface.UnderlyingSystemType.IsAssignableFrom(type))
+ {
+ types.Add(type);
+ }
+ }
+ }
+ return types;
+ }
+ //private void loadListenerTypes()
+ //{
+ // listenerTypeCombo.Items.Clear();
+ // foreach (var type in getListenerTypes())
+ // {
+ // listenerTypeCombo.Items.Add(type);
+ // }
+ //}
+ public Type ListenerInterface { get; set; }
+ public string ListenerType { get; set; }
+ public string ListenerName { get; set; }
+
+ private void btnCancel_Click(object sender, EventArgs e)
+ {
+ this.Close();
+ }
+
+ private void btnAdd_Click(object sender, EventArgs e)
+ {
+ ListenerName=txtListenerName.Text;
+ ListenerType = txtListenerType.Text;
+ this.Close();
+ }
+ }
+}
diff --git a/ClickForensics.Quartz.Manager/AddListenerForm.resx b/ClickForensics.Quartz.Manager/AddListenerForm.resx
new file mode 100644
index 0000000..19dc0dd
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/AddListenerForm.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/ClickForensics.Quartz.Manager/ClickForensics.Quartz.Manager.csproj b/ClickForensics.Quartz.Manager/ClickForensics.Quartz.Manager.csproj
new file mode 100644
index 0000000..e3b502f
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/ClickForensics.Quartz.Manager.csproj
@@ -0,0 +1,200 @@
+
+
+
+ Debug
+ AnyCPU
+ 9.0.30729
+ 2.0
+ {D23DACFA-11A1-480E-A6C4-1F37B564523D}
+ WinExe
+ Properties
+ ClickForensics.Quartz.Manager
+ ClickForensics.Quartz.Manager
+ v4.0
+ 512
+
+
+ 3.5
+
+
+ publish\
+ true
+ Disk
+ false
+ Foreground
+ 7
+ Days
+ false
+ false
+ true
+ 0
+ 1.0.0.%2a
+ false
+ false
+ true
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+ ..\lib\Common.Logging.dll
+
+
+ False
+ ..\lib\Quartz.dll
+
+
+
+
+ 3.5
+
+
+ 3.5
+
+
+ 3.5
+
+
+
+
+
+
+
+
+
+ Form
+
+
+ AddJobForm.cs
+
+
+ Form
+
+
+ AddListenerForm.cs
+
+
+ Form
+
+
+ ErrorDialog.cs
+
+
+
+ UserControl
+
+
+ NativeJobDetailDisplay.cs
+
+
+
+ Form
+
+
+ MainForm.cs
+
+
+
+
+ AddJobForm.cs
+
+
+ AddListenerForm.cs
+
+
+ CronTriggerDisplay.cs
+
+
+ ErrorDialog.cs
+
+
+ MainForm.cs
+
+
+ NativeJobDetailDisplay.cs
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+ Designer
+
+
+ ServerConnectForm.cs
+
+
+ True
+ Resources.resx
+ True
+
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+ True
+ Settings.settings
+ True
+
+
+
+
+ Form
+
+
+ ServerConnectForm.cs
+
+
+ UserControl
+
+
+ CronTriggerDisplay.cs
+
+
+
+
+
+ PreserveNewest
+
+
+
+
+ False
+ .NET Framework 3.5 SP1 Client Profile
+ false
+
+
+ False
+ .NET Framework 3.5 SP1
+ true
+
+
+ False
+ Windows Installer 3.1
+ true
+
+
+
+
+
\ No newline at end of file
diff --git a/ClickForensics.Quartz.Manager/CronTriggerDisplay.Designer.cs b/ClickForensics.Quartz.Manager/CronTriggerDisplay.Designer.cs
new file mode 100644
index 0000000..b9ad2e2
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/CronTriggerDisplay.Designer.cs
@@ -0,0 +1,191 @@
+namespace ClickForensics.Quartz.Manager
+{
+ partial class CronTriggerDisplay
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.label1 = new System.Windows.Forms.Label();
+ this.lblName = new System.Windows.Forms.Label();
+ this.label3 = new System.Windows.Forms.Label();
+ this.lblGroup = new System.Windows.Forms.Label();
+ this.label5 = new System.Windows.Forms.Label();
+ this.lblDescription = new System.Windows.Forms.Label();
+ this.label7 = new System.Windows.Forms.Label();
+ this.lblPreviousFireTime = new System.Windows.Forms.Label();
+ this.label9 = new System.Windows.Forms.Label();
+ this.lblNextFireTime = new System.Windows.Forms.Label();
+ this.label11 = new System.Windows.Forms.Label();
+ this.txtCronExpression = new System.Windows.Forms.TextBox();
+ this.SuspendLayout();
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(14, 26);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(86, 13);
+ this.label1.TabIndex = 0;
+ this.label1.Text = "Cron Expression:";
+ //
+ // lblName
+ //
+ this.lblName.AutoSize = true;
+ this.lblName.Location = new System.Drawing.Point(116, 47);
+ this.lblName.Name = "lblName";
+ this.lblName.Size = new System.Drawing.Size(35, 13);
+ this.lblName.TabIndex = 3;
+ this.lblName.Text = "label2";
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.Location = new System.Drawing.Point(14, 47);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(38, 13);
+ this.label3.TabIndex = 2;
+ this.label3.Text = "Name:";
+ //
+ // lblGroup
+ //
+ this.lblGroup.AutoSize = true;
+ this.lblGroup.Location = new System.Drawing.Point(116, 68);
+ this.lblGroup.Name = "lblGroup";
+ this.lblGroup.Size = new System.Drawing.Size(35, 13);
+ this.lblGroup.TabIndex = 5;
+ this.lblGroup.Text = "label4";
+ //
+ // label5
+ //
+ this.label5.AutoSize = true;
+ this.label5.Location = new System.Drawing.Point(14, 68);
+ this.label5.Name = "label5";
+ this.label5.Size = new System.Drawing.Size(39, 13);
+ this.label5.TabIndex = 4;
+ this.label5.Text = "Group:";
+ //
+ // lblDescription
+ //
+ this.lblDescription.AutoSize = true;
+ this.lblDescription.Location = new System.Drawing.Point(116, 89);
+ this.lblDescription.Name = "lblDescription";
+ this.lblDescription.Size = new System.Drawing.Size(35, 13);
+ this.lblDescription.TabIndex = 7;
+ this.lblDescription.Text = "label6";
+ //
+ // label7
+ //
+ this.label7.AutoSize = true;
+ this.label7.Location = new System.Drawing.Point(14, 89);
+ this.label7.Name = "label7";
+ this.label7.Size = new System.Drawing.Size(63, 13);
+ this.label7.TabIndex = 6;
+ this.label7.Text = "Description:";
+ //
+ // lblPreviousFireTime
+ //
+ this.lblPreviousFireTime.AutoSize = true;
+ this.lblPreviousFireTime.Location = new System.Drawing.Point(116, 131);
+ this.lblPreviousFireTime.Name = "lblPreviousFireTime";
+ this.lblPreviousFireTime.Size = new System.Drawing.Size(35, 13);
+ this.lblPreviousFireTime.TabIndex = 9;
+ this.lblPreviousFireTime.Text = "label8";
+ //
+ // label9
+ //
+ this.label9.AutoSize = true;
+ this.label9.Location = new System.Drawing.Point(14, 131);
+ this.label9.Name = "label9";
+ this.label9.Size = new System.Drawing.Size(97, 13);
+ this.label9.TabIndex = 8;
+ this.label9.Text = "Previous Fire Time:";
+ //
+ // lblNextFireTime
+ //
+ this.lblNextFireTime.AutoSize = true;
+ this.lblNextFireTime.Location = new System.Drawing.Point(116, 110);
+ this.lblNextFireTime.Name = "lblNextFireTime";
+ this.lblNextFireTime.Size = new System.Drawing.Size(41, 13);
+ this.lblNextFireTime.TabIndex = 11;
+ this.lblNextFireTime.Text = "label10";
+ //
+ // label11
+ //
+ this.label11.AutoSize = true;
+ this.label11.Location = new System.Drawing.Point(14, 110);
+ this.label11.Name = "label11";
+ this.label11.Size = new System.Drawing.Size(78, 13);
+ this.label11.TabIndex = 10;
+ this.label11.Text = "Next Fire Time:";
+ //
+ // txtCronExpression
+ //
+ this.txtCronExpression.Location = new System.Drawing.Point(119, 23);
+ this.txtCronExpression.Name = "txtCronExpression";
+ this.txtCronExpression.ReadOnly = true;
+ this.txtCronExpression.Size = new System.Drawing.Size(100, 20);
+ this.txtCronExpression.TabIndex = 12;
+ this.txtCronExpression.Text = "txtCronExpression";
+ //
+ // CronTriggerDisplay
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.txtCronExpression);
+ this.Controls.Add(this.lblNextFireTime);
+ this.Controls.Add(this.label11);
+ this.Controls.Add(this.lblPreviousFireTime);
+ this.Controls.Add(this.label9);
+ this.Controls.Add(this.lblDescription);
+ this.Controls.Add(this.label7);
+ this.Controls.Add(this.lblGroup);
+ this.Controls.Add(this.label5);
+ this.Controls.Add(this.lblName);
+ this.Controls.Add(this.label3);
+ this.Controls.Add(this.label1);
+ this.Name = "CronTriggerDisplay";
+ this.Size = new System.Drawing.Size(324, 168);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Label lblName;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.Label lblGroup;
+ private System.Windows.Forms.Label label5;
+ private System.Windows.Forms.Label lblDescription;
+ private System.Windows.Forms.Label label7;
+ private System.Windows.Forms.Label lblPreviousFireTime;
+ private System.Windows.Forms.Label label9;
+ private System.Windows.Forms.Label lblNextFireTime;
+ private System.Windows.Forms.Label label11;
+ private System.Windows.Forms.TextBox txtCronExpression;
+ }
+}
diff --git a/ClickForensics.Quartz.Manager/CronTriggerDisplay.cs b/ClickForensics.Quartz.Manager/CronTriggerDisplay.cs
new file mode 100644
index 0000000..62f31db
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/CronTriggerDisplay.cs
@@ -0,0 +1,54 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using Quartz;
+
+namespace ClickForensics.Quartz.Manager
+{
+ public partial class CronTriggerDisplay : UserControl
+ {
+ public CronTriggerDisplay()
+ {
+ InitializeComponent();
+ this.Load += new EventHandler(CronTriggerDisplay_Load);
+ }
+
+ void CronTriggerDisplay_Load(object sender, EventArgs e)
+ {
+ txtCronExpression.Text = _trigger.CronExpressionString;
+ lblDescription.Text = _trigger.Description;
+ lblGroup.Text = _trigger.Group;
+ lblName.Text = _trigger.Name;
+ if (_trigger.GetNextFireTimeUtc().HasValue)
+ {
+ lblNextFireTime.Text = _trigger.GetNextFireTimeUtc().Value.ToLocalTime().ToString();
+ }
+ else
+ {
+ lblNextFireTime.Text = "Unknown";
+ }
+
+ if (_trigger.GetPreviousFireTimeUtc().HasValue)
+ {
+ lblPreviousFireTime.Text = _trigger.GetPreviousFireTimeUtc().Value.ToLocalTime().ToString();
+ }
+ else
+ {
+ lblPreviousFireTime.Text = "Unknown";
+ }
+ }
+ public CronTriggerDisplay(CronTrigger trigger)
+ : this()
+ {
+ _trigger = trigger;
+
+ }
+
+ private CronTrigger _trigger;
+ }
+}
diff --git a/ClickForensics.Quartz.Manager/CronTriggerDisplay.resx b/ClickForensics.Quartz.Manager/CronTriggerDisplay.resx
new file mode 100644
index 0000000..d58980a
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/CronTriggerDisplay.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/ClickForensics.Quartz.Manager/ErrorDialog.Designer.cs b/ClickForensics.Quartz.Manager/ErrorDialog.Designer.cs
new file mode 100644
index 0000000..cb13ce9
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/ErrorDialog.Designer.cs
@@ -0,0 +1,84 @@
+namespace ClickForensics.Quartz.Manager
+{
+ partial class ErrorDialog
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.btnOk = new System.Windows.Forms.Button();
+ this.lblMessage = new System.Windows.Forms.Label();
+ this.txtLongMessage = new System.Windows.Forms.TextBox();
+ this.SuspendLayout();
+ //
+ // btnOk
+ //
+ this.btnOk.Location = new System.Drawing.Point(168, 184);
+ this.btnOk.Name = "btnOk";
+ this.btnOk.Size = new System.Drawing.Size(75, 23);
+ this.btnOk.TabIndex = 0;
+ this.btnOk.Text = "OK";
+ this.btnOk.UseVisualStyleBackColor = true;
+ this.btnOk.Click += new System.EventHandler(this.btnOk_Click);
+ //
+ // lblMessage
+ //
+ this.lblMessage.AutoSize = true;
+ this.lblMessage.Location = new System.Drawing.Point(41, 44);
+ this.lblMessage.Name = "lblMessage";
+ this.lblMessage.Size = new System.Drawing.Size(29, 13);
+ this.lblMessage.TabIndex = 1;
+ this.lblMessage.Text = "Error";
+ //
+ // txtLongMessage
+ //
+ this.txtLongMessage.Location = new System.Drawing.Point(44, 72);
+ this.txtLongMessage.Multiline = true;
+ this.txtLongMessage.Name = "txtLongMessage";
+ this.txtLongMessage.Size = new System.Drawing.Size(335, 96);
+ this.txtLongMessage.TabIndex = 2;
+ //
+ // ErrorDialog
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(437, 266);
+ this.Controls.Add(this.txtLongMessage);
+ this.Controls.Add(this.lblMessage);
+ this.Controls.Add(this.btnOk);
+ this.Name = "ErrorDialog";
+ this.Text = "ErrorDialog";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Button btnOk;
+ private System.Windows.Forms.Label lblMessage;
+ private System.Windows.Forms.TextBox txtLongMessage;
+ }
+}
\ No newline at end of file
diff --git a/ClickForensics.Quartz.Manager/ErrorDialog.cs b/ClickForensics.Quartz.Manager/ErrorDialog.cs
new file mode 100644
index 0000000..5e66a73
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/ErrorDialog.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace ClickForensics.Quartz.Manager
+{
+ public partial class ErrorDialog : Form
+ {
+ public ErrorDialog()
+ {
+ InitializeComponent();
+ Load += new EventHandler(ErrorDialog_Load);
+ }
+
+ void ErrorDialog_Load(object sender, EventArgs e)
+ {
+ lblMessage.Text = Message;
+ txtLongMessage.Text = Description;
+ }
+ public string Message { get; set; }
+ public string Description { get; set; }
+ private void btnOk_Click(object sender, EventArgs e)
+ {
+ this.Close();
+ }
+ }
+}
diff --git a/ClickForensics.Quartz.Manager/ErrorDialog.resx b/ClickForensics.Quartz.Manager/ErrorDialog.resx
new file mode 100644
index 0000000..19dc0dd
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/ErrorDialog.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/ClickForensics.Quartz.Manager/JobAssemblies.txt b/ClickForensics.Quartz.Manager/JobAssemblies.txt
new file mode 100644
index 0000000..f0d1c3a
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/JobAssemblies.txt
@@ -0,0 +1,2 @@
+ClickForensics.Quartz.Jobs.dll
+Quartz.dll
\ No newline at end of file
diff --git a/ClickForensics.Quartz.Manager/JobNode.cs b/ClickForensics.Quartz.Manager/JobNode.cs
new file mode 100644
index 0000000..4b497ae
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/JobNode.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using Quartz;
+
+namespace ClickForensics.Quartz.Manager
+{
+ public class JobNode : TreeNode
+ {
+ public JobNode(JobDetail jobDetail)
+ : base()
+ {
+ this.Text = jobDetail.Name;
+ Detail = jobDetail;
+ }
+ public JobDetail Detail { get; private set; }
+
+ }
+}
diff --git a/ClickForensics.Quartz.Manager/JobType.cs b/ClickForensics.Quartz.Manager/JobType.cs
new file mode 100644
index 0000000..1bef3e7
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/JobType.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace ClickForensics.Quartz.Manager
+{
+ class JobType
+ {
+ public string FullName { get; set; }
+ public string AssemblyName { get; set; }
+ public override string ToString()
+ {
+ return FullName;
+ }
+ }
+}
diff --git a/ClickForensics.Quartz.Manager/MainForm.Designer.cs b/ClickForensics.Quartz.Manager/MainForm.Designer.cs
new file mode 100644
index 0000000..a3ba07c
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/MainForm.Designer.cs
@@ -0,0 +1,486 @@
+namespace ClickForensics.Quartz.Manager
+{
+ partial class MainForm
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ this.mainMenuStrip = new System.Windows.Forms.MenuStrip();
+ this.schedulerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.connectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.configureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.jobsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.addJobToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.listenersStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.globalListenersToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.addGlobalJobListenerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.addTriggerListenerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.addJobListenerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
+ this.deleteThemAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.statusStrip1 = new System.Windows.Forms.StatusStrip();
+ this.serverConnectStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
+ this.StripStatusLabel_Job_Groups = new System.Windows.Forms.ToolStripStatusLabel();
+ this.StripStatusLabel_Jobs_Refresh_date = new System.Windows.Forms.ToolStripStatusLabel();
+ this.jobGroupsTreeView = new System.Windows.Forms.TreeView();
+ this.label1 = new System.Windows.Forms.Label();
+ this.label2 = new System.Windows.Forms.Label();
+ this.btnRefreshRunningJobs = new System.Windows.Forms.Button();
+ this.btnRefreshJobGroups = new System.Windows.Forms.Button();
+ this.btnDeleteJob = new System.Windows.Forms.Button();
+ this.btnRunJobNow = new System.Windows.Forms.Button();
+ this.btnPause = new System.Windows.Forms.Button();
+ this.pnlDetails = new System.Windows.Forms.Panel();
+ this.label3 = new System.Windows.Forms.Label();
+ this.btnEdit = new System.Windows.Forms.Button();
+ this.ctxScheduler = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.backupToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.timer_Refresh_Running_Jobs = new System.Windows.Forms.Timer(this.components);
+ this.listView_RunningJobs = new System.Windows.Forms.ListView();
+ this.JobName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+ this.JobDuration = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+ this.button1 = new System.Windows.Forms.Button();
+ this.button2 = new System.Windows.Forms.Button();
+ this.button3 = new System.Windows.Forms.Button();
+ this.button4 = new System.Windows.Forms.Button();
+ this.mainMenuStrip.SuspendLayout();
+ this.statusStrip1.SuspendLayout();
+ this.ctxScheduler.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // mainMenuStrip
+ //
+ this.mainMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.schedulerToolStripMenuItem,
+ this.jobsToolStripMenuItem,
+ this.listenersStripMenuItem,
+ this.toolStripMenuItem1});
+ this.mainMenuStrip.Location = new System.Drawing.Point(0, 0);
+ this.mainMenuStrip.Name = "mainMenuStrip";
+ this.mainMenuStrip.Size = new System.Drawing.Size(913, 24);
+ this.mainMenuStrip.TabIndex = 0;
+ this.mainMenuStrip.Text = "menuStrip1";
+ //
+ // schedulerToolStripMenuItem
+ //
+ this.schedulerToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.connectToolStripMenuItem,
+ this.configureToolStripMenuItem});
+ this.schedulerToolStripMenuItem.Name = "schedulerToolStripMenuItem";
+ this.schedulerToolStripMenuItem.Size = new System.Drawing.Size(71, 20);
+ this.schedulerToolStripMenuItem.Text = "Scheduler";
+ //
+ // connectToolStripMenuItem
+ //
+ this.connectToolStripMenuItem.Name = "connectToolStripMenuItem";
+ this.connectToolStripMenuItem.Size = new System.Drawing.Size(127, 22);
+ this.connectToolStripMenuItem.Text = "Connect";
+ this.connectToolStripMenuItem.Click += new System.EventHandler(this.connectToolStripMenuItem_Click);
+ //
+ // configureToolStripMenuItem
+ //
+ this.configureToolStripMenuItem.Name = "configureToolStripMenuItem";
+ this.configureToolStripMenuItem.Size = new System.Drawing.Size(127, 22);
+ this.configureToolStripMenuItem.Text = "Configure";
+ this.configureToolStripMenuItem.Click += new System.EventHandler(this.configureToolStripMenuItem_Click);
+ //
+ // jobsToolStripMenuItem
+ //
+ this.jobsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.addJobToolStripMenuItem});
+ this.jobsToolStripMenuItem.Enabled = false;
+ this.jobsToolStripMenuItem.Name = "jobsToolStripMenuItem";
+ this.jobsToolStripMenuItem.Size = new System.Drawing.Size(42, 20);
+ this.jobsToolStripMenuItem.Text = "Jobs";
+ //
+ // addJobToolStripMenuItem
+ //
+ this.addJobToolStripMenuItem.Name = "addJobToolStripMenuItem";
+ this.addJobToolStripMenuItem.Size = new System.Drawing.Size(96, 22);
+ this.addJobToolStripMenuItem.Text = "Add";
+ this.addJobToolStripMenuItem.Click += new System.EventHandler(this.addJobToolStripMenuItem_Click);
+ //
+ // listenersStripMenuItem
+ //
+ this.listenersStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.globalListenersToolStripMenuItem,
+ this.addJobListenerToolStripMenuItem});
+ this.listenersStripMenuItem.Enabled = false;
+ this.listenersStripMenuItem.Name = "listenersStripMenuItem";
+ this.listenersStripMenuItem.Size = new System.Drawing.Size(65, 20);
+ this.listenersStripMenuItem.Text = "Listeners";
+ //
+ // globalListenersToolStripMenuItem
+ //
+ this.globalListenersToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.addGlobalJobListenerToolStripMenuItem,
+ this.addTriggerListenerToolStripMenuItem});
+ this.globalListenersToolStripMenuItem.Name = "globalListenersToolStripMenuItem";
+ this.globalListenersToolStripMenuItem.Size = new System.Drawing.Size(161, 22);
+ this.globalListenersToolStripMenuItem.Text = "Global";
+ //
+ // addGlobalJobListenerToolStripMenuItem
+ //
+ this.addGlobalJobListenerToolStripMenuItem.Name = "addGlobalJobListenerToolStripMenuItem";
+ this.addGlobalJobListenerToolStripMenuItem.Size = new System.Drawing.Size(181, 22);
+ this.addGlobalJobListenerToolStripMenuItem.Text = "Add Job Listener";
+ this.addGlobalJobListenerToolStripMenuItem.Click += new System.EventHandler(this.addGlobalListenerToolStripMenuItem_Click);
+ //
+ // addTriggerListenerToolStripMenuItem
+ //
+ this.addTriggerListenerToolStripMenuItem.Name = "addTriggerListenerToolStripMenuItem";
+ this.addTriggerListenerToolStripMenuItem.Size = new System.Drawing.Size(181, 22);
+ this.addTriggerListenerToolStripMenuItem.Text = "Add Trigger Listener";
+ //
+ // addJobListenerToolStripMenuItem
+ //
+ this.addJobListenerToolStripMenuItem.Name = "addJobListenerToolStripMenuItem";
+ this.addJobListenerToolStripMenuItem.Size = new System.Drawing.Size(161, 22);
+ this.addJobListenerToolStripMenuItem.Text = "Add Job Listener";
+ this.addJobListenerToolStripMenuItem.Click += new System.EventHandler(this.addJobListenerToolStripMenuItem_Click);
+ //
+ // toolStripMenuItem1
+ //
+ this.toolStripMenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.deleteThemAllToolStripMenuItem});
+ this.toolStripMenuItem1.Name = "toolStripMenuItem1";
+ this.toolStripMenuItem1.Size = new System.Drawing.Size(94, 20);
+ this.toolStripMenuItem1.Text = "Miscellaneous";
+ //
+ // deleteThemAllToolStripMenuItem
+ //
+ this.deleteThemAllToolStripMenuItem.Name = "deleteThemAllToolStripMenuItem";
+ this.deleteThemAllToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+ this.deleteThemAllToolStripMenuItem.Text = "DeleteThemAll";
+ this.deleteThemAllToolStripMenuItem.Click += new System.EventHandler(this.deleteThemAllToolStripMenuItem_Click);
+ //
+ // statusStrip1
+ //
+ this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.serverConnectStatusLabel,
+ this.StripStatusLabel_Job_Groups,
+ this.StripStatusLabel_Jobs_Refresh_date});
+ this.statusStrip1.Location = new System.Drawing.Point(0, 639);
+ this.statusStrip1.Name = "statusStrip1";
+ this.statusStrip1.Size = new System.Drawing.Size(913, 22);
+ this.statusStrip1.TabIndex = 1;
+ this.statusStrip1.Text = "statusStrip1";
+ //
+ // serverConnectStatusLabel
+ //
+ this.serverConnectStatusLabel.Name = "serverConnectStatusLabel";
+ this.serverConnectStatusLabel.Size = new System.Drawing.Size(86, 17);
+ this.serverConnectStatusLabel.Text = "Not connected";
+ //
+ // StripStatusLabel_Job_Groups
+ //
+ this.StripStatusLabel_Job_Groups.BackColor = System.Drawing.Color.LightCyan;
+ this.StripStatusLabel_Job_Groups.Name = "StripStatusLabel_Job_Groups";
+ this.StripStatusLabel_Job_Groups.Size = new System.Drawing.Size(157, 17);
+ this.StripStatusLabel_Job_Groups.Text = "StripStatusLabel_Job_Groups";
+ this.StripStatusLabel_Job_Groups.ToolTipText = "Last Refresh of Job Groups";
+ //
+ // StripStatusLabel_Jobs_Refresh_date
+ //
+ this.StripStatusLabel_Jobs_Refresh_date.BackColor = System.Drawing.SystemColors.ActiveCaptionText;
+ this.StripStatusLabel_Jobs_Refresh_date.Name = "StripStatusLabel_Jobs_Refresh_date";
+ this.StripStatusLabel_Jobs_Refresh_date.Size = new System.Drawing.Size(191, 17);
+ this.StripStatusLabel_Jobs_Refresh_date.Text = "StripStatusLabel_Jobs_Refresh_date";
+ this.StripStatusLabel_Jobs_Refresh_date.ToolTipText = "Last Refresh Date of Running Jobs";
+ //
+ // jobGroupsTreeView
+ //
+ this.jobGroupsTreeView.HideSelection = false;
+ this.jobGroupsTreeView.Location = new System.Drawing.Point(8, 48);
+ this.jobGroupsTreeView.Name = "jobGroupsTreeView";
+ this.jobGroupsTreeView.Size = new System.Drawing.Size(351, 252);
+ this.jobGroupsTreeView.TabIndex = 2;
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(8, 32);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(94, 13);
+ this.label1.TabIndex = 4;
+ this.label1.Text = "Scheduler Objects";
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(9, 319);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(72, 13);
+ this.label2.TabIndex = 5;
+ this.label2.Text = "Running Jobs";
+ //
+ // btnRefreshRunningJobs
+ //
+ this.btnRefreshRunningJobs.Location = new System.Drawing.Point(371, 609);
+ this.btnRefreshRunningJobs.Name = "btnRefreshRunningJobs";
+ this.btnRefreshRunningJobs.Size = new System.Drawing.Size(75, 23);
+ this.btnRefreshRunningJobs.TabIndex = 6;
+ this.btnRefreshRunningJobs.Text = "Refresh";
+ this.btnRefreshRunningJobs.UseVisualStyleBackColor = true;
+ this.btnRefreshRunningJobs.Click += new System.EventHandler(this.btnRefreshRunningJobs_Click);
+ //
+ // btnRefreshJobGroups
+ //
+ this.btnRefreshJobGroups.Location = new System.Drawing.Point(284, 306);
+ this.btnRefreshJobGroups.Name = "btnRefreshJobGroups";
+ this.btnRefreshJobGroups.Size = new System.Drawing.Size(75, 23);
+ this.btnRefreshJobGroups.TabIndex = 7;
+ this.btnRefreshJobGroups.Text = "Refresh";
+ this.btnRefreshJobGroups.UseVisualStyleBackColor = true;
+ this.btnRefreshJobGroups.Click += new System.EventHandler(this.btnRefreshJobGroups_Click);
+ //
+ // btnDeleteJob
+ //
+ this.btnDeleteJob.Enabled = false;
+ this.btnDeleteJob.Location = new System.Drawing.Point(665, 309);
+ this.btnDeleteJob.Name = "btnDeleteJob";
+ this.btnDeleteJob.Size = new System.Drawing.Size(65, 23);
+ this.btnDeleteJob.TabIndex = 8;
+ this.btnDeleteJob.Text = "Delete";
+ this.btnDeleteJob.UseVisualStyleBackColor = true;
+ this.btnDeleteJob.Click += new System.EventHandler(this.btnDeleteJob_Click);
+ //
+ // btnRunJobNow
+ //
+ this.btnRunJobNow.Enabled = false;
+ this.btnRunJobNow.Location = new System.Drawing.Point(523, 309);
+ this.btnRunJobNow.Name = "btnRunJobNow";
+ this.btnRunJobNow.Size = new System.Drawing.Size(65, 23);
+ this.btnRunJobNow.TabIndex = 9;
+ this.btnRunJobNow.Text = "Run";
+ this.btnRunJobNow.UseVisualStyleBackColor = true;
+ this.btnRunJobNow.Click += new System.EventHandler(this.btnRunJobNow_Click);
+ //
+ // btnPause
+ //
+ this.btnPause.Enabled = false;
+ this.btnPause.Location = new System.Drawing.Point(594, 309);
+ this.btnPause.Name = "btnPause";
+ this.btnPause.Size = new System.Drawing.Size(65, 23);
+ this.btnPause.TabIndex = 10;
+ this.btnPause.Text = "Pause";
+ this.btnPause.UseVisualStyleBackColor = true;
+ this.btnPause.Click += new System.EventHandler(this.btnPause_Click);
+ //
+ // pnlDetails
+ //
+ this.pnlDetails.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.pnlDetails.Location = new System.Drawing.Point(523, 48);
+ this.pnlDetails.Name = "pnlDetails";
+ this.pnlDetails.Size = new System.Drawing.Size(342, 252);
+ this.pnlDetails.TabIndex = 11;
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.Location = new System.Drawing.Point(520, 32);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(39, 13);
+ this.label3.TabIndex = 12;
+ this.label3.Text = "Details";
+ //
+ // btnEdit
+ //
+ this.btnEdit.Enabled = false;
+ this.btnEdit.Location = new System.Drawing.Point(736, 309);
+ this.btnEdit.Name = "btnEdit";
+ this.btnEdit.Size = new System.Drawing.Size(65, 23);
+ this.btnEdit.TabIndex = 13;
+ this.btnEdit.Text = "Edit";
+ this.btnEdit.UseVisualStyleBackColor = true;
+ this.btnEdit.Click += new System.EventHandler(this.btnEdit_Click);
+ //
+ // ctxScheduler
+ //
+ this.ctxScheduler.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.backupToolStripMenuItem});
+ this.ctxScheduler.Name = "ctxScheduler";
+ this.ctxScheduler.Size = new System.Drawing.Size(109, 26);
+ //
+ // backupToolStripMenuItem
+ //
+ this.backupToolStripMenuItem.Name = "backupToolStripMenuItem";
+ this.backupToolStripMenuItem.Size = new System.Drawing.Size(108, 22);
+ this.backupToolStripMenuItem.Text = "Backup";
+ this.backupToolStripMenuItem.Click += new System.EventHandler(this.backupToolStripMenuItem_Click);
+ //
+ // timer_Refresh_Running_Jobs
+ //
+ this.timer_Refresh_Running_Jobs.Interval = 30000;
+ this.timer_Refresh_Running_Jobs.Tick += new System.EventHandler(this.timer_Refresh_Running_Jobs_Tick);
+ //
+ // listView_RunningJobs
+ //
+ this.listView_RunningJobs.AllowColumnReorder = true;
+ this.listView_RunningJobs.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+ this.JobName,
+ this.JobDuration});
+ this.listView_RunningJobs.Location = new System.Drawing.Point(11, 335);
+ this.listView_RunningJobs.Name = "listView_RunningJobs";
+ this.listView_RunningJobs.Size = new System.Drawing.Size(719, 268);
+ this.listView_RunningJobs.Sorting = System.Windows.Forms.SortOrder.Ascending;
+ this.listView_RunningJobs.TabIndex = 14;
+ this.listView_RunningJobs.UseCompatibleStateImageBehavior = false;
+ this.listView_RunningJobs.View = System.Windows.Forms.View.Details;
+ this.listView_RunningJobs.SelectedIndexChanged += new System.EventHandler(this.listView_RunningJobs_SelectedIndexChanged);
+ //
+ // JobName
+ //
+ this.JobName.Text = "Job Name";
+ //
+ // JobDuration
+ //
+ this.JobDuration.Text = "Duration";
+ //
+ // button1
+ //
+ this.button1.Enabled = false;
+ this.button1.Location = new System.Drawing.Point(665, 309);
+ this.button1.Name = "button1";
+ this.button1.Size = new System.Drawing.Size(65, 23);
+ this.button1.TabIndex = 8;
+ this.button1.Text = "Delete";
+ this.button1.UseVisualStyleBackColor = true;
+ this.button1.Click += new System.EventHandler(this.btnDeleteJob_Click);
+ //
+ // button2
+ //
+ this.button2.Enabled = false;
+ this.button2.Location = new System.Drawing.Point(523, 309);
+ this.button2.Name = "button2";
+ this.button2.Size = new System.Drawing.Size(65, 23);
+ this.button2.TabIndex = 9;
+ this.button2.Text = "Run";
+ this.button2.UseVisualStyleBackColor = true;
+ this.button2.Click += new System.EventHandler(this.btnRunJobNow_Click);
+ //
+ // button3
+ //
+ this.button3.Enabled = false;
+ this.button3.Location = new System.Drawing.Point(594, 309);
+ this.button3.Name = "button3";
+ this.button3.Size = new System.Drawing.Size(65, 23);
+ this.button3.TabIndex = 10;
+ this.button3.Text = "Pause";
+ this.button3.UseVisualStyleBackColor = true;
+ this.button3.Click += new System.EventHandler(this.btnPause_Click);
+ //
+ // button4
+ //
+ this.button4.Enabled = false;
+ this.button4.Location = new System.Drawing.Point(736, 309);
+ this.button4.Name = "button4";
+ this.button4.Size = new System.Drawing.Size(65, 23);
+ this.button4.TabIndex = 13;
+ this.button4.Text = "Edit";
+ this.button4.UseVisualStyleBackColor = true;
+ this.button4.Click += new System.EventHandler(this.btnEdit_Click);
+ //
+ // MainForm
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(913, 661);
+ this.Controls.Add(this.listView_RunningJobs);
+ this.Controls.Add(this.pnlDetails);
+ this.Controls.Add(this.label3);
+ this.Controls.Add(this.btnRefreshJobGroups);
+ this.Controls.Add(this.button4);
+ this.Controls.Add(this.btnEdit);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.button3);
+ this.Controls.Add(this.btnPause);
+ this.Controls.Add(this.btnRefreshRunningJobs);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.button2);
+ this.Controls.Add(this.statusStrip1);
+ this.Controls.Add(this.btnRunJobNow);
+ this.Controls.Add(this.mainMenuStrip);
+ this.Controls.Add(this.button1);
+ this.Controls.Add(this.btnDeleteJob);
+ this.Controls.Add(this.jobGroupsTreeView);
+ this.MainMenuStrip = this.mainMenuStrip;
+ this.Name = "MainForm";
+ this.Text = "Quartz Manager";
+ this.mainMenuStrip.ResumeLayout(false);
+ this.mainMenuStrip.PerformLayout();
+ this.statusStrip1.ResumeLayout(false);
+ this.statusStrip1.PerformLayout();
+ this.ctxScheduler.ResumeLayout(false);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.MenuStrip mainMenuStrip;
+ private System.Windows.Forms.ToolStripMenuItem schedulerToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem connectToolStripMenuItem;
+ private System.Windows.Forms.StatusStrip statusStrip1;
+ private System.Windows.Forms.ToolStripStatusLabel serverConnectStatusLabel;
+ private System.Windows.Forms.TreeView jobGroupsTreeView;
+ private System.Windows.Forms.ToolStripMenuItem listenersStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem globalListenersToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem addGlobalJobListenerToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem addTriggerListenerToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem addJobListenerToolStripMenuItem;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.ToolStripMenuItem jobsToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem addJobToolStripMenuItem;
+ private System.Windows.Forms.Button btnRefreshRunningJobs;
+ private System.Windows.Forms.Button btnRefreshJobGroups;
+ private System.Windows.Forms.Button btnDeleteJob;
+ private System.Windows.Forms.Button btnRunJobNow;
+ private System.Windows.Forms.Button btnPause;
+ private System.Windows.Forms.ToolStripMenuItem configureToolStripMenuItem;
+ private System.Windows.Forms.Panel pnlDetails;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.Button btnEdit;
+ private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1;
+ private System.Windows.Forms.ToolStripMenuItem deleteThemAllToolStripMenuItem;
+ private System.Windows.Forms.ContextMenuStrip ctxScheduler;
+ private System.Windows.Forms.ToolStripMenuItem backupToolStripMenuItem;
+ private System.Windows.Forms.Timer timer_Refresh_Running_Jobs;
+ private System.Windows.Forms.ToolStripStatusLabel StripStatusLabel_Jobs_Refresh_date;
+ private System.Windows.Forms.ToolStripStatusLabel StripStatusLabel_Job_Groups;
+ private System.Windows.Forms.ListView listView_RunningJobs;
+ private System.Windows.Forms.ColumnHeader JobName;
+ private System.Windows.Forms.ColumnHeader JobDuration;
+ private System.Windows.Forms.Button button1;
+ private System.Windows.Forms.Button button2;
+ private System.Windows.Forms.Button button3;
+ private System.Windows.Forms.Button button4;
+ }
+}
+
diff --git a/ClickForensics.Quartz.Manager/MainForm.cs b/ClickForensics.Quartz.Manager/MainForm.cs
new file mode 100644
index 0000000..a97170a
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/MainForm.cs
@@ -0,0 +1,412 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using Quartz;
+using Quartz.Collection;
+using System.Net.Sockets;
+//using ClickForensics.Quartz.Jobs;
+using System.IO;
+
+namespace ClickForensics.Quartz.Manager
+{
+ public partial class MainForm : Form
+ {
+ public MainForm()
+ {
+ InitializeComponent();
+ jobGroupsTreeView.AfterSelect += new TreeViewEventHandler(jobGroupsTreeView_AfterSelect);
+ ctxScheduler.Opening += new CancelEventHandler(ctxScheduler_Opening);
+ jobGroupsTreeView.MouseDown += new MouseEventHandler(jobGroupsTreeView_MouseDown);
+
+ }
+
+ void ctxScheduler_Opening(object sender, CancelEventArgs e)
+ {
+
+ }
+
+ void jobGroupsTreeView_AfterSelect(object sender, TreeViewEventArgs e)
+ {
+ jobDetailsToggle(false);
+ if (e.Node is TriggerNode || e.Node is JobNode)
+ {
+ btnDeleteJob.Enabled = true;
+ }
+ else
+ {
+ btnDeleteJob.Enabled = false;
+ }
+
+ if (e.Node is JobNode)
+ {
+ btnRunJobNow.Enabled = true;
+ pnlDetails.Controls.Add(new NativeJobDetailDisplay(((JobNode)e.Node).Detail));
+ jobDetailsToggle(true);
+ }
+ else
+ {
+ btnRunJobNow.Enabled = false;
+
+ }
+ if (e.Node is TriggerNode)
+ {
+ btnPause.Enabled = true;
+ setPauseButtonText();
+ if (((TriggerNode)e.Node).Trigger is CronTrigger)
+ {
+ pnlDetails.Controls.Add(new CronTriggerDisplay((CronTrigger)((TriggerNode)e.Node).Trigger));
+ jobDetailsToggle(true);
+ }
+ btnEdit.Enabled = true;
+ }
+ else
+ {
+ btnEdit.Enabled = false;
+ btnPause.Enabled = false;
+ }
+ }
+
+ private void setPauseButtonText()
+ {
+ TriggerNode node = (TriggerNode)jobGroupsTreeView.SelectedNode;
+ string name = node.Trigger.Name;
+ string group = node.Trigger.Group;
+ if (Scheduler.GetScheduler().GetTriggerState(name, group) == TriggerState.Paused)
+ {
+ btnPause.Text = "Resume";
+ }
+ else
+ {
+ btnPause.Text = "Pause";
+ }
+ }
+
+ private void connectToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ using (ServerConnectForm form = new ServerConnectForm())
+ {
+ form.ShowDialog();
+ try
+ {
+ Scheduler = new QuartzScheduler(form.Server, form.Port, form.Scheduler);
+ serverConnectStatusLabel.Text = string.Format("Connected to {0}", Scheduler.Address);
+ connectToolStripMenuItem.Enabled = false;
+ jobsToolStripMenuItem.Enabled = true;
+ loadJobGroups();
+ updateRunningJobs();
+ }
+ catch (SocketException ex)
+ {
+ ErrorDialog dialog = new ErrorDialog();
+ dialog.Message = string.Format("Unable to connect to scheduler {0} on {1}:{2}", form.Scheduler, form.Server, form.Port);
+ dialog.Description = ex.Message;
+ dialog.ShowDialog();
+ }
+ form.Close();
+ }
+ //loadGlobalTriggers();
+ }
+
+ //private void loadGlobalTriggers()
+ //{
+ // foreach (IJobListener jobListener in Scheduler.GetScheduler().GetJobDetail(null,null)..GlobalJobListeners)
+ // {
+ // globalTriggersListView.Items.Add(jobListener.Name);
+ // }
+ //}
+
+ private void loadJobGroups()
+ {
+
+ try
+ {
+ this.Cursor = Cursors.WaitCursor;
+
+ jobDetailsToggle(false);
+ jobGroupsTreeView.Nodes.Clear();
+ SchedulerNode schedulerNode = new SchedulerNode(Scheduler);
+ schedulerNode.ContextMenuStrip = ctxScheduler;
+ jobGroupsTreeView.Nodes.Add(schedulerNode);
+ TreeNode jobGroupsNode = schedulerNode.Nodes.Add("Job Groups");
+ string[] jobGroups = Scheduler.GetScheduler().JobGroupNames;
+ foreach (string jobGroup in jobGroups)
+ {
+ TreeNode jobGroupNode = jobGroupsNode.Nodes.Add(jobGroup);
+ TreeNode jobsNode = jobGroupNode.Nodes.Add("Jobs");
+ addJobNodes(jobsNode);
+ }
+
+ jobGroupsTreeView.Nodes[0].Expand();
+ jobGroupsNode.Expand();
+
+ StripStatusLabel_Job_Groups.Text = System.DateTime.Now.ToString("yyyy.MM.dd HH:mm.ss");
+
+ }
+ finally
+ {
+ this.Cursor = Cursors.Default;
+ }
+
+
+ }
+
+ private void jobDetailsToggle(System.Boolean isVisible)
+ {
+ if (isVisible == false)
+ {
+ pnlDetails.Controls.Clear();
+ }
+ }
+
+ void jobGroupsTreeView_MouseDown(object sender, MouseEventArgs e)
+ {
+ if (e.Button == MouseButtons.Right)
+ {
+ TreeNode node = jobGroupsTreeView.GetNodeAt(e.X, e.Y);
+ if (node != null)
+ {
+ jobGroupsTreeView.SelectedNode = node;
+ ctxScheduler.Show(jobGroupsTreeView, e.Location);
+ }
+ }
+ }
+ //private void loadJobs()
+ //{
+ // foreach (TreeNode node in jobGroupsTreeView.Nodes)
+ // {
+ // addJobNodes(node);
+ // }
+ //}
+
+ private void addJobNodes(TreeNode node)
+ {
+ string group = node.Parent.Text;
+ string[] jobs = Scheduler.GetScheduler().GetJobNames(group);
+ foreach (string jobName in jobs)
+ {
+ try
+ {
+ JobDetail detail = Scheduler.GetScheduler().GetJobDetail(jobName, group);
+ JobNode jobNode = new JobNode(detail);
+ node.Nodes.Add(jobNode);
+ addTriggerNodes(jobNode);
+ addListenerNodes(jobNode);
+ }
+ catch (Exception ex)
+ {
+ //TODO: Do something useful with this exception. Most likely cause is the client does not have a copy of a given dll and can't load the type.
+ }
+ }
+ }
+
+ private void addListenerNodes(JobNode node)
+ {
+ string jobName = node.Text;
+ string jobGroupName = node.Parent.Text;
+ string[] listenerNames = node.Detail.JobListenerNames;
+ foreach (string listener in listenerNames)
+ {
+ node.Text = string.Format("JL {0}", listenerNames);
+ }
+ //ISet set = Scheduler.GetScheduler().JobListenerNames;
+ }
+
+ private void addTriggerNodes(TreeNode treeNode)
+ {
+ Trigger[] triggers = Scheduler.GetScheduler().GetTriggersOfJob(treeNode.Text, treeNode.Parent.Parent.Text);
+ TreeNode triggersNode = treeNode.Nodes.Add("Triggers");
+ foreach (Trigger trigger in triggers)
+ {
+ TriggerNode node = new TriggerNode(trigger);
+ triggersNode.Nodes.Add(node);
+ }
+
+ }
+ private void updateRunningJobs()
+ {
+ try
+ {
+ this.Cursor = Cursors.WaitCursor;
+
+ timer_Refresh_Running_Jobs.Stop();
+
+ listView_RunningJobs.Items.Clear();
+
+ DataTable table = Scheduler.GetRunningJobs();
+ foreach (DataRow row in table.Rows)
+ {
+ //JobName JobDuration
+ ListViewItem item = new ListViewItem(new string[] { System.Convert.ToString(row["JobName"]), System.Convert.ToString(row["Runtime"]) });
+ listView_RunningJobs.Items.Add(item);
+ }
+ StripStatusLabel_Jobs_Refresh_date.Text = System.DateTime.Now.ToString("yyyy.MM.dd HH:mm.ss");
+
+
+ //reset the timer ( documentation not clear if .stop = restart @ 0 in timing, but changing the interval sure should do that. )
+ int timer_was = timer_Refresh_Running_Jobs.Interval;
+ timer_Refresh_Running_Jobs.Interval = timer_was + 1;
+ timer_Refresh_Running_Jobs.Interval = timer_was;
+
+ timer_Refresh_Running_Jobs.Start();
+ }
+ finally
+ {
+ this.Cursor = Cursors.Default;
+ }
+ }
+ public QuartzScheduler Scheduler { get; set; }
+
+ private void addGlobalListenerToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ AddListenerForm form = new AddListenerForm();
+ form.ListenerInterface = typeof(IJobListener);
+ form.ShowDialog();
+ JobDataMap map = new JobDataMap();
+ map.Add("type", form.ListenerType);
+ //Scheduler.ScheduleOneTimeJob(typeof(AddJobListenerJob), map, 0);
+ loadJobGroups();
+ }
+
+ private void addJobListenerToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ TreeNode selectedNode = jobGroupsTreeView.SelectedNode;
+ if (selectedNode != null && selectedNode is JobNode)
+ {
+ AddListenerForm form = new AddListenerForm();
+ form.ListenerInterface = typeof(IJobListener);
+ form.ShowDialog();
+ //JobHistoryListener listener = new JobHistoryListener();
+ //listener.Name = null;
+ //((JobNode)selectedNode).Detail.AddJobListener();
+ }
+ }
+
+ private void addJobToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ AddJobForm form = new AddJobForm();
+ form.ShowDialog();
+ if (form.JobDetail != null && form.Trigger != null)
+ {
+ Scheduler.GetScheduler().ScheduleJob(form.JobDetail, form.Trigger);
+ loadJobGroups();
+ }
+ }
+
+ private void btnRefreshRunningJobs_Click(object sender, EventArgs e)
+ {
+ updateRunningJobs();
+ }
+
+ private void btnRefreshJobGroups_Click(object sender, EventArgs e)
+ {
+ loadJobGroups();
+ }
+
+ private void btnRunJobNow_Click(object sender, EventArgs e)
+ {
+ JobNode node = (JobNode)jobGroupsTreeView.SelectedNode;
+ string job = node.Detail.Name;
+ string group = node.Detail.Group;
+ Scheduler.GetScheduler().TriggerJobWithVolatileTrigger(job, group);
+ }
+
+ private void btnDeleteJob_Click(object sender, EventArgs e)
+ {
+ TreeNode selectedNode = jobGroupsTreeView.SelectedNode;
+ if (selectedNode is JobNode)
+ {
+ JobNode node = (JobNode)jobGroupsTreeView.SelectedNode;
+ string job = node.Detail.Name;
+ string group = node.Detail.Group;
+ Scheduler.GetScheduler().DeleteJob(job, group);
+ jobGroupsTreeView.SelectedNode.Remove();
+
+ }
+ if (selectedNode is TriggerNode)
+ {
+ Scheduler.GetScheduler().UnscheduleJob(((TriggerNode)selectedNode).Trigger.Name, ((TriggerNode)selectedNode).Trigger.Group);
+ }
+
+ //loadJobGroups();
+ }
+
+ private void btnPause_Click(object sender, EventArgs e)
+ {
+ TriggerNode node = (TriggerNode)jobGroupsTreeView.SelectedNode;
+ string name = node.Trigger.Name;
+ string group = node.Trigger.Group;
+ if (Scheduler.GetScheduler().GetTriggerState(name, group) == TriggerState.Paused)
+ {
+ Scheduler.GetScheduler().ResumeTrigger(name, group);
+ }
+ else
+ {
+ Scheduler.GetScheduler().PauseTrigger(name, group);
+ }
+ setPauseButtonText();
+ }
+
+ private void assembliesToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+
+ }
+
+ private void configureToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+
+ }
+
+ private void btnEdit_Click(object sender, EventArgs e)
+ {
+ TriggerNode node = (TriggerNode)jobGroupsTreeView.SelectedNode;
+ AddJobForm form = new AddJobForm(node);
+ form.ShowDialog();
+ if (form.JobDetail != null && form.Trigger != null)
+ {
+ Scheduler.GetScheduler().RescheduleJob(node.Trigger.Name, node.Trigger.Group, form.Trigger);
+ loadJobGroups();
+ }
+ }
+
+ private void deleteThemAllToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ foreach (var job in Scheduler.GetScheduler().GetJobNames("Cube"))
+ {
+ if (job.Contains("CreateCubeFor"))
+ {
+
+ Scheduler.GetScheduler().DeleteJob(job, "Cube");
+ }
+ }
+ }
+
+ private void backupToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ QuartzScheduler scheduler = ((SchedulerNode)((TreeView)((ContextMenuStrip)((ToolStripMenuItem)sender).Owner).SourceControl).SelectedNode).Scheduler;
+ FileDialog dialog = new SaveFileDialog();
+ dialog.ShowDialog();
+ FileInfo file = new FileInfo(dialog.FileName);
+ scheduler.BackupToFile(file);
+ }
+
+ private void timer_Refresh_Running_Jobs_Tick(object sender, EventArgs e)
+ {
+ updateRunningJobs();
+ }
+
+ private void runningJobsListView_SelectedIndexChanged(object sender, EventArgs e)
+ {
+
+ }
+
+ private void listView_RunningJobs_SelectedIndexChanged(object sender, EventArgs e)
+ {
+
+ }
+ }
+}
diff --git a/ClickForensics.Quartz.Manager/MainForm.resx b/ClickForensics.Quartz.Manager/MainForm.resx
new file mode 100644
index 0000000..8d62819
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/MainForm.resx
@@ -0,0 +1,135 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 17, 17
+
+
+ 143, 17
+
+
+ 259, 17
+
+
+ 374, 5
+
+
+ 25
+
+
\ No newline at end of file
diff --git a/ClickForensics.Quartz.Manager/NativeJobDetailDisplay.Designer.cs b/ClickForensics.Quartz.Manager/NativeJobDetailDisplay.Designer.cs
new file mode 100644
index 0000000..dc2e248
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/NativeJobDetailDisplay.Designer.cs
@@ -0,0 +1,163 @@
+namespace ClickForensics.Quartz.Manager
+{
+ partial class NativeJobDetailDisplay
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.lblName = new System.Windows.Forms.Label();
+ this.label3 = new System.Windows.Forms.Label();
+ this.lblGroup = new System.Windows.Forms.Label();
+ this.label2 = new System.Windows.Forms.Label();
+ this.lblDescription = new System.Windows.Forms.Label();
+ this.label5 = new System.Windows.Forms.Label();
+ this.label10 = new System.Windows.Forms.Label();
+ this.jobDataListView = new System.Windows.Forms.ListView();
+ this.columnHeader1 = new System.Windows.Forms.ColumnHeader();
+ this.columnHeader2 = new System.Windows.Forms.ColumnHeader();
+ this.SuspendLayout();
+ //
+ // lblName
+ //
+ this.lblName.AutoSize = true;
+ this.lblName.Location = new System.Drawing.Point(121, 15);
+ this.lblName.Name = "lblName";
+ this.lblName.Size = new System.Drawing.Size(35, 13);
+ this.lblName.TabIndex = 5;
+ this.lblName.Text = "label2";
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.Location = new System.Drawing.Point(21, 15);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(38, 13);
+ this.label3.TabIndex = 4;
+ this.label3.Text = "Name:";
+ //
+ // lblGroup
+ //
+ this.lblGroup.AutoSize = true;
+ this.lblGroup.Location = new System.Drawing.Point(121, 36);
+ this.lblGroup.Name = "lblGroup";
+ this.lblGroup.Size = new System.Drawing.Size(35, 13);
+ this.lblGroup.TabIndex = 7;
+ this.lblGroup.Text = "label2";
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(21, 36);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(39, 13);
+ this.label2.TabIndex = 6;
+ this.label2.Text = "Group:";
+ //
+ // lblDescription
+ //
+ this.lblDescription.AutoSize = true;
+ this.lblDescription.Location = new System.Drawing.Point(121, 57);
+ this.lblDescription.Name = "lblDescription";
+ this.lblDescription.Size = new System.Drawing.Size(35, 13);
+ this.lblDescription.TabIndex = 9;
+ this.lblDescription.Text = "label2";
+ //
+ // label5
+ //
+ this.label5.AutoSize = true;
+ this.label5.Location = new System.Drawing.Point(21, 57);
+ this.label5.Name = "label5";
+ this.label5.Size = new System.Drawing.Size(63, 13);
+ this.label5.TabIndex = 8;
+ this.label5.Text = "Description:";
+ //
+ // label10
+ //
+ this.label10.AutoSize = true;
+ this.label10.Location = new System.Drawing.Point(21, 79);
+ this.label10.Name = "label10";
+ this.label10.Size = new System.Drawing.Size(53, 13);
+ this.label10.TabIndex = 23;
+ this.label10.Text = "Job Data:";
+ //
+ // jobDataListView
+ //
+ this.jobDataListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+ this.columnHeader1,
+ this.columnHeader2});
+ this.jobDataListView.FullRowSelect = true;
+ this.jobDataListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
+ this.jobDataListView.Location = new System.Drawing.Point(24, 105);
+ this.jobDataListView.MultiSelect = false;
+ this.jobDataListView.Name = "jobDataListView";
+ this.jobDataListView.Size = new System.Drawing.Size(298, 142);
+ this.jobDataListView.TabIndex = 22;
+ this.jobDataListView.UseCompatibleStateImageBehavior = false;
+ this.jobDataListView.View = System.Windows.Forms.View.Details;
+ //
+ // columnHeader1
+ //
+ this.columnHeader1.Text = "Key";
+ this.columnHeader1.Width = 82;
+ //
+ // columnHeader2
+ //
+ this.columnHeader2.Text = "Value";
+ this.columnHeader2.Width = 145;
+ //
+ // NativeJobDetailDisplay
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.label10);
+ this.Controls.Add(this.jobDataListView);
+ this.Controls.Add(this.lblDescription);
+ this.Controls.Add(this.label5);
+ this.Controls.Add(this.lblGroup);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.lblName);
+ this.Controls.Add(this.label3);
+ this.Name = "NativeJobDetailDisplay";
+ this.Size = new System.Drawing.Size(342, 273);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label lblName;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.Label lblGroup;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Label lblDescription;
+ private System.Windows.Forms.Label label5;
+ private System.Windows.Forms.Label label10;
+ private System.Windows.Forms.ListView jobDataListView;
+ private System.Windows.Forms.ColumnHeader columnHeader1;
+ private System.Windows.Forms.ColumnHeader columnHeader2;
+ }
+}
diff --git a/ClickForensics.Quartz.Manager/NativeJobDetailDisplay.cs b/ClickForensics.Quartz.Manager/NativeJobDetailDisplay.cs
new file mode 100644
index 0000000..15dfa71
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/NativeJobDetailDisplay.cs
@@ -0,0 +1,44 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using Quartz;
+
+namespace ClickForensics.Quartz.Manager
+{
+ public partial class NativeJobDetailDisplay : UserControl
+ {
+ public NativeJobDetailDisplay()
+ {
+ InitializeComponent();
+ this.Load += new EventHandler(NativeJobDetailDisplay_Load);
+ }
+
+ void NativeJobDetailDisplay_Load(object sender, EventArgs e)
+ {
+ lblDescription.Text = _detail.Description;
+ lblGroup.Text = _detail.Group;
+ lblName.Text = _detail.Name;
+ loadJobDataMap();
+ }
+
+ private void loadJobDataMap()
+ {
+ foreach (var item in _detail.JobDataMap.GetKeys())
+ {
+ jobDataListView.Items.Add(new ListViewItem(new string[] { item, _detail.JobDataMap.Get(item).ToString() }));
+ }
+ }
+ public NativeJobDetailDisplay(JobDetail detail)
+ : this()
+ {
+ _detail = detail;
+ }
+ private JobDetail _detail;
+
+ }
+}
diff --git a/ClickForensics.Quartz.Manager/NativeJobDetailDisplay.resx b/ClickForensics.Quartz.Manager/NativeJobDetailDisplay.resx
new file mode 100644
index 0000000..19dc0dd
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/NativeJobDetailDisplay.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/ClickForensics.Quartz.Manager/Program.cs b/ClickForensics.Quartz.Manager/Program.cs
new file mode 100644
index 0000000..352d501
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/Program.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Windows.Forms;
+
+namespace ClickForensics.Quartz.Manager
+{
+ static class Program
+ {
+ ///
+ /// The main entry point for the application.
+ ///
+ [STAThread]
+ static void Main()
+ {
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ Application.Run(new MainForm());
+ }
+ }
+}
diff --git a/ClickForensics.Quartz.Manager/Properties/AssemblyInfo.cs b/ClickForensics.Quartz.Manager/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..66ca997
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("ClickForensics.Quartz.Manager")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("ClickForensics.Quartz.Manager")]
+[assembly: AssemblyCopyright("Copyright © 2009")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("e3c9ecad-833f-427c-9354-8e487448d3ee")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/ClickForensics.Quartz.Manager/Properties/Resources.Designer.cs b/ClickForensics.Quartz.Manager/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..bbeda12
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/Properties/Resources.Designer.cs
@@ -0,0 +1,63 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.1
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace ClickForensics.Quartz.Manager.Properties {
+ using System;
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ClickForensics.Quartz.Manager.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/ClickForensics.Quartz.Manager/Properties/Resources.resx b/ClickForensics.Quartz.Manager/Properties/Resources.resx
new file mode 100644
index 0000000..af7dbeb
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/Properties/Resources.resx
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/ClickForensics.Quartz.Manager/Properties/Settings.Designer.cs b/ClickForensics.Quartz.Manager/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..83af5f1
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/Properties/Settings.Designer.cs
@@ -0,0 +1,26 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.1
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace ClickForensics.Quartz.Manager.Properties {
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default {
+ get {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/ClickForensics.Quartz.Manager/Properties/Settings.settings b/ClickForensics.Quartz.Manager/Properties/Settings.settings
new file mode 100644
index 0000000..3964565
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/Properties/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/ClickForensics.Quartz.Manager/QuartzScheduler.cs b/ClickForensics.Quartz.Manager/QuartzScheduler.cs
new file mode 100644
index 0000000..51450f1
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/QuartzScheduler.cs
@@ -0,0 +1,304 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Web;
+using System.Collections.Specialized;
+using Quartz.Impl;
+using Quartz;
+using System.Data;
+using System.Configuration;
+using System.Collections;
+using System.Windows.Forms;
+using System.IO;
+using System.Xml.Linq;
+
+namespace ClickForensics.Quartz.Manager
+{
+ public class QuartzScheduler
+ {
+ public QuartzScheduler(string server, int port, string scheduler)
+ {
+ Address = string.Format("tcp://{0}:{1}/{2}", server, port, scheduler);
+ _schedulerFactory = new StdSchedulerFactory(getProperties(Address));
+
+ try
+ {
+ _scheduler = _schedulerFactory.GetScheduler();
+ }
+ catch (SchedulerException se)
+ {
+ MessageBox.Show("Unable to connect to the specified server", "Connection Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+ }
+ }
+ public string Address { get; private set; }
+ private NameValueCollection getProperties(string address)
+ {
+ NameValueCollection properties = new NameValueCollection();
+ properties["quartz.scheduler.instanceName"] = "RemoteClient";
+ properties["quartz.scheduler.proxy"] = "true";
+ properties["quartz.threadPool.threadCount"] = "0";
+ properties["quartz.scheduler.proxy.address"] = address;
+ return properties;
+ }
+ public IScheduler GetScheduler()
+ {
+ return _scheduler;
+ }
+ public DataTable GetJobs()
+ {
+ DataTable table = new DataTable();
+ table.Columns.Add("GroupName");
+ table.Columns.Add("JobName");
+ table.Columns.Add("JobDescription");
+ table.Columns.Add("TriggerName");
+ table.Columns.Add("TriggerGroupName");
+ table.Columns.Add("TriggerType");
+ table.Columns.Add("TriggerState");
+ table.Columns.Add("NextFireTime");
+ table.Columns.Add("PreviousFireTime");
+ string[] jobGroups = GetScheduler().JobGroupNames;
+ foreach (string group in jobGroups)
+ {
+ string[] jobNames = GetScheduler().GetJobNames(group);
+ foreach (string job in jobNames)
+ {
+ JobDetail detail = GetScheduler().GetJobDetail(job, group);
+ Trigger[] triggers = GetScheduler().GetTriggersOfJob(job, group);
+ foreach (Trigger trigger in triggers)
+ {
+ DataRow row = table.NewRow();
+ row["GroupName"] = group;
+ row["JobName"] = job;
+ row["JobDescription"] = detail.Description;
+ row["TriggerName"] = trigger.Name;
+ row["TriggerGroupName"] = trigger.Group;
+ row["TriggerType"] = trigger.GetType().Name;
+ row["TriggerState"] = GetScheduler().GetTriggerState(trigger.Name, trigger.Group);
+ DateTime? nextFireTime = trigger.GetNextFireTimeUtc();
+ if (nextFireTime != null)
+ {
+ row["NextFireTime"] = TimeZone.CurrentTimeZone.ToLocalTime((DateTime)nextFireTime);
+ }
+
+ DateTime? previousFireTime = trigger.GetPreviousFireTimeUtc();
+ if (previousFireTime != null)
+ {
+ row["PreviousFireTime"] = TimeZone.CurrentTimeZone.ToLocalTime((DateTime)previousFireTime);
+ }
+
+ table.Rows.Add(row);
+ }
+ }
+ }
+ return table;
+ }
+
+ public void ScheduleOneTimeJob(Type jobType, JobDataMap dataMap, int clientID)
+ {
+ string name = string.Format("{0}-{1}", jobType.Name, clientID);
+ string group = clientID.ToString();
+ JobDetail jobDetail = new JobDetail(name, group, jobType);
+ jobDetail.Description = "One time job";
+ jobDetail.Durable = false;
+ jobDetail.Group = group;
+ jobDetail.JobDataMap = dataMap;
+ jobDetail.JobType = jobType;
+ jobDetail.Name = name;
+ jobDetail.Volatile = true;
+ SimpleTrigger trigger = new SimpleTrigger();
+ trigger.Name = name;
+ trigger.Group = group;
+ trigger.StartTimeUtc = DateTime.UtcNow;
+ trigger.RepeatCount = 0;
+ trigger.RepeatInterval = TimeSpan.Zero;
+ GetScheduler().ScheduleJob(jobDetail, trigger);
+ }
+
+ private ISchedulerFactory _schedulerFactory;
+
+ private IScheduler _scheduler;
+
+ public DataTable GetRunningJobs()
+ {
+ DataTable table = new DataTable();
+ table.Columns.Add("JobName", typeof(string));
+ table.Columns.Add("RunTime", typeof(int));
+ IList jobs = GetScheduler().GetCurrentlyExecutingJobs();
+ foreach (JobExecutionContext context in jobs)
+ {
+ DataRow row = table.NewRow();
+ row["JobName"] = context.JobDetail.Name;
+ row["RunTime"] = (DateTime.Now.ToUniversalTime() - (DateTime)context.FireTimeUtc).TotalMinutes;
+ table.Rows.Add(row);
+ }
+
+ return table;
+ }
+
+ public void BackupToFile(System.IO.FileInfo file)
+ {
+ IScheduler scheduler = GetScheduler();
+ string[] jobGroupNames = scheduler.JobGroupNames;
+ List jobDetails = new List();
+ foreach (var jobGroup in jobGroupNames)
+ {
+ string[] jobNames = scheduler.GetJobNames(jobGroup);
+ foreach (var jobName in jobNames)
+ {
+ jobDetails.Add(scheduler.GetJobDetail(jobName, jobGroup));
+ }
+ }
+ writeToFile(file, jobDetails);
+
+ }
+
+ private void writeToFile(System.IO.FileInfo file, List jobDetails)
+ {
+ using (StreamWriter writer = file.CreateText())
+ {
+ XNamespace ns = "http://quartznet.sourceforge.net/JobSchedulingData";
+ XDocument doc = new XDocument(new XDeclaration("1.0", "UTF-8", "yes")
+ , new XElement(ns + "quartz"
+ , new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance")
+ , new XAttribute("version", "1.0")
+ , new XAttribute("overwrite-existing-jobs", "true")
+ )
+ );
+ foreach (JobDetail detail in jobDetails)
+ {
+ doc.Root.Add(
+ new XElement(ns + "job"
+ , new XElement(ns + "job-detail"
+ , new XElement(ns + "name", detail.Name)
+ , new XElement(ns + "group", detail.Group)
+ , new XElement(ns + "description", detail.Description)
+ , new XElement(ns + "job-type", detail.JobType.FullName + "," + detail.JobType.Assembly.FullName)
+ , new XElement(ns + "volatile", detail.Volatile)
+ , new XElement(ns + "durable", detail.Durable)
+ , new XElement(ns + "recover", detail.RequestsRecovery)
+ , getJobDataMap(ns, detail.JobDataMap)
+ )
+ , getTriggers(ns, detail)
+ )
+ );
+ }
+ writer.Write(doc);
+ writer.Flush();
+ writer.Close();
+ }
+ }
+
+ private XElement getJobDataMap(XNamespace ns, JobDataMap jobDataMap)
+ {
+ XElement map = new XElement(ns + "job-data-map");
+ foreach (var key in jobDataMap.GetKeys())
+ {
+ map.Add(new XElement(ns + "entry"
+ , new XElement(ns + "key", key)
+ , new XElement(ns + "value", jobDataMap[key])
+ )
+ );
+ }
+
+ return map;
+ }
+
+ private XElement[] getTriggers(XNamespace ns, JobDetail detail)
+ {
+ Trigger[] triggers = _scheduler.GetTriggersOfJob(detail.Name, detail.Group);
+ XElement[] elements = new XElement[triggers.Length];
+ for (int i = 0; i < triggers.Length; i++)
+ {
+ elements[i] = new XElement(ns + "trigger");
+ if (triggers[i] is SimpleTrigger)
+ {
+ elements[i].Add(getSimpleTrigger(ns, (SimpleTrigger)triggers[i]));
+ }
+ else if (triggers[i] is CronTrigger)
+ {
+ elements[i].Add(getCronTrigger(ns, (CronTrigger)triggers[i]));
+ }
+ }
+ return elements;
+ }
+
+ private XElement getCronTrigger(XNamespace ns, CronTrigger trigger)
+ {
+ XElement cronTrigger = new XElement(ns + "cron");
+ addCommonTriggerData(ns, cronTrigger, trigger);
+ cronTrigger.Add(
+ new XElement(ns + "cron-expression", trigger.CronExpressionString)
+ );
+ return cronTrigger;
+ }
+
+ private void addCommonTriggerData(XNamespace ns, XElement rootTriggerElement, Trigger trigger)
+ {
+ rootTriggerElement.Add(
+ new XElement(ns + "name", trigger.Name)
+ , new XElement(ns + "group", trigger.Group)
+ , new XElement(ns + "description", trigger.Description)
+ , new XElement(ns + "misfire-instruction", getMisfireInstructionText(trigger))
+ , new XElement(ns + "volatile", trigger.Volatile)
+ , new XElement(ns + "job-name", trigger.JobName)
+ , new XElement(ns + "job-group", trigger.JobGroup)
+ );
+ }
+
+ private string getMisfireInstructionText(Trigger trigger)
+ {
+ if (trigger is CronTrigger)
+ {
+ return getCronTriggerMisfireInstructionText(trigger.MisfireInstruction);
+ }
+ return getSimpleTriggerMisfireInstructionText(trigger.MisfireInstruction);
+ }
+
+ private string getSimpleTriggerMisfireInstructionText(int misfireInstruction)
+ {
+ switch (misfireInstruction)
+ {
+ case 0:
+ return "SmartPolicy";
+ case 1:
+ return "FireNow";
+ case 2:
+ return "RescheduleNowWithExistingRepeatCount";
+ case 3:
+ return "RescheduleNowWithRemainingRepeatCount";
+ case 4:
+ return "RescheduleNextWithRemainingCount";
+ case 5:
+ return "RescheduleNextWithExistingCount";
+ default:
+ throw new ArgumentOutOfRangeException(string.Format("{0} is not a supported misfire instruction for SimpleTrigger See Quartz.MisfireInstruction for more details.", misfireInstruction));
+ }
+ }
+
+ private string getCronTriggerMisfireInstructionText(int misfireInstruction)
+ {
+ switch (misfireInstruction)
+ {
+ case 0:
+ return "SmartPolicy";
+ case 1:
+ return "FireOnceNow";
+ case 2:
+ return "DoNothing";
+ default:
+ throw new ArgumentOutOfRangeException(string.Format("{0} is not a supported misfire instruction for CronTrigger See Quartz.MisfireInstruction for more details.", misfireInstruction));
+ }
+ }
+
+ private XElement getSimpleTrigger(XNamespace ns, SimpleTrigger trigger)
+ {
+ XElement simpleTrigger = new XElement(ns + "simple");
+ addCommonTriggerData(ns, simpleTrigger, trigger);
+ simpleTrigger.Add(
+ new XElement(ns + "repeat-count", trigger.RepeatCount)
+ , new XElement(ns + "repeat-interval", trigger.RepeatInterval.Milliseconds)
+ );
+ return simpleTrigger;
+ }
+ }
+}
diff --git a/ClickForensics.Quartz.Manager/SchedulerNode.cs b/ClickForensics.Quartz.Manager/SchedulerNode.cs
new file mode 100644
index 0000000..20edfaa
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/SchedulerNode.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace ClickForensics.Quartz.Manager
+{
+ public class SchedulerNode : TreeNode
+ {
+ public SchedulerNode(QuartzScheduler scheduler)
+ : base()
+ {
+ this.Text = scheduler.Address;
+ Scheduler = scheduler;
+ }
+ public QuartzScheduler Scheduler { get; private set; }
+
+ }
+}
diff --git a/ClickForensics.Quartz.Manager/ServerConnectForm.Designer.cs b/ClickForensics.Quartz.Manager/ServerConnectForm.Designer.cs
new file mode 100644
index 0000000..49ae7d4
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/ServerConnectForm.Designer.cs
@@ -0,0 +1,143 @@
+namespace ClickForensics.Quartz.Manager
+{
+ partial class ServerConnectForm
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.btnConnect = new System.Windows.Forms.Button();
+ this.btnCancel = new System.Windows.Forms.Button();
+ this.label1 = new System.Windows.Forms.Label();
+ this.txtServer = new System.Windows.Forms.TextBox();
+ this.txtPort = new System.Windows.Forms.TextBox();
+ this.label2 = new System.Windows.Forms.Label();
+ this.txtScheduler = new System.Windows.Forms.TextBox();
+ this.label3 = new System.Windows.Forms.Label();
+ this.SuspendLayout();
+ //
+ // btnConnect
+ //
+ this.btnConnect.Location = new System.Drawing.Point(32, 87);
+ this.btnConnect.Name = "btnConnect";
+ this.btnConnect.Size = new System.Drawing.Size(75, 23);
+ this.btnConnect.TabIndex = 3;
+ this.btnConnect.Text = "Connect";
+ this.btnConnect.UseVisualStyleBackColor = true;
+ this.btnConnect.Click += new System.EventHandler(this.btnConnect_Click);
+ //
+ // btnCancel
+ //
+ this.btnCancel.Location = new System.Drawing.Point(115, 87);
+ this.btnCancel.Name = "btnCancel";
+ this.btnCancel.Size = new System.Drawing.Size(75, 23);
+ this.btnCancel.TabIndex = 4;
+ this.btnCancel.Text = "Cancel";
+ this.btnCancel.UseVisualStyleBackColor = true;
+ this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(29, 12);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(41, 13);
+ this.label1.TabIndex = 2;
+ this.label1.Text = "Server:";
+ //
+ // txtServer
+ //
+ this.txtServer.Location = new System.Drawing.Point(90, 9);
+ this.txtServer.Name = "txtServer";
+ this.txtServer.Size = new System.Drawing.Size(100, 20);
+ this.txtServer.TabIndex = 0;
+ //
+ // txtPort
+ //
+ this.txtPort.Location = new System.Drawing.Point(90, 35);
+ this.txtPort.Name = "txtPort";
+ this.txtPort.Size = new System.Drawing.Size(100, 20);
+ this.txtPort.TabIndex = 1;
+ this.txtPort.Text = "555";
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(29, 38);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(29, 13);
+ this.label2.TabIndex = 8;
+ this.label2.Text = "Port:";
+ //
+ // txtScheduler
+ //
+ this.txtScheduler.Location = new System.Drawing.Point(90, 61);
+ this.txtScheduler.Name = "txtScheduler";
+ this.txtScheduler.Size = new System.Drawing.Size(100, 20);
+ this.txtScheduler.TabIndex = 2;
+ this.txtScheduler.Text = "QuartzScheduler";
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.Location = new System.Drawing.Point(29, 64);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(55, 13);
+ this.label3.TabIndex = 10;
+ this.label3.Text = "Scheduler";
+ //
+ // ServerConnectForm
+ //
+ this.AcceptButton = this.btnConnect;
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(227, 141);
+ this.Controls.Add(this.txtScheduler);
+ this.Controls.Add(this.label3);
+ this.Controls.Add(this.txtPort);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.txtServer);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.btnCancel);
+ this.Controls.Add(this.btnConnect);
+ this.Name = "ServerConnectForm";
+ this.Text = "ServerConnectForm";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Button btnConnect;
+ private System.Windows.Forms.Button btnCancel;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.TextBox txtServer;
+ private System.Windows.Forms.TextBox txtPort;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.TextBox txtScheduler;
+ private System.Windows.Forms.Label label3;
+ }
+}
\ No newline at end of file
diff --git a/ClickForensics.Quartz.Manager/ServerConnectForm.cs b/ClickForensics.Quartz.Manager/ServerConnectForm.cs
new file mode 100644
index 0000000..0610da6
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/ServerConnectForm.cs
@@ -0,0 +1,37 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace ClickForensics.Quartz.Manager
+{
+ public partial class ServerConnectForm : Form
+ {
+ public ServerConnectForm()
+ {
+ InitializeComponent();
+ }
+
+ private void btnCancel_Click(object sender, EventArgs e)
+ {
+ this.Close();
+ }
+
+ private void btnConnect_Click(object sender, EventArgs e)
+ {
+ Server = txtServer.Text;
+ Port = int.Parse(txtPort.Text);
+ Scheduler = txtScheduler.Text;
+ this.Close();
+ }
+ public string Server { get; set; }
+ public int Port { get; set; }
+ public string Scheduler { get; set; }
+
+
+ }
+}
diff --git a/ClickForensics.Quartz.Manager/ServerConnectForm.resx b/ClickForensics.Quartz.Manager/ServerConnectForm.resx
new file mode 100644
index 0000000..d58980a
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/ServerConnectForm.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/ClickForensics.Quartz.Manager/TriggerNode.cs b/ClickForensics.Quartz.Manager/TriggerNode.cs
new file mode 100644
index 0000000..43944b1
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/TriggerNode.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using Quartz;
+
+namespace ClickForensics.Quartz.Manager
+{
+ public class TriggerNode : TreeNode
+ {
+ public TriggerNode(Trigger trigger)
+ {
+ Text = trigger.Name;
+
+ Trigger = trigger;
+ }
+ public Trigger Trigger { get; set; }
+ }
+}
diff --git a/ClickForensics.Quartz.Manager/app.config b/ClickForensics.Quartz.Manager/app.config
new file mode 100644
index 0000000..e365603
--- /dev/null
+++ b/ClickForensics.Quartz.Manager/app.config
@@ -0,0 +1,3 @@
+
+
+
diff --git a/Clickforensics.Quartz.sln b/Clickforensics.Quartz.sln
new file mode 100644
index 0000000..56cfbad
--- /dev/null
+++ b/Clickforensics.Quartz.sln
@@ -0,0 +1,26 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClickForensics.Quartz.Manager", "ClickForensics.Quartz.Manager\ClickForensics.Quartz.Manager.csproj", "{D23DACFA-11A1-480E-A6C4-1F37B564523D}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClickForensics.Quartz.Manager.Tests", "ClickForensics.Quartz.Manager.Tests\ClickForensics.Quartz.Manager.Tests.csproj", "{B8B682CC-3E41-4810-86BF-B6728FB26D3A}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {D23DACFA-11A1-480E-A6C4-1F37B564523D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D23DACFA-11A1-480E-A6C4-1F37B564523D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D23DACFA-11A1-480E-A6C4-1F37B564523D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D23DACFA-11A1-480E-A6C4-1F37B564523D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B8B682CC-3E41-4810-86BF-B6728FB26D3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B8B682CC-3E41-4810-86BF-B6728FB26D3A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B8B682CC-3E41-4810-86BF-B6728FB26D3A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B8B682CC-3E41-4810-86BF-B6728FB26D3A}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/lib/Common.Logging.dll b/lib/Common.Logging.dll
new file mode 100644
index 0000000..c92b347
Binary files /dev/null and b/lib/Common.Logging.dll differ
diff --git a/lib/Quartz.dll b/lib/Quartz.dll
new file mode 100644
index 0000000..b65ee66
Binary files /dev/null and b/lib/Quartz.dll differ