1 | |
|
2 | |
|
3 | |
|
4 | |
|
5 | |
|
6 | |
|
7 | |
|
8 | |
|
9 | |
|
10 | |
|
11 | |
|
12 | |
|
13 | |
|
14 | |
package net.admin4j.jdbc.driver.sql; |
15 | |
|
16 | |
import java.lang.reflect.Constructor; |
17 | |
import java.sql.CallableStatement; |
18 | |
import java.sql.Connection; |
19 | |
import java.sql.PreparedStatement; |
20 | |
import java.sql.Statement; |
21 | |
import java.util.Map; |
22 | |
import java.util.concurrent.ConcurrentHashMap; |
23 | |
|
24 | |
import net.admin4j.deps.commons.lang3.JavaVersion; |
25 | |
import net.admin4j.deps.commons.lang3.SystemUtils; |
26 | |
import net.admin4j.jdbc.driver.DriverContext; |
27 | |
import net.admin4j.util.Admin4jRuntimeException; |
28 | |
import net.admin4j.util.annotate.PackageRestrictions; |
29 | |
|
30 | |
|
31 | |
|
32 | |
|
33 | |
|
34 | |
|
35 | |
@PackageRestrictions({"net.admin4j","java","javax"}) |
36 | 0 | public class SQLWrappingUtils { |
37 | |
|
38 | |
|
39 | 9 | public static final String LINE_SEPARATOR = System.getProperty("line.separator"); |
40 | |
|
41 | 9 | private static Map<Class, Constructor> constructorMap = new ConcurrentHashMap<Class, Constructor>(); |
42 | |
|
43 | |
public static Object wrap(Object sqlObject) { |
44 | 18 | return wrap(sqlObject, null, null, null); |
45 | |
} |
46 | |
|
47 | |
public static Object wrap(Object sqlObject, Connection connection) { |
48 | 21 | return wrap(sqlObject, connection, null, null); |
49 | |
} |
50 | |
|
51 | |
@SuppressWarnings("rawtypes") |
52 | |
public static Object wrap(Object sqlObject, Connection connection, String sqlText, StackTraceElement[] stack) { |
53 | 180075 | Constructor wrapperConstructor = null; |
54 | 180075 | Object jdbcObject = null; |
55 | |
try { |
56 | 180075 | wrapperConstructor = findconstructor(sqlObject); |
57 | |
|
58 | 180075 | if (wrapperConstructor != null && wrapperConstructor.getParameterTypes().length == 1) { |
59 | 18 | jdbcObject = wrapperConstructor.newInstance(sqlObject); |
60 | 18 | encodeSqlText(sqlText, stack, jdbcObject); |
61 | 18 | return jdbcObject; |
62 | |
} |
63 | 180057 | else if (wrapperConstructor != null && wrapperConstructor.getParameterTypes().length == 2) { |
64 | 180057 | jdbcObject = wrapperConstructor.newInstance(connection, sqlObject); |
65 | 180057 | encodeSqlText(sqlText, stack, jdbcObject); |
66 | 180057 | return jdbcObject; |
67 | |
} |
68 | |
} |
69 | 0 | catch (Admin4jRuntimeException are) { |
70 | 0 | throw are.addContextValue("className", sqlObject.getClass().getName()); |
71 | |
} |
72 | 0 | catch (Exception e) { |
73 | 0 | throw new Admin4jRuntimeException("Error wrapping JDBC object", e) |
74 | |
.addContextValue("className", sqlObject.getClass().getName()); |
75 | 0 | } |
76 | |
|
77 | 0 | throw new Admin4jRuntimeException("Error wrapping JDBC object") |
78 | |
.addContextValue("className", sqlObject.getClass().getName()); |
79 | |
} |
80 | |
|
81 | |
private static Constructor findconstructor(Object sqlObject) |
82 | |
throws ClassNotFoundException, NoSuchMethodException { |
83 | 180075 | Constructor wrapperConstructor = constructorMap.get(sqlObject.getClass()); |
84 | 180075 | if (wrapperConstructor != null) { |
85 | 180048 | return wrapperConstructor; |
86 | |
} |
87 | |
|
88 | 0 | if (SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_1_8)) { |
89 | 9 | wrapperConstructor = findWrapperConstructor18(sqlObject); |
90 | |
} |
91 | 0 | else if (SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_1_7)) { |
92 | 9 | wrapperConstructor = findWrapperConstructor17(sqlObject); |
93 | |
} |
94 | 0 | else if (SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_1_6)) { |
95 | 9 | wrapperConstructor = findWrapperConstructor16(sqlObject); |
96 | |
} |
97 | |
else { |
98 | 0 | wrapperConstructor = findWrapperConstructor15(sqlObject); |
99 | |
} |
100 | 27 | constructorMap.put(sqlObject.getClass(), wrapperConstructor); |
101 | 27 | return wrapperConstructor; |
102 | |
} |
103 | |
|
104 | |
private static void encodeSqlText(String sqlText, StackTraceElement[] stack, Object jdbcObject) { |
105 | 180075 | if (sqlText != null && jdbcObject instanceof SqlContext) { |
106 | 180033 | ((SqlContext)jdbcObject).setSqlText(sqlText); |
107 | 180033 | ((SqlContext)jdbcObject).setExecutionStack(stack); |
108 | |
} |
109 | 180075 | } |
110 | |
|
111 | |
public static void encodeDriverContext(Object jdbcObject, String driverClassName, String poolName, Integer driverMajorVersion, Integer driverMinorVersion) { |
112 | 15 | if (jdbcObject instanceof DriverContext) { |
113 | 15 | ((DriverContext)jdbcObject).setDriverClassname(driverClassName); |
114 | 15 | ((DriverContext)jdbcObject).setDriverMajorVersion(driverMajorVersion); |
115 | 15 | ((DriverContext)jdbcObject).setDriverMinorVersion(driverMinorVersion); |
116 | 15 | ((DriverContext)jdbcObject).setPoolName(poolName); |
117 | |
} |
118 | 15 | } |
119 | |
|
120 | |
@SuppressWarnings({ "unchecked", "rawtypes" }) |
121 | |
private static Constructor findWrapperConstructor18(Object sqlObject) throws ClassNotFoundException, SecurityException, NoSuchMethodException { |
122 | 9 | Class wrapperClass = null; |
123 | 9 | if (sqlObject instanceof Connection) { |
124 | 3 | wrapperClass = Class.forName("net.admin4j.jdbc.driver.sql.ConnectionWrapper42"); |
125 | 3 | return wrapperClass.getConstructor(Connection.class); |
126 | |
} |
127 | 6 | else if (sqlObject instanceof CallableStatement) { |
128 | 2 | wrapperClass = Class.forName("net.admin4j.jdbc.driver.sql.CallableStatementWrapper42"); |
129 | 2 | return wrapperClass.getConstructor(ConnectionWrapper30Base.class, CallableStatement.class); |
130 | |
} |
131 | 4 | else if (sqlObject instanceof PreparedStatement) { |
132 | 2 | wrapperClass = Class.forName("net.admin4j.jdbc.driver.sql.PreparedStatementWrapper42"); |
133 | 2 | return wrapperClass.getConstructor(ConnectionWrapper30Base.class, PreparedStatement.class); |
134 | |
} |
135 | 2 | else if (sqlObject instanceof Statement) { |
136 | 2 | wrapperClass = Class.forName("net.admin4j.jdbc.driver.sql.StatementWrapper42"); |
137 | 2 | return wrapperClass.getConstructor(ConnectionWrapper30Base.class, Statement.class); |
138 | |
} |
139 | |
else { |
140 | 0 | throw new Admin4jRuntimeException("Error wrapping JDBC object") |
141 | |
.addContextValue("className", sqlObject.getClass().getName()); |
142 | |
} |
143 | |
} |
144 | |
|
145 | |
@SuppressWarnings({ "unchecked", "rawtypes" }) |
146 | |
private static Constructor findWrapperConstructor17(Object sqlObject) throws ClassNotFoundException, SecurityException, NoSuchMethodException { |
147 | 9 | Class wrapperClass = null; |
148 | 9 | if (sqlObject instanceof Connection) { |
149 | 3 | wrapperClass = Class.forName("net.admin4j.jdbc.driver.sql.ConnectionWrapper41"); |
150 | 3 | return wrapperClass.getConstructor(Connection.class); |
151 | |
} |
152 | 6 | else if (sqlObject instanceof CallableStatement) { |
153 | 2 | wrapperClass = Class.forName("net.admin4j.jdbc.driver.sql.CallableStatementWrapper41"); |
154 | 2 | return wrapperClass.getConstructor(ConnectionWrapper30Base.class, CallableStatement.class); |
155 | |
} |
156 | 4 | else if (sqlObject instanceof PreparedStatement) { |
157 | 2 | wrapperClass = Class.forName("net.admin4j.jdbc.driver.sql.PreparedStatementWrapper41"); |
158 | 2 | return wrapperClass.getConstructor(ConnectionWrapper30Base.class, PreparedStatement.class); |
159 | |
} |
160 | 2 | else if (sqlObject instanceof Statement) { |
161 | 2 | wrapperClass = Class.forName("net.admin4j.jdbc.driver.sql.StatementWrapper41"); |
162 | 2 | return wrapperClass.getConstructor(ConnectionWrapper30Base.class, Statement.class); |
163 | |
} |
164 | |
else { |
165 | 0 | throw new Admin4jRuntimeException("Error wrapping JDBC object") |
166 | |
.addContextValue("className", sqlObject.getClass().getName()); |
167 | |
} |
168 | |
} |
169 | |
|
170 | |
@SuppressWarnings({ "unchecked", "rawtypes" }) |
171 | |
private static Constructor findWrapperConstructor16(Object sqlObject) throws ClassNotFoundException, SecurityException, NoSuchMethodException { |
172 | 9 | Class wrapperClass = null; |
173 | 9 | if (sqlObject instanceof Connection) { |
174 | 3 | wrapperClass = Class.forName("net.admin4j.jdbc.driver.sql.ConnectionWrapper40"); |
175 | 3 | return wrapperClass.getConstructor(Connection.class); |
176 | |
} |
177 | 6 | else if (sqlObject instanceof CallableStatement) { |
178 | 2 | wrapperClass = Class.forName("net.admin4j.jdbc.driver.sql.CallableStatementWrapper40"); |
179 | 2 | return wrapperClass.getConstructor(ConnectionWrapper30Base.class, CallableStatement.class); |
180 | |
} |
181 | 4 | else if (sqlObject instanceof PreparedStatement) { |
182 | 2 | wrapperClass = Class.forName("net.admin4j.jdbc.driver.sql.PreparedStatementWrapper40"); |
183 | 2 | return wrapperClass.getConstructor(ConnectionWrapper30Base.class, PreparedStatement.class); |
184 | |
} |
185 | 2 | else if (sqlObject instanceof Statement) { |
186 | 2 | wrapperClass = Class.forName("net.admin4j.jdbc.driver.sql.StatementWrapper40"); |
187 | 2 | return wrapperClass.getConstructor(ConnectionWrapper30Base.class, Statement.class); |
188 | |
} |
189 | |
else { |
190 | 0 | throw new Admin4jRuntimeException("Error wrapping JDBC object") |
191 | |
.addContextValue("className", sqlObject.getClass().getName()); |
192 | |
} |
193 | |
} |
194 | |
|
195 | |
@SuppressWarnings({ "unchecked", "rawtypes" }) |
196 | |
private static Constructor findWrapperConstructor15(Object sqlObject) throws ClassNotFoundException, SecurityException, NoSuchMethodException { |
197 | 0 | Class wrapperClass = null; |
198 | 0 | if (sqlObject instanceof Connection) { |
199 | 0 | wrapperClass = Class.forName("net.admin4j.jdbc.driver.sql.ConnectionWrapper30"); |
200 | 0 | return wrapperClass.getConstructor(Connection.class); |
201 | |
} |
202 | 0 | else if (sqlObject instanceof CallableStatement) { |
203 | 0 | wrapperClass = Class.forName("net.admin4j.jdbc.driver.sql.CallableStatementWrapper30"); |
204 | 0 | return wrapperClass.getConstructor(ConnectionWrapper30Base.class, CallableStatement.class); |
205 | |
} |
206 | 0 | else if (sqlObject instanceof PreparedStatement) { |
207 | 0 | wrapperClass = Class.forName("net.admin4j.jdbc.driver.sql.PreparedStatementWrapper30"); |
208 | 0 | return wrapperClass.getConstructor(ConnectionWrapper30Base.class, PreparedStatement.class); |
209 | |
} |
210 | 0 | else if (sqlObject instanceof Statement) { |
211 | 0 | wrapperClass = Class.forName("net.admin4j.jdbc.driver.sql.StatementWrapper30"); |
212 | 0 | return wrapperClass.getConstructor(ConnectionWrapper30Base.class, Statement.class); |
213 | |
} |
214 | |
else { |
215 | 0 | throw new Admin4jRuntimeException("Error wrapping JDBC object") |
216 | |
.addContextValue("className", sqlObject.getClass().getName()); |
217 | |
} |
218 | |
} |
219 | |
|
220 | |
|
221 | |
|
222 | |
|
223 | |
|
224 | |
|
225 | |
protected static String array2String(Object[] objArray) { |
226 | 0 | StringBuffer buffer = new StringBuffer(); |
227 | 0 | for (Object obj: objArray) { |
228 | 0 | buffer.append(obj.toString()); |
229 | 0 | buffer.append(SystemUtils.LINE_SEPARATOR); |
230 | |
} |
231 | 0 | return buffer.toString(); |
232 | |
} |
233 | |
|
234 | |
|
235 | |
protected static void notNull(Object value, String message) { |
236 | 360132 | if (value == null) { |
237 | 0 | throw new IllegalArgumentException(message); |
238 | |
} |
239 | 360132 | } |
240 | |
|
241 | |
} |