/*******************************************************************************
 * Copyright (c) 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
 *******************************************************************************/
package org.eclipse.wst.sse.unittests.minortools;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import org.eclipse.wst.xml.core.tests.util.CommonXML;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;



/**
 * Modifies plugin.xml and fragment.xml files to not require specific versions
 * of their plugin dependencies.
 * 
 * @author nitin
 */
public class VersionRemover {

	char[] charbuff = new char[2048];
	StringBuffer s = null;

	public VersionRemover() {
		super();
	}



	public static void main(String[] args) {
		if (args.length < 1)
			new VersionRemover().visit(new File("d:/target"));
		else
			new VersionRemover().visit(new File(args[0]));
	}



	protected void visit(File file) {
		// Skip directories like org.eclipse.*, org.apache.*, and org.junit.*
		if (file.isDirectory() && !file.getName().startsWith("org.eclipse.") && !file.getName().startsWith("org.apache") && !file.getName().startsWith("org.junit")) {
			String[] contents = file.list();
			for (int i = 0; i < contents.length; i++)
				visit(new File(file.getAbsolutePath() + '/' + contents[i]));
		}
		else {
			fixupFile(file);
		}
	}

	protected void fixupFile(File file) {
		// only load and fixup files named plugin.xml or fragment.xml under eclipse\plugins\XXXXXXX.*
		if (!(file.getName().equalsIgnoreCase("plugin.xml") || file.getName().equalsIgnoreCase("fragment.xml")) || file.getAbsolutePath().indexOf("eclipse\\plugins\\XXXXXXX.") == -1)
			return;
		//		System.out.println(file.getAbsolutePath());
		try {
			Document doc = CommonXML.getDocumentBuilder().parse(file);
			NodeList imports = null;
			if (file.getName().equalsIgnoreCase("plugin.xml"))
				imports = doc.getElementsByTagName("import");
			else if (file.getName().equalsIgnoreCase("fragment.xml"))
				imports = doc.getElementsByTagName("fragment");
			boolean changed = false;
			for (int i = 0; i < imports.getLength(); i++) {
				Node importNode = imports.item(i);
				if (importNode.getNodeName().equalsIgnoreCase("import") && importNode.getAttributes().getNamedItem("version") != null) {
					changed = true;
					importNode.getAttributes().removeNamedItem("version");
				}
				if (importNode.getAttributes().getNamedItem("plugin-version") != null) {
					changed = true;
					importNode.getAttributes().removeNamedItem("plugin-version");
				}
				if (importNode.getAttributes().getNamedItem("match") != null) {
					importNode.getAttributes().removeNamedItem("match");
					changed = true;
				}
			}
			if (changed) {
				FileOutputStream ostream = new FileOutputStream(file.getAbsolutePath());
				CommonXML.serialize(doc, ostream);
				ostream.close();
				System.out.println("Modified " + file.getAbsolutePath());
			}
		}
		catch (SAXException e) {
			System.err.println(file.getPath() + ": " + e);
		}
		catch (IOException e) {
			System.err.println(file.getPath() + ": " + e);
		}
	}
}