OracleDataTypeFactory.java

  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.ext.oracle;

  22. import java.sql.Types;
  23. import java.util.Arrays;
  24. import java.util.Collection;

  25. import org.dbunit.dataset.datatype.BinaryStreamDataType;
  26. import org.dbunit.dataset.datatype.DataType;
  27. import org.dbunit.dataset.datatype.DataTypeException;
  28. import org.dbunit.dataset.datatype.DefaultDataTypeFactory;
  29. import org.dbunit.dataset.datatype.StringDataType;
  30. import org.slf4j.Logger;
  31. import org.slf4j.LoggerFactory;

  32. /**
  33.  * Specialized factory that recognizes Oracle data types.
  34.  * @author manuel.laflamme
  35.  * @since Jul 17, 2003
  36.  * @version $Revision$
  37.  */
  38. public class OracleDataTypeFactory extends DefaultDataTypeFactory
  39. {

  40.     /**
  41.      * Logger for this class
  42.      */
  43.     private static final Logger logger = LoggerFactory.getLogger(OracleDataTypeFactory.class);
  44.     /**
  45.      * Database product names supported.
  46.      */
  47.     private static final Collection DATABASE_PRODUCTS = Arrays.asList(new String[] {"oracle"});

  48.     public static final DataType ORACLE_BLOB = new OracleBlobDataType();
  49.     public static final DataType ORACLE_CLOB = new OracleClobDataType();
  50.     public static final DataType ORACLE_NCLOB = new OracleNClobDataType();
  51.     public static final DataType ORACLE_XMLTYPE = new OracleXMLTypeDataType();
  52.     public static final DataType ORACLE_SDO_GEOMETRY_TYPE = new OracleSdoGeometryDataType();
  53.    
  54.     public static final DataType LONG_RAW = new BinaryStreamDataType(
  55.             "LONG RAW", Types.LONGVARBINARY);
  56.    
  57.     public static final DataType ROWID_TYPE = new StringDataType("ROWID", Types.OTHER);

  58.     /**
  59.      * @see org.dbunit.dataset.datatype.IDbProductRelatable#getValidDbProducts()
  60.      */
  61.     public Collection getValidDbProducts()
  62.     {
  63.       return DATABASE_PRODUCTS;
  64.     }

  65.     public DataType createDataType(int sqlType, String sqlTypeName) throws DataTypeException
  66.     {
  67.         if(logger.isDebugEnabled())
  68.             logger.debug("createDataType(sqlType={}, sqlTypeName={}) - start", String.valueOf(sqlType), sqlTypeName);

  69.         // Map Oracle DATE to TIMESTAMP
  70.         if (sqlType == Types.DATE)
  71.         {
  72.             return DataType.TIMESTAMP;
  73.         }

  74.         // TIMESTAMP
  75.         if (sqlTypeName.startsWith("TIMESTAMP"))
  76.         {
  77.             return DataType.TIMESTAMP;
  78.         }

  79.         // XMLTYPE
  80.         if ("XMLTYPE".equals(sqlTypeName) || "SYS.XMLTYPE".equals(sqlTypeName))
  81.         {
  82.             return ORACLE_XMLTYPE;
  83.         }

  84.         // BLOB
  85.         if ("BLOB".equals(sqlTypeName))
  86.         {
  87.             return ORACLE_BLOB;
  88.         }

  89.         // CLOB
  90.         if ("CLOB".equals(sqlTypeName))
  91.         {
  92.             return ORACLE_CLOB;
  93.         }
  94.        
  95.         // NCLOB
  96.         if  ("NCLOB".equals(sqlTypeName))
  97.         {
  98.             return ORACLE_NCLOB;
  99.         }

  100.         // NVARCHAR2
  101.         if ("NVARCHAR2".equals(sqlTypeName))
  102.         {
  103.             return DataType.VARCHAR;
  104.         }

  105.         // NCHAR
  106.         if (sqlTypeName.startsWith("NCHAR"))
  107.         {
  108.             return DataType.CHAR;
  109.         }

  110.         // FLOAT
  111.         if ("FLOAT".equals(sqlTypeName))
  112.         {
  113.             return DataType.FLOAT;
  114.         }

  115.         // LONG RAW
  116.         if (LONG_RAW.toString().equals(sqlTypeName))
  117.         {
  118.             return LONG_RAW;
  119.         }

  120.         // BINARY_DOUBLE/BINARY_FLOAT
  121.         // Note that you have to configure your driver appropriate:
  122.         // Oracle-specific property to support IEEE floating-point is enabled setting the following property
  123.         // <value>SetFloatAndDoubleUseBinary=true</value>
  124.         if ("BINARY_DOUBLE".equals(sqlTypeName))
  125.         {
  126.             return DataType.DOUBLE;
  127.         }
  128.         if ("BINARY_FLOAT".equals(sqlTypeName))
  129.         {
  130.             return DataType.FLOAT;
  131.         }

  132.         // ROWID
  133.         if ("ROWID".equals(sqlTypeName))
  134.         {
  135.             return ROWID_TYPE;
  136.         }

  137.         // SDO_GEOMETRY
  138.         if ("SDO_GEOMETRY".equals(sqlTypeName) || "MDSYS.SDO_GEOMETRY".equals(sqlTypeName))
  139.         {
  140.             return ORACLE_SDO_GEOMETRY_TYPE;
  141.         }

  142.         return super.createDataType(sqlType, sqlTypeName);
  143.     }
  144. }

  145.