ItEr41S15CUImportacionRecursosProductivosItEr40S20: Constraint added to verify criterion satisfactions are of a CriterionType compatible with the resource

--
Fernando Bellas Permuy

Associate Professor (Titular) at University of A Coruña
Department of Information and Communications Technologies
Facultad de Informática - Campus de Elviña, S/N
15071 - A Coruña - Spain
http://www.tic.udc.es/~fbellas - fbellas@udc.es
Tel: +34 981 167 000 (ext: 1353) - Fax: +34 981 167 160

>From c9af4778e28e370fb2a8dc2c63a4d75e41a07d7f Mon Sep 17 00:00:00 2001
From: Fernando Bellas Permuy <fbellas@udc.es>
Date: Thu, 31 Dec 2009 13:14:28 +0100
Subject: [PATCH 6/7] ItEr41S15CUImportacionRecursosProductivosItEr40S20: Constraint added to verify criterion satisfactions are of a CriterionType compatible with the resource.

A test case has also been added.
This commit is contained in:
Fernando Bellas Permuy 2009-12-31 13:59:04 +01:00 committed by Javier Moran Rua
parent 0dad7ade89
commit 77a236a5e8
6 changed files with 99 additions and 2 deletions

View file

@ -282,4 +282,9 @@ public class CriterionSatisfaction extends BaseEntity {
Validate.isTrue(finishDate == null || startDate.equals(finishDate) Validate.isTrue(finishDate == null || startDate.equals(finishDate)
|| startDate.before(finishDate)); || startDate.before(finishDate));
} }
public ResourceEnum getResourceType() {
return criterion.getType().getResource();
}
} }

View file

@ -132,4 +132,14 @@ public class Machine extends Resource {
return true; return true;
} }
} }
@Override
protected boolean isCriterionSatisfactionOfCorrectType(
CriterionSatisfaction c) {
return super.isCriterionSatisfactionOfCorrectType(c) ||
c.getResourceType().equals(ResourceEnum.MACHINE);
}
} }

View file

@ -33,6 +33,7 @@ import java.util.Set;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.hibernate.validator.AssertFalse; import org.hibernate.validator.AssertFalse;
import org.hibernate.validator.AssertTrue;
import org.hibernate.validator.InvalidValue; import org.hibernate.validator.InvalidValue;
import org.hibernate.validator.Valid; import org.hibernate.validator.Valid;
import org.joda.time.Days; import org.joda.time.Days;
@ -823,4 +824,25 @@ public abstract class Resource extends BaseEntity{
return false; 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);
}
} }

View file

@ -163,4 +163,13 @@ public class Worker extends Resource {
} }
@Override
protected boolean isCriterionSatisfactionOfCorrectType(
CriterionSatisfaction c) {
return super.isCriterionSatisfactionOfCorrectType(c) ||
c.getResourceType().equals(ResourceEnum.WORKER);
}
} }

View file

