/*******************************************************************************
 * Copyright (c) 2006, 2007 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
 * yyyymmdd bug      Email and other contact information
 * -------- -------- -----------------------------------------------------------
 * 20060825   135570 makandre@ca.ibm.com - Andrew Mak, Service implementation URL not displayed properly on first page
 * 20070125   171071 makandre@ca.ibm.com - Andrew Mak, Create public utility method for copying WSDL files 
 * 20070509   182274 kathy@ca.ibm.com - Kathy Chan
 *******************************************************************************/
package org.eclipse.wst.ws.internal.util;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Path;

/**
 * <p>A utility class for transforming a path to and from the following formats:</p>
 * <ul>
 * <li>An absolute eclipse path (i.e. starts with /ProjectName/...)</li>
 * <li>An absolute filesystem URI path (i.e. file:/C:/MyWorkspace/ProjectName/...)</li>
 * <li>A platform URI path (i.e. platform:/resource/ProjectName/...)</li> 
 * </ul> 
 * <p>In all cases, if the transformer could not convert the path, it is returned unchanged.</p>
 */
public class UniversalPathTransformer {
	
	/**
	 * Prefix of platform URIs.
	 */
	public static final String PLATFORM_PREFIX = "platform:/resource/";
	
	/**
	 * Prefix of filesystem URIs.
	 */
	public static final String LOCATION_PREFIX = "file:/";

	private static String PROTOCOL_MARKER = ":";
	private static char PATH_SEPARATOR    = '/';
 	
	/**
	 * Determines if a URI string starts with the given prefix.  This method is case-insensitive. 
	 * 
	 * @param uri The URI string to check.
	 * @param prefix The prefix.
	 * @return true iff prefix is a strict prefix of the URI string (i.e. prefix != uri), false
	 * is returned otherwise.
	 */
	private static boolean isPrefix(String uri, String prefix) {
		if (prefix.length() >= uri.length())
			return false;
		
		return uri.substring(0, prefix.length()).equalsIgnoreCase(prefix);
	}

	/**
	 * Transform the given path to an eclipse path.  If the given path is a filesystem URI, it must map to
	 * a real resource in the workspace.
	 * 
	 * @param str The path to transform.
	 * @return Returns an eclipse path equivalent of the given path.
	 */
	public static String toPath(String str) {
		
		if (str == null || str.length() == 0)
			return str;
		
		if (isPrefix(str, PLATFORM_PREFIX)) {
			str = str.substring(PLATFORM_PREFIX.length() - 1);
		}
		else if (isPrefix(str, LOCATION_PREFIX)) {
			String s = str.substring(LOCATION_PREFIX.length());
			IFile file = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(new Path(s));
			if (file != null)
				str = file.getFullPath().makeAbsolute().toString();
		}
		
		return str;
	}

	/**
	 * Transform the given path to a platform URI path.  If the given path is a filesystem URI, it must map to
	 * a real resource in the workspace.
	 * 
	 * @param str The path to transform.
	 * @return Returns a platform URI path equivalent of the given path.
	 */
	public static String toPlatformPath(String str) {

		if (str == null || str.length() == 0)
			return str;		
		
		if (isPrefix(str, LOCATION_PREFIX)) {
			String s = str.substring(LOCATION_PREFIX.length());
			IFile file = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(new Path(s));
			if (file != null)
				str = PLATFORM_PREFIX + file.getFullPath().makeRelative();
		}			
		else if (str.indexOf(PROTOCOL_MARKER) == -1) {
			if (str.charAt(0) == PATH_SEPARATOR)
				str = PLATFORM_PREFIX + str.substring(1);
			else
				str = PLATFORM_PREFIX + str;
		}
		
		return str;
	}
	
	/**
	 * Transform the given path to a filesystem URI path.  The path must be a valid
	 * eclipse resource.
	 * 
	 * @param str The path to transform.
	 * @return Returns a filesystem URI path equivalent of the given path.
	 */
	public static String toLocation(String str) {
		
		if (str == null || str.length() == 0)
			return str;
		
		String s = str;
		
		if (isPrefix(s, PLATFORM_PREFIX))
			s = toPath(s);
		
		if (s.indexOf(PROTOCOL_MARKER) == -1) {			
			IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(s));
			if (file != null)
				str = file.getLocationURI().toString();
		}
				
		return str;
	}	
	
	/**
	 * Transform the given URI to an IFile.  Returns null if the URI is not in the workspace.
	 * 
	 * @param str The URI to transform.
	 * @return Returns IFile
	 */
	public static IFile toFile(String str) {
		
		IFile file = null;
		
		// local filesystem path
		if (str.startsWith(LOCATION_PREFIX)) {
			str = str.substring(LOCATION_PREFIX.length());				
			file = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(new Path(str));
		}
		else {	
			// platform path
			if (str.startsWith(PLATFORM_PREFIX))
				str = str.substring(PLATFORM_PREFIX.length());
		
			if (str.indexOf(':') == -1) {			
				file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(str));
			}
		}
								
		return file;
	}	
	
	/**
	 * Transform the given URIs to an IFiles.  
	 * IFile set to null if the URI is not in the workspace.
	 * 
	 * @param str The URIs to transform.
	 * @return Returns IFile[]
	 */
	public static IFile[] toFiles(String[] uris) {
		
		IFile[] files = null;
		if (uris != null) {
			files = new IFile[uris.length];		
			for (int i = 0; i < uris.length; i++) {
				String uri = uris[i];
				files[i] = UniversalPathTransformer.toFile(uri);
			}
		}
		return files;
	}	
}
