From f02c8535992145d251ec4efa9a55a770722e9769 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Tue, 12 Apr 2011 19:41:27 +0200 Subject: [PATCH] [Bug #911] Fix bug Also look into children of criteria. FEA: ItEr74S04BugFixing --- .../resources/daos/ResourcesSearcher.java | 15 +++- .../resources/entities/Criterion.java | 15 ++++ .../business/resources/entities/Resource.java | 3 +- .../resources/entities/Resources.hbm.xml | 2 +- .../test/resources/daos/ResourceDAOTest.java | 70 +++++++++++++++++-- 5 files changed, 94 insertions(+), 11 deletions(-) diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/ResourcesSearcher.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/ResourcesSearcher.java index e8941a7be..ce1c13572 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/ResourcesSearcher.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/ResourcesSearcher.java @@ -29,6 +29,7 @@ import static org.hibernate.criterion.Restrictions.or; import java.util.ArrayList; import java.util.Collection; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; @@ -142,8 +143,18 @@ public class ResourcesSearcher implements IResourcesSearcher { if (!criteriaSpecified()) { return; } - criteria.createCriteria("criterionSatisfactions") - .add(in("criterion", this.criteria)); + criteria.createCriteria("criterionSatisfactions").add( + in("criterion", withAllDescendants(this.criteria))); + } + + private Set withAllDescendants( + Collection originalCriteria) { + Set result = new HashSet(); + for (Criterion each : originalCriteria) { + result.add(each); + result.addAll(withAllDescendants(each.getChildren())); + } + return result; } private boolean criteriaSpecified() { diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Criterion.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Criterion.java index 1445a6f13..17fc1d519 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Criterion.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Criterion.java @@ -347,6 +347,21 @@ public class Criterion extends IntegrationEntity implements ICriterion { return false; } + public boolean isEquivalentOrIncludedIn(ICriterion criterion) { + if (criterion instanceof Criterion) { + Criterion other = (Criterion) criterion; + if (isEquivalent(other)) { + return true; + } + for (Criterion each : other.getChildren()) { + if (isEquivalentOrIncludedIn(each)) { + return true; + } + } + } + return false; + } + @AssertTrue(message="a disabled resource has enabled subresources") public boolean checkConstraintActive() { 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 845482f7f..a79f1d92c 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 @@ -314,7 +314,8 @@ public abstract class Resource extends IntegrationEntity { @Override public boolean accepts(CriterionSatisfaction satisfaction) { - return satisfaction.getCriterion().isEquivalent(criterion); + return satisfaction.getCriterion() + .isEquivalentOrIncludedIn(criterion); } }); } diff --git a/navalplanner-business/src/main/resources/org/navalplanner/business/resources/entities/Resources.hbm.xml b/navalplanner-business/src/main/resources/org/navalplanner/business/resources/entities/Resources.hbm.xml index 6c4fa2863..425ffa357 100644 --- a/navalplanner-business/src/main/resources/org/navalplanner/business/resources/entities/Resources.hbm.xml +++ b/navalplanner-business/src/main/resources/org/navalplanner/business/resources/entities/Resources.hbm.xml @@ -121,7 +121,7 @@ index="idx_criterion_on_parent"/> - + diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/daos/ResourceDAOTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/daos/ResourceDAOTest.java index 67b85349f..1c6a809f7 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/daos/ResourceDAOTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/daos/ResourceDAOTest.java @@ -32,6 +32,7 @@ import static org.navalplanner.business.test.BusinessGlobalNames.BUSINESS_SPRING import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -42,6 +43,8 @@ import org.joda.time.LocalDate; import org.junit.Test; import org.junit.runner.RunWith; import org.navalplanner.business.calendars.entities.ResourceCalendar; +import org.navalplanner.business.common.IAdHocTransactionService; +import org.navalplanner.business.common.IOnTransaction; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.resources.daos.ICriterionDAO; import org.navalplanner.business.resources.daos.ICriterionTypeDAO; @@ -54,6 +57,7 @@ import org.navalplanner.business.resources.entities.Interval; import org.navalplanner.business.resources.entities.Resource; import org.navalplanner.business.resources.entities.Worker; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.annotation.NotTransactional; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.transaction.annotation.Transactional; @@ -72,14 +76,17 @@ public class ResourceDAOTest { @Autowired private IResourceDAO resourceDAO; + @Autowired + private ICriterionDAO criterionDAO; + @Autowired private IResourcesSearcher resourcesSearcher; @Autowired - private SessionFactory sessionFactory; + private IAdHocTransactionService transactionService; @Autowired - private ICriterionDAO criterionDAO; + private SessionFactory sessionFactory; @Autowired private ICriterionTypeDAO criterionTypeDAO; @@ -112,7 +119,7 @@ public class ResourceDAOTest { Worker worker = Worker.create(); worker.setFirstName("First name"); worker.setSurname("Surname"); - worker.setNif("NIF"); + worker.setNif("NIF" + UUID.randomUUID().toString()); return worker; } @@ -126,6 +133,49 @@ public class ResourceDAOTest { assertEquals(1, result.size()); } + @Test + @NotTransactional + public void theHierarchyOfCriterionsIsConsidered() { + final Criterion[] parentCriteron = { null }; + Resource worker = transactionService + .runOnTransaction(new IOnTransaction() { + @Override + public Resource execute() { + Worker result = givenValidWorker(); + CriterionType type = createCriterionType("testType"); + Criterion parent = createCriterion("parent", type); + parentCriteron[0] = parent; + Criterion child = createCriterion("child", type); + child.setParent(parent); + addSatisfactionsOn(result, + Interval.from(new LocalDate(1970, 1, 1)), child); + return result; + } + }); + final Criterion parent = transactionService + .runOnReadOnlyTransaction(new IOnTransaction() { + + @Override + public Criterion execute() { + return criterionDAO + .findExistingEntity(parentCriteron[0].getId()); + } + }); + List resources = transactionService + .runOnReadOnlyTransaction(new IOnTransaction>() { + + @Override + public List execute() { + return resourcesSearcher.searchBoth() + .byCriteria(Collections.singleton(parent)) + .execute(); + } + }); + assertThat(resources.size(), equalTo(1)); + Resource resource = resources.get(0); + assertThat(resource.getId(), equalTo(worker.getId())); + } + private Collection createCriterions() { List result = new ArrayList(); CriterionType type = createCriterionType("criterionTypeTest"); @@ -153,14 +203,20 @@ public class ResourceDAOTest { private Worker createAndSaveResourceSatisfyingAllCriterions(final Collection criterions) { Worker result = givenValidWorker(); Interval interval = Interval.range(new LocalDate(1970, 1, 1), null); + addSatisfactionsOn(result, interval, + criterions.toArray(new Criterion[] {})); + return result; + } + + private void addSatisfactionsOn(Worker worker, Interval interval, + final Criterion... criterions) { Set satisfactions = new HashSet(); for (Criterion each : criterions) { - satisfactions.add(CriterionSatisfaction.create(each, result, + satisfactions.add(CriterionSatisfaction.create(each, worker, interval)); } - result.addSatisfactions(satisfactions); - resourceDAO.save(result); - return result; + worker.addSatisfactions(satisfactions); + resourceDAO.save(worker); } @Test