net.sf.jasperreports.data.jdbc.JdbcDataAdapterService 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.data.jdbc;
import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.SQLException;
import java.util.Map;
import java.util.Properties;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import net.sf.jasperreports.data.AbstractClasspathAwareDataAdapterService;
import net.sf.jasperreports.engine.JRDataset;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JRPropertiesUtil;
import net.sf.jasperreports.engine.JRRuntimeException;
import net.sf.jasperreports.engine.ParameterContributorContext;
import net.sf.jasperreports.engine.util.JRClassLoader;
import net.sf.jasperreports.util.SecretsUtil;
/**
* @author Teodor Danciu ([email protected])
*/
public class JdbcDataAdapterService extends AbstractClasspathAwareDataAdapterService
{
private static final Log log = LogFactory.getLog(JdbcDataAdapterService.class);
public static final String EXCEPTION_MESSAGE_KEY_PASSWORD_REQUIRED = "data.jdbc.password.required";
public static final String EXCEPTION_MESSAGE_KEY_INVALID_URL = "data.jdbc.invalid.url";
public static final String EXCEPTION_MESSAGE_KEY_CONNECTION_NOT_CREATED = "data.jdbc.connection.not.created";
private Connection connection = null;
// /**
// * This classloader is used to load JDBC drivers available in the set of
// * paths provided by classpathPaths.
// */
// private ClassLoader classLoader = null;
//
// /**
// * Same as getDriversClassLoader(false)
// *
// * @return
// */
// public ClassLoader getClassLoader() {
// return getClassLoader(false);
// }
//
// /**
// * Return the classloader, an URLClassLoader made up with all the paths
// * defined to look for Drivers (mainly jars).
// *
// * @param reload
// * - if true, it forces a classloader rebuilt with the set of
// * paths in classpathPaths.
// * @return
// */
// public ClassLoader getClassLoader(boolean reload) {
// if (classLoader == null || reload) {
// List paths = ((JdbcDataAdapter) getDataAdapter())
// .getClasspathPaths();
// List urls = new ArrayList();
// for (String p : paths) {
// FileResolver fileResolver = JRResourcesUtil
// .getFileResolver(null);
// File f = fileResolver.resolveFile(p);
//
// if (f != null && f.exists()) {
// try {
// urls.add(f.toURI().toURL());
// } catch (MalformedURLException e) {
// // e.printStackTrace();
// // We don't care if the entry cannot be found.
// }
// }
// }
//
// classLoader = new URLClassLoader(urls.toArray(new URL[urls.size()]));
// }
//
// return classLoader;
// }
/**
*
*/
public JdbcDataAdapterService(ParameterContributorContext paramContribContext, JdbcDataAdapter jdbcDataAdapter)
{
super(paramContribContext, jdbcDataAdapter);
}
public JdbcDataAdapter getJdbcDataAdapter() {
return (JdbcDataAdapter) getDataAdapter();
}
@Override
public void contributeParameters(Map parameters) throws JRException
{
try {
connection = getConnection();
} catch (SQLException e) {
throw new JRException(e);
}
parameters.put(JRParameter.REPORT_CONNECTION, connection);
}
public Connection getConnection() throws SQLException{
JdbcDataAdapter jdbcDataAdapter = getJdbcDataAdapter();
if (jdbcDataAdapter != null)
{
ClassLoader oldThreadClassLoader = Thread.currentThread().getContextClassLoader();
try
{
Thread.currentThread().setContextClassLoader(getClassLoader(oldThreadClassLoader));
Class clazz = JRClassLoader.loadClassForRealName(jdbcDataAdapter.getDriver());
Driver driver = (Driver) clazz.getDeclaredConstructor().newInstance();
// Driver driver = (Driver) (Class.forName(
// jdbcDataAdapter.getDriver(), true, getClassLoader()))
// .getDeclaredConstructor().newInstance();
Properties connectProps = new Properties();
Map map = jdbcDataAdapter.getProperties();
if(map != null)
for(String key: map.keySet())
connectProps.setProperty(key, map.get(key));
String password = jdbcDataAdapter.getPassword();
SecretsUtil secretService = SecretsUtil.getInstance(getJasperReportsContext());
if (secretService != null)
password = secretService.getSecret(SECRETS_CATEGORY, password);
connectProps.setProperty("user", jdbcDataAdapter.getUsername());
connectProps.setProperty("password", password);
connection = driver.connect(jdbcDataAdapter.getUrl(), connectProps);
if(connection == null)
{
boolean urlValid = driver.acceptsURL(jdbcDataAdapter.getUrl());
if (!urlValid)
{
throw new JRRuntimeException(EXCEPTION_MESSAGE_KEY_INVALID_URL,
new Object[] {jdbcDataAdapter.getUrl(), jdbcDataAdapter.getDriver()});
}
throw new JRRuntimeException(EXCEPTION_MESSAGE_KEY_CONNECTION_NOT_CREATED,
new Object[] {jdbcDataAdapter.getUrl()});
}
setupConnection(jdbcDataAdapter);
}
catch (ClassNotFoundException | InstantiationException | IllegalAccessException
| NoSuchMethodException | InvocationTargetException e) {
throw new JRRuntimeException(e);
} finally {
Thread.currentThread().setContextClassLoader(oldThreadClassLoader);
}
return connection;
}
return null;
}
protected void setupConnection(JdbcDataAdapter dataAdapter) throws SQLException
{
JRPropertiesUtil props = JRPropertiesUtil.getInstance(getJasperReportsContext());
JRDataset dataset = getParameterContributorContext().getDataset();
Boolean autoCommit = getAutoCommit(dataAdapter, props, dataset);
if (autoCommit != null)
{
if (log.isDebugEnabled())
{
log.debug("setting auto commit " + autoCommit + " on connection " + connection);
}
connection.setAutoCommit(autoCommit);
}
Boolean readOnly = getReadOnly(dataAdapter, props, dataset);
if (readOnly != null)
{
if (log.isDebugEnabled())
{
log.debug("setting read only " + readOnly + " on connection " + connection);
}
connection.setReadOnly(readOnly);
}
Integer transactionIsolation = getTransactionIsolation(dataAdapter, props, dataset);
if (transactionIsolation != null)
{
if (log.isDebugEnabled())
{
log.debug("setting transaction isolation " + transactionIsolation + " on connection " + connection);
}
connection.setTransactionIsolation(transactionIsolation);
}
}
protected Boolean getAutoCommit(JdbcDataAdapter dataAdapter,
JRPropertiesUtil props, JRDataset dataset)
{
Boolean autoCommit = dataAdapter.getAutoCommit();
if (autoCommit != null)
{
return autoCommit;
}
return props.getBooleanProperty(dataset, JdbcDataAdapter.PROPERTY_DEFAULT_AUTO_COMMIT);
}
protected Boolean getReadOnly(JdbcDataAdapter dataAdapter,
JRPropertiesUtil props, JRDataset dataset)
{
Boolean readOnly = dataAdapter.getReadOnly();
if (readOnly != null)
{
return readOnly;
}
return props.getBooleanProperty(dataset, JdbcDataAdapter.PROPERTY_DEFAULT_READ_ONLY);
}
protected Integer getTransactionIsolation(JdbcDataAdapter dataAdapter,
JRPropertiesUtil props, JRDataset dataset)
{
TransactionIsolation transactionIsolation = dataAdapter.getTransactionIsolation();
if (transactionIsolation != null)
{
return transactionIsolation.getLevel();
}
String prop = props.getProperty(dataset, JdbcDataAdapter.PROPERTY_DEFAULT_TRANSACTION_ISOLATION);
if (prop != null && !prop.trim().isEmpty())
{
transactionIsolation = TransactionIsolation.valueOf(prop.trim());
return transactionIsolation.getLevel();
}
return null;
}
public String getPassword() throws JRException {
throw
new JRException(
EXCEPTION_MESSAGE_KEY_PASSWORD_REQUIRED,
(Object[])null);
}
@Override
public void dispose()
{
if (connection != null)
{
try
{
connection.close();
}
catch (Exception ex)
{
if (log.isErrorEnabled())
log.error("Error while closing the connection.", ex);
}
}
}
}