/* Copyright (c) 2006 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package sample.gbase.recipe; import java.io.IOException; import java.io.Writer; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import java.util.TreeSet; /** * Methods called from the JSP for generating HTML code. * * This is the work normally done by a web framework. */ public class DisplayUtils { /** * Prints checkboxes on two colums, with a text input field at the end. * The checked values will be displayed along with the values to be showed. * * The text input field can be used to input a custom value. It has the * same name as the checkbox input fields, so when the submitted values * are processed, you have to remove the empty value, in case this field * remains empty. * * @param out output writer * @param name name of the input field * @param values values to be shown * @param checked checked values * @throws IOException */ public static void printCheckboxes(Writer out, String name, String[] values, Set<String> checked) throws IOException { Set<String> allValues = new TreeSet<String>(); // The displayed values are the static values plus the checked values allValues.addAll(Arrays.asList(values)); if (checked == null) { checked = new HashSet<String>(); } allValues.addAll(checked); int middle = (allValues.size() + 2) / 2; int row = 0; out.write("<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\">"); out.write("<tr><td><ul class=\"inputlist\">"); for (String value : allValues) { if (row == middle) { out.write("</ul></td><td><ul class=\"inputlist\">"); } out.write("<li>"); printCheckbox(out, name, value, checked.contains(value)); out.write("</li>"); row++; } out.write("<li><label>Other:<br/><input id=\"other"); out.write(name); out.write("\" type=\"text\" name=\""); out.write(name); out.write("\" value=\"\" size=\"15\" class=\"txt\"></label></li>"); out.write("</ul></td></tr></table>"); } /** * Prints a checkbox input field with a label. * * @param out output writer * @param name name of the field * @param value value of the field * @param checked true if the field is checked * @throws IOException */ public static void printCheckbox(Writer out, String name, String value, boolean checked) throws IOException { value = escape(value); out.write("<label><input type=\"checkbox\" name=\""); out.write(name); out.write("\" value=\""); out.write(value); out.write("\""); if (checked) { out.write(" checked"); } out.write("/> "); if (checked) { out.write("<b>"); } out.write(value); if (checked) { out.write("</b>"); } out.write("</label>"); } /** * Escapes the items of the Collection and returns them in a StringBuffer, * separated by commas. * * @param list * @return list of the elements of the collection, sepparated by commas */ public static StringBuffer printList(Collection<String> list) { StringBuffer sb = new StringBuffer(); if (list != null && list.size() > 0) { Iterator<String> iter = list.iterator(); while (true) { sb.append(escape(iter.next())); if (iter.hasNext()) { sb.append(", "); } else { break; } } } return sb; } /** * Prints <option> tags and set the selected option. * * @param out output writer * @param names option names, which are used both for * values and for labels * @param current name of the current option * @throws IOException */ public static void printOptions(Writer out, String[] names, String current) throws IOException { for (int i=0; i<names.length; i++) { String name = names[i]; printOption(out, name, name, name.equals(current)); } printOption(out, "all", "", current==null); } /** * Prints one <option> tag and select it if necessary. * * @param out output writer * @param label option label * @param value option value * @param selected true if it's selected * @throws IOException */ public static void printOption(Writer out, String label, String value, boolean selected) throws IOException { out.write("<option"); if (selected) { out.write(" selected"); } out.write(" value=\""); out.write(value); out.write("\">"); out.write(escape(label)); out.write("</option>"); } /** * Simple HTML escaping of the String version of the specified Object. * * @param obj Object that has a meaningful toString() value * @return string with some escaped characters */ public static String escape(Object obj) { if (obj == null) { return ""; } return escapeAndShorten(obj.toString(), -1); } /** * Simple HTML escaping. * * Escapes < & and > and leaves the rest as it is. * * @param raw * @return string with some escaped characters */ public static String escape(String raw) { return escapeAndShorten(raw, -1); } /** * Escape HTML data and shorted the result if necessary. * * If the text is escaped, <b>...</b> will be * appended. * * @param raw raw text to escape * @param maxLength maximum output length * @return HTML code */ public static String escapeAndShorten(String raw, int maxLength) { if (raw == null) { return ""; } StringBuilder retval = new StringBuilder(); int length = raw.length(); boolean shortened = false; if (maxLength != -1 && length > maxLength) { length = maxLength; shortened = true; } for (int i=0; i<length; i++) { char c = raw.charAt(i); switch (c) { case '<': retval.append("<"); break; case '>': retval.append(">"); break; case '&': retval.append("&"); break; case '\'': retval.append("'"); break; case '"': retval.append("""); break; default: retval.append(c); break; } } if (shortened) { retval.append("<b>...</b>"); } return retval.toString(); } }