01: package com.mockrunner.jdbc;
02:
03: import java.io.InputStream;
04: import java.io.Reader;
05: import java.util.Arrays;
06:
07: import com.mockrunner.mock.jdbc.MockResultSet;
08: import com.mockrunner.util.common.ArrayUtil;
09: import com.mockrunner.util.common.MethodUtil;
10: import com.mockrunner.util.common.StreamUtil;
11:
12: /**
13: * Util class for <code>PreparedStatement</code> and <code>ResultSet</code>
14: * parameters.
15: */
16: public class ParameterUtil {
17: /**
18: * Copies a parameter of a <code>PreparedStatement</code>,
19: * <code>CallableStatement</code> or a <code>ResultSet</code> value.
20: * <code>InputStream</code> objects, <code>Reader</code> objects
21: * and arrays are copied into new allocated streams or arrays.
22: * All other objects are cloned by calling the clone method.
23: * If the object is not cloneable, it is returned unchanged.
24: * @param source the parameter to copy
25: * @return a copy of the parameter
26: */
27: public static Object copyParameter(Object source) {
28: if (null == source)
29: return null;
30: if (source.getClass().isArray()) {
31: return ArrayUtil.copyArray(source);
32: }
33: if (source instanceof InputStream) {
34: return StreamUtil.copyStream((InputStream) source);
35: }
36: if (source instanceof Reader) {
37: return StreamUtil.copyReader((Reader) source);
38: }
39: if (source instanceof Cloneable) {
40: try {
41: return MethodUtil.invoke(source, "clone");
42: } catch (Exception exc) {
43: return source;
44: }
45: }
46: return source;
47: }
48:
49: /**
50: * Compares two parameters of a <code>PreparedStatement</code> or
51: * <code>CallableStatement</code>. Can also be used to compare
52: * values of a <code>ResultSet</code>. It is used by
53: * {@link com.mockrunner.jdbc.PreparedStatementResultSetHandler}
54: * for comparing parameters specified in the <code>prepare</code>
55: * methods.
56: * Since the parameters can be of the type <code>byte[]</code>,
57: * <code>InputStream</code> and <code>Reader</code> this method handles
58: * these types of objects. All other objects are compared using the
59: * <code>equals</code> method. The mock versions of <code>Ref</code>,
60: * <code>Array</code>, <code>Blob</code>, <code>Clob</code>,
61: * <code>Struct</code> etc. all provide a suitable <code>equals</code>
62: * implementation.
63: * @param source the first parameter
64: * @param target the second parameter
65: * @return <code>true</code> if <i>source</i> is equal to <i>target</i>,
66: * <code>false</code> otherwise
67: */
68: public static boolean compareParameter(Object source, Object target) {
69: if (null == source && null == target)
70: return true;
71: if (null == source || null == target)
72: return false;
73: if (source instanceof byte[] && target instanceof byte[]) {
74: return Arrays.equals((byte[]) source, (byte[]) target);
75: }
76: if (source instanceof InputStream
77: && target instanceof InputStream) {
78: return StreamUtil.compareStreams((InputStream) source,
79: (InputStream) target);
80: }
81: if (source instanceof Reader && target instanceof Reader) {
82: return StreamUtil.compareReaders((Reader) source,
83: (Reader) target);
84: }
85: if (source instanceof MockResultSet
86: && target instanceof MockResultSet) {
87: return ((MockResultSet) source)
88: .isEqual((MockResultSet) target);
89: }
90: return source.equals(target);
91: }
92: }
|