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}