package org.apache.tiles.autotag.freemarker.test;

import java.io.IOException;
import java.util.Map;

import org.apache.tiles.autotag.core.runtime.AutotagRuntime;
import org.apache.tiles.request.Request;

import freemarker.core.Environment;
import freemarker.template.TemplateDirectiveBody;
import freemarker.template.TemplateDirectiveModel;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModel;

/**
 * Documentation of the DoStuffNoBody class.
 */
public class DoStuffNoBodyFMModel implements TemplateDirectiveModel {

    /**
     * The template model.
     */
    private org.apache.tiles.autotag.template.DoStuffNoBodyTemplate model;

    /**
     * Constructor.
     *
     * @param model
     *            The template model.
     */
    public DoStuffNoBodyFMModel(org.apache.tiles.autotag.template.DoStuffNoBodyTemplate model) {
        this.model = model;
    }

    /** {@inheritDoc} */
    @SuppressWarnings("unchecked")
    @Override
    public void execute(Environment env, @SuppressWarnings("rawtypes") Map params, TemplateModel[] loopVars,
            TemplateDirectiveBody body) throws TemplateException, IOException {
        AutotagRuntime runtime = new org.apache.tiles.autotag.freemarker.test.Runtime();
        if (runtime instanceof TemplateDirectiveModel) {
            ((TemplateDirectiveModel) runtime).execute(env, params, loopVars, body);
        }
        Request request = runtime.createRequest();
        model.execute(
            (java.lang.Double) runtime.getParameter("one", null),
            (java.lang.Float) runtime.getParameter("two", 0.0f),
            (java.util.Date) runtime.getParameter("three", null),
                request
        );
    }
}
