/*
 *
 *  Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You under the Apache License, Version 2.0
 *  (the "License"); you may not use this file except in compliance with
 *  the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 */

package flex2.compiler.io;

//import flash.util.FileUtils;
//import flash.util.Trace;
import flex2.compiler.util.MimeMappings;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;

/**
 * A VirtualFile implemenation, which is backed by a file on a local
 * disk.
 *
 * @author Clement Wong
 */
public class LocalFile implements VirtualFile
{

	public LocalFile(File f)
	{
		this.f = f;
	}

	private File f;
	private String name;
	private String mimeType;

	/**
	 * Return name... It could be canonical path name, URL, etc. But it must be unique among all the files
	 * processed by the compiler...
	 *
	 * The compiler should not use this to get... e.g. parent path... There is no guarantee that this returns
	 * a pathname even though the underlying implementation deals with files...
	 */
	public String getName()
	{
		if (name == null)
		{
			name = FileUtil.getCanonicalPath(f);
			f = FileUtil.openFile(name);
		}

		return name;
	}

	public String getNameForReporting()
	{
		return getName();
	}

	@SuppressWarnings("deprecation")
    public String getURL()
	{
		try
		{
			return f.toURL().toExternalForm();
		}
		catch (MalformedURLException ex)
		{
			return null;
		}
	}

	// This is temporary...
	public String getParent()
	{
		return f.getParentFile().getAbsolutePath();
	}

	public boolean isDirectory()
	{
		return f.isDirectory();
	}

	/**
	 * Return file size...
	 */
	public long size()
	{
		return f.length();
	}

	/**
	 * Return mime type
	 */
	public String getMimeType()
	{
		if (mimeType == null)
		{
			mimeType = MimeMappings.getMimeType(getName());
		}
		return mimeType;
	}

	/**
	 * Return input stream...
	 */
	public InputStream getInputStream() throws IOException
	{
		return FileUtil.openStream(f);
	}

	public byte[] toByteArray() throws IOException
	{
		return null;
	}

	/**
	 * Return last time the underlying source is modified.
	 */
	public long getLastModified()
	{
		return f.lastModified();
	}

	/**
	 * Return an instance of this interface which represents the specified relative path.
	 */
	public VirtualFile resolve(String relativeStr)
	{
		File relativeFile = null;

		if (f.isDirectory())
		{
			relativeFile = FileUtil.openFile(f, relativeStr);
		}
		else if (f.isFile())
		{
			relativeFile = FileUtil.openFile(f.getParentFile(), relativeStr);
		}

		VirtualFile result = null;

		if (relativeFile != null && relativeFile.exists())
		{
			result = new LocalFile(relativeFile);
		}

		/* AJH later
		if ((result != null) && Trace.pathResolver)
		{
			Trace.trace("LocalFile.resolve: resolved " + relativeStr + " to " + result.getName());
		}
        (*/
    
		return result;
	}

	/**
	 * Signal the hosting environment that this instance is no longer used.
	 */
	public void close()
	{
	}

	public boolean equals(Object obj)
	{
		boolean result = false;

		if (obj instanceof LocalFile)
		{
			result = (this == obj) || getName().equals(((LocalFile) obj).getName());
		}

		return result;
	}

	public int hashCode()
	{
		return getName().hashCode();
	}

	public boolean isTextBased()
	{
		return false;
	}

	public String toString()
	{
		return getName();
	}
}


