/*
 * This file was automatically generated by Apache Tiles Autotag.
 */
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
        );
    }
}
