/*******************************************************************************
 * Copyright (c) 2007 Chase Technology Ltd - http://www.chasetechnology.co.uk
 * 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:
 *     Doug Satchwell (Chase Technology Ltd) - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.xsl.internal.launching;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Path;
import org.eclipse.wst.xsl.launching.IProcessorInstall;
import org.eclipse.wst.xsl.launching.IProcessorJar;
import org.eclipse.wst.xsl.launching.ProcessorInstall;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.Text;

public class ProcessorPreferences
{
	private String defaultProcessorId;
	private List<IProcessorInstall> processors = new ArrayList<IProcessorInstall>();

	public void setProcessors(List<IProcessorInstall> processors)
	{
		this.processors = processors;
	}

	public List<IProcessorInstall> getProcessors()
	{
		return processors;
	}

	public String getDefaultProcessorId()
	{
		return defaultProcessorId;
	}

	public void setDefaultProcessorId(String defaultProcessorId)
	{
		this.defaultProcessorId = defaultProcessorId;
	}

	public String getAsXML() throws ParserConfigurationException, IOException, TransformerException
	{
		Document doc = PreferenceUtil.getDocument();
		Element config = doc.createElement("processorSettings"); 
		doc.appendChild(config);

		// Set the defaultVM attribute on the top-level node
		if (defaultProcessorId != null)
		{
			config.setAttribute("defaultProcessor", defaultProcessorId); 
		}

		for (Iterator<IProcessorInstall> iter = processors.iterator(); iter.hasNext();)
		{
			IProcessorInstall install = (IProcessorInstall) iter.next();
			if (!install.isContributed())
			{
				Element vmTypeElement = installAsElement(doc, install);
				config.appendChild(vmTypeElement);
			}
		}

		// Serialize the Document and return the resulting String
		return PreferenceUtil.serializeDocument(doc);
	}

	public static ProcessorPreferences fromXML(InputStream inputStream) throws CoreException
	{
		ProcessorPreferences prefs = new ProcessorPreferences();

		Document doc = PreferenceUtil.getDocument(inputStream);
		Element config = doc.getDocumentElement();

		// Populate the default VM-related fields
		prefs.setDefaultProcessorId(config.getAttribute("defaultProcessor"));

		List<IProcessorInstall> processors = new ArrayList<IProcessorInstall>();
		// Traverse the parsed structure and populate the VMType to VM Map
		Element[] processorEls = PreferenceUtil.getChildElements(config, "processor");
		for (int i = 0; i < processorEls.length; ++i)
		{
			IProcessorInstall processor = elementAsInstall(processorEls[i]);
			processors.add(processor);
		}

		prefs.setProcessors(processors);

		return prefs;
	}

	private static IProcessorInstall elementAsInstall(Element parent)
	{
		String id = parent.getAttribute("id");
		String label = parent.getAttribute("label");
		String typeId = parent.getAttribute("type");
		String supports = parent.getAttribute("supports");
		String debuggerId = parent.getAttribute("debuggerId");

		IProcessorJar[] jars = null;
		Element[] jarsEls = PreferenceUtil.getChildElements(parent, "jars");
		if (jarsEls.length == 1)
		{
			jars = elementAsJars(jarsEls[0]);
		}
		IProcessorInstall install = new ProcessorInstall(id, label, typeId, jars, debuggerId, supports, false);
		return install;
	}

	private static Element installAsElement(Document doc, IProcessorInstall install)
	{
		Element element = doc.createElement("processor");
		element.setAttribute("id", install.getId());
		element.setAttribute("label", install.getName());
		element.setAttribute("type", install.getProcessorType().getId());
		element.setAttribute("supports", install.getSupports());
		element.setAttribute("debuggerId", install.getDebugger() != null ? install.getDebugger().getId() : null);
		element.appendChild(jarsAsElement(doc, install.getProcessorJars()));
		return element;
	}

	private static IProcessorJar[] elementAsJars(Element element)
	{
		Element[] jarEls = PreferenceUtil.getChildElements(element, "jar");
		List<ProcessorJar> jars = new ArrayList<ProcessorJar>(jarEls.length);
		for (Element jarEl : jarEls)
		{
			Node node = jarEl.getFirstChild();
			if (node != null && node.getNodeType() == Node.TEXT_NODE)
			{
				String path = ((Text) node).getNodeValue();
				jars.add(new ProcessorJar(Path.fromPortableString(path)));
			}
		}
		return (IProcessorJar[]) jars.toArray(new IProcessorJar[0]);
	}

	private static Element jarsAsElement(Document doc, IProcessorJar[] jars)
	{
		Element jarsEl = doc.createElement("jars"); 
		for (IProcessorJar jar : jars)
		{
			if (jar != null && jar.getPath() != null)
			{
				Element jarEl = doc.createElement("jar");
				Text text = doc.createTextNode(jar.getPath().toPortableString());
				jarEl.appendChild(text);
				jarsEl.appendChild(jarEl);
			}
		}
		return jarsEl;
	}
}
