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