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 11 kB

15 years ago
15 years ago
15 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  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.Triggers;
  16. namespace ClickForensics.Quartz.Manager
  17. {
  18. public partial class MainForm : Form
  19. {
  20. public MainForm()
  21. {
  22. InitializeComponent();
  23. jobGroupsTreeView.AfterSelect += new TreeViewEventHandler(jobGroupsTreeView_AfterSelect);
  24. ctxScheduler.Opening += new CancelEventHandler(ctxScheduler_Opening);
  25. jobGroupsTreeView.MouseDown += new MouseEventHandler(jobGroupsTreeView_MouseDown);
  26. }
  27. void ctxScheduler_Opening(object sender, CancelEventArgs e)
  28. {
  29. }
  30. void jobGroupsTreeView_AfterSelect(object sender, TreeViewEventArgs e)
  31. {
  32. jobDetailsToggle(false);
  33. if (e.Node is TriggerNode || e.Node is JobNode)
  34. {
  35. btnDeleteJob.Enabled = true;
  36. }
  37. else
  38. {
  39. btnDeleteJob.Enabled = false;
  40. }
  41. if (e.Node is JobNode)
  42. {
  43. btnRunJobNow.Enabled = true;
  44. pnlDetails.Controls.Add(new NativeJobDetailDisplay(((JobNode)e.Node).Detail));
  45. jobDetailsToggle(true);
  46. }
  47. else
  48. {
  49. btnRunJobNow.Enabled = false;
  50. }
  51. if (e.Node is TriggerNode)
  52. {
  53. btnPause.Enabled = true;
  54. setPauseButtonText();
  55. if (((TriggerNode)e.Node).Trigger is CronTrigger)
  56. {
  57. pnlDetails.Controls.Add(new CronTriggerDisplay((CronTrigger)((TriggerNode)e.Node).Trigger));
  58. jobDetailsToggle(true);
  59. }
  60. btnEdit.Enabled = true;
  61. }
  62. else
  63. {
  64. btnEdit.Enabled = false;
  65. btnPause.Enabled = false;
  66. }
  67. }
  68. private void setPauseButtonText()
  69. {
  70. TriggerNode node = (TriggerNode)jobGroupsTreeView.SelectedNode;
  71. string name = node.Trigger.Name;
  72. string group = node.Trigger.Group;
  73. if (Scheduler.GetScheduler().GetTriggerState(name, group) == TriggerState.Paused)
  74. {
  75. btnPause.Text = "Resume";
  76. }
  77. else
  78. {
  79. btnPause.Text = "Pause";
  80. }
  81. }
  82. private void connectToolStripMenuItem_Click(object sender, EventArgs e)
  83. {
  84. using (ServerConnectForm form = new ServerConnectForm())
  85. {
  86. form.ShowDialog();
  87. try
  88. {
  89. Scheduler = new QuartzScheduler(form.Server, form.Port, form.Scheduler);
  90. serverConnectStatusLabel.Text = string.Format("Connected to {0}", Scheduler.Address);
  91. connectToolStripMenuItem.Enabled = false;
  92. jobsToolStripMenuItem.Enabled = true;
  93. loadJobGroups();
  94. updateRunningJobs();
  95. }
  96. catch (SocketException ex)
  97. {
  98. ErrorDialog dialog = new ErrorDialog();
  99. dialog.Message = string.Format("Unable to connect to scheduler {0} on {1}:{2}", form.Scheduler, form.Server, form.Port);
  100. dialog.Description = ex.Message;
  101. dialog.ShowDialog();
  102. }
  103. form.Close();
  104. }
  105. //loadGlobalTriggers();
  106. }
  107. //private void loadGlobalTriggers()
  108. //{
  109. // foreach (IJobListener jobListener in Scheduler.GetScheduler().GetJobDetail(null,null)..GlobalJobListeners)
  110. // {
  111. // globalTriggersListView.Items.Add(jobListener.Name);
  112. // }
  113. //}
  114. private void loadJobGroups()
  115. {
  116. try
  117. {
  118. this.Cursor = Cursors.WaitCursor;
  119. jobDetailsToggle(false);
  120. jobGroupsTreeView.Nodes.Clear();
  121. SchedulerNode schedulerNode = new SchedulerNode(Scheduler);
  122. schedulerNode.ContextMenuStrip = ctxScheduler;
  123. jobGroupsTreeView.Nodes.Add(schedulerNode);
  124. TreeNode jobGroupsNode = schedulerNode.Nodes.Add("Job Groups");
  125. string[] jobGroups = Scheduler.GetScheduler().JobGroupNames;
  126. foreach (string jobGroup in jobGroups)
  127. {
  128. TreeNode jobGroupNode = jobGroupsNode.Nodes.Add(jobGroup);
  129. TreeNode jobsNode = jobGroupNode.Nodes.Add("Jobs");
  130. addJobNodes(jobsNode);
  131. }
  132. jobGroupsTreeView.Nodes[0].Expand();
  133. jobGroupsNode.Expand();
  134. StripStatusLabel_Job_Groups.Text = DateTime.Now.ToString("yyyy.MM.dd HH:mm.ss");
  135. }
  136. finally
  137. {
  138. this.Cursor = Cursors.Default;
  139. }
  140. }
  141. private void jobDetailsToggle(bool isVisible)
  142. {
  143. if (isVisible == false)
  144. {
  145. pnlDetails.Controls.Clear();
  146. }
  147. }
  148. void jobGroupsTreeView_MouseDown(object sender, MouseEventArgs e)
  149. {
  150. if (e.Button == MouseButtons.Right)
  151. {
  152. TreeNode node = jobGroupsTreeView.GetNodeAt(e.X, e.Y);
  153. if (node != null)
  154. {
  155. jobGroupsTreeView.SelectedNode = node;
  156. ctxScheduler.Show(jobGroupsTreeView, e.Location);
  157. }
  158. }
  159. }
  160. //private void loadJobs()
  161. //{
  162. // foreach (TreeNode node in jobGroupsTreeView.Nodes)
  163. // {
  164. // addJobNodes(node);
  165. // }
  166. //}
  167. private void addJobNodes(TreeNode node)
  168. {
  169. string group = node.Parent.Text;
  170. string[] jobs = Scheduler.GetScheduler().GetJobNames(group);
  171. foreach (string jobName in jobs)
  172. {
  173. try
  174. {
  175. IJobDetail detail = Scheduler.GetScheduler().GetJobDetail(new JobKey(jobName, group));
  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. AbstractTrigger[] triggers = Scheduler.GetScheduler().GetTriggersOfJob(treeNode.Text, treeNode.Parent.Parent.Text);
  202. TreeNode triggersNode = treeNode.Nodes.Add("Triggers");
  203. foreach (AbstractTrigger 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. string job = node.Detail.Name;
  281. string group = node.Detail.Group;
  282. Scheduler.GetScheduler().TriggerJobWithVolatileTrigger(job, group);
  283. }
  284. private void btnDeleteJob_Click(object sender, EventArgs e)
  285. {
  286. TreeNode selectedNode = jobGroupsTreeView.SelectedNode;
  287. if (selectedNode is JobNode)
  288. {
  289. JobNode node = (JobNode)jobGroupsTreeView.SelectedNode;
  290. string job = node.Detail.Name;
  291. string group = node.Detail.Group;
  292. Scheduler.GetScheduler().DeleteJob(job, group);
  293. jobGroupsTreeView.SelectedNode.Remove();
  294. }
  295. if (selectedNode is TriggerNode)
  296. {
  297. Scheduler.GetScheduler().UnscheduleJob(((TriggerNode)selectedNode).Trigger.Name, ((TriggerNode)selectedNode).Trigger.Group);
  298. }
  299. //loadJobGroups();
  300. }
  301. private void btnPause_Click(object sender, EventArgs e)
  302. {
  303. TriggerNode node = (TriggerNode)jobGroupsTreeView.SelectedNode;
  304. string name = node.Trigger.Name;
  305. string group = node.Trigger.Group;
  306. if (Scheduler.GetScheduler().GetTriggerState(name, group) == TriggerState.Paused)
  307. {
  308. Scheduler.GetScheduler().ResumeTrigger(name, group);
  309. }
  310. else
  311. {
  312. Scheduler.GetScheduler().PauseTrigger(name, group);
  313. }
  314. setPauseButtonText();
  315. }
  316. private void btnEdit_Click(object sender, EventArgs e)
  317. {
  318. TriggerNode node = (TriggerNode)jobGroupsTreeView.SelectedNode;
  319. AddJobForm form = new AddJobForm(node);
  320. form.ShowDialog();
  321. if (form.JobDetail != null && form.Trigger != null)
  322. {
  323. Scheduler.GetScheduler().RescheduleJob(node.Trigger.Name, node.Trigger.Group, form.Trigger);
  324. loadJobGroups();
  325. }
  326. }
  327. private void backupToolStripMenuItem_Click(object sender, EventArgs e)
  328. {
  329. QuartzScheduler scheduler = ((SchedulerNode)((TreeView)((ContextMenuStrip)((ToolStripMenuItem)sender).Owner).SourceControl).SelectedNode).Scheduler;
  330. FileDialog dialog = new SaveFileDialog();
  331. dialog.ShowDialog();
  332. FileInfo file = new FileInfo(dialog.FileName);
  333. scheduler.BackupToFile(file);
  334. }
  335. private void timer_Refresh_Running_Jobs_Tick(object sender, EventArgs e)
  336. {
  337. updateRunningJobs();
  338. }
  339. }
  340. }

No Description