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