java/nekurak.net-lib/src/cz/frantovo/nekurak/util/Komentare.java
author František Kučera <franta-hg@frantovo.cz>
Wed Oct 12 19:43:13 2011 +0200 (2011-10-12)
changeset 195 eb9bdedaedcf
parent 145 0efefbf5f8b6
child 197 40b7aa9126d0
permissions -rw-r--r--
jenom @Override
     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 				@Override
    89 				public void warning(SAXParseException e) throws SAXException {
    90 					throw e;
    91 				}
    92 
    93 				@Override
    94 				public void error(SAXParseException e) throws SAXException {
    95 					/**
    96 					 * neodpovídá schématu
    97 					 * TODO: poslat hlášku, v čem je chyba
    98 					 */
    99 					throw e;
   100 				}
   101 
   102 				@Override
   103 				public void fatalError(SAXParseException e) throws SAXException {
   104 					/** invalidní XML – neuzavřené značky atd. */
   105 					throw e;
   106 				}
   107 			});
   108 			Document dokument = db.parse(new ByteArrayInputStream(komentar.getBytes("UTF-8")));
   109 			return dokument;
   110 		} catch (Exception e) {
   111 			throw new KomentarovaVyjimka("Neplatný komentář: " + komentar, e);
   112 		}
   113 
   114 
   115 	}
   116 
   117 	private static String escapujXML(String str) {
   118 		return str.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll("\"", "&quot;").replaceAll("'", "&apos;");
   119 
   120 	}
   121 }