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