You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

MainForm.cs 10 kB

15 years ago
15 years ago
15 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using Quartz;
  10. using Quartz.Collection;
  11. using System.Net.Sockets;
  12. //using ClickForensics.Quartz.Jobs;
  13. using System.IO;
  14. using Quartz.Impl;
  15. using Quartz.Impl.Matchers;
  16. using Quartz.Impl.Triggers;
  17. namespace ClickForensics.Quartz.Manager
  18. {
  19. public partial class MainForm : Form
  20. {
  21. public MainForm()
  22. {
  23. InitializeComponent();
  24. jobGroupsTreeView.AfterSelect += new TreeViewEventHandler(jobGroupsTreeView_AfterSelect);
  25. ctxScheduler.Opening += new CancelEventHandler(ctxScheduler_Opening);
  26. jobGroupsTreeView.MouseDown += new MouseEventHandler(jobGroupsTreeView_MouseDown);
  27. }
  28. void ctxScheduler_Opening(object sender, CancelEventArgs e)
  29. {
  30. }
  31. void jobGroupsTreeView_AfterSelect(object sender, TreeViewEventArgs e)
  32. {
  33. jobDetailsToggle(false);
  34. if (e.Node is TriggerNode || e.Node is JobNode)
  35. {
  36. btnDeleteJob.Enabled = true;
  37. }
  38. else
  39. {
  40. btnDeleteJob.Enabled = false;
  41. }
  42. if (e.Node is JobNode)
  43. {
  44. btnRunJobNow.Enabled = true;
  45. pnlDetails.Controls.Add(new NativeJobDetailDisplay(((JobNode)e.Node).Detail));
  46. jobDetailsToggle(true);
  47. }
  48. else
  49. {
  50. btnRunJobNow.Enabled = false;
  51. }
  52. if (e.Node is TriggerNode)
  53. {
  54. btnPause.Enabled = true;
  55. setPauseButtonText();
  56. if (((TriggerNode)e.Node).Trigger is ICronTrigger)
  57. {
  58. pnlDetails.Controls.Add(new CronTriggerDisplay((ICronTrigger)((TriggerNode)e.Node).Trigger));
  59. jobDetailsToggle(true);
  60. }
  61. btnEdit.Enabled = true;
  62. }
  63. else
  64. {
  65. btnEdit.Enabled = false;
  66. btnPause.Enabled = false;
  67. }
  68. }
  69. private void setPauseButtonText()
  70. {
  71. TriggerNode node = (TriggerNode)jobGroupsTreeView.SelectedNode;
  72. if (Scheduler.GetScheduler().GetTriggerState(node.Trigger.Key) == TriggerState.Paused)
  73. {
  74. btnPause.Text = "Resume";
  75. }
  76. else
  77. {
  78. btnPause.Text = "Pause";
  79. }
  80. }
  81. private void connectToolStripMenuItem_Click(object sender, EventArgs e)
  82. {
  83. using (ServerConnectForm form = new ServerConnectForm())
  84. {
  85. form.ShowDialog();
  86. try
  87. {
  88. Scheduler = new QuartzScheduler(form.Server, form.Port, form.Scheduler);
  89. serverConnectStatusLabel.Text = string.Format("Connected to {0}", Scheduler.Address);
  90. connectToolStripMenuItem.Enabled = false;
  91. jobsToolStripMenuItem.Enabled = true;
  92. loadJobGroups();
  93. updateRunningJobs();
  94. }
  95. catch (SocketException ex)
  96. {
  97. ErrorDialog dialog = new ErrorDialog();
  98. dialog.Message = string.Format("Unable to connect to scheduler {0} on {1}:{2}", form.Scheduler, form.Server, form.Port);
  99. dialog.Description = ex.Message;
  100. dialog.ShowDialog();
  101. }
  102. form.Close();
  103. }
  104. //loadGlobalTriggers();
  105. }
  106. //private void loadGlobalTriggers()
  107. //{
  108. // foreach (IJobListener jobListener in Scheduler.GetScheduler().GetJobDetail(null,null)..GlobalJobListeners)
  109. // {
  110. // globalTriggersListView.Items.Add(jobListener.Name);
  111. // }
  112. //}
  113. private void loadJobGroups()
  114. {
  115. try
  116. {
  117. this.Cursor = Cursors.WaitCursor;
  118. jobDetailsToggle(false);
  119. jobGroupsTreeView.Nodes.Clear();
  120. SchedulerNode schedulerNode = new SchedulerNode(Scheduler);
  121. schedulerNode.ContextMenuStrip = ctxScheduler;
  122. jobGroupsTreeView.Nodes.Add(schedulerNode);
  123. TreeNode jobGroupsNode = schedulerNode.Nodes.Add("Job Groups");
  124. var jobGroups = Scheduler.GetScheduler().GetJobGroupNames();
  125. foreach (string jobGroup in jobGroups)
  126. {
  127. TreeNode jobGroupNode = jobGroupsNode.Nodes.Add(jobGroup);
  128. TreeNode jobsNode = jobGroupNode.Nodes.Add("Jobs");
  129. addJobNodes(jobsNode);
  130. }
  131. jobGroupsTreeView.Nodes[0].Expand();
  132. jobGroupsNode.Expand();
  133. StripStatusLabel_Job_Groups.Text = DateTime.Now.ToString("yyyy.MM.dd HH:mm.ss");
  134. }
  135. finally
  136. {
  137. this.Cursor = Cursors.Default;
  138. }
  139. }
  140. private void jobDetailsToggle(bool isVisible)
  141. {
  142. if (isVisible == false)
  143. {
  144. pnlDetails.Controls.Clear();
  145. }
  146. }
  147. void jobGroupsTreeView_MouseDown(object sender, MouseEventArgs e)
  148. {
  149. if (e.Button == MouseButtons.Right)
  150. {
  151. TreeNode node = jobGroupsTreeView.GetNodeAt(e.X, e.Y);
  152. if (node != null)
  153. {
  154. jobGroupsTreeView.SelectedNode = node;
  155. ctxScheduler.Show(jobGroupsTreeView, e.Location);
  156. }
  157. }
  158. }
  159. //private void loadJobs()
  160. //{
  161. // foreach (TreeNode node in jobGroupsTreeView.Nodes)
  162. // {
  163. // addJobNodes(node);
  164. // }
  165. //}
  166. private void addJobNodes(TreeNode node)
  167. {
  168. string group = node.Parent.Text;
  169. var groupMatcher = GroupMatcher<JobKey>.GroupContains(group);
  170. var jobKeys = Scheduler.GetScheduler().GetJobKeys(groupMatcher);
  171. foreach (var jobKey in jobKeys)
  172. {
  173. try
  174. {
  175. IJobDetail detail = Scheduler.GetScheduler().GetJobDetail(jobKey);
  176. JobNode jobNode = new JobNode(detail);
  177. node.Nodes.Add(jobNode);
  178. addTriggerNodes(jobNode);
  179. addListenerNodes(jobNode);
  180. }
  181. catch (Exception ex)
  182. {
  183. //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.
  184. }
  185. }
  186. }
  187. private void addListenerNodes(JobNode node)
  188. {
  189. string jobName = node.Text;
  190. string jobGroupName = node.Parent.Text;
  191. //TODO: see joblistenermanager get listeners
  192. //string[] listenerNames = node.Detail.JobListenerNames;
  193. //foreach (string listener in listenerNames)
  194. //{
  195. // node.Text = string.Format("JL {0}", listenerNames);
  196. //}
  197. //ISet set = Scheduler.GetScheduler().JobListenerNames;
  198. }
  199. private void addTriggerNodes(TreeNode treeNode)
  200. {
  201. var triggers = Scheduler.GetScheduler().GetTriggersOfJob(new JobKey(treeNode.Text, treeNode.Parent.Parent.Text));
  202. TreeNode triggersNode = treeNode.Nodes.Add("Triggers");
  203. foreach (var trigger in triggers)
  204. {
  205. TriggerNode node = new TriggerNode(trigger);
  206. triggersNode.Nodes.Add(node);
  207. }
  208. }
  209. private void updateRunningJobs()
  210. {
  211. try
  212. {
  213. this.Cursor = Cursors.WaitCursor;
  214. timer_Refresh_Running_Jobs.Stop();
  215. listView_RunningJobs.Items.Clear();
  216. DataTable table = Scheduler.GetRunningJobs();
  217. foreach (DataRow row in table.Rows)
  218. {
  219. //JobName JobDuration
  220. ListViewItem item = new ListViewItem(new string[] { Convert.ToString(row["JobName"]), Convert.ToString(row["Runtime"]) });
  221. listView_RunningJobs.Items.Add(item);
  222. }
  223. StripStatusLabel_Jobs_Refresh_date.Text = DateTime.Now.ToString("yyyy.MM.dd HH:mm.ss");
  224. //reset the timer ( documentation not clear if .stop = restart @ 0 in timing, but changing the interval sure should do that. )
  225. int timer_was = timer_Refresh_Running_Jobs.Interval;
  226. timer_Refresh_Running_Jobs.Interval = timer_was + 1;
  227. timer_Refresh_Running_Jobs.Interval = timer_was;
  228. timer_Refresh_Running_Jobs.Start();
  229. }
  230. finally
  231. {
  232. this.Cursor = Cursors.Default;
  233. }
  234. }
  235. public QuartzScheduler Scheduler { get; set; }
  236. private void addGlobalListenerToolStripMenuItem_Click(object sender, EventArgs e)
  237. {
  238. AddListenerForm form = new AddListenerForm();
  239. form.ListenerInterface = typeof(IJobListener);
  240. form.ShowDialog();
  241. JobDataMap map = new JobDataMap();
  242. map.Add("type", form.ListenerType);
  243. //Scheduler.ScheduleOneTimeJob(typeof(AddJobListenerJob), map, 0);
  244. loadJobGroups();
  245. }
  246. private void addJobListenerToolStripMenuItem_Click(object sender, EventArgs e)
  247. {
  248. TreeNode selectedNode = jobGroupsTreeView.SelectedNode;
  249. if (selectedNode != null && selectedNode is JobNode)
  250. {
  251. AddListenerForm form = new AddListenerForm();
  252. form.ListenerInterface = typeof(IJobListener);
  253. form.ShowDialog();
  254. //JobHistoryListener listener = new JobHistoryListener();
  255. //listener.Name = null;
  256. //((JobNode)selectedNode).Detail.AddJobListener();
  257. }
  258. }
  259. private void addJobToolStripMenuItem_Click(object sender, EventArgs e)
  260. {
  261. AddJobForm form = new AddJobForm();
  262. form.ShowDialog();
  263. if (form.JobDetail != null && form.Trigger != null)
  264. {
  265. Scheduler.GetScheduler().ScheduleJob(form.JobDetail, form.Trigger);
  266. loadJobGroups();
  267. }
  268. }
  269. private void btnRefreshRunningJobs_Click(object sender, EventArgs e)
  270. {
  271. updateRunningJobs();
  272. }
  273. private void btnRefreshJobGroups_Click(object sender, EventArgs e)
  274. {
  275. loadJobGroups();
  276. }
  277. private void btnRunJobNow_Click(object sender, EventArgs e)
  278. {
  279. JobNode node = (JobNode)jobGroupsTreeView.SelectedNode;
  280. Scheduler.GetScheduler().TriggerJob(node.Detail.Key);
  281. }
  282. private void btnDeleteJob_Click(object sender, EventArgs e)
  283. {
  284. TreeNode selectedNode = jobGroupsTreeView.SelectedNode;
  285. if (selectedNode is JobNode)
  286. {
  287. JobNode node = (JobNode)jobGroupsTreeView.SelectedNode;
  288. Scheduler.GetScheduler().DeleteJob(node.Detail.Key);
  289. jobGroupsTreeView.SelectedNode.Remove();
  290. }
  291. if (selectedNode is TriggerNode)
  292. {
  293. Scheduler.GetScheduler().UnscheduleJob(((TriggerNode)selectedNode).Trigger.Key);
  294. }
  295. //loadJobGroups();
  296. }
  297. private void btnPause_Click(object sender, EventArgs e)
  298. {
  299. TriggerNode node = (TriggerNode)jobGroupsTreeView.SelectedNode;
  300. if (Scheduler.GetScheduler().GetTriggerState(node.Trigger.Key) == TriggerState.Paused)
  301. {
  302. Scheduler.GetScheduler().ResumeTrigger(node.Trigger.Key);
  303. }
  304. else
  305. {
  306. Scheduler.GetScheduler().PauseTrigger(node.Trigger.Key);
  307. }
  308. setPauseButtonText();
  309. }
  310. private void btnEdit_Click(object sender, EventArgs e)
  311. {
  312. TriggerNode node = (TriggerNode)jobGroupsTreeView.SelectedNode;
  313. AddJobForm form = new AddJobForm(node);
  314. form.ShowDialog();
  315. if (form.JobDetail != null && form.Trigger != null)
  316. {
  317. Scheduler.GetScheduler().RescheduleJob(node.Trigger.Key, form.Trigger);
  318. loadJobGroups();
  319. }
  320. }
  321. private void backupToolStripMenuItem_Click(object sender, EventArgs e)
  322. {
  323. QuartzScheduler scheduler = ((SchedulerNode)((TreeView)((ContextMenuStrip)((ToolStripMenuItem)sender).Owner).SourceControl).SelectedNode).Scheduler;
  324. FileDialog dialog = new SaveFileDialog();
  325. dialog.ShowDialog();
  326. FileInfo file = new FileInfo(dialog.FileName);
  327. scheduler.BackupToFile(file);
  328. }
  329. private void timer_Refresh_Running_Jobs_Tick(object sender, EventArgs e)
  330. {
  331. updateRunningJobs();
  332. }
  333. }
  334. }