šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java
changeset 103 aa91d1c6d4c1
parent 101 024ee27ce4fa
child 107 379a2a893fd1
equal deleted inserted replaced
102:ca045963fced 103:aa91d1c6d4c1
    53 
    53 
    54 	/**
    54 	/**
    55 	 * TODO: podporovat i složitější scénáře (např. kompilaci),
    55 	 * TODO: podporovat i složitější scénáře (např. kompilaci),
    56 	 * než jen vložení do souboru a přidání správného záhlaví.
    56 	 * než jen vložení do souboru a přidání správného záhlaví.
    57 	 *
    57 	 *
    58 	 * @param skript program k vykonání
    58 	 * @param skriptText skript k vykonání
       
    59 	 * @param skriptSoubor cesta k souboru se skriptem/programem
    59 	 * @param jazyk programovací jazyk
    60 	 * @param jazyk programovací jazyk
    60 	 * @param výstupníFormát text (výchozí) | xml (v tom případě kontrolujeme validitu)
    61 	 * @param výstupníFormát text (výchozí) | xml (v tom případě kontrolujeme validitu)
    61 	 * @param uriStránky URI aktuálně generované stránky → proměnná prostředí
    62 	 * @param uriStránky URI aktuálně generované stránky → proměnná prostředí
    62 	 * @param nadpisStránky nadpis stránky → proměnná prostředí
    63 	 * @param nadpisStránky nadpis stránky → proměnná prostředí
    63 	 * @param perexStránky perex stránky → proměnná prostředí
    64 	 * @param perexStránky perex stránky → proměnná prostředí
    64 	 * @return výstup příkazu
    65 	 * @return výstup příkazu
    65 	 */
    66 	 */
    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) {
    67 		try {
    68 		try {
    68 			System.err.println("\tInterpretuji skript v jazyce: " + jazyk);
    69 			if (isNeprázdný(skriptSoubor)) {
    69 			String interpret = interpreti.get(jazyk);
    70 				System.err.println("\tInterpretuji skript ze souboru: " + skriptSoubor);
    70 			if (interpret == null) {
       
    71 				System.err.println("Neznámý skriptovací jazyk: " + jazyk);
       
    72 				return null;
       
    73 			} else {
    71 			} 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");
    75 				f.deleteOnExit();
    86 				f.deleteOnExit();
       
    87 				f.setExecutable(true);
    76 
    88 
    77 				PrintStream ps = new PrintStream(f);
    89 				PrintStream ps = new PrintStream(f);
    78 				ps.print("#!");
    90 				ps.print("#!");
    79 				ps.println(interpret);
    91 				ps.println(interpret);
    80 				ps.println();
    92 				ps.println();
    81 				ps.print(skript);
    93 				ps.print(skriptText);
    82 				ps.close();
    94 				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 			}
    83 
   111 
    84 
   112 
    85 				String[] prostředí = new String[]{
   113 			String[] prostředí = new String[]{
    86 					"LANG=" + System.getenv("LANG"),
   114 				"LANG=" + System.getenv("LANG"),
    87 					"USER=" + System.getenv("USER"),
   115 				"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",
   116 				"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
   117 				"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
   118 				"XWG_STRANKA_SOUBOR=" + souborStránky.getAbsolutePath(), // env:absolutní cesta k souboru
    91 					"XWG_STRANKA_NADPIS=" + nadpisStránky, // env:nadpis stránky
   119 				"XWG_STRANKA_NADPIS=" + nadpisStránky, // env:nadpis stránky
    92 					"XWG_STRANKA_PEREX=" + perexStránky // env:perex stránky
   120 				"XWG_STRANKA_PEREX=" + perexStránky // env:perex stránky
    93 				};
   121 			};
    94 
   122 
    95 				f.setExecutable(true);
   123 			Runtime r = Runtime.getRuntime();
    96 				Runtime r = Runtime.getRuntime();
   124 			Process p = r.exec(new String[]{f.getAbsolutePath()}, prostředí);
    97 				Process p = r.exec(new String[]{f.getAbsolutePath()}, prostředí);
       
    98 
   125 
    99 				String výsledek = načtiProud(p.getInputStream());
   126 			String výsledek = načtiProud(p.getInputStream());
   100 				String chyby = načtiProud(p.getErrorStream());
   127 			String chyby = načtiProud(p.getErrorStream());
   101 
   128 
   102 				p.waitFor();
   129 			p.waitFor();
   103 
   130 
   104 				if (p.exitValue() == 0) {
   131 			if (p.exitValue() == 0) {
   105 					if (chyby.length() > 0) {
   132 				if (chyby.length() > 0) {
   106 						System.err.println("--- Chybový výstup skriptu -----");
   133 					System.err.println("--- Chybový výstup skriptu -----");
   107 						System.err.println(chyby);
   134 					System.err.println(chyby);
   108 						System.err.println("--------------------------------");
   135 					System.err.println("--------------------------------");
   109 						System.err.println("Nicméně skript skončil úspěšně, takže pokračujeme dál.");
   136 					System.err.println("Nicméně skript skončil úspěšně, takže pokračujeme dál.");
   110 					}
   137 				}
   111 
   138 
   112 					return připravVýstup(výsledek, výstupníFormát);
   139 				return připravVýstup(výsledek, výstupníFormát);
   113 				} else {
   140 			} else {
   114 					System.err.println("--- Standardní výstup skriptu: -----");
   141 				System.err.println("--- Standardní výstup skriptu: -----");
   115 					System.err.println(výsledek);
   142 				System.err.println(výsledek);
   116 					System.err.println("--- Cyhbový výstup skriptu: ---------");
   143 				System.err.println("--- Cyhbový výstup skriptu: ---------");
   117 					System.err.println(chyby);
   144 				System.err.println(chyby);
   118 					System.err.println("--------------------------------------");
   145 				System.err.println("--------------------------------------");
   119 					throw new RuntimeException("Návratová hodnota: " + p.exitValue());
   146 				throw new Exception("Návratová hodnota: " + p.exitValue());
   120 				}
       
   121 			}
   147 			}
   122 		} catch (Exception e) {
   148 		} catch (Exception e) {
   123 			System.err.println("Došlo k chybě při vykonávání skriptu v jazyce: " + jazyk);
   149 			System.err.println("Došlo k chybě při vykonávání skriptu v jazyce: " + jazyk);
   124 			System.err.println("--------");
   150 			System.err.println("--------");
   125 			System.err.println(skript);
   151 			System.err.println(skriptText);
   126 			System.err.println("--------");
   152 			System.err.println("--------");
   127 			e.printStackTrace(System.err);
   153 			e.printStackTrace(System.err);
   128 			return null;
   154 			return null;
   129 		}
   155 		}
   130 	}
   156 	}
   141 		} else {
   167 		} else {
   142 			return výsledek.trim();
   168 			return výsledek.trim();
   143 		}
   169 		}
   144 	}
   170 	}
   145 
   171 
       
   172 	private static boolean isNeprázdný(String s) {
       
   173 		return !(s == null || s.trim().isEmpty());
       
   174 	}
       
   175 
   146 	/**
   176 	/**
   147 	 * @param xml fragment XML vygenerovaný skriptem
   177 	 * @param xml fragment XML vygenerovaný skriptem
   148 	 * @return true v případě, že výstup je validním fragmentem XML
   178 	 * @return true v případě, že výstup je validním fragmentem XML
   149 	 */
   179 	 */
   150 	private static boolean zkontrolujXml(String xml) {
   180 	private static boolean zkontrolujXml(String xml) {