package org.genedb.query.sql; import org.genedb.query.params.ListConstraint; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.ResultSetExtractor; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.RowMapperResultSetExtractor; import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import javax.sql.DataSource; /** * Class, designed to be used as a delegate by a Param, which maintains * a RDBMS generated list of acceptable values for the Param. * * @author art */ public class SqlListConstraintDelegate implements ListConstraint, SimpleJdbcTemplateAware { private String validSql; private String allSql; private String partialSql; private SimpleJdbcTemplate sjt; public void setSimpleJdbcTemplate(SimpleJdbcTemplate sjt) { this.sjt = sjt; } public void setAllSql(String allSql) { this.allSql = allSql; } public void setPartialSql(String partialSql) { this.partialSql = partialSql; } public void setValidSql(String validSql) { this.validSql = validSql; } @SuppressWarnings("unchecked") public List<String> getAcceptableValues(final String partName, final boolean mustBePrefix) { JdbcTemplate jt = (JdbcTemplate) sjt.getJdbcOperations(); return (List<String>) jt.query(partialSql, new Object[]{mustBePrefix}, new ResultSetExtractor() { public String extractData(ResultSet rs) throws SQLException, DataAccessException { String test = rs.getString(0); int index = test.indexOf(partName); if (index == -1) { return null; } if (mustBePrefix && index != 0) { return null; } return test; } } ); } public List<String> getAllAcceptableValues() { JdbcTemplate jt = (JdbcTemplate) sjt.getJdbcOperations(); return (List<String>) jt.queryForList(allSql, new Object[]{}, String.class); } public boolean isValid(String value) { Integer i = sjt.queryForInt(validSql, value); if (i.intValue() == 1) { return true; } return false; } }