View Javadoc

1   /*
2    *
3    * The DbUnit Database Testing Framework
4    * Copyright (C)2002-2004, DbUnit.org
5    *
6    * This library is free software; you can redistribute it and/or
7    * modify it under the terms of the GNU Lesser General Public
8    * License as published by the Free Software Foundation; either
9    * version 2.1 of the License, or (at your option) any later version.
10   *
11   * This library is distributed in the hope that it will be useful,
12   * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14   * Lesser General Public License for more details.
15   *
16   * You should have received a copy of the GNU Lesser General Public
17   * License along with this library; if not, write to the Free Software
18   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19   *
20   */
21  package org.dbunit.dataset;
22  
23  import org.slf4j.Logger;
24  import org.slf4j.LoggerFactory;
25  
26  import java.util.HashMap;
27  import java.util.Map;
28  
29  /**
30   * Decorator that replace configured values from the decorated dataset
31   * with replacement values.
32   *
33   * @author Manuel Laflamme
34   * @since Mar 17, 2003
35   * @version $Revision: 855 $
36   */
37  public class ReplacementDataSet extends AbstractDataSet
38  {
39  
40      /**
41       * Logger for this class
42       */
43      private static final Logger logger = LoggerFactory.getLogger(ReplacementDataSet.class);
44  
45      private final IDataSet _dataSet;
46      private final Map _objectMap;
47      private final Map _substringMap;
48      private String _startDelim;
49      private String _endDelim;
50      private boolean _strictReplacement;
51  
52  
53      /**
54       * Create a new ReplacementDataSet object that decorates the specified dataset.
55       *
56       * @param dataSet the decorated table
57       */
58      public ReplacementDataSet(IDataSet dataSet)
59      {
60          _dataSet = dataSet;
61          _objectMap = new HashMap();
62          _substringMap = new HashMap();
63      }
64  
65      /**
66       * Create a new ReplacementDataSet object that decorates the specified dataset.
67       *
68       * @param dataSet the decorated dataset
69       * @param objectMap the replacement objects mapping
70       * @param substringMap the replacement substrings mapping
71       */
72      public ReplacementDataSet(IDataSet dataSet, Map objectMap, Map substringMap)
73      {
74          _dataSet = dataSet;
75          _objectMap = objectMap == null ? new HashMap() : objectMap;
76          _substringMap = substringMap == null ? new HashMap() : substringMap;
77      }
78  
79      /**
80       * Setting this property to true indicates that when no replacement
81       * is found for a delimited substring the replacement will fail fast.
82       * 
83       * @param strictReplacement true if replacement should be strict
84       */
85      public void setStrictReplacement(boolean strictReplacement) {
86          this._strictReplacement = strictReplacement;
87      }
88      
89      /**
90       * Add a new Object replacement mapping.
91       *
92       * @param originalObject the object to replace
93       * @param replacementObject the replacement object
94       */
95      public void addReplacementObject(Object originalObject, Object replacementObject)
96      {
97          logger.debug("addReplacementObject(originalObject={}, replacementObject={}) - start", originalObject, replacementObject);
98  
99          _objectMap.put(originalObject, replacementObject);
100     }
101 
102     /**
103      * Add a new substring replacement mapping.
104      *
105      * @param originalSubstring the substring to replace
106      * @param replacementSubstring the replacement substring
107      */
108     public void addReplacementSubstring(String originalSubstring,
109             String replacementSubstring)
110     {
111         logger.debug("addReplacementSubstring(originalSubstring={}, replacementSubstring={}) - start", originalSubstring, replacementSubstring);
112 
113         if (originalSubstring == null || replacementSubstring == null)
114         {
115             throw new NullPointerException();
116         }
117 
118         _substringMap.put(originalSubstring, replacementSubstring);
119     }
120 
121     /**
122      * Sets substring delimiters.
123      */
124     public void setSubstringDelimiters(String startDelimiter, String endDelimiter)
125     {
126         logger.debug("setSubstringDelimiters(startDelimiter={}, endDelimiter={}) - start", startDelimiter, endDelimiter);
127 
128         if (startDelimiter == null || endDelimiter == null)
129         {
130             throw new NullPointerException();
131         }
132 
133         _startDelim = startDelimiter;
134         _endDelim = endDelimiter;
135     }
136 
137     private ReplacementTable createReplacementTable(ITable table)
138     {
139         logger.debug("createReplacementTable(table={}) - start", table);
140         
141         ReplacementTable replacementTable = new ReplacementTable(
142                 table, _objectMap, _substringMap, _startDelim, _endDelim);
143         replacementTable.setStrictReplacement(_strictReplacement);
144         return replacementTable;
145     }
146 
147     ////////////////////////////////////////////////////////////////////////////
148     // AbstractDataSet class
149 
150     protected ITableIterator createIterator(boolean reversed)
151             throws DataSetException
152     {
153     	if(logger.isDebugEnabled())
154     		logger.debug("createIterator(reversed={}) - start", String.valueOf(reversed));
155 
156         return new ReplacementIterator(reversed ?
157                 _dataSet.reverseIterator() : _dataSet.iterator());
158     }
159 
160     ////////////////////////////////////////////////////////////////////////////
161     // IDataSet interface
162 
163     public String[] getTableNames() throws DataSetException
164     {
165         logger.debug("getTableNames() - start");
166 
167         return _dataSet.getTableNames();
168     }
169 
170     public ITableMetaData getTableMetaData(String tableName)
171             throws DataSetException
172     {
173         logger.debug("getTableMetaData(tableName={}) - start", tableName);
174 
175         return _dataSet.getTableMetaData(tableName);
176     }
177 
178     public ITable getTable(String tableName) throws DataSetException
179     {
180         logger.debug("getTable(tableName={}) - start", tableName);
181 
182         return createReplacementTable(_dataSet.getTable(tableName));
183     }
184 
185     ////////////////////////////////////////////////////////////////////////////
186     // ReplacementIterator class
187 
188     private class ReplacementIterator implements ITableIterator
189     {
190 
191         /**
192          * Logger for this class
193          */
194         private final Logger logger = LoggerFactory.getLogger(ReplacementIterator.class);
195 
196         private final ITableIterator _iterator;
197 
198         public ReplacementIterator(ITableIterator iterator)
199         {
200             _iterator = iterator;
201         }
202 
203         ////////////////////////////////////////////////////////////////////////
204         // ITableIterator interface
205 
206         public boolean next() throws DataSetException
207         {
208             logger.debug("next() - start");
209 
210             return _iterator.next();
211         }
212 
213         public ITableMetaData getTableMetaData() throws DataSetException
214         {
215             logger.debug("getTableMetaData() - start");
216 
217             return _iterator.getTableMetaData();
218         }
219 
220         public ITable getTable() throws DataSetException
221         {
222             logger.debug("getTable() - start");
223 
224             return createReplacementTable(_iterator.getTable());
225         }
226     }
227 }