001 package org.shiftone.jrat.http;
002
003 import org.shiftone.jrat.util.log.Logger;
004
005 import java.io.Writer;
006 import java.util.Iterator;
007 import java.util.SortedMap;
008 import java.util.TreeMap;
009
010 /**
011 * @author jeff@shiftone.org (Jeff Drost)
012 */
013 public class Dispatcher implements Handler {
014
015 private static final Logger LOG = Logger.getLogger(Dispatcher.class);
016 private String title;
017 private SortedMap contexts = new TreeMap(); /* <String, Handler> */
018
019 public Dispatcher(String title) {
020 this.title = title;
021 }
022
023 public void addRoute(String path, Handler handler) {
024 contexts.put(path, handler);
025 }
026
027 public void handle(Request request, Response response) throws Exception {
028
029 //LOG.info("handle");
030
031 String path = request.getRequestUri();
032 if (path.length() > 0 && path.charAt(0) == '/') {
033 path = path.substring(1);
034 }
035
036 int firstSlash = path.indexOf("/");
037 String firstPart = (firstSlash == -1)
038 ? path
039 : path.substring(0, firstSlash);
040
041 //LOG.info("firstPart = " + firstPart);
042 Handler handler = (Handler) contexts.get(firstPart);
043
044 if (handler != null) {
045
046 // trim the firstPart off the URI
047 request.setRequestUri(path.substring(firstPart.length()));
048 handler.handle(request, response);
049 //return;
050
051 } else if (firstPart.length() == 0) {
052
053 listHandlers(request, response);
054
055 } else {
056
057 throw new HttpException(Status.STATUS_404);
058
059 }
060
061 }
062
063 private void listHandlers(Request request, Response response) throws Exception {
064
065 LOG.info("listHandlers");
066
067 response.setContentType(ContentType.TEXT_HTML);
068
069 Writer out = response.getWriter();
070 Iterator iterator = contexts.keySet().iterator();
071
072 out.write("<h2>" + title + "</h2>");
073
074 out.write("<ul>");
075 while (iterator.hasNext()) {
076 String key = (String) iterator.next();
077 out.write("<li><a href='" + key + "/'>" + key + "</a></li>");
078 }
079 out.write("</ul>");
080 }
081
082 }