franta-hg@130: package cz.frantovo.nekurak.util; franta-hg@130: franta-hg@132: import cz.frantovo.nekurak.vyjimky.KomentarovaVyjimka; franta-hg@132: import java.io.ByteArrayInputStream; franta-hg@132: import java.net.URL; franta-hg@132: import java.util.logging.Logger; franta-hg@132: import javax.xml.XMLConstants; franta-hg@132: import javax.xml.parsers.DocumentBuilder; franta-hg@132: import javax.xml.parsers.DocumentBuilderFactory; franta-hg@132: import javax.xml.validation.Schema; franta-hg@132: import javax.xml.validation.SchemaFactory; franta-hg@132: import org.w3c.dom.Document; franta-hg@132: import org.xml.sax.ErrorHandler; franta-hg@132: import org.xml.sax.SAXException; franta-hg@132: import org.xml.sax.SAXParseException; franta-hg@132: franta-hg@130: /** franta-hg@130: * Validátor komentářů franta-hg@130: * @author fiki franta-hg@130: */ franta-hg@130: public class Komentare { franta-hg@130: franta-hg@145: private static final Logger log = Logger.getLogger(Komentare.class.getSimpleName()); franta-hg@132: franta-hg@145: /** franta-hg@145: * Escapuje XML a doplní XHTML zalomení na konce řádků. franta-hg@145: * @param komentar prostý text zadaný uživatelem franta-hg@145: * @return XHTML komentář bez kořenového elementu franta-hg@145: */ franta-hg@145: public static String upravProstyText(String komentar) { franta-hg@145: return zalomRadky(escapujXML(komentar)); franta-hg@145: } franta-hg@133: franta-hg@145: /** franta-hg@145: * Pokud uživatel zapomněl na odstavce, franta-hg@145: * zalomíme řádky a zabalíme celý odstavec do jednoho odstavce franta-hg@145: * @param komentar komentář bez odstavců franta-hg@145: * @return komentář s odstavci franta-hg@145: */ franta-hg@145: public static String upravXHTML(String komentar) { franta-hg@145: if (komentar.indexOf("

") == -1) { franta-hg@145: return zalomRadky(komentar); franta-hg@145: } else { franta-hg@145: return komentar; franta-hg@145: } franta-hg@133: } franta-hg@133: franta-hg@145: /** franta-hg@145: * Převede konce řádků na <br/> franta-hg@145: * a celé zabalí do <p/> franta-hg@145: * @param komentar text se zalomenými řádky franta-hg@145: * @return text s <br/> místo konců řádků franta-hg@145: */ franta-hg@145: private static String zalomRadky(String komentar) { franta-hg@145: return "

" + komentar.replaceAll("\n", "
") + "

"; franta-hg@145: } franta-hg@130: franta-hg@145: /** franta-hg@145: * franta-hg@145: * @param komentar vstupní XHTML franta-hg@145: * @return XHTML obalené kořenovým elementem franta-hg@145: */ franta-hg@145: public static String obal(String komentar) { franta-hg@145: return "
" + komentar + "
"; franta-hg@145: } franta-hg@130: franta-hg@145: /** franta-hg@145: * zkontroluje komentář oproti schématu. franta-hg@145: * franta-hg@145: * TODO: omezit maximální délku? franta-hg@145: * TODO: omezit komentáře? franta-hg@145: * franta-hg@145: * @param komentar franta-hg@145: * @return jestli komentář odpovídá franta-hg@145: */ franta-hg@145: public static Document zkontroluj(String komentar) throws KomentarovaVyjimka { franta-hg@145: try { franta-hg@145: URL soubor = Komentare.class.getClassLoader().getResource("cz/frantovo/nekurak/util/komentář.xsd"); franta-hg@145: SchemaFactory tovarnaSchemat = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); franta-hg@145: Schema schema = tovarnaSchemat.newSchema(soubor); franta-hg@132: franta-hg@145: DocumentBuilderFactory tovarnaDB = DocumentBuilderFactory.newInstance(); franta-hg@145: tovarnaDB.setSchema(schema); franta-hg@132: franta-hg@145: DocumentBuilder db = tovarnaDB.newDocumentBuilder(); franta-hg@145: db.setErrorHandler(new ErrorHandler() { franta-hg@132: franta-hg@195: @Override franta-hg@145: public void warning(SAXParseException e) throws SAXException { franta-hg@145: throw e; franta-hg@145: } franta-hg@145: franta-hg@195: @Override franta-hg@145: public void error(SAXParseException e) throws SAXException { franta-hg@145: /** franta-hg@145: * neodpovídá schématu franta-hg@145: * TODO: poslat hlášku, v čem je chyba franta-hg@145: */ franta-hg@145: throw e; franta-hg@145: } franta-hg@145: franta-hg@195: @Override franta-hg@145: public void fatalError(SAXParseException e) throws SAXException { franta-hg@145: /** invalidní XML – neuzavřené značky atd. */ franta-hg@145: throw e; franta-hg@145: } franta-hg@145: }); franta-hg@145: Document dokument = db.parse(new ByteArrayInputStream(komentar.getBytes("UTF-8"))); franta-hg@145: return dokument; franta-hg@145: } catch (Exception e) { franta-hg@145: throw new KomentarovaVyjimka("Neplatný komentář: " + komentar, e); franta-hg@132: } franta-hg@132: franta-hg@132: franta-hg@132: } franta-hg@132: franta-hg@145: private static String escapujXML(String str) { franta-hg@145: return str.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll("\"", """).replaceAll("'", "'"); franta-hg@132: franta-hg@145: } franta-hg@130: }