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 org.apache.commons.logging.Log;
009    import org.apache.commons.logging.LogFactory;
010    
011    import com.mockrunner.util.common.ArrayUtil;
012    
013    /**
014     * Mock implementation of <code>Array</code>.
015     */
016    public class MockArray implements Array, Cloneable
017    {
018        private final static Log log = LogFactory.getLog(MockArray.class);
019        private String sqlTypeName = "";
020        private int baseType = 0;
021        private Object array;
022        
023        public MockArray(Object array)
024        {
025            this.array = ArrayUtil.convertToArray(array);
026        }
027        
028        /**
029         * Sets the base type.
030         * @param baseType the base type
031         */
032        public void setBaseType(int baseType)
033        {
034            this.baseType = baseType;
035        }
036    
037        /**
038         * Sets the base type name.
039         * @param sqlTypeName the base type name
040         */
041        public void setBaseTypeName(String sqlTypeName)
042        {
043            this.sqlTypeName = sqlTypeName;
044        }
045    
046        public int getBaseType() throws SQLException
047        {
048            return baseType;
049        }
050        
051        public String getBaseTypeName() throws SQLException
052        {
053            return sqlTypeName;
054        }
055    
056        public Object getArray() throws SQLException
057        {
058            return array;
059        }
060        
061        public Object getArray(Map map) throws SQLException
062        {
063            return getArray();
064        }
065    
066        public Object getArray(long index, int count) throws SQLException
067        {
068            return ArrayUtil.truncateArray(getArray(), (int)(index - 1), count);
069        }
070        
071        public Object getArray(long index, int count, Map map) throws SQLException
072        {
073            return getArray(index, count);
074        }
075    
076        public ResultSet getResultSet() throws SQLException
077        {
078            return getResultSet(1, java.lang.reflect.Array.getLength(array));
079        }
080    
081        public ResultSet getResultSet(long index, int count) throws SQLException
082        {
083            Integer[] firstColumn = new Integer[count];
084            for(int ii = 0; ii < count; ii++)
085            {
086                firstColumn[ii] = new Integer(ii + 1);
087            }
088            Object[] secondColumn = ArrayUtil.convertToObjectArray(array);
089            secondColumn = (Object[])ArrayUtil.truncateArray(secondColumn, (int)(index - 1), count);
090            MockResultSet resultSet = new MockResultSet(String.valueOf(hashCode()));
091            resultSet.setResultSetType(ResultSet.TYPE_SCROLL_INSENSITIVE);
092            resultSet.setResultSetConcurrency(ResultSet.CONCUR_READ_ONLY);
093            resultSet.addColumn(firstColumn);
094            resultSet.addColumn(secondColumn);
095            return resultSet;
096        }
097    
098        public ResultSet getResultSet(long index, int count, Map map) throws SQLException
099        {
100            return getResultSet(index, count);
101        }
102    
103        public ResultSet getResultSet(Map map) throws SQLException
104        {
105            return getResultSet();
106        }
107    
108        public boolean equals(Object obj)
109        {
110            if(null == obj) return false;
111            if(!obj.getClass().equals(this.getClass())) return false;
112            MockArray other = (MockArray)obj;
113            if(baseType != other.baseType) return false;
114            if(null == sqlTypeName && null != other.sqlTypeName) return false;
115            if(null != sqlTypeName && !sqlTypeName.equals(other.sqlTypeName)) return false;
116            return ArrayUtil.areArraysEqual(array, other.array);
117        }
118    
119        public int hashCode()
120        {
121            int hashCode = ArrayUtil.computeHashCode(array);
122            hashCode += 31 * baseType;
123            if(null != sqlTypeName) hashCode += 31 * sqlTypeName.hashCode();
124            return hashCode;
125        }
126    
127        public String toString()
128        {
129            StringBuffer buffer = new StringBuffer("Array data: ");
130            Object[] arrayData = ArrayUtil.convertToObjectArray(array);
131            for(int ii = 0; ii < arrayData.length; ii++)
132            {
133                buffer.append("[" + arrayData[ii].toString() + "] ");
134            }
135            return buffer.toString();
136        }
137        
138        public Object clone()
139        {
140            try
141            {
142                MockArray copy = (MockArray)super.clone();
143                copy.array = ArrayUtil.copyArray(array);
144                return copy;
145            }
146            catch(CloneNotSupportedException exc)
147            {
148                log.error(exc.getMessage(), exc);
149            }
150            return null;
151        }
152    }