@ -46,6 +46,7 @@ import org.navalplanner.business.resources.entities.CriterionSatisfaction;
import org.navalplanner.business.resources.entities.CriterionType; import org.navalplanner.business.resources.entities.CriterionType;
import org.navalplanner.business.resources.entities.Machine; import org.navalplanner.business.resources.entities.Machine;
import org.navalplanner.business.resources.entities.Resource; import org.navalplanner.business.resources.entities.Resource;
import org.navalplanner.business.resources.entities.ResourceEnum;
import org.navalplanner.business.resources.entities.Worker; import org.navalplanner.business.resources.entities.Worker;
import org.navalplanner.ws.common.api.InstanceConstraintViolationsDTO; import org.navalplanner.ws.common.api.InstanceConstraintViolationsDTO;
import org.navalplanner.ws.common.api.InstanceConstraintViolationsListDTO; import org.navalplanner.ws.common.api.InstanceConstraintViolationsListDTO;
@ -135,7 +136,7 @@ public class ResourceServiceTest {
CriterionType ct = createCriterionType(); CriterionType ct = createCriterionType();
/* Create a resource DTO. */ /* Create a resource DTO. */
MachineDTO machineDTO = new MachineDTO(ct.getName(), "name", "desc"); MachineDTO machineDTO = new MachineDTO(getUniqueName(), "name", "desc");
machineDTO.criterionSatisfactions.add( machineDTO.criterionSatisfactions.add(
new CriterionSatisfactionDTO( new CriterionSatisfactionDTO(
' ' + ct.getName() + ' ', " c1 ", // Blank spaces intentionally ' ' + ct.getName() + ' ', " c1 ", // Blank spaces intentionally
@ -172,7 +173,7 @@ public class ResourceServiceTest {
CriterionType ct = createCriterionType(); CriterionType ct = createCriterionType();
/* Create a machine DTO. */ /* Create a machine DTO. */
MachineDTO machineDTO = new MachineDTO(ct.getName(), "name", "desc"); MachineDTO machineDTO = new MachineDTO(getUniqueName(), "name", "desc");
machineDTO.criterionSatisfactions.add( machineDTO.criterionSatisfactions.add(
new CriterionSatisfactionDTO(ct.getName() , "c1", new CriterionSatisfactionDTO(ct.getName() , "c1",
null, Calendar.getInstance().getTime())); // Missing start date. 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 @Test
@NotTransactional @NotTransactional
public void testAddResourceWithCriterionSatisfactionsWithIncorrectNames() { public void testAddResourceWithCriterionSatisfactionsWithIncorrectNames() {
@ -282,6 +313,10 @@ public class ResourceServiceTest {
} }
private CriterionType createCriterionType() { private CriterionType createCriterionType() {
return createCriterionType(ResourceEnum.RESOURCE);
}
private CriterionType createCriterionType(final ResourceEnum resourceType) {
IOnTransaction<CriterionType> createCriterionType = IOnTransaction<CriterionType> createCriterionType =
new IOnTransaction<CriterionType>() { new IOnTransaction<CriterionType>() {
@ -291,6 +326,7 @@ public class ResourceServiceTest {
CriterionType ct = CriterionType.create(getUniqueName(), CriterionType ct = CriterionType.create(getUniqueName(),
"desc"); "desc");
ct.setResource(resourceType);
Criterion c1 = Criterion.create("c1", ct); Criterion c1 = Criterion.create("c1", ct);
Criterion c2 = Criterion.create("c2", ct); Criterion c2 = Criterion.create("c2", ct);
ct.getCriterions().add(c1); ct.getCriterions().add(c1);

View file

@ -3,12 +3,26 @@
<resource-list xmlns="http://rest.ws.navalplanner.org"> <resource-list xmlns="http://rest.ws.navalplanner.org">
<!-- *** Machines *** --> <!-- *** Machines *** -->
<!-- OK --> <!-- OK -->
<machine code=" m1 " name="m1-name" description="m1-desc"/> <machine code=" m1 " name="m1-name" description="m1-desc"/>
<!-- Missing code and name (description is optional). --> <!-- Missing code and name (description is optional). -->
<machine code="" description=""/> <machine code="" description=""/>
<!-- Criterion satisfaction of incorrect type. -->
<machine code="m2" name="m2-name" description="m2-desc">
<criterion-satisfaction-list>
<criterion-satisfaction
criterion-type-name=" WORK_RELATIONSHIP "
criterion-name=" hiredResourceWorkingRelationship "
start-date="2009-01-01"
finish-date=""/>
</criterion-satisfaction-list>
</machine>
<!-- *** Workers *** --> <!-- *** Workers *** -->
<!-- OK --> <!-- OK -->
<worker first-name="w1-firstName" surname="w1-surname" nif=" w1-nif "> <worker first-name="w1-firstName" surname="w1-surname" nif=" w1-nif ">
<criterion-satisfaction-list> <criterion-satisfaction-list>
@ -24,6 +38,7 @@
finish-date="2009-12-25"/> finish-date="2009-12-25"/>
</criterion-satisfaction-list> </criterion-satisfaction-list>
</worker> </worker>
<!-- Missing first name, surname, and nif. --> <!-- Missing first name, surname, and nif. -->
<worker first-name="" nif=""/> <worker first-name="" nif=""/>