]> WPIA git - gigi.git/blobdiff - src/org/cacert/gigi/output/Template.java
Implement template hot-redeploy :-).
[gigi.git] / src / org / cacert / gigi / output / Template.java
index c64ab15e36596dbe6fc3b897491a476a93840c71..0b0fe3ba4067a7e0de5efbb63243c633d3ae774a 100644 (file)
@@ -1,66 +1,98 @@
 package org.cacert.gigi.output;
 
 import java.io.EOFException;
+import java.io.File;
+import java.io.FileInputStream;
 import java.io.IOException;
+import java.io.InputStreamReader;
 import java.io.PrintWriter;
 import java.io.Reader;
+import java.net.URISyntaxException;
+import java.net.URL;
 import java.util.LinkedList;
 import java.util.Map;
 
+import org.cacert.gigi.DevelLauncher;
 import org.cacert.gigi.Language;
 
 public class Template implements Outputable {
        String[] contents;
        Outputable[] vars;
 
-       public Template(Reader r) {
+       long lastLoaded;
+       File source;
+
+       public Template(URL u) {
                try {
-                       LinkedList<String> splitted = new LinkedList<String>();
-                       LinkedList<Outputable> commands = new LinkedList<Outputable>();
-                       StringBuffer buf = new StringBuffer();
-                       int ch = r.read();
-                       outer : while (true) {
-                               while (!endsWith(buf, "<?")) {
-                                       if (ch == -1) {
-                                               break outer;
-                                       }
-                                       buf.append((char) ch);
-                                       ch = r.read();
+                       Reader r = new InputStreamReader(u.openStream(), "UTF-8");
+                       try {
+                               if (u.getProtocol().equals("file") && DevelLauncher.DEVEL) {
+                                       source = new File(u.toURI());
+                                       lastLoaded = source.lastModified() + 1000;
                                }
-                               buf.delete(buf.length() - 2, buf.length());
-                               splitted.add(buf.toString());
-                               buf.delete(0, buf.length());
-                               while (!endsWith(buf, "?>")) {
-                                       buf.append((char) ch);
-                                       ch = r.read();
-                                       if (ch == -1) {
-                                               throw new EOFException();
-                                       }
-                               }
-                               buf.delete(buf.length() - 2, buf.length());
-                               commands.add(parseCommand(buf.toString()));
-                               buf.delete(0, buf.length());
+                       } catch (URISyntaxException e) {
+                               e.printStackTrace();
                        }
-                       splitted.add(buf.toString());
-                       contents = splitted.toArray(new String[splitted.size()]);
-                       vars = commands.toArray(new Outputable[commands.size()]);
+                       parse(r);
+               } catch (IOException e) {
+                       throw new Error(e);
+               }
+       }
+
+       public Template(Reader r) {
+               try {
+                       parse(r);
                } catch (IOException e) {
                        throw new Error(e);
                }
        }
+
+       private void parse(Reader r) throws IOException {
+               LinkedList<String> splitted = new LinkedList<String>();
+               LinkedList<Outputable> commands = new LinkedList<Outputable>();
+               StringBuffer buf = new StringBuffer();
+               int ch = r.read();
+               outer: while (true) {
+                       while (!endsWith(buf, "<?")) {
+                               if (ch == -1) {
+                                       break outer;
+                               }
+                               buf.append((char) ch);
+                               ch = r.read();
+                       }
+                       buf.delete(buf.length() - 2, buf.length());
+                       splitted.add(buf.toString());
+                       buf.delete(0, buf.length());
+                       while (!endsWith(buf, "?>")) {
+                               buf.append((char) ch);
+                               ch = r.read();
+                               if (ch == -1) {
+                                       throw new EOFException();
+                               }
+                       }
+                       buf.delete(buf.length() - 2, buf.length());
+                       commands.add(parseCommand(buf.toString()));
+                       buf.delete(0, buf.length());
+               }
+               splitted.add(buf.toString());
+               contents = splitted.toArray(new String[splitted.size()]);
+               vars = commands.toArray(new Outputable[commands.size()]);
+               r.close();
+       }
+
        private boolean endsWith(StringBuffer buf, String string) {
                return buf.length() >= string.length()
-                               && buf.substring(buf.length() - string.length(), buf.length())
-                                               .equals(string);
+                       && buf.substring(buf.length() - string.length(), buf.length()).equals(string);
        }
+
        private Outputable parseCommand(String s2) {
+               s2 = s2.replace("\n", "");
                if (s2.startsWith("=_")) {
                        final String raw = s2.substring(2);
                        return new Outputable() {
 
                                @Override
-                               public void output(PrintWriter out, Language l,
-                                               Map<String, Object> vars) {
+                               public void output(PrintWriter out, Language l, Map<String, Object> vars) {
                                        out.print(l.getTranslation(raw));
                                }
                        };
@@ -69,8 +101,7 @@ public class Template implements Outputable {
                        return new Outputable() {
 
                                @Override
-                               public void output(PrintWriter out, Language l,
-                                               Map<String, Object> vars) {
+                               public void output(PrintWriter out, Language l, Map<String, Object> vars) {
                                        outputVar(out, l, vars, raw);
                                }
                        };
@@ -86,8 +117,7 @@ public class Template implements Outputable {
                        return new Outputable() {
 
                                @Override
-                               public void output(PrintWriter out, Language l,
-                                               Map<String, Object> vars) {
+                               public void output(PrintWriter out, Language l, Map<String, Object> vars) {
                                        String[] parts = l.getTranslation(text).split("%s");
                                        String[] myvars = store.toArray(new String[store.size()]);
                                        out.print(parts[0]);
@@ -102,7 +132,19 @@ public class Template implements Outputable {
                }
                return null;
        }
+
        public void output(PrintWriter out, Language l, Map<String, Object> vars) {
+               if (source != null && DevelLauncher.DEVEL) {
+                       if (lastLoaded < source.lastModified()) {
+                               try {
+                                       System.out.println("Reloading template.... " + source);
+                                       parse(new InputStreamReader(new FileInputStream(source), "UTF-8"));
+                                       lastLoaded = source.lastModified() + 1000;
+                               } catch (IOException e) {
+                                       e.printStackTrace();
+                               }
+                       }
+               }
                for (int i = 0; i < contents.length; i++) {
                        out.print(contents[i]);
                        if (i < this.vars.length) {
@@ -110,8 +152,8 @@ public class Template implements Outputable {
                        }
                }
        }
-       private void outputVar(PrintWriter out, Language l,
-                       Map<String, Object> vars, String varname) {
+
+       private void outputVar(PrintWriter out, Language l, Map<String, Object> vars, String varname) {
                Object s = vars.get(varname);
 
                if (s == null) {