]> WPIA git - gigi.git/blobdiff - src/org/cacert/gigi/output/template/Form.java
fix: re-display form on error in some cases.
[gigi.git] / src / org / cacert / gigi / output / template / Form.java
index 3f7ab6d1d06750fdeb7789e7a77149df39ec43c6..1eb0efa04e5f8ca4a87fc906bf2906f3eb7d3a4d 100644 (file)
@@ -2,6 +2,7 @@ package org.cacert.gigi.output.template;
 
 import java.io.IOException;
 import java.io.PrintWriter;
+import java.util.HashMap;
 import java.util.Map;
 
 import javax.servlet.http.HttpServletRequest;
@@ -9,6 +10,7 @@ import javax.servlet.http.HttpSession;
 
 import org.cacert.gigi.GigiApiException;
 import org.cacert.gigi.localisation.Language;
+import org.cacert.gigi.pages.LoginPage;
 import org.cacert.gigi.util.RandomToken;
 
 /**
@@ -60,6 +62,32 @@ public abstract class Form implements Outputable {
      */
     public abstract boolean submit(PrintWriter out, HttpServletRequest req) throws GigiApiException;
 
+    /**
+     * Calls {@link #submit(PrintWriter, HttpServletRequest)} while catching and
+     * displaying errors ({@link GigiApiException}), and re-outputing the form
+     * via {@link #output(PrintWriter, Language, Map)}.
+     * 
+     * @param out
+     *            the target to write the form and errors to
+     * @param req
+     *            the request that this submit originated (for submit and for
+     *            language)
+     * @return as {@link #submit(PrintWriter, HttpServletRequest)}: true, iff
+     *         the form succeeded and the user should be redirected.
+     */
+    public boolean submitProtected(PrintWriter out, HttpServletRequest req) {
+        try {
+            boolean succeeded = submit(out, req);
+            if (succeeded) {
+                return true;
+            }
+        } catch (GigiApiException e) {
+            e.format(out, LoginPage.getLanguage(req));
+        }
+        output(out, LoginPage.getLanguage(req), new HashMap<String, Object>());
+        return false;
+    }
+
     protected String getCsrfFieldName() {
         return CSRF_FIELD;
     }