001 package com.mockrunner.mock.jdbc; 002 003 import java.io.ByteArrayInputStream; 004 import java.io.IOException; 005 import java.io.InputStream; 006 import java.io.OutputStream; 007 import java.sql.Blob; 008 import java.sql.SQLException; 009 import java.util.ArrayList; 010 import java.util.List; 011 012 import org.apache.commons.logging.Log; 013 import org.apache.commons.logging.LogFactory; 014 015 import com.mockrunner.util.common.ArrayUtil; 016 import com.mockrunner.util.common.CollectionUtil; 017 018 /** 019 * Mock implementation of <code>Blob</code>. 020 */ 021 public class MockBlob implements Blob, Cloneable 022 { 023 private final static Log log = LogFactory.getLog(MockBlob.class); 024 private List blobData; 025 026 public MockBlob(byte[] data) 027 { 028 blobData = ArrayUtil.getListFromByteArray(data); 029 } 030 031 public long length() throws SQLException 032 { 033 return blobData.size(); 034 } 035 036 public byte[] getBytes(long pos, int length) throws SQLException 037 { 038 if(pos < 0) pos = 0; 039 return ArrayUtil.getByteArrayFromList(blobData, (int)(pos - 1), length); 040 } 041 042 public InputStream getBinaryStream() throws SQLException 043 { 044 return new ByteArrayInputStream(ArrayUtil.getByteArrayFromList(blobData)); 045 } 046 047 public long position(byte[] pattern, long start) throws SQLException 048 { 049 byte[] data = ArrayUtil.getByteArrayFromList(blobData); 050 int index = ArrayUtil.indexOf(data, pattern, (int)(start - 1)); 051 if(-1 != index) index += 1; 052 return index; 053 } 054 055 public long position(Blob pattern, long start) throws SQLException 056 { 057 return position(pattern.getBytes(1, (int)pattern.length()), start); 058 } 059 060 public int setBytes(long pos, byte[] bytes) throws SQLException 061 { 062 if(pos < 0) pos = 0; 063 ArrayUtil.addBytesToList(bytes, blobData, (int)(pos - 1)); 064 return bytes.length; 065 } 066 067 public int setBytes(long pos, byte[] bytes, int offset, int len) throws SQLException 068 { 069 if(pos < 0) pos = 0; 070 ArrayUtil.addBytesToList(bytes, offset, len, blobData, (int)(pos - 1)); 071 return len; 072 } 073 074 public OutputStream setBinaryStream(long pos) throws SQLException 075 { 076 return new BlobOutputStream((int)(pos - 1)); 077 } 078 079 public void truncate(long len) throws SQLException 080 { 081 blobData = CollectionUtil.truncateList(blobData, (int)len); 082 } 083 084 private class BlobOutputStream extends OutputStream 085 { 086 private int index; 087 088 public BlobOutputStream(int index) 089 { 090 this.index = index; 091 } 092 093 public void write(int byteValue) throws IOException 094 { 095 byte[] bytes = new byte[] {(byte)byteValue}; 096 ArrayUtil.addBytesToList(bytes, blobData, index); 097 index++; 098 } 099 } 100 101 public boolean equals(Object obj) 102 { 103 if(null == obj) return false; 104 if(!obj.getClass().equals(this.getClass())) return false; 105 MockBlob other = (MockBlob)obj; 106 return blobData.equals(other.blobData); 107 } 108 109 public int hashCode() 110 { 111 return blobData.hashCode(); 112 } 113 114 public String toString() 115 { 116 StringBuffer buffer = new StringBuffer("Blob data: "); 117 for(int ii = 0; ii < blobData.size(); ii++) 118 { 119 buffer.append("[" + blobData.get(ii).toString() + "] "); 120 } 121 return buffer.toString(); 122 } 123 124 public Object clone() 125 { 126 try 127 { 128 MockBlob blob = (MockBlob)super.clone(); 129 blob.blobData = new ArrayList(blobData); 130 return blob; 131 } 132 catch(CloneNotSupportedException exc) 133 { 134 log.error(exc.getMessage(), exc); 135 } 136 return null; 137 } 138 }