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-- |
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 <br/> |
franta-hg@133 | 50 |
* a celé zabalí do <p/> |
franta-hg@134 | 51 |
* @param komentar text se zalomenými řádky |
franta-hg@134 | 52 |
* @return text s <br/> 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("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll("\"", """).replaceAll("'", "'"); |
franta-hg@130 | 116 |
|
franta-hg@130 | 117 |
} |
franta-hg@130 | 118 |
} |