[Bug #911] Fix bug

Also look into children of criteria.

FEA: ItEr74S04BugFixing
This commit is contained in:
Óscar González Fernández 2011-04-12 19:41:27 +02:00
parent 5f6d4da513
commit f02c853599
5 changed files with 94 additions and 11 deletions

View file

@ -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<Criterion> withAllDescendants(
Collection<? extends Criterion> originalCriteria) {
Set<Criterion> result = new HashSet<Criterion>();
for (Criterion each : originalCriteria) {
result.add(each);
result.addAll(withAllDescendants(each.getChildren()));
}
return result;
}
private boolean criteriaSpecified() {

View file

@ -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() {

View file

@ -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);
}
});
}

View file

@ -121,7 +121,7 @@
index="idx_criterion_on_parent"/>
<!-- Indexed the other side -->
<set name="children" access="field" lazy="true" cascade="save-update">
<set name="children" access="field" lazy="false" cascade="save-update">
<key column="parent" not-null="false"></key>
<one-to-many class="Criterion"/>
</set>

View file

@ -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<Resource>() {
@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<Criterion>() {
@Override
public Criterion execute() {
return criterionDAO
.findExistingEntity(parentCriteron[0].getId());
}
});
List<Resource> resources = transactionService
.runOnReadOnlyTransaction(new IOnTransaction<List<Resource>>() {
@Override
public List<Resource> 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<Criterion> createCriterions() {
List<Criterion> result = new ArrayList<Criterion>();
CriterionType type = createCriterionType("criterionTypeTest");
@ -153,14 +203,20 @@ public class ResourceDAOTest {
private Worker createAndSaveResourceSatisfyingAllCriterions(final Collection<Criterion> 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<CriterionSatisfaction> satisfactions = new HashSet<CriterionSatisfaction>();
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