Java tutorial
/** * * LibXML : a free Java layouting library * * * Project Info: http://reporting.pentaho.org/libxml/ * * (C) Copyright 2006-2008, by Object Refinery Ltd, Pentaho Corporation and Contributors. * * This library is free software; you can redistribute it and/or modify it under the terms * of the GNU Lesser General Public License as published by the Free Software Foundation; * either version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License along with this * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. * * [Java is a trademark or registered trademark of Sun Microsystems, Inc. * in the United States and other countries.] * * * ------------ * HtmlCharacterEntities.java * ------------ */ import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Properties; /** * A collection of all character entites defined in the HTML4 standard. The key * is the entity name, the property value is the decoded string. * * @author Thomas Morgner */ public class HtmlCharacterEntities extends Properties { /** * The singleton instance for this entity-parser implementation. */ private static CharacterEntityParser entityParser; private static final long serialVersionUID = 5118172339379209383L; /** * Gets the character entity parser for HTML content. The CharacterEntity * parser translates known characters into predefined entities. * * @return the character entity parser instance. */ public static CharacterEntityParser getEntityParser() { if (entityParser == null) { entityParser = new CharacterEntityParser(new HtmlCharacterEntities()); } return entityParser; } /** * Creates an instance. */ public HtmlCharacterEntities() { setProperty("ang", "\u2220"); setProperty("spades", "\u2660"); setProperty("frasl", "\u2044"); setProperty("copy", "\u00a9"); setProperty("Upsilon", "\u03a5"); setProperty("rsquo", "\u2019"); setProperty("sdot", "\u22c5"); setProperty("beta", "\u03b2"); setProperty("egrave", "\u00e8"); setProperty("Pi", "\u03a0"); setProperty("micro", "\u00b5"); setProperty("lArr", "\u21d0"); setProperty("Beta", "\u0392"); setProperty("eacute", "\u00e9"); setProperty("agrave", "\u00e0"); setProperty("sbquo", "\u201a"); setProperty("ucirc", "\u00fb"); setProperty("mdash", "\u2014"); setProperty("rho", "\u03c1"); setProperty("Nu", "\u039d"); setProperty("ne", "\u2260"); setProperty("nsub", "\u2284"); setProperty("AElig", "\u00c6"); setProperty("raquo", "\u00bb"); setProperty("aacute", "\u00e1"); setProperty("le", "\u2264"); setProperty("harr", "\u2194"); setProperty("frac34", "\u00be"); setProperty("bdquo", "\u201e"); setProperty("cup", "\u222a"); setProperty("frac14", "\u00bc"); setProperty("exist", "\u2203"); setProperty("Ccedil", "\u00c7"); setProperty("phi", "\u03c6"); setProperty("Lambda", "\u039b"); setProperty("alpha", "\u03b1"); setProperty("sigma", "\u03c3"); setProperty("thetasym", "\u03d1"); setProperty("Rho", "\u03a1"); setProperty("hArr", "\u21d4"); setProperty("Dagger", "\u2021"); setProperty("otilde", "\u00f5"); setProperty("Epsilon", "\u0395"); setProperty("iuml", "\u00ef"); setProperty("Phi", "\u03a6"); setProperty("prod", "\u220f"); setProperty("Aring", "\u00c5"); setProperty("rlm", "\u200f"); setProperty("yen", "\u00a5"); setProperty("emsp", "\u2003"); setProperty("rang", "\u232a"); setProperty("Atilde", "\u00c3"); setProperty("Iuml", "\u00cf"); setProperty("iota", "\u03b9"); setProperty("deg", "\u00b0"); setProperty("prop", "\u221d"); setProperty("and", "\u2227"); setProperty("para", "\u00b6"); setProperty("darr", "\u2193"); setProperty("curren", "\u00a4"); setProperty("crarr", "\u21b5"); setProperty("not", "\u00ac"); setProperty("Iota", "\u0399"); setProperty("aelig", "\u00e6"); setProperty("rdquo", "\u201d"); setProperty("Ocirc", "\u00d4"); setProperty("ntilde", "\u00f1"); setProperty("reg", "\u00ae"); setProperty("zeta", "\u03b6"); setProperty("middot", "\u00b7"); setProperty("cent", "\u00a2"); setProperty("quot", "\""); setProperty("hellip", "\u2026"); setProperty("Zeta", "\u0396"); setProperty("rceil", "\u2309"); setProperty("eta", "\u03b7"); setProperty("nbsp", "\u00a0"); setProperty("rarr", "\u2192"); setProperty("frac12", "\u00bd"); setProperty("real", "\u211c"); setProperty("mu", "\u03bc"); setProperty("dArr", "\u21d3"); setProperty("divide", "\u00f7"); setProperty("cap", "\u2229"); setProperty("chi", "\u03c7"); setProperty("times", "\u00d7"); setProperty("euml", "\u00eb"); setProperty("Gamma", "\u0393"); setProperty("loz", "\u25ca"); setProperty("acute", "\u00b4"); setProperty("Omega", "\u03a9"); setProperty("ndash", "\u2013"); setProperty("clubs", "\u2663"); setProperty("macr", "\u00af"); setProperty("Yacute", "\u00dd"); setProperty("Ugrave", "\u00d9"); setProperty("Euml", "\u00cb"); setProperty("Eta", "\u0397"); setProperty("sect", "\u00a7"); setProperty("asymp", "\u2248"); setProperty("ordm", "\u00ba"); setProperty("rArr", "\u21d2"); setProperty("radic", "\u221a"); setProperty("Uacute", "\u00da"); setProperty("omicron", "\u03bf"); setProperty("Chi", "\u03a7"); setProperty("aring", "\u00e5"); setProperty("Theta", "\u0398"); setProperty("supe", "\u2287"); setProperty("ensp", "\u2002"); setProperty("uml", "\u00a8"); setProperty("ccedil", "\u00e7"); setProperty("lambda", "\u03bb"); setProperty("gt", "\u003e"); setProperty("uarr", "\u2191"); setProperty("alefsym", "\u2135"); setProperty("auml", "\u00e4"); setProperty("sup3", "\u00b3"); setProperty("circ", "\u02c6"); setProperty("lsquo", "\u2018"); setProperty("Auml", "\u00c4"); setProperty("dagger", "\u2020"); setProperty("Kappa", "\u039a"); setProperty("cong", "\u2245"); setProperty("zwnj", "\u200c"); setProperty("shy", "\u00ad"); setProperty("ouml", "\u00f6"); setProperty("diams", "\u2666"); setProperty("uArr", "\u21d1"); setProperty("atilde", "\u00e3"); setProperty("THORN", "\u00de"); setProperty("or", "\u2228"); setProperty("Ograve", "\u00d2"); setProperty("ocirc", "\u00f4"); setProperty("plusm", "\u00b1"); setProperty("Ouml", "\u00d6"); setProperty("nabla", "\u2207"); setProperty("psi", "\u03c8"); setProperty("sigmaf", "\u03c2"); setProperty("euro", "\u20ac"); setProperty("sube", "\u2286"); setProperty("sup2", "\u00b2"); setProperty("laquo", "\u00ab"); setProperty("forall", "\u2200"); setProperty("Oacute", "\u00d3"); setProperty("iexcl", "\u00a1"); fillMoreEntities(); } /** * Externalized initialization method to make CheckStyle happy. */ private void fillMoreEntities() { setProperty("piv", "\u03d6"); setProperty("minus", "\u2212"); setProperty("zwj", "\u200d"); setProperty("tau", "\u03c4"); setProperty("Mu", "\u039c"); setProperty("gamma", "\u03b3"); setProperty("sup", "\u2283"); setProperty("Psi", "\u03a8"); setProperty("omega", "\u03c9"); setProperty("Oslash", "\u00d8"); setProperty("weierp", "\u2118"); setProperty("Igrave", "\u00cc"); setProperty("OElig", "\u0152"); setProperty("sup1", "\u00b9"); setProperty("cedil", "\u00b8"); setProperty("upsilon", "\u03c5"); setProperty("equiv", "\u2261"); setProperty("isin", "\u2208"); setProperty("Delta", "\u0394"); setProperty("yacute", "\u00fd"); setProperty("ugrave", "\u00f9"); setProperty("ge", "\u2265"); setProperty("Iacute", "\u00cd"); setProperty("brvbar", "\u00a6"); setProperty("Tau", "\u03a4"); setProperty("Prime", "\u2033"); setProperty("rfloor", "\u22a7"); setProperty("Ecirc", "\u00ca"); setProperty("ETH", "\u00d0"); setProperty("int", "\u222b"); setProperty("xi", "\u03be"); setProperty("uacute", "\u00fa"); setProperty("bull", "\u2022"); setProperty("Scaron", "\u0160"); setProperty("theta", "\u03b8"); setProperty("yuml", "\u00ff"); setProperty("oplus", "\u2295"); setProperty("part", "\u2202"); setProperty("ldquo", "\u201c"); setProperty("Icirc", "\u00ce"); setProperty("Yuml", "\u0178"); setProperty("eth", "\u00f0"); setProperty("Acirc", "\u00c2"); setProperty("sub", "\u2282"); setProperty("lceil", "\u2308"); setProperty("Egrave", "\u00c8"); setProperty("tilde", "\u02dc"); setProperty("pi", "\u03c0"); setProperty("rsaquo", "\u203a"); setProperty("kappa", "\u03ba"); setProperty("upsih", "\u03d2"); setProperty("Omicron", "\u039f"); setProperty("otimes", "\u2297"); setProperty("ni", "\u220b"); setProperty("amp", "\u0026"); setProperty("Eacute", "\u00c9"); setProperty("nu", "\u03bd"); setProperty("Ucirc", "\u00db"); setProperty("uuml", "\u00fc"); setProperty("oslash", "\u00f8"); setProperty("thorn", "\u00fe"); setProperty("trade", "\u2122"); setProperty("epsilon", "\u03b5"); setProperty("ograve", "\u00f2"); setProperty("hearts", "\u2665"); setProperty("iquest", "\u00bf"); setProperty("Uuml", "\u00dc"); setProperty("empty", "\u2205"); setProperty("lowast", "\u2217"); setProperty("sum", "\u2211"); setProperty("lfloor", "\u22a6"); setProperty("lrm", "\u200e"); setProperty("oacute", "\u00f3"); setProperty("image", "\u2111"); setProperty("Agrave", "\u00c0"); setProperty("oline", "\u203e"); setProperty("oelig", "\u0153"); setProperty("Sigma", "\u03a3"); setProperty("permil", "\u2030"); setProperty("perp", "\u22a5"); setProperty("lt", "\u003c"); setProperty("Aacute", "\u00c1"); setProperty("acirc", "\u00e2"); setProperty("lang", "\u2329"); setProperty("delta", "\u03b4"); setProperty("infin", "\u221e"); setProperty("igrave", "\u00ec"); setProperty("ordf", "\u00aa"); setProperty("lsaquo", "\u2039"); setProperty("prime", "\u2032"); setProperty("ecirc", "\u00ea"); setProperty("there4", "\u2234"); setProperty("iacute", "\u00ed"); setProperty("sim", "\u223c"); setProperty("Alpha", "\u0391"); setProperty("pound", "\u00a3"); setProperty("notin", "\u2209"); setProperty("Ntilde", "\u00d1"); setProperty("Xi", "\u039e"); setProperty("thinsp", "\u2009"); setProperty("Otilde", "\u00d5"); setProperty("icirc", "\u00ee"); setProperty("scaron", "\u0161"); setProperty("szlig", "\u00df"); setProperty("larr", "\u2190"); } } /** * * LibXML : a free Java layouting library * * * Project Info: http://reporting.pentaho.org/libxml/ * * (C) Copyright 2006-2008, by Object Refinery Ltd, Pentaho Corporation and Contributors. * * This library is free software; you can redistribute it and/or modify it under the terms * of the GNU Lesser General Public License as published by the Free Software Foundation; * either version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License along with this * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. * * [Java is a trademark or registered trademark of Sun Microsystems, Inc. * in the United States and other countries.] * * * ------------ * CharacterEntityParser.java * ------------ */ /** * The character entity parser replaces all known occurrences of an entity in * the format &entityname;. * * @author Thomas Morgner */ class CharacterEntityParser { private String[] charMap; /** * the entities, keyed by entity name. */ private final HashMap entities; /** * Creates a new CharacterEntityParser and initializes the parser with the * given set of entities. * * @param characterEntities the entities used for the parser */ public CharacterEntityParser(final Properties characterEntities) { if (characterEntities == null) { throw new NullPointerException("CharacterEntities must not be null"); } entities = new HashMap(characterEntities); charMap = new String[65536]; final Iterator entries = entities.entrySet().iterator(); while (entries.hasNext()) { final Map.Entry entry = (Map.Entry) entries.next(); final String value = (String) entry.getValue(); final String entityName = (String) entry.getKey(); if (value.length() != 1) { throw new IllegalStateException(); } charMap[value.charAt(0)] = entityName; } } /** * Creates a new CharacterEntityParser and initializes the parser with the * given set of entities. * * @param characterEntities the entities used for the parser */ public CharacterEntityParser(final HashMap characterEntities) { if (characterEntities == null) { throw new NullPointerException("CharacterEntities must not be null"); } entities = (HashMap) characterEntities.clone(); charMap = new String[65536]; final Iterator entries = entities.entrySet().iterator(); while (entries.hasNext()) { final Map.Entry entry = (Map.Entry) entries.next(); final String value = (String) entry.getValue(); final String entityName = (String) entry.getKey(); if (value.length() != 1) { throw new IllegalStateException(); } charMap[value.charAt(0)] = entityName; } } /** * create a new Character entity parser and initializes the parser with the * entities defined in the XML standard. * * @return the CharacterEntityParser initialized with XML entities. */ public static CharacterEntityParser createXMLEntityParser() { final HashMap entities = new HashMap(); entities.put("amp", "&"); entities.put("quot", "\""); entities.put("lt", "<"); entities.put("gt", ">"); entities.put("apos", "\u0027"); return new CharacterEntityParser(entities); } /** * returns the entities used in the parser. * * @return the properties for this parser. */ private HashMap getEntities() { return entities; } /** * Looks up the character for the entity name specified in <code>key</code>. * * @param key the entity name * @return the character as string with a length of 1 */ private String lookupCharacter(final String key) { return (String) getEntities().get(key); } /** * Encode the given String, so that all known entites are encoded. All * characters represented by these entites are now removed from the string. * * @param value the original string * @return the encoded string. */ public String encodeEntities(final String value) { if (value == null) { throw new NullPointerException(); } final int length = value.length(); final StringBuffer writer = new StringBuffer(length); for (int i = 0; i < length; i++) { final char character = value.charAt(i); final String lookup = charMap[character]; if (lookup == null) { writer.append(character); } else { writer.append('&'); writer.append(lookup); writer.append(';'); } } return writer.toString(); } /** * Decode the string, all known entities are replaced by their resolved * characters. * * @param value the string that should be decoded. * @return the decoded string. */ public String decodeEntities(final String value) { if (value == null) { throw new NullPointerException(); } int parserIndex = 0; int subStart = value.indexOf('&', parserIndex); if (subStart == -1) { return value; } int subEnd = value.indexOf(';', subStart); if (subEnd == -1) { return value; } final StringBuffer bufValue = new StringBuffer(value.substring(0, subStart)); do { // at this point we know, that there is at least one entity .. if (value.charAt(subStart + 1) == '#') { final int subValue = parseInt(value.substring(subStart + 2, subEnd), 0); if ((subValue >= 1) && (subValue <= 65536)) { final char[] chr = new char[1]; chr[0] = (char) subValue; bufValue.append(chr); } else { // invalid entity, do not decode .. bufValue.append(value.substring(subStart, subEnd)); } } else { final String entity = value.substring(subStart + 1, subEnd); final String replaceString = lookupCharacter(entity); if (replaceString != null) { bufValue.append(decodeEntities(replaceString)); } else { bufValue.append('&'); bufValue.append(entity); bufValue.append(';'); } } parserIndex = subEnd + 1; subStart = value.indexOf('&', parserIndex); if (subStart == -1) { bufValue.append(value.substring(parserIndex)); subEnd = -1; } else { subEnd = value.indexOf(';', subStart); if (subEnd == -1) { bufValue.append(value.substring(parserIndex)); } else { bufValue.append(value.substring(parserIndex, subStart)); } } } while (subStart != -1 && subEnd != -1); return bufValue.toString(); } /** * Parses the given string into an int-value. On errors the default value * is returned. * * @param s the string * @param defaultVal the default value that should be used in case of errors * @return the parsed int or the default value. */ private int parseInt(final String s, final int defaultVal) { if (s == null) { return defaultVal; } try { return Integer.parseInt(s); } catch (Exception e) { // ignored .. } return defaultVal; } }