java/nekurak.net-lib/src/cz/frantovo/nekurak/util/Komentare.java
author František Kučera <franta-hg@frantovo.cz>
Wed, 09 Jun 2010 18:34:13 +0200
changeset 139 b876839f1989
parent 134 4bd1e353c527
child 145 0efefbf5f8b6
permissions -rw-r--r--
Doplněno explicitní kódování pro data přijímaná od Texy služby,
abychom se nemuseli spoléhat na proměnné prostředí.
     1 package cz.frantovo.nekurak.util;
     2 
     3 import cz.frantovo.nekurak.vyjimky.KomentarovaVyjimka;
     4 import java.io.ByteArrayInputStream;
     5 import java.net.URL;
     6 import java.util.logging.Logger;
     7 import javax.xml.XMLConstants;
     8 import javax.xml.parsers.DocumentBuilder;
     9 import javax.xml.parsers.DocumentBuilderFactory;
    10 import javax.xml.validation.Schema;
    11 import javax.xml.validation.SchemaFactory;
    12 import org.w3c.dom.Document;
    13 import org.xml.sax.ErrorHandler;
    14 import org.xml.sax.SAXException;
    15 import org.xml.sax.SAXParseException;
    16 
    17 /**
    18  * Validátor komentářů
    19  * @author fiki
    20  */
    21 public class Komentare {
    22 
    23     private static final Logger log = Logger.getLogger(Komentare.class.getSimpleName());
    24 
    25     /**
    26      * Escapuje XML a doplní XHTML zalomení na konce řádků.
    27      * @param komentar prostý text zadaný uživatelem
    28      * @return XHTML komentář bez kořenového elementu
    29      */
    30     public static String upravProstyText(String komentar) {
    31 	return zalomRadky(escapujXML(komentar));
    32     }
    33 
    34     /**
    35      * Pokud uživatel zapomněl na odstavce,
    36      * zalomíme řádky a zabalíme celý odstavec do jednoho odstavce
    37      * @param komentar komentář bez odstavců
    38      * @return komentář s odstavci
    39      */
    40     public static String upravXHTML(String komentar) {
    41 	if (komentar.indexOf("<p>") == -1) {
    42 	    return zalomRadky(komentar);
    43 	} else {
    44 	    return komentar;
    45 	}
    46     }
    47 
    48     /**
    49      * Převede konce řádků na &lt;br/&gt;
    50      * a celé zabalí do &lt;p/&gt;
    51      * @param komentar text se zalomenými řádky
    52      * @return text s &lt;br/&gt; místo konců řádků
    53      */
    54     private static String zalomRadky(String komentar) {
    55 	return "<p>" + komentar.replaceAll("\n", "<br/>") + "</p>";
    56     }
    57 
    58     /**
    59      *
    60      * @param komentar vstupní XHTML
    61      * @return XHTML obalené kořenovým elementem
    62      */
    63     public static String obal(String komentar) {
    64 	return "<div>" + komentar + "</div>";
    65     }
    66 
    67     /**
    68      * zkontroluje komentář oproti schématu.
    69      *
    70      * TODO: omezit maximální délku?
    71      * TODO: omezit komentáře?
    72      *
    73      * @param komentar
    74      * @return jestli komentář odpovídá
    75      */
    76     public static Document zkontroluj(String komentar) throws KomentarovaVyjimka {
    77 	try {
    78 	    URL soubor = Komentare.class.getClassLoader().getResource("cz/frantovo/nekurak/util/komentář.xsd");
    79 	    SchemaFactory tovarnaSchemat = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    80 	    Schema schema = tovarnaSchemat.newSchema(soubor);
    81 
    82 	    DocumentBuilderFactory tovarnaDB = DocumentBuilderFactory.newInstance();
    83 	    tovarnaDB.setSchema(schema);
    84 
    85 	    DocumentBuilder db = tovarnaDB.newDocumentBuilder();
    86 	    db.setErrorHandler(new ErrorHandler() {
    87 
    88 		public void warning(SAXParseException e) throws SAXException {
    89 		    throw e;
    90 		}
    91 
    92 		public void error(SAXParseException e) throws SAXException {
    93 		    /**
    94 		     * neodpovídá schématu
    95 		     * TODO: poslat hlášku, v čem je chyba
    96 		     */
    97 		    throw e;
    98 		}
    99 
   100 		public void fatalError(SAXParseException e) throws SAXException {
   101 		    /** invalidní XML – neuzavřené značky atd. */
   102 		    throw e;
   103 		}
   104 	    });
   105 	    Document dokument = db.parse(new ByteArrayInputStream(komentar.getBytes("UTF-8")));
   106 	    return dokument;
   107 	} catch (Exception e) {
   108 	    throw new KomentarovaVyjimka("Neplatný komentář: " + komentar, e);
   109 	}
   110 
   111 
   112     }
   113 
   114     private static String escapujXML(String str) {
   115 	return str.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll("\"", "&quot;").replaceAll("'", "&apos;");
   116 
   117     }
   118 }