blob: b1d749a45119ad9de0ab9f35f1fbb28c3aca7c7d [file] [log] [blame]
/*
* 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 org.apache.commons.vfs.provider.ram;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.commons.vfs.FileName;
import org.apache.commons.vfs.FileObject;
import org.apache.commons.vfs.FileSystemException;
import org.apache.commons.vfs.FileType;
import org.apache.commons.vfs.RandomAccessContent;
import org.apache.commons.vfs.provider.AbstractFileObject;
import org.apache.commons.vfs.util.RandomAccessMode;
/**
* A RAM File contains a single RAM FileData instance, it provides methods to
* access the data by implementing FileObject interface.
* @author <a href="http://commons.apache.org/vfs/team-list.html">Commons VFS team</a>
*/
public class RamFileObject extends AbstractFileObject implements FileObject
{
/**
* File System.
*/
private final RamFileSystem fs;
/**
* RAM File Object Data.
*/
private RamFileData data;
/**
* @param name The name of the file.
* @param fs The FileSystem.
*/
protected RamFileObject(FileName name, RamFileSystem fs)
{
super(name, fs);
this.fs = fs;
this.fs.attach(this);
}
private void save() throws FileSystemException
{
this.fs.save(this);
}
/*
* (non-Javadoc)
*
* @see org.apache.commons.vfs.provider.AbstractFileObject#doGetType()
*/
protected FileType doGetType() throws Exception
{
return data.getType();
}
/*
* (non-Javadoc)
*
* @see org.apache.commons.vfs.provider.AbstractFileObject#doListChildren()
*/
protected String[] doListChildren() throws Exception
{
return this.fs.listChildren(this.getName());
}
/*
* (non-Javadoc)
*
* @see org.apache.commons.vfs.provider.AbstractFileObject#doGetContentSize()
*/
protected long doGetContentSize() throws Exception
{
return this.data.getBuffer().length;
}
/*
* (non-Javadoc)
*
* @see org.apache.commons.vfs.provider.AbstractFileObject#doGetInputStream()
*/
protected InputStream doGetInputStream() throws Exception
{
// VFS-210: ram allows to gather an input stream even from a directory. So we need to check the type anyway.
if (!getType().hasContent())
{
throw new FileSystemException("vfs.provider/read-not-file.error", getName());
}
return new ByteArrayInputStream(this.data.getBuffer());
}
/*
* (non-Javadoc)
*
* @see org.apache.commons.vfs.provider.AbstractFileObject#doGetOutputStream(boolean)
*/
protected OutputStream doGetOutputStream(boolean bAppend) throws Exception
{
if (!bAppend)
{
this.data.setBuffer(new byte[0]);
}
return new RamFileOutputStream(this);
}
/*
* (non-Javadoc)
*
* @see org.apache.commons.vfs.provider.AbstractFileObject#doDelete()
*/
protected void doDelete() throws Exception
{
fs.delete(this);
}
/*
* (non-Javadoc)
*
* @see org.apache.commons.vfs.provider.AbstractFileObject#doGetLastModifiedTime()
*/
protected long doGetLastModifiedTime() throws Exception
{
return data.getLastModified();
}
/*
* (non-Javadoc)
*
* @see org.apache.commons.vfs.provider.AbstractFileObject#doSetLastModifiedTime(long)
*/
protected boolean doSetLastModTime(long modtime) throws Exception
{
data.setLastModified(modtime);
return true;
}
/*
* (non-Javadoc)
*
* @see org.apache.commons.vfs.provider.AbstractFileObject#doCreateFolder()
*/
protected void doCreateFolder() throws Exception
{
this.injectType(FileType.FOLDER);
this.save();
}
/*
* (non-Javadoc)
*
* @see org.apache.commons.vfs.provider.AbstractFileObject#doRename(org.apache.commons.vfs.FileObject)
*/
protected void doRename(FileObject newfile) throws Exception
{
fs.rename(this, (RamFileObject) newfile);
}
/*
* (non-Javadoc)
*
* @see org.apache.commons.vfs.provider.AbstractFileObject#doGetRandomAccessContent(
* org.apache.commons.vfs.util.RandomAccessMode)
*/
protected RandomAccessContent doGetRandomAccessContent(RandomAccessMode mode)
throws Exception
{
return new RamFileRandomAccessContent(this, mode);
}
/*
* (non-Javadoc)
*
* @see org.apache.commons.vfs.provider.AbstractFileObject#doAttach()
*/
protected void doAttach() throws Exception
{
this.fs.attach(this);
}
/**
* @return Returns the data.
*/
RamFileData getData()
{
return data;
}
/**
* @param data
* The data to set.
*/
void setData(RamFileData data)
{
this.data = data;
}
/*
* (non-Javadoc)
*
* @see org.apache.commons.vfs.provider.AbstractFileObject#injectType(org.apache.commons.vfs.FileType)
*/
protected void injectType(FileType fileType)
{
this.data.setType(fileType);
super.injectType(fileType);
}
/*
* (non-Javadoc)
*
* @see org.apache.commons.vfs.provider.AbstractFileObject#endOutput()
*/
protected void endOutput() throws Exception
{
super.endOutput();
this.save();
}
/**
* @return Returns the size of the RAMFileData
*/
int size()
{
if (data == null)
{
return 0;
}
return data.size();
}
/**
* @param newSize
* @throws IOException
* if the new size exceeds the limit
*/
synchronized void resize(int newSize) throws IOException
{
if (fs.getFileSystemOptions() != null)
{
int maxSize = RamFileSystemConfigBuilder.getInstance().getMaxSize(
fs.getFileSystemOptions());
if (fs.size() + newSize - this.size() > maxSize)
{
throw new IOException("FileSystem capacity (" + maxSize
+ ") exceeded.");
}
}
this.data.resize(newSize);
}
}