protected List<DirEntry> getDirEntries(RouteContext routeContext, File dir, String absoluteDirUri) { List<DirEntry> list = new ArrayList<>(); for (File file : getFiles(dir)) { String fileUrl = routeContext.getRequest().getApplicationPath() + StringUtils.removeEnd(StringUtils.addStart(absoluteDirUri, "/"), "/") + StringUtils.addStart(file.getName(), "/"); list.add(new DirEntry(fileUrl, file)); } if (comparator != null) { list.sort(comparator); } if (!directory.equals(dir)) { File upDir = new File(dir, "../"); list.add(0, new DirEntry(routeContext.getRequest().getApplicationPath() + StringUtils.removeEnd(StringUtils.addStart(absoluteDirUri, "/"), "/") + StringUtils.addStart(upDir.getName(), "/"), upDir)); } return list; }
protected String generateDefaultDirectoryListing(RouteContext routeContext, File dir, String absoluteDirUri) { StringBuilder sb = new StringBuilder(); sb.append("<html><body><table>"); SimpleDateFormat df = new SimpleDateFormat(timestampPattern); NumberFormat nf = new DecimalFormat(fileSizePattern); for (DirEntry dirEntry : getDirEntries(routeContext, dir, absoluteDirUri)) { sb.append(StringUtils.format("<tr><td><a href=\"{}\">{}</a></td><td>{}</td><td>{}</td></tr>\n", dirEntry.getUrl(), dirEntry.getName(), dirEntry.isFile() ? nf.format(dirEntry.getSize()) : "", df.format(dirEntry.getLastModified()))); } sb.append("</table></body></html>"); return sb.toString(); }
private void sendDirectoryListing(RouteContext routeContext, File dir) { String absoluteDirUri = getUrlPath() + StringUtils.addStart(directory.toPath().relativize(dir.toPath()).toString(), "/"); if (StringUtils.isNullOrEmpty(directoryTemplate)) { // Generate primitive, default directory listing String page = generateDefaultDirectoryListing(routeContext, dir, absoluteDirUri); routeContext.html().send(page); } else { // Render directory listing template int numFiles = 0; int numDirs = 0; long diskUsage = 0; List<DirEntry> dirEntries = getDirEntries(routeContext, dir, absoluteDirUri); for (DirEntry dirEntry : dirEntries) { if (dirEntry.isFile()) { numFiles++; diskUsage += dirEntry.getSize(); } else if (dirEntry.isDirectory() && !dirEntry.getName().contains("..")) { numDirs++; } } routeContext.setLocal("dirUrl", absoluteDirUri); routeContext.setLocal("dirPath", absoluteDirUri.substring(getUrlPath().length())); routeContext.setLocal("dirEntries", dirEntries); routeContext.setLocal("numDirs", numDirs); routeContext.setLocal("numFiles", numFiles); routeContext.setLocal("diskUsage", diskUsage); routeContext.render(directoryTemplate); } }
@Override public int compare(DirEntry o1, DirEntry o2) { if (o1.isDirectory() && !o2.isDirectory()) { return -1; } if (!o1.isDirectory() && o2.isDirectory()) { return 1; } return o1.file.compareTo(o2.file); }