author | František Kučera <franta-hg@frantovo.cz> |
Thu, 09 Feb 2012 12:23:09 +0100 | |
changeset 202 | 8d141ea76a2d |
parent 197 | 40b7aa9126d0 |
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@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 <br/> |
franta-hg@145 | 50 |
* a celé zabalí do <p/> |
franta-hg@145 | 51 |
* @param komentar text se zalomenými řádky |
franta-hg@145 | 52 |
* @return text s <br/> 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("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll("\"", """).replaceAll("'", "'"); |
franta-hg@145 | 119 |
} |
franta-hg@130 | 120 |
} |