All Downloads are FREE. Search and download functionalities are using the official Maven repository.

online.sanen.cdm.template.RowExtractor2SingleColumn Maven / Gradle / Ivy

package online.sanen.cdm.template;

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

import com.mhdt.toolkit.NumberUtilly;

public class RowExtractor2SingleColumn implements RowExtractor {
	
	private Class requiredType;

	public RowExtractor2SingleColumn(Class requiredType) {
		this.requiredType = requiredType;
	}

	@SuppressWarnings("unchecked")
	public T mapRow(ResultSet rs, int rowNum) throws SQLException {
		// Validate column count.
				ResultSetMetaData rsmd = rs.getMetaData();
				int nrOfColumns = rsmd.getColumnCount();
				if (nrOfColumns != 1) {
					throw new SQLException("The column value of the query should be 1, but it is actually :"+nrOfColumns);
				}

				// Extract column value from JDBC ResultSet.
				Object result = getColumnValue(rs, 1, this.requiredType);
				if (result != null && this.requiredType != null && !this.requiredType.isInstance(result)) {
					// Extracted value does not match already: try to convert it.
					try {
						return (T) convertValueToRequiredType(result, this.requiredType);
					}catch (IllegalArgumentException ex) {
						throw new SQLException(
								"Type mismatch affecting row number " + rowNum + " and column type '" +
								rsmd.getColumnTypeName(1) + "': " + ex.getMessage());
					}
				}
				
				return (T) result;
	}
	
	protected Object getColumnValue(ResultSet rs, int index, Class requiredType) throws SQLException {
		if (requiredType != null) {
			return JdbcUtils.getResultSetValue(rs, index, requiredType);
		}
		else {
			// No required type specified -> perform default extraction.
			return getColumnValue(rs, index);
		}
	}
	
	protected Object getColumnValue(ResultSet rs, int index) throws SQLException {
		return JdbcUtils.getResultSetValue(rs, index);
	}
	
	@SuppressWarnings("unchecked")
	protected Object convertValueToRequiredType(Object value, Class requiredType) {
		if (String.class == requiredType) {
			return value.toString();
		}
		else if (Number.class.isAssignableFrom(requiredType)) {
			if (value instanceof Number) {
				// Convert original Number to target Number class.
				return NumberUtilly.convertNumberToTargetClass(((Number) value), (Class) requiredType);
			}
			else {
				// Convert stringified value to target Number class.
				return NumberUtilly.parseNumber(value.toString(),(Class) requiredType);
			}
		}
		else {
			throw new IllegalArgumentException(
					"Value [" + value + "] is of type [" + value.getClass().getName() +
					"] and cannot be converted to required type [" + requiredType.getName() + "]");
		}
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy