diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/noncore/GenericDataService.java b/mifosng-provider/src/main/java/org/mifosng/platform/noncore/GenericDataService.java index 35f9c83da..1858474a8 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/noncore/GenericDataService.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/noncore/GenericDataService.java @@ -3,13 +3,13 @@ package org.mifosng.platform.noncore; import java.sql.Connection; import java.sql.Statement; -import org.mifosng.platform.api.data.GenericResultsetData; +import javax.sql.rowset.CachedRowSet; -import com.sun.rowset.CachedRowSetImpl; +import org.mifosng.platform.api.data.GenericResultsetData; public interface GenericDataService { - public CachedRowSetImpl getCachedResultSet(String sql, String errorMsg); + public CachedRowSet getCachedResultSet(String sql, String errorMsg); GenericResultsetData fillGenericResultSet(final String sql); diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/noncore/GenericDataServiceImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/noncore/GenericDataServiceImpl.java index 4238cacd5..23ec3cf04 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/noncore/GenericDataServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/noncore/GenericDataServiceImpl.java @@ -9,6 +9,7 @@ import java.util.ArrayList; import java.util.List; import javax.sql.DataSource; +import javax.sql.rowset.CachedRowSet; import org.mifosng.platform.api.data.GenericResultsetData; import org.mifosng.platform.api.data.ResultsetColumnHeader; @@ -37,7 +38,7 @@ public class GenericDataServiceImpl implements GenericDataService { } @Override - public CachedRowSetImpl getCachedResultSet(String sql, String sqlErrorMsg) { + public CachedRowSet getCachedResultSet(String sql, String sqlErrorMsg) { Connection db_connection = null; Statement db_statement = null; @@ -46,8 +47,9 @@ public class GenericDataServiceImpl implements GenericDataService { db_statement = db_connection.createStatement(); ResultSet rs = db_statement.executeQuery(sql); - CachedRowSetImpl crs = new CachedRowSetImpl(); + CachedRowSet crs = new CachedRowSetImpl(); crs.populate(rs); + //logger.info("RS Size: " + crs.size() + " getCachedResultSet sql: " + sql); return crs; } catch (SQLException e) { throw new PlatformDataIntegrityException("error.msg.sql.error", @@ -62,15 +64,13 @@ public class GenericDataServiceImpl implements GenericDataService { @Override public GenericResultsetData fillGenericResultSet(final String sql) { - Connection db_connection = null; - Statement db_statement = null; - try { - db_connection = dataSource.getConnection(); - db_statement = db_connection.createStatement(); - ResultSet rs = db_statement.executeQuery(sql); + String sqlErrorMsg = "Sql: " + sql; + CachedRowSet rs = getCachedResultSet(sql, sqlErrorMsg); - List columnHeaders = new ArrayList(); - List resultsetDataRows = new ArrayList(); + List columnHeaders = new ArrayList(); + List resultsetDataRows = new ArrayList(); + + try { ResultSetMetaData rsmd = rs.getMetaData(); String columnName = null; @@ -98,9 +98,7 @@ public class GenericDataServiceImpl implements GenericDataService { return new GenericResultsetData(columnHeaders, resultsetDataRows); } catch (SQLException e) { throw new PlatformDataIntegrityException("error.msg.sql.error", - e.getMessage(), "Sql: " + sql); - } finally { - dbClose(db_statement, db_connection); + e.getMessage(), sqlErrorMsg); } } diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/noncore/ReadReportingServiceImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/noncore/ReadReportingServiceImpl.java index 6480ebe1d..61c5cc35f 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/noncore/ReadReportingServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/noncore/ReadReportingServiceImpl.java @@ -15,6 +15,7 @@ import java.util.Map; import java.util.Set; import javax.sql.DataSource; +import javax.sql.rowset.CachedRowSet; import javax.ws.rs.core.Response; import javax.ws.rs.core.StreamingOutput; @@ -46,8 +47,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service -public class ReadReportingServiceImpl implements - ReadReportingService { +public class ReadReportingServiceImpl implements ReadReportingService { private final PlatformSecurityContext context; @@ -58,8 +58,7 @@ public class ReadReportingServiceImpl implements private Boolean noPentaho = false; @Autowired - public ReadReportingServiceImpl( - final PlatformSecurityContext context, + public ReadReportingServiceImpl(final PlatformSecurityContext context, final TenantAwareRoutingDataSource dataSource) { // kick off pentaho reports server ClassicEngineBoot.getInstance().start(); @@ -231,41 +230,38 @@ public class ReadReportingServiceImpl implements } private String getReportSql(String reportName) { - String sql = "select report_sql as the_sql from stretchy_report where report_name = '" - + reportName + "'"; + // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7046875 - prevent + // Invalid Column Name bug in sun's CachedRowSetImpl where it doesn't + // pick up on label names, only column names + String sql = "select * from (select report_sql as the_sql from stretchy_report where report_name = '" + + reportName + "') x"; return getSql(sql); } private String getParameterSql(String parameterName) { - String sql = "select parameter_sql as the_sql from stretchy_parameter where parameter_name = '" - + parameterName + "'"; + String sql = "select * from (select parameter_sql as the_sql from stretchy_parameter where parameter_name = '" + + parameterName + "') x"; return getSql(sql); } private String getSql(String inputSql) { - String sql = null; - Connection db_connection = null; - Statement db_statement = null; - try { - db_connection = dataSource.getConnection(); - db_statement = db_connection.createStatement(); - ResultSet rs = db_statement.executeQuery(inputSql); + String sqlErrorMsg = "Sql: " + inputSql; + CachedRowSet rs = genericDataService.getCachedResultSet(inputSql, + sqlErrorMsg); + try { if (rs.next()) { - sql = rs.getString("the_sql"); - } else { - throw new ReportNotFoundException(inputSql); + return rs.getString("the_sql"); } + throw new ReportNotFoundException(inputSql); } catch (SQLException e) { + logger.info("msg: " + e.getMessage() + " sql: " + inputSql); throw new PlatformDataIntegrityException("error.msg.sql.error", - e.getMessage(), "Input Sql: " + inputSql); - } finally { - genericDataService.dbClose(db_statement, db_connection); + e.getMessage(), sqlErrorMsg); } - return sql; } @Override diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/noncore/ReadWriteNonCoreDataServiceImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/noncore/ReadWriteNonCoreDataServiceImpl.java index c18c15678..cce277fda 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/noncore/ReadWriteNonCoreDataServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/noncore/ReadWriteNonCoreDataServiceImpl.java @@ -10,6 +10,7 @@ import java.util.Map; import java.util.Set; import javax.sql.DataSource; +import javax.sql.rowset.CachedRowSet; import org.mifosng.platform.api.data.AdditionalFieldsSetData; import org.mifosng.platform.api.data.GenericResultsetData; @@ -25,8 +26,6 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.sun.rowset.CachedRowSetImpl; - @Service public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataService { @@ -120,7 +119,7 @@ public class ReadWriteNonCoreDataServiceImpl implements String sqlErrorMsg = "Additional Fields Type: " + type + " Set: " + set + " Id: " + id; - CachedRowSetImpl rsmd = genericDataService.getCachedResultSet(sql, + CachedRowSet rsmd = genericDataService.getCachedResultSet(sql, sqlErrorMsg); List columnHeaders = getResultsetColumnHeaders( @@ -157,7 +156,7 @@ public class ReadWriteNonCoreDataServiceImpl implements } private List getResultsetColumnHeaders( - CachedRowSetImpl rsmd, String sqlErrorMsg, String type, String set) { + CachedRowSet rsmd, String sqlErrorMsg, String type, String set) { List columnHeaders = null; @@ -183,7 +182,7 @@ public class ReadWriteNonCoreDataServiceImpl implements // rsch.getColumnName()); String sql = "select v.`name` from stretchydata_allowed_value v where allowed_list_id = " + allowedListId + " order by id"; - CachedRowSetImpl rsValues = genericDataService + CachedRowSet rsValues = genericDataService .getCachedResultSet(sql, sqlErrorMsg); while (rsValues.next()) { rsch.getColumnValues().add( @@ -209,7 +208,7 @@ public class ReadWriteNonCoreDataServiceImpl implements String sqlErrorMsg, String type, Long id) { List resultsetDataRows = null; - CachedRowSetImpl rs = genericDataService.getCachedResultSet(sql, + CachedRowSet rs = genericDataService.getCachedResultSet(sql, sqlErrorMsg); try {