JDBCParameterUtilities.java
/*
* GovWay - A customizable API Gateway
* https://govway.org
*
* Copyright (c) 2005-2024 Link.it srl (https://link.it).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3, as published by
* the Free Software Foundation.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openspcoop2.utils.jdbc;
import java.io.InputStream;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.net.URI;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.Date;
import org.openspcoop2.utils.TipiDatabase;
import org.openspcoop2.utils.Utilities;
import org.openspcoop2.utils.UtilsException;
/**
* JDBCParameterUtilities
*
* @author Poli Andrea (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class JDBCParameterUtilities {
private TipiDatabase tipoDatabase = null;
private IJDBCAdapter jdbcAdapter = null;
public JDBCParameterUtilities(TipiDatabase tipoDatabaseOpenSPCoop2) throws JDBCAdapterException{
this.tipoDatabase = tipoDatabaseOpenSPCoop2;
this.jdbcAdapter = JDBCAdapterFactory.createJDBCAdapter(this.tipoDatabase.getNome());
}
public void setParameter(PreparedStatement pstmt,int index,Object value, Class<?> type) throws SQLException, UtilsException{
/**System.out.println("SET PARAMETER VALUE["+value+"] TYPE["+type.getName()+"]");*/
if(type.isAssignableFrom(String.class)){
String valueWrapped = null;
if(value instanceof String){
valueWrapped = (String) value;
}
else if(value instanceof Character){
valueWrapped = ((Character)value).charValue()+"";
}
else if(value!=null){
throw new UtilsException("Tipo["+type.getName()+"] non compatibile con l'oggetto fornito["+value.getClass().getName()+"]");
}
if(value==null){
pstmt.setNull(index, java.sql.Types.VARCHAR);
}else{
pstmt.setString(index, valueWrapped);
}
}
else if(type.isAssignableFrom(Character.class) ||
type.isAssignableFrom(char.class)){
Character valueWrapped = null;
String charValue = null;
if(value!=null){
valueWrapped = (Character) value;
char charPrimitiveValue = valueWrapped.charValue();
charValue = valueWrapped.charValue()+"";
if(charPrimitiveValue==0){ // == ''
// ERROR: invalid byte sequence for encoding "UTF8": 0x00
// Postgresql non supporta il carattere 'vuoto'. Si deve usare un null value
charValue = null;
}
}
if(charValue!=null){
pstmt.setString(index, charValue );
}else{
pstmt.setNull(index, java.sql.Types.VARCHAR);
}
}
else if(type.isAssignableFrom(Boolean.class) ||
type.isAssignableFrom(boolean.class)){
if(value!=null){
Boolean valueWrapped = (Boolean) value;
pstmt.setBoolean(index, valueWrapped);
}
else{
if(TipiDatabase.ORACLE.equals(this.tipoDatabase) ||
TipiDatabase.DB2.equals(this.tipoDatabase) ){
pstmt.setNull(index, java.sql.Types.INTEGER);
}
else{
pstmt.setNull(index, java.sql.Types.BOOLEAN);
}
}
}
else if(type.isAssignableFrom(Byte.class) ||
type.isAssignableFrom(byte.class)){
if(value!=null){
Byte valueWrapped = (Byte) value;
/**pstmt.setByte(index, valueWrapped); tradotto come INT nel database*/
pstmt.setInt(index, valueWrapped.intValue());
}
else{
/**pstmt.setNull(index, java.sql.Types.BINARY);*/
pstmt.setNull(index, java.sql.Types.INTEGER);
}
}
else if(type.isAssignableFrom(Short.class) ||
type.isAssignableFrom(short.class)){
if(value!=null){
Short valueWrapped = (Short) value;
pstmt.setShort(index, valueWrapped);
}
else{
pstmt.setNull(index, java.sql.Types.INTEGER);
}
}
else if(type.isAssignableFrom(Integer.class) ||
type.isAssignableFrom(int.class)){
if(value!=null){
Integer valueWrapped = (Integer) value;
pstmt.setInt(index, valueWrapped);
}
else{
pstmt.setNull(index, java.sql.Types.INTEGER);
}
}
else if(type.isAssignableFrom(Long.class) ||
type.isAssignableFrom(long.class)){
if(value!=null){
Long valueWrapped = (Long) value;
pstmt.setLong(index, valueWrapped);
}
else{
pstmt.setNull(index, java.sql.Types.BIGINT);
}
}
else if(type.isAssignableFrom(java.math.BigInteger.class) ){
if(value!=null){
java.math.BigInteger valueWrapped = (java.math.BigInteger) value;
pstmt.setLong(index, valueWrapped.longValue());
}
else{
pstmt.setNull(index, java.sql.Types.BIGINT);
}
}
else if(type.isAssignableFrom(Float.class) ||
type.isAssignableFrom(float.class)){
if(value!=null){
Float valueWrapped = (Float) value;
pstmt.setFloat(index, valueWrapped);
}
else{
pstmt.setNull(index, java.sql.Types.FLOAT);
}
}
else if(type.isAssignableFrom(Double.class) ||
type.isAssignableFrom(double.class)){
if(value!=null){
Double valueWrapped = (Double) value;
pstmt.setDouble(index, valueWrapped);
}
else{
pstmt.setNull(index, java.sql.Types.DOUBLE);
}
}
else if(type.isAssignableFrom(java.math.BigDecimal.class)){
if(value!=null){
java.math.BigDecimal valueWrapped = (java.math.BigDecimal) value;
pstmt.setDouble(index, valueWrapped.doubleValue());
}
else{
pstmt.setNull(index, java.sql.Types.FLOAT);
}
}
else if(type.isAssignableFrom(Date.class)){
Date valueWrapped = null;
if(value!=null){
valueWrapped = (Date) value;
}
if(value!=null){
pstmt.setTimestamp(index, new Timestamp((valueWrapped).getTime()));
}else{
pstmt.setNull(index, java.sql.Types.TIMESTAMP);
}
}
else if(type.isAssignableFrom(java.sql.Date.class)){
java.sql.Date valueWrapped = null;
if(value!=null){
valueWrapped = (java.sql.Date) value;
}
if(value!=null){
pstmt.setTimestamp(index, new Timestamp((valueWrapped).getTime()));
}else{
pstmt.setNull(index, java.sql.Types.TIMESTAMP);
}
}
else if(type.isAssignableFrom(Timestamp.class)){
if(value!=null){
Timestamp valueWrapped = (Timestamp) value;
pstmt.setTimestamp(index,valueWrapped);
}
else{
pstmt.setNull(index, java.sql.Types.TIMESTAMP);
}
}
else if(type.isAssignableFrom(Calendar.class)){
Calendar valueWrapped = null;
if(value!=null){
valueWrapped = (Calendar) value;
}
if(value!=null){
pstmt.setTimestamp(index, new Timestamp((valueWrapped).getTime().getTime()));
}else{
pstmt.setNull(index, java.sql.Types.TIMESTAMP);
}
}
else if(type.isAssignableFrom(byte[].class)){
byte[] valueWrapped = null;
if(value!=null){
valueWrapped = (byte[]) value;
}
this.jdbcAdapter.setBinaryData(pstmt, index, valueWrapped);
}
else if(type.isAssignableFrom(URI.class)){
if(value!=null){
URI valueWrapped = (URI) value;
pstmt.setString(index,valueWrapped.toString());
}
else{
pstmt.setNull(index, java.sql.Types.TIMESTAMP);
}
}
else{
throw new SQLException("Tipo di oggetto (posizione "+index+") "+"non gestito: "+type.getClass().getName()+" - "+type);
}
}
public String readStringParameter(ResultSet rs,int index) throws SQLException, UtilsException{
return (String) readParameter(rs, index, String.class);
}
public String readStringParameter(ResultSet rs,String name) throws SQLException, UtilsException{
return (String) readParameter(rs, name, String.class);
}
public Character readCharParameter(ResultSet rs,int index) throws SQLException, UtilsException{
return (Character) readParameter(rs, index, Character.class);
}
public Character readCharParameter(ResultSet rs,String name) throws SQLException, UtilsException{
return (Character) readParameter(rs, name, Character.class);
}
public Boolean readBooleanParameter(ResultSet rs,int index) throws SQLException, UtilsException{
return (Boolean) readParameter(rs, index, Boolean.class);
}
public Boolean readBooleanParameter(ResultSet rs,String name) throws SQLException, UtilsException{
return (Boolean) readParameter(rs, name, Boolean.class);
}
public Byte readByteParameter(ResultSet rs,int index) throws SQLException, UtilsException{
return (Byte) readParameter(rs, index, Byte.class);
}
public Byte readByteParameter(ResultSet rs,String name) throws SQLException, UtilsException{
return (Byte) readParameter(rs, name, Byte.class);
}
public Short readShortParameter(ResultSet rs,int index) throws SQLException, UtilsException{
return (Short) readParameter(rs, index, Short.class);
}
public Short readShortParameter(ResultSet rs,String name) throws SQLException, UtilsException{
return (Short) readParameter(rs, name, Short.class);
}
public Integer readIntegerParameter(ResultSet rs,int index) throws SQLException, UtilsException{
return (Integer) readParameter(rs, index, Integer.class);
}
public Integer readIntegerParameter(ResultSet rs,String name) throws SQLException, UtilsException{
return (Integer) readParameter(rs, name, Integer.class);
}
public Long readLongParameter(ResultSet rs,int index) throws SQLException, UtilsException{
return (Long) readParameter(rs, index, Long.class);
}
public Long readLongParameter(ResultSet rs,String name) throws SQLException, UtilsException{
return (Long) readParameter(rs, name, Long.class);
}
public BigInteger readBigIntegerParameter(ResultSet rs,int index) throws SQLException, UtilsException{
return (BigInteger) readParameter(rs, index, BigInteger.class);
}
public BigInteger readBigIntegerParameter(ResultSet rs,String name) throws SQLException, UtilsException{
return (BigInteger) readParameter(rs, name, BigInteger.class);
}
public Float readFloatParameter(ResultSet rs,int index) throws SQLException, UtilsException{
return (Float) readParameter(rs, index, Float.class);
}
public Float readFloatParameter(ResultSet rs,String name) throws SQLException, UtilsException{
return (Float) readParameter(rs, name, Float.class);
}
public Double readDoubleParameter(ResultSet rs,int index) throws SQLException, UtilsException{
return (Double) readParameter(rs, index, Double.class);
}
public Double readDoubleParameter(ResultSet rs,String name) throws SQLException, UtilsException{
return (Double) readParameter(rs, name, Double.class);
}
public BigDecimal readBigDecimalParameter(ResultSet rs,int index) throws SQLException, UtilsException{
return (BigDecimal) readParameter(rs, index, BigDecimal.class);
}
public BigDecimal readBigDecimalParameter(ResultSet rs,String name) throws SQLException, UtilsException{
return (BigDecimal) readParameter(rs, name, BigDecimal.class);
}
public Date readDateParameter(ResultSet rs,int index) throws SQLException, UtilsException{
return (Date) readParameter(rs, index, Date.class);
}
public Date readDateParameter(ResultSet rs,String name) throws SQLException, UtilsException{
return (Date) readParameter(rs, name, Date.class);
}
public java.sql.Date readSqlDateParameter(ResultSet rs,int index) throws SQLException, UtilsException{
return (java.sql.Date) readParameter(rs, index, java.sql.Date.class);
}
public java.sql.Date readSqlDateParameter(ResultSet rs,String name) throws SQLException, UtilsException{
return (java.sql.Date) readParameter(rs, name, java.sql.Date.class);
}
public Timestamp readTimestampParameter(ResultSet rs,int index) throws SQLException, UtilsException{
return (Timestamp) readParameter(rs, index, Timestamp.class);
}
public Timestamp readTimestampParameter(ResultSet rs,String name) throws SQLException, UtilsException{
return (Timestamp) readParameter(rs, name, Timestamp.class);
}
public Calendar readCalendarParameter(ResultSet rs,int index) throws SQLException, UtilsException{
return (Calendar) readParameter(rs, index, Calendar.class);
}
public Calendar readCalendarParameter(ResultSet rs,String name) throws SQLException, UtilsException{
return (Calendar) readParameter(rs, name, Calendar.class);
}
public URI readURIParameter(ResultSet rs,int index) throws SQLException, UtilsException{
return (URI) readParameter(rs, index, URI.class);
}
public URI readURIParameter(ResultSet rs,String name) throws SQLException, UtilsException{
return (URI) readParameter(rs, name, URI.class);
}
public Object readParameter(ResultSet rs,int index,Class<?> type) throws SQLException, UtilsException{
return readParameter(rs, index, null, type, JDBCDefaultForXSDType.NONE);
}
public Object readParameter(ResultSet rs,String name,Class<?> type) throws SQLException, UtilsException{
return readParameter(rs, -1, name, type, JDBCDefaultForXSDType.NONE);
}
public Object readParameter(ResultSet rs,String name,Class<?> type,JDBCDefaultForXSDType jdbcDefaultForXSDType) throws SQLException, UtilsException{
return readParameter(rs, -1, name, type, jdbcDefaultForXSDType);
}
private Object readParameter(ResultSet rs,int index,String name,Class<?> type,JDBCDefaultForXSDType jdbcDefaultForXSDType) throws SQLException, UtilsException{
if(type.toString().equals(String.class.toString())){
if(name!=null){
return rs.getString(name);
}else{
return rs.getString(index);
}
}
else if(type.toString().equals(Character.class.toString()) || type.toString().equals(char.class.toString())){
String s = null;
if(name!=null){
s = rs.getString(name);
}else{
s = rs.getString(index);
}
if(s!=null){
return Character.valueOf(s.charAt(0));
}else{
if(type.toString().equals(char.class.toString())){
// primitive default value
return '\u0000';
}
else{
return null;
}
}
}
else if(type.toString().equals(Boolean.class.toString()) || type.toString().equals(boolean.class.toString())){
boolean booleanValue;
if(name!=null){
booleanValue = rs.getBoolean(name);
}else{
booleanValue = rs.getBoolean(index);
}
if(type.toString().equals(Boolean.class.toString()) &&
rs.wasNull()){
return null;
}
return booleanValue;
}
else if(type.toString().equals(Byte.class.toString()) || type.toString().equals(byte.class.toString())){
byte byteValue;
if(name!=null){
//return rs.getByte(name); tradotto come INT nel database
byteValue = (byte) rs.getInt(name);
}else{
//return rs.getByte(index); tradotto come INT nel database
byteValue = (byte) rs.getInt(index);
}
if(byteValue==0 &&
jdbcDefaultForXSDType!=null &&
JDBCDefaultForXSDType.FORCE_ZERO_AS_NULL.equals(jdbcDefaultForXSDType)){
return null;
}
if(type.toString().equals(Byte.class.toString()) &&
rs.wasNull()){
return null;
}
return byteValue;
}
else if(type.toString().equals(Short.class.toString()) || type.toString().equals(short.class.toString())){
short shortValue;
if(name!=null){
shortValue = rs.getShort(name);
}else{
shortValue = rs.getShort(index);
}
if(shortValue==0 &&
jdbcDefaultForXSDType!=null &&
JDBCDefaultForXSDType.FORCE_ZERO_AS_NULL.equals(jdbcDefaultForXSDType)){
return null;
}
if(type.toString().equals(Short.class.toString()) &&
rs.wasNull()){
return null;
}
return shortValue;
}
else if(type.toString().equals(Integer.class.toString()) || type.toString().equals(int.class.toString())){
int intValue;
if(name!=null){
intValue = rs.getInt(name);
}else{
intValue = rs.getInt(index);
}
if(intValue==0 &&
jdbcDefaultForXSDType!=null &&
JDBCDefaultForXSDType.FORCE_ZERO_AS_NULL.equals(jdbcDefaultForXSDType)){
return null;
}
if(type.toString().equals(Integer.class.toString()) &&
rs.wasNull()){
return null;
}
return intValue;
}
else if(type.toString().equals(Long.class.toString()) || type.toString().equals(long.class.toString())){
long longValue;
if(name!=null){
longValue = rs.getLong(name);
}else{
longValue = rs.getLong(index);
}
if(longValue==0L &&
jdbcDefaultForXSDType!=null &&
JDBCDefaultForXSDType.FORCE_ZERO_AS_NULL.equals(jdbcDefaultForXSDType)){
return null;
}
if(type.toString().equals(Long.class.toString()) &&
rs.wasNull()){
return null;
}
return longValue;
}
else if(type.toString().equals(BigInteger.class.toString())){
long longValue;
if(name!=null){
longValue = rs.getLong(name);
}else{
longValue = rs.getLong(index);
}
if(longValue==0L &&
jdbcDefaultForXSDType!=null &&
JDBCDefaultForXSDType.FORCE_ZERO_AS_NULL.equals(jdbcDefaultForXSDType)){
return null;
}
if(rs.wasNull()){
return null;
}
return BigInteger.valueOf(longValue);
}
else if(type.toString().equals(Float.class.toString()) || type.toString().equals(float.class.toString())){
float floatValue;
if(name!=null){
floatValue = rs.getFloat(name);
}else{
floatValue = rs.getFloat(index);
}
if(floatValue==0.0f &&
jdbcDefaultForXSDType!=null &&
JDBCDefaultForXSDType.FORCE_ZERO_AS_NULL.equals(jdbcDefaultForXSDType)){
return null;
}
if(type.toString().equals(Float.class.toString()) &&
rs.wasNull()){
return null;
}
return floatValue;
}
else if(type.toString().equals(Double.class.toString()) || type.toString().equals(double.class.toString())){
double doubleValue;
if(name!=null){
doubleValue = rs.getDouble(name);
}else{
doubleValue = rs.getDouble(index);
}
if(doubleValue==0.0d &&
jdbcDefaultForXSDType!=null &&
JDBCDefaultForXSDType.FORCE_ZERO_AS_NULL.equals(jdbcDefaultForXSDType)){
return null;
}
if(type.toString().equals(Double.class.toString()) &&
rs.wasNull()){
return null;
}
return doubleValue;
}
else if(type.toString().equals(BigDecimal.class.toString())){
double doubleValue;
if(name!=null){
doubleValue = rs.getDouble(name);
}else{
doubleValue = rs.getDouble(index);
}
if(doubleValue==0.0d &&
jdbcDefaultForXSDType!=null &&
JDBCDefaultForXSDType.FORCE_ZERO_AS_NULL.equals(jdbcDefaultForXSDType)){
return null;
}
if(rs.wasNull()){
return null;
}
return BigDecimal.valueOf(doubleValue);
}
else if(type.toString().equals(Date.class.toString())){
Timestamp ts = null;
if(name!=null){
ts = rs.getTimestamp(name);
}else{
ts = rs.getTimestamp(index);
}
if(ts!=null){
return new Date(ts.getTime());
}
else{
return null;
}
}
else if(type.toString().equals(java.sql.Date.class.toString())){
Timestamp ts = null;
if(name!=null){
ts = rs.getTimestamp(name);
}else{
ts = rs.getTimestamp(index);
}
if(ts!=null){
return new java.sql.Date(ts.getTime());
}
else{
return null;
}
}
else if(type.toString().equals(Timestamp.class.toString())){
if(name!=null){
return rs.getTimestamp(name);
}else{
return rs.getTimestamp(index);
}
}
else if(type.toString().equals(Calendar.class.toString())){
Timestamp ts = null;
if(name!=null){
ts = rs.getTimestamp(name);
}else{
ts = rs.getTimestamp(index);
}
if(ts!=null){
Calendar c = Calendar.getInstance();
c.setTime(new Date(ts.getTime()));
return c;
}
else{
return null;
}
}
else if(type.isAssignableFrom(byte[].class)){
/**if(name!=null){
return this.jdbcAdapter.getBinaryData(rs, name);
}
else{
return this.jdbcAdapter.getBinaryData(rs, index);
}*/
// OP-686: si preferisce il metodo getBinaryStream per i motivi descritti nell'Issue
InputStream binaryStream = null;
if(name!=null){
binaryStream = this.jdbcAdapter.getBinaryStream(rs, name);
}
else{
binaryStream = this.jdbcAdapter.getBinaryStream(rs, index);
}
if(binaryStream == null) {
return null;
}
try {
return Utilities.getAsByteArray(binaryStream, false); // non lancio eccezione se l'input stream ritornato e' vuoto (succede in caso si salva una stringa vuota su alcuni database)
} finally {
try {binaryStream.close();} catch(Exception e) {
// ignore
}
}
}
else if(type.isAssignableFrom(URI.class)){
String uri = null;
if(name!=null){
uri = rs.getString(name);
}else{
uri = rs.getString(index);
}
if(uri!=null){
try{
return new URI(uri);
}catch(Exception e){
throw new UtilsException(e.getMessage(),e);
}
}
else{
return null;
}
}
else{
if(name!=null){
throw new SQLException("Tipo di oggetto (nome "+name+") non gestito: "+type.getClass().getName()+" - "+type);
}else{
throw new SQLException("Tipo di oggetto (posizione "+(index)+") non gestito: "+type.getClass().getName()+" - "+type);
}
}
}
}