Package cn.aprilsoft.TinyAppServer.processor.impl

Source Code of cn.aprilsoft.TinyAppServer.processor.impl.DirectoryListingProcessor

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>&nbsp;</td>");
            buffer.append("</tr>");

            if (!isRoot) {
                buffer.append("<tr>");
                buffer.append("<td><a href=\"../\">[..]</a></td>");
                buffer.append("<td>&nbsp;</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>&nbsp;</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("&nbsp;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();
    }
}
TOP

Related Classes of cn.aprilsoft.TinyAppServer.processor.impl.DirectoryListingProcessor

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.