/*******************************************************************************
 * Copyright (c) 2018 Actuate Corporation.
 * 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:
 *  Actuate Corporation  - initial API and implementation
 *******************************************************************************/

package org.eclipse.birt.core.fs;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import java.net.URL;

/**
 * Provides local file system support.
 */

public class LocalFile implements IFile
{

	private final File file;

	public LocalFile( File localFile )
	{
		this.file = localFile;
	}
	
	public LocalFile( URI uri )
	{
		this.file = uri.isAbsolute( ) ? new File( uri )
				: new File( uri.toString( ) );
	}

	@Override
	public String getName( )
	{
		return file.getName( );
	}

	@Override
	public String getPath( )
	{
		return file.getPath( );
	}

	@Override
	public boolean exists( )
	{
		return file.exists( );
	}

	@Override
	public boolean delete( )
	{
		return deleteFile( file );
	}

	private boolean deleteFile( File f )
	{
		if ( f.isDirectory( ) )
		{
			// Must delete children files before deleting folder
			for ( File child : f.listFiles( ) )
			{
				deleteFile( child );
			}
		}
		return f.delete( );
	}

	@Override
	public boolean mkdirs( )
	{
		return file.mkdirs( );
	}

	@Override
	public boolean isDirectory( )
	{
		return file.isDirectory( );
	}

	@Override
	public IFile[] listFiles( )
	{
		if ( !file.exists( ) || !file.isDirectory( ) )
		{
			return new IFile[0];
		}
		File[] files = file.listFiles( );
		IFile[] result = new IFile[files.length];
		for ( int i = 0; i < files.length; i++ )
		{
			result[i] = new LocalFile( files[i] );
		}
		return result;
	}

	@Override
	public OutputStream createOutputStream( ) throws IOException
	{
		return new FileOutputStream( file );
	}

	@Override
	public InputStream createInputStream( ) throws IOException
	{
		return new FileInputStream( file );
	}

	@Override
	public URL toURL( ) throws IOException
	{
		return file.toURI( ).toURL( );
	}

	@Override
	public boolean isAbsolute( )
	{
		return file.isAbsolute( );
	}

	@Override
	public IFile getParent( )
	{
		return new LocalFile( file.getParentFile( ) );
	}

}