# HG changeset patch # User František Kučera # Date 1275994606 -7200 # Node ID 1ca0d7fdbe5184de92b4ec491b6f1bb1d587937e # Parent 0d1cba59734bf52b8f03957b73e3a49de17539ea Testy komentářů, XML. diff -r 0d1cba59734b -r 1ca0d7fdbe51 java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/ejb/PodnikEJB.java --- a/java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/ejb/PodnikEJB.java Tue Jun 08 10:42:58 2010 +0200 +++ b/java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/ejb/PodnikEJB.java Tue Jun 08 12:56:46 2010 +0200 @@ -8,6 +8,8 @@ import cz.frantovo.nekurak.ext.Geo.Souradnice; import cz.frantovo.nekurak.ext.Texy; import cz.frantovo.nekurak.util.Komentare; +import cz.frantovo.nekurak.vyjimky.KomentarovaVyjimka; +import cz.frantovo.nekurak.vyjimky.TexyVyjimka; import java.util.Collection; import java.util.Date; import java.util.logging.Logger; @@ -80,7 +82,7 @@ } @RolesAllowed("opravneny") - public void komentuj(Komentar k) { + public void komentuj(Komentar k) throws KomentarovaVyjimka, TexyVyjimka { k.setUzivatel(ctx.getCallerPrincipal().getName()); k.setDatum(new Date()); @@ -98,9 +100,10 @@ } /** Zkontrolujeme XML */ - + Komentare.zkontroluj(k.getKomentar()); + /** TODO: Uložíme do databáze */ log.severe("Komentář: " + k.getNadpis() + " | " + k.getKomentar() + " | " + k.getTyp()); } } diff -r 0d1cba59734b -r 1ca0d7fdbe51 java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/ext/Texy.java --- a/java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/ext/Texy.java Tue Jun 08 10:42:58 2010 +0200 +++ b/java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/ext/Texy.java Tue Jun 08 12:56:46 2010 +0200 @@ -1,50 +1,62 @@ package cz.frantovo.nekurak.ext; +import cz.frantovo.nekurak.vyjimky.TexyVyjimka; import java.io.BufferedReader; +import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.URL; import java.net.URLConnection; import java.net.URLEncoder; +import java.util.logging.Level; +import java.util.logging.Logger; /** * Neprovádí vlastní interpretaci Texy syntaxe, ale volá HTTP službu napsanou v PHP. + * TODO: použít webové služby, nebo něco lepšího než ruční práci s URL. * @author fiki */ public class Texy { - /** TODO: parametrizovatelnost/localhost ? */ + /** TODO: parametrizovatelnost */ private static final String URL_SLUZBY = "http://nekurak.net/texy/http/"; + private static final Logger log = Logger.getLogger(Texy.class.getSimpleName()); - public String preved(String text) { + public String preved(String text) throws TexyVyjimka { + OutputStreamWriter wr = null; + BufferedReader rd = null; try { URL url = new URL(URL_SLUZBY); URLConnection spojeni = url.openConnection(); spojeni.setDoOutput(true); /** Odešleme data */ - OutputStreamWriter wr = new OutputStreamWriter(spojeni.getOutputStream()); + wr = new OutputStreamWriter(spojeni.getOutputStream()); wr.write(URLEncoder.encode(text, "UTF-8")); wr.flush(); /** Přijmeme odpověď */ - BufferedReader rd = new BufferedReader(new InputStreamReader(spojeni.getInputStream())); + rd = new BufferedReader(new InputStreamReader(spojeni.getInputStream())); StringBuffer vysledek = new StringBuffer(); String radka; while ((radka = rd.readLine()) != null) { vysledek.append(radka); } - // TODO: → finally - wr.close(); - rd.close(); - return vysledek.toString(); } catch (Exception e) { - // TODO: vyhazovat výjimku - return "TODO:chyba"; + throw new TexyVyjimka("Chyba při zpracovávání textu: " + text, e); } finally { - // TODO: finally close(); + try { + wr.close(); + } catch (IOException e) { + log.log(Level.WARNING, "Selhalo zavírání OutputStreamWriteru", e); + } + try { + rd.close(); + } catch (IOException e) { + log.log(Level.WARNING, "Selhalo zavírání BufferedReaderu", e); + } } } } diff -r 0d1cba59734b -r 1ca0d7fdbe51 java/nekurak.net-ejb/test/cz/frantovo/nekurak/ext/TexyTest.java --- a/java/nekurak.net-ejb/test/cz/frantovo/nekurak/ext/TexyTest.java Tue Jun 08 10:42:58 2010 +0200 +++ b/java/nekurak.net-ejb/test/cz/frantovo/nekurak/ext/TexyTest.java Tue Jun 08 12:56:46 2010 +0200 @@ -1,5 +1,6 @@ package cz.frantovo.nekurak.ext; +import cz.frantovo.nekurak.vyjimky.TexyVyjimka; import org.junit.Test; import static org.junit.Assert.*; @@ -15,17 +16,17 @@ private static final int CASOVY_LIMIT = 1000; @Test(timeout = CASOVY_LIMIT) - public void prostyText() { + public void prostyText() throws TexyVyjimka { testuj("", ""); testuj("ahoj", "

