1402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/*******************************************************************************
2402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Copyright (c) 2005, 2006 IBM Corporation and others.
3402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * All rights reserved. This program and the accompanying materials
4402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * are made available under the terms of the Eclipse Public License v1.0
5402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * which accompanies this distribution, and is available at
6402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * http://www.eclipse.org/legal/epl-v10.html
7402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *
8402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Contributors:
9402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *     IBM Corporation - initial API and implementation
10402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *******************************************************************************/
11402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpackage org.eclipse.releng.services.rss;
12402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
13402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.io.File;
14402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.io.FileInputStream;
15402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.io.FileNotFoundException;
16402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.io.FileOutputStream;
17402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.io.IOException;
18402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.net.MalformedURLException;
19402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.net.URL;
20402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
21402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.apache.tools.ant.BuildException;
22402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.apache.tools.ant.Task;
23402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.apache.tools.ant.taskdefs.ExecTask;
24402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
25402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.releng.generators.rss.RSSFeedUpdateEntryTask;
26402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.releng.util.rss.Messages;
27402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.releng.util.rss.RSSFeedUtil;
28402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
29402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/**
30402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Parameters:
31402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *   debug - more output to console - eg., 0|1|2
32402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *
33402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *   file - path to the XML file that will be published - eg., /path/to/file.to.publish.xml
34402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *   feedURL - URL of the feed where it will be published - eg., http://servername/path/to/feed.xml
35402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *
36402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *   feedWatchActions - semi-comma-separated list of triplets:
37402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *   	(Xpath to watch for); (what to execute if condition is met); (commandline args to the executable)...
38402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *   	eg., to watch for ANY change in the feed and respond by sending email
39402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *   		/*[name() = 'feed']/*[name() = 'updated']/text(); sendEmailAlert.sh; null
40402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *      eg., to watch for ANY changes in the current build
41402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *   		//*[name() = 'entry'][1]/*[name() = 'updated']/text(); sendEmailAlert.sh; null
42402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *      eg., to watch for changes in the current build's performance test results on linux-gtk
43402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *      	//*[name() = 'entry'][1]/*[name() = 'summary']/*[@type = 'performance'][1]/*[name() = 'results'][@os = 'linux'][@ws = 'gtk']/text(); sendEmailAlert.sh; null
44402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *
45402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @author nickb
46402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *
47402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */
48402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic class RSSFeedWatcherTask extends Task {
49402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
50402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private int debug = 0;
51402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
52402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private static final String CL = ":"; //$NON-NLS-1$
53402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private static final String DOT = "."; //$NON-NLS-1$
54402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private static final String NS = ""; //$NON-NLS-1$
55402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private static final String SP = " "; //$NON-NLS-1$
56402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
57402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private static final String splitter = "[;\t\r\n]+"; //$NON-NLS-1$
58402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
59402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private static final String feedWatchActionError = "feedWatchAction.Error"; //$NON-NLS-1$
60402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private static final String feedWatchActionOuput = "feedWatchAction.Output"; //$NON-NLS-1$
61402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private static final String feedWatchActionResult = "feedWatchAction.Result"; //$NON-NLS-1$
62402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private static final String feedWatchActionNewValue = "feedWatchAction.NewValue"; //$NON-NLS-1$
63402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private static final String feedWatchActionOldValue = "feedWatchAction.OldValue"; //$NON-NLS-1$
64402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private static final String feedWatchActionTheValue = "feedWatchAction.TheValue"; //$NON-NLS-1$
65402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
66402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private static final RSSFeedUtil util = new RSSFeedUtil();
67402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
68402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  //required fields
69402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private File file;
70402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private File tmpFile;
71402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private String feedURL;
72402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private String[] feedWatchActions = new String[] {};
73402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
74402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  //optional
75402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  public void setDebug(int debug) { this.debug = debug; }
76402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
77402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  //required
78402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  public void setFile(String file) {
79402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    if (!isNullString(file)) {
80402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      this.file = new File(file);
81402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      this.tmpFile = new File(file + ".tmp");  //$NON-NLS-1$
82402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    }
83402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  }
84402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  public void setFeedURL(String feedURL) {
85402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    if (isNullString(feedURL))
86402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    { System.err.println(Messages.getString("RSSFeedCommon.FeedURLError")); }  //$NON-NLS-1$
87402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    else
88402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    { this.feedURL = feedURL; }
89402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  }
90402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  public void setFeedWatchActions(String feedWatchActions) {
91402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    int missingActions = 0;
92402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    if (!isNullString(feedWatchActions)) {
93402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      this.feedWatchActions = feedWatchActions.split(splitter);
94402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      missingActions = this.feedWatchActions.length % 3; if (missingActions > 0) { missingActions = 3 - missingActions; }
95402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    }
96402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    if (missingActions > 0) {
97402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      for (int i = 0; i < missingActions; i++)
98402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      {
99402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        System.out.println((i==0 && missingActions==2 ? Messages.getString("RSSFeedWatcherTask.WarningNoScriptAction") : Messages.getString("RSSFeedWatcherTask.WarningNoCommandlineParams")) + SP + feedWatchActions ); //$NON-NLS-1$ //$NON-NLS-2$
100402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        feedWatchActions += "; null"; //$NON-NLS-1$
101402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      }
102402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      this.feedWatchActions = feedWatchActions.split(splitter);
103402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    }
104402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  }
105402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
106402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  // The method executing the task
107402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  public void execute() throws BuildException {
108402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    if (debug>0) { util.setDebug(debug); }
109402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    if (file==null || !file.exists() || !file.isFile()) {
110402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      // if there's no local copy of the feed, get a copy, then exit with instructions
111402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      downloadFeed(file,debug>=0);
112402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      System.out.println(Messages.getString("RSSFeedWatcherTask.PleaseRunThisTaskLater") + SP + file); //$NON-NLS-1$
113402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      System.out.println(Messages.getString("RSSFeedWatcherTask.ToTheLatestVersion") + SP + feedURL); //$NON-NLS-1$
114402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    } else {
115402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      if (feedWatchActions==null || feedWatchActions.length<1) {
116402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        System.err.println(Messages.getString("RSSFeedWatcherTask.ErrorNoWatchActions")); //$NON-NLS-1$
117402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      } else {
118402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        checkFeed();
119402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      }
120402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    }
121402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  }
122402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
123402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private void checkFeed() {
124402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    if (file.isDirectory()) {
125402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      System.err.println(Messages.getString("RSSFeedWatcherTask.ErrorDestinationFileIsADirectory")); //$NON-NLS-1$
126402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    } else {
127402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      downloadFeed(tmpFile,debug>0);
128402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    }
129402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
130402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    if (tmpFile.isFile()) {
131402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      if (debug>0) { System.out.println(Messages.getString("RSSFeedWatcherTask.Compare") + SP + file + Messages.getString("RSSFeedWatcherTask.with") + tmpFile + CL); } //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
132402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
133402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      RSSFeedUpdateEntryTask oldFeedWatcher = null;
134402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      RSSFeedUpdateEntryTask newFeedWatcher = null;
135402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      int j=0;
136402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
137402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      for (int i = 0; i < feedWatchActions.length; i+=3)
138402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      {
139402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        String xpath = feedWatchActions[i].trim();
140402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        String action = feedWatchActions[i+1].trim();
141402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        String commandline = feedWatchActions[i+2].trim();
142402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
143402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        oldFeedWatcher = new RSSFeedUpdateEntryTask();
144402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        oldFeedWatcher.setFile(file.toString());
145402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        if (debug>0) { oldFeedWatcher.setDebug(debug); }
146402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        oldFeedWatcher.setXpath(xpath);
147402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        oldFeedWatcher.execute();
148402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
149402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        if (oldFeedWatcher.getFoundNode() != null) {
150402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          newFeedWatcher = new RSSFeedUpdateEntryTask();
151402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          newFeedWatcher.setFile(tmpFile.toString());
152402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          if (debug>0) { newFeedWatcher.setDebug(debug); }
153402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          newFeedWatcher.setXpath(xpath);
154402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          newFeedWatcher.execute();
155402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
156402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          String oldContent = oldFeedWatcher.getFoundNode().getTextContent();
157402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          String newContent = newFeedWatcher.getFoundNode().getTextContent();
158402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
159402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          if (debug>1) {
160402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll            System.out.println(Messages.getString("RSSFeedWatcherTask.GotOldNodeContents") + CL + SP + oldContent); //$NON-NLS-1$
161402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll            System.out.println(Messages.getString("RSSFeedWatcherTask.GotNewNodeContents") + CL + SP + newContent); //$NON-NLS-1$
162402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          }
163402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
164402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          if (!"null".equals(action)) { //$NON-NLS-1$
165402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll            commandline =
166402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll              (debug>0?"-debug " + debug + SP:NS) + ("null".equals(commandline)?NS:commandline) + //$NON-NLS-1$ //$NON-NLS-2$
167402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll              " -feedURL " + feedURL + //$NON-NLS-1$
168402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll              " -xpath \"" + xpath + "\"" + //$NON-NLS-1$ //$NON-NLS-2$
169402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll              " -oldvalue \"" + oldContent + "\"" + //$NON-NLS-1$ //$NON-NLS-2$
170402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll              " -newvalue \"" + newContent + "\""; //$NON-NLS-1$ //$NON-NLS-2$
171402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          }
172402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
173402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          // store actual value - either the changed value or the original value (if unchanged)
174402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          this.getProject().setProperty(feedWatchActionTheValue + DOT + j,!isNullString(newContent)?newContent:oldContent);
175402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
176402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          if (newFeedWatcher.getFoundNode() == null || // changed from exists to not exists, or
177402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll              !oldContent.equals(newContent) // node has changed
178402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          ) {
179402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll            // collect property from newNode and pass it to THIS task so that the local ant script can see it
180402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll            if (!isNullString(oldContent)) { this.getProject().setProperty(feedWatchActionOldValue + DOT + j,oldContent); }
181402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll            if (!isNullString(newContent)) { this.getProject().setProperty(feedWatchActionNewValue + DOT + j,newContent); }
182402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
183402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll            if (!"null".equals(action)) { //$NON-NLS-1$
184402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll              System.out.println(Messages.getString("RSSFeedWatcherTask.RunExecTask") + CL + SP + action + SP + commandline); //$NON-NLS-1$
185402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll              ExecTask exec = util.runExecTask((new File(action)).getAbsolutePath(), commandline, null);
186402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
187402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll              // collect properties from exec task and pass them to THIS task so that the local ant script can see them
188402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll              String out = null;
189402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
190402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll              out = exec.getProject().getProperty(RSSFeedUtil.RUN_EXEC_TASK_ERROR);
191402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll              if (!isNullString(out)) { this.getProject().setProperty(feedWatchActionError + DOT + j, out); }
192402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
193402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll              out = exec.getProject().getProperty(RSSFeedUtil.RUN_EXEC_TASK_RESULT);
194402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll              if (!isNullString(out)) { this.getProject().setProperty(feedWatchActionOuput + DOT + j, out); }
195402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
196402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll              out = exec.getProject().getProperty(RSSFeedUtil.RUN_EXEC_TASK_RESULT);
197402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll              if (!RSSFeedUtil.EXPECTED_RESULT.equals(out)) { this.getProject().setProperty(feedWatchActionResult + DOT + j, out); }
198402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll            }
199402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          } else {
200402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll            System.out.println(Messages.getString("RSSFeedWatcherTask.NodeUnchanged")); //$NON-NLS-1$
201402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          }
202402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        } else {
203402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          System.out.println(Messages.getString("RSSFeedWatcherTask.NodeNotFound")); //$NON-NLS-1$
204402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        }
205402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        j++;
206402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      }
207402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
208402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      try
209402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      {
210402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        RSSFeedUtil.transferData(new FileInputStream(tmpFile), new FileOutputStream(file));
211402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        tmpFile.deleteOnExit();
212402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      }
213402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      catch (FileNotFoundException e)
214402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      {
215402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        e.printStackTrace();
216402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      }
217402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      catch (IOException e)
218402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      {
219402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        e.printStackTrace();
220402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      }
221402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    }
222402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  }
223402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
224402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private void downloadFeed(File destFile, boolean verbose)
225402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  {
226402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    try
227402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    {
228402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      if (verbose) {
229402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        System.out.println(Messages.getString("RSSFeedWatcherTask.Download") + CL + SP + feedURL); //$NON-NLS-1$
230402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        System.out.println(Messages.getString("RSSFeedWatcherTask.To") + CL + SP + destFile + SP); //$NON-NLS-1$
231402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      }
232402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      RSSFeedUtil.transferData((new URL(feedURL)).openStream(), new FileOutputStream(destFile));
233402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      if (verbose) {
234402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        System.out.println(Messages.getString("RSSFeedWatcherTask.Done")); //$NON-NLS-1$
235402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        System.out.println(SP);
236402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      }
237402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    }
238402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    catch (MalformedURLException e)
239402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    {
240402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      e.printStackTrace();
241402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    }
242402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    catch (FileNotFoundException e)
243402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    {
244402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      e.printStackTrace();
245402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    }
246402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    catch (IOException e)
247402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    {
248402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      e.printStackTrace();
249402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    }
250402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  }
251402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
252402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private static boolean isNullString(String str)
253402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  {
254402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    return RSSFeedUtil.isNullString(str);
255402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  }
256402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
257402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll}