/*******************************************************************************
 * 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.launching.config;

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

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

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.wst.xsl.internal.launching.LaunchingPlugin;
import org.eclipse.wst.xsl.internal.launching.PreferenceUtil;
import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class LaunchPipeline
{
	private List<LaunchTransform> transformDefs = new ArrayList<LaunchTransform>();
	private final Properties outputProperties = new Properties();

	public Properties getOutputProperties()
	{
		return outputProperties;
	}

	public void addOutputProperty(String name, String value)
	{
		outputProperties.put(name, value);
	}

	public List<LaunchTransform> getTransformDefs()
	{
		return transformDefs;
	}

	public void setTransformDefs(List<LaunchTransform> transforms)
	{
		transformDefs = transforms;
	}

	public void addTransformDef(LaunchTransform tdef)
	{
		tdef.setPipeline(this);
		transformDefs.add(tdef);
	}

	public void removeTransformDef(LaunchTransform tdef)
	{
		transformDefs.remove(tdef);
	}

	public String toXML() throws CoreException
	{
		String xml = null;
		try
		{
			Document doc = PreferenceUtil.getDocument();
			Element rootEl = doc.createElement("Pipeline"); //$NON-NLS-1$
			doc.appendChild(rootEl);

			Element opEl = doc.createElement("OutputProperties"); //$NON-NLS-1$
			rootEl.appendChild(opEl);
			for (Object element : outputProperties.entrySet())
			{
				Map.Entry entry = (Map.Entry) element;
				Element propEl = doc.createElement("Property"); //$NON-NLS-1$
				propEl.setAttribute("name", (String) entry.getKey()); //$NON-NLS-1$
				propEl.setAttribute("value", (String) entry.getValue()); //$NON-NLS-1$
				opEl.appendChild(propEl);
			}

			for (Iterator<LaunchTransform> iter = transformDefs.iterator(); iter.hasNext();)
			{
				LaunchTransform tdef = (LaunchTransform) iter.next();
				Element tdefEl = tdef.asXML(doc);
				rootEl.appendChild(tdefEl);
			}

			xml = PreferenceUtil.serializeDocument(doc);
		}
		catch (DOMException e)
		{
			throw new CoreException(new Status(IStatus.ERROR, LaunchingPlugin.PLUGIN_ID, 0, e.getMessage(), e));
		}
		catch (ParserConfigurationException e)
		{
			throw new CoreException(new Status(IStatus.ERROR, LaunchingPlugin.PLUGIN_ID, 0, e.getMessage(), e));
		}
		catch (IOException e)
		{
			throw new CoreException(new Status(IStatus.ERROR, LaunchingPlugin.PLUGIN_ID, 0, e.getMessage(), e));
		}
		catch (TransformerException e)
		{
			throw new CoreException(new Status(IStatus.ERROR, LaunchingPlugin.PLUGIN_ID, 0, e.getMessage(), e));
		}
		return xml;
	}

	public static LaunchPipeline fromXML(InputStream inputStream) throws CoreException
	{
		Document doc = PreferenceUtil.getDocument(inputStream);

		LaunchPipeline pdef = new LaunchPipeline();

		Element rootEl = doc.getDocumentElement();

		Element opEl = (Element) rootEl.getElementsByTagName("OutputProperties").item(0); //$NON-NLS-1$
		if (opEl != null)
		{
			NodeList propEls = opEl.getElementsByTagName("Property"); //$NON-NLS-1$
			for (int i = 0; i < propEls.getLength(); i++)
			{
				Element propEl = (Element) propEls.item(i);
				String name = propEl.getAttribute("name"); //$NON-NLS-1$
				String value = propEl.getAttribute("value"); //$NON-NLS-1$
				pdef.addOutputProperty(name, value);
			}
		}

		NodeList transformEls = rootEl.getElementsByTagName("Transform"); //$NON-NLS-1$
		for (int i = 0; i < transformEls.getLength(); i++)
		{
			Element transformEl = (Element) transformEls.item(i);
			LaunchTransform tdef = LaunchTransform.fromXML(transformEl);
			pdef.addTransformDef(tdef);
		}

		return pdef;
	}
}
