/**
 * ***************************************************************
 * JADE - Java Agent DEvelopment Framework is a framework to develop
 * multi-agent systems in compliance with the FIPA specifications.
 * Copyright (C) 2000 CSELT S.p.A.
 * 
 * GNU Lesser General Public License
 * 
 * This library 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,
 * version 2.1 of the License.
 * 
 * This library 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 this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA  02111-1307, USA.
 * **************************************************************
 */
package jade.content;

import jade.util.leap.List;
import jade.util.leap.ArrayList;
import jade.util.leap.Iterator;

/**
 * Utility class to deal with a list of content elements as a
 * content element itself.
 * @author Federico Bergenti - Universita` di Parma
 */
public class ContentElementList implements ContentElement {
  	private List elements = new ArrayList();
	
  	/**
   	 * Construct a ContentElementList object 
   	 */
  	public ContentElementList() {
  	}
  
    /**
     * Adds a new element (that must be a content element) to this 
     * content element list.
     * @param element The element to add.
     */
    public void add(ContentElement element) {
        elements.add(element);
    } 

    /**
     * Retrieves the number of elements in this content element list.
     * @return The number of elements.
     */
    public int size() {
        return elements.size();
    } 

    /**
     * Retrieves the <code>i</code>-th element in this content element list.
     * @param i The index of the element to retrieve.
     * @return The element.
     */
    public ContentElement get(int i) {
        return (ContentElement) elements.get(i);
    } 

    /**
     * @return An <code>Iterator</code> over the elements of this
     * content element list.
     */
    public Iterator iterator() {
        return elements.iterator();
    } 

    /**
     * Clear all the elements in this content element list.
     */
    public void clear() {
			elements.clear();
    }

   	/**
     * Test if a given content element is contained in this 
     * content element list.
     * @return <code>true</code> if the given content element is contained
     * in this content element list.
     */
    public boolean contains (ContentElement element) {
			return elements.contains(element);
    }

   	/**
     * Returns the position of an element within this content element list.
     * @return The position of an element within this content element list
     * or -1 if the given element is not contained in this content element 
     * list.
     */
    public int indexOf (ContentElement element) {
			return elements.indexOf(element);
    }

   	/**
     * Removes the element at the given position from this content
     * element list.
     * @return The removed element.
     */
    public ContentElement remove (int index) {
			return (ContentElement)elements.remove(index);
    }

   	/**
     * Test if the content element list is empty.
     * @return <code>true</code> if this content element list does 
     * not contain any element.
     */
    public boolean isEmpty () {
			return elements.isEmpty();
    }

   	/**
     * Retrieve all elements in this content element list in the form of 
     * an array.
     * @return An array containing all elements in this content element 
     * list.
     */
    public ContentElement[] toArray () {
			int size = elements.size();
      ContentElement[] tmp = new ContentElement[size];
      for (int i = 0; i < size; i++)
      	tmp[i] = (ContentElement)elements.get(i);
      return tmp;
    }

}