ahoj

"); } @Test(timeout = CASOVY_LIMIT) - public void nadpisy() { + public void nadpisy() throws TexyVyjimka { testuj("===Nadpis===", "

Nadpis

"); } - private void testuj(String vstup, String pozadovanyVystup) { + private void testuj(String vstup, String pozadovanyVystup) throws TexyVyjimka { String vystup = texy.preved(vstup); assertEquals(pozadovanyVystup, vystup); } diff -r 0d1cba59734b -r 1ca0d7fdbe51 java/nekurak.net-lib/build.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/nekurak.net-lib/build.xml Tue Jun 08 12:56:46 2010 +0200 @@ -0,0 +1,74 @@ + + + + + + + + + + + Builds, tests, and runs the project nekurak.net-lib. + + + diff -r 0d1cba59734b -r 1ca0d7fdbe51 java/nekurak.net-lib/src/cz/frantovo/nekurak/ejb/PodnikRemote.java --- a/java/nekurak.net-lib/src/cz/frantovo/nekurak/ejb/PodnikRemote.java Tue Jun 08 10:42:58 2010 +0200 +++ b/java/nekurak.net-lib/src/cz/frantovo/nekurak/ejb/PodnikRemote.java Tue Jun 08 12:56:46 2010 +0200 @@ -3,6 +3,8 @@ import cz.frantovo.nekurak.dto.Komentar; import cz.frantovo.nekurak.dto.Podnik; import cz.frantovo.nekurak.dto.VysledekHlasovani; +import cz.frantovo.nekurak.vyjimky.KomentarovaVyjimka; +import cz.frantovo.nekurak.vyjimky.TexyVyjimka; import java.util.Collection; import javax.ejb.Remote; @@ -40,5 +42,5 @@ /** * @param k komentář, který se má přidat k podniku */ - public void komentuj(Komentar k); + public void komentuj(Komentar k) throws KomentarovaVyjimka, TexyVyjimka; } diff -r 0d1cba59734b -r 1ca0d7fdbe51 java/nekurak.net-lib/src/cz/frantovo/nekurak/preklady_cs.properties --- a/java/nekurak.net-lib/src/cz/frantovo/nekurak/preklady_cs.properties Tue Jun 08 10:42:58 2010 +0200 +++ b/java/nekurak.net-lib/src/cz/frantovo/nekurak/preklady_cs.properties Tue Jun 08 12:56:46 2010 +0200 @@ -90,6 +90,7 @@ komentar.odeslat.nadpis=Vlo\u017Een\u00ED koment\u00E1\u0159e komentar.odeslat.ok=Koment\u00E1\u0159 byl \u00FAsp\u011B\u0161n\u011B vlo\u017Een komentar.odeslat.pokracujte=pokra\u010Dujte na str\u00E1nku podniku +komentar.odeslat.chyba=Koment\u00E1\u0159 obsahuje nepovolen\u00E9 form\u00E1tov\u00E1n\u00ED. komentar.typ.prostyText=Prost\u00FD text komentar.typ.xhtml=XHTML form\u00E1tovan\u00FD text komentar.typ.texy=Texy form\u00E1tovan\u00FD text diff -r 0d1cba59734b -r 1ca0d7fdbe51 java/nekurak.net-lib/src/cz/frantovo/nekurak/util/Komentare.java --- a/java/nekurak.net-lib/src/cz/frantovo/nekurak/util/Komentare.java Tue Jun 08 10:42:58 2010 +0200 +++ b/java/nekurak.net-lib/src/cz/frantovo/nekurak/util/Komentare.java Tue Jun 08 12:56:46 2010 +0200 @@ -1,11 +1,28 @@ package cz.frantovo.nekurak.util; +import cz.frantovo.nekurak.vyjimky.KomentarovaVyjimka; +import java.io.ByteArrayInputStream; +import java.net.URL; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.xml.XMLConstants; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.validation.Schema; +import javax.xml.validation.SchemaFactory; +import org.w3c.dom.Document; +import org.xml.sax.ErrorHandler; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; + /** * Validátor komentářů * @author fiki */ public class Komentare { + private static final Logger log = Logger.getLogger(Komentare.class.getSimpleName()); + /** * Escapuje XML a doplní XHTML zalomení na konce řádků. * @param komentar prostý text zadaný uživatelem @@ -30,8 +47,42 @@ * @param komentar * @return jestli komentář odpovídá */ - public boolean isValidniXHTML(String komentar) { - return false; + public static Document zkontroluj(String komentar) throws KomentarovaVyjimka { + + + + + try { + URL soubor = ClassLoader.getSystemResource("cz/frantovo/nekurak/util/komentář.xsd"); + SchemaFactory tovarnaSchemat = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); + Schema schema = tovarnaSchemat.newSchema(soubor); + + DocumentBuilderFactory tovarnaDB = DocumentBuilderFactory.newInstance(); + tovarnaDB.setSchema(schema); + + DocumentBuilder db = tovarnaDB.newDocumentBuilder(); + db.setErrorHandler(new ErrorHandler() { + + public void warning(SAXParseException e) throws SAXException { + throw e; + } + + public void error(SAXParseException e) throws SAXException { + throw e; + } + + public void fatalError(SAXParseException e) throws SAXException { + throw e; + } + }); + Document dokument = db.parse(new ByteArrayInputStream(komentar.getBytes("UTF-8"))); + + return dokument; + } catch (Exception e) { + throw new KomentarovaVyjimka("Neplatný komentář: " + komentar, e); + } + + } private static String escapujXML(String str) { diff -r 0d1cba59734b -r 1ca0d7fdbe51 java/nekurak.net-lib/src/cz/frantovo/nekurak/vyjimky/KomentarovaVyjimka.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/nekurak.net-lib/src/cz/frantovo/nekurak/vyjimky/KomentarovaVyjimka.java Tue Jun 08 12:56:46 2010 +0200 @@ -0,0 +1,12 @@ +package cz.frantovo.nekurak.vyjimky; + +/** + * Komentář neodpovídá XML schématu + * @author fiki + */ +public class KomentarovaVyjimka extends NekurakVyjimka { + + public KomentarovaVyjimka(String chyba, Exception e) { + super(chyba, e); + } +} diff -r 0d1cba59734b -r 1ca0d7fdbe51 java/nekurak.net-lib/src/cz/frantovo/nekurak/vyjimky/TexyVyjimka.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/nekurak.net-lib/src/cz/frantovo/nekurak/vyjimky/TexyVyjimka.java Tue Jun 08 12:56:46 2010 +0200 @@ -0,0 +1,12 @@ +package cz.frantovo.nekurak.vyjimky; + +/** + * + * @author fiki + */ +public class TexyVyjimka extends NekurakVyjimka { + + public TexyVyjimka(String chyba, Exception e) { + super(chyba, e); + } +} diff -r 0d1cba59734b -r 1ca0d7fdbe51 java/nekurak.net-lib/test/cz/frantovo/nekurak/util/KomentareTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/nekurak.net-lib/test/cz/frantovo/nekurak/util/KomentareTest.java Tue Jun 08 12:56:46 2010 +0200 @@ -0,0 +1,54 @@ +package cz.frantovo.nekurak.util; + +import cz.frantovo.nekurak.vyjimky.KomentarovaVyjimka; +import org.junit.Test; +import static org.junit.Assert.*; + +public class KomentareTest { + + @Test + public void obal() { + String vystup = Komentare.obal("asdf"); + String pozadovanyVystup = "
asdf
"; + assertEquals(pozadovanyVystup, vystup); + } + + @Test + public void upravProstýTextObal() { + String vystup = Komentare.upravProstyText("as\ndf"); + vystup = Komentare.obal(vystup); + String pozadovanyVystup = "

