1402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/******************************************************************************* 2402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Copyright (c) 2000, 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 Moll/** 12402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * This class finds the version of a plug-in, or fragment listed in a feature 13402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * and writes <element>=<element>_<version> for each in a properties file. 14402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * The file produced from this task can be loaded by an Ant script to find files in the 15402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * binary versions of plugins and fragments. 16402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 17402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpackage org.eclipse.releng.generators; 18402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 19402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.xml.sax.Attributes; 20402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.xml.sax.helpers.DefaultHandler; 21402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 22402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport javax.xml.parsers.ParserConfigurationException; 23402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport javax.xml.parsers.SAXParser; 24402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport javax.xml.parsers.SAXParserFactory; 25402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.xml.sax.SAXException; 26402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.io.*; 27402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.util.Hashtable; 28402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.util.Enumeration; 29402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.apache.tools.ant.Task; 30402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.util.Vector; 31402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 32402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic class VersionTrackerTask extends Task { 33402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 34402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll private String buildDirectory; 35402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll private Hashtable elements; 36402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll private SAXParser parser; 37402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll private Vector allElements; 38402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 39402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll //the feature to from which to collect version information 40402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll private String featurePath; 41402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 42402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll //the path to the file in which to write the results 43402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll private String outputFilePath; 44402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 45402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll public void execute(){ 46402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll VersionTrackerTask tracker = 47402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll new VersionTrackerTask(getBuildDirectory()); 48402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll tracker.parse(getFeaturePath(),new FeatureHandler()); 49402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll tracker.parse(new PluginHandler()); 50402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll tracker.writeProperties(getOutputFilePath(), true); 51402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 52402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 53402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll //test 54402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll public static void main(String[] args) { 55402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll VersionTrackerTask Tracker = 56402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll new VersionTrackerTask(args[1]); 57402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll Tracker.parse(args[0],Tracker.new FeatureHandler()); 58402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll Tracker.parse(Tracker.new PluginHandler()); 59402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll Tracker.writeProperties(args[2], true); 60402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 61402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 62402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll public VersionTrackerTask(){ 63402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 64402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 65402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll public VersionTrackerTask(String install) { 66402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll elements = new Hashtable(); 67402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll allElements=new Vector(); 68402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 69402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); 70402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll try { 71402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll parser = saxParserFactory.newSAXParser(); 72402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } catch (ParserConfigurationException e) { 73402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll e.printStackTrace(); 74402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } catch (SAXException e) { 75402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll e.printStackTrace(); 76402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 77402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 78402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll // directory containing the source for a given build 79402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll buildDirectory = install; 80402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 81402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 82402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll private void parse (DefaultHandler handler){ 83402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll for (int i=0; i<allElements.size();i++){ 84402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll parse(allElements.elementAt(i).toString(), handler); 85402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 86402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 87402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 88402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll public void parse(String xmlFile,DefaultHandler handler){ 89402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll try { 90402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll parser.parse(xmlFile,handler); 91402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } catch (SAXException e) { 92402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll System.err.println (e); 93402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } catch (IOException e) { 94402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll System.err.println (e); 95402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 96402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 97402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 98402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll private class FeatureHandler extends DefaultHandler{ 99402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll // Start Element Event Handler 100402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll public void startElement( 101402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll String uri, 102402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll String local, 103402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll String qName, 104402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll Attributes atts) { 105402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 106402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll String element = atts.getValue("id"); 107402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll //need to parse the plugin.xml or fragment.xml for the correct version value since the 3.0 features may list these as "0.0.0" 108402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (qName.equals("plugin")) { 109402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll try{ 110402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll allElements.add(getBuildDirectory()+File.separator+"plugins"+File.separator+element+File.separator+"plugin.xml"); 111402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } catch (Exception e){ 112402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll e.printStackTrace(); 113402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 114402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 115402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } else if (qName.equals("fragment")){ 116402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll allElements.add(getBuildDirectory()+File.separator+"plugins"+File.separator+element+File.separator+"fragment.xml"); 117402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 118402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 119402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 120402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 121402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll private class PluginHandler extends DefaultHandler{ 122402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll // Start Element Event Handler 123402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll public void startElement( 124402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll String uri, 125402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll String local, 126402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll String qName, 127402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll Attributes atts) { 128402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 129402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 130402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll String element = atts.getValue("id"); 131402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll String version = atts.getValue("version"); 132402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll System.out.println("Examining "+element); 133402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 134402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (qName.equals("plugin") || qName.equals("fragment")){ 135402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll System.out.println("Found plugin "+element); 136402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll elements.put(element,element+"_"+version); 137402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 138402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 139402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 140402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 141402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll public void writeProperties(String propertiesFile,boolean append){ 142402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll try{ 143402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 144402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll PrintWriter writer = new PrintWriter(new FileWriter(propertiesFile,append)); 145402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 146402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll Enumeration keys = elements.keys(); 147402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 148402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll while (keys.hasMoreElements()){ 149402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll Object key = keys.nextElement(); 150402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll writer.println(key.toString()+"="+elements.get(key).toString()); 151402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll writer.flush(); 152402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 153402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll writer.close(); 154402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 155402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } catch (IOException e){ 156402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll System.out.println("Unable to write to file "+propertiesFile); 157402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 158402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 159402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 160402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 161402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 162402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll /** 163402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @return Returns the featurePath. 164402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 165402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll public String getFeaturePath() { 166402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll return featurePath; 167402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 168402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 169402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll /** 170402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @param featurePath The featurePath to set. 171402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 172402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll public void setFeaturePath(String featurePath) { 173402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll this.featurePath = featurePath; 174402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 175402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 176402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll /** 177402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @return Returns the installDirectory. 178402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 179402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll public String getBuildDirectory() { 180402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll return buildDirectory; 181402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 182402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 183402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll /** 184402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @param installDirectory The installDirectory to set. 185402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 186402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll public void setBuildDirectory(String buildDirectory) { 187402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll this.buildDirectory = buildDirectory; 188402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 189402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 190402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll /** 191402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @return Returns the outputFilePath. 192402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 193402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll public String getOutputFilePath() { 194402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll return outputFilePath; 195402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 196402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 197402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll /** 198402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @param outputFilePath The outputFilePath to set. 199402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 200402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll public void setOutputFilePath(String outputFilePath) { 201402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll this.outputFilePath = outputFilePath; 202402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 203402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 204402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 205