diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/CriterionSatisfaction.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/CriterionSatisfaction.java index 9fc8a1630..c4f500b9d 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/CriterionSatisfaction.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/CriterionSatisfaction.java @@ -282,4 +282,9 @@ public class CriterionSatisfaction extends BaseEntity { Validate.isTrue(finishDate == null || startDate.equals(finishDate) || startDate.before(finishDate)); } + + public ResourceEnum getResourceType() { + return criterion.getType().getResource(); + } + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Machine.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Machine.java index d0654df5f..62a222954 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Machine.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Machine.java @@ -132,4 +132,14 @@ public class Machine extends Resource { return true; } } + + @Override + protected boolean isCriterionSatisfactionOfCorrectType( + CriterionSatisfaction c) { + + return super.isCriterionSatisfactionOfCorrectType(c) || + c.getResourceType().equals(ResourceEnum.MACHINE); + + } + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Resource.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Resource.java index 36a621729..0156babf3 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Resource.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Resource.java @@ -33,6 +33,7 @@ import java.util.Set; import org.apache.commons.lang.Validate; import org.hibernate.validator.AssertFalse; +import org.hibernate.validator.AssertTrue; import org.hibernate.validator.InvalidValue; import org.hibernate.validator.Valid; import org.joda.time.Days; @@ -823,4 +824,25 @@ public abstract class Resource extends BaseEntity{ return false; } + @AssertTrue(message="There are criterion satisfactions referring to " + + "criterion types not applicable to this resource") + public boolean checkConstraintCriterionSatisfactionsWithCorrectType() { + + for (CriterionSatisfaction c : getCriterionSatisfactions()) { + if (!isCriterionSatisfactionOfCorrectType(c)) { + return false; + } + } + + return true; + + } + + protected boolean isCriterionSatisfactionOfCorrectType( + CriterionSatisfaction c) { + + return c.getResourceType().equals(ResourceEnum.RESOURCE); + + } + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Worker.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Worker.java index 948a8052d..02958898c 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Worker.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Worker.java @@ -163,4 +163,13 @@ public class Worker extends Resource { } + @Override + protected boolean isCriterionSatisfactionOfCorrectType( + CriterionSatisfaction c) { + + return super.isCriterionSatisfactionOfCorrectType(c) || + c.getResourceType().equals(ResourceEnum.WORKER); + + } + } diff --git a/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/resources/api/ResourceServiceTest.java b/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/resources/api/ResourceServiceTest.java index 8a3914d9c..1a2c44ca0 100644 --- a/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/resources/api/ResourceServiceTest.java +++ b/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/resources/api/ResourceServiceTest.java @@ -46,6 +46,7 @@ import org.navalplanner.business.resources.entities.CriterionSatisfaction; import org.navalplanner.business.resources.entities.CriterionType; import org.navalplanner.business.resources.entities.Machine; import org.navalplanner.business.resources.entities.Resource; +import org.navalplanner.business.resources.entities.ResourceEnum; import org.navalplanner.business.resources.entities.Worker; import org.navalplanner.ws.common.api.InstanceConstraintViolationsDTO; import org.navalplanner.ws.common.api.InstanceConstraintViolationsListDTO; @@ -135,7 +136,7 @@ public class ResourceServiceTest { CriterionType ct = createCriterionType(); /* Create a resource DTO. */ - MachineDTO machineDTO = new MachineDTO(ct.getName(), "name", "desc"); + MachineDTO machineDTO = new MachineDTO(getUniqueName(), "name", "desc"); machineDTO.criterionSatisfactions.add( new CriterionSatisfactionDTO( ' ' + ct.getName() + ' ', " c1 ", // Blank spaces intentionally @@ -172,7 +173,7 @@ public class ResourceServiceTest { CriterionType ct = createCriterionType(); /* Create a machine DTO. */ - MachineDTO machineDTO = new MachineDTO(ct.getName(), "name", "desc"); + MachineDTO machineDTO = new MachineDTO(getUniqueName(), "name", "desc"); machineDTO.criterionSatisfactions.add( new CriterionSatisfactionDTO(ct.getName() , "c1", null, Calendar.getInstance().getTime())); // Missing start date. @@ -185,6 +186,36 @@ public class ResourceServiceTest { } + @Test + @NotTransactional + public void testAddResourceWithCriterionSatisfactionsWithIncorrectType() { + + /* Create two criterion types. */ + CriterionType machineCt = createCriterionType(ResourceEnum.MACHINE); + CriterionType workerCt = createCriterionType(ResourceEnum.WORKER); + + /* Create resource DTOs. */ + MachineDTO machineDTO = new MachineDTO(getUniqueName(), "name", "desc"); + machineDTO.criterionSatisfactions.add( + new CriterionSatisfactionDTO(workerCt.getName() , "c1", + Calendar.getInstance().getTime(), null)); // Incorrect type. + WorkerDTO workerDTO = new WorkerDTO(getUniqueName(), "surname", "nif"); + workerDTO.criterionSatisfactions.add( + new CriterionSatisfactionDTO(machineCt.getName() , "c1", + Calendar.getInstance().getTime(), null)); // Incorrect type. + + /* Test. */ + assertOneConstraintViolation( + resourceService.addResources(createResourceListDTO(machineDTO))); + assertFalse(machineDAO.existsMachineWithCodeInAnotherTransaction( + machineDTO.code)); + assertOneConstraintViolation( + resourceService.addResources(createResourceListDTO(workerDTO))); + assertTrue(workerDAO.findByFirstNameSecondNameAndNifAnotherTransaction( + workerDTO.firstName, workerDTO.surname, workerDTO.nif).size() == 0); + + } + @Test @NotTransactional public void testAddResourceWithCriterionSatisfactionsWithIncorrectNames() { @@ -282,6 +313,10 @@ public class ResourceServiceTest { } private CriterionType createCriterionType() { + return createCriterionType(ResourceEnum.RESOURCE); + } + + private CriterionType createCriterionType(final ResourceEnum resourceType) { IOnTransaction createCriterionType = new IOnTransaction() { @@ -291,6 +326,7 @@ public class ResourceServiceTest { CriterionType ct = CriterionType.create(getUniqueName(), "desc"); + ct.setResource(resourceType); Criterion c1 = Criterion.create("c1", ct); Criterion c2 = Criterion.create("c2", ct); ct.getCriterions().add(c1); diff --git a/scripts/rest-clients/resources-sample.xml b/scripts/rest-clients/resources-sample.xml index bbe88b163..2e532f355 100644 --- a/scripts/rest-clients/resources-sample.xml +++ b/scripts/rest-clients/resources-sample.xml @@ -3,12 +3,26 @@ + + + + + + + + + + @@ -24,6 +38,7 @@ finish-date="2009-12-25"/> +