package cn.aprilsoft.TinyAppServer.processor.impl;
import java.io.File;
import java.io.IOException;
import java.io.Writer;
import java.util.Arrays;
import java.util.Comparator;
import cn.aprilsoft.TinyAppServer.configuare.Configuare;
import cn.aprilsoft.TinyAppServer.error.HttpErrorMessage;
import cn.aprilsoft.TinyAppServer.exception.ServerException;
import cn.aprilsoft.TinyAppServer.processor.Processor;
import cn.aprilsoft.TinyAppServer.reqNrep.Request;
import cn.aprilsoft.TinyAppServer.reqNrep.Response;
import cn.aprilsoft.http.URIUtil;
import cn.aprilsoft.io.FileUtil;
public class DirectoryListingProcessor extends Processor {
@Override
protected void doGet(Request request, Response response) {
String url = request.getUrl();
String path = FileUtil.combilePath(Configuare.BASE_PATH, url);
File file = new File(path);
StringBuilder buffer = new StringBuilder();
if (file.isDirectory()) {
outputList(response, buffer, file, "/".equals(url));
}
Writer writer = response.getWriter();
try {
writer.write(buffer.toString());
writer.flush();
} catch (IOException e) {
throw new ServerException(e);
}
}
@Override
protected void doPost(Request request, Response response) {
HttpErrorMessage.error403(response);
}
protected void outputList(Response response, StringBuilder buffer, File directory, boolean isRoot) {
if (directory.isDirectory()) {
buffer.append("<html>");
buffer.append("<head>");
buffer.append("<title>Listing folder ...</title>");
buffer.append("</head>");
buffer.append("<body>");
buffer.append("<table>");
buffer.append("<tr>");
buffer.append("<td>Listing folder ...</td>");
buffer.append("<td> </td>");
buffer.append("</tr>");
if (!isRoot) {
buffer.append("<tr>");
buffer.append("<td><a href=\"../\">[..]</a></td>");
buffer.append("<td> </td>");
buffer.append("</tr>");
}
File[] files = directory.listFiles();
if (files != null) {
Arrays.sort(files, new Comparator<File>() {
@Override
public int compare(File file0, File file1) {
if (file0.isDirectory()) {
return (file1.isDirectory()) ? file0.getName().compareTo(file1.getName()) : -1;
} else {
return file1.isDirectory() ? 1 : file0.getName().compareTo(file1.getName());
}
}
});
for (File file : files) {
outputItem(response, buffer, file);
}
}
buffer.append("</table>");
buffer.append("<br/><br/>");
buffer.append("Powered by " + "<a " + "href=\"http://code.google.com/p/tinyappserver/\" "
+ "target=\"_blank\">" + "TinyAppServer" + "</a>.");
buffer.append("</body>");
buffer.append("</html>");
}
}
protected void outputItem(Response response, StringBuilder buffer, File item) {
buffer.append("<tr>");
if (item.isDirectory()) {
outputDirectory(response, buffer, item);
} else {
outputFile(response, buffer, item);
}
buffer.append("</tr>");
}
protected void outputDirectory(Response response, StringBuilder buffer, File directory) {
buffer.append("<td>");
buffer.append("<a href=\"" + URIUtil.encodeURI(response.getCharset(), directory.getName()) + "/" + "\">");
buffer.append("[").append(directory.getName()).append("/]");
buffer.append("</a>");
buffer.append("</td>");
buffer.append("<td> </td>");
}
protected void outputFile(Response response, StringBuilder buffer, File file) {
buffer.append("<td>");
buffer.append("<a href=\"" + URIUtil.encodeURI(response.getCharset(), file.getName()) + "\">");
buffer.append(file.getName());
buffer.append("</a>");
buffer.append("</td>");
buffer.append("<td align=\"right\">").append(formatNumber(file.length())).append(" byte(s)").append("</td>");
}
protected String formatNumber(long number) {
StringBuilder sb = new StringBuilder();
StringBuilder n = new StringBuilder(String.valueOf(number));
n.reverse();
for (int i = 0; i < n.length(); i++) {
sb.append(n.charAt(i));
if (((i + 1) % 3 == 0) && (i != (n.length() - 1))) {
sb.append(',');
}
}
return sb.reverse().toString();
}
}