Fix SqlUtil.validateType(int) by using reflection of Types.class to search those public$static@final@int fields to be compliant to JDBC4

git-svn-id: https://svn.apache.org/repos/asf/harmony/enhanced/classlib/branches/java6@905244 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/modules/sql/src/main/java/javax/sql/rowset/SqlUtil.java b/modules/sql/src/main/java/javax/sql/rowset/SqlUtil.java
index 0f1d3c7..e37f3a1 100644
--- a/modules/sql/src/main/java/javax/sql/rowset/SqlUtil.java
+++ b/modules/sql/src/main/java/javax/sql/rowset/SqlUtil.java
@@ -17,49 +17,31 @@
 
 package javax.sql.rowset;
 
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
 import java.sql.SQLException;
 import java.sql.Types;
 import org.apache.harmony.sql.internal.nls.Messages;
 
 class SqlUtil {
-    /*
-     * FIXME:Validate column types is defined by java.sql.Types, current
-     * implementation is ugly, need to find an elegant and effient way to check
-     * all constants defined in java.util.sql.Types
-     */
+
     static void validateType(int type) throws SQLException {
-        switch (type) {
-        case Types.ARRAY:
-        case Types.BIGINT:
-        case Types.BINARY:
-        case Types.BIT:
-        case Types.BLOB:
-        case Types.BOOLEAN:
-        case Types.CHAR:
-        case Types.CLOB:
-        case Types.DATALINK:
-        case Types.DATE:
-        case Types.DECIMAL:
-        case Types.DISTINCT:
-        case Types.DOUBLE:
-        case Types.FLOAT:
-        case Types.INTEGER:
-        case Types.JAVA_OBJECT:
-        case Types.LONGVARBINARY:
-        case Types.LONGVARCHAR:
-        case Types.NULL:
-        case Types.NUMERIC:
-        case Types.OTHER:
-        case Types.REAL:
-        case Types.REF:
-        case Types.SMALLINT:
-        case Types.STRUCT:
-        case Types.TIME:
-        case Types.TIMESTAMP:
-        case Types.TINYINT:
-        case Types.VARBINARY:
-        case Types.VARCHAR:
-            return;
+        try {
+            int modifiers = -1;
+            Field[] fields = Types.class.getFields();
+            for (int index = 0; index < fields.length; index++) {
+                if (int.class == fields[index].getType()) {
+                    modifiers = fields[index].getModifiers();
+                    if (Modifier.isStatic(modifiers)
+                            && Modifier.isFinal(modifiers)) {
+                        if (type == fields[index].getInt(Types.class)) {
+                            return;
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            // ignored: this should never happen
         }
         throw new SQLException(Messages.getString("sql.28")); //$NON-NLS-1$
     }
diff --git a/modules/sql/src/test/java/org/apache/harmony/sql/tests/javax/sql/rowset/RowSetMetaDataImplTest.java b/modules/sql/src/test/java/org/apache/harmony/sql/tests/javax/sql/rowset/RowSetMetaDataImplTest.java
index a3c328f..6293441 100644
--- a/modules/sql/src/test/java/org/apache/harmony/sql/tests/javax/sql/rowset/RowSetMetaDataImplTest.java
+++ b/modules/sql/src/test/java/org/apache/harmony/sql/tests/javax/sql/rowset/RowSetMetaDataImplTest.java
@@ -826,6 +826,11 @@
         } catch (SQLException e) {
             // expected
         }
+        
+        // types compliant to JDBC4
+        metaDataImpl.setColumnType(2, Types.NCHAR);
+        metaDataImpl.setColumnType(2, Types.NCLOB);
+        metaDataImpl.setColumnType(2, Types.NVARCHAR);
     }
 
     /**