URL Change Triggerの改造

shin1ogawaさんとaqubiさんの家に遊びに行ったときに、Hudsonをプロジェクトで使っている話をお聞きしました。
そこで、Hudsonをビルドサーバとテストサーバの二つに分けて運用していて、ビルドサーバがビルド終了後ファイルサーバにアップロードし、その後テストサーバがテストを実施したい、という要望を聞きました。
ただし、テストサーバのテストは丸一日にかかってしまうそうで、できれば定期的にファイルサーバの更新をチェックしたい、とのことでした。
そのときは自分でプラグインを書けばなんとかなります、という返事をしたのですが、その後URL Change Triggerというプラグインがあったことに気づき、これを使ってみてはどうかということを提案してみました。
しかし、そのプラグインはほぼ毎分更新チェックをしているらしく、ソースコードを見ていると確かに毎分チェックしにいくようにハードコーディングされていました。
しかも、URLクラスを使ってファイルを書き出しMD5の値をチェックしています。
大容量ファイルをチェックする場合は時間がかかりすぎるため、この実装は自分の中ではないなー、というところです。
これだと流石に要望には答えられないので、とりあえず「定期的に実行」と同じようにcronライクなスケジュール設定ができるようにしました。
ビューは以下のようになります。

以下、パッチを載せます。

Index: src/main/resources/com/redfin/hudson/UrlChangeTrigger/config.jelly
===================================================================
--- src/main/resources/com/redfin/hudson/UrlChangeTrigger/config.jelly	(revision 12056)
+++ src/main/resources/com/redfin/hudson/UrlChangeTrigger/config.jelly	(working copy)
@@ -12,5 +12,9 @@
       evaluates to null, and you'll get an empty text box, which is just what we want.
     -->
     <f:textbox name="urlChangeTrigger.url" value="${instance.url}" />
-	</f:entry>
+    
+  </f:entry>
+  <f:entry title="${%Schedule}" help="/help/project-config/timer-format.html">
+	<f:textarea name="urlchange_spec" checkUrl="'${rootURL}/trigger/TimerTrigger/check?value='+escape(this.value)" value="${instance.spec}"/>
+  </f:entry>
 </j:jelly>
\ No newline at end of file
Index: src/main/java/com/redfin/hudson/UrlChangeTrigger.java
===================================================================
--- src/main/java/com/redfin/hudson/UrlChangeTrigger.java	(revision 12056)
+++ src/main/java/com/redfin/hudson/UrlChangeTrigger.java	(working copy)
@@ -26,6 +26,7 @@
 import antlr.ANTLRException;
 
 /** Triggers a build when the data at a particular URL has changed. */
+
 public class UrlChangeTrigger extends Trigger<BuildableItem> {
 
     URL url;
@@ -67,17 +68,9 @@
         return checksumSb.toString();
     }
 
-    public UrlChangeTrigger(String url) throws MalformedURLException {
-        this(new URL(url));
-    }
-    
-    public UrlChangeTrigger(URL url) {
-        this.url = url;
-        try {
-            this.tabs = CronTabList.create("* * * * *");
-        } catch (ANTLRException e) {
-            throw new RuntimeException("Bug! couldn't schedule poll");
-        }
+    public UrlChangeTrigger(String spec, String url) throws MalformedURLException, ANTLRException {
+    	super(spec);
+    	this.url = new URL(url);
     }
 
     @Override
@@ -148,11 +141,14 @@
         @Override
         public UrlChangeTrigger newInstance(StaplerRequest req, JSONObject formData) throws FormException {
             String url = formData.getString("url");
+            String spec = formData.getString("urlchange_spec");
             try {
-                return new UrlChangeTrigger(url);
+                return new UrlChangeTrigger(spec, url);
             } catch (MalformedURLException e) {
                 throw new FormException("Invalid URL: " + url, e, "");
-            }
+            } catch (ANTLRException e) {
+				throw new FormException("Invalid URL: " + url, e, "");
+			}
         }
         
     }

テスト環境が無く全然試せてないので、ひょっとするとバグっているかもしれません。
また、この改造はSCMへはコミットしていません。
あしからず。