/* Copyright (2012) Schibsted ASA
 *   This file is part of Possom.
 *
 *   Possom is free software: you can redistribute it and/or modify
 *   it under the terms of the GNU Lesser General Public License as published by
 *   the Free Software Foundation, either version 3 of the License, or
 *   (at your option) any later version.
 *
 *   Possom is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU Lesser General Public License for more details.
 *
 *   You should have received a copy of the GNU Lesser General Public License
 *   along with Possom.  If not, see <http://www.gnu.org/licenses/>.
 *
 * TextMessageTag.java
 *
 * Created on May 29, 2006, 3:55 PM
 */

package no.sesat.search.view.taglib;

import java.io.IOException;
import java.util.ArrayList;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.DynamicAttributes;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import no.sesat.search.site.config.TextMessages;

/** Wraps functionality found in TextMessages into a custom tag.
 *
 *
 *
 * @version $Id$
 */

public final class TextMessageTag extends SimpleTagSupport implements DynamicAttributes{

    /**
     * Initialization of key property.
     */
    private String key;

    /**
     * Initialization of args property.
     */
    private final List<Object> args = new ArrayList<Object>();

    /**Called by the container to invoke this tag.
     * The implementation of this method is provided by the tag library developer,
     * and handles all tag processing, body iteration, etc.
     * @throws javax.servlet.jsp.JspException
     */
    @Override
    public void doTag() throws JspException {

        final PageContext cxt = (PageContext) getJspContext();
        final JspWriter out = cxt.getOut();

        try {

            final JspFragment f = getJspBody();
            if (f != null){
                f.invoke(out);
            }
            final TextMessages text = (TextMessages)cxt.findAttribute("text");

            out.print(text.getMessage(key, args.toArray()));

        } catch (IOException ex) {
            throw new JspException(ex.getMessage());
        }

    }

    /**
     * Setter for the key attribute.
     * @param value
     */
    public void setKey(final String value) {
        this.key = value;
    }

    public void setDynamicAttribute(
            final String uri,
            final String localName,
            final Object value) throws JspException {

        assert localName.startsWith("arg") : "Only dynamic attributes of format argX are supported: " + localName;

        final int i = Integer.valueOf(localName.replaceAll("arg", ""));
        while(args.size() <= i){
            args.add("");
        }
        args.set(i, value);
    }


}
