001: /* DataSetDecorator.java
002: *
003: * DDSteps - Data Driven JUnit Test Steps
004: * Copyright (C) 2005 Jayway AB
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 version 2.1 as published by the Free Software Foundation.
009: *
010: * This library is distributed in the hope that it will be useful,
011: * but WITHOUT ANY WARRANTY; without even the implied warranty of
012: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
013: * Lesser General Public License for more details.
014: *
015: * You should have received a copy of the GNU Lesser General Public
016: * License along with this library; if not, visit
017: * http://www.opensource.org/licenses/lgpl-license.php
018: */
019: package org.ddsteps.dataset.decorator;
020:
021: import java.util.Iterator;
022:
023: import org.apache.commons.collections.IteratorUtils;
024: import org.apache.commons.collections.Predicate;
025: import org.apache.commons.collections.Transformer;
026: import org.apache.commons.collections.functors.NOPTransformer;
027: import org.apache.commons.collections.functors.TruePredicate;
028: import org.apache.commons.collections.iterators.FilterIterator;
029: import org.apache.commons.collections.iterators.ObjectArrayIterator;
030: import org.apache.commons.collections.iterators.TransformIterator;
031: import org.apache.commons.lang.Validate;
032: import org.ddsteps.dataset.DataSet;
033: import org.ddsteps.dataset.DataTable;
034:
035: /**
036: * Decorates a DataSet with a couple of filters and transformers.
037: *
038: * @author Adam
039: * @version $Id: DataSetDecorator.java,v 1.3 2006/04/05 18:43:53 adamskogman Exp $
040: */
041: public class DataSetDecorator implements DataSet {
042:
043: /**
044: * Serializable
045: */
046: private static final long serialVersionUID = 3175479806521843558L;
047:
048: final DataSet dataSet;
049:
050: Transformer dataValueTransformer = NOPTransformer.INSTANCE;
051:
052: Predicate dataTableNamePredicate = TruePredicate.INSTANCE;
053:
054: Predicate dataTablePredicate = TruePredicate.INSTANCE;
055:
056: /**
057: * Factory method.
058: *
059: * @param table
060: * @return Not null
061: */
062: protected DataTableDecorator createDataTableDecorator(
063: DataTable table) {
064: return new DataTableDecorator(table);
065: }
066:
067: /**
068: * Dependency injection constructor.
069: *
070: * @param dataSet
071: * The decorated dataset
072: */
073: public DataSetDecorator(DataSet dataSet) {
074: super ();
075: Validate.notNull(dataSet, "Argument dataSet must not be null");
076: this .dataSet = dataSet;
077: }
078:
079: /**
080: * Filtered array of table names
081: *
082: * @see org.ddsteps.dataset.DataSet#getTableNames()
083: */
084: public String[] getTableNames() {
085:
086: return (String[]) IteratorUtils.toArray(tableNameIterator(),
087: String.class);
088: }
089:
090: /**
091: * Iterator over table names. Uses dataTableNamePredicate.
092: *
093: * @return Iterator of String
094: */
095: public Iterator tableNameIterator() {
096: return new FilterIterator(new ObjectArrayIterator(dataSet
097: .getTableNames()), dataTableNamePredicate);
098: }
099:
100: /**
101: * Filtered and transformed iterator. Uses dataTablePredicate and
102: * dataTableTransformer.
103: *
104: * @see org.ddsteps.dataset.DataSet#tableIterator()
105: */
106: public Iterator tableIterator() {
107:
108: // 1. Filter out by name
109: // 2. Transform to a wrapper
110: return new TransformIterator(new FilterIterator(dataSet
111: .tableIterator(), dataTablePredicate),
112: createDataTableDecoratorTransform());
113: }
114:
115: /**
116: * Factory method.
117: *
118: * @return Not null
119: */
120: DataTableDecoratorTransformer createDataTableDecoratorTransform() {
121: return new DataTableDecoratorTransformer(dataValueTransformer);
122: }
123:
124: /**
125: * Filters out tables using dataTableTransformer.
126: *
127: * @see org.ddsteps.dataset.DataSet#getTable(java.lang.String)
128: */
129: public DataTable getTable(String tableName) {
130:
131: // Check name predicate
132: if (!dataTableNamePredicate.evaluate(tableName))
133: return null;
134:
135: DataTable table = dataSet.getTable(tableName);
136:
137: if (table == null) {
138: return null;
139: }
140:
141: return (DataTable) createDataTableDecoratorTransform()
142: .transform(table);
143: }
144:
145: /**
146: * @param dataValueTransformer
147: * The dataValueTransformer to set, not null.
148: */
149: public void setDataValueTransformer(Transformer dataValueTransformer) {
150: Validate.notNull(dataValueTransformer,
151: "Argument dataValueTransformer must not be null.");
152: this .dataValueTransformer = dataValueTransformer;
153: }
154:
155: /**
156: * @param dataTableNamePredicate
157: * The dataTableNamePredicate to set.
158: */
159: public void setDataTableNamePredicate(
160: Predicate dataTableNamePredicate) {
161: Validate.notNull(dataTableNamePredicate,
162: "Argument dataTableNamePredicate must not be null.");
163: this .dataTableNamePredicate = dataTableNamePredicate;
164: this .dataTablePredicate = new TableNameToTablePredicateAdapter(
165: dataTableNamePredicate);
166: }
167:
168: /**
169: * @return Returns the dataValueTransformer.
170: */
171: public Transformer getDataValueTransformer() {
172: return dataValueTransformer;
173: }
174:
175: /**
176: * For testing purposes, mainly.
177: *
178: * @return Returns the dataset that this decorator decorates.
179: */
180: public DataSet getDataSet() {
181: return dataSet;
182: }
183: }
|