/*******************************************************************************
 * Copyright (c) 2001, 2004 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.wst.dtd.core.internal.saxparser;

import java.util.Enumeration;
import java.util.Vector;

public class Attlist extends BaseNode {
	Vector attDefs = new Vector();

	/**
	 * Constructor.
	 * 
	 * @param name
	 *            This attribute list's name; this value is also known as the
	 *            Element type.
	 */
	public Attlist(String name, String ownerDTD) {
		this(name, ownerDTD, null, null);
	}

	public Attlist(String name, String ownerDTD, String comment, ErrorMessage errorMessage) {
		super(name, ownerDTD, comment, errorMessage);
	}


	/**
	 * Adds the specified attribute definition to the end of this attribute
	 * list .
	 * 
	 * @param attDef
	 *            Attribute definition to add to this atribute list.
	 * @return =true if the attribute definition does not already exist in
	 *         this attribute list; otherwise, =false.
	 * @see #elementAt
	 * @see #getAttDef
	 * @see #contains
	 * @see #size
	 */
	public boolean addElement(AttNode attDef) {
		if (contains(attDef.name))
			return false;
		this.attDefs.addElement(attDef);
		return true;
	}

	/**
	 * Returns the attribute definition at the specified <var>index</var> in
	 * this attribute list
	 * 
	 * @param index
	 *            Index into this list of attribute definitions.
	 * @return Attribute definition at the specified index, or <var>null</var>
	 *         if an invalid index.
	 * @see #addElement
	 * @see #getAttDef
	 * @see #contains
	 * @see #size
	 */
	public AttNode elementAt(int index) {
		return (AttNode) this.attDefs.elementAt(index);
	}

	/**
	 * Returns the attribute definition that matches the specified attribute
	 * definition name in this attribute list.
	 * 
	 * @param attDefName
	 *            Attribute definition name to match in this attribute list.
	 * @return The matching attribute definition, or <var>null</var> if the
	 *         attribute is not currently defined.
	 * @see #addElement
	 * @see #elementAt
	 * @see #contains
	 * @see #size
	 * @see #elements
	 */
	public AttNode getAttDef(String attDefName) {
		for (int i = 0; i < size(); i++) {
			AttNode ad = elementAt(i);
			if (attDefName.equals(ad.name))
				return ad;
		}
		return null;
	}

	/**
	 * Returns whether the specified attribute definition name is currently
	 * defined in this attribute list.
	 * 
	 * @param attDefName
	 *            Attribute definition name to match in this attribute list.
	 * @return =true if <var>attDefName</var> is defined; otherwise, =false.
	 * @see #addElement
	 * @see #elementAt
	 * @see #getAttDef
	 * @see #size
	 * @see #elements
	 */
	public boolean contains(String attDefName) {
		return null != getAttDef(attDefName);
	}

	/**
	 * Returns the number of attribute definitions in this attribute list.
	 * 
	 * @return Number of attribute list definitions, or <var>null</var> if no
	 *         definitions defined.
	 * @see #addElement
	 * @see #elementAt
	 * @see #getAttDef
	 * @see #contains
	 */
	public int size() {
		return this.attDefs.size();
	}

	/**
	 * Returns an enumeration of all attribute definitions in this attribute
	 * list.
	 * 
	 * @return An enumeration of all attribute definitions, or <var>null</var>
	 *         if none specified.
	 * @see #addElement
	 * @see #elementAt
	 * @see #getAttDef
	 * @see #contains
	 * @see #size
	 */
	public Enumeration elements() {
		return this.attDefs.elements();
	}

	void setAttDefs(Vector attrs) {
		attDefs = attrs;
	}
}
