net.sf.jasperreports.engine.query.OracleProcedureCallHandler Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jasperreports Show documentation
Show all versions of jasperreports Show documentation
Free Java Reporting Library
/*
* JasperReports - Free Java Reporting Library.
* Copyright (C) 2001 - 2019 TIBCO Software Inc. All rights reserved.
* http://www.jaspersoft.com
*
* Unless you have purchased a commercial license agreement from Jaspersoft,
* the following license terms apply:
*
* This program is part of JasperReports.
*
* JasperReports is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* JasperReports is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with JasperReports. If not, see .
*/
package net.sf.jasperreports.engine.query;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import net.sf.jasperreports.engine.JRRuntimeException;
/**
* @author Barry Klawans ([email protected])
*/
public class OracleProcedureCallHandler implements ProcedureCallHandler
{
private static final Log log = LogFactory.getLog(OracleProcedureCallHandler.class);
private static final Class ORACLE_CONNECTION_CLASS;
static
{
Class oracleConnectionClass;
try
{
oracleConnectionClass = Class.forName("oracle.jdbc.OracleConnection");
}
catch (ClassNotFoundException e)
{
oracleConnectionClass = null;
}
ORACLE_CONNECTION_CLASS = oracleConnectionClass;
}
private static final String URL_DATADIRECT = "jdbc:datadirect:oracle:";
private static final String URL_TIBCO = "jdbc:tibcosoftware:oracle:";
private static final String URL_ORACLE = "jdbc:oracle:";
private static final String DRIVER_NAME_ORACLE = "Oracle JDBC driver";
private static final String DRIVER_NAME_DATADIRECT = "Oracle";
private static final String DB_PRODUCT = "oracle";
private static final int ORACLE_CURSOR_TYPE = -10; // oracle.jdbc.OracleTypes.CURSOR
protected static boolean isOracle(Connection connection) throws SQLException
{
String dbVendor = connection.getMetaData().getDatabaseProductName().toLowerCase();
return DB_PRODUCT.equals(dbVendor);
}
private CallableStatement statement;
private boolean isDataDirectDriver;
private int cursorParameter = -1;
@Override
public void init(CallableStatement statement)
{
this.statement = statement;
isDataDirectDriver = isDataDirectDriver();
if (log.isDebugEnabled())
{
log.debug("DataDirect driver " + isDataDirectDriver);
}
}
protected boolean isDataDirectDriver()
{
Connection connection;
try
{
connection = statement.getConnection();
}
catch (SQLException e)
{
log.error("Failure while detecting driver", e);
return false;
}
DatabaseMetaData metaData = null;
try
{
metaData = connection.getMetaData();
}
catch (SQLException e)
{
log.error("Failure while detecting driver", e);
}
String connectionURL = null;
if (metaData != null)
{
try
{
connectionURL = metaData.getURL();
}
catch (SQLException e)
{
log.error("Failure while detecting driver", e);
}
}
if (connectionURL != null)
{
if (connectionURL.contains(URL_DATADIRECT) || connectionURL.contains(URL_TIBCO))
{
return true;
}
if (connectionURL.contains(URL_ORACLE))
{
return false;
}
}
if (ORACLE_CONNECTION_CLASS != null)
{
try
{
if (connection.isWrapperFor(ORACLE_CONNECTION_CLASS))
{
return false;
}
}
catch (SQLException e)
{
log.error("Failure while detecting driver", e);
}
}
if (metaData != null)
{
try
{
String driverName = metaData.getDriverName();
if (driverName.equals(DRIVER_NAME_ORACLE))
{
return false;
}
if (driverName.equals(DRIVER_NAME_DATADIRECT))
{
return true;
}
}
catch (SQLException e)
{
log.error("Failure while detecting driver", e);
}
}
//fallback to Oracle
return false;
}
@Override
public boolean setParameterValue(int parameterIndex,
Class type, Object value) throws SQLException
{
if (java.sql.ResultSet.class.isAssignableFrom(type))
{
if (cursorParameter > 0)
{
throw new JRRuntimeException("A stored procedure can have at most one cursor parameter : "
+ parameterIndex + " class " + type.getName());
}
cursorParameter = parameterIndex;
if (isDataDirectDriver)
{
statement.setInt(parameterIndex, 0);
}
else
{
statement.registerOutParameter(parameterIndex, ORACLE_CURSOR_TYPE);
}
return true;
}
return false;
}
@Override
public ResultSet execute() throws SQLException
{
boolean isResult = statement.execute();
ResultSet resultSet = null;
if (isDataDirectDriver)
{
while (!isResult)
{
int updateCount = statement.getUpdateCount();
if (log.isDebugEnabled())
{
log.debug("Update count " + updateCount);
}
if (updateCount == -1)
{
break;
}
isResult = statement.getMoreResults();
}
if (isResult)
{
resultSet = statement.getResultSet();
}
else if (log.isDebugEnabled())
{
log.debug("No ResultSet found");
}
}
else
{
if (cursorParameter > 0)
{
resultSet = (java.sql.ResultSet) statement.getObject(cursorParameter);
}
}
return resultSet;
}
}