/*******************************************************************************
 * 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.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.variables.VariablesPlugin;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class LaunchTransform
{
	public static final String RESOURCE_TYPE = "resource"; //$NON-NLS-1$
	public static final String EXTERNAL_TYPE = "external"; //$NON-NLS-1$

	private final String stylesheet;
	private final String pathType;
	private String resolver;
	private final Set<LaunchAttribute> parameters = new HashSet<LaunchAttribute>();
	private LaunchPipeline pipeline;

	/**
	 * The path may be an IResource to a file in the workspace, or an IPath to a
	 * file outside of the workspace - depending on the pathType. The path
	 * should be created using IPath.toPortableString(). The path may also
	 * contain variables defined by the VariablePlugin.
	 * 
	 * @param path
	 * @param pathType
	 */
	public LaunchTransform(String path, String pathType)
	{
		stylesheet = path;
		this.pathType = pathType;
	}

	public Set<LaunchAttribute> getParameters()
	{
		return parameters;
	}
	
	public void addParameter(LaunchAttribute parameter)
	{
		parameters.add(parameter);
	}

	public String getResolver()
	{
		return resolver;
	}

	public void setResolver(String resolver)
	{
		this.resolver = resolver;
	}

	public IPath getPath() throws CoreException
	{
		String substitutedValue = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(stylesheet);
		return Path.fromPortableString(substitutedValue);
	}

	public String getPathType()
	{
		return pathType;
	}

	/**
	 * The full path to the file in the local file system (with any string
	 * subsitutions already made).
	 * 
	 * @return
	 * @throws CoreException
	 */
	public IPath getLocation() throws CoreException
	{
		IPath partialPath = getPath();
		IPath fullPath = null;
		if (RESOURCE_TYPE.equals(pathType))
		{
			IFile file = (IFile) ResourcesPlugin.getWorkspace().getRoot().findMember(partialPath);
			fullPath = file.getLocation();
		}
		else if (EXTERNAL_TYPE.equals(pathType))
		{
			fullPath = partialPath;
		}
		return fullPath;
	}

	public Element asXML(Document doc)
	{
		Element tdefEl = doc.createElement("Transform"); //$NON-NLS-1$
		tdefEl.setAttribute("path", stylesheet); //$NON-NLS-1$
		tdefEl.setAttribute("pathType", pathType); //$NON-NLS-1$
		if (resolver != null)
			tdefEl.setAttribute("uriResolver", resolver); //$NON-NLS-1$
		Element paramsEl = doc.createElement("Parameters"); //$NON-NLS-1$
		tdefEl.appendChild(paramsEl);
		for (Iterator<LaunchAttribute> iter = parameters.iterator(); iter.hasNext();)
		{
			LaunchAttribute param = (LaunchAttribute) iter.next();
			Element propEl = doc.createElement("Parameter"); //$NON-NLS-1$
			propEl.setAttribute("name", param.uri); //$NON-NLS-1$
			propEl.setAttribute("value", param.value); //$NON-NLS-1$
			paramsEl.appendChild(propEl);
		}
		return tdefEl;
	}

	public static LaunchTransform fromXML(Element transformEl)
	{
		String path = transformEl.getAttribute("path"); //$NON-NLS-1$
		String pathType = transformEl.getAttribute("pathType"); //$NON-NLS-1$

		LaunchTransform tdef = new LaunchTransform(path, pathType);

		String uriResolver = transformEl.getAttribute("uriResolver"); //$NON-NLS-1$
		tdef.setResolver(uriResolver);

		Element paramsEl = (Element) transformEl.getElementsByTagName("Parameters").item(0); //$NON-NLS-1$
		NodeList paramEls = paramsEl.getElementsByTagName("Parameter"); //$NON-NLS-1$
		for (int i = 0; i < paramEls.getLength(); i++)
		{
			Element paramEl = (Element) paramEls.item(i);
			String name = paramEl.getAttribute("name"); //$NON-NLS-1$
			String type = paramEl.getAttribute("type"); //$NON-NLS-1$
			String value = paramEl.getAttribute("value"); //$NON-NLS-1$
			tdef.addParameter(new LaunchAttribute(name, type, value));
		}

		return tdef;
	}

	public void setPipeline(LaunchPipeline pipeline)
	{
		this.pipeline = pipeline;
	}

	public LaunchPipeline getPipeline()
	{
		return pipeline;
	}

	/*
	 * private File getURIResolverDirectory(ILaunchConfiguration configuration)
	 * throws CoreException { File resolverDir = null; String baseURIType =
	 * configuration.getAttribute(XSLLaunchConfigurationConstants.ATTR_BASE_URI_TYPE,
	 * XSLLaunchConfigurationConstants.BASE_URI_WORKING_DIR_RELATIVE); if
	 * (XSLLaunchConfigurationConstants.BASE_URI_ABSOLUTE.equals(baseURIType)) {
	 * String uriDir =
	 * configuration.getAttribute(XSLLaunchConfigurationConstants.ATTR_BASE_URI_DIRECTORY,
	 * (String)null); if (uriDir!=null) { String pathExpr =
	 * VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(uriDir);
	 * Path path = new Path(pathExpr); if (path.isAbsolute()) { File dir = new
	 * File(path.toOSString()); if (dir.isDirectory() && dir.exists()) { return
	 * dir; } // This may be a workspace relative path returned by a variable. //
	 * However variable paths start with a slash and thus are thought to // be
	 * absolute, so fall through to below } IResource res =
	 * ResourcesPlugin.getWorkspace().getRoot().findMember(path); if (res
	 * instanceof IContainer && res.exists()) return res.getLocation().toFile();
	 * abort("URI path is invalid",null,0); } } else if
	 * (XSLLaunchConfigurationConstants.BASE_URI_STYLESHEET_RELATIVE.equals(baseURIType)) {
	 * resolverDir = getStylesheetRelativeURIResolver(configuration); } // no
	 * need to handle the case of working_dir relative - this is the default for
	 * JAXP so return null return resolverDir; }
	 * 
	 * private File getStylesheetRelativeURIResolver(ILaunchConfiguration
	 * configuration) throws CoreException { List stylesheets =
	 * configuration.getAttribute(XSLLaunchConfigurationConstants.ATTR_STYLESHEETS_LIST,(List)null);
	 * if (stylesheets == null || stylesheets.size() == 0) abort("No stylesheets
	 * defined for this launch configuration", null, 0); else { String sheet =
	 * (String)stylesheets.get(0); String pathExpr =
	 * VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(sheet);
	 * Path path = new Path(pathExpr); if (path.isAbsolute()) { File file = new
	 * File(path.toOSString()); if (file.exists()) { File dir =
	 * file.getParentFile(); return dir; } // This may be a workspace relative
	 * path returned by a variable. // However variable paths start with a slash
	 * and thus are thought to // be absolute IResource res =
	 * ResourcesPlugin.getWorkspace().getRoot().findMember(path); IContainer
	 * parent = res.getParent(); if (parent.exists()) return
	 * parent.getLocation().toFile(); abort("Stylesheet path is
	 * invalid",null,0); } else { IResource res =
	 * ResourcesPlugin.getWorkspace().getRoot().findMember(path); IContainer
	 * parent = res.getParent(); if (parent.exists()) return
	 * parent.getLocation().toFile(); abort("Stylesheet path is
	 * invalid",null,0); } } return null; }
	 */
}
