package org.dcache.services.httpd.handlers; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.handler.AbstractHandler; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Date; import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; import dmg.cells.nucleus.DomainContextAware; import dmg.util.HttpRequest; import org.dcache.services.httpd.exceptions.OnErrorException; import org.dcache.services.httpd.util.StandardHttpRequest; /** * Provides lookup in the context map of preconfigured HTML pages. * * @author arossi */ public class ContextHandler extends AbstractHandler implements DomainContextAware { private final String specificName; private Map<String, Object> context; public ContextHandler(String specificName) { this.specificName = specificName; } @Override public void setDomainContext(Map<String, Object> context) { this.context = context; } @Override public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { try { final HttpRequest proxy = new StandardHttpRequest(request, response); Object value; if (specificName.equals("*")) { final String[] tokens = proxy.getRequestTokens(); if (tokens.length < 2 || tokens[1].equals("index.html")) { value = createContextDirectory(); } else { value = context.get(tokens[1]); } } else { value = context.get(specificName); } if (value == null) { throw new OnErrorException(); } String html = String.valueOf(value); proxy.getPrintWriter().println(html); proxy.getPrintWriter().flush(); baseRequest.setHandled(true); } catch (final Exception t) { throw new ServletException("ContextHandler", t); } } private String createContextDirectory() { final StringBuilder sb = new StringBuilder(); sb.append("<html><title>Context directory</title>\n"); sb.append("<body bgcolor=\"#0088dd\">\n"); sb.append("<h1>Context Directory</h1>\n"); sb.append("<blockquote>\n"); sb.append("<center>\n"); sb.append("<table border=1 cellspacing=0 cellpadding=4 width=\"%90\">\n"); sb.append("<tr><th>Context Name</th><th>Class</th><th>Content</th></tr>\n"); final SortedMap<String, Object> map = new TreeMap<>(); map.putAll(context); for (final Map.Entry<String, Object> e : map.entrySet()) { final String key = e.getKey(); final Object o = e.getValue(); String str = o.toString(); str = str.substring(0, Math.min(str.length(), 60)).trim(); str = toHtmlEscapedString(str); sb.append("<tr><td>") .append(key) .append("</td><td>") .append(o.getClass().getName()) .append("</td><td>") .append(str.isEmpty() ? " " : str) .append("</td></tr>\n"); } sb.append("</table></center>\n"); sb.append("</blockquote>\n"); sb.append("<hr>"); sb.append("<address>Created : ") .append(new Date()) .append("</address>\n"); sb.append("</body></html>"); return sb.toString(); } private String toHtmlEscapedString(String str) { final StringBuilder sb = new StringBuilder(); for (int i = 0, n = str.length(); i < n; i++) { final char c = str.charAt(i); switch (c) { case '<': sb.append("<"); break; case '>': sb.append(">"); break; case '\n': sb.append("\\n"); break; default: sb.append(c); } } return sb.toString(); } }