ItEr08S11HistoriaLaboralTraballador: Add ICriterionOnData that expands the capabilities of a ICriterion.

It lets retrieve all the resources satisfying the criterion.
This commit is contained in:
Óscar González Fernández 2009-05-17 17:05:44 +02:00 committed by Javier Moran Rua
parent dcd0f01991
commit 802d60f312
5 changed files with 103 additions and 4 deletions

View file

@ -3,9 +3,7 @@ package org.navalplanner.business.resources.entities;
import java.util.Date; import java.util.Date;
/** /**
* Responsible of searching the resources satisfiying some condition or set of * It's a predicate that can be applied on resources <br />
* conditions. <br />
* Created at May 12, 2009
* @author Óscar González Fernández <ogonzalez@igalia.com> * @author Óscar González Fernández <ogonzalez@igalia.com>
*/ */
public interface ICriterion { public interface ICriterion {

View file

@ -0,0 +1,18 @@
package org.navalplanner.business.resources.entities;
import java.util.Collection;
import java.util.Date;
/**
* Expands the capabilities of {@link ICriterion}. It also lets retrieve the
* resources satisfying the criterion <br />
* @author Óscar González Fernández <ogonzalez@igalia.com>
*/
public interface ICriterionOnData extends ICriterion {
Collection<Resource> getResourcesSatisfying();
Collection<Resource> getResourcesSatisfying(Date start, Date end)
throws IllegalArgumentException;
}

View file

@ -8,6 +8,7 @@ import org.navalplanner.business.common.exceptions.InstanceNotFoundException;
import org.navalplanner.business.resources.entities.Criterion; import org.navalplanner.business.resources.entities.Criterion;
import org.navalplanner.business.resources.entities.CriterionSatisfaction; import org.navalplanner.business.resources.entities.CriterionSatisfaction;
import org.navalplanner.business.resources.entities.ICriterion; import org.navalplanner.business.resources.entities.ICriterion;
import org.navalplanner.business.resources.entities.ICriterionOnData;
import org.navalplanner.business.resources.entities.ICriterionType; import org.navalplanner.business.resources.entities.ICriterionType;
import org.navalplanner.business.resources.entities.Resource; import org.navalplanner.business.resources.entities.Resource;
@ -40,4 +41,6 @@ public interface CriterionService {
boolean exists(Criterion criterion); boolean exists(Criterion criterion);
ICriterionOnData empower(ICriterion criterion);
} }

View file

@ -12,11 +12,13 @@ import org.navalplanner.business.resources.daos.impl.CriterionSatisfactionDAO;
import org.navalplanner.business.resources.entities.Criterion; import org.navalplanner.business.resources.entities.Criterion;
import org.navalplanner.business.resources.entities.CriterionSatisfaction; import org.navalplanner.business.resources.entities.CriterionSatisfaction;
import org.navalplanner.business.resources.entities.ICriterion; import org.navalplanner.business.resources.entities.ICriterion;
import org.navalplanner.business.resources.entities.ICriterionOnData;
import org.navalplanner.business.resources.entities.ICriterionType; import org.navalplanner.business.resources.entities.ICriterionType;
import org.navalplanner.business.resources.entities.Resource; import org.navalplanner.business.resources.entities.Resource;
import org.navalplanner.business.resources.services.CriterionService; import org.navalplanner.business.resources.services.CriterionService;
import org.navalplanner.business.resources.services.ResourceService; import org.navalplanner.business.resources.services.ResourceService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
/** /**
@ -112,4 +114,43 @@ public class CriterionServiceImpl implements CriterionService {
if (!exists(criterion)) if (!exists(criterion))
save(criterion); save(criterion);
} }
@Override
public ICriterionOnData empower(final ICriterion criterion) {
final CriterionService criterionService = getProxifiedCriterionService();
return new ICriterionOnData() {
@Override
public boolean isSatisfiedBy(Resource resource) {
return criterion.isSatisfiedBy(resource);
}
@Override
public boolean isSatisfiedBy(Resource resource, Date start, Date end) {
return criterion.isSatisfiedBy(resource, start, end);
}
@Override
public Collection<Resource> getResourcesSatisfying() {
return criterionService.getResourcesSatisfying(criterion);
}
@Override
public Collection<Resource> getResourcesSatisfying(Date start,
Date end) throws IllegalArgumentException {
return criterionService.getResourcesSatisfying(criterion,
start, end);
}
};
}
@Autowired
private ApplicationContext applicationContext;
// this is a hack to avoid using the this variable in empower method. The
// this instance is not proxified because spring uses an transparent proxy,
// so it doesn't open the transacion
private CriterionService getProxifiedCriterionService() {
return (CriterionService) applicationContext.getBeansOfType(
CriterionService.class).values().iterator().next();
}
} }

View file

@ -13,6 +13,7 @@ import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.navalplanner.business.resources.entities.Criterion; import org.navalplanner.business.resources.entities.Criterion;
import org.navalplanner.business.resources.entities.CriterionSatisfaction; import org.navalplanner.business.resources.entities.CriterionSatisfaction;
import org.navalplanner.business.resources.entities.ICriterionOnData;
import org.navalplanner.business.resources.entities.ICriterionType; import org.navalplanner.business.resources.entities.ICriterionType;
import org.navalplanner.business.resources.entities.PredefinedCriterionTypes; import org.navalplanner.business.resources.entities.PredefinedCriterionTypes;
import org.navalplanner.business.resources.entities.Worker; import org.navalplanner.business.resources.entities.Worker;
@ -23,6 +24,7 @@ import org.navalplanner.business.test.resources.daos.CriterionSatisfactionDAOTes
import org.navalplanner.business.test.resources.entities.ResourceTest; import org.navalplanner.business.test.resources.entities.ResourceTest;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException; import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.test.annotation.NotTransactional;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -160,6 +162,44 @@ public class CriterionServiceTest {
.size()); .size());
} }
@Test
public void shouldLetCreateCriterionOnData() {
Criterion criterion = CriterionDAOTest.createValidCriterion();
criterionService.save(criterion);
Worker worker = new Worker("firstName", "surName", "2333232", 10);
resourceService.saveResource(worker);
CriterionSatisfaction criterionSatisfaction = new CriterionSatisfaction(
CriterionSatisfactionDAOTest.year(2000), criterion, worker);
criterionService.add(criterionSatisfaction);
ICriterionOnData criterionOnData = criterionService.empower(criterion);
assertTrue(criterionOnData.isSatisfiedBy(worker));
assertEquals(1, criterionOnData.getResourcesSatisfying().size());
assertTrue(criterionOnData.getResourcesSatisfying().contains(worker));
assertTrue(criterionOnData.getResourcesSatisfying(
CriterionSatisfactionDAOTest.year(1990),
CriterionSatisfactionDAOTest.year(2005)).isEmpty());
assertEquals(1, criterionOnData.getResourcesSatisfying(
CriterionSatisfactionDAOTest.year(2001),
CriterionSatisfactionDAOTest.year(2005)).size());
}
@Test
@NotTransactional
public void shouldntThrowExceptionDueToTransparentProxyGotcha() {
Criterion criterion = CriterionDAOTest.createValidCriterion();
criterionService.save(criterion);
Worker worker = new Worker("firstName", "surName", "2333232", 10);
resourceService.saveResource(worker);
CriterionSatisfaction criterionSatisfaction = new CriterionSatisfaction(
CriterionSatisfactionDAOTest.year(2000), criterion, worker);
criterionService.add(criterionSatisfaction);
ICriterionOnData criterionOnData = criterionService.empower(criterion);
criterionOnData.getResourcesSatisfying();
criterionOnData.getResourcesSatisfying(
CriterionSatisfactionDAOTest.year(2001),
CriterionSatisfactionDAOTest.year(2005));
}
@Test(expected = IllegalArgumentException.class) @Test(expected = IllegalArgumentException.class)
public void mustBeCorrectInterval() { public void mustBeCorrectInterval() {
Criterion criterion = CriterionDAOTest.createValidCriterion(); Criterion criterion = CriterionDAOTest.createValidCriterion();
@ -225,7 +265,6 @@ public class CriterionServiceTest {
assertEquals(2, criterionService.getSatisfactionsFor(criterionType, assertEquals(2, criterionService.getSatisfactionsFor(criterionType,
CriterionSatisfactionDAOTest.year(1999), CriterionSatisfactionDAOTest.year(1999),
CriterionSatisfactionDAOTest.year(2005)).size()); CriterionSatisfactionDAOTest.year(2005)).size());
} }
} }