/***************************************************************************************************
 * Copyright (c) 2005 Eteration A.S. and Gorkem Ercan. 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: Gorkem Ercan - initial API and implementation
 *               
 **************************************************************************************************/
package org.eclipse.jst.server.generic.internal.core.util;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import org.eclipse.core.runtime.Platform;

/**
 * Utilities for file operations.
 * 
 * @author Gorkem Ercan
 */
public class FileUtil {

	
	
	/**
	 * Returns a resolved equivalent of url, use with the 
	 * platform relative urls
	 * 
	 * @param url
	 * @return URL
	 */
	public static URL resolveURL(URL url){
		try{
			return Platform.resolve(url);
		}catch(IOException e){
			//ignore
		}
		return null;
	}
	
	
	
	/**
	 * Create a temporary file
	 * @param name
	 * @param dir
	 * @return file
	 */
	public static File createTempFile(String name, String dir){
		if(name==null || dir == null)
			return null;
		
		File temp=null;
		String filePath;
		filePath = name.replace('/', File.separatorChar);
		if (filePath.startsWith(File.separator))
			filePath = filePath.substring(1);
		temp = new File(dir, filePath);
		verifyPath(temp,true);
		temp.deleteOnExit();
		return temp;
	
	}
	
	/**
	 * Copies a file
	 * @param input
	 * @param output
	 * @throws IOException
	 */
	public static void copy(InputStream input, OutputStream output) throws IOException{
		byte[] buf = new byte[4096];
		int len = input.read(buf);
		while(len!=-1){
			output.write(buf,0,len);
			len= input.read(buf);
		}
	}
	
	private static void verifyPath(File path, boolean isFile) {
		// if we are expecting a file back off 1 path element
		if (isFile) {
			if (path.getAbsolutePath().endsWith(File.separator)) {
				// make sure this is a file
				path = path.getParentFile();
				isFile = false;
			}
		}
		// already exists ... just return
		if (path.exists())
			return;
		// does not exist ... ensure parent exists
		File parent = path.getParentFile();
		verifyPath(parent, false);
		// ensure directories are made. Mark files or directories for deletion
		if (!isFile)
			path.mkdir();
		path.deleteOnExit();
	}

    /**
     * Resolves a URL to a file.
     * 
     * @param url
     * @return file
     */
    public static File resolveFile(URL url){
        try {
            URL resolvedUrl = resolveURL(url);
              URI uri = new URI(resolvedUrl.getProtocol(), resolvedUrl.getHost(),resolvedUrl.getPath(), resolvedUrl.getQuery());
            return new File(uri);
        } 
        catch (URISyntaxException e) {
        	//ignore
        }
        return null;
    }
}
