package com.jspxcms.core.support; import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.LinkedList; import java.util.List; import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import com.jspxcms.common.image.Images; /** * WebFile * * @author liufang * */ public class WebFile { public static final FileFilter HIDDEN_FILTER = new HiddenFilter(); private File file; private String root; private String contextPath; private FileFilter filter = HIDDEN_FILTER; private boolean isParent = false; private boolean isCurrent = false; public WebFile(File file) { this(file, ""); } public WebFile(File file, String root) { this(file, root, ""); } public WebFile(File file, String root, String contextPath) { this.file = file; this.root = root; this.contextPath = contextPath; } public WebFile getParentFile() { return new WebFile(file.getParentFile(), root, contextPath); } public String[] list() { return file.list(); } public List<WebFile> listFiles() { return listFiles(filter); } public List<WebFile> listFiles(String search) { return listFiles(new HiddenFilter(search)); } public List<WebFile> listFiles(FileFilter filter) { File[] files = file.listFiles(filter); List<WebFile> list = new LinkedList<WebFile>(); if (ArrayUtils.isEmpty(files)) { return list; } WebFile wf; for (int i = 0, len = files.length; i < len; i++) { wf = new WebFile(files[i], root, contextPath); wf.setFileFilter(filter); list.add(wf); } return list; } public String getId() { String absPath = file.getAbsolutePath(); String path = absPath.substring(root.length()); path = StringUtils.replace(path, File.separator, "/"); if (StringUtils.isBlank(path)) { path = "/"; } return path; } public String getName() { if (isParent) { return ".."; } else if (isCurrent) { return "."; } else { return file.getName(); } } public String getShortName() { String name = file.getName(); int index = name.lastIndexOf("."); if (index != -1) { return name.substring(0, index); } else { return name; } } public String getExtension() { return FilenameUtils.getExtension(file.getName()); } public boolean isHasChildDir() { String[] names = file.list(); if (names == null || names.length == 0) { return false; } for (int i = 0; i < names.length; i++) { File f = new File(file, names[i]); if (f.isDirectory()) { return true; } } return false; } public boolean isFile() { return file.isFile(); } public boolean isDirectory() { return file.isDirectory(); } public boolean isHidden() { return file.isHidden(); } public long length() { return file.length(); } public long getLength() { return file.length(); } public long getLengthKB() { long length = file.length(); long lengthKB = length / 1024; if (length % 1024 > 0) { lengthKB++; } return lengthKB; } public long lastModified() { return file.lastModified(); } public Date getLastModified() { return new Date(file.lastModified()); } public FileType getType() { if (file.isDirectory()) { return FileType.directory; } String extension = getExtension(); if (Images.isImageExtension(extension)) { return FileType.image; } else if ("html".equalsIgnoreCase(extension) || "htm".equalsIgnoreCase(extension) || "js".equalsIgnoreCase(extension) || "css".equalsIgnoreCase(extension) || "txt".equalsIgnoreCase(extension) || "xml".equalsIgnoreCase(extension) || "ftl".equalsIgnoreCase(extension) || "vm".equalsIgnoreCase(extension) || "jsp".equalsIgnoreCase(extension) || "jspx".equalsIgnoreCase(extension) || "asp".equalsIgnoreCase(extension) || "aspx".equalsIgnoreCase(extension) || "php".equalsIgnoreCase(extension) || "sql".equalsIgnoreCase(extension) || "tag".equalsIgnoreCase(extension) || "tld".equalsIgnoreCase(extension) || "properties".equalsIgnoreCase(extension)) { return FileType.text; } else if ("zip".equalsIgnoreCase(extension)) { return FileType.zip; } else { return FileType.file; } } public String getText() throws IOException { if (getType() == FileType.text) { return FileUtils.readFileToString(file, "UTF-8"); } else { return null; } } public String getUrl() { StringBuilder sb = new StringBuilder(); if (StringUtils.isNotBlank(contextPath)) { sb.append(contextPath); } sb.append(getId()); return sb.toString(); } public boolean isEditable() { return getType() == FileType.text; } public boolean isImage() { return getType() == FileType.image; } public boolean isZip() { return getType() == FileType.zip; } public boolean isParent() { return isParent; } public void setFileFilter(FileFilter filter) { this.filter = filter; } public void setParent(boolean isParent) { this.isParent = isParent; } public void setCurrent(boolean isCurrent) { this.isCurrent = isCurrent; } public static enum FileType { directory, zip, text, image, file } public static class HiddenFilter implements FileFilter { private String search; public HiddenFilter() { } public HiddenFilter(String search) { this.search = search; } public boolean accept(File pathname) { if (StringUtils.isNotBlank(search)) { String name = pathname.getName(); return !pathname.isHidden() && StringUtils.containsIgnoreCase(name, search); } else { return !pathname.isHidden(); } } }; public static Comparator<WebFile> NAME_ASC = new Comparator<WebFile>() { public int compare(WebFile file1, WebFile file2) { if (file1.isDirectory() && !file2.isDirectory()) { return -1; } else if (!file1.isDirectory() && file2.isDirectory()) { return 1; } String name1 = file1.getName().toLowerCase(); String name2 = file2.getName().toLowerCase(); return name1.compareTo(name2); } }; public static Comparator<WebFile> NAME_DESC = new Comparator<WebFile>() { public int compare(WebFile file1, WebFile file2) { if (file1.isDirectory() && !file2.isDirectory()) { return 1; } else if (!file1.isDirectory() && file2.isDirectory()) { return -1; } String name1 = file1.getName().toLowerCase(); String name2 = file2.getName().toLowerCase(); return -name1.compareTo(name2); } }; public static Comparator<WebFile> LASTMODIFIED_ASC = new Comparator<WebFile>() { public int compare(WebFile file1, WebFile file2) { if (file1.isDirectory() && !file2.isDirectory()) { return -1; } else if (!file1.isDirectory() && file2.isDirectory()) { return 1; } long lastModified1 = file1.lastModified(); long lastModified2 = file2.lastModified(); return (int) (lastModified1 - lastModified2); } }; public static Comparator<WebFile> LASTMODIFIED_DESC = new Comparator<WebFile>() { public int compare(WebFile file1, WebFile file2) { if (file1.isDirectory() && !file2.isDirectory()) { return -1; } else if (!file1.isDirectory() && file2.isDirectory()) { return 1; } long lastModified1 = file1.lastModified(); long lastModified2 = file2.lastModified(); return -(int) (lastModified1 - lastModified2); } }; public static Comparator<WebFile> TYPE_ASC = new Comparator<WebFile>() { public int compare(WebFile file1, WebFile file2) { if (file1.isDirectory() && !file2.isDirectory()) { return -1; } else if (!file1.isDirectory() && file2.isDirectory()) { return 1; } else if (file1.isDirectory() && file2.isDirectory()) { String name1 = file1.getName().toLowerCase(); String name2 = file2.getName().toLowerCase(); return name1.compareTo(name2); } FileType type1 = file1.getType(); FileType type2 = file2.getType(); int num = type1.compareTo(type2); if (num == 0) { String ext1 = file1.getExtension(); String ext2 = file2.getExtension(); num = ext1.compareTo(ext2); } return num; } }; public static Comparator<WebFile> TYPE_DESC = new Comparator<WebFile>() { public int compare(WebFile file1, WebFile file2) { if (file1.isDirectory() && !file2.isDirectory()) { return -1; } else if (!file1.isDirectory() && file2.isDirectory()) { return 1; } else if (file1.isDirectory() && file2.isDirectory()) { String name1 = file1.getName().toLowerCase(); String name2 = file2.getName().toLowerCase(); return -name1.compareTo(name2); } FileType type1 = file1.getType(); FileType type2 = file2.getType(); int num = type1.compareTo(type2); if (num == 0) { String ext1 = file1.getExtension(); String ext2 = file2.getExtension(); num = ext1.compareTo(ext2); } return -num; } }; public static Comparator<WebFile> LENGTH_ASC = new Comparator<WebFile>() { public int compare(WebFile file1, WebFile file2) { if (file1.isDirectory() && !file2.isDirectory()) { return -1; } else if (!file1.isDirectory() && file2.isDirectory()) { return 1; } else if (file1.isDirectory() && file2.isDirectory()) { return file1.getName().compareTo(file2.getName()); } long length1 = file1.length(); long length2 = file2.length(); return (int) (length1 - length2); } }; public static Comparator<WebFile> LENGTH_DESC = new Comparator<WebFile>() { public int compare(WebFile file1, WebFile file2) { if (file1.isDirectory() && !file2.isDirectory()) { return 1; } else if (!file1.isDirectory() && file2.isDirectory()) { return -1; } else if (file1.isDirectory() && file2.isDirectory()) { return file1.getName().compareTo(file2.getName()); } long length1 = file1.length(); long length2 = file2.length(); return -(int) (length1 - length2); } }; public static void sort(List<WebFile> list, String sort, String sortDir) { Comparator<WebFile> comp; if ("name".equals(sort)) { comp = "desc".equals(sortDir) ? NAME_DESC : NAME_ASC; } else if ("lastModified".equals(sort)) { comp = "desc".equals(sortDir) ? LASTMODIFIED_DESC : LASTMODIFIED_ASC; } else if ("type".equals(sort)) { comp = "desc".equals(sortDir) ? TYPE_DESC : TYPE_ASC; } else if ("length".equals(sort)) { comp = "desc".equals(sortDir) ? LENGTH_DESC : LENGTH_ASC; } else { comp = NAME_ASC; } Collections.sort(list, comp); } }