38 * |
38 * |
39 * @author František Kučera (frantovo.cz) |
39 * @author František Kučera (frantovo.cz) |
40 */ |
40 */ |
41 public class Skriptování { |
41 public class Skriptování { |
42 |
42 |
|
43 private enum FORMÁT { |
|
44 |
|
45 xml, |
|
46 xhtml, |
|
47 text |
|
48 } |
43 /** |
49 /** |
44 * klíč = jazyk – např. bash |
50 * klíč = jazyk – např. bash |
45 * hodnota = interpret – např. /bin/bash |
51 * hodnota = interpret – např. /bin/bash |
46 */ |
52 */ |
47 private static final Map<String, String> interpreti; |
53 private static final Map<String, String> interpreti; |
68 * @param perexStránky perex stránky → proměnná prostředí |
74 * @param perexStránky perex stránky → proměnná prostředí |
69 * @return výstup příkazu buď jako textový řetězec nebo jako XML (DOMSource) |
75 * @return výstup příkazu buď jako textový řetězec nebo jako XML (DOMSource) |
70 */ |
76 */ |
71 public static Source interpretuj(String skriptText, String skriptSoubor, String jazyk, String výstupníFormát, String uriStránky, String nadpisStránky, String perexStránky) throws Exception { |
77 public static Source interpretuj(String skriptText, String skriptSoubor, String jazyk, String výstupníFormát, String uriStránky, String nadpisStránky, String perexStránky) throws Exception { |
72 String výstupSkriptu = získejVýstupSkriptu(skriptText, skriptSoubor, jazyk, uriStránky, nadpisStránky, perexStránky); |
78 String výstupSkriptu = získejVýstupSkriptu(skriptText, skriptSoubor, jazyk, uriStránky, nadpisStránky, perexStránky); |
73 return vyrobXml(výstupSkriptu, "xml".equals(výstupníFormát)); |
79 return vyrobXml(výstupSkriptu, zjistiFormát(výstupníFormát)); |
74 } |
80 } |
75 |
81 |
76 private static String získejVýstupSkriptu(String skriptText, String skriptSoubor, String jazyk, String uriStránky, String nadpisStránky, String perexStránky) throws Exception { |
82 private static String získejVýstupSkriptu(String skriptText, String skriptSoubor, String jazyk, String uriStránky, String nadpisStránky, String perexStránky) throws Exception { |
77 |
83 |
78 try { |
84 try { |
167 |
173 |
168 private static boolean isNeprázdný(String s) { |
174 private static boolean isNeprázdný(String s) { |
169 return !(s == null || s.trim().isEmpty()); |
175 return !(s == null || s.trim().isEmpty()); |
170 } |
176 } |
171 |
177 |
|
178 private static FORMÁT zjistiFormát(String výstupníFormát) { |
|
179 try { |
|
180 return FORMÁT.valueOf(výstupníFormát); |
|
181 } catch (NullPointerException e) { |
|
182 return FORMÁT.text; |
|
183 } catch (IllegalArgumentException e) { |
|
184 return FORMÁT.text; |
|
185 } |
|
186 } |
|
187 |
172 /** |
188 /** |
173 * @param zadání výstup vygenerovaný skriptem |
189 * @param zadání výstup vygenerovaný skriptem |
174 * @param xmlFormát formát zadání: true = xml fragment | false = prostý text |
190 * @param xmlFormát formát zadání: true = xml fragment | false = prostý text |
175 * @return xml fragment nebo prostý text zabalený do html/body |
191 * @return xml fragment nebo prostý text zabalený do html/body |
176 * @throws Exception |
192 * @throws Exception |
177 */ |
193 */ |
178 private static Source vyrobXml(String zadání, boolean xmlFormát) throws Exception { |
194 private static Source vyrobXml(String zadání, FORMÁT formát) throws Exception { |
179 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
195 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
180 DocumentBuilder db = dbf.newDocumentBuilder(); |
196 DocumentBuilder db = dbf.newDocumentBuilder(); |
181 Document d; |
197 Document d; |
182 |
198 |
183 if (xmlFormát) { |
199 |
184 try { |
200 if (formát == FORMÁT.text) { |
185 zadání = "<html xmlns='" + XHTML + "' xmlns:m='" + MAKRO + "'><body>" + zadání + "</body></html>"; |
|
186 d = db.parse(new ByteArrayInputStream(zadání.getBytes())); |
|
187 } catch (Exception e) { |
|
188 System.err.println("Chyba: Skript vrátil neplatné XML."); |
|
189 throw e; |
|
190 } |
|
191 } else { |
|
192 d = db.newDocument(); |
201 d = db.newDocument(); |
193 Node html = d.createElementNS(XHTML, "html"); |
202 Node html = d.createElementNS(XHTML, "html"); |
194 Node body = d.createElementNS(XHTML, "body"); |
203 Node body = d.createElementNS(XHTML, "body"); |
195 Node text = d.createTextNode(zadání); |
204 Node text = d.createTextNode(zadání); |
196 body.appendChild(text); |
205 body.appendChild(text); |
197 html.appendChild(body); |
206 html.appendChild(body); |
198 d.appendChild(html); |
207 d.appendChild(html); |
|
208 } else { |
|
209 if (formát == FORMÁT.xhtml) { |
|
210 zadání = "<html xmlns='" + XHTML + "' xmlns:m='" + MAKRO + "'><body>" + zadání + "</body></html>"; |
|
211 } |
|
212 try { |
|
213 d = db.parse(new ByteArrayInputStream(zadání.getBytes())); |
|
214 } catch (Exception e) { |
|
215 System.err.println("Chyba: Skript vrátil neplatné XML."); |
|
216 throw e; |
|
217 } |
199 } |
218 } |
200 |
219 |
201 return new DOMSource(d); |
220 return new DOMSource(d); |
202 } |
221 } |
203 } |
222 } |