/**
* mconner, 2009-07-14: What's Going on Here?
* This class, JRQueryExecuter, was the sole inhabitant of a jar, jasperreports-query-1.1.0.jar, that was included
* in the initial openreports-pro-3.1.0. However, I wasn't able to find a jar or zip published by jasper or
* sourceforge for the jar, or even one that included the source (i.e. jasperreports-1.1.0.jar). However, there were
* several sources of this file online. I grabbed one of those, and rather than hope that it matched, I removed
* the jar and added it to the openreports source tree, so we have source that matches the actual bytecode. In
* reality, we should not be using this class at all, but should use some other manner for parsing the query, but I
* at this point, I added this so we could diagnose another problem.
*
* TODO: eliminate the need for this class, use more current jasper query execution.
*/
package net.sf.jasperreports.engine.util;
/*
* ============================================================================ GNU Lesser General Public License
* ============================================================================
*
* JasperReports - Free Java report-generating library. Copyright (C) 2001-2005 JasperSoft Corporation
* http://www.jaspersoft.com
*
* This library 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 2.1 of the License, or (at your option)
* any later version.
*
* This library 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 this library; if not, write to
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*
* JasperSoft Corporation 185, Berry Street, Suite 6200 San Francisco CA 94107 http://www.jaspersoft.com
*/
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JRQuery;
import net.sf.jasperreports.engine.JRQueryChunk;
/**
* @author Teodor Danciu (teodord@users.sourceforge.net)
* @version $Id: JRQueryExecuter.java,v 1.7 2005/06/27 07:16:53 teodord Exp $
*/
public class JRQueryExecuter {
/**
*
*/
private JRQuery query = null;
private Map parametersMap = new HashMap();
private Map parameterValues = null;
private String queryString = "";
private List parameterNames = new ArrayList();
/**
*
*/
protected JRQueryExecuter( JRQuery query, Map parameters, Map values ) {
this.query = query;
this.parametersMap = parameters;
this.parameterValues = values;
this.parseQuery();
}
/**
*
*/
public static PreparedStatement getStatement( JRQuery query, Map parameters, Map values, Connection conn )
throws JRException {
PreparedStatement pstmt = null;
if( conn != null ) {
JRQueryExecuter queryExecuter = new JRQueryExecuter( query, parameters, values );
pstmt = queryExecuter.getStatement( conn );
}
return pstmt;
}
/**
*
*/
private void parseQuery() {
queryString = "";
parameterNames = new ArrayList();
if( query != null ) {
JRQueryChunk[] chunks = query.getChunks();
if( chunks != null && chunks.length > 0 ) {
StringBuffer sbuffer = new StringBuffer();
JRQueryChunk chunk = null;
for( int i = 0; i < chunks.length; i++ ) {
chunk = chunks[i];
switch( chunk.getType() ) {
case JRQueryChunk.TYPE_PARAMETER_CLAUSE: {
String parameterName = chunk.getText();
Object parameterValue = parameterValues.get( parameterName );
sbuffer.append( String.valueOf( parameterValue ) );
// parameterNames.add(parameterName);
break;
}
case JRQueryChunk.TYPE_PARAMETER: {
sbuffer.append( "?" );
parameterNames.add( chunk.getText() );
break;
}
case JRQueryChunk.TYPE_TEXT:
default: {
sbuffer.append( chunk.getText() );
break;
}
}
}
queryString = sbuffer.toString();
}
}
}
/**
*
*/
private PreparedStatement getStatement( Connection conn ) throws JRException {
PreparedStatement pstmt = null;
if( queryString != null && queryString.trim().length() > 0 ) {
try {
pstmt = conn.prepareStatement( queryString );
if( parameterNames != null && parameterNames.size() > 0 ) {
JRParameter parameter = null;
String parameterName = null;
Class<?> clazz = null;
Object parameterValue = null;
for( int i = 0; i < parameterNames.size(); i++ ) {
parameterName = (String) parameterNames.get( i );
parameter = (JRParameter) parametersMap.get( parameterName );
if ( parameter == null ) {
throw new JRException( "Parameter '" + parameterName + "' found in query not defined on report." );
}
clazz = getBaseType( parameter.getValueClass(), parameterName );
// FIXMEparameterValue = jrParameter.getValue();
parameterValue = parameterValues.get( parameterName );
parameterValue = getSingleValue( parameterValue, parameterName );
if( clazz.equals( java.lang.Object.class ) ) {
if( parameterValue == null ) {
pstmt.setNull( i + 1, Types.JAVA_OBJECT );
} else {
pstmt.setObject( i + 1, parameterValue );
}
} else if( clazz.equals( java.lang.Boolean.class ) ) {
if( parameterValue == null ) {
pstmt.setNull( i + 1, Types.BIT );
} else {
pstmt.setBoolean( i + 1, ( (Boolean) parameterValue ).booleanValue() );
}
} else if( clazz.equals( java.lang.Byte.class ) ) {
if( parameterValue == null ) {
pstmt.setNull( i + 1, Types.TINYINT );
} else {
pstmt.setByte( i + 1, ( (Byte) parameterValue ).byteValue() );
}
} else if( clazz.equals( java.lang.Double.class ) ) {
if( parameterValue == null ) {
pstmt.setNull( i + 1, Types.DOUBLE );
} else {
pstmt.setDouble( i + 1, ( (Double) parameterValue ).doubleValue() );
}
} else if( clazz.equals( java.lang.Float.class ) ) {
if( parameterValue == null ) {
pstmt.setNull( i + 1, Types.FLOAT );
} else {
pstmt.setFloat( i + 1, ( (Float) parameterValue ).floatValue() );
}
} else if( clazz.equals( java.lang.Integer.class ) ) {
if( parameterValue == null ) {
pstmt.setNull( i + 1, Types.INTEGER );
} else {
pstmt.setInt( i + 1, ( (Integer) parameterValue ).intValue() );
}
} else if( clazz.equals( java.lang.Long.class ) ) {
if( parameterValue == null ) {
pstmt.setNull( i + 1, Types.BIGINT );
} else {
pstmt.setLong( i + 1, ( (Long) parameterValue ).longValue() );
}
} else if( clazz.equals( java.lang.Short.class ) ) {
if( parameterValue == null ) {
pstmt.setNull( i + 1, Types.SMALLINT );
} else {
pstmt.setShort( i + 1, ( (Short) parameterValue ).shortValue() );
}
} else if( clazz.equals( java.math.BigDecimal.class ) ) {
if( parameterValue == null ) {
pstmt.setNull( i + 1, Types.DECIMAL );
} else {
pstmt.setBigDecimal( i + 1, (BigDecimal) parameterValue );
}
} else if( clazz.equals( java.lang.String.class ) ) {
if( parameterValue == null ) {
pstmt.setNull( i + 1, Types.VARCHAR );
} else {
pstmt.setString( i + 1, parameterValue.toString() );
}
} else if( clazz.equals( java.util.Date.class ) ) {
if( parameterValue == null ) {
pstmt.setNull( i + 1, Types.DATE );
} else {
pstmt
.setDate( i + 1, new java.sql.Date( ( (java.util.Date) parameterValue )
.getTime() ) );
}
} else if( clazz.equals( java.sql.Timestamp.class ) ) {
if( parameterValue == null ) {
pstmt.setNull( i + 1, Types.TIMESTAMP );
} else {
pstmt.setTimestamp( i + 1, (java.sql.Timestamp) parameterValue );
}
} else if( clazz.equals( java.sql.Time.class ) ) {
if( parameterValue == null ) {
pstmt.setNull( i + 1, Types.TIME );
} else {
pstmt.setTime( i + 1, (java.sql.Time) parameterValue );
}
} else {
throw new JRException( "Parameter type not supported in query : " + parameterName
+ " class " + clazz.getName() );
}
}
}
} catch( SQLException e ) {
throw new JRException( "Error preparing statement for executing the report query : " + "\n\n"
+ queryString + "\n\n", e );
}
}
return pstmt;
}
public static Object getSingleValue( Object value, String description ) {
if( value == null ) {
return null;
}
if( value.getClass().isArray() ) {
Object[] array = (Object[]) value;
switch( array.length ) {
case 0:
return null;
case 1:
return ( array[0] == null ) ? null : array[0].toString();
default:
throw new IllegalStateException( "more than one (" + array.length + ") value for " + description );
}
} else {
return value;
}
}
public static Class<?> getBaseType( Class<?> clazz, String description ) {
if( clazz == null ) {
return null;
}
if( clazz.isArray() ) {
return clazz.getComponentType();
} else {
return clazz;
}
}
}