package binky.reportrunner.ui.actions.base; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import java.util.Calendar; import javax.sql.DataSource; import org.apache.log4j.Logger; import binky.reportrunner.data.RunnerDataSource; import binky.reportrunner.service.DatasourceService; import binky.reportrunner.ui.actions.dashboard.edit.GetColumnNamesForQuery; public abstract class ValidateSQL extends StandardRunnerAction { private static final long serialVersionUID = -2392254690021411047L; private static final Logger logger = Logger .getLogger(GetColumnNamesForQuery.class); private DatasourceService dataSourceService; private long runTime; private boolean isValid; public void validateSql(String sql, String dsName) throws Exception { Connection conn = null; logger.debug("validating query"); logger.debug("item query is null = " + (sql == null)); if (sql == null) { super.addActionError("Query passed was null"); this.isValid=false; return; } logger.debug("item.dataSourceName is null = " + (dsName) == null); if (dsName==null||dsName.isEmpty()) { super.addActionError("No datasource selected"); this.isValid=false; return; } RunnerDataSource rds = dataSourceService.getDataSource(dsName); DataSource ds = dataSourceService.getJDBCDataSource(rds); try { logger.debug("getting a jdbc connection open"); conn = ds.getConnection(); Statement stmt = conn.createStatement(); logger.debug("running sql: " + sql); long startTime = Calendar.getInstance().getTimeInMillis(); ResultSet rs = stmt.executeQuery(sql); this.runTime= Calendar.getInstance().getTimeInMillis()-startTime; logger.debug("rs is null = " + (rs == null)); logger.debug("rs meta data is null = " + (rs.getMetaData() == null)); if ((rs == null) || (rs.getMetaData().getColumnCount() == 0)) { logger.debug("query failed to return any data"); super.addActionError("query failed to return any data"); this.isValid=false; return; } else { logger.debug("looks like this sql is valid"); logger.debug("column count " + rs.getMetaData().getColumnCount()); this.isValid=true; return; } } catch (Exception e) { logger.debug("query failed with exception" + e.getMessage()); super.addActionError("query failed with exception - " + e.getMessage()); this.isValid=false; return; } finally { if (conn != null) conn.close(); } } public DatasourceService getDataSourceService() { return dataSourceService; } public void setDataSourceService(DatasourceService dataSourceService) { this.dataSourceService = dataSourceService; } public Boolean getIsValid() { return isValid; } public void setIsValid(Boolean isValid) { this.isValid = isValid; } public long getRunTime() { return runTime; } }