/*******************************************************************************
 * Copyright (c) 2006 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.callisto.tools;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilder;

import org.eclipse.callisto.tools.utils.CommonXML;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
 * The purpose of this utility is to take a site.xml file that's automatically
 * created during the mirror command operations, and "merge" it with an
 * authored site.xml file that uses different categories or descriptions that
 * the automated one. The "merge" is only that any new URL's or version
 * numbers are mapped to their corresponding authored versions, so rest of
 * authored version is untouched, and can be used as "the" site.xml for the
 * mirrored site.
 */

public class SiteFileUpdater {

	public static void main(String[] args) {

		if (args.length != 2) {
			System.out.println();
			System.out.println("    Usage: file-to-merge-into file-to-merge-from"); //$NON-NLS-1$
			System.out.println("           The file-to-merge-into will be overwritten"); //$NON-NLS-1$
			System.out.println();
		}
		else {
			try {
				String oldFileName = args[0];
				String newFileName = args[1];
				SiteFileUpdater siteFileUpdater = new SiteFileUpdater();
				// old file is the authored file, with old feature versions
				FileInputStream oldFile;
				oldFile = new FileInputStream(oldFileName);
				// new file has correct feature versions and url's from mirror
				// command
				FileInputStream newFile = new FileInputStream(newFileName);
				Document mergedDom = siteFileUpdater.merge(oldFile, newFile);
				oldFile.close();
				newFile.close();

				// outfile will contain "merge" xml files
				FileOutputStream outfile = new FileOutputStream(oldFileName);
				CommonXML.serialize(mergedDom, outfile);

				outfile.close();
				System.out.println("\tOutput to: " + oldFileName); //$NON-NLS-1$
			}
			catch (IOException e) {
				e.printStackTrace();
			}
		}

	}

	private Document merge(FileInputStream oldFile, FileInputStream newFile) throws IOException {

		DocumentBuilder documentBuilder = CommonXML.getDocumentBuilder();
		Document mergedDom = null;
		try {
			Document oldDom = documentBuilder.parse(oldFile);

			Document newDom = documentBuilder.parse(newFile);
			mergedDom = merge(oldDom, newDom);
		}
		catch (SAXException e) {
			e.printStackTrace();
		}
		return mergedDom;


	}

	private Document merge(Document oldDom, Document newDom) {

		Document result = oldDom;
		NodeList oldNodeList = oldDom.getElementsByTagName("feature"); //$NON-NLS-1$
		NodeList newNodeList = newDom.getElementsByTagName("feature"); //$NON-NLS-1$

		// go through each of the existing features, if there's a new one with
		// same ID,
		// then update old one with url and version.
		int nNodes = oldNodeList.getLength();

		for (int i = 0; i < nNodes; i++) {
			Node node = oldNodeList.item(i);
			NamedNodeMap attributeMap = node.getAttributes();
			Node oldIdAttribute = attributeMap.getNamedItem("id"); //$NON-NLS-1$

			Node matchingNode = findMatchingNodeById(newNodeList, oldIdAttribute);
			if (matchingNode != null) {
				// so, found match, update url and version
				Node newurl = matchingNode.getAttributes().getNamedItem("url"); //$NON-NLS-1$
				Node newversion = matchingNode.getAttributes().getNamedItem("version"); //$NON-NLS-1$
				Attr newurlAttr = node.getOwnerDocument().createAttribute("url"); //$NON-NLS-1$
				Attr newversionAttr = node.getOwnerDocument().createAttribute("version"); //$NON-NLS-1$
				newurlAttr.setValue(newurl.getNodeValue());
				newversionAttr.setNodeValue(newversion.getNodeValue());
				attributeMap.setNamedItem(newurlAttr);
				attributeMap.setNamedItem(newversionAttr);
			}

		}

		return result;
	}

	private Node findMatchingNodeById(NodeList nodeList, Node attribute) {
		Node result = null;
		ArrayList matches = new ArrayList();
		String idValue = attribute.getNodeValue();

		for (int i = 0; i < nodeList.getLength(); i++) {
			Node potentialnode = nodeList.item(i);
			Node potentialMatch = potentialnode.getAttributes().getNamedItem(Messages.getString("SiteFileUpdater.10")); //$NON-NLS-1$
			if (potentialMatch != null) {
				String potentialIdValue = potentialMatch.getNodeValue();
				if (idValue.equals(potentialIdValue)) {
					matches.add(potentialnode);
				}
			}
		}
		if (matches.size() > 1) {
			System.out.println(Messages.getString("SiteFileUpdater.11") + idValue); //$NON-NLS-1$
			System.out.println("              The last one in list was used, but sites(s) should be cleaned up so only newest one included"); //$NON-NLS-1$
			for (int i = 0; i < matches.size(); i++) {
				Node match = (Node) matches.get(i);
				Node version = match.getAttributes().getNamedItem("version"); //$NON-NLS-1$

				System.out.println("        " + version.getNodeValue()); //$NON-NLS-1$
			}

		}
		if (matches.size() > 0) {
			result = (Node) matches.get(matches.size() - 1);
		}
		return result;
	}
}
