diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/common/BaseEntity.java b/navalplanner-business/src/main/java/org/navalplanner/business/common/BaseEntity.java index 63136c492..6d7e1c770 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/common/BaseEntity.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/common/BaseEntity.java @@ -20,7 +20,10 @@ package org.navalplanner.business.common; +import org.hibernate.validator.ClassValidator; +import org.hibernate.validator.InvalidValue; import org.navalplanner.business.INewObject; +import org.navalplanner.business.common.exceptions.ValidationException; /** @@ -29,6 +32,7 @@ import org.navalplanner.business.INewObject; * It provides the basic behavior for id and version fields. * * @author Manuel Rego Casasnovas + * @author Fernando Bellas Permuy */ public abstract class BaseEntity implements INewObject { @@ -80,4 +84,13 @@ public abstract class BaseEntity implements INewObject { setNewObject(false); } + @SuppressWarnings("unchecked") + public void validate() throws ValidationException { + ClassValidator classValidator = new ClassValidator(this.getClass()); + InvalidValue[] invalidValues = classValidator.getInvalidValues(this); + if (invalidValues.length > 0) { + throw new ValidationException(invalidValues); + } + } + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/common/daos/GenericDAOHibernate.java b/navalplanner-business/src/main/java/org/navalplanner/business/common/daos/GenericDAOHibernate.java index c95b907b0..f9c822ed2 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/common/daos/GenericDAOHibernate.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/common/daos/GenericDAOHibernate.java @@ -32,8 +32,7 @@ import org.hibernate.SessionFactory; import org.hibernate.StaleObjectStateException; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; -import org.hibernate.validator.ClassValidator; -import org.hibernate.validator.InvalidValue; +import org.navalplanner.business.common.BaseEntity; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.common.exceptions.ValidationException; import org.springframework.beans.factory.annotation.Autowired; @@ -57,8 +56,8 @@ import org.springframework.transaction.annotation.Transactional; * @param * Primary key class */ -public class GenericDAOHibernate implements - IGenericDAO { +public class GenericDAOHibernate implements IGenericDAO { private Class entityClass; @@ -81,20 +80,10 @@ public class GenericDAOHibernate implements } public void save(E entity) throws ValidationException { - checkIsValid(entity); + entity.validate(); getSession().saveOrUpdate(entity); } - @SuppressWarnings("unchecked") - private void checkIsValid(E entity) throws ValidationException { - Class entityClass = (Class) entity.getClass(); - ClassValidator classValidator = new ClassValidator(entityClass); - InvalidValue[] invalidValues = classValidator.getInvalidValues(entity); - if (invalidValues.length > 0) { - throw new ValidationException(invalidValues); - } - } - public void reattachUnmodifiedEntity(E entity) { getSession().lock(entity, LockMode.NONE); diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/CriterionType.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/CriterionType.java index cdd1fffd4..4561b56ce 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/CriterionType.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/CriterionType.java @@ -20,14 +20,11 @@ package org.navalplanner.business.resources.entities; -import java.util.Arrays; import java.util.HashSet; import java.util.Set; import org.apache.commons.lang.builder.EqualsBuilder; import org.hibernate.validator.AssertTrue; -import org.hibernate.validator.ClassValidator; -import org.hibernate.validator.InvalidValue; import org.hibernate.validator.NotEmpty; import org.hibernate.validator.Valid; import org.navalplanner.business.common.BaseEntity; @@ -284,12 +281,7 @@ public class CriterionType extends BaseEntity implements } -// FIXME: Surprisingly, @AssertTrue in this method causes the Maven build to -// fail due to out of memory (probably due to the configuration of Hibernate to -// automatically execute validations when saving entities). Provisionally, -// "validate" method has been provided as a hack. -// FIXME: Internationalization must be provided. -// @AssertTrue(message="el nombre del tipo de criterion ya se está usando") + @AssertTrue(message="el nombre del tipo de criterion ya se está usando") public boolean checkConstraintUniqueCriterionTypeName() { ICriterionTypeDAO criterionTypeDAO = Registry.getCriterionTypeDAO(); @@ -340,28 +332,4 @@ public class CriterionType extends BaseEntity implements } - // FIXME: hack to overcome problem with @AssertTrue and - // "checkConstraintUniqueCriterionTypeName" method. - public InvalidValue[] validate() { - - ClassValidator criterionTypeValidator = - new ClassValidator(CriterionType.class); - - InvalidValue[] invalidValues = - criterionTypeValidator.getInvalidValues(this); - - if (!checkConstraintUniqueCriterionTypeName()) { - invalidValues = - Arrays.copyOf(invalidValues, invalidValues.length+1); - invalidValues[invalidValues.length-1] = - new InvalidValue("el nombre del tipo de criterion ya se " + - "está usando", CriterionType.class, - "checkConstraintUniqueCriterionTypeName", - null, this); - } - - return invalidValues; - - } - } diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/daos/CriterionTypeDAOTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/daos/CriterionTypeDAOTest.java index 2f743ec18..0e306bad0 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/daos/CriterionTypeDAOTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/daos/CriterionTypeDAOTest.java @@ -23,7 +23,6 @@ package org.navalplanner.business.test.resources.daos; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; -import static org.junit.Assert.fail; import static org.navalplanner.business.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_FILE; import static org.navalplanner.business.test.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_TEST_FILE; @@ -31,7 +30,6 @@ import java.util.ArrayList; import java.util.List; import java.util.UUID; -import org.hibernate.exception.ConstraintViolationException; import org.junit.Test; import org.junit.runner.RunWith; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; @@ -40,7 +38,6 @@ import org.navalplanner.business.resources.daos.ICriterionTypeDAO; import org.navalplanner.business.resources.entities.CriterionType; import org.navalplanner.business.resources.entities.ResourceEnum; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.dao.DataIntegrityViolationException; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.transaction.annotation.Transactional; @@ -82,30 +79,13 @@ public class CriterionTypeDAOTest { assertTrue(criterionTypeDAO.exists(criterionType.getId())); } - @Test - public void testCriterionTypeCanBeSavedTwice() throws ValidationException { - CriterionType criterionType = createValidCriterionType(); - criterionTypeDAO.save(criterionType); - criterionTypeDAO.save(criterionType); - assertTrue(criterionTypeDAO.exists(criterionType.getId()) - || criterionTypeDAO.existsByName(criterionType)); - } - - @Test + @Test(expected=ValidationException.class) public void testCannotSaveTwoDifferentCriterionTypesWithTheSameName() throws ValidationException { - try { - CriterionType criterionType = createValidCriterionType("bla",""); - criterionTypeDAO.save(criterionType); - criterionType = createValidCriterionType("bla",""); - criterionTypeDAO.save(criterionType); - criterionTypeDAO.flush(); - fail("must send exception since thereis a duplicated criterion type"); - } catch (ConstraintViolationException c) { - // This exception is raised in postgresql - } catch (DataIntegrityViolationException d) { - // This exception is raised in HSQL - } + CriterionType criterionType = createValidCriterionType("bla",""); + criterionTypeDAO.save(criterionType); + criterionType = createValidCriterionType("bla",""); + criterionTypeDAO.save(criterionType); } @Test diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/criterion/impl/CriterionServiceREST.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/criterion/impl/CriterionServiceREST.java index d9185e03b..516f8fe74 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/criterion/impl/CriterionServiceREST.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/criterion/impl/CriterionServiceREST.java @@ -29,7 +29,7 @@ import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; -import org.hibernate.validator.InvalidValue; +import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.resources.daos.ICriterionTypeDAO; import org.navalplanner.business.resources.entities.CriterionType; import org.navalplanner.ws.common.api.InstanceConstraintViolationsDTO; @@ -86,19 +86,15 @@ public class CriterionServiceREST implements ICriterionService { CriterionType criterionType = CriterionConverter.toEntity(criterionTypeDTO); - InvalidValue[] invalidValues = - criterionType.validate(); - - if (invalidValues.length > 0) { + try { + criterionTypeDAO.save(criterionType); + } catch (ValidationException e) { instanceConstraintViolationsList.add( ConstraintViolationConverter.toDTO( generateInstanceId(instanceNumber, criterionTypeDTO.name), - invalidValues)); - - } else { - criterionTypeDAO.save(criterionType); + e.getInvalidValues())); } instanceNumber++;