/*
* JavaXYQ Engine
*
* javaxyq@2008 all rights.
* http://www.javaxyq.com
*/
package com.javaxyq.tools;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import com.javaxyq.util.Wildcard;
/**
* @author ����ΰ
* @history 2008-7-6 ����ΰ �½�
*/
public class DefaultFileObject implements FileObject {
private File file;
private DefaultFileSystem fileSystem;
private Comparator<File> fileComparator = new Comparator<File>() {
@Override
public int compare(File o1, File o2) {
int result = (o1.isDirectory()?0:1) - (o2.isDirectory()?0:1);
if(result==0) {
return o1.getName().compareToIgnoreCase(o2.getName());
}
return result;
}
};
public DefaultFileObject(DefaultFileSystem filesystem, String pathname) {
this.fileSystem = filesystem;
this.file = new File(pathname);
}
public DefaultFileObject(DefaultFileSystem filesystem, URI uri) {
this.fileSystem = filesystem;
this.file = new File(uri);
}
public DefaultFileObject(DefaultFileSystem filesystem, File file) {
this.fileSystem = filesystem;
this.file = file;
}
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public byte[] getData() throws IOException {
DataInputStream is = getDataStream();
byte[] data = new byte[(int) file.length()];
is.readFully(data);
return data;
}
public DataInputStream getDataStream() throws FileNotFoundException {
return new DataInputStream(new FileInputStream(file));
}
public String getName() {
return file.getName();
}
public String getPath() {
return file.getPath();
}
public String getContentType() {
return FileUtil.getContentType(this);
}
public boolean isDirectory() {
return file.isDirectory();
}
public boolean isFile() {
return file.isFile();
}
@Override
public FileObject[] listFiles(String filter) {
File[] allfiles = null;
if(filter!=null && filter.trim().length()!=0 && !filter.trim().equals("*")) {
if(filter.indexOf('*')==-1) {
filter = "*"+filter+"*";
}
final String pattern = filter.toLowerCase();
FilenameFilter namefilter = new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return Wildcard.matches(pattern, name.toLowerCase());
}
};
allfiles = file.listFiles(namefilter);
}else {
allfiles = file.listFiles();
}
Arrays.sort(allfiles, fileComparator );
FileObject[] fileObjects = new FileObject[allfiles.length];
for (int i = 0; i < allfiles.length; i++) {
DefaultFileObject fileObj = new DefaultFileObject(fileSystem, allfiles[i]);
fileObjects[i] = fileObj;
}
return fileObjects;
}
public FileObject[] listFiles() {
return listFiles(null);
}
public int compareTo(FileObject o) {
if(this.isDirectory() && !o.isDirectory()) {
return 1;
}else if(!this.isDirectory()&& o.isDirectory()) {
return -1;
}
return this.getPath().compareTo(o.getPath());
}
public FileSystem getFileSystem() {
return this.fileSystem;
}
public FileObject getParent() {
return new DefaultFileObject(this.fileSystem, this.file.getParent());
}
@Override
public String toString() {
return this.getName();
}
@Override
public long getSize() {
return this.file.length();
}
}