/* * codjo.net * * Common Apache License 2.0 */ package net.codjo.broadcast.common.columns; import net.codjo.sql.builder.FieldInfo; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; public class FileColumnFactory { private static final String COLUMN_FIELD_NAME = "COLUMN_NAME"; private static final String BREAK_FIELD_NAME = "BREAK_FIELD"; private static final String DATE_FORMAT_FIELD_NAME = "COLUMN_DATE_FORMAT"; private static final String DECIMAL_SEPARATOR_FIELD_NAME = "DECIMAL_SEPARATOR"; private static final String NUMBER_FORMAT_FIELD_NAME = "COLUMN_NUMBER_FORMAT"; private boolean hasAlreadyTryExpression = false; private boolean hasExpressionCol; public FileColumnFactory() { } public FileColumnGenerator newFileColumnGenerator(final ResultSet rs, final FieldInfo fieldInfo, final int sqlType) throws SQLException { return newFileColumnGenerator(rs, fieldInfo, sqlType, null); } public FileColumnGenerator newFileColumnGenerator(final ResultSet rs, final FieldInfo fieldInfo, final int sqlType, final FunctionHolder funcs) throws SQLException { String columnName = rs.getString(COLUMN_FIELD_NAME); boolean isBreakField = rs.getBoolean(BREAK_FIELD_NAME); GeneratorExpression expression = newExpression(rs, sqlType, funcs); Padder padder = newPadder(rs); switch (sqlType) { case Types.VARCHAR: case Types.CHAR: return new StringColumnGenerator(fieldInfo, columnName, padder, expression, isBreakField); case Types.DATE: case Types.TIMESTAMP: String dateFormat = rs.getString(DATE_FORMAT_FIELD_NAME); return new DateColumnGenerator(fieldInfo, columnName, dateFormat, padder, expression, isBreakField); case Types.DOUBLE: case Types.INTEGER: case Types.DECIMAL: case Types.NUMERIC: String decimalSeparator = rs.getString(DECIMAL_SEPARATOR_FIELD_NAME); String numberFormat = rs.getString(NUMBER_FORMAT_FIELD_NAME); return new NumberColumnGenerator(fieldInfo, columnName, decimalSeparator, numberFormat, padder, expression, isBreakField); case Types.BIT: return new BooleanColumnGenerator(fieldInfo, columnName, padder, expression, isBreakField); default: throw new IllegalArgumentException("Type SQL inconnu : " + sqlType); } } GeneratorExpression newExpression(ResultSet rs, int sqlType, FunctionHolder funcs) throws SQLException { if (!hasAlreadyTryExpression) { try { rs.getString("EXPRESSION"); hasExpressionCol = true; } catch (Exception ex) { hasExpressionCol = false; } hasAlreadyTryExpression = true; } if (!hasExpressionCol) { return null; } String expression = rs.getString("EXPRESSION"); if (expression != null && !"".equals(expression.trim())) { return new GeneratorExpression(rs.getString("EXPRESSION"), sqlType, funcs); } else { return null; } } private static Padder newPadder(ResultSet rs) throws SQLException { String paddingCaracter = rs.getString("PADDING_CARACTER"); if (rs.getBoolean("FIXED_LENGTH") && paddingCaracter != null) { return new Padder(paddingCaracter, rs.getInt("COLUMN_LENGTH"), rs.getBoolean("RIGHT_COLUMN_PADDING")); } return null; } }