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

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

import org.apache.tiles.autotag.core.runtime.ModelBody;
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 DoStuff class.
 */
public class DoStuffFMModel implements TemplateDirectiveModel {

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

    /**
     * Constructor.
     *
     * @param model
     *            The template model.
     */
    public DoStuffFMModel(org.apache.tiles.autotag.template.DoStuffTemplate 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();
        ModelBody modelBody = runtime.createModelBody();
        model.execute(
            (java.lang.String) runtime.getParameter("one", null),
            (java.lang.Integer) runtime.getParameter("two", 0),
            (java.lang.Boolean) runtime.getParameter("three", false),
                request, modelBody
        );
    }
}
