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.generators.rss;
12402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
13402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.io.File;
14402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.io.FileNotFoundException;
15402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.io.IOException;
16402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.io.PrintStream;
17402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.util.Date;
18402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
19402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport javax.xml.parsers.DocumentBuilder;
20402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport javax.xml.parsers.DocumentBuilderFactory;
21402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport javax.xml.parsers.ParserConfigurationException;
22402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport javax.xml.transform.Transformer;
23402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport javax.xml.transform.TransformerException;
24402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport javax.xml.transform.dom.DOMSource;
25402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport javax.xml.transform.stream.StreamResult;
26402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport javax.xml.xpath.XPath;
27402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport javax.xml.xpath.XPathConstants;
28402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport javax.xml.xpath.XPathExpressionException;
29402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport javax.xml.xpath.XPathFactory;
30402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
31402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.apache.tools.ant.BuildException;
32402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.apache.tools.ant.Task;
33402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.apache.tools.ant.util.DateUtils;
34402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.w3c.dom.Attr;
35402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.w3c.dom.Document;
36402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.w3c.dom.Element;
37402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.w3c.dom.Node;
38402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.w3c.dom.NodeList;
39402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.w3c.dom.Text;
40402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.xml.sax.SAXException;
41402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
42402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.releng.util.rss.Messages;
43402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.releng.util.rss.RSSFeedUtil;
44402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
45402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/**
46402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Parameters:
47402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *   debug - more output to console - eg., 0|1|2
48402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *
49402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *   file - path to the XML file that will be read - eg., /path/to/file.to.read.xml
50402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *   xpath - xpath string representing the object to modify
51402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *   replacement - string to use as replacement
52402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *
53402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @author nickb
54402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *
55402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */
56402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic class RSSFeedUpdateEntryTask extends Task {
57402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
58402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private int debug = 0;
59402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
60402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private static final String now = getTimestamp();
61402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
62402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private static final XPath xp = XPathFactory.newInstance().newXPath();
63402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
64402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private static final String NS = ""; //$NON-NLS-1$
65402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private static final String SEP = "----"; //$NON-NLS-1$
66402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private static final String SP = " "; //$NON-NLS-1$
67402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
68402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  //required fields
69402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private File file;
70402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
71402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private String xpath;
72402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private String replacement;
73402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
74402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private Transformer transformer = null;
75402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
76402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private boolean isNodeFound = false;
77402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private boolean isNodeChanged = false;
78402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private Node foundNode = null;
79402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
80402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  //optional
81402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  public void setDebug(int debug) { this.debug = debug; }
82402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
83402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  //required fields
84402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  public void setFile(String file) {
85402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    if (isNullString(file))
86402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    { System.err.println(Messages.getString("RSSFeedCommon.FileError")); } //$NON-NLS-1$
87402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    else
88402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    { this.file = new File(file); }
89402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  }
90402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  public void setXpath(String xpath) {
91402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    if (isNullString(xpath))
92402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    { System.err.println(Messages.getString("RSSFeedCommon.XpathError")); } //$NON-NLS-1$
93402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    else
94402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    { this.xpath = xpath; }
95402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  }
96402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
97402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  //optional - if null, display value found instead of changing it - see RSSFeedGetPropertyTask
98402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  public void setReplacement(String replacement) { this.replacement = replacement; }
99402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
100402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  // The method executing the task
101402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  public void execute() throws BuildException {
102402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    if (debug>0) {
103402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      System.out.println(Messages.getString("RSSFeedUpdateEntryTask.SearchingFor") + SP + xpath + (!isNullString(replacement)?", " + Messages.getString("RSSFeedUpdateEntryTask.ReplacingWith") + " '" + replacement + "'":NS)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
104402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    }
105402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    updateFeedXML(file); // load previous
106402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  }
107402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
108402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  //$ANALYSIS-IGNORE codereview.java.rules.exceptions.RuleExceptionsSpecificExceptions
109402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private void updateFeedXML(File file){
110402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    if (file.exists()) {
111402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance();
112402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      documentBuilderFactory.setNamespaceAware(true);
113402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      DocumentBuilder documentBuilder=null;
114402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      try {
115402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        documentBuilder=documentBuilderFactory.newDocumentBuilder();
116402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      }
117402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      catch (ParserConfigurationException e) {
118402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        e.printStackTrace();
119402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      }
120402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      Document document=null;
121402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      try {
122402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        document=documentBuilder.parse(file);
123402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      }
124402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      catch (SAXException e) {
125402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        e.printStackTrace();
126402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      }
127402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      catch (IOException e) {
128402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        e.printStackTrace();
129402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      }
130402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
131402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      try {
132402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        transformer = RSSFeedAddEntryTask.createTransformer("UTF-8"); //$NON-NLS-1$
133402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      } catch (TransformerException e) {
134402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        e.printStackTrace();
135402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      }
136402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
137402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      if (!isNullString(replacement)) {
138402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        setEntryNodeUpdate(document.getDocumentElement());
139402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      }
140402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      Node newNode=findAndReplace(document);
141402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      if (debug > 1 && newNode != null) {
142402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        try {
143402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          System.out.println(SEP);
144402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          transformer.transform(new DOMSource(newNode),new StreamResult(System.out));
145402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          System.out.println(SEP);
146402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        }
147402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        catch (TransformerException e) {
148402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          e.printStackTrace();
149402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        }
150402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      }
151402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      if (!isNullString(replacement) && newNode != null) {
152402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        try {
153402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          transformer.transform(new DOMSource(document),new StreamResult(new PrintStream(file)));
154402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        }
155402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        catch (FileNotFoundException e) {
156402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          e.printStackTrace();
157402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        }
158402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        catch (TransformerException e) {
159402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          e.printStackTrace();
160402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        }
161402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      }
162402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    }
163402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    else {
164402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      System.out.println(Messages.getString("RSSFeedCommon.RSSFeedFile") + SP + file.toString()+ " "+ Messages.getString("RSSFeedUpdateEntryTask.DoesNotExist")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
165402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    }
166402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  }
167402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
168402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  // get/set the desired node
169402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  public Node getFoundNode()
170402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  {
171402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    return this.foundNode;
172402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  }
173402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private void setFoundNode(Node foundNode)
174402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  {
175402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    this.foundNode = foundNode;
176402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  }
177402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
178402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  // has the desired node been found?
179402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  public boolean getNodeFound()
180402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  {
181402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    return this.isNodeFound;
182402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  }
183402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private void setNodeFound(boolean isNodeFound)
184402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  {
185402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    this.isNodeFound = isNodeFound;
186402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  }
187402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
188402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  // has the desired node been changed?
189402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  public boolean getNodeChanged()
190402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  {
191402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    return this.isNodeChanged;
192402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  }
193402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private void setNodeChanged(boolean isNodeChanged)
194402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  {
195402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    this.isNodeChanged = isNodeChanged;
196402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  }
197402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
198402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  /**
199402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll   * Modify an entry:
200402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll   *
201402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll   *   <entry>
202402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll   *      <title/>
203402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll   *      <link href=""/>
204402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll   *      <id/>
205402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll   *      <updated/>
206402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll   *      <summary>
207402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll   *       ...
208402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll   *     </summary>
209402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll   *   </entry>
210402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll   */
211402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private Node findAndReplace(Document document) {
212402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    Node parentEntryNode = null;
213402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    Node aNode = null;
214402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    if (debug==0) { System.out.print(xpath + (isNullString(replacement)?" = ":" :: ")); } //$NON-NLS-1$ //$NON-NLS-2$
215402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    NodeList nodelist = getNodeList(document, xpath);
216402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    // Process the elements in the nodelist
217402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    if (nodelist != null && nodelist.getLength()>0) {
218402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      for (int i=0; i<nodelist.getLength(); i++) {
219402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        Node node = (Node)nodelist.item(i);
220402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        switch (node.getNodeType())
221402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        {
222402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          case Node.ATTRIBUTE_NODE :
223402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll            aNode = (Attr)nodelist.item(i);
224402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll            if (debug>0) { System.out.print(Messages.getString("RSSFeedUpdateEntryTask.DebugFoundAttribute")); }  //$NON-NLS-1$
225402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll            break;
226402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
227402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          case Node.ELEMENT_NODE :
228402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll            aNode = (Element)nodelist.item(i);
229402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll            if (debug>0) { System.out.print(Messages.getString("RSSFeedUpdateEntryTask.DebugFoundElement")); } //$NON-NLS-1$
230402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll            break;
231402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
232402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          case Node.TEXT_NODE :
233402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll            aNode = (Text)nodelist.item(i);
234402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll            if (debug>0) { System.out.print(Messages.getString("RSSFeedUpdateEntryTask.DebugFoundText")); } //$NON-NLS-1$
235402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll            break;
236402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
237402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          default:
238402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll            aNode = null;
239402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          break;
240402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        }
241402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        if (aNode != null) {
242402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          setFoundNode(aNode);
243402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          setNodeFound(true);
244402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          System.out.print((debug>0?aNode.getNodeName() + " = ":NS) + aNode.getNodeValue()); //$NON-NLS-1$ //$NON-NLS-2$
245402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          if (!isNullString(replacement)) { aNode.setTextContent(replacement); }
246402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          System.out.println(isNullString(replacement)?NS:" => " + replacement); //$NON-NLS-1$ //$NON-NLS-2$
247402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          if (debug>0) {
248402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll            try
249402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll            {
250402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll              // write to console
251402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll              System.out.println(SEP); //$NON-NLS-1$
252402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll              transformer.transform(new DOMSource(getParentNode(document,aNode,null,NS)), new StreamResult(System.out));  //$NON-NLS-1$
253402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll              System.out.println(SEP); //$NON-NLS-1$
254402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll            }
255402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll            catch (TransformerException e)
256402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll            {
257402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll              e.printStackTrace();
258402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll            }
259402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          }
260402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          if (!isNullString(replacement)) {
261402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll            parentEntryNode = getParentNode(document, aNode, "entry", NS); //$NON-NLS-1$ //$NON-NLS-2$
262402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll            setEntryNodeUpdate(parentEntryNode);
263402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          }
264402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        }
265402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      }
266402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    } else {
267402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      System.out.println(Messages.getString("RSSFeedUpdateEntryTask.XpathNodeNotFound")); //$NON-NLS-1$
268402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    }
269402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    return parentEntryNode;
270402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  }
271402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
272402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private Node getParentNode(Document document, Node nodeIn, String target, String indent)
273402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  {
274402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    Node node = nodeIn;
275402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    if (node.getNodeType() != Node.ELEMENT_NODE) {
276402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      if (debug>1) { System.out.println(indent + Messages.getString("RSSFeedUpdateEntryTask.DebugGotATNode") + node.getNodeName()); } //$NON-NLS-1$
277402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      // get the element for the attrib/text node
278402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      NodeList nodelist = getNodeList(document, xpath.substring(0, xpath.lastIndexOf("/")));
279402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      if (nodelist !=null && nodelist.getLength()>0)
280402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      {
281402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        for (int i=0; i<nodelist.getLength(); i++) {
282402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          node = (Node)nodelist.item(i);
283402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          break;
284402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        }
285402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      }
286402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    }
287402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    if (debug>1) { System.out.println(indent + Messages.getString("RSSFeedUpdateEntryTask.DebugGotENode") + node.getNodeName() + " (" + node.getNodeType() + ")"); } //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
288402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    if (!isNullString(target) && !node.getNodeName().equals(target))
289402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    {
290402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      node = getParentNode(document, node.getParentNode(), target, indent + "_ "); //$NON-NLS-1$
291402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    }
292402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    return node;
293402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  }
294402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
295402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private NodeList getNodeList(Document document, String xpath)
296402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  {
297402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    NodeList nodelist = null;
298402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    try
299402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    {
300402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      xp.reset();
301402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      Object o = xp.evaluate(xpath, document, XPathConstants.NODESET);
302402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      if (o instanceof NodeList)
303402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      {
304402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        nodelist = (NodeList)o;
305402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      }
306402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    }
307402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    catch (XPathExpressionException e)
308402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    {
309402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      e.printStackTrace();
310402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    }
311402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    return nodelist;
312402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  }
313402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
314402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  //$ANALYSIS-IGNORE codereview.java.rules.exceptions.RuleExceptionsSpecificExceptions
315402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private void setEntryNodeUpdate(Node parentEntryNode){
316402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    for (Node child=parentEntryNode.getFirstChild(); child != null; child=child.getNextSibling()) {
317402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      if ("updated".equals(child.getLocalName())) { //$NON-NLS-1$
318402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        if (debug > 0) {
319402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll          System.out.println(Messages.getString("RSSFeedCommon.Set") + " <" + child.getLocalName()+ ">"+ now+ "</"+ child.getLocalName()+ ">"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
320402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        }
321402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        ((Element)child).setTextContent(now);
322402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        setNodeChanged(true);
323402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll        break;
324402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll      }
325402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    }
326402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  }
327402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
328402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
329402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private static String getTimestamp() { // eg., 2006-04-10T20:40:08Z
330402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    return DateUtils.format(new Date(), DateUtils.ISO8601_DATETIME_PATTERN) + "Z";  //$NON-NLS-1$
331402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  }
332402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
333402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  private static boolean isNullString(String str)
334402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  {
335402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll    return RSSFeedUtil.isNullString(str);
336402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  }
337402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
338402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll}