Browse Source

first commit

quartznet-1.0
Jay Vilalta 15 years ago
parent
commit
ff84db44e3
42 changed files with 4257 additions and 0 deletions
  1. +4
    -0
      .gitignore
  2. +61
    -0
      ClickForensics.Quartz.Manager.Tests/ClickForensics.Quartz.Manager.Tests.csproj
  3. +36
    -0
      ClickForensics.Quartz.Manager.Tests/Properties/AssemblyInfo.cs
  4. +20
    -0
      ClickForensics.Quartz.Manager.Tests/QuartzScehdulerTests.cs
  5. +390
    -0
      ClickForensics.Quartz.Manager/AddJobForm.Designer.cs
  6. +176
    -0
      ClickForensics.Quartz.Manager/AddJobForm.cs
  7. +120
    -0
      ClickForensics.Quartz.Manager/AddJobForm.resx
  8. +118
    -0
      ClickForensics.Quartz.Manager/AddListenerForm.Designer.cs
  9. +68
    -0
      ClickForensics.Quartz.Manager/AddListenerForm.cs
  10. +120
    -0
      ClickForensics.Quartz.Manager/AddListenerForm.resx
  11. +200
    -0
      ClickForensics.Quartz.Manager/ClickForensics.Quartz.Manager.csproj
  12. +191
    -0
      ClickForensics.Quartz.Manager/CronTriggerDisplay.Designer.cs
  13. +54
    -0
      ClickForensics.Quartz.Manager/CronTriggerDisplay.cs
  14. +120
    -0
      ClickForensics.Quartz.Manager/CronTriggerDisplay.resx
  15. +84
    -0
      ClickForensics.Quartz.Manager/ErrorDialog.Designer.cs
  16. +32
    -0
      ClickForensics.Quartz.Manager/ErrorDialog.cs
  17. +120
    -0
      ClickForensics.Quartz.Manager/ErrorDialog.resx
  18. +2
    -0
      ClickForensics.Quartz.Manager/JobAssemblies.txt
  19. +21
    -0
      ClickForensics.Quartz.Manager/JobNode.cs
  20. +17
    -0
      ClickForensics.Quartz.Manager/JobType.cs
  21. +486
    -0
      ClickForensics.Quartz.Manager/MainForm.Designer.cs
  22. +412
    -0
      ClickForensics.Quartz.Manager/MainForm.cs
  23. +135
    -0
      ClickForensics.Quartz.Manager/MainForm.resx
  24. +163
    -0
      ClickForensics.Quartz.Manager/NativeJobDetailDisplay.Designer.cs
  25. +44
    -0
      ClickForensics.Quartz.Manager/NativeJobDetailDisplay.cs
  26. +120
    -0
      ClickForensics.Quartz.Manager/NativeJobDetailDisplay.resx
  27. +21
    -0
      ClickForensics.Quartz.Manager/Program.cs
  28. +36
    -0
      ClickForensics.Quartz.Manager/Properties/AssemblyInfo.cs
  29. +63
    -0
      ClickForensics.Quartz.Manager/Properties/Resources.Designer.cs
  30. +117
    -0
      ClickForensics.Quartz.Manager/Properties/Resources.resx
  31. +26
    -0
      ClickForensics.Quartz.Manager/Properties/Settings.Designer.cs
  32. +7
    -0
      ClickForensics.Quartz.Manager/Properties/Settings.settings
  33. +304
    -0
      ClickForensics.Quartz.Manager/QuartzScheduler.cs
  34. +20
    -0
      ClickForensics.Quartz.Manager/SchedulerNode.cs
  35. +143
    -0
      ClickForensics.Quartz.Manager/ServerConnectForm.Designer.cs
  36. +37
    -0
      ClickForensics.Quartz.Manager/ServerConnectForm.cs
  37. +120
    -0
      ClickForensics.Quartz.Manager/ServerConnectForm.resx
  38. +20
    -0
      ClickForensics.Quartz.Manager/TriggerNode.cs
  39. +3
    -0
      ClickForensics.Quartz.Manager/app.config
  40. +26
    -0
      Clickforensics.Quartz.sln
  41. BIN
      lib/Common.Logging.dll
  42. BIN
      lib/Quartz.dll

+ 4
- 0
.gitignore View File

@@ -0,0 +1,4 @@
obj/
bin/
*.user
*.suo

+ 61
- 0
ClickForensics.Quartz.Manager.Tests/ClickForensics.Quartz.Manager.Tests.csproj View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{B8B682CC-3E41-4810-86BF-B6728FB26D3A}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>ClickForensics.Quartz.Manager.Tests</RootNamespace>
<AssemblyName>ClickForensics.Quartz.Manager.Tests</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="nunit.framework, Version=2.5.7.10213, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL" />
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="QuartzScehdulerTests.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ClickForensics.Quartz.Manager\ClickForensics.Quartz.Manager.csproj">
<Project>{D23DACFA-11A1-480E-A6C4-1F37B564523D}</Project>
<Name>ClickForensics.Quartz.Manager</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

