/*
 * $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.
 */

package org.apache.tiles.jsp.taglib;

import javax.servlet.jsp.tagext.TagData;
import javax.servlet.jsp.tagext.TagExtraInfo;
import javax.servlet.jsp.tagext.VariableInfo;

import org.apache.tiles.autotag.jsp.runtime.BodylessTag;
import org.apache.tiles.request.Request;
import org.apache.tiles.template.ImportAttributeModel;

/**
 * Exposes am attribute as a scripting variable within the page.
 *
 * @since Tiles 1.0
 * @version $Rev$ $Date$
 */
public class UseAttributeTag extends BodylessTag {

    /**
     * The template model.
     */
    private ImportAttributeModel model = new ImportAttributeModel();

    /**
     * The id of the imported scripting variable.
     */
    private String id;

    /**
     * The scope name.
     */
    private String scopeName = null;

    /**
     * The name of the attribute.
     */
    private String name = null;

    /**
     * Flag that, if <code>true</code>, ignores exceptions.
     */
    private boolean ignore = false;

    /**
     * Class name of object.
     */
    private String classname = null;

    /**
     * Returns the id of the imported scripting variable.
     *
     * @return The id of the imported scripting variable.
     * @since 2.2.0
     */
    public String getId() {
        return id;
    }

    /**
     * Sets the id of the imported scripting variable.
     *
     * @param id
     *            The id of the imported scripting variable.
     * @since 2.2.0
     */
    public void setId(String id) {
        this.id = id;
    }

    /**
     * Set the scope.
     *
     * @param scope
     *            Scope.
     */
    public void setScope(String scope) {
        this.scopeName = scope;
    }

    /**
     * Get scope.
     *
     * @return Scope.
     */
    public String getScope() {
        return scopeName;
    }

    /**
     * Get the name.
     *
     * @return Name.
     */
    public String getName() {
        return name;
    }

    /**
     * Set the name.
     *
     * @param name
     *            The new name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * Set ignore flag.
     *
     * @param ignore
     *            default: <code>false</code>: Exception is thrown when
     *            attribute is not found, set to <code>
     *               true</code> to
     *            ignore missing attributes silently
     */
    public void setIgnore(boolean ignore) {
        this.ignore = ignore;
    }

    /**
     * Get ignore flag.
     *
     * @return default: <code>false</code>: Exception is thrown when attribute
     *         is not found, set to <code>
     *         true</code> to ignore missing
     *         attributes silently
     */
    public boolean isIgnore() {
        return ignore;
    }

    /**
     * Get class name.
     *
     * @return class name
     */
    public String getClassname() {
        return classname;

    }

    /**
     * Set the class name.
     *
     * @param name
     *            The new class name.
     */
    public void setClassname(String name) {
        this.classname = name;
    }

    /** {@inheritDoc} */
    @Override
    public void execute(Request request) {
        model.execute(name, scopeName, id, ignore, request);
    }

    /**
     * Returns the scripting variable to use.
     *
     * @return The scripting variable.
     */
    public String getScriptingVariable() {
        return id == null ? getName() : id;
    }

    /**
     * Implementation of <code>TagExtraInfo</code> which identifies the
     * scripting object(s) to be made visible.
     */
    public static class Tei extends TagExtraInfo {

        /** {@inheritDoc} */
        @Override
        public VariableInfo[] getVariableInfo(TagData data) {
            String classname = data.getAttributeString("classname");
            if (classname == null) {
                classname = "java.lang.Object";
            }

            String id = data.getAttributeString("id");
            if (id == null) {
                id = data.getAttributeString("name");
            }

            return new VariableInfo[] { new VariableInfo(id, classname, true,
                    VariableInfo.AT_END) };

        }
    }
}
