1
1
package org .embulk .input ;
2
2
3
- import java .io .IOException ;
4
- import java .lang .reflect .Field ;
5
- import java .util .Properties ;
6
- import java .sql .Connection ;
7
- import java .sql .DriverManager ;
8
- import java .sql .SQLException ;
9
- import java .util .Optional ;
10
-
11
3
import com .google .common .base .Throwables ;
12
-
13
4
import org .embulk .config .Config ;
14
5
import org .embulk .config .ConfigDefault ;
6
+ import org .embulk .config .ConfigException ;
15
7
import org .embulk .input .jdbc .AbstractJdbcInputPlugin ;
16
8
import org .embulk .input .jdbc .Ssl ;
17
9
import org .embulk .input .jdbc .getter .ColumnGetterFactory ;
21
13
import org .slf4j .Logger ;
22
14
import org .slf4j .LoggerFactory ;
23
15
16
+ import java .io .IOException ;
17
+ import java .lang .reflect .Field ;
18
+ import java .sql .Connection ;
19
+ import java .sql .DriverManager ;
20
+ import java .sql .SQLException ;
21
+ import java .util .Arrays ;
22
+ import java .util .List ;
23
+ import java .util .Optional ;
24
+ import java .util .Properties ;
25
+
24
26
public class MySQLInputPlugin
25
27
extends AbstractJdbcInputPlugin
26
28
{
@@ -158,20 +160,20 @@ private void loadTimeZoneMappings()
158
160
// Here implements a workaround as as workaround.
159
161
Field f = null ;
160
162
try {
161
- Class <?> timeUtilClass = Class . forName ( "com.mysql.jdbc.TimeUtil" );
163
+ Class <?> timeUtilClass = getTimeUtilClass ( );
162
164
f = timeUtilClass .getDeclaredField ("timeZoneMappings" );
163
165
f .setAccessible (true );
164
166
165
167
Properties timeZoneMappings = (Properties ) f .get (null );
166
168
if (timeZoneMappings == null ) {
167
169
timeZoneMappings = new Properties ();
168
170
synchronized (timeUtilClass ) {
169
- timeZoneMappings . load ( this . getClass (). getResourceAsStream ( "/com/mysql/jdbc/TimeZoneMapping.properties" ) );
171
+ loadTimezoneMappings ( timeZoneMappings );
170
172
}
171
173
f .set (null , timeZoneMappings );
172
174
}
173
175
}
174
- catch (ClassNotFoundException | IllegalAccessException | NoSuchFieldException | IOException e ) {
176
+ catch (IllegalAccessException | NoSuchFieldException e ) {
175
177
throw Throwables .propagate (e );
176
178
}
177
179
finally {
@@ -181,4 +183,39 @@ private void loadTimeZoneMappings()
181
183
}
182
184
}
183
185
186
+ private Class <?> getTimeUtilClass () {
187
+ Class <?> timeUtilClass ;
188
+ List <String > timeUtilClassNames = Arrays .asList (
189
+ "com.mysql.jdbc.TimeUtil" , // Connector/J v5.X
190
+ "com.mysql.cj.util.TimeUtil" // Connector/J v8.X
191
+ );
192
+
193
+ for (String name : timeUtilClassNames ) {
194
+ try {
195
+ timeUtilClass = Class .forName (name );
196
+ return timeUtilClass ;
197
+ } catch (ClassNotFoundException e ) {
198
+ // do nothing.
199
+ }
200
+ }
201
+ throw new ConfigException ("Can't find TimeUtil Class" );
202
+ }
203
+
204
+ private void loadTimezoneMappings (Properties timeZoneMappings ) {
205
+ List <String > timeZoneResources = Arrays .asList (
206
+ "/com/mysql/jdbc/TimeZoneMapping.properties" , // Connector/J v5.X
207
+ "/com/mysql/cj/util/TimeZoneMapping.properties" // Connector/J v8.X
208
+ );
209
+
210
+ for (String resource : timeZoneResources ) {
211
+ try {
212
+ timeZoneMappings .load (this .getClass ().getResourceAsStream (resource ));
213
+ return ;
214
+ } catch (IOException | NullPointerException e ) {
215
+ // do nothing.
216
+ }
217
+ }
218
+ throw new ConfigException ("Can't find Timezone mapping property file." );
219
+ }
220
+
184
221
}
0 commit comments