|
39 | 39 | import java.util.Iterator;
|
40 | 40 | import java.util.Map;
|
41 | 41 | import java.util.TimeZone;
|
42 |
| -import java.util.regex.Matcher; |
43 |
| -import java.util.regex.Pattern; |
44 | 42 |
|
45 | 43 | import javax.sql.rowset.CachedRowSet;
|
46 | 44 |
|
|
52 | 50 | import net.sf.jasperreports.engine.JRException;
|
53 | 51 | import net.sf.jasperreports.engine.JRParameter;
|
54 | 52 | import net.sf.jasperreports.engine.JRPropertiesHolder;
|
| 53 | +import net.sf.jasperreports.engine.JRPropertiesUtil; |
55 | 54 | import net.sf.jasperreports.engine.JRResultSetDataSource;
|
56 | 55 | import net.sf.jasperreports.engine.JRRuntimeException;
|
57 | 56 | import net.sf.jasperreports.engine.JRValueParameter;
|
58 | 57 | import net.sf.jasperreports.engine.JasperReportsContext;
|
| 58 | +import net.sf.jasperreports.engine.util.JRSingletonCache; |
59 | 59 |
|
60 | 60 |
|
61 | 61 | /**
|
@@ -105,8 +105,8 @@ public class JRJdbcQueryExecuter extends JRAbstractQueryExecuter
|
105 | 105 |
|
106 | 106 | protected static final String CACHED_ROWSET_CLASS = "com.sun.rowset.CachedRowSetImpl";
|
107 | 107 |
|
108 |
| - protected static final Pattern PROCEDURE_CALL_PATTERN = Pattern.compile("\\s*\\{\\s*call\\s+", |
109 |
| - Pattern.MULTILINE | Pattern.CASE_INSENSITIVE); |
| 108 | + private static final JRSingletonCache<ProcedureCallHandlerFactory> procedureCallHandlerFactoryCache = |
| 109 | + new JRSingletonCache<>(ProcedureCallHandlerFactory.class); |
110 | 110 |
|
111 | 111 | protected Connection connection;
|
112 | 112 |
|
@@ -486,7 +486,7 @@ protected void createStatement() throws JRException
|
486 | 486 |
|
487 | 487 | if (isProcedureCall)
|
488 | 488 | {
|
489 |
| - initProcedureCall(callableStatement); |
| 489 | + procedureCallHandler.init(callableStatement); |
490 | 490 | }
|
491 | 491 |
|
492 | 492 | visitQueryParameters(new QueryParameterVisitor()
|
@@ -563,20 +563,21 @@ public void visit(ValuedQueryParameter valuedQueryParameter)
|
563 | 563 |
|
564 | 564 | protected boolean isProcedureCall(String queryString) throws SQLException
|
565 | 565 | {
|
566 |
| - if (!OracleProcedureCallHandler.isOracle(connection)) |
| 566 | + String factoryClass = JRPropertiesUtil.getInstance(getJasperReportsContext()).getProperty(dataset, ProcedureCallHandlerFactory.PROPERTY_PROCEDURE_CALL_HANDLER_FACTORY); |
| 567 | + if (factoryClass != null && factoryClass.trim().length() > 0) |
567 | 568 | {
|
568 |
| - //only supporting oracle for now |
569 |
| - return false; |
| 569 | + try |
| 570 | + { |
| 571 | + ProcedureCallHandlerFactory factory = procedureCallHandlerFactoryCache.getCachedInstance(factoryClass); |
| 572 | + procedureCallHandler = factory.createProcedureCallHandler(); |
| 573 | + } |
| 574 | + catch (JRException e) |
| 575 | + { |
| 576 | + throw new JRRuntimeException(e); |
| 577 | + } |
570 | 578 | }
|
571 | 579 |
|
572 |
| - Matcher matcher = PROCEDURE_CALL_PATTERN.matcher(queryString); |
573 |
| - return matcher.find() && matcher.start() == 0; |
574 |
| - } |
575 |
| - |
576 |
| - protected void initProcedureCall(CallableStatement callableStatement) throws SQLException |
577 |
| - { |
578 |
| - procedureCallHandler = new OracleProcedureCallHandler(); |
579 |
| - procedureCallHandler.init(callableStatement); |
| 580 | + return procedureCallHandler == null ? false : procedureCallHandler.isHandling(connection, queryString); |
580 | 581 | }
|
581 | 582 |
|
582 | 583 |
|
|
0 commit comments