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@145: }
franta-hg@130: }