ClassLoaderFile.java

package eu.javaexperience.file.fs.classloader;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;

import eu.javaexperience.file.AbstractFile;
import eu.javaexperience.file.AbstractFileSystem;
import eu.javaexperience.file.FileSystemTools;
import eu.javaexperience.file.fs.os.OsFile;
import eu.javaexperience.io.IOTools;

public class ClassLoaderFile implements AbstractFile
{
	protected ClassLoaderFileSystem clfs;
	protected String file;
	
	
	public ClassLoaderFile(ClassLoaderFileSystem clfs, String file)
	{
		this.clfs = clfs;
		this.file = file;
	}
	
	@Override
	public String getUrl()
	{
		return file;
	}

	@Override
	public String getFileName()
	{
		return null;
	}

	@Override
	public AbstractFileSystem getFileSystem()
	{
		return clfs;
	}

	@Override
	public AbstractFile getCanonicalFile() throws IOException
	{
		return this;
	}

	@Override
	public boolean delete() throws IOException
	{
		return false;
	}

	@Override
	public long lastModified()
	{
		return 0;
	}

	@Override
	public boolean setLastModified(long time) throws IOException
	{
		return false;
	}

	@Override
	public boolean exists()
	{
		return null != clfs.cl.getResource(file);
	}

	@Override
	public boolean createNewRegularFile() throws IOException
	{
		return false;
	}

	@Override
	public boolean isRegularFile()
	{
		return exists();
	}

	@Override
	public long getSize()
	{
		try(InputStream r = openRead())
		{
			return IOTools.copyStream(r, IOTools.nullOutputStream);
		}
		catch (IOException e)
		{
			return -1;
		}
	}

	public File tryGetFile()
	{
		URL u = clfs.cl.getResource(file);
		if(null != u)
		{
			return new File(u.getFile());
		}
		return null;
	}
	
	@Override
	public boolean isDirectory()
	{
		File f = tryGetFile();
		if(null == f)
		{
			return false;
		}
		
		return f.isDirectory();
	}

	@Override
	public AbstractFile[] listFiles()
	{
		File f = tryGetFile();
		if(null == f)
		{
			return null;
		}
		
		return FileSystemTools.warpFiles(f.listFiles());
	}

	@Override
	public boolean mkdir() throws IOException
	{
		return false;
	}

	@Override
	public boolean mkdirs() throws IOException
	{
		return false;
	}

	@Override
	public boolean canRead()
	{
		return true;
	}

	@Override
	public boolean canWrite()
	{
		return false;
	}

	@Override
	public InputStream openRead() throws IOException
	{
		return clfs.cl.getResourceAsStream(file);
	}

	@Override
	public OutputStream openWrite(boolean append) throws IOException
	{
		throw new UnsupportedOperationException("Can't open ClassLoaderFile for write: "+file);
	}
	
	@Override
	public String toString()
	{
		return "ClassLoaderFile: "+file;
	}
	
	@Override
	public int hashCode()
	{
		return clfs.hashCode() ^ file.toString().hashCode();
	}
	
	@Override
	public boolean equals(Object obj)
	{
		if(!(obj instanceof ClassLoaderFile))
		{
			return false;
		}
		
		ClassLoaderFile other = (ClassLoaderFile) obj;
		
		return other.clfs.equals(clfs) && other.file.equals(file);
	}
	
	@Override
	public AbstractFile getParentFile()
	{
		File f = tryGetFile();
		if(null == f)
		{
			return null;
		}
		return new OsFile(f.getParentFile());
	}

	@Override
	public long createTime()
	{
		return 0;
	}
}