You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by to...@apache.org on 2007/06/19 06:07:04 UTC
svn commit: r548575 - in /harmony/enhanced/classlib/trunk/modules/sql/src:
main/java/javax/sql/rowset/serial/
test/java/org/apache/harmony/sql/tests/javax/sql/rowset/serial/
Author: tonywu
Date: Mon Jun 18 21:07:03 2007
New Revision: 548575
URL: http://svn.apache.org/viewvc?view=rev&rev=548575
Log:
Apply patch HARMONY-4210 [classlib][sql] javax.sql.SerialArray(Array) throws NullPointerException when one of the Array member is downcasted to Object)
Modified:
harmony/enhanced/classlib/trunk/modules/sql/src/main/java/javax/sql/rowset/serial/DefaultUDTMap.java
harmony/enhanced/classlib/trunk/modules/sql/src/main/java/javax/sql/rowset/serial/SerialArray.java
harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/javax/sql/rowset/serial/SerialArrayTest.java
Modified: harmony/enhanced/classlib/trunk/modules/sql/src/main/java/javax/sql/rowset/serial/DefaultUDTMap.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/sql/src/main/java/javax/sql/rowset/serial/DefaultUDTMap.java?view=diff&rev=548575&r1=548574&r2=548575
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/sql/src/main/java/javax/sql/rowset/serial/DefaultUDTMap.java (original)
+++ harmony/enhanced/classlib/trunk/modules/sql/src/main/java/javax/sql/rowset/serial/DefaultUDTMap.java Mon Jun 18 21:07:03 2007
@@ -21,6 +21,7 @@
import java.sql.Array;
import java.sql.Blob;
import java.sql.Clob;
+import java.sql.SQLException;
import java.sql.Struct;
import java.sql.Types;
import java.util.HashMap;
@@ -34,45 +35,45 @@
|| type == Types.DATALINK || type == Types.STRUCT || type == Types.JAVA_OBJECT);
}
- public static SerialDatalink[] processObject(URL[] elements)
+ public static SerialDatalink[] processDatalink(Object[] elements)
throws SerialException {
SerialDatalink[] ret = new SerialDatalink[elements.length];
for (int i = 0; i < elements.length; i++) {
- ret[i] = new SerialDatalink(elements[i]);
+ ret[i] = new SerialDatalink((URL)elements[i]);
}
return ret;
}
- public static Struct[] processObject(Struct[] elements)
+ public static Struct[] processStruct(Object[] elements)
throws SerialException {
Struct[] ret = new Struct[elements.length];
for (int i = 0; i < elements.length; i++) {
- ret[i] = elements[i];
+ ret[i] = (Struct)elements[i];
}
return ret;
}
- public static Array[] processObject(Array[] elements)
+ public static Array[] processArray(Object[] elements)
throws SerialException {
Array[] ret = new Array[elements.length];
for (int i = 0; i < elements.length; i++) {
- ret[i] = elements[i];
+ ret[i] = (Array)elements[i];
}
return ret;
}
- public static Clob[] processObject(Clob[] elements) throws SerialException {
+ public static Clob[] processClob(Object[] elements) throws SQLException {
Clob[] ret = new Clob[elements.length];
for (int i = 0; i < elements.length; i++) {
- ret[i] = elements[i];
+ ret[i] = new SerialClob((Clob)elements[i]);
}
return ret;
}
- public static Blob[] processObject(Blob[] elements) throws SerialException {
+ public static Blob[] processBlob(Object[] elements) throws SQLException {
Blob[] ret = new Blob[elements.length];
for (int i = 0; i < elements.length; i++) {
- ret[i] = elements[i];
+ ret[i] = new SerialBlob((Blob)elements[i]);
}
return ret;
}
@@ -89,3 +90,4 @@
return ret;
}
}
+
Modified: harmony/enhanced/classlib/trunk/modules/sql/src/main/java/javax/sql/rowset/serial/SerialArray.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/sql/src/main/java/javax/sql/rowset/serial/SerialArray.java?view=diff&rev=548575&r1=548574&r2=548575
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/sql/src/main/java/javax/sql/rowset/serial/SerialArray.java (original)
+++ harmony/enhanced/classlib/trunk/modules/sql/src/main/java/javax/sql/rowset/serial/SerialArray.java Mon Jun 18 21:07:03 2007
@@ -18,13 +18,9 @@
package javax.sql.rowset.serial;
import java.io.Serializable;
-import java.net.URL;
import java.sql.Array;
-import java.sql.Blob;
-import java.sql.Clob;
import java.sql.ResultSet;
import java.sql.SQLException;
-import java.sql.Struct;
import java.sql.Types;
import java.util.Map;
@@ -62,51 +58,74 @@
public SerialArray(Array array, Map<String, Class<?>> map)
throws SerialException, SQLException {
if (null == array || null == array.getArray() || null == map) {
- throw new SQLException(Messages.getString("sql.39"));
+ throw new SQLException(Messages.getString("sql.39")); //$NON-NLS-1$
}
baseType = array.getBaseType();
baseTypeName = array.getBaseTypeName();
Object[] element = (Object[]) array.getArray(map);
-
- switch (baseType) {
- case Types.STRUCT:
- elements = DefaultUDTMap.processObject((Struct[])element);
- break;
- case Types.ARRAY:
- elements = DefaultUDTMap.processObject((Array[])element);
- break;
- case Types.CLOB:
- elements = DefaultUDTMap.processObject((Clob[])element);
- break;
- case Types.BLOB:
- elements = DefaultUDTMap.processObject((Blob[])element);
- break;
- case Types.DATALINK:
- elements = DefaultUDTMap.processObject((URL[])element);
- break;
- case Types.JAVA_OBJECT:
- elements = DefaultUDTMap.processObject(element);
- break;
- default:
- elements = new Object[element.length];
- for (int i = 0; i < element.length; i++) {
- elements[i] = element[i];
- }
+ if (element.length == 0) {
+ elements = new Object[0];
+ } else {
+ transferElements(baseType, element);
}
}
+
+ /**
+ * Transfers primitive objects to SerialXXX objects according to the given
+ * type.
+ * @throws SQLException
+ */
+ private void transferElements(int type, Object[] element) throws SQLException {
+ switch (type) {
+ case Types.STRUCT:
+ elements = DefaultUDTMap.processStruct(element);
+ break;
+ case Types.ARRAY:
+ elements = DefaultUDTMap.processArray(element);
+ break;
+ case Types.CLOB:
+ elements = DefaultUDTMap.processClob(element);
+ break;
+ case Types.BLOB:
+ elements = DefaultUDTMap.processBlob(element);
+ break;
+ case Types.DATALINK:
+ elements = DefaultUDTMap.processDatalink(element);
+ break;
+ case Types.JAVA_OBJECT:
+ elements = DefaultUDTMap.processObject(element);
+ break;
+ default:
+ elements = new Object[element.length];
+ for (int i = 0; i < element.length; i++) {
+ elements[i] = element[i];
+ }
+ }
+ }
/**
- * The constructor
- *
- * @param array
- * array to be serializated
- * @throws SerialException
- * when any error occurs during serializing
- * @throws SQLException
- * if array is null
- */
+ * The constructor
+ *
+ * @param array
+ * array to be serializated
+ * @throws SerialException
+ * when any error occurs during serializing
+ * @throws SQLException
+ * if array is null
+ */
public SerialArray(Array array) throws SerialException, SQLException {
- this(array, DefaultUDTMap.DEFAULTMAP);
+ if (null == array || null == array.getArray()) {
+ throw new SQLException(Messages.getString("sql.39")); //$NON-NLS-1$
+ }
+ baseType = array.getBaseType();
+ baseTypeName = array.getBaseTypeName();
+
+ Object[] element = (Object[]) array.getArray();
+ if (element.length == 0) {
+ elements = new Object[0];
+ } else {
+ transferElements(baseType, element);
+ }
}
/**
@@ -136,7 +155,7 @@
*/
public Object getArray(long index, int count) throws SerialException {
if (index < 0 || count + index > elements.length) {
- throw new SerialException("Illegal Argument");
+ throw new SerialException(Messages.getString("sql.42")); //$NON-NLS-1$
}
Object[] ret = new Object[count];
System.arraycopy(elements, (int) index, ret, 0, count);
@@ -160,7 +179,7 @@
public Object getArray(long index, int count, Map<String, Class<?>> map)
throws SerialException {
if (index < 0 || count + index > elements.length ) {
- throw new SerialException(Messages.getString("sql.40"));
+ throw new SerialException(Messages.getString("sql.40")); //$NON-NLS-1$
}
Object[] ret = new Object[count];
System.arraycopy(elements, (int) index, ret, 0, count);
@@ -264,5 +283,4 @@
throws SerialException {
throw new UnsupportedOperationException();
}
-
}
Modified: harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/javax/sql/rowset/serial/SerialArrayTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/javax/sql/rowset/serial/SerialArrayTest.java?view=diff&rev=548575&r1=548574&r2=548575
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/javax/sql/rowset/serial/SerialArrayTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/javax/sql/rowset/serial/SerialArrayTest.java Mon Jun 18 21:07:03 2007
@@ -27,6 +27,7 @@
import java.util.Map;
import javax.sql.rowset.serial.SerialArray;
+import javax.sql.rowset.serial.SerialClob;
import javax.sql.rowset.serial.SerialException;
import junit.framework.TestCase;
@@ -60,6 +61,8 @@
}
public void testConstructor_ObjectArray() throws SQLException {
+ assertNotNull(new SerialArray(new SQLArray()));
+
// OK
sa = new SerialArray(mock);
// array.getArray should not return null
@@ -382,6 +385,64 @@
public void writeSQL(SQLOutput stream) throws SQLException {
return;
+ }
+ }
+
+ private static class SQLArray implements java.sql.Array {
+
+ Object[] array;
+
+ SQLArray() throws SQLException {
+
+ char[] chars = { 'a', 'b', 'c', 'd' };
+ array = new Object[1];
+
+ array[0] = (Object) new SerialClob(chars);
+ }
+
+ public Object getArray() {
+ return array;
+ }
+
+ public int getBaseType() {
+ return java.sql.Types.CLOB;
+ }
+
+ /** Everything below here is just supplied to satisfy
+ the interface and is not part of this testcase.
+ **/
+
+ public Object getArray(long index, int count) {
+ return null;
+ }
+
+ public Object getArray(long index, int count, Map<String, Class<?>> map) {
+ return null;
+ }
+
+ public Object getArray(Map<String, Class<?>> map) {
+ return null;
+ }
+
+ public String getBaseTypeName() {
+ return null;
+ }
+
+ public ResultSet getResultSet() {
+ return null;
+ }
+
+ public ResultSet getResultSet(long index, int count) {
+ return null;
+ }
+
+ public ResultSet getResultSet(Map<String, Class<?>> map) {
+ return null;
+ }
+
+ public ResultSet getResultSet(long index, int count,
+ Map<String, Class<?>> map) {
+ return null;
}
}
}