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