as
df

"; + assertEquals(pozadovanyVystup, vystup); + } + + @Test + public void zvláštníZnaky() { + String vystup = Komentare.upravProstyText("nbusr123 & | and < … > uvo\"zovky'"); + String pozadovanyVystup = "

nbusr123 & | and < … > uvo"zovky'

"; + System.out.println(vystup); + assertEquals(pozadovanyVystup, vystup); + } + + @Test + public void xmlJednoduché() throws Exception { + Komentare.zkontroluj("

xxx

"); + Komentare.zkontroluj("

xxx

xxx

"); + Komentare.zkontroluj("

xxxtučněxxx

"); + Komentare.zkontroluj("

xxxtučněxxx

"); + } + + @Test(expected = KomentarovaVyjimka.class) + public void xmlChybaÚplněŠpatnéXML() throws Exception { + Komentare.zkontroluj("
xxx

"); + } + + @Test(expected = KomentarovaVyjimka.class) + public void xmlChybaChybíOdstavec() throws Exception { + Komentare.zkontroluj("
xxx
"); + } + + @Test(expected = KomentarovaVyjimka.class) + public void xmlChybaPřebýváAtribut() throws Exception { + Komentare.zkontroluj("

xxx

"); + } +} diff -r 0d1cba59734b -r 1ca0d7fdbe51 java/nekurak.net-web/src/java/cz/frantovo/nekurak/web/OdeslatKomentar.java --- a/java/nekurak.net-web/src/java/cz/frantovo/nekurak/web/OdeslatKomentar.java Tue Jun 08 10:42:58 2010 +0200 +++ b/java/nekurak.net-web/src/java/cz/frantovo/nekurak/web/OdeslatKomentar.java Tue Jun 08 12:56:46 2010 +0200 @@ -1,6 +1,9 @@ package cz.frantovo.nekurak.web; import cz.frantovo.nekurak.dto.Komentar; +import cz.frantovo.nekurak.vyjimky.KomentarovaVyjimka; +import cz.frantovo.nekurak.vyjimky.TexyVyjimka; +import java.util.logging.Level; import java.util.logging.Logger; /** @@ -11,8 +14,18 @@ private HledacSluzby hledac = new HledacSluzby(); private static final Logger log = Logger.getLogger(OdeslatKomentar.class.getSimpleName()); + private boolean ok = false; - public void setKomentar(Komentar k) { - hledac.getPodnikEJB().komentuj(k); + public void setKomentar(Komentar k) throws TexyVyjimka { + try { + hledac.getPodnikEJB().komentuj(k); + ok = true; + } catch (KomentarovaVyjimka e) { + log.log(Level.WARNING, "chyba při vkládání komentáře", e); + } + } + + public boolean isOk() { + return ok; } } diff -r 0d1cba59734b -r 1ca0d7fdbe51 java/nekurak.net-web/web/WEB-INF/casti/odeslatKomentar.jsp --- a/java/nekurak.net-web/web/WEB-INF/casti/odeslatKomentar.jsp Tue Jun 08 10:42:58 2010 +0200 +++ b/java/nekurak.net-web/web/WEB-INF/casti/odeslatKomentar.jsp Tue Jun 08 12:56:46 2010 +0200 @@ -21,10 +21,19 @@ -

- , - . -

+ + +

+ , + . +

+
+ +

+
+
+ + diff -r 0d1cba59734b -r 1ca0d7fdbe51 xml/komentář.xsd --- a/xml/komentář.xsd Tue Jun 08 10:42:58 2010 +0200 +++ b/xml/komentář.xsd Tue Jun 08 12:56:46 2010 +0200 @@ -14,7 +14,6 @@ -