package ca.sqlpower.util;
import java.util.Enumeration;
import java.util.List;
import java.util.ListIterator;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
/**
* Some static methods that help with generating web applications.
*
* @author Jonathan Fuerth
* @version $Id$
*/
public class Web {
/**
* generates an html table of the attribute and paramater names and values of an
* HttpServletRequest object. This method is not expected to be
* used in production; it is simply a debugging tool.
*
* @param req the request whose fields should be tabulated
* @return an html <code>TABLE</code> element describing the request
* @see #formatSessionAsTable(HttpSession)
*/
public static String formatRequestAsTable(HttpServletRequest req) {
StringBuffer sb = new StringBuffer(200);
sb.append("<table border=\"1\">");
sb.append("<tr><th colspan=\"2\">Request Parameters</th></tr>");
for (Enumeration e = req.getParameterNames(); e.hasMoreElements();) {
String thisElement = (String) e.nextElement();
sb.append("<tr><td>").append(thisElement).append("</td><td>[");
String[] values = req.getParameterValues(thisElement);
for (int i = 0; i < values.length; i++) {
sb.append(values[i]);
if (i != values.length - 1) {
sb.append(", ");
}
}
sb.append("]</td></tr>");
}
sb.append("<tr><th colspan=\"2\">Request Attributes</th></tr>");
for (Enumeration e = req.getAttributeNames(); e.hasMoreElements();) {
String thisElement = (String) e.nextElement();
sb.append("<tr><td>").append(thisElement).append("</td><td>");
sb.append(req.getAttribute(thisElement));
sb.append("</td></tr>");
}
sb.append("</table>");
return sb.toString();
}
/**
* generates an html table of the attribute names and classes of an
* HttpSeession object. This method is not expected to be used in
* production; it is simply a debugging tool.
*
* @param s
* the session whose fields should be tabulated
* @return an html <code>TABLE</code> element describing the session
* @see #formatRequestAsTable(HttpServletRequest)
*/
public static String formatSessionAsTable(HttpSession s) {
Enumeration enm = s.getAttributeNames();
StringBuffer sb = new StringBuffer(200);
sb.append("<table border=\"1\">");
while (enm.hasMoreElements()) {
String thisElement = (String) enm.nextElement();
if (thisElement == null) {
sb.append("<tr><td>NULL ELEMENT!</td></tr>");
continue;
}
sb.append("<tr><td>").append(thisElement).append("</td><td>");
if (s.getAttribute(thisElement) == null) {
sb.append("NULL!");
} else {
sb.append(s.getAttribute(thisElement).getClass().getName());
}
sb.append("</td></tr>");
}
sb.append("</table>");
return sb.toString();
}
/**
* @deprecated use the version that splits up the argument
* hasAnyAll into hasAny and hasAll
*/
public static String makeSelectionList(String name,
List options,
String defaultSelection,
boolean hasAnyAll) {
return makeSelectionList(name, options, defaultSelection, hasAnyAll, hasAnyAll);
}
public static String makeSelectionList(String name, List options,
String defaultSelection, boolean hasAny, boolean hasAll) {
StringBuffer out = new StringBuffer();
String thisOption;
if (defaultSelection == null) {
defaultSelection = "!@#$%^&*() NO DEFAULT ()*&^%$#@!";
}
out.append("<select size=\"1\" name=\"");
out.append(name);
out.append("\">");
if (hasAny) {
appendOption(out, "---Total---", defaultSelection
.equals("---Total---"));
}
if (hasAll) {
appendOption(out, "---All---", defaultSelection.equals("---All---"));
}
ListIterator i = options.listIterator();
while (i.hasNext()) {
thisOption = (String) i.next();
appendOption(out, thisOption, thisOption.equals(defaultSelection));
}
out.append("</select>");
return out.toString();
}
private static void appendOption(StringBuffer sb, String optionName, boolean selected) {
sb.append(" <option");
if (selected) {
sb.append(" selected");
}
sb.append(">");
sb.append(optionName);
sb.append("</option>");
}
/**
* Checks if the given string contains any special characters (<, >, &)
*/
public static boolean containsHTMLMarkup(String testMe) {
for (int i=0; i<testMe.length(); i++){
if (testMe.charAt(i)=='<' ||
testMe.charAt(i)=='>' ||
testMe.charAt(i)=='&') {
return true;
}
}
return false;
}
/**
* Escapes an HTML attribute value (dobule quotes and ampersands
* are converted to their character reference equivalents).
*/
public static String escapeAttribute(String attval) {
return escapeImpl(attval, false, false, true, true, false);
}
/**
* Works like escapeAttribute, but converts spaces to non-breaking
* spaces.
*/
public static String escapeAttributeNbsp(String attval) {
return escapeImpl(attval, false, false, true, true, true);
}
/**
* Escapes HTML body CDATA (ampersands, greater-than, and
* less-than symbols are converted to their character reference
* equivalents).
*/
public static String escapeHtml(String cdata) {
return escapeImpl(cdata, true, true, true, false, false);
}
/**
* Performs the actual escaping for the escapeXXX methods.
*/
static String escapeImpl(String str,
boolean lt,
boolean gt,
boolean amp,
boolean quot,
boolean nbsp) {
if (str == null) return null;
StringBuffer escaped = new StringBuffer();
for (int i = 0, n = str.length(); i < n; i++) {
switch (str.charAt(i)) {
case '<':
if (lt) {
escaped.append("<");
} else {
escaped.append('<');
}
break;
case '>':
if (lt) {
escaped.append(">");
} else {
escaped.append('>');
}
break;
case '&':
if (amp) {
escaped.append("&");
} else {
escaped.append('&');
}
break;
case '\"':
if (quot) {
escaped.append(""");
} else {
escaped.append('"');
}
break;
case ' ':
if (nbsp) {
escaped.append(" ");
} else {
escaped.append(' ');
}
break;
default:
escaped.append(str.charAt(i));
break;
}
}
return escaped.toString();
}
}