package org.webpieces.templating.impl.tags;
import java.io.PrintWriter;
import java.nio.charset.Charset;
import java.util.Map;
import org.webpieces.ctx.api.Current;
import org.webpieces.ctx.api.RequestContext;
import org.webpieces.templating.api.ClosureUtil;
import org.webpieces.templating.api.HtmlTag;
import org.webpieces.templating.api.TemplateUtil;
import org.webpieces.templating.impl.GroovyTemplateSuperclass;
import groovy.lang.Closure;
public class FormTag implements HtmlTag {
private Charset defaultFormAcceptEncoding;
public FormTag(Charset defaultFormAcceptEncoding) {
this.defaultFormAcceptEncoding = defaultFormAcceptEncoding;
}
@Override
public void runTag(Map<Object, Object> args, Closure<?> body, PrintWriter out, GroovyTemplateSuperclass template, String srcLocation) {
Object action = args.get("action");
if(action == null)
throw new IllegalArgumentException("#{form/}# tag must have an action argument like #{form action:@ROUTE[:]}#. "+srcLocation);
String url = action.toString();
String method = "POST";
if (args.containsKey("method"))
method = args.get("method").toString();
String encoding = defaultFormAcceptEncoding.name();
if(args.containsKey("accept-charset"))
encoding = args.get("accept-charset").toString();
String enctype = (String) args.get("enctype");
if (enctype == null)
enctype = "application/x-www-form-urlencoded";
String secureToken = Current.session().getSecureToken();
String tokenKeyName = RequestContext.SECURE_TOKEN_FORM_NAME;
String formHeader = "<form action=`" + url + "` method=`" + method.toLowerCase() + "` accept-charset=`" + encoding.toLowerCase()
+ "` enctype=`" + enctype + "`" + TemplateUtil.serialize(args, "action", "method", "accept-charset", "enctype") + ">";
String secureInputElement = " <input type=`hidden` name=`"+tokenKeyName+"` value=`"+secureToken+"`>";
out.println(formHeader.replaceAll("`", "\""));
out.println(secureInputElement.replaceAll("`", "\""));
out.println(ClosureUtil.toString(getName(), body, null));
out.print("</form>");
}
@Override
public String getName() {
return "form";
}
}