private boolean hasValidNullability(final DefaultColumnInfo columnInfo, final Object value) { if (!columnInfo.getIsNullable()) { if (value == null) { return false; } } return true; }
public void setConfiguration(final Class clazz, final String propertyName, final DefaultColumnInfo columnInfo) { if (!configurations.containsKey(clazz)) { configurations.put(clazz, new ValidationConfiguration()); } configurations.get(clazz).addMapping(propertyName, columnInfo); } }
private boolean isValidLengthString(final DefaultColumnInfo columnInfo, final Object value) { if (columnInfo.getMaximumLength() != 0) { // H2 will report a character_maximum_length for decimal if (value != null && value instanceof String) { if (value.toString().length() > columnInfo.getMaximumLength()) { return false; } } } return true; }
final SimpleTestClass testObject = new SimpleTestClass(null, null, 7.9, new DateTime()); vm.setConfiguration(testObject.getClass(), STRING_FIELD_2_PROPERTY, vm.getColumnInfo(TABLE_NAME, STRING_FIELD_2)); assertTrue(vm.hasConfiguration(testObject.getClass())); assertFalse(vm.hasConfiguration(ValidationManager.class)); final ValidationConfiguration configuration = vm.getConfiguration(SimpleTestClass.class); assertNotNull(configuration); assertTrue(configuration.hasMapping(STRING_FIELD_2_PROPERTY)); assertFalse(vm.validate(testObject)); testObject.setStringField2("a"); assertFalse(vm.validate(testObject)); testObject.setStringField2("abc"); assertFalse(vm.validate(testObject)); testObject.setStringField2("ab"); assertTrue(vm.validate(testObject)); vm.setConfiguration(testObject.getClass(), STRING_FIELD_1_PROPERTY, vm.getColumnInfo(TABLE_NAME, STRING_FIELD_1)); assertTrue(vm.validate(testObject)); testObject.setStringField1("This is a long string that exceeds the length limit for column 1."); assertFalse(vm.validate(testObject)); testObject.setStringField1("This is a short string."); assertTrue(vm.validate(testObject));
public boolean validate(final Object o) { final ValidationConfiguration configuration = getConfiguration(o.getClass()); for (final String propertyName : configuration.keySet()) { try { final Field field = clazz.getDeclaredField(propertyName); final DefaultColumnInfo columnInfo = configuration.get(propertyName); if (columnInfo == null) { if (!hasValidNullability(columnInfo, value)) { return false; if (!isValidLengthString(columnInfo, value)) { return false; if (!isValidLengthChar(columnInfo, value)) { return false; if (!hasValidPrecision(columnInfo, value)) { return false; if (!hasValidScale(columnInfo, value)) { return false;
@Test(groups = "slow") public void testRetrievingColumnInfo() { final Collection<DefaultColumnInfo> columnInfoList = vm.getTableInfo(TABLE_NAME); assertEquals(columnInfoList.size(), 4); assertNotNull(vm.getColumnInfo(TABLE_NAME, "column1")); assertNull(vm.getColumnInfo(TABLE_NAME, "bogus")); final DefaultColumnInfo numericColumnInfo = vm.getColumnInfo(TABLE_NAME, "column3"); assertNotNull(numericColumnInfo); assertEquals(numericColumnInfo.getScale(), 4); assertEquals(numericColumnInfo.getPrecision(), 10); }
public void loadSchemaInformation(final String schemaName) { columnInfoMap.clear(); // get schema information and map it to columnInfo final List<DefaultColumnInfo> columnInfoList = dao.getColumnInfoList(schemaName); for (final DefaultColumnInfo columnInfo : columnInfoList) { final String tableName = columnInfo.getTableName(); if (!columnInfoMap.containsKey(tableName)) { columnInfoMap.put(tableName, new HashMap<String, DefaultColumnInfo>()); } columnInfoMap.get(tableName).put(columnInfo.getColumnName(), columnInfo); } }
@Override @BeforeClass(groups = "slow") public void beforeClass() throws Exception { super.beforeClass(); final DatabaseSchemaDao dao = new DatabaseSchemaDao(dbi); vm = new ValidationManager(dao); vm.loadSchemaInformation(helper.getDatabaseName()); }
@Override public DefaultColumnInfo map(final int index, final ResultSet r, final StatementContext ctx) throws SQLException { final String tableName = r.getString("table_name"); final String columnName = r.getString("column_name"); final Integer scale = r.getInt("numeric_scale"); final Integer precision = r.getInt("numeric_precision"); final boolean isNullable = r.getBoolean("is_nullable"); final Integer maximumLength = r.getInt("character_maximum_length"); final String dataType = r.getString("data_type"); return new DefaultColumnInfo(tableName, columnName, scale, precision, isNullable, maximumLength, dataType); } }
private boolean hasValidScale(final DefaultColumnInfo columnInfo, final Object value) { if (columnInfo.getScale() != 0) { if (value != null) { final BigDecimal bigDecimalValue = new BigDecimal(value.toString()); if (bigDecimalValue.scale() > columnInfo.getScale()) { return false; } } } return true; }
private boolean hasValidPrecision(final DefaultColumnInfo columnInfo, final Object value) { if (columnInfo.getPrecision() != 0) { // H2 will report a numeric precision for varchar columns if (value != null && !(value instanceof String)) { final BigDecimal bigDecimalValue = new BigDecimal(value.toString()); if (bigDecimalValue.precision() > columnInfo.getPrecision()) { return false; } } } return true; }
private boolean isValidLengthChar(final DefaultColumnInfo columnInfo, final Object value) { // MySQL reports data_type as Strings, H2 as SQLTypes if (columnInfo.getDataType().equals("char") || columnInfo.getDataType().equals(String.valueOf(Types.CHAR))) { if (value == null) { return false; } else { if (value.toString().length() != columnInfo.getMaximumLength()) { return false; } } } return true; }
public void exportDataForAccount(final DatabaseExportOutputStream out, final InternalTenantContext context) { if (context.getAccountRecordId() == null || context.getTenantRecordId() == null) { return; } final List<DefaultColumnInfo> columns = databaseSchemaDao.getColumnInfoList(); if (columns.size() == 0) { return; } final List<ColumnInfo> columnsForTable = new ArrayList<ColumnInfo>(); // The list of columns is ordered by table name first String lastSeenTableName = columns.get(0).getTableName(); for (final ColumnInfo column : columns) { if (!column.getTableName().equals(lastSeenTableName)) { exportDataForAccountAndTable(out, columnsForTable, context); lastSeenTableName = column.getTableName(); columnsForTable.clear(); } columnsForTable.add(column); } exportDataForAccountAndTable(out, columnsForTable, context); }
out.newTable(tableName, ImmutableList.<ColumnInfo>of( new DefaultColumnInfo(tableName, "first_name", 0, 0, true, 0, "varchar"), new DefaultColumnInfo(tableName, "last_name", 0, 0, true, 0, "varchar"), new DefaultColumnInfo(tableName, "age", 0, 0, true, 0, "tinyint")) );