/*
* 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 javax.servlet.jsp.tagext;

/**
 * Variable information for a tag in a Tag Library;
 * This class is instantiated from the Tag Library Descriptor file (TLD)
 * and is available only at translation time.
 *
 * This object should be immutable.
 *
 * This information is only available in JSP 1.2 format TLDs or above.
 */

public class TagVariableInfo {

    /**
     * Constructor for TagVariableInfo.
     *
     * @param nameGiven value of &lt;name-given&gt;
     * @param nameFromAttribute value of &lt;name-from-attribute&gt;
     * @param className value of &lt;variable-class&gt;
     * @param declare value of &lt;declare&gt;
     * @param scope value of &lt;scope&gt;
     */
    public TagVariableInfo(
	    String nameGiven,
	    String nameFromAttribute,
	    String className,
	    boolean declare,
	    int scope) {
	this.nameGiven         = nameGiven;
	this.nameFromAttribute = nameFromAttribute;
	this.className         = className;
	this.declare           = declare;
	this.scope             = scope;
    }

    /**
     * The body of the &lt;name-given&gt; element.
     *
     * @return The variable name as a constant
     */

    public String getNameGiven() {
	return nameGiven;
    }

    /**
     * The body of the &lt;name-from-attribute&gt; element.
     * This is the name of an attribute whose (translation-time)
     * value will give the name of the variable.  One of
     * &lt;name-given&gt; or &lt;name-from-attribute&gt; is required.
     *
     * @return The attribute whose value defines the variable name
     */

    public String getNameFromAttribute() {
	return nameFromAttribute;
    }

    /**
     * The body of the &lt;variable-class&gt; element.  
     *
     * @return The name of the class of the variable or
     *         'java.lang.String' if not defined in the TLD.
     */

    public String getClassName() {
	return className;
    }

    /**
     * The body of the &lt;declare&gt; element.
     *
     * @return Whether the variable is to be declared or not.
     *         If not defined in the TLD, 'true' will be returned.
     */

    public boolean getDeclare() {
	return declare;
    }

    /**
     * The body of the &lt;scope&gt; element.
     *
     * @return The scope to give the variable.  NESTED
     *         scope will be returned if not defined in 
     *         the TLD.
     */

    public int getScope() {
	return scope;
    }


    /*
     * private fields
     */
    private String   nameGiven;         // <name-given>
    private String   nameFromAttribute; // <name-from-attribute>
    private String   className;         // <class>
    private boolean  declare;           // <declare>
    private int      scope;             // <scope>
}
