1402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/*******************************************************************************
2402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Copyright (c) 2000, 2004 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 feature, plugin, or fragment in a given
13402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * build source tree.
14402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */
15402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
16402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.xml.sax.Attributes;
17402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.xml.sax.helpers.DefaultHandler;
18402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.apache.xerces.parsers.SAXParser;
19402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.xml.sax.SAXException;
20402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.io.*;
21402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.util.Hashtable;
22402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.util.Enumeration;
23402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
24402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic class TestVersionTracker extends DefaultHandler {
25402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
26402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private String installDirectory;
27402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private Hashtable elements;
28402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private SAXParser parser;
29402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private String xmlFile;
30402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
31402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	//test
32402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public static void main(String[] args) {
33402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		TestVersionTracker Tracker =
34402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			new TestVersionTracker(args[1]);
35402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		Tracker.parse(args[0]);
36402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		Tracker.writeProperties(args[2], true);
37402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
38402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
39402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public TestVersionTracker(String install, Hashtable elements) {
40402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		//  Create a Xerces SAX Parser
41402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		parser = new SAXParser();
42402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
43402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		//  Set Content Handler
44402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		parser.setContentHandler (this);
45402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
46402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		// directory containing the source for a given build
47402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		installDirectory = install;
48402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
49402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		//  instantiate hashtable that will hold directory names with versions for elements
50402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		this.elements = elements;
51402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
52402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
53402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public TestVersionTracker(String install) {
54402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		this(install, new Hashtable());
55402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
56402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
57402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public void parse(String xmlFile){
58402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		this.xmlFile = xmlFile;
59402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		//  Parse the Document
60402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		try {
61402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			parser.parse(this.xmlFile);
62402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} catch (SAXException e) {
63402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			System.err.println (e);
64402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} catch (IOException e) {
65402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			System.err.println (e);
66402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
67402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
68402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
69402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
70402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	//  Start Element Event Handler
71402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public void startElement(
72402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		String uri,
73402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		String local,
74402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		String qName,
75402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		Attributes atts) {
76402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
77402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		String element = atts.getValue("id");
78402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		String version = atts.getValue("version");
79402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
80402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (local.equals("plugin") || local.equals("fragment")) {
81402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				elements.put(element,element+"_"+version);
82402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} else if (local.equals("feature"))
83402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				elements.put(element+"-feature",element+"_"+version);
84402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		else if (local.equals("includes")) {
85402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			File thisFile = new File(xmlFile);
86402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			String includeFile = thisFile.getParentFile().getParent() + '/' + element+"_"+version + "/feature.xml";
87402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			TestVersionTracker recurseTracker = new TestVersionTracker(installDirectory, elements);
88402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			recurseTracker.parse(includeFile);
89402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
90402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
91402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
92402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public void writeProperties(String propertiesFile,boolean append){
93402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		try{
94402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
95402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		PrintWriter writer = new PrintWriter(new FileWriter(propertiesFile,append));
96402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
97402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			Enumeration keys = elements.keys();
98402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
99402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			while (keys.hasMoreElements()){
100402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				Object key = keys.nextElement();
101402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				writer.println(key.toString()+"="+elements.get(key).toString());
102402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				writer.flush();
103402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
104402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			writer.close();
105402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
106402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} catch (IOException e){
107402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			System.out.println("Unable to write to file "+propertiesFile);
108402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
109402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
110402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
111402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
112402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
113402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll}
114