+ 36
- 0
ClickForensics.Quartz.Manager.Tests/Properties/AssemblyInfo.cs View File

@@ -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")]

+ 20
- 0
ClickForensics.Quartz.Manager.Tests/QuartzScehdulerTests.cs View File

@@ -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"));

}
}
}

+ 390
- 0
ClickForensics.Quartz.Manager/AddJobForm.Designer.cs View File

@@ -0,0 +1,390 @@
namespace ClickForensics.Quartz.Manager
{
partial class AddJobForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;

/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}

#region Windows Form Designer generated code

/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
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;
}
}

+ 176
- 0
ClickForensics.Quartz.Manager/AddJobForm.cs View File

@@ -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<string, string> jobTypes = new SortedList<string, string>();
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<string>());

}

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);
}
}
}
}

+ 120
- 0
ClickForensics.Quartz.Manager/AddJobForm.resx View File

@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.

mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

+ 118
- 0
ClickForensics.Quartz.Manager/AddListenerForm.Designer.cs View File

@@ -0,0 +1,118 @@
namespace ClickForensics.Quartz.Manager
{
partial class AddListenerForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;

/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}

#region Windows Form Designer generated code

/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
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;
}
}

+ 68
- 0
ClickForensics.Quartz.Manager/AddListenerForm.cs View File

@@ -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<Type> getListenerTypes()
{
//JobHistoryListener listener = new JobHistoryListener();
List<Type> types = new List<Type>();
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();
}
}
}

+ 120
- 0
ClickForensics.Quartz.Manager/AddListenerForm.resx View File

@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.

mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

+ 200
- 0
ClickForensics.Quartz.Manager/ClickForensics.Quartz.Manager.csproj View File

@@ -0,0 +1,200 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>9.0.30729</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{D23DACFA-11A1-480E-A6C4-1F37B564523D}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>ClickForensics.Quartz.Manager</RootNamespace>
<AssemblyName>ClickForensics.Quartz.Manager</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<FileUpgradeFlags>
</FileUpgradeFlags>
<OldToolsVersion>3.5</OldToolsVersion>
<UpgradeBackupLocation />
<TargetFrameworkProfile />
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<IsWebBootstrapper>false</IsWebBootstrapper>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Common.Logging">
<HintPath>..\lib\Common.Logging.dll</HintPath>
</Reference>
<Reference Include="Quartz, Version=1.0.3.3, Culture=neutral, PublicKeyToken=f6b8c98a402cc8a4, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\lib\Quartz.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.configuration" />
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Xml.Linq">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Data.DataSetExtensions">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="AddJobForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="AddJobForm.Designer.cs">
<DependentUpon>AddJobForm.cs</DependentUpon>
</Compile>
<Compile Include="AddListenerForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="AddListenerForm.Designer.cs">
<DependentUpon>AddListenerForm.cs</DependentUpon>
</Compile>
<Compile Include="ErrorDialog.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="ErrorDialog.Designer.cs">
<DependentUpon>ErrorDialog.cs</DependentUpon>
</Compile>
<Compile Include="JobType.cs" />
<Compile Include="NativeJobDetailDisplay.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="NativeJobDetailDisplay.Designer.cs">
<DependentUpon>NativeJobDetailDisplay.cs</DependentUpon>
</Compile>
<Compile Include="JobNode.cs" />
<Compile Include="MainForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="MainForm.Designer.cs">
<DependentUpon>MainForm.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="AddJobForm.resx">
<DependentUpon>AddJobForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="AddListenerForm.resx">
<DependentUpon>AddListenerForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="CronTriggerDisplay.resx">
<DependentUpon>CronTriggerDisplay.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="ErrorDialog.resx">
<DependentUpon>ErrorDialog.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="MainForm.resx">
<DependentUpon>MainForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="NativeJobDetailDisplay.resx">
<DependentUpon>NativeJobDetailDisplay.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="ServerConnectForm.resx">
<DependentUpon>ServerConnectForm.cs</DependentUpon>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<None Include="app.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
<Compile Include="QuartzScheduler.cs" />
<Compile Include="SchedulerNode.cs" />
<Compile Include="ServerConnectForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="ServerConnectForm.Designer.cs">
<DependentUpon>ServerConnectForm.cs</DependentUpon>
</Compile>
<Compile Include="CronTriggerDisplay.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="CronTriggerDisplay.Designer.cs">
<DependentUpon>CronTriggerDisplay.cs</DependentUpon>
</Compile>
<Compile Include="TriggerNode.cs" />
</ItemGroup>
<ItemGroup>
<Content Include="JobAssemblies.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
<Install>false</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
<Visible>False</Visible>
<ProductName>Windows Installer 3.1</ProductName>
<Install>true</Install>
</BootstrapperPackage>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

+ 191
- 0
ClickForensics.Quartz.Manager/CronTriggerDisplay.Designer.cs View File

@@ -0,0 +1,191 @@
namespace ClickForensics.Quartz.Manager
{
partial class CronTriggerDisplay
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;

/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}

#region Component Designer generated code

