From 7b1b83fddd5ccdb796c824f904e20986eecd1df6 Mon Sep 17 00:00:00 2001 From: moparisthebest Date: Fri, 15 Feb 2019 11:12:24 -0500 Subject: [PATCH] Lazy load SQLChecker so it doesn't error if it won't be used --- .../jdbc/codegen/JdbcMapperProcessor.java | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/jdbcmapper/src/main/java/com/moparisthebest/jdbc/codegen/JdbcMapperProcessor.java b/jdbcmapper/src/main/java/com/moparisthebest/jdbc/codegen/JdbcMapperProcessor.java index 22a4f40..4665c9b 100644 --- a/jdbcmapper/src/main/java/com/moparisthebest/jdbc/codegen/JdbcMapperProcessor.java +++ b/jdbcmapper/src/main/java/com/moparisthebest/jdbc/codegen/JdbcMapperProcessor.java @@ -72,10 +72,12 @@ public class JdbcMapperProcessor extends AbstractProcessor { //IFJAVA8_END private JdbcMapper.DatabaseType defaultDatabaseType; private String defaultArrayNumberTypeName, defaultArrayStringTypeName; - private SQLChecker sqlChecker; private Set allowedMaxRowParamNames; private CompileTimeResultSetMapper rsm; + private String sqlCheckerClass; + private SQLChecker sqlChecker; + public JdbcMapperProcessor() { //out.println("JdbcMapperProcessor running!"); } @@ -142,15 +144,8 @@ public class JdbcMapperProcessor extends AbstractProcessor { defaultArrayStringTypeName = processingEnv.getOptions().get("jdbcMapper.arrayStringTypeName"); if (defaultArrayStringTypeName == null || defaultArrayStringTypeName.isEmpty()) defaultArrayStringTypeName = defaultDatabaseType.arrayStringTypeName; - final String sqlCheckerClass = processingEnv.getOptions().get("jdbcMapper.sqlCheckerClass"); - if(sqlCheckerClass != null) { - try { - sqlChecker = (SQLChecker) Class.forName(sqlCheckerClass).newInstance(); - } catch (Throwable e) { - processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, - "Error instantiating class specified by jdbcMapper.sqlCheckerClass, needs to implement SQLChecker and have a public no-arg constructor:" + toString(e)); - } - } + + sqlCheckerClass = processingEnv.getOptions().get("jdbcMapper.sqlCheckerClass"); String allowedMaxRowParamNames = processingEnv.getOptions().get("JdbcMapper.allowedMaxRowParamNames"); if (allowedMaxRowParamNames == null || allowedMaxRowParamNames.isEmpty()) @@ -638,8 +633,20 @@ public class JdbcMapperProcessor extends AbstractProcessor { w.write("\t}\n"); - if(sqlChecker != null && eeMethod.getAnnotation(JdbcMapper.SkipSQLCheck.class) == null) + if(sqlCheckerClass != null && eeMethod.getAnnotation(JdbcMapper.SkipSQLCheck.class) == null) { + if(sqlChecker == null) { + // *can* this run in parallel? unsure, probably doesn't hurt though + synchronized (this) { + try { + sqlChecker = (SQLChecker) Class.forName(sqlCheckerClass).newInstance(); + } catch (Throwable e) { + processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, + "Error instantiating class specified by jdbcMapper.sqlCheckerClass, needs to implement SQLChecker and have a public no-arg constructor:" + toString(e), eeMethod); + } + } + } sqlChecker.checkSql(processingEnv, genClass, mapper, databaseType, eeMethod, sqlStatement, bindParams, arrayInList); + } } // look on super classes and interfaces recursively