From: Felix Dörre Date: Sat, 12 Jul 2014 14:40:03 +0000 (+0200) Subject: Implement a Template-Foreach (and use in "new email certificate") X-Git-Url: https://code.wpia.club/?p=gigi.git;a=commitdiff_plain;h=ca82909d6bb910769eb756058d51d55e6d257914 Implement a Template-Foreach (and use in "new email certificate") --- diff --git a/doc/TemplateSyntax.txt b/doc/TemplateSyntax.txt index 3b4a07ca..ab4cc37d 100644 --- a/doc/TemplateSyntax.txt +++ b/doc/TemplateSyntax.txt @@ -12,3 +12,10 @@ A template is constructed from a charstream. Everything that is not in " Output/execute the text until "" only if $variable is boolean and true. +- + If $variable is an "IterableDataset" + Output/execute the text until "" repeated as $variable suggests. + Special variables that $variable defines can be used in the inner text. + + + \ No newline at end of file diff --git a/src/org/cacert/gigi/output/template/ForeachStatement.java b/src/org/cacert/gigi/output/template/ForeachStatement.java new file mode 100644 index 00000000..0b3c5269 --- /dev/null +++ b/src/org/cacert/gigi/output/template/ForeachStatement.java @@ -0,0 +1,30 @@ +package org.cacert.gigi.output.template; + +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; + +import org.cacert.gigi.Language; +import org.cacert.gigi.output.Outputable; + +final class ForeachStatement implements Outputable { + private final String variable; + private final TemplateBlock body; + + ForeachStatement(String variable, TemplateBlock body) { + this.variable = variable; + this.body = body; + } + + @Override + public void output(PrintWriter out, Language l, Map vars) { + Object o = vars.get(variable); + if (o instanceof IterableDataset) { + IterableDataset id = (IterableDataset) o; + Map subcontext = new HashMap(vars); + while (id.next(subcontext)) { + body.output(out, l, subcontext); + } + } + } +} \ No newline at end of file diff --git a/src/org/cacert/gigi/output/template/IterableDataset.java b/src/org/cacert/gigi/output/template/IterableDataset.java new file mode 100644 index 00000000..d908fccc --- /dev/null +++ b/src/org/cacert/gigi/output/template/IterableDataset.java @@ -0,0 +1,19 @@ +package org.cacert.gigi.output.template; + +import java.util.Map; + +/** + * Represents some kind of data, that may be iterated over in a template. + */ +public interface IterableDataset { + /** + * Moves to the next Dataset. + * + * @param vars + * the variables used in this template. They need to be updated + * for each line. + * @return true, iff there was a data-line "installed". False of this set is + * already empty. + */ + public boolean next(Map vars); +} diff --git a/src/org/cacert/gigi/output/template/Template.java b/src/org/cacert/gigi/output/template/Template.java index bfff646f..5a82cf7d 100644 --- a/src/org/cacert/gigi/output/template/Template.java +++ b/src/org/cacert/gigi/output/template/Template.java @@ -24,7 +24,7 @@ public class Template implements Outputable { long lastLoaded; File source; - private static final Pattern IF_PATTERN = Pattern.compile(" ?if\\(\\$([^)]+)\\) ?\\{ ?"); + private static final Pattern CONTROL_PATTERN = Pattern.compile(" ?([a-z]+)\\(\\$([^)]+)\\) ?\\{ ?"); public Template(URL u) { try { @@ -79,11 +79,18 @@ public class Template implements Outputable { buf.delete(buf.length() - 2, buf.length()); String com = buf.toString().replace("\n", ""); buf.delete(0, buf.length()); - Matcher m = IF_PATTERN.matcher(com); + Matcher m = CONTROL_PATTERN.matcher(com); if (m.matches()) { - final String variable = m.group(1); - final TemplateBlock body = parse(r); - commands.add(new IfStatement(variable, body)); + String type = m.group(1); + String variable = m.group(2); + TemplateBlock body = parse(r); + if (type.equals("if")) { + commands.add(new IfStatement(variable, body)); + } else if (type.equals("foreach")) { + commands.add(new ForeachStatement(variable, body)); + } else { + throw new IOException("Syntax error: unknown control structure: " + type); + } continue; } if (com.matches(" ?\\} ?")) { diff --git a/src/org/cacert/gigi/pages/account/MailCertificateAdd.java b/src/org/cacert/gigi/pages/account/MailCertificateAdd.java index 836f48c4..769f9e1a 100644 --- a/src/org/cacert/gigi/pages/account/MailCertificateAdd.java +++ b/src/org/cacert/gigi/pages/account/MailCertificateAdd.java @@ -2,14 +2,20 @@ package org.cacert.gigi.pages.account; import java.io.IOException; import java.io.PrintWriter; +import java.sql.PreparedStatement; +import java.sql.ResultSet; import java.sql.SQLException; import java.util.HashMap; +import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.cacert.gigi.Certificate; +import org.cacert.gigi.User; +import org.cacert.gigi.database.DatabaseConnection; import org.cacert.gigi.output.ClientCSRGenerate; +import org.cacert.gigi.output.template.IterableDataset; import org.cacert.gigi.pages.LoginPage; import org.cacert.gigi.pages.Page; @@ -24,7 +30,35 @@ public class MailCertificateAdd extends Page { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { HashMap vars = new HashMap(); vars.put("CCA", "CCA"); - getDefaultTemplate().output(resp.getWriter(), getLanguage(req), vars); + + User u = LoginPage.getUser(req); + try { + PreparedStatement ps = DatabaseConnection.getInstance().prepare( + "SELECT `id`,`email` from `email` WHERE `memid`=? AND `deleted`=0"); + ps.setInt(1, u.getId()); + final ResultSet rs = ps.executeQuery(); + vars.put("emails", new IterableDataset() { + + @Override + public boolean next(Map vars) { + try { + if (!rs.next()) { + return false; + } + vars.put("id", rs.getString(1)); + vars.put("value", rs.getString(2)); + return true; + } catch (SQLException e) { + e.printStackTrace(); + } + return false; + } + }); + getDefaultTemplate().output(resp.getWriter(), getLanguage(req), vars); + rs.close(); + } catch (SQLException e) { + e.printStackTrace(); + } } @Override diff --git a/src/org/cacert/gigi/pages/account/MailCertificateAdd.templ b/src/org/cacert/gigi/pages/account/MailCertificateAdd.templ index 51a7e695..6ce1b15b 100644 --- a/src/org/cacert/gigi/pages/account/MailCertificateAdd.templ +++ b/src/org/cacert/gigi/pages/account/MailCertificateAdd.templ @@ -19,12 +19,13 @@ - + - - + + - + +