Skip to content

Commit 0e6546a

Browse files
committed
add procedure call handler factory interface
1 parent 9862984 commit 0e6546a

8 files changed

+148
-336
lines changed

core/config.reference.xml

+10
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,16 @@ Setting this property to 0 means that there is no limit.
341341
</description>
342342
</configProperty>
343343

344+
<!-- net.sf.jasperreports.jdbc.procedure.call.handler.factory -->
345+
346+
<configProperty name="net.sf.jasperreports.jdbc.procedure.call.handler.factory">
347+
<description>
348+
Property specifying the name of the class implementing the
349+
<api href="net/sf/jasperreports/engine/query/JRJdbcQueryExecuter.html">ProcedureCallHandlerFactory</api> interface used to handle stored procedure calls
350+
in report SQL queries.
351+
</description>
352+
</configProperty>
353+
344354
<!-- net.sf.jasperreports.query.chunk.token.separators -->
345355

346356
<configProperty name="net.sf.jasperreports.query.chunk.token.separators">

core/src/main/java/net/sf/jasperreports/engine/query/JRJdbcQueryExecuter.java

+17-16
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,6 @@
3939
import java.util.Iterator;
4040
import java.util.Map;
4141
import java.util.TimeZone;
42-
import java.util.regex.Matcher;
43-
import java.util.regex.Pattern;
4442

4543
import javax.sql.rowset.CachedRowSet;
4644

@@ -52,10 +50,12 @@
5250
import net.sf.jasperreports.engine.JRException;
5351
import net.sf.jasperreports.engine.JRParameter;
5452
import net.sf.jasperreports.engine.JRPropertiesHolder;
53+
import net.sf.jasperreports.engine.JRPropertiesUtil;
5554
import net.sf.jasperreports.engine.JRResultSetDataSource;
5655
import net.sf.jasperreports.engine.JRRuntimeException;
5756
import net.sf.jasperreports.engine.JRValueParameter;
5857
import net.sf.jasperreports.engine.JasperReportsContext;
58+
import net.sf.jasperreports.engine.util.JRSingletonCache;
5959

6060

6161
/**
@@ -105,8 +105,8 @@ public class JRJdbcQueryExecuter extends JRAbstractQueryExecuter
105105

106106
protected static final String CACHED_ROWSET_CLASS = "com.sun.rowset.CachedRowSetImpl";
107107

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);
110110

111111
protected Connection connection;
112112

@@ -486,7 +486,7 @@ protected void createStatement() throws JRException
486486

487487
if (isProcedureCall)
488488
{
489-
initProcedureCall(callableStatement);
489+
procedureCallHandler.init(callableStatement);
490490
}
491491

492492
visitQueryParameters(new QueryParameterVisitor()
@@ -563,20 +563,21 @@ public void visit(ValuedQueryParameter valuedQueryParameter)
563563

564564
protected boolean isProcedureCall(String queryString) throws SQLException
565565
{
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)
567568
{
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+
}
570578
}
571579

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);
580581
}
581582

582583

core/src/main/java/net/sf/jasperreports/engine/query/OracleProcedureCallHandler.java

-249
This file was deleted.

0 commit comments

Comments
 (0)