/*******************************************************************************
 * Copyright (c) 2000, 2004 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
/**
 * This class finds the version of a feature, plugin, or fragment in a given
 * build source tree.
 */

import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
import org.apache.xerces.parsers.SAXParser;
import org.xml.sax.SAXException;
import java.io.*;
import java.util.Hashtable;
import java.util.Enumeration;

public class TestVersionTracker extends DefaultHandler {

	private String installDirectory;
	private Hashtable elements;
	private SAXParser parser;
	private String xmlFile;
	
	//test
	public static void main(String[] args) {
		TestVersionTracker Tracker =
			new TestVersionTracker(args[1]);
		Tracker.parse(args[0]);
		Tracker.writeProperties(args[2], true);
	}

	public TestVersionTracker(String install, Hashtable elements) {
		//  Create a Xerces SAX Parser
		parser = new SAXParser();
        
		//  Set Content Handler
		parser.setContentHandler (this);
		
		// directory containing the source for a given build
		installDirectory = install;

		//  instantiate hashtable that will hold directory names with versions for elements
		this.elements = elements;
	}
	
	public TestVersionTracker(String install) {
		this(install, new Hashtable());
	}

	public void parse(String xmlFile){
		this.xmlFile = xmlFile;	
		//  Parse the Document      
		try {
			parser.parse(this.xmlFile);
		} catch (SAXException e) {
			System.err.println (e);
		} catch (IOException e) {
			System.err.println (e);
          
		}
	}

	//  Start Element Event Handler
	public void startElement(
		String uri,
		String local,
		String qName,
		Attributes atts) {

		String element = atts.getValue("id");
		String version = atts.getValue("version");

		if (local.equals("plugin") || local.equals("fragment")) {
				elements.put(element,element+"_"+version);
		} else if (local.equals("feature"))
				elements.put(element+"-feature",element+"_"+version);
		else if (local.equals("includes")) {
			File thisFile = new File(xmlFile);
			String includeFile = thisFile.getParentFile().getParent() + '/' + element+"_"+version + "/feature.xml";
			TestVersionTracker recurseTracker = new TestVersionTracker(installDirectory, elements);
			recurseTracker.parse(includeFile);
		}
	}

	public void writeProperties(String propertiesFile,boolean append){
		try{
			
		PrintWriter writer = new PrintWriter(new FileWriter(propertiesFile,append));
				
			Enumeration keys = elements.keys();

			while (keys.hasMoreElements()){
				Object key = keys.nextElement();
				writer.println(key.toString()+"="+elements.get(key).toString());
				writer.flush();
			}
			writer.close();
		
		} catch (IOException e){
			System.out.println("Unable to write to file "+propertiesFile);
		}
		
		
	}

}