001 package com.mockrunner.mock.jdbc; 002 003 import java.sql.Array; 004 import java.sql.ResultSet; 005 import java.sql.SQLException; 006 import java.util.Map; 007 008 import com.mockrunner.base.NestedApplicationException; 009 import com.mockrunner.util.common.ArrayUtil; 010 011 /** 012 * Mock implementation of <code>Array</code>. 013 */ 014 public class MockArray implements Array, Cloneable 015 { 016 private String sqlTypeName = ""; 017 private int baseType = 0; 018 private Object array; 019 private boolean wasFreeCalled = false; 020 021 public MockArray(Object array) 022 { 023 this.array = ArrayUtil.convertToArray(array); 024 } 025 026 /** 027 * Sets the base type. 028 * @param baseType the base type 029 */ 030 public void setBaseType(int baseType) 031 { 032 this.baseType = baseType; 033 } 034 035 /** 036 * Sets the base type name. 037 * @param sqlTypeName the base type name 038 */ 039 public void setBaseTypeName(String sqlTypeName) 040 { 041 this.sqlTypeName = sqlTypeName; 042 } 043 044 public int getBaseType() throws SQLException 045 { 046 if(wasFreeCalled) 047 { 048 throw new SQLException("free() was called"); 049 } 050 return baseType; 051 } 052 053 public String getBaseTypeName() throws SQLException 054 { 055 if(wasFreeCalled) 056 { 057 throw new SQLException("free() was called"); 058 } 059 return sqlTypeName; 060 } 061 062 public Object getArray() throws SQLException 063 { 064 if(wasFreeCalled) 065 { 066 throw new SQLException("free() was called"); 067 } 068 return array; 069 } 070 071 public Object getArray(Map map) throws SQLException 072 { 073 return getArray(); 074 } 075 076 public Object getArray(long index, int count) throws SQLException 077 { 078 return ArrayUtil.truncateArray(getArray(), (int)(index - 1), count); 079 } 080 081 public Object getArray(long index, int count, Map map) throws SQLException 082 { 083 return getArray(index, count); 084 } 085 086 public ResultSet getResultSet() throws SQLException 087 { 088 return getResultSet(1, java.lang.reflect.Array.getLength(array)); 089 } 090 091 public ResultSet getResultSet(long index, int count) throws SQLException 092 { 093 if(wasFreeCalled) 094 { 095 throw new SQLException("free() was called"); 096 } 097 Integer[] firstColumn = new Integer[count]; 098 for(int ii = 0; ii < count; ii++) 099 { 100 firstColumn[ii] = new Integer(ii + 1); 101 } 102 Object[] secondColumn = ArrayUtil.convertToObjectArray(array); 103 secondColumn = (Object[])ArrayUtil.truncateArray(secondColumn, (int)(index - 1), count); 104 MockResultSet resultSet = new MockResultSet(String.valueOf(hashCode())); 105 resultSet.setResultSetType(ResultSet.TYPE_SCROLL_INSENSITIVE); 106 resultSet.setResultSetConcurrency(ResultSet.CONCUR_READ_ONLY); 107 resultSet.addColumn(firstColumn); 108 resultSet.addColumn(secondColumn); 109 return resultSet; 110 } 111 112 public ResultSet getResultSet(long index, int count, Map map) throws SQLException 113 { 114 return getResultSet(index, count); 115 } 116 117 public ResultSet getResultSet(Map map) throws SQLException 118 { 119 return getResultSet(); 120 } 121 122 public void free() throws SQLException 123 { 124 wasFreeCalled = true; 125 } 126 127 /** 128 * Returns if {@link #free} has been called. 129 * @return <code>true</code> if {@link #free} has been called, 130 * <code>false</code> otherwise 131 */ 132 public boolean wasFreeCalled() 133 { 134 return wasFreeCalled; 135 } 136 137 public boolean equals(Object obj) 138 { 139 if(null == obj) return false; 140 if(!obj.getClass().equals(this.getClass())) return false; 141 MockArray other = (MockArray)obj; 142 if(baseType != other.baseType) return false; 143 if(null == sqlTypeName && null != other.sqlTypeName) return false; 144 if(null != sqlTypeName && !sqlTypeName.equals(other.sqlTypeName)) return false; 145 if(wasFreeCalled != other.wasFreeCalled()) return false; 146 return ArrayUtil.areArraysEqual(array, other.array); 147 } 148 149 public int hashCode() 150 { 151 int hashCode = ArrayUtil.computeHashCode(array); 152 hashCode = (31 * hashCode) + baseType; 153 if(null != sqlTypeName) hashCode = (31 * hashCode) + sqlTypeName.hashCode(); 154 hashCode = (31 * hashCode) + (wasFreeCalled ? 31 : 62); 155 return hashCode; 156 } 157 158 public String toString() 159 { 160 StringBuffer buffer = new StringBuffer("Array data: ["); 161 Object[] arrayData = ArrayUtil.convertToObjectArray(array); 162 for(int ii = 0; ii < arrayData.length; ii++) 163 { 164 buffer.append(arrayData[ii]); 165 if(ii < arrayData.length - 1) 166 { 167 buffer.append(", "); 168 } 169 } 170 buffer.append("]"); 171 return buffer.toString(); 172 } 173 174 public Object clone() 175 { 176 try 177 { 178 MockArray copy = (MockArray)super.clone(); 179 copy.array = ArrayUtil.copyArray(array); 180 return copy; 181 } 182 catch(CloneNotSupportedException exc) 183 { 184 throw new NestedApplicationException(exc); 185 } 186 } 187 }