/*******************************************************************************
 * Copyright (c) 2003, 2005 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.jst.ws.internal.axis.consumption.ui.util;


import java.net.MalformedURLException;
import java.net.URL;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.common.util.URI;

public class PlatformUtils {

	public static final String PLATFORM_ROOT = "platform:/resource";
	public static final String WIN_FILE_PROTOCOL = "file:/";
	public static final String LNX_FILE_PROTOCOL = "file://";
	public static final String PLATFORM = "platform";
	public static final String RESOURCE = "/resource";

	private PlatformUtils() {
	}

	/**
	* Returns the string representation of platform URL given an IPath
	* @param IPath path
	* @return String platformURL
	*/
	public static String getPlatformURL(IPath path) {
		String platformURL;
		platformURL = URI.createPlatformResourceURI(path.toString()).toString();
		// old method: file system representation
		// 	platformURL = ResourcesPlugin.getWorkspace().getRoot().getFile(path).getLocation().toString();
		return platformURL;
	}

	/**
	* Returns the URL representation of the Platform URL given an IPath
	* The PlatformResourceManager underdstands this format and therefore
	* this is suited for command URL's
	* @param IPath path
	* @return URL Platform URL
	*/
	public static URL getCommandPlatformURL(IPath path) {
		URL url = null;
		try {
			url = new URL(PLATFORM, null, RESOURCE + path.toString());
		} catch (MalformedURLException e) {
			return url;
		}
		return url;
	}

	/**
	* Returns the string representation of path given platform URL string
	* @param String platform URL string
	* @return String path string
	*/
	public static String getPathFromPlatform(String platformStr) {
		String pathStr = platformStr;

		String rootLocation;
		rootLocation = PLATFORM_ROOT;
		// old method: file system representation
		//	rootLocation = ResourcesPlugin.getWorkspace().getRoot().getLocation().toString();
		if (platformStr.startsWith(rootLocation))
			pathStr = platformStr.substring(rootLocation.length());
		return pathStr;
	}

	/**
	* Returns the string representation of platform URL given the path string
	* @param String path string
	* @return String platform URL string
	*/
	public static String getPlatformFromPath(String pathStr) {
		String platformStr = pathStr;

		String rootLocation;
		rootLocation = PLATFORM_ROOT;
		// old method: file system representation
		//	rootLocation = ResourcesPlugin.getWorkspace().getRoot().getLocation().toString();
		platformStr = rootLocation + pathStr;
		return platformStr;
	}

	/**
	* Returns the string representation of the local file system file given platform URL string
	* @param String platform URL string
	* @return String file string
	*/
	public static String getFileFromPlatform(String platformStr) {
		String fileStr = platformStr;
		String pathStr = getPathFromPlatform(platformStr);

		fileStr =
			ResourcesPlugin
				.getWorkspace()
				.getRoot()
				.getFile(new Path(pathStr))
				.getLocation()
				.toString();

		// old method: file system representation
		//	Do nothing

		return fileStr;
	}

	/**
	* Returns the file protocol representation of the local file system file given platform URL string
	* @param String platform URL string
	* @return String the file protocol uri
	*/
	public static String getFileURLFromPlatform(String platformStr) {
		String fileStr = platformStr;
		String pathStr = getPathFromPlatform(platformStr);
		try {
			fileStr =
				ResourcesPlugin
					.getWorkspace()
					.getRoot()
					.getFile(new Path(pathStr))
					.getLocation()
					.toFile()
					.toURL()
					.toString();
		} catch (MalformedURLException murle) {
			fileStr = getFileURLFromPath(new Path(pathStr));
		}
		return fileStr;
	}

	/**
	* Returns the file protocol representation of a local file
	* @param IPath the Path object representing the file
	* @return String the file protocol uri
	*/
	public static String getFileURLFromPath(IPath path) {

		String file = null;
		if (path != null) {
			if (!path.isAbsolute()) {
				file =
					ResourcesPlugin
						.getWorkspace()
						.getRoot()
						.getFile(path)
						.getLocation()
						.toString();
				if (file.charAt(0) == IPath.SEPARATOR) {
					file = LNX_FILE_PROTOCOL + file;
				} else {
					file = WIN_FILE_PROTOCOL + file;
				}
			} else {
				file = path.toString();
			}
			if (file != null && file.charAt(0) == IPath.SEPARATOR) {
				file = LNX_FILE_PROTOCOL + file;
			} else {
				file = WIN_FILE_PROTOCOL + file;
			}
		}
		return file == null ? null : file;

	}
}