/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
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;
}
}

+ 54
- 0
ClickForensics.Quartz.Manager/CronTriggerDisplay.cs View File

@@ -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;
}
}

+ 120
- 0
ClickForensics.Quartz.Manager/CronTriggerDisplay.resx View File

@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.

mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

+ 84
- 0
ClickForensics.Quartz.Manager/ErrorDialog.Designer.cs View File

@@ -0,0 +1,84 @@
namespace ClickForensics.Quartz.Manager
{
partial class ErrorDialog
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;

/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}

#region Windows Form Designer generated code

/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
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;
}
}

+ 32
- 0
ClickForensics.Quartz.Manager/ErrorDialog.cs View File

@@ -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();
}
}
}

+ 120
- 0
ClickForensics.Quartz.Manager/ErrorDialog.resx View File

@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.

mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

+ 2
- 0
ClickForensics.Quartz.Manager/JobAssemblies.txt View File

@@ -0,0 +1,2 @@
ClickForensics.Quartz.Jobs.dll
Quartz.dll

+ 21
- 0
ClickForensics.Quartz.Manager/JobNode.cs View File

@@ -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; }

}
}

+ 17
- 0
ClickForensics.Quartz.Manager/JobType.cs View File

@@ -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;
}
}
}

+ 486
- 0
ClickForensics.Quartz.Manager/MainForm.Designer.cs View File

@@ -0,0 +1,486 @@
namespace ClickForensics.Quartz.Manager
{
partial class MainForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;

/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}

#region Windows Form Designer generated code

/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
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;
}
}


+ 412
- 0
ClickForensics.Quartz.Manager/MainForm.cs View File

@@ -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)
{

}
}
}

+ 135
- 0
ClickForensics.Quartz.Manager/MainForm.resx View File

@@ -0,0 +1,135 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.

mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="mainMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>143, 17</value>
</metadata>
<metadata name="ctxScheduler.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>259, 17</value>
</metadata>
<metadata name="timer_Refresh_Running_Jobs.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>374, 5</value>
</metadata>
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>25</value>
</metadata>
</root>

+ 163
- 0
ClickForensics.Quartz.Manager/NativeJobDetailDisplay.Designer.cs View File

@@ -0,0 +1,163 @@
namespace ClickForensics.Quartz.Manager
{
partial class NativeJobDetailDisplay
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;

/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}

#region Component Designer generated code

/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
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;
}
}

+ 44
- 0
ClickForensics.Quartz.Manager/NativeJobDetailDisplay.cs View File

@@ -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;

}
}

+ 120
- 0
ClickForensics.Quartz.Manager/NativeJobDetailDisplay.resx View File

@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.

mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

+ 21
- 0
ClickForensics.Quartz.Manager/Program.cs View File

@@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace ClickForensics.Quartz.Manager
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
}
}

+ 36
- 0
ClickForensics.Quartz.Manager/Properties/AssemblyInfo.cs View File

@@ -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")]

+ 63
- 0
ClickForensics.Quartz.Manager/Properties/Resources.Designer.cs View File

@@ -0,0 +1,63 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 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.
// </auto-generated>
//------------------------------------------------------------------------------

namespace ClickForensics.Quartz.Manager.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// 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() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[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;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}

+ 117
- 0
ClickForensics.Quartz.Manager/Properties/Resources.resx View File

@@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.

mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

+ 26
- 0
ClickForensics.Quartz.Manager/Properties/Settings.Designer.cs View File

@@ -0,0 +1,26 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 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.
// </auto-generated>
//------------------------------------------------------------------------------

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;
}
}
}
}

+ 7
- 0
ClickForensics.Quartz.Manager/Properties/Settings.settings View File

@@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

+ 304
- 0
ClickForensics.Quartz.Manager/QuartzScheduler.cs View File

@@ -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<JobDetail> jobDetails = new List<JobDetail>();
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<JobDetail> 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;
}
}
}

+ 20
- 0
ClickForensics.Quartz.Manager/SchedulerNode.cs View File

@@ -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; }

}
}

+ 143
- 0
ClickForensics.Quartz.Manager/ServerConnectForm.Designer.cs View File

@@ -0,0 +1,143 @@
namespace ClickForensics.Quartz.Manager
{
partial class ServerConnectForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;

/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}

#region Windows Form Designer generated code

/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
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;
}
}

+ 37
- 0
ClickForensics.Quartz.Manager/ServerConnectForm.cs View File

@@ -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; }

}
}

+ 120
- 0
ClickForensics.Quartz.Manager/ServerConnectForm.resx View File

@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.

mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

+ 20
- 0
ClickForensics.Quartz.Manager/TriggerNode.cs View File

@@ -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; }
}
}

+ 3
- 0
ClickForensics.Quartz.Manager/app.config View File

@@ -0,0 +1,3 @@
<?xml version="1.0"?>
<configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>

+ 26
- 0
Clickforensics.Quartz.sln View File

@@ -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

BIN
lib/Common.Logging.dll View File


BIN
lib/Quartz.dll View File


Loading…
Cancel
Save