import java.sql.SQLException;\r
import java.sql.Types;\r
import java.util.HashSet;\r
+import java.util.Iterator;\r
import java.util.Set;\r
import java.util.UUID;\r
\r
@Repository\r
public class EntityValidationCrudJdbcImpl implements IEntityValidationCrud {\r
\r
- public static final Logger logger = Logger.getLogger(EntityValidationCrudJdbcImpl.class);\r
-\r
- private static final String SQL_INSERT_VALIDATION_RESULT = "INSERT INTO entityvalidation"\r
- + "(id, created, uuid, crudeventtype, validatedentityclass, validatedentityid,"\r
- + "validatedentityuuid, userfriendlydescription, userfriendlytypename, validationcount,"\r
- + "updated, status, createdby_id) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)";\r
-\r
- private static final int vr_id = 1;\r
- private static final int vr_created = 2;\r
- private static final int vr_uuid = 3;\r
- private static final int vr_crudeventtype = 4;\r
- private static final int vr_validatedentityclass = 5;\r
- private static final int vr_validatedentityid = 6;\r
- private static final int vr_validatedentityuuid = 7;\r
- private static final int vr_userfriendlydescription = 8;\r
- private static final int vr_userfriendlytypename = 9;\r
- private static final int vr_validationcount = 10;\r
- private static final int vr_updated = 11;\r
- private static final int vr_status = 12;\r
- private static final int vr_createdby_id = 13;\r
-\r
- private static final String SQL_INSERT_CONSTRAINT_VIOLATION = "INSERT INTO entityconstraintviolation"\r
- + "(id, created, uuid, invalidvalue, message, propertypath, userfriendlyfieldname, severity,"\r
- + "validator, validationgroup, createdby_id, entityvalidation_id) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)";\r
-\r
- private static final int cv_id = 1;\r
- private static final int cv_created = 2;\r
- private static final int cv_uuid = 3;\r
- private static final int cv_invalidvalue = 4;\r
- private static final int cv_message = 5;\r
- private static final int cv_propertypath = 6;\r
- private static final int cv_userfriendlyfieldname = 7;\r
- private static final int cv_severity = 8;\r
- private static final int cv_validator = 9;\r
- private static final int cv_validationgroup = 10;\r
- private static final int cv_createdby_id = 11;\r
- private static final int cv_entityvalidation_id = 12;\r
-\r
- @Autowired\r
- private DataSource datasource;\r
-\r
-\r
- public EntityValidationCrudJdbcImpl()\r
- {\r
-\r
- }\r
-\r
-\r
- public EntityValidationCrudJdbcImpl(DataSource datasource)\r
- {\r
- this.datasource = datasource;\r
- }\r
-\r
-\r
- public void setDatasource(DataSource datasource)\r
- {\r
- this.datasource = datasource;\r
- }\r
-\r
-\r
- @Override\r
- public <T extends ICdmBase> void saveEntityValidation(T validatedEntity, Set<ConstraintViolation<T>> errors, CRUDEventType crudEventType,\r
- Class<?>[] validationGroups)\r
- {\r
- Connection conn = null;\r
- int entityValidationId = -1;\r
- EntityValidationStatus status = EntityValidationStatus.OK;\r
- try {\r
- conn = datasource.getConnection();\r
- JdbcDaoUtils.startTransaction(conn);\r
- String entityClass = validatedEntity.getClass().getName();\r
- int entityId = validatedEntity.getId();\r
- EntityValidation previousResult = getEntityValidationRecord(conn, entityClass, entityId);\r
- if (previousResult == null) {\r
- /*\r
- * The entity has never been validated before. We should now create an\r
- * entityvalidation record whether or not the entity has errors, because\r
- * the entity HAS been validated so its validationcount is now 1.\r
- */\r
- entityValidationId = saveValidationResultRecord(conn, validatedEntity, crudEventType);\r
- if (errors.size() != 0) {\r
- saveErrorRecords(conn, entityValidationId, validatedEntity, errors);\r
- }\r
- }\r
- else {\r
- entityValidationId = previousResult.getId();\r
- deletedErrorRecords(conn, entityValidationId, validationGroups);\r
- if (errors.size() != 0) {\r
- updateValidationResultRecord(conn, previousResult.getId(), crudEventType);\r
- saveErrorRecords(conn, previousResult.getId(), validatedEntity, errors);\r
- }\r
- }\r
- conn.commit();\r
- }\r
- catch (Throwable t) {\r
- logger.error("Error while saving validation result:", t);\r
- status = EntityValidationStatus.ERROR;\r
- JdbcDaoUtils.rollback(conn);\r
- }\r
- setStatus(conn, entityValidationId, status);\r
- JdbcDaoUtils.close(conn);\r
- }\r
-\r
-\r
- @Override\r
- public void deleteEntityValidation(String validatedEntityClass, int validatedEntityId)\r
- {\r
- Connection conn = null;\r
- try {\r
- conn = datasource.getConnection();\r
- JdbcDaoUtils.startTransaction(conn);\r
- int validationResultId = getValidationResultId(conn, validatedEntityClass, validatedEntityId);\r
- if (validationResultId == -1) {\r
- return;\r
- }\r
- deleteValidationResultRecord(conn, validationResultId);\r
- deletedErrorRecords(conn, validationResultId, null);\r
- conn.commit();\r
- }\r
- catch (Throwable t) {\r
- JdbcDaoUtils.rollback(conn);\r
- }\r
- JdbcDaoUtils.close(conn);\r
- }\r
-\r
-\r
- private static void deletedErrorRecords(Connection conn, int validationResultId, Class<?>[] validationGroups) throws SQLException\r
- {\r
- StringBuilder sql = new StringBuilder(127);\r
- sql.append("DELETE FROM entityconstraintviolation WHERE entityvalidation_id = ?");\r
- if (validationGroups != null && validationGroups.length != 0) {\r
- sql.append(" AND (");\r
- for (int i = 0; i < validationGroups.length; ++i) {\r
- if (i != 0) {\r
- sql.append(" OR ");\r
- }\r
- sql.append("validationgroup = ?");\r
- }\r
- sql.append(")");\r
- }\r
- PreparedStatement stmt = null;\r
- try {\r
- stmt = conn.prepareStatement(sql.toString());\r
- stmt.setInt(1, validationResultId);\r
- if (validationGroups != null && validationGroups.length != 0) {\r
- for (int i = 0; i < validationGroups.length; ++i) {\r
- stmt.setString(i + 2, validationGroups[i].getName());\r
- }\r
- }\r
- stmt.executeUpdate();\r
- }\r
- finally {\r
- JdbcDaoUtils.close(stmt);\r
- }\r
- }\r
-\r
-\r
- private static <T extends ICdmBase> int saveValidationResultRecord(Connection conn, T entity, CRUDEventType crudEventType) throws SQLException\r
- {\r
- PreparedStatement stmt = null;\r
- int entityValidationId;\r
- try {\r
- stmt = conn.prepareStatement(SQL_INSERT_VALIDATION_RESULT);\r
- entityValidationId = 10 + JdbcDaoUtils.fetchInt(conn, "SELECT MAX(id) FROM entityvalidation");\r
- EntityValidation validationResult = EntityValidation.newInstance(entity, crudEventType);\r
- stmt.setInt(vr_id, entityValidationId);\r
- stmt.setDate(vr_created, new Date(validationResult.getCreated().getMillis()));\r
- stmt.setString(vr_uuid, validationResult.getUuid().toString());\r
- stmt.setString(vr_crudeventtype, validationResult.getCrudEventType().toString());\r
- stmt.setString(vr_validatedentityclass, validationResult.getValidatedEntityClass());\r
- stmt.setInt(vr_validatedentityid, validationResult.getValidatedEntityId());\r
- stmt.setString(vr_validatedentityuuid, validationResult.getValidatedEntityUuid().toString());\r
- stmt.setString(vr_userfriendlydescription, validationResult.getUserFriendlyDescription());\r
- stmt.setString(vr_userfriendlytypename, validationResult.getUserFriendlyTypeName());\r
- stmt.setInt(vr_validationcount, 1);\r
- stmt.setDate(vr_updated, new Date(validationResult.getCreated().getMillis()));\r
- stmt.setString(vr_status, EntityValidationStatus.IN_PROGRESS.toString());\r
- if (validationResult.getCreatedBy() != null) {\r
- stmt.setInt(vr_createdby_id, validationResult.getCreatedBy().getId());\r
- }\r
- else {\r
- stmt.setNull(vr_createdby_id, Types.INTEGER);\r
- }\r
- stmt.executeUpdate();\r
- }\r
- finally {\r
- JdbcDaoUtils.close(stmt);\r
- }\r
- return entityValidationId;\r
- }\r
-\r
-\r
- private static void updateValidationResultRecord(Connection conn, int validationResultId, CRUDEventType crudEventType) throws SQLException\r
- {\r
- String sql = "UPDATE entityvalidation SET crudeventtype=?, validationcount = validationcount + 1, "\r
- + "updated = ?, status = ? WHERE id=?";\r
- PreparedStatement stmt = null;\r
- try {\r
- stmt = conn.prepareStatement(sql);\r
- stmt.setString(1, crudEventType.toString());\r
- stmt.setDate(2, new Date(new java.util.Date().getTime()));\r
- stmt.setString(3, EntityValidationStatus.IN_PROGRESS.toString());\r
- stmt.setInt(4, validationResultId);\r
- stmt.executeUpdate();\r
- }\r
- finally {\r
- JdbcDaoUtils.close(stmt);\r
- }\r
- }\r
-\r
-\r
- private static void deleteValidationResultRecord(Connection conn, int validationResultId) throws SQLException\r
- {\r
- String sql = "DELETE FROM entityvalidation WHERE id = ?";\r
- PreparedStatement stmt = conn.prepareStatement(sql);\r
- stmt.setInt(1, validationResultId);\r
- stmt.executeUpdate();\r
- }\r
-\r
-\r
- private static <T extends ICdmBase> void saveErrorRecords(Connection conn, int validationResultId, T entity, Set<ConstraintViolation<T>> errors)\r
- throws SQLException\r
- {\r
- PreparedStatement stmt = null;\r
- try {\r
- stmt = conn.prepareStatement(SQL_INSERT_CONSTRAINT_VIOLATION);\r
- for (ConstraintViolation<T> error : errors) {\r
- EntityConstraintViolation ecv = EntityConstraintViolation.newInstance(entity, error);\r
- int maxId = JdbcDaoUtils.fetchInt(conn, "SELECT MAX(id) FROM entityconstraintviolation");\r
- stmt.setInt(cv_id, maxId + 1);\r
- stmt.setDate(cv_created, new Date(ecv.getCreated().getMillis()));\r
- stmt.setString(cv_uuid, ecv.getUuid().toString());\r
- stmt.setString(cv_invalidvalue, ecv.getInvalidValue());\r
- stmt.setString(cv_message, ecv.getMessage());\r
- stmt.setString(cv_propertypath, ecv.getPropertyPath());\r
- stmt.setString(cv_userfriendlyfieldname, ecv.getUserFriendlyFieldName());\r
- stmt.setString(cv_severity, ecv.getSeverity().toString());\r
- stmt.setString(cv_validator, ecv.getValidator());\r
- stmt.setString(cv_validationgroup, ecv.getValidationGroup());\r
- if (ecv.getCreatedBy() != null) {\r
- stmt.setInt(cv_createdby_id, ecv.getCreatedBy().getId());\r
- }\r
- else {\r
- stmt.setNull(cv_createdby_id, Types.INTEGER);\r
- }\r
- stmt.setInt(cv_entityvalidation_id, validationResultId);\r
- stmt.executeUpdate();\r
- }\r
- }\r
- finally {\r
- JdbcDaoUtils.close(stmt);\r
- }\r
- }\r
-\r
-\r
- // Called by unit test\r
- EntityValidation getValidationResult(String validatedEntityClass, int validatedEntityId)\r
- {\r
- Connection conn = null;\r
- try {\r
- conn = datasource.getConnection();\r
- JdbcDaoUtils.startTransaction(conn);\r
- EntityValidation result = getEntityValidationRecord(conn, validatedEntityClass, validatedEntityId);\r
- if (result != null) {\r
- result.setEntityConstraintViolations(getErrorRecords(conn, result.getId()));\r
- }\r
- conn.commit();\r
- return result;\r
- }\r
- catch (Throwable t) {\r
- logger.error("Error while retrieving validation result", t);\r
- JdbcDaoUtils.rollback(conn);\r
- return null;\r
- }\r
- }\r
-\r
-\r
- private static void setStatus(Connection conn, int entityValidationId, EntityValidationStatus status)\r
- {\r
- if (conn == null) {\r
- // Something has gone awfully wrong, but that's being dealt with on a higher level\r
- return;\r
- }\r
- if (entityValidationId <= 0) {\r
- // Something went wrong before we could insert a record into the entityvalidation\r
- // table or retrieve one using entityclass/entityid\r
- return;\r
- }\r
- String sql = "UPDATE entityvalidation SET status = ? WHERE id = ?";\r
- PreparedStatement stmt = null;\r
- try {\r
- JdbcDaoUtils.startTransaction(conn);\r
- stmt = conn.prepareStatement(sql);\r
- stmt.setString(1, status.toString());\r
- stmt.setInt(2, entityValidationId);\r
- stmt.executeUpdate();\r
- conn.commit();\r
- }\r
- catch (Throwable t) {\r
- logger.error("Failed to set validation status", t);\r
- }\r
- finally {\r
- JdbcDaoUtils.close(stmt);\r
- }\r
- }\r
-\r
-\r
- private static <T extends ICdmBase> EntityValidation getEntityValidationRecord(Connection conn, String validatedEntityClass, int validatedEntityId)\r
- throws SQLException\r
- {\r
- String sql = "SELECT * FROM entityvalidation WHERE validatedentityclass=? AND validatedentityid=?";\r
- EntityValidation result = null;\r
- PreparedStatement stmt = null;\r
- try {\r
- stmt = conn.prepareStatement(sql);\r
- stmt.setString(1, validatedEntityClass);\r
- stmt.setInt(2, validatedEntityId);\r
- ResultSet rs = stmt.executeQuery();\r
- if (rs.next()) {\r
- result = EntityValidation.newInstance();\r
- result.setId(rs.getInt("id"));\r
- result.setCreated(new DateTime(rs.getDate("created").getTime()));\r
- result.setUuid(UUID.fromString(rs.getString("uuid")));\r
- String s = rs.getString("crudeventtype");\r
- if (!rs.wasNull()) {\r
- result.setCrudEventType(CRUDEventType.valueOf(s));\r
- }\r
- result.setValidatedEntityClass(rs.getString("validatedentityclass"));\r
- result.setValidatedEntityId(rs.getInt("validatedentityid"));\r
- result.setValidatedEntityUuid(UUID.fromString(rs.getString("validatedentityuuid")));\r
- result.setUserFriendlyDescription(rs.getString("userfriendlydescription"));\r
- result.setUserFriendlyTypeName(rs.getString("userfriendlytypename"));\r
- }\r
- rs.close();\r
- return result;\r
- }\r
- finally {\r
- JdbcDaoUtils.close(stmt);\r
- }\r
- }\r
-\r
-\r
- private static int getValidationResultId(Connection conn, String validatedEntityClass, int validatedEntityId) throws SQLException\r
- {\r
- String sql = "SELECT id FROM entityvalidation WHERE validatedentityclass = ? AND validatedentityid = ?";\r
- PreparedStatement stmt = null;\r
- int result = -1;\r
- try {\r
- stmt = conn.prepareStatement(sql);\r
- stmt.setString(1, validatedEntityClass);\r
- stmt.setInt(2, validatedEntityId);\r
- ResultSet rs = stmt.executeQuery();\r
- if (rs.next()) {\r
- result = rs.getInt(1);\r
- }\r
- rs.close();\r
- }\r
- finally {\r
- JdbcDaoUtils.close(stmt);\r
- }\r
- return result;\r
- }\r
-\r
-\r
- private static Set<EntityConstraintViolation> getErrorRecords(Connection conn, int validationResultId) throws SQLException\r
- {\r
- String sql = "SELECT * FROM entityconstraintviolation WHERE entityvalidation_id=?";\r
- PreparedStatement stmt = null;\r
- Set<EntityConstraintViolation> errors = new HashSet<EntityConstraintViolation>();\r
- try {\r
- stmt = conn.prepareStatement(sql);\r
- stmt.setInt(1, validationResultId);\r
- ResultSet rs = stmt.executeQuery();\r
- while (rs.next()) {\r
- EntityConstraintViolation error = EntityConstraintViolation.newInstance();\r
- error.setId(rs.getInt("id"));\r
- error.setCreated(new DateTime(rs.getDate("created").getTime()));\r
- error.setUuid(UUID.fromString(rs.getString("uuid")));\r
- error.setInvalidValue(rs.getString("invalidvalue"));\r
- error.setMessage(rs.getString("message"));\r
- error.setPropertyPath(rs.getString("propertypath"));\r
- error.setUserFriendlyFieldName(rs.getString("userfriendlyfieldname"));\r
- error.setSeverity(Severity.forName(rs.getString("severity")));\r
- error.setValidator(rs.getString("validator"));\r
- error.setValidationGroup(rs.getString("validationgroup"));\r
- errors.add(error);\r
- }\r
- rs.close();\r
- }\r
- finally {\r
- JdbcDaoUtils.close(stmt);\r
- }\r
- return errors;\r
- }\r
+ public static final Logger logger = Logger.getLogger(EntityValidationCrudJdbcImpl.class);\r
+\r
+ private static final String SQL_INSERT_VALIDATION_RESULT = "INSERT INTO entityvalidation"\r
+ + "(id, created, uuid, crudeventtype, validatedentityclass, validatedentityid,"\r
+ + "validatedentityuuid, userfriendlydescription, userfriendlytypename, validationcount,"\r
+ + "updated, status, createdby_id) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)";\r
+\r
+ private static final int vr_id = 1;\r
+ private static final int vr_created = 2;\r
+ private static final int vr_uuid = 3;\r
+ private static final int vr_crudeventtype = 4;\r
+ private static final int vr_validatedentityclass = 5;\r
+ private static final int vr_validatedentityid = 6;\r
+ private static final int vr_validatedentityuuid = 7;\r
+ private static final int vr_userfriendlydescription = 8;\r
+ private static final int vr_userfriendlytypename = 9;\r
+ private static final int vr_validationcount = 10;\r
+ private static final int vr_updated = 11;\r
+ private static final int vr_status = 12;\r
+ private static final int vr_createdby_id = 13;\r
+\r
+ private static final String SQL_INSERT_CONSTRAINT_VIOLATION = "INSERT INTO entityconstraintviolation"\r
+ + "(id, created, uuid, invalidvalue, message, propertypath, userfriendlyfieldname, severity,"\r
+ + "validator, validationgroup, createdby_id, entityvalidation_id) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)";\r
+\r
+ private static final int cv_id = 1;\r
+ private static final int cv_created = 2;\r
+ private static final int cv_uuid = 3;\r
+ private static final int cv_invalidvalue = 4;\r
+ private static final int cv_message = 5;\r
+ private static final int cv_propertypath = 6;\r
+ private static final int cv_userfriendlyfieldname = 7;\r
+ private static final int cv_severity = 8;\r
+ private static final int cv_validator = 9;\r
+ private static final int cv_validationgroup = 10;\r
+ private static final int cv_createdby_id = 11;\r
+ private static final int cv_entityvalidation_id = 12;\r
+\r
+ @Autowired\r
+ private DataSource datasource;\r
+\r
+ public EntityValidationCrudJdbcImpl() {\r
+\r
+ }\r
+\r
+ public EntityValidationCrudJdbcImpl(DataSource datasource) {\r
+ this.datasource = datasource;\r
+ }\r
+\r
+ public void setDatasource(DataSource datasource) {\r
+ this.datasource = datasource;\r
+ }\r
+\r
+ @Override\r
+ public <T extends ICdmBase> void saveEntityValidation(T validatedEntity, Set<ConstraintViolation<T>> errors,\r
+ CRUDEventType crudEventType, Class<?>[] validationGroups) {\r
+ saveEntityValidation(createEntityValidation(validatedEntity, errors, crudEventType), validationGroups);\r
+ }\r
+\r
+ // This is the method that's tested by the unit tests\r
+ // rather than the interface method above, because it\r
+ // is almost impossible to create a mock instance of\r
+ // ConstraintViolation<T>\r
+ void saveEntityValidation(EntityValidation newValidation, Class<?>[] validationGroups) {\r
+ Connection conn = null;\r
+ EntityValidation tmp = null;\r
+ try {\r
+ conn = datasource.getConnection();\r
+ JdbcDaoUtils.startTransaction(conn);\r
+ String entityClass = newValidation.getValidatedEntityClass();\r
+ int entityId = newValidation.getValidatedEntityId();\r
+ EntityValidation oldValidation = getEntityValidation(conn, entityClass, entityId);\r
+ if (oldValidation == null) {\r
+ tmp = newValidation;\r
+ /*\r
+ * The entity has never been validated before. We should now\r
+ * create an entityvalidation record whether or not the entity\r
+ * has errors, because the entity HAS been validated so its\r
+ * validationcount is now 1.\r
+ */\r
+ saveEntityValidationRecord(conn, newValidation);\r
+ Set<EntityConstraintViolation> errors = newValidation.getEntityConstraintViolations();\r
+ if (errors != null && errors.size() != 0) {\r
+ saveErrorRecords(conn, newValidation);\r
+ }\r
+\r
+ } else {\r
+ tmp = oldValidation;\r
+ // Increase validation counter\r
+ increaseValidationCounter(conn, oldValidation);\r
+\r
+ // Delete obsolete errors, that is, errors from the previous\r
+ // validation that have disappeared from the new validation\r
+ // even though they belong to the same validation group\r
+ dontDeleteErrorsInOtherValidationGroups(oldValidation, validationGroups);\r
+ // Now all errors have been removed from the previous validation\r
+ // that don't belong to the validation group(s) applied by the\r
+ // current validation. Set them apart because we need them\r
+ HashSet<EntityConstraintViolation> oldErrors = new HashSet<EntityConstraintViolation>(\r
+ oldValidation.getEntityConstraintViolations());\r
+ oldValidation.getEntityConstraintViolations().removeAll(newValidation.getEntityConstraintViolations());\r
+ // Now we're left with previous errors that have disappeared\r
+ // from the current validation (they have become obsolete)\r
+ deleteObsoleteErrors(conn, oldValidation);\r
+\r
+ // From the new errors delete all that are identical to\r
+ // errors from a previous validation (identical as per the\r
+ // equals() method of EntityConstraintViolation). These\r
+ // errors will not replace the old ones in order to limit\r
+ // the number of INSERTs.\r
+ newValidation.getEntityConstraintViolations().removeAll(oldErrors);\r
+ saveErrorRecords(conn, newValidation);\r
+ }\r
+ conn.commit();\r
+ setStatus(conn, tmp, EntityValidationStatus.OK);\r
+ } catch (Throwable t) {\r
+ logger.error("Error while saving validation result:", t);\r
+ setStatus(conn, tmp, EntityValidationStatus.ERROR);\r
+ JdbcDaoUtils.rollback(conn);\r
+ } finally {\r
+ JdbcDaoUtils.close(conn);\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void deleteEntityValidation(String validatedEntityClass, int validatedEntityId) {\r
+ Connection conn = null;\r
+ try {\r
+ conn = datasource.getConnection();\r
+ JdbcDaoUtils.startTransaction(conn);\r
+ int validationResultId = getValidationResultId(conn, validatedEntityClass, validatedEntityId);\r
+ if (validationResultId == -1) {\r
+ return;\r
+ }\r
+ deleteValidationResultRecord(conn, validationResultId);\r
+ deletedErrorRecords(conn, validationResultId, null);\r
+ conn.commit();\r
+ } catch (Throwable t) {\r
+ JdbcDaoUtils.rollback(conn);\r
+ }\r
+ JdbcDaoUtils.close(conn);\r
+ }\r
+\r
+ private static <T extends ICdmBase> EntityValidation createEntityValidation(T validatedEntity,\r
+ Set<ConstraintViolation<T>> errors, CRUDEventType crudEventType) {\r
+ EntityValidation entityValidation = EntityValidation.newInstance(validatedEntity, crudEventType);\r
+ Set<EntityConstraintViolation> errorEntities = new HashSet<EntityConstraintViolation>(errors.size());\r
+ for (ConstraintViolation<T> error : errors) {\r
+ EntityConstraintViolation errorEntity = EntityConstraintViolation.newInstance(validatedEntity, error);\r
+ errorEntities.add(errorEntity);\r
+ }\r
+ entityValidation.setEntityConstraintViolations(errorEntities);\r
+ return entityValidation;\r
+ }\r
+\r
+ private static void deletedErrorRecords(Connection conn, int validationResultId, Class<?>[] validationGroups)\r
+ throws SQLException {\r
+ StringBuilder sql = new StringBuilder(127);\r
+ sql.append("DELETE FROM entityconstraintviolation WHERE entityvalidation_id = ?");\r
+ if (validationGroups != null && validationGroups.length != 0) {\r
+ sql.append(" AND (");\r
+ for (int i = 0; i < validationGroups.length; ++i) {\r
+ if (i != 0) {\r
+ sql.append(" OR ");\r
+ }\r
+ sql.append("validationgroup = ?");\r
+ }\r
+ sql.append(")");\r
+ }\r
+ PreparedStatement stmt = null;\r
+ try {\r
+ stmt = conn.prepareStatement(sql.toString());\r
+ stmt.setInt(1, validationResultId);\r
+ if (validationGroups != null && validationGroups.length != 0) {\r
+ for (int i = 0; i < validationGroups.length; ++i) {\r
+ stmt.setString(i + 2, validationGroups[i].getName());\r
+ }\r
+ }\r
+ stmt.executeUpdate();\r
+ } finally {\r
+ JdbcDaoUtils.close(stmt);\r
+ }\r
+ }\r
+\r
+ private static void deleteObsoleteErrors(Connection conn, EntityValidation previousValidation) throws SQLException {\r
+ Set<EntityConstraintViolation> obsoleteErrors = previousValidation.getEntityConstraintViolations();\r
+ if (obsoleteErrors == null || obsoleteErrors.size() == 0) {\r
+ return;\r
+ }\r
+ String sql = "DELETE FROM entityconstraintviolation WHERE id = ?";\r
+ PreparedStatement stmt = null;\r
+ try {\r
+ stmt = conn.prepareStatement(sql.toString());\r
+ for (EntityConstraintViolation error : obsoleteErrors) {\r
+ stmt.setInt(1, error.getId());\r
+ stmt.executeUpdate();\r
+ }\r
+ } finally {\r
+ JdbcDaoUtils.close(stmt);\r
+ }\r
+ }\r
+\r
+ // Save EntityValidation entity to database. As a side effect\r
+ // the database id assigned to the entity will be set on the\r
+ // EntityValidation instance\r
+ private static void saveEntityValidationRecord(Connection conn, EntityValidation newValidation) throws SQLException {\r
+ PreparedStatement stmt = null;\r
+ try {\r
+ stmt = conn.prepareStatement(SQL_INSERT_VALIDATION_RESULT);\r
+ if (newValidation.getId() <= 0) {\r
+ int id = 10 + JdbcDaoUtils.fetchInt(conn, "SELECT MAX(id) FROM entityvalidation");\r
+ newValidation.setId(id);\r
+ }\r
+ stmt.setInt(vr_id, newValidation.getId());\r
+ stmt.setDate(vr_created, new Date(newValidation.getCreated().getMillis()));\r
+ stmt.setString(vr_uuid, newValidation.getUuid().toString());\r
+ stmt.setString(vr_crudeventtype, newValidation.getCrudEventType().toString());\r
+ stmt.setString(vr_validatedentityclass, newValidation.getValidatedEntityClass());\r
+ stmt.setInt(vr_validatedentityid, newValidation.getValidatedEntityId());\r
+ stmt.setString(vr_validatedentityuuid, newValidation.getValidatedEntityUuid().toString());\r
+ stmt.setString(vr_userfriendlydescription, newValidation.getUserFriendlyDescription());\r
+ stmt.setString(vr_userfriendlytypename, newValidation.getUserFriendlyTypeName());\r
+ stmt.setInt(vr_validationcount, 1);\r
+ stmt.setDate(vr_updated, new Date(newValidation.getCreated().getMillis()));\r
+ stmt.setString(vr_status, EntityValidationStatus.IN_PROGRESS.toString());\r
+ if (newValidation.getCreatedBy() != null) {\r
+ stmt.setInt(vr_createdby_id, newValidation.getCreatedBy().getId());\r
+ } else {\r
+ stmt.setNull(vr_createdby_id, Types.INTEGER);\r
+ }\r
+ stmt.executeUpdate();\r
+ } finally {\r
+ JdbcDaoUtils.close(stmt);\r
+ }\r
+ }\r
+\r
+ private static void increaseValidationCounter(Connection conn, EntityValidation entityValidation)\r
+ throws SQLException {\r
+ String sql = "UPDATE entityvalidation SET crudeventtype=?, validationcount = validationcount + 1, "\r
+ + "updated = ?, status = ? WHERE id=?";\r
+ PreparedStatement stmt = null;\r
+ try {\r
+ stmt = conn.prepareStatement(sql);\r
+ if (entityValidation.getCrudEventType() == null) {\r
+ stmt.setString(1, null);\r
+ } else {\r
+ stmt.setString(1, entityValidation.getCrudEventType().toString());\r
+ }\r
+ stmt.setDate(2, new Date(new java.util.Date().getTime()));\r
+ stmt.setString(3, EntityValidationStatus.IN_PROGRESS.toString());\r
+ stmt.setInt(4, entityValidation.getId());\r
+ stmt.executeUpdate();\r
+ } finally {\r
+ JdbcDaoUtils.close(stmt);\r
+ }\r
+ }\r
+\r
+ private static <T extends ICdmBase> void saveErrorRecords(Connection conn, EntityValidation entityValidation)\r
+ throws SQLException {\r
+ Set<EntityConstraintViolation> errors = entityValidation.getEntityConstraintViolations();\r
+ if (errors == null || errors.size() == 0) {\r
+ return;\r
+ }\r
+ PreparedStatement stmt = null;\r
+ try {\r
+ stmt = conn.prepareStatement(SQL_INSERT_CONSTRAINT_VIOLATION);\r
+ for (EntityConstraintViolation error : errors) {\r
+ if (error.getId() <= 0) {\r
+ int id = 10 + JdbcDaoUtils.fetchInt(conn, "SELECT MAX(id) FROM entityconstraintviolation");\r
+ error.setId(id);\r
+ }\r
+ stmt.setInt(cv_id, error.getId());\r
+ stmt.setDate(cv_created, new Date(error.getCreated().getMillis()));\r
+ stmt.setString(cv_uuid, error.getUuid().toString());\r
+ stmt.setString(cv_invalidvalue, error.getInvalidValue());\r
+ stmt.setString(cv_message, error.getMessage());\r
+ stmt.setString(cv_propertypath, error.getPropertyPath());\r
+ stmt.setString(cv_userfriendlyfieldname, error.getUserFriendlyFieldName());\r
+ stmt.setString(cv_severity, error.getSeverity().toString());\r
+ stmt.setString(cv_validator, error.getValidator());\r
+ stmt.setString(cv_validationgroup, error.getValidationGroup());\r
+ if (error.getCreatedBy() != null) {\r
+ stmt.setInt(cv_createdby_id, error.getCreatedBy().getId());\r
+ } else {\r
+ stmt.setNull(cv_createdby_id, Types.INTEGER);\r
+ }\r
+ stmt.setInt(cv_entityvalidation_id, entityValidation.getId());\r
+ stmt.executeUpdate();\r
+ }\r
+ } finally {\r
+ JdbcDaoUtils.close(stmt);\r
+ }\r
+ }\r
+\r
+ // Called by unit test\r
+ EntityValidation getEntityValidation(String validatedEntityClass, int validatedEntityId) {\r
+ Connection conn = null;\r
+ try {\r
+ conn = datasource.getConnection();\r
+ JdbcDaoUtils.startTransaction(conn);\r
+ EntityValidation result = getEntityValidation(conn, validatedEntityClass, validatedEntityId);\r
+ conn.commit();\r
+ return result;\r
+ } catch (Throwable t) {\r
+ logger.error("Error while retrieving validation result", t);\r
+ JdbcDaoUtils.rollback(conn);\r
+ return null;\r
+ }\r
+ }\r
+\r
+ private static EntityValidation getEntityValidation(Connection conn, String validatedEntityClass,\r
+ int validatedEntityId) throws SQLException {\r
+ EntityValidation entityValidation = getEntityValidationRecord(conn, validatedEntityClass, validatedEntityId);\r
+ if (entityValidation != null) {\r
+ entityValidation.setEntityConstraintViolations(getErrorRecords(conn, entityValidation.getId()));\r
+ }\r
+ return entityValidation;\r
+ }\r
+\r
+ private static void deleteValidationResultRecord(Connection conn, int validationResultId) throws SQLException {\r
+ String sql = "DELETE FROM entityvalidation WHERE id = ?";\r
+ PreparedStatement stmt = conn.prepareStatement(sql);\r
+ stmt.setInt(1, validationResultId);\r
+ stmt.executeUpdate();\r
+ }\r
+\r
+ private static void setStatus(Connection conn, EntityValidation entityValidation, EntityValidationStatus status) {\r
+ if (conn == null || entityValidation == null || entityValidation.getId() <= 0) {\r
+ logger.warn("Failed to save entity validation status to database");\r
+ return;\r
+ }\r
+ String sql = "UPDATE entityvalidation SET status = ? WHERE id = ?";\r
+ PreparedStatement stmt = null;\r
+ try {\r
+ JdbcDaoUtils.startTransaction(conn);\r
+ stmt = conn.prepareStatement(sql);\r
+ stmt.setString(1, status.toString());\r
+ stmt.setInt(2, entityValidation.getId());\r
+ stmt.executeUpdate();\r
+ conn.commit();\r
+ } catch (Throwable t) {\r
+ logger.error("Failed to set validation status", t);\r
+ } finally {\r
+ JdbcDaoUtils.close(stmt);\r
+ }\r
+ }\r
+\r
+ private static <T extends ICdmBase> EntityValidation getEntityValidationRecord(Connection conn,\r
+ String validatedEntityClass, int validatedEntityId) throws SQLException {\r
+ String sql = "SELECT * FROM entityvalidation WHERE validatedentityclass=? AND validatedentityid=?";\r
+ EntityValidation result = null;\r
+ PreparedStatement stmt = null;\r
+ try {\r
+ stmt = conn.prepareStatement(sql);\r
+ stmt.setString(1, validatedEntityClass);\r
+ stmt.setInt(2, validatedEntityId);\r
+ ResultSet rs = stmt.executeQuery();\r
+ if (rs.next()) {\r
+ result = EntityValidation.newInstance();\r
+ result.setId(rs.getInt("id"));\r
+ Date d = rs.getDate("created");\r
+ if (!rs.wasNull()) {\r
+ result.setCreated(new DateTime(d.getTime()));\r
+ }\r
+ String s = rs.getString("uuid");\r
+ if (!rs.wasNull()) {\r
+ result.setUuid(UUID.fromString(rs.getString("uuid")));\r
+ }\r
+ s = rs.getString("crudeventtype");\r
+ if (!rs.wasNull()) {\r
+ result.setCrudEventType(CRUDEventType.valueOf(s));\r
+ }\r
+ result.setValidatedEntityClass(rs.getString("validatedentityclass"));\r
+ result.setValidatedEntityId(rs.getInt("validatedentityid"));\r
+ s = rs.getString("validatedentityuuid");\r
+ if (!rs.wasNull()) {\r
+ result.setValidatedEntityUuid(UUID.fromString(s));\r
+ }\r
+ result.setUserFriendlyDescription(rs.getString("userfriendlydescription"));\r
+ result.setUserFriendlyTypeName(rs.getString("userfriendlytypename"));\r
+ }\r
+ rs.close();\r
+ return result;\r
+ } finally {\r
+ JdbcDaoUtils.close(stmt);\r
+ }\r
+ }\r
+\r
+ private static int getValidationResultId(Connection conn, String validatedEntityClass, int validatedEntityId)\r
+ throws SQLException {\r
+ String sql = "SELECT id FROM entityvalidation WHERE validatedentityclass = ? AND validatedentityid = ?";\r
+ PreparedStatement stmt = null;\r
+ int result = -1;\r
+ try {\r
+ stmt = conn.prepareStatement(sql);\r
+ stmt.setString(1, validatedEntityClass);\r
+ stmt.setInt(2, validatedEntityId);\r
+ ResultSet rs = stmt.executeQuery();\r
+ if (rs.next()) {\r
+ result = rs.getInt(1);\r
+ }\r
+ rs.close();\r
+ } finally {\r
+ JdbcDaoUtils.close(stmt);\r
+ }\r
+ return result;\r
+ }\r
+\r
+ private static Set<EntityConstraintViolation> getErrorRecords(Connection conn, int entityValidationId)\r
+ throws SQLException {\r
+ return getErrorRecordsForValidationGroup(conn, entityValidationId, null);\r
+ }\r
+\r
+ private static Set<EntityConstraintViolation> getErrorRecordsForValidationGroup(Connection conn,\r
+ int entityValidationId, Class<?>[] validationGroups) throws SQLException {\r
+ StringBuilder sql = new StringBuilder("SELECT * FROM entityconstraintviolation WHERE entityvalidation_id=?");\r
+ if (validationGroups != null && validationGroups.length != 0) {\r
+ sql.append(" AND (");\r
+ for (int i = 0; i < validationGroups.length; ++i) {\r
+ if (i != 0) {\r
+ sql.append(" OR ");\r
+ }\r
+ sql.append("validationgroup = ?");\r
+ }\r
+ sql.append(")");\r
+ }\r
+ PreparedStatement stmt = null;\r
+ Set<EntityConstraintViolation> errors = new HashSet<EntityConstraintViolation>();\r
+ try {\r
+ stmt = conn.prepareStatement(sql.toString());\r
+ stmt.setInt(1, entityValidationId);\r
+ if (validationGroups != null && validationGroups.length != 0) {\r
+ for (int i = 0; i < validationGroups.length; ++i) {\r
+ stmt.setString(i + 2, validationGroups[i].getName());\r
+ }\r
+ }\r
+ ResultSet rs = stmt.executeQuery();\r
+ while (rs.next()) {\r
+ EntityConstraintViolation error = EntityConstraintViolation.newInstance();\r
+ error.setId(rs.getInt("id"));\r
+ error.setCreated(new DateTime(rs.getDate("created").getTime()));\r
+ error.setUuid(UUID.fromString(rs.getString("uuid")));\r
+ error.setInvalidValue(rs.getString("invalidvalue"));\r
+ error.setMessage(rs.getString("message"));\r
+ error.setPropertyPath(rs.getString("propertypath"));\r
+ error.setUserFriendlyFieldName(rs.getString("userfriendlyfieldname"));\r
+ error.setSeverity(Severity.forName(rs.getString("severity")));\r
+ error.setValidator(rs.getString("validator"));\r
+ error.setValidationGroup(rs.getString("validationgroup"));\r
+ errors.add(error);\r
+ }\r
+ rs.close();\r
+ } finally {\r
+ JdbcDaoUtils.close(stmt);\r
+ }\r
+ return errors;\r
+ }\r
+\r
+ private static void dontDeleteErrorsInOtherValidationGroups(EntityValidation previousValidation,\r
+ Class<?>[] validationGroups) {\r
+ Set<String> classNames = new HashSet<String>(validationGroups.length);\r
+ for (Class<?> c : validationGroups) {\r
+ classNames.add(c.getName());\r
+ }\r
+ Iterator<EntityConstraintViolation> iterator = previousValidation.getEntityConstraintViolations().iterator();\r
+ while (iterator.hasNext()) {\r
+ if (!classNames.contains(iterator.next().getValidationGroup())) {\r
+ iterator.remove();\r
+ }\r
+ }\r
+ }\r
+\r
}\r
import java.util.ArrayList;\r
import java.util.Collections;\r
import java.util.Comparator;\r
+import java.util.HashSet;\r
import java.util.List;\r
import java.util.Set;\r
import java.util.UUID;\r
\r
import org.hibernate.validator.HibernateValidator;\r
import org.hibernate.validator.HibernateValidatorConfiguration;\r
+import org.joda.time.DateTime;\r
import org.junit.Before;\r
import org.junit.Test;\r
import org.unitils.dbunit.annotation.DataSet;\r
import eu.etaxonomy.cdm.model.validation.CRUDEventType;\r
import eu.etaxonomy.cdm.model.validation.EntityConstraintViolation;\r
import eu.etaxonomy.cdm.model.validation.EntityValidation;\r
+import eu.etaxonomy.cdm.model.validation.Severity;\r
import eu.etaxonomy.cdm.persistence.validation.Company;\r
import eu.etaxonomy.cdm.persistence.validation.Employee;\r
import eu.etaxonomy.cdm.test.integration.CdmIntegrationTest;\r
* @date 20 jan. 2015\r
*\r
*/\r
-@DataSet\r
public class EntityValidationCrudJdbcImplTest extends CdmIntegrationTest {\r
\r
private static final String MEDIA = "eu.etaxonomy.cdm.model.media.Media";\r
public void setUp() throws Exception {\r
}\r
\r
-\r
/**\r
* Test method for\r
* {@link eu.etaxonomy.cdm.persistence.dao.jdbc.validation.EntityValidationCrudJdbcImpl#EntityValidationCrudJdbcImpl()}\r
* .\r
*/\r
@Test\r
+ @DataSet\r
public void test_SaveValidationResult_Set_T_CRUDEventType() {\r
HibernateValidatorConfiguration config = Validation.byProvider(HibernateValidator.class).configure();\r
ValidatorFactory factory = config.buildValidatorFactory();\r
EntityValidationCrudJdbcImpl dao = new EntityValidationCrudJdbcImpl(dataSource);\r
dao.saveEntityValidation(emp, errors, CRUDEventType.NONE, null);\r
\r
- EntityValidation result = dao.getValidationResult(emp.getClass().getName(), emp.getId());\r
+ EntityValidation result = dao.getEntityValidation(emp.getClass().getName(), emp.getId());\r
assertNotNull(result);\r
assertEquals("Unexpected UUID", result.getValidatedEntityUuid(), uuid);\r
assertEquals("Unexpected number of constraint violations", 2, result.getEntityConstraintViolations().size());\r
\r
}\r
\r
+ @Test\r
+ @DataSet("EntityValidationCrudJdbcImplTest.testSave.xml")\r
+ @ExpectedDataSet("EntityValidationCrudJdbcImplTest.testSaveAlreadyExistingError-result.xml")\r
+ // Test proving that if an exactly identical\r
+ // EntityConstraintViolation (as per equals() method)\r
+ // is already in database, the only thing that happens\r
+ // is an increment of the validation counter.\r
+ public void testSaveAlreadyExistingError() {\r
+\r
+ // All same as in @DataSet:\r
+\r
+ DateTime created = new DateTime(2014, 1, 1, 0, 0);\r
+\r
+ Employee emp = new Employee();\r
+ emp.setId(100);\r
+ emp.setUuid(UUID.fromString("f8de74c6-aa56-4de3-931e-87b61da0218c"));\r
+ // Other properties not relevant for this test\r
+\r
+ EntityValidation entityValidation = EntityValidation.newInstance();\r
+ entityValidation.setValidatedEntity(emp);\r
+ entityValidation.setId(1);\r
+ entityValidation.setUuid(UUID.fromString("dae5b090-30e8-45bc-9460-2eb2028d3c18"));\r
+ entityValidation.setCreated(created);\r
+ entityValidation.setCrudEventType(CRUDEventType.INSERT);\r
+ entityValidation.setValidationCount(5);\r
+\r
+ EntityConstraintViolation error = EntityConstraintViolation.newInstance();\r
+\r
+ // Actually not same as in @DataSet to force\r
+ // EntityConstraintViolation.equals() method to take\r
+ // other properties into account (e.g. propertyPath,\r
+ // invalidValue, etc.)\r
+ error.setId(Integer.MIN_VALUE);\r
+\r
+ error.setCreated(created);\r
+ error.setUuid(UUID.fromString("358da71f-b646-4b79-b00e-dcb68b6425ba"));\r
+ error.setSeverity(Severity.ERROR);\r
+ error.setPropertyPath("firstName");\r
+ error.setInvalidValue("Foo");\r
+ error.setMessage("Garbage In Garbage Out");\r
+ error.setValidationGroup("eu.etaxonomy.cdm.validation.Level2");\r
+ error.setValidator("eu.etaxonomy.cdm.persistence.validation.GarbageValidator");\r
+ Set<EntityConstraintViolation> errors = new HashSet<EntityConstraintViolation>(1);\r
+ errors.add(error);\r
+\r
+ entityValidation.addEntityConstraintViolation(error);\r
+\r
+ EntityValidationCrudJdbcImpl dao = new EntityValidationCrudJdbcImpl(dataSource);\r
+ dao.saveEntityValidation(entityValidation, new Class[] { Level2.class });\r
+ }\r
+\r
+ @Test\r
+ @DataSet("EntityValidationCrudJdbcImplTest.testSave.xml")\r
+ @ExpectedDataSet("EntityValidationCrudJdbcImplTest.testReplaceError-result.xml")\r
+ // Test proving that if an entity has been validated,\r
+ // yielding 1 error (as in @DataSet), and a subsequent\r
+ // validation also yields 1 error, but a different one,\r
+ // then validation count is increased, the old error is\r
+ // removed and the new error is inserted.\r
+ public void testReplaceError() {\r
+\r
+ // All identical to @DataSet:\r
+\r
+ DateTime created = new DateTime(2014, 1, 1, 0, 0);\r
+\r
+ Employee emp = new Employee();\r
+ emp.setId(100);\r
+ emp.setUuid(UUID.fromString("f8de74c6-aa56-4de3-931e-87b61da0218c"));\r
+\r
+ EntityValidation entityValidation = EntityValidation.newInstance();\r
+ entityValidation.setValidatedEntity(emp);\r
+ entityValidation.setId(1);\r
+ entityValidation.setUuid(UUID.fromString("dae5b090-30e8-45bc-9460-2eb2028d3c18"));\r
+ entityValidation.setCreated(created);\r
+ entityValidation.setCrudEventType(CRUDEventType.INSERT);\r
+ entityValidation.setValidationCount(5);\r
+\r
+ EntityConstraintViolation error = EntityConstraintViolation.newInstance();\r
+ error.setId(38);\r
+ error.setCreated(created);\r
+ error.setUuid(UUID.fromString("358da71f-b646-4b79-b00e-dcb68b6425ba"));\r
+ error.setSeverity(Severity.ERROR);\r
+ error.setPropertyPath("firstName");\r
+\r
+ // Except for:\r
+ error.setInvalidValue("Bar");\r
+\r
+ error.setMessage("Garbage In Garbage Out");\r
+ error.setValidationGroup("eu.etaxonomy.cdm.validation.Level2");\r
+ error.setValidator("eu.etaxonomy.cdm.persistence.validation.GarbageValidator");\r
+ Set<EntityConstraintViolation> errors = new HashSet<EntityConstraintViolation>(1);\r
+ errors.add(error);\r
+\r
+ entityValidation.addEntityConstraintViolation(error);\r
+\r
+ EntityValidationCrudJdbcImpl dao = new EntityValidationCrudJdbcImpl(dataSource);\r
+ dao.saveEntityValidation(entityValidation, new Class[] { Level2.class });\r
+ }\r
+\r
+ @Test\r
+ @DataSet("EntityValidationCrudJdbcImplTest.testSave.xml")\r
+ @ExpectedDataSet("EntityValidationCrudJdbcImplTest.testSameErrorOtherEntity-result.xml")\r
+ // Test proving that if an entity has been validated,\r
+ // yielding 1 error (as in @DataSet), and _another_\r
+ // entity is now validated yielding an equals() error,\r
+ // things behave as expected (2 entityvalidations, each\r
+ // having 1 entityconstraintviolation)\r
+ public void testSameErrorOtherEntity() {\r
+\r
+ DateTime created = new DateTime(2014, 1, 1, 0, 0);\r
+\r
+ // Not in @DataSet\r
+ Employee emp = new Employee();\r
+ emp.setId(200);\r
+ emp.setUuid(UUID.fromString("f8de74c6-aa56-4de3-931e-87b61da0218d"));\r
+\r
+ EntityValidation entityValidation = EntityValidation.newInstance();\r
+ entityValidation.setValidatedEntity(emp);\r
+ entityValidation.setId(2);\r
+ entityValidation.setUuid(UUID.fromString("dae5b090-30e8-45bc-9460-2eb2028d3c19"));\r
+ entityValidation.setCreated(created);\r
+ entityValidation.setCrudEventType(CRUDEventType.INSERT);\r
+ entityValidation.setValidationCount(1);\r
+\r
+ // equals() error in @DataSet\r
+ EntityConstraintViolation error = EntityConstraintViolation.newInstance();\r
+ error.setId(2);\r
+ error.setCreated(created);\r
+ error.setUuid(UUID.fromString("358da71f-b646-4b79-b00e-dcb68b6425bb"));\r
+ error.setSeverity(Severity.ERROR);\r
+ error.setPropertyPath("firstName");\r
+ error.setInvalidValue("Foo");\r
+\r
+ error.setMessage("Garbage In Garbage Out");\r
+ error.setValidationGroup("eu.etaxonomy.cdm.validation.Level2");\r
+ error.setValidator("eu.etaxonomy.cdm.persistence.validation.GarbageValidator");\r
+ Set<EntityConstraintViolation> errors = new HashSet<EntityConstraintViolation>(1);\r
+ errors.add(error);\r
+\r
+ entityValidation.addEntityConstraintViolation(error);\r
+\r
+ EntityValidationCrudJdbcImpl dao = new EntityValidationCrudJdbcImpl(dataSource);\r
+ dao.saveEntityValidation(entityValidation, new Class[] { Level2.class });\r
+ }\r
+ @Test\r
+ @DataSet("EntityValidationCrudJdbcImplTest.testSave.xml")\r
+ @ExpectedDataSet("EntityValidationCrudJdbcImplTest.testOneOldOneNewError-result.xml")\r
+ // Test proving that if an entity has been validated,\r
+ // yielding 1 error (as in @DataSet), and _another_\r
+ // entity is now validated yielding an equals() error,\r
+ // things behave as expected (2 entityvalidations, each\r
+ // having 1 entityconstraintviolation)\r
+ public void testOneOldOneNewError() {\r
+\r
+ DateTime created = new DateTime(2014, 1, 1, 0, 0);\r
+\r
+ // Same entity as in @DataSet\r
+ Employee emp = new Employee();\r
+ emp.setId(100);\r
+ emp.setUuid(UUID.fromString("f8de74c6-aa56-4de3-931e-87b61da0218c"));\r
+ // Other properties not relevant for this test\r
+\r
+ EntityValidation entityValidation = EntityValidation.newInstance();\r
+ entityValidation.setValidatedEntity(emp);\r
+ entityValidation.setId(1);\r
+ entityValidation.setUuid(UUID.fromString("dae5b090-30e8-45bc-9460-2eb2028d3c18"));\r
+ entityValidation.setCreated(created);\r
+ entityValidation.setCrudEventType(CRUDEventType.INSERT);\r
+\r
+\r
+ // Old error (in @DataSet)\r
+ EntityConstraintViolation error = EntityConstraintViolation.newInstance();\r
+ error.setId(Integer.MIN_VALUE);\r
+ error.setCreated(created);\r
+ error.setUuid(UUID.fromString("358da71f-b646-4b79-b00e-dcb68b6425ba"));\r
+ error.setSeverity(Severity.ERROR);\r
+ error.setPropertyPath("firstName");\r
+ error.setInvalidValue("Foo");\r
+ error.setMessage("Garbage In Garbage Out");\r
+ error.setValidationGroup("eu.etaxonomy.cdm.validation.Level2");\r
+ error.setValidator("eu.etaxonomy.cdm.persistence.validation.GarbageValidator");\r
+ entityValidation.addEntityConstraintViolation(error);\r
+\r
+ // New error (not in @DataSet)\r
+ error = EntityConstraintViolation.newInstance();\r
+ // Don't leave ID generation to chance; we want it to be same as in\r
+ // @ExpectedDataSet\r
+ error.setId(2);\r
+ error.setCreated(created);\r
+ error.setUuid(UUID.fromString("358da71f-b646-4b79-b00e-dcb68b6425bb"));\r
+ error.setSeverity(Severity.ERROR);\r
+ error.setPropertyPath("lastName");\r
+ error.setInvalidValue("Bar");\r
+ error.setMessage("Garbage In Garbage Out");\r
+ error.setValidationGroup("eu.etaxonomy.cdm.validation.Level2");\r
+ error.setValidator("eu.etaxonomy.cdm.persistence.validation.LastNameValidator");\r
+ entityValidation.addEntityConstraintViolation(error);\r
+\r
+ EntityValidationCrudJdbcImpl dao = new EntityValidationCrudJdbcImpl(dataSource);\r
+ dao.saveEntityValidation(entityValidation, new Class[] { Level2.class });\r
+ }\r
+\r
+\r
+\r
+ @Test\r
+ @DataSet("EntityValidationCrudJdbcImplTest.testSave.xml")\r
+ @ExpectedDataSet("EntityValidationCrudJdbcImplTest.testAllErrorsSolved-result.xml")\r
+ // Test proving that if an entity has been validated,\r
+ // yielding 1 error (as in @DataSet), and a subsequent\r
+ // validation yields 0 errors, all that remains is an\r
+ // EntityValidation record with its validation counter\r
+ // increased.\r
+ public void testAllErrorsSolved() {\r
+\r
+ DateTime created = new DateTime(2014, 1, 1, 0, 0);\r
+\r
+ Employee emp = new Employee();\r
+ emp.setId(100);\r
+ emp.setUuid(UUID.fromString("f8de74c6-aa56-4de3-931e-87b61da0218c"));\r
+\r
+ EntityValidation entityValidation = EntityValidation.newInstance();\r
+ entityValidation.setValidatedEntity(emp);\r
+ entityValidation.setId(1);\r
+ entityValidation.setUuid(UUID.fromString("dae5b090-30e8-45bc-9460-2eb2028d3c18"));\r
+ entityValidation.setCreated(created);\r
+ entityValidation.setCrudEventType(CRUDEventType.INSERT);\r
+ entityValidation.setValidationCount(5);\r
+\r
+ EntityValidationCrudJdbcImpl dao = new EntityValidationCrudJdbcImpl(dataSource);\r
+ dao.saveEntityValidation(entityValidation, new Class[] { Level2.class });\r
+ }\r
+\r
/**\r
* Test method for\r
* {@link eu.etaxonomy.cdm.persistence.dao.jdbc.validation.EntityValidationCrudJdbcImpl#deleteEntityValidation (java.lang.String, int)}\r
* .\r
*/\r
@Test\r
+ @DataSet\r
@ExpectedDataSet\r
public void test_DeleteValidationResult() {\r
EntityValidationCrudJdbcImpl dao = new EntityValidationCrudJdbcImpl(dataSource);\r
dao.deleteEntityValidation(SYNONYM_RELATIONSHIP, 200);\r
- EntityValidation result = dao.getValidationResult(SYNONYM_RELATIONSHIP, 200);\r
+ EntityValidation result = dao.getEntityValidation(SYNONYM_RELATIONSHIP, 200);\r
assertTrue(result == null);\r
}\r
\r
@Test\r
+ @DataSet\r
public void testGetEntityValidation() {\r
EntityValidationCrudJdbcImpl dao = new EntityValidationCrudJdbcImpl(dataSource);\r
EntityValidation result;\r
\r
- result = dao.getValidationResult(MEDIA, 100);\r
+ result = dao.getEntityValidation(MEDIA, 100);\r
assertNotNull(result);\r
assertEquals("Unexpected entity id", 1, result.getId());\r
assertEquals("Unexpected number of constraint violations", 1, result.getEntityConstraintViolations().size());\r
\r
- result = dao.getValidationResult(SYNONYM_RELATIONSHIP, 200);\r
+ result = dao.getEntityValidation(SYNONYM_RELATIONSHIP, 200);\r
assertNotNull(result);\r
assertEquals("Unexpected entity id", 2, result.getId());\r
assertEquals("Unexpected number of constraint violations", 2, result.getEntityConstraintViolations().size());\r
\r
- result = dao.getValidationResult(GATHERING_EVENT, 300);\r
+ result = dao.getEntityValidation(GATHERING_EVENT, 300);\r
assertNotNull(result);\r
assertEquals("Unexpected entity id", 3, result.getId());\r
assertEquals("Unexpected number of constraint violations", 3, result.getEntityConstraintViolations().size());\r
\r
- result = dao.getValidationResult(GATHERING_EVENT, 301);\r
+ result = dao.getEntityValidation(GATHERING_EVENT, 301);\r
assertNotNull(result);\r
assertEquals("Unexpected entity id", 4, result.getId());\r
assertEquals("Unexpected number of constraint violations", 1, result.getEntityConstraintViolations().size());\r
\r
// Test we get a null back\r
- result = dao.getValidationResult("Foo Bar", 100);\r
+ result = dao.getEntityValidation("Foo Bar", 100);\r
assertNull(result);\r
}\r
\r
-\r
-\r
/**\r
* Test method for\r
* {@link eu.etaxonomy.cdm.persistence.dao.jdbc.validation.EntityValidationCrudJdbcImpl#setDatasource (eu.etaxonomy.cdm.database.ICdmDataSource)}\r