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);
}
/**