001: /*
002: *
003: * The DbUnit Database Testing Framework
004: * Copyright (C)2002-2004, DbUnit.org
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation; either
009: * version 2.1 of the License, or (at your option) any later version.
010: *
011: * This library is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: *
016: * You should have received a copy of the GNU Lesser General Public
017: * License along with this library; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
019: *
020: */
021:
022: package org.dbunit.dataset;
023:
024: import org.slf4j.Logger;
025: import org.slf4j.LoggerFactory;
026:
027: import java.util.ArrayList;
028: import java.util.List;
029: import java.util.ListIterator;
030:
031: /**
032: * Combines multiple datasets into a single logical dataset.
033: *
034: * @author Manuel Laflamme
035: * @version $Revision: 554 $
036: * @since Feb 19, 2002
037: */
038: public class CompositeDataSet extends AbstractDataSet {
039:
040: /**
041: * Logger for this class
042: */
043: private static final Logger logger = LoggerFactory
044: .getLogger(CompositeDataSet.class);
045:
046: private ITable[] _tables;
047:
048: /**
049: * Creates a composite dataset that combines specified datasets.
050: * Tables having the same name are merged into one table.
051: */
052: public CompositeDataSet(IDataSet[] dataSets)
053: throws DataSetException {
054: this (dataSets, true);
055: }
056:
057: /**
058: * Creates a composite dataset that combines specified datasets.
059: *
060: * @param dataSets
061: * list of datasets
062: * @param combine
063: * if <code>true</code>, tables having the same name are merged into
064: * one table.
065: */
066: public CompositeDataSet(IDataSet[] dataSets, boolean combine)
067: throws DataSetException {
068: List tableList = new ArrayList();
069: for (int i = 0; i < dataSets.length; i++) {
070: IDataSet dataSet = dataSets[i];
071: ITableIterator iterator = dataSet.iterator();
072: while (iterator.next()) {
073: addTable(iterator.getTable(), tableList, combine);
074: }
075: }
076:
077: _tables = (ITable[]) tableList.toArray(new ITable[0]);
078: }
079:
080: /**
081: * Creates a composite dataset that combines the two specified datasets.
082: * Tables having the same name are merged into one table.
083: */
084: public CompositeDataSet(IDataSet dataSet1, IDataSet dataSet2)
085: throws DataSetException {
086: this (new IDataSet[] { dataSet1, dataSet2 });
087: }
088:
089: /**
090: * Creates a composite dataset that combines the two specified datasets.
091: *
092: * @param dataSet1
093: * first dataset
094: * @param dataSet2
095: * second dataset
096: * @param combine
097: * if <code>true</code>, tables having the same name are merged into
098: * one table.
099: */
100: public CompositeDataSet(IDataSet dataSet1, IDataSet dataSet2,
101: boolean combine) throws DataSetException {
102: this (new IDataSet[] { dataSet1, dataSet2 }, combine);
103: }
104:
105: /**
106: * Creates a composite dataset that combines duplicate tables of the specified dataset.
107: *
108: * @param dataSet
109: * the dataset
110: * @param combine
111: * if <code>true</code>, tables having the same name are merged into
112: * one table.
113: * @deprecated This constructor is useless when the combine parameter is
114: * <code>false</code>. Use overload that doesn't have the combine argument.
115: */
116: public CompositeDataSet(IDataSet dataSet, boolean combine)
117: throws DataSetException {
118: this (new IDataSet[] { dataSet }, combine);
119: }
120:
121: /**
122: * Creates a composite dataset that combines duplicate tables of the specified dataset.
123: *
124: * @param dataSet
125: * the dataset
126: */
127: public CompositeDataSet(IDataSet dataSet) throws DataSetException {
128: this (new IDataSet[] { dataSet }, true);
129: }
130:
131: /**
132: * Creates a composite dataset that combines tables having identical name.
133: * Tables having the same name are merged into one table.
134: */
135: public CompositeDataSet(ITable[] tables) throws DataSetException {
136: List tableList = new ArrayList();
137: for (int i = 0; i < tables.length; i++) {
138: addTable(tables[i], tableList, true);
139: }
140:
141: _tables = (ITable[]) tableList.toArray(new ITable[0]);
142: }
143:
144: private void addTable(ITable newTable, List tableList,
145: boolean combine) {
146: logger.debug("addTable(newTable=" + newTable + ", tableList="
147: + tableList + ", combine=" + combine + ") - start");
148:
149: // No merge required, simply add new table at then end of the list
150: if (!combine) {
151: tableList.add(newTable);
152: return;
153: }
154:
155: // Merge required, search for existing table with the same name
156: String tableName = newTable.getTableMetaData().getTableName();
157: for (ListIterator it = tableList.listIterator(); it.hasNext();) {
158: ITable table = (ITable) it.next();
159: if (tableName.equalsIgnoreCase(table.getTableMetaData()
160: .getTableName())) {
161: // Found existing table, merge existing and new tables together
162: it.set(new CompositeTable(table, newTable));
163: return;
164: }
165: }
166:
167: // No existing table found, add new table at the end of the list
168: tableList.add(newTable);
169: }
170:
171: ////////////////////////////////////////////////////////////////////////////
172: // AbstractDataSet class
173:
174: protected ITableIterator createIterator(boolean reversed)
175: throws DataSetException {
176: logger.debug("createIterator(reversed=" + reversed
177: + ") - start");
178:
179: return new DefaultTableIterator(_tables, reversed);
180: }
181: }
|