Show
Ignore:
Timestamp:
06/23/12 19:22:21 (12 years ago)
Author:
František Kučera <franta-hg@…>
Branch:
default
Message:

#20 Skriptování: podpora výstupu ve formátu XML (musí být validní)

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java

    r94 r95  
    1919 
    2020import static cz.frantovo.xmlWebGenerator.NástrojeCLI.načtiProud; 
     21import java.io.ByteArrayInputStream; 
    2122import java.io.File; 
    2223import java.io.PrintStream; 
     
    2526import java.util.HashMap; 
    2627import java.util.Map; 
     28import javax.xml.parsers.DocumentBuilder; 
     29import javax.xml.parsers.DocumentBuilderFactory; 
     30import org.w3c.dom.Document; 
    2731 
    2832/** 
     
    5458         * @param skript program k vykonání 
    5559         * @param jazyk programovací jazyk 
     60         * @param výstupníFormát text (výchozí) | xml (v tom případě kontrolujeme validitu) 
    5661         * @param uriStránky URI aktuálně generované stránky → proměnná prostředí 
    5762         * @param nadpisStránky nadpis stránky → proměnná prostředí 
     
    5964         * @return výstup příkazu 
    6065         */ 
    61         public static String interpretuj(String skript, String jazyk, String uriStránky, String nadpisStránky, String perexStránky) { 
     66        public static String interpretuj(String skript, String jazyk, String výstupníFormát, String uriStránky, String nadpisStránky, String perexStránky) { 
    6267                try { 
    6368                        System.err.println("\tInterpretuji skript v jazyce: " + jazyk); 
     
    7782                                ps.close(); 
    7883 
    79                                 f.setExecutable(true); 
    8084 
    8185                                String[] prostředí = new String[]{ 
    8286                                        "LANG=" + System.getenv("LANG"), 
    8387                                        "USER=" + System.getenv("USER"), 
    84                                         "XWG_STRANKA_URI=" + uriStránky, 
    85                                         "XWG_STRANKA_SOUBOR=" + (new File(new URI(uriStránky)).getAbsolutePath()), 
    86                                         "XWG_STRANKA_NADPIS=" + nadpisStránky, 
    87                                         "XWG_STRANKA_PEREX=" + perexStránky 
     88                                        "XWG_SKRIPTOVANI_JAVA=" + "šablona" + File.separator + "funkce" + File.separator + "src" + File.separator + Skriptování.class.getName().replaceAll("\\.", File.separator) + ".java", 
     89                                        "XWG_STRANKA_URI=" + uriStránky, // env:URI aktuálně zpracovávané stránky 
     90                                        "XWG_STRANKA_SOUBOR=" + (new File(new URI(uriStránky)).getAbsolutePath()), // env:absolutní cesta k souboru 
     91                                        "XWG_STRANKA_NADPIS=" + nadpisStránky, // env:nadpis stránky 
     92                                        "XWG_STRANKA_PEREX=" + perexStránky // env:perex stránky 
    8893                                }; 
    8994 
    9095 
    9196 
     97                                f.setExecutable(true); 
    9298                                Runtime r = Runtime.getRuntime(); 
    9399                                Process p = r.exec(new String[]{f.getAbsolutePath()}, prostředí); 
     
    98104                                p.waitFor(); 
    99105 
    100                                 /** 
    101                                  * TODO: podporovat zvláštní návratový kód, kterým skript řekne, 
    102                                  * že výstupem je XML a má se vložit jako fragment do dokumentu, 
    103                                  * ne jako prostý text. 
    104                                  */ 
    105106                                if (p.exitValue() == 0) { 
    106107                                        if (chyby.length() > 0) { 
    107                                                 System.err.println("--- Cyhbový výstup skriptu -----"); 
     108                                                System.err.println("--- Chybový výstup skriptu -----"); 
    108109                                                System.err.println(chyby); 
    109110                                                System.err.println("--------------------------------"); 
     111                                                System.err.println("Nicméně skript skončil úspěšně, takže pokračujeme dál."); 
    110112                                        } 
    111113 
    112                                         return výsledek.trim(); 
     114                                        return připravVýstup(výsledek, výstupníFormát); 
    113115                                } else { 
    114116                                        System.err.println("--- Standardní výstup skriptu: -----"); 
     
    129131                } 
    130132        } 
     133 
     134        private static String připravVýstup(String výsledek, String formát) { 
     135                if ("xml".equals(formát)) { 
     136                        if (zkontrolujXml(výsledek)) { 
     137                                return výsledek.trim(); 
     138                        } else { 
     139                                System.err.println("Chyba v XML generovaném skriptem:"); 
     140                                System.err.println(výsledek); 
     141                                return null; 
     142                        } 
     143                } else { 
     144                        return výsledek.trim(); 
     145                } 
     146        } 
     147 
     148        /** 
     149         * @param xml fragment XML vygenerovaný skriptem 
     150         * @return true v případě, že výstup je validním fragmentem XML 
     151         */ 
     152        private static boolean zkontrolujXml(String xml) { 
     153                try { 
     154                        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     155                        DocumentBuilder db = dbf.newDocumentBuilder(); 
     156                        xml = "<xml>" + xml + "</xml>"; 
     157                        Document d = db.parse(new ByteArrayInputStream(xml.getBytes())); 
     158                        return true; 
     159                } catch (Exception e) { 
     160                        e.printStackTrace(System.err); 
     161                        return false; 
     162                } 
     163        } 
    131164}