package ${packageName};
#*
 * $Id: tiles-jsp.tld 836180 2009-11-14 14:00:02Z apetrelli $
 *
 * 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.
 *#
import java.io.IOException;
import java.io.Writer;

#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 org.apache.velocity.context.InternalContextAdapter;
import org.apache.velocity.runtime.directive.Directive;
import org.apache.velocity.runtime.parser.node.Node;

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

    /**
     * The template model.
     */
    private ${clazz.name} model = new ${clazz.name}();

    /** {@inheritDoc} */
    @Override
    public String getName() {
        return "${suite.name}_${clazz.tagName}";
    }

    /** {@inheritDoc} */
    @Override
    public int getType() {
        return #if(${clazz.hasBody()})BLOCK#{else}LINE#{end};
    }

    /** {@inheritDoc} */
    @Override
    public boolean render(InternalContextAdapter context, Writer writer, Node node)
            throws IOException {
        AutotagRuntime runtime = new ${runtimeClass}();
        if (runtime instanceof Directive) {
            ((Directive) runtime).render(context, writer, node);
        }
        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

        );
        return true;
    }
}
