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

/**
 * 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 FileLocator.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;
    }
}
