[Bug #911] Fix bug
Also look into children of criteria. FEA: ItEr74S04BugFixing
This commit is contained in:
parent
5f6d4da513
commit
f02c853599
5 changed files with 94 additions and 11 deletions
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue