Show
Ignore:
Timestamp:
07/01/12 14:43:21 (12 years ago)
Author:
František Kučera <franta-hg@…>
Branch:
default
Message:

#20 Skriptování: možnost spouštět skripty ze souborů (atribut: src).

Files:
1 modified

Legend:

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

    r101 r103  
    5656         * než jen vložení do souboru a přidání správného záhlaví. 
    5757         * 
    58          * @param skript program k vykonání 
     58         * @param skriptText skript k vykonání 
     59         * @param skriptSoubor cesta k souboru se skriptem/programem 
    5960         * @param jazyk programovací jazyk 
    6061         * @param výstupníFormát text (výchozí) | xml (v tom případě kontrolujeme validitu) 
     
    6465         * @return výstup příkazu 
    6566         */ 
    66         public static String interpretuj(String skript, String jazyk, String výstupníFormát, String uriStránky, String nadpisStránky, String perexStránky) { 
     67        public static String interpretuj(String skriptText, String skriptSoubor, String jazyk, String výstupníFormát, String uriStránky, String nadpisStránky, String perexStránky) { 
    6768                try { 
    68                         System.err.println("\tInterpretuji skript v jazyce: " + jazyk); 
    69                         String interpret = interpreti.get(jazyk); 
    70                         if (interpret == null) { 
    71                                 System.err.println("Neznámý skriptovací jazyk: " + jazyk); 
    72                                 return null; 
     69                        if (isNeprázdný(skriptSoubor)) { 
     70                                System.err.println("\tInterpretuji skript ze souboru: " + skriptSoubor); 
    7371                        } else { 
    74                                 File f = File.createTempFile("xml-web-generátor-", ".skript"); 
     72                                System.err.println("\tInterpretuji skript v jazyce:   " + jazyk); 
     73                        } 
     74 
     75                        File souborStránky = new File(new URI(uriStránky)); 
     76                        File f; 
     77 
     78                        if (isNeprázdný(skriptText)) { 
     79                                /** Skript je zadán uvnitř elementu přímo ve stránce */ 
     80                                String interpret = interpreti.get(jazyk); 
     81                                if (interpret == null) { 
     82                                        throw new Exception("Neznámý skriptovací jazyk: " + jazyk); 
     83                                } 
     84 
     85                                f = File.createTempFile("xml-web-generátor-", ".skript"); 
    7586                                f.deleteOnExit(); 
     87                                f.setExecutable(true); 
    7688 
    7789                                PrintStream ps = new PrintStream(f); 
     
    7991                                ps.println(interpret); 
    8092                                ps.println(); 
    81                                 ps.print(skript); 
     93                                ps.print(skriptText); 
    8294                                ps.close(); 
     95                        } else if (isNeprázdný(skriptSoubor)) { 
     96                                /** Skript/program je uložen v externím souboru */ 
     97                                if (skriptSoubor.startsWith(File.separator)) { 
     98                                        /** absolutní cesta */ 
     99                                        f = new File(skriptSoubor); 
     100                                } else { 
     101                                        /** relativní cesta */ 
     102                                        f = new File(souborStránky.getParent(), File.separatorChar + skriptSoubor); 
     103                                } 
     104 
     105                                if (!f.canExecute()) { 
     106                                        throw new Exception("Soubor se skriptem není spustitelný → nastavte: chmod +x " + f); 
     107                                } 
     108                        } else { 
     109                                throw new Exception("Musí být vyplněn text skriptu, nebo cesta k souboru."); 
     110                        } 
    83111 
    84112 
    85                                 String[] prostředí = new String[]{ 
    86                                         "LANG=" + System.getenv("LANG"), 
    87                                         "USER=" + System.getenv("USER"), 
    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 
    93                                 }; 
     113                        String[] prostředí = new String[]{ 
     114                                "LANG=" + System.getenv("LANG"), 
     115                                "USER=" + System.getenv("USER"), 
     116                                "XWG_SKRIPTOVANI_JAVA=" + "šablona" + File.separator + "funkce" + File.separator + "src" + File.separator + Skriptování.class.getName().replaceAll("\\.", File.separator) + ".java", 
     117                                "XWG_STRANKA_URI=" + uriStránky, // env:URI aktuálně zpracovávané stránky 
     118                                "XWG_STRANKA_SOUBOR=" + souborStránky.getAbsolutePath(), // env:absolutní cesta k souboru 
     119                                "XWG_STRANKA_NADPIS=" + nadpisStránky, // env:nadpis stránky 
     120                                "XWG_STRANKA_PEREX=" + perexStránky // env:perex stránky 
     121                        }; 
    94122 
    95                                 f.setExecutable(true); 
    96                                 Runtime r = Runtime.getRuntime(); 
    97                                 Process p = r.exec(new String[]{f.getAbsolutePath()}, prostředí); 
     123                        Runtime r = Runtime.getRuntime(); 
     124                        Process p = r.exec(new String[]{f.getAbsolutePath()}, prostředí); 
    98125 
    99                                 String výsledek = načtiProud(p.getInputStream()); 
    100                                 String chyby = načtiProud(p.getErrorStream()); 
     126                        String výsledek = načtiProud(p.getInputStream()); 
     127                        String chyby = načtiProud(p.getErrorStream()); 
    101128 
    102                                 p.waitFor(); 
     129                        p.waitFor(); 
    103130 
    104                                 if (p.exitValue() == 0) { 
    105                                         if (chyby.length() > 0) { 
    106                                                 System.err.println("--- Chybový výstup skriptu -----"); 
    107                                                 System.err.println(chyby); 
    108                                                 System.err.println("--------------------------------"); 
    109                                                 System.err.println("Nicméně skript skončil úspěšně, takže pokračujeme dál."); 
    110                                         } 
     131                        if (p.exitValue() == 0) { 
     132                                if (chyby.length() > 0) { 
     133                                        System.err.println("--- Chybový výstup skriptu -----"); 
     134                                        System.err.println(chyby); 
     135                                        System.err.println("--------------------------------"); 
     136                                        System.err.println("Nicméně skript skončil úspěšně, takže pokračujeme dál."); 
     137                                } 
    111138 
    112                                         return připravVýstup(výsledek, výstupníFormát); 
    113                                 } else { 
    114                                         System.err.println("--- Standardní výstup skriptu: -----"); 
    115                                         System.err.println(výsledek); 
    116                                         System.err.println("--- Cyhbový výstup skriptu: ---------"); 
    117                                         System.err.println(chyby); 
    118                                         System.err.println("--------------------------------------"); 
    119                                         throw new RuntimeException("Návratová hodnota: " + p.exitValue()); 
    120                                 } 
     139                                return připravVýstup(výsledek, výstupníFormát); 
     140                        } else { 
     141                                System.err.println("--- Standardní výstup skriptu: -----"); 
     142                                System.err.println(výsledek); 
     143                                System.err.println("--- Cyhbový výstup skriptu: ---------"); 
     144                                System.err.println(chyby); 
     145                                System.err.println("--------------------------------------"); 
     146                                throw new Exception("Návratová hodnota: " + p.exitValue()); 
    121147                        } 
    122148                } catch (Exception e) { 
    123149                        System.err.println("Došlo k chybě při vykonávání skriptu v jazyce: " + jazyk); 
    124150                        System.err.println("--------"); 
    125                         System.err.println(skript); 
     151                        System.err.println(skriptText); 
    126152                        System.err.println("--------"); 
    127153                        e.printStackTrace(System.err); 
     
    144170        } 
    145171 
     172        private static boolean isNeprázdný(String s) { 
     173                return !(s == null || s.trim().isEmpty()); 
     174        } 
     175 
    146176        /** 
    147177         * @param xml fragment XML vygenerovaný skriptem