VerifyTableDefinition.java

  1. /*
  2.  *
  3.  * The DbUnit Database Testing Framework
  4.  * Copyright (C)2002-2008, 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;

  22. import java.util.Arrays;
  23. import java.util.Map;

  24. import org.dbunit.assertion.comparer.value.ValueComparer;
  25. import org.dbunit.assertion.comparer.value.verifier.DefaultVerifyTableDefinitionVerifier;
  26. import org.dbunit.assertion.comparer.value.verifier.VerifyTableDefinitionVerifier;

  27. /**
  28.  * Defines a database table to verify (assert on data), specifying include and
  29.  * exclude column filters and optional {@link ValueComparer}s.
  30.  *
  31.  * @author Jeff Jensen jeffjensen AT users.sourceforge.net
  32.  * @author Last changed by: $Author$
  33.  * @version $Revision$ $Date$
  34.  * @since 2.4.8
  35.  */
  36. public class VerifyTableDefinition
  37. {
  38.     /** The name of the table. */
  39.     private final String tableName;

  40.     /** The columns to exclude in table comparisons. */
  41.     private final String[] columnExclusionFilters;

  42.     /** The columns to include in table comparisons. */
  43.     private final String[] columnInclusionFilters;

  44.     /**
  45.      * {@link ValueComparer} to use with column value comparisons when the
  46.      * column name for the table is not in the {@link columnValueComparers}
  47.      * {@link Map}. Can be <code>null</code> and will default.
  48.      *
  49.      * @since 2.6.0
  50.      */
  51.     private final ValueComparer defaultValueComparer;

  52.     /**
  53.      * Map of column names to {@link ValueComparer}s to use for comparison.
  54.      *
  55.      * @since 2.6.0
  56.      */
  57.     private final Map<String, ValueComparer> columnValueComparers;

  58.     private VerifyTableDefinitionVerifier verifyTableDefinitionVerifier =
  59.             new DefaultVerifyTableDefinitionVerifier();

  60.     /**
  61.      * Create a valid instance with all columns compared except exclude the
  62.      * specified columns.
  63.      *
  64.      * @param table
  65.      *            The name of the table - required.
  66.      * @param excludeColumns
  67.      *            The columns in the table to ignore (filter out) in expected vs
  68.      *            actual comparisons; null or empty array to exclude no columns.
  69.      */
  70.     public VerifyTableDefinition(final String table,
  71.             final String[] excludeColumns)
  72.     {
  73.         this(table, excludeColumns, null, null, null);
  74.     }

  75.     /**
  76.      * Create a valid instance with all columns compared and use the specified
  77.      * defaultValueComparer for all column comparisons not in the
  78.      * columnValueComparers {@link Map}.
  79.      *
  80.      * @param table
  81.      *            The name of the table - required.
  82.      * @param defaultValueComparer
  83.      *            {@link ValueComparer} to use with column value comparisons
  84.      *            when the column name for the table is not in the
  85.      *            columnValueComparers {@link Map}. Can be <code>null</code> and
  86.      *            will default.
  87.      * @param columnValueComparers
  88.      *            {@link Map} of {@link ValueComparer}s to use for specific
  89.      *            columns. Key is column name, value is {@link ValueComparer} to
  90.      *            use for comparison of that column. Can be <code>null</code>
  91.      *            and will default to defaultValueComparer for all columns in
  92.      *            all tables.
  93.      * @since 2.6.0
  94.      */
  95.     public VerifyTableDefinition(final String table,
  96.             final ValueComparer defaultValueComparer,
  97.             final Map<String, ValueComparer> columnValueComparers)
  98.     {
  99.         this(table, null, null, defaultValueComparer, columnValueComparers);
  100.     }

  101.     /**
  102.      * Create a valid instance with all columns compared and exclude the
  103.      * specified columns, and use the specified defaultValueComparer for all
  104.      * column comparisons not in the columnValueComparers {@link Map}.
  105.      *
  106.      * @param table
  107.      *            The name of the table - required.
  108.      * @param excludeColumns
  109.      *            The columns in the table to ignore (filter out) in expected vs
  110.      *            actual comparisons; null or empty array to exclude no columns.
  111.      * @param defaultValueComparer
  112.      *            {@link ValueComparer} to use with column value comparisons
  113.      *            when the column name for the table is not in the
  114.      *            columnValueComparers {@link Map}. Can be <code>null</code> and
  115.      *            will default.
  116.      * @param columnValueComparers
  117.      *            {@link Map} of {@link ValueComparer}s to use for specific
  118.      *            columns. Key is column name, value is {@link ValueComparer} to
  119.      *            use for comparison of that column. Can be <code>null</code>
  120.      *            and will default to defaultValueComparer for all columns in
  121.      *            all tables.
  122.      * @since 2.6.0
  123.      */
  124.     public VerifyTableDefinition(final String table,
  125.             final String[] excludeColumns,
  126.             final ValueComparer defaultValueComparer,
  127.             final Map<String, ValueComparer> columnValueComparers)
  128.     {
  129.         this(table, excludeColumns, null, defaultValueComparer,
  130.                 columnValueComparers);
  131.     }

  132.     /**
  133.      * Create a valid instance specifying exclude and include columns.
  134.      *
  135.      * @param table
  136.      *            The name of the table.
  137.      * @param excludeColumns
  138.      *            The columns in the table to ignore (filter out) in expected vs
  139.      *            actual comparisons; null or empty array to exclude no columns.
  140.      * @param includeColumns
  141.      *            The columns in the table to include in expected vs actual
  142.      *            comparisons; null to include all columns, empty array to
  143.      *            include no columns.
  144.      */
  145.     public VerifyTableDefinition(final String table,
  146.             final String[] excludeColumns, final String[] includeColumns)
  147.     {
  148.         this(table, excludeColumns, includeColumns, null, null);
  149.     }

  150.     /**
  151.      * Create a valid instance specifying exclude and include columns and use
  152.      * the specified defaultValueComparer for all column comparisons not in the
  153.      * columnValueComparers {@link Map}.
  154.      *
  155.      * @param table
  156.      *            The name of the table.
  157.      * @param excludeColumns
  158.      *            The columns in the table to ignore (filter out) in expected vs
  159.      *            actual comparisons; null or empty array to exclude no columns.
  160.      * @param includeColumns
  161.      *            The columns in the table to include in expected vs actual
  162.      *            comparisons; null to include all columns, empty array to
  163.      *            include no columns.
  164.      * @param defaultValueComparer
  165.      *            {@link ValueComparer} to use with column value comparisons
  166.      *            when the column name for the table is not in the
  167.      *            columnValueComparers {@link Map}. Can be <code>null</code> and
  168.      *            will default.
  169.      * @param columnValueComparers
  170.      *            {@link Map} of {@link ValueComparer}s to use for specific
  171.      *            columns. Key is column name, value is {@link ValueComparer} to
  172.      *            use for comparison of that column. Can be <code>null</code>
  173.      *            and will default to defaultValueComparer for all columns in
  174.      *            all tables.
  175.      * @since 2.6.0
  176.      */
  177.     public VerifyTableDefinition(final String table,
  178.             final String[] excludeColumns, final String[] includeColumns,
  179.             final ValueComparer defaultValueComparer,
  180.             final Map<String, ValueComparer> columnValueComparers)
  181.     {
  182.         if (table == null)
  183.         {
  184.             throw new IllegalArgumentException("table is null.");
  185.         }

  186.         tableName = table;
  187.         columnExclusionFilters = excludeColumns;
  188.         columnInclusionFilters = includeColumns;
  189.         this.defaultValueComparer = defaultValueComparer;
  190.         this.columnValueComparers = columnValueComparers;

  191.         verifyTableDefinitionVerifier.verify(this);
  192.     }

  193.     public String getTableName()
  194.     {
  195.         return tableName;
  196.     }

  197.     public String[] getColumnExclusionFilters()
  198.     {
  199.         return columnExclusionFilters;
  200.     }

  201.     public String[] getColumnInclusionFilters()
  202.     {
  203.         return columnInclusionFilters;
  204.     }

  205.     /** @since 2.6.0 */
  206.     public ValueComparer getDefaultValueComparer()
  207.     {
  208.         return defaultValueComparer;
  209.     }

  210.     /** @since 2.6.0 */
  211.     public Map<String, ValueComparer> getColumnValueComparers()
  212.     {
  213.         return columnValueComparers;
  214.     }

  215.     /**
  216.      * {@inheritDoc}
  217.      */
  218.     @Override
  219.     public String toString()
  220.     {
  221.         final String exclusionString = arrayToString(columnExclusionFilters);
  222.         final String inclusionString = arrayToString(columnInclusionFilters);

  223.         final StringBuilder sb = new StringBuilder(1000);
  224.         sb.append("tableName='").append(tableName).append("'");
  225.         sb.append(", columnExclusionFilters='").append(exclusionString)
  226.                 .append("'");
  227.         sb.append(", columnInclusionFilters='").append(inclusionString)
  228.                 .append("'");
  229.         sb.append(", defaultValueComparer='").append(defaultValueComparer)
  230.                 .append("'");
  231.         sb.append(", columnValueComparers='").append(columnValueComparers)
  232.                 .append("'");
  233.         return sb.toString();
  234.     }

  235.     protected String arrayToString(final String[] array)
  236.     {
  237.         return array == null ? "" : Arrays.toString(array);
  238.     }

  239.     public VerifyTableDefinitionVerifier getVerifyTableDefinitionVerifier()
  240.     {
  241.         return verifyTableDefinitionVerifier;
  242.     }

  243.     public void setVerifyTableDefinitionVerifier(
  244.             final VerifyTableDefinitionVerifier verifyTableDefinitionVerifier)
  245.     {
  246.         this.verifyTableDefinitionVerifier = verifyTableDefinitionVerifier;
  247.     }
  248. }