package eu.dnetlib.dlms.jdbc;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;

/**
 * This class wraps a Collection of DataResult that is the content of a ResultSet, together with a ColumnInfo array that
 * describes each column of the DataResult instances in the list.
 * 
 * @author lexis
 * 
 */
public class DataResultsContainer {

	/** Content on which a ResultSet iterates. Each DataResult element is a ResultSet row. */
	private Collection<DataResult> dataResultList;
	/**
	 * Description of the column of a ResultSet row, i.e. columnInfo[i] describes the i-th element of each DataResult in
	 * dataResultList.
	 */
	private ColumnInfo[] columnInfo;

	/**
	 * Adds the given dataresult to the current dataResultList collection.
	 * 
	 * @param dr
	 *            DataResult to add
	 * @return true if the collection dataResultList changed after dr has been added.
	 * @see {@link java.util.Collection#add(Object)}.
	 */
	public boolean addDataResult(final DataResult dr) {
		return this.dataResultList.add(dr);
	}

	/**
	 * Puts colInfo at index position of the columnInfo array.
	 * 
	 * @param index
	 *            int position in the columnInfo array
	 * @param colInfo
	 *            ColumnInfo
	 * @throws SQLException
	 *             if the array is not yet initialized
	 */
	public void addColumnInfo(final int index, final ColumnInfo colInfo) throws SQLException {
		if (this.columnInfo == null)
			throw new SQLException("columnInfo not yet initialized");
		this.columnInfo[index] = colInfo;
	}

	/**
	 * Constructor. Initializes dataResultList as an ArrayList, so that DataResult elements can be eventually added to
	 * it calling the method addDataResult.
	 */
	public DataResultsContainer() {
		this.dataResultList = new ArrayList<DataResult>(0);
	}

	/**
	 * Constructor.
	 * 
	 * @param dataResultList
	 *            Collection of DataResult
	 * @param columnInfo
	 *            ColumnInfo[]
	 */
	public DataResultsContainer(final Collection<DataResult> dataResultList, final ColumnInfo[] columnInfo) {
		this.dataResultList = dataResultList;
		this.columnInfo = columnInfo;
	}

	public Collection<DataResult> getDataResultList() {
		return this.dataResultList;
	}

	public void setDataResultList(final Collection<DataResult> dataResultList) {
		this.dataResultList = dataResultList;
	}

	public ColumnInfo[] getColumnInfo() {
		return this.columnInfo;
	}

	public void setColumnInfo(final ColumnInfo[] columnInfo) {
		this.columnInfo = columnInfo;
	}

	/**
	 * {@inheritDoc}
	 * 
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "DataResultsContainer [columnInfo=" + Arrays.toString(this.columnInfo) + ", dataResultList=" + this.dataResultList + "]";
	}

}
