blob: 7af29a9cebc1e06330ac539a2897d3c5fc23a8cb [file] [log] [blame]
/*
* Copyright 2002-2005 The Apache Software Foundation.
*
* Licensed 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.smb;
import jcifs.smb.SmbException;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileInputStream;
import jcifs.smb.SmbFileOutputStream;
import jcifs.smb.NtlmPasswordAuthentication;
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.provider.UriParser;
import org.apache.commons.vfs.util.RandomAccessMode;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
/**
* A file in an SMB file system.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
* @version $Revision$ $Date$
*/
public class SmbFileObject
extends AbstractFileObject
implements FileObject
{
// private final String fileName;
private SmbFile file;
protected SmbFileObject(final FileName name,
final SmbFileSystem fileSystem) throws FileSystemException
{
super(name, fileSystem);
// this.fileName = UriParser.decode(name.getURI());
}
/**
* Attaches this file object to its file resource.
*/
protected void doAttach() throws Exception
{
// Defer creation of the SmbFile to here
if (file == null)
{
file = createSmbFile(getName());
}
}
protected void doDetach() throws Exception
{
// file closed through content-streams
file = null;
}
private SmbFile createSmbFile(FileName fileName) throws MalformedURLException, SmbException, FileSystemException
{
SmbFileName smbFileName = (SmbFileName) fileName;
String path = smbFileName.getUriWithoutAuth();
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(
smbFileName.getDomain(), smbFileName.getUserName(), smbFileName.getPassword());
SmbFile file = new SmbFile(path, auth);
if (file.isDirectory() && !file.toString().endsWith("/"))
{
file = new SmbFile(path + "/", auth);
}
return file;
}
/**
* Determines the type of the file, returns null if the file does not
* exist.
*/
protected FileType doGetType() throws Exception
{
if (!file.exists())
{
return FileType.IMAGINARY;
}
else if (file.isDirectory())
{
return FileType.FOLDER;
}
else if (file.isFile())
{
return FileType.FILE;
}
throw new FileSystemException("vfs.provider.smb/get-type.error", getName());
}
/**
* Lists the children of the file. Is only called if {@link #doGetType}
* returns {@link FileType#FOLDER}.
*/
protected String[] doListChildren() throws Exception
{
return UriParser.encode(file.list());
}
/**
* Determines if this file is hidden.
*/
protected boolean doIsHidden() throws Exception
{
return file.isHidden();
}
/**
* Deletes the file.
*/
protected void doDelete() throws Exception
{
file.delete();
}
protected void doRename(FileObject newfile) throws Exception
{
file.renameTo(createSmbFile(newfile.getName()));
}
/**
* Creates this file as a folder.
*/
protected void doCreateFolder() throws Exception
{
file.mkdir();
file = createSmbFile(getName());
}
/**
* Returns the size of the file content (in bytes).
*/
protected long doGetContentSize() throws Exception
{
return file.length();
}
/**
* Returns the last modified time of this file.
*/
protected long doGetLastModifiedTime()
throws Exception
{
return file.getLastModified();
}
/**
* Creates an input stream to read the file content from.
*/
protected InputStream doGetInputStream() throws Exception
{
return new SmbFileInputStream(file);
}
/**
* Creates an output stream to write the file content to.
*/
protected OutputStream doGetOutputStream(boolean bAppend) throws Exception
{
return new SmbFileOutputStream(file, bAppend);
}
/**
* random access
*/
protected RandomAccessContent doGetRandomAccessContent(final RandomAccessMode mode) throws Exception
{
return new SmbFileRandomAccessContent(file, mode);
}
}