1 /*
2 * This file is part of dependency-check-core.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 * Copyright (c) 2014 Jeremy Long. All Rights Reserved.
17 */
18 package org.owasp.dependencycheck.data.nvdcve;
19
20 import org.apache.commons.lang3.builder.EqualsBuilder;
21 import org.apache.commons.lang3.builder.HashCodeBuilder;
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
24
25 import java.lang.reflect.InvocationTargetException;
26 import java.lang.reflect.Method;
27 import java.sql.Connection;
28 import java.sql.Driver;
29 import java.sql.DriverPropertyInfo;
30 import java.sql.SQLException;
31 import java.sql.SQLFeatureNotSupportedException;
32 import java.util.Properties;
33 import javax.annotation.concurrent.ThreadSafe;
34
35 /**
36 * <p>
37 * Driver shim to get around the class loader issue with the DriverManager. The
38 * following code is a nearly identical copy (with more comments and a few more
39 * methods implemented) of the DriverShim from:</p>
40 * <blockquote>http://www.kfu.com/~nsayer/Java/dyn-jdbc.html</blockquote>
41 *
42 * @author Jeremy Long
43 * @see java.sql.Driver
44 */
45 @ThreadSafe
46 class DriverShim implements Driver {
47
48 /**
49 * The logger.
50 */
51 private static final Logger LOGGER = LoggerFactory.getLogger(DriverShim.class);
52 /**
53 * The database driver being wrapped.
54 */
55 private final Driver driver;
56
57 /**
58 * Constructs a new wrapper around a Driver.
59 *
60 * @param driver the database driver to wrap
61 */
62 DriverShim(Driver driver) {
63 this.driver = driver;
64 }
65
66 /**
67 * Wraps the underlying driver's call to acceptsURL. Returns whether or not
68 * the driver can open a connection to the given URL.
69 *
70 * @param url the URL of the database
71 * @return true if the wrapped driver can connect to the specified URL
72 * @throws SQLException thrown if there is an error connecting to the
73 * database
74 * @see java.sql.Driver#acceptsURL(java.lang.String)
75 */
76 @Override
77 public boolean acceptsURL(String url) throws SQLException {
78 return this.driver.acceptsURL(url);
79 }
80
81 /**
82 * Wraps the call to the underlying driver's connect method.
83 *
84 * @param url the URL of the database
85 * @param info a collection of string/value pairs
86 * @return a Connection object
87 * @throws SQLException thrown if there is an error connecting to the
88 * database
89 * @see java.sql.Driver#connect(java.lang.String, java.util.Properties)
90 */
91 @Override
92 public Connection connect(String url, Properties info) throws SQLException {
93 return this.driver.connect(url, info);
94 }
95
96 /**
97 * Returns the wrapped driver's major version number.
98 *
99 * @return the wrapped driver's major version number
100 * @see java.sql.Driver#getMajorVersion()
101 */
102 @Override
103 public int getMajorVersion() {
104 return this.driver.getMajorVersion();
105 }
106
107 /**
108 * Returns the wrapped driver's minor version number.
109 *
110 * @return the wrapped driver's minor version number
111 * @see java.sql.Driver#getMinorVersion()
112 */
113 @Override
114 public int getMinorVersion() {
115 return this.driver.getMinorVersion();
116 }
117
118 /**
119 * Wraps the call to the underlying driver's getParentLogger method.
120 *
121 * @return the parent's Logger
122 * @throws SQLFeatureNotSupportedException thrown if the feature is not
123 * supported
124 * @see java.sql.Driver#getParentLogger()
125 */
126 @Override
127 public java.util.logging.Logger getParentLogger() throws SQLFeatureNotSupportedException {
128 //return driver.getParentLogger();
129 final Method m;
130 try {
131 m = driver.getClass().getMethod("getParentLogger");
132 } catch (Throwable e) {
133 throw new SQLFeatureNotSupportedException();
134 }
135 if (m != null) {
136 try {
137 return (java.util.logging.Logger) m.invoke(m);
138 } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
139 LOGGER.trace("", ex);
140 }
141 }
142 throw new SQLFeatureNotSupportedException();
143 }
144
145 /**
146 * Wraps the call to the underlying driver's getPropertyInfo method.
147 *
148 * @param url the URL of the database
149 * @param info a collection of string/value pairs
150 * @return an array of DriverPropertyInfo objects
151 * @throws SQLException thrown if there is an error accessing the database
152 * @see java.sql.Driver#getPropertyInfo(java.lang.String,
153 * java.util.Properties)
154 */
155 @Override
156 public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) throws SQLException {
157 return this.driver.getPropertyInfo(url, info);
158 }
159
160 /**
161 * Returns whether or not the wrapped driver is jdbcCompliant.
162 *
163 * @return true if the wrapped driver is JDBC compliant; otherwise false
164 * @see java.sql.Driver#jdbcCompliant()
165 */
166 @Override
167 public boolean jdbcCompliant() {
168 return this.driver.jdbcCompliant();
169 }
170
171 /**
172 * Standard implementation of hashCode.
173 *
174 * @return the hashCode of the object
175 */
176 @Override
177 public int hashCode() {
178 return new HashCodeBuilder(7, 97)
179 .append(driver)
180 .toHashCode();
181 }
182
183 /**
184 * Standard implementation of equals.
185 *
186 * @param obj the object to compare
187 * @return returns true if the objects are equal; otherwise false
188 */
189 @Override
190 public boolean equals(Object obj) {
191 if (obj == null || !(obj instanceof DriverShim)) {
192 return false;
193 }
194 if (this == obj) {
195 return true;
196 }
197 final DriverShim rhs = (DriverShim) obj;
198 return new EqualsBuilder()
199 .append(driver, rhs.driver)
200 .isEquals();
201 }
202
203 /**
204 * Standard implementation of toString().
205 *
206 * @return the String representation of the object
207 */
208 @Override
209 public String toString() {
210 return "DriverShim{" + "driver=" + driver + '}';
211 }
212 }