#*
 * $Id$
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *#/*
 * This file was automatically generated by Apache Tiles Autotag.
 */
package ${packageName};

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

#if(${clazz.hasBody()})
import org.apache.tiles.autotag.core.runtime.ModelBody;
#end
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;

/**
#foreach($line in $stringTool.splitOnNewlines(${clazz.documentation}))
 * ${line}
#end
 */
public class ${clazz.tagClassPrefix}FMModel implements TemplateDirectiveModel {

    /**
     * The template model.
     */
    private ${clazz.name} model;

    /**
     * Constructor.
     *
     * @param model
     *            The template model.
     */
    public ${clazz.tagClassPrefix}FMModel(${clazz.name} 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 ${runtimeClass}();
        if (runtime instanceof TemplateDirectiveModel) {
            ((TemplateDirectiveModel) runtime).execute(env, params, loopVars, body);
        }
        Request request = runtime.createRequest();
#if(${clazz.hasBody()})
        ModelBody modelBody = runtime.createModelBody();
#end
        model.execute(
#foreach($parameter in ${clazz.parameters})
            ($stringTool.getClassToCast(${parameter.type})) runtime.getParameter("${parameter.exportedName}", $stringTool.getDefaultValue(${parameter.type}, ${parameter.defaultValue})),
#end
                request#if(${clazz.hasBody()}), modelBody#end

        );
    }
}
