From 00db73a60f6f963ce20dcd0e96de0c70fd06dea1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Wed, 27 Jul 2011 17:40:33 +0200 Subject: [PATCH] Take into account the scenario It's extracted into a QueryPart FEA: ItEr75S11PreventLooseChanges --- .../planner/daos/IResourceAllocationDAO.java | 11 ++- .../planner/daos/ResourceAllocationDAO.java | 92 +++++++++++++++---- .../daos/ResourceAllocationDAOTest.java | 13 ++- .../web/resourceload/ResourceLoadModel.java | 22 ++++- .../web/resources/machine/MachineModel.java | 11 ++- .../web/resources/worker/WorkerModel.java | 11 ++- 6 files changed, 128 insertions(+), 32 deletions(-) diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/IResourceAllocationDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/IResourceAllocationDAO.java index 6411b65ea..0c233bd90 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/IResourceAllocationDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/IResourceAllocationDAO.java @@ -32,6 +32,7 @@ import org.navalplanner.business.planner.entities.ResourceAllocation; import org.navalplanner.business.planner.entities.SpecificResourceAllocation; import org.navalplanner.business.resources.entities.Criterion; import org.navalplanner.business.resources.entities.Resource; +import org.navalplanner.business.scenarios.entities.Scenario; /** * DAO interface for {@link ResourceAllocation} @@ -42,19 +43,24 @@ public interface IResourceAllocationDAO extends IGenericDAO { List> findAllocationsRelatedToAnyOf( + Scenario onScenario, List resources); List> findAllocationsRelatedToAnyOf( + Scenario onScenario, List resources, LocalDate intervalFilterStartDate, LocalDate intervalFilterEndDate); - List> findAllocationsRelatedTo(Resource resource, + List> findAllocationsRelatedTo(Scenario onScenario, + Resource resource, LocalDate intervalFilterStartDate, LocalDate intervalFilterEndDate); Map> findGenericAllocationsByCriterion( + Scenario onScenario, Date intervalFilterStartDate, Date intervalFilterEndDate); Map> findGenericAllocationsBySomeCriterion( + Scenario onScenario, List criterions, Date intervalFilterStartDate, Date intervalFilterEndDate); @@ -74,6 +80,8 @@ public interface IResourceAllocationDAO extends * allocations satisfying the first requirement are returned. *

* + * @param onScenario + * the scenario the allocations returned will belong to * @param criterion * must be not null * @param intervalFilterStartDate @@ -84,6 +92,7 @@ public interface IResourceAllocationDAO extends * allocations} found */ List findSpecificAllocationsRelatedTo( + Scenario onScenario, Criterion criterion, Date intervalFilterStartDate, Date intervalFilterEndDate); diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/ResourceAllocationDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/ResourceAllocationDAO.java index d4209ab44..bf00a120b 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/ResourceAllocationDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/ResourceAllocationDAO.java @@ -31,6 +31,7 @@ import java.util.Map.Entry; import java.util.regex.Pattern; import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.Validate; import org.hibernate.Query; import org.hibernate.Session; import org.joda.time.LocalDate; @@ -40,6 +41,7 @@ import org.navalplanner.business.planner.entities.ResourceAllocation; import org.navalplanner.business.planner.entities.SpecificResourceAllocation; import org.navalplanner.business.resources.entities.Criterion; import org.navalplanner.business.resources.entities.Resource; +import org.navalplanner.business.scenarios.entities.Scenario; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Repository; @@ -56,28 +58,35 @@ public class ResourceAllocationDAO extends @Override public List> findAllocationsRelatedToAnyOf( - List resources) { + Scenario onScenario, List resources) { List> result = new ArrayList>(); - result.addAll(findSpecificAllocationsRelatedTo(resources, null, null)); - result.addAll(findGenericAllocationsFor(resources, null, null)); + result.addAll(findSpecificAllocationsRelatedTo(onScenario, resources, + null, null)); + result.addAll(findGenericAllocationsFor(onScenario, resources, null, + null)); return result; } @Override public List> findAllocationsRelatedToAnyOf( + Scenario onScenario, List resources, LocalDate intervalFilterStartDate, LocalDate intervalFilterEndDate) { List> result = new ArrayList>(); - result.addAll(findSpecificAllocationsRelatedTo(resources, intervalFilterStartDate, intervalFilterEndDate)); - result.addAll(findGenericAllocationsFor(resources, intervalFilterStartDate, intervalFilterEndDate)); + result.addAll(findSpecificAllocationsRelatedTo(onScenario, resources, + intervalFilterStartDate, intervalFilterEndDate)); + result.addAll(findGenericAllocationsFor(onScenario, resources, + intervalFilterStartDate, intervalFilterEndDate)); return result; } @SuppressWarnings("unchecked") private List findGenericAllocationsFor( + final Scenario onScenario, final List resources, final LocalDate intervalFilterStartDate, final LocalDate intervalFilterEndDate) { + if (resources.isEmpty()) { return new ArrayList(); } @@ -103,8 +112,10 @@ public class ResourceAllocationDAO extends @Override protected IQueryPart[] getExtraParts() { - return new IQueryPart[] { new DatesInterval("task", - intervalFilterStartDate, intervalFilterEndDate) }; + return new IQueryPart[] { + new DatesInterval("task", intervalFilterStartDate, + intervalFilterEndDate), + new OnScenario("task", onScenario) }; } }; @@ -114,6 +125,7 @@ public class ResourceAllocationDAO extends @SuppressWarnings("unchecked") private List findSpecificAllocationsRelatedTo( + final Scenario onScenario, final List resources, final LocalDate intervalFilterStartDate, final LocalDate intervalFilterEndDate) { @@ -142,8 +154,10 @@ public class ResourceAllocationDAO extends @Override protected IQueryPart[] getExtraParts() { - return new IQueryPart[] { new DatesInterval("task", - intervalFilterStartDate, intervalFilterEndDate) }; + return new IQueryPart[] { + new DatesInterval("task", intervalFilterStartDate, + intervalFilterEndDate), + new OnScenario("task", onScenario) }; } }; return (List) queryBuilder.build( @@ -152,10 +166,12 @@ public class ResourceAllocationDAO extends @Override public List> findAllocationsRelatedTo( + Scenario onScenario, Resource resource, LocalDate intervalFilterStartDate, LocalDate intervalFilterEndDate) { - return stripAllocationsWithoutAssignations(findAllocationsRelatedToAnyOf(Arrays - .asList(resource), intervalFilterStartDate, intervalFilterEndDate)); + return stripAllocationsWithoutAssignations(findAllocationsRelatedToAnyOf( + onScenario, Arrays.asList(resource), intervalFilterStartDate, + intervalFilterEndDate)); } private > List stripAllocationsWithoutAssignations( @@ -184,7 +200,9 @@ public class ResourceAllocationDAO extends @Override public Map> findGenericAllocationsByCriterion( + final Scenario onScenario, final Date intervalFilterStartDate, final Date intervalFilterEndDate) { + QueryBuilder queryBuilder = new QueryBuilder() { @Override @@ -206,8 +224,10 @@ public class ResourceAllocationDAO extends @Override protected IQueryPart[] getExtraParts() { - return new IQueryPart[] { new DatesInterval("task", - intervalFilterStartDate, intervalFilterEndDate) }; + return new IQueryPart[] { + new DatesInterval("task", intervalFilterStartDate, + intervalFilterEndDate), + new OnScenario("task", onScenario) }; } }; @@ -218,6 +238,7 @@ public class ResourceAllocationDAO extends @Override public Map> findGenericAllocationsBySomeCriterion( + final Scenario onScenario, final List criterions, final Date intervalFilterStartDate, final Date intervalFilterEndDate) { @@ -247,8 +268,10 @@ public class ResourceAllocationDAO extends @Override protected IQueryPart[] getExtraParts() { - return new IQueryPart[] { new DatesInterval("task", - intervalFilterStartDate, intervalFilterEndDate) }; + return new IQueryPart[] { + new DatesInterval("task", intervalFilterStartDate, + intervalFilterEndDate), + new OnScenario("task", onScenario) }; } }; Query q = queryBuilder.build(getSession()); @@ -335,6 +358,7 @@ public class ResourceAllocationDAO extends @Override public List findSpecificAllocationsRelatedTo( + final Scenario onScenario, final Criterion criterion, final Date intervalFilterStartDate, final Date intervalFilterEndDate) { @@ -360,8 +384,10 @@ public class ResourceAllocationDAO extends @Override protected IQueryPart[] getExtraParts() { - return new IQueryPart[] { new DatesInterval("t", - intervalFilterStartDate, intervalFilterEndDate) }; + return new IQueryPart[] { + new DatesInterval("t", intervalFilterStartDate, + intervalFilterEndDate), + new OnScenario("t", onScenario) }; } }; @@ -537,4 +563,36 @@ public class ResourceAllocationDAO extends } + public class OnScenario implements IQueryPart { + + private final Scenario onScenario; + private final String taskAlias; + + private OnScenario(String taskAlias, Scenario onScenario) { + Validate.notNull(taskAlias); + Validate.notNull(onScenario); + this.taskAlias = taskAlias; + this.onScenario = onScenario; + } + + @Override + public String queryPart() { + return "join " + taskAlias + + ".taskSource.schedulingData as schedulingData " + + "join schedulingData.orderElement as orderElement " + + ", OrderVersion as version "; + } + + @Override + public String wherePart() { + return "orderElement.schedulingDatasForVersion[version] = schedulingData " + + "and version.ownerScenario = :scenario"; + } + + @Override + public void injectParameters(Query query) { + query.setParameter("scenario", onScenario); + } + } + } \ No newline at end of file diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/daos/ResourceAllocationDAOTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/daos/ResourceAllocationDAOTest.java index aeae132d9..d27f2678e 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/daos/ResourceAllocationDAOTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/daos/ResourceAllocationDAOTest.java @@ -265,6 +265,7 @@ public class ResourceAllocationDAOTest { @Test public void testFindAllocationsRelatedToResourcesWithDateFilter() { + Scenario current = scenarioManager.getCurrent(); ResourceAllocation resourceAllocation1 = createValidSpecificResourceAllocation(); resourceAllocationDAO.save(resourceAllocation1); @@ -274,19 +275,23 @@ public class ResourceAllocationDAOTest { .getEndAsLocalDate(); List resources = resourceAllocation1.getAssociatedResources(); - assertTrue(resourceAllocationDAO.findAllocationsRelatedToAnyOf(resources, + assertTrue(resourceAllocationDAO.findAllocationsRelatedToAnyOf( + current, resources, intervalInitDate, intervalEndDate).contains(resourceAllocation1)); intervalEndDate = intervalInitDate; intervalInitDate = intervalInitDate.minusMonths(1); - assertTrue(resourceAllocationDAO.findAllocationsRelatedToAnyOf(resources, + assertTrue(resourceAllocationDAO.findAllocationsRelatedToAnyOf(current, + resources, intervalInitDate, intervalEndDate).contains(resourceAllocation1)); intervalEndDate = intervalEndDate.minusMonths(1); - assertFalse(resourceAllocationDAO.findAllocationsRelatedToAnyOf(resources, + assertFalse(resourceAllocationDAO.findAllocationsRelatedToAnyOf( + current, resources, intervalInitDate, intervalEndDate).contains(resourceAllocation1)); - assertTrue(resourceAllocationDAO.findAllocationsRelatedToAnyOf(resources, + assertTrue(resourceAllocationDAO.findAllocationsRelatedToAnyOf(current, + resources, intervalInitDate, null).contains(resourceAllocation1)); } } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resourceload/ResourceLoadModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resourceload/ResourceLoadModel.java index 992a06d11..5c3099326 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resourceload/ResourceLoadModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resourceload/ResourceLoadModel.java @@ -63,6 +63,7 @@ import org.navalplanner.business.resources.daos.IResourcesSearcher; import org.navalplanner.business.resources.entities.Criterion; import org.navalplanner.business.resources.entities.Resource; import org.navalplanner.business.scenarios.IScenarioManager; +import org.navalplanner.business.scenarios.entities.Scenario; import org.navalplanner.business.users.daos.IOrderAuthorizationDAO; import org.navalplanner.business.users.daos.IUserDAO; import org.navalplanner.business.users.entities.OrderAuthorization; @@ -160,6 +161,13 @@ public class ResourceLoadModel implements IResourceLoadModel { */ List allCriteriaList; + private Scenario getCurrentScenario() { + if (filterBy != null) { + return filterBy.getCurrentScenario(); + } + return scenarioManager.getCurrent(); + } + @Override @Transactional(readOnly = true) public void initGlobalView(boolean filterByResources) { @@ -246,7 +254,8 @@ public class ResourceLoadModel implements IResourceLoadModel { // reattaching criterions so the query returns the same criteria as // keys allCriteriaList = new ArrayList(criteriaToShowList); - return withAssociatedSpecific(findAllocationsGroupedByCriteria(criteriaToShowList)); + return withAssociatedSpecific(findAllocationsGroupedByCriteria( + scenarioManager.getCurrent(), criteriaToShowList)); } Map> result = findAllocationsByCriterion(); allCriteriaList = Criterion.sortByInclusionTypeAndName(result.keySet()); @@ -263,7 +272,8 @@ public class ResourceLoadModel implements IResourceLoadModel { if (filter()) { List tasks = justTasks(filterBy.getOrder() .getAllChildrenAssociatedTaskElements()); - return findAllocationsGroupedByCriteria(getCriterionsOn(tasks)); + return findAllocationsGroupedByCriteria(getCurrentScenario(), + getCriterionsOn(tasks)); } else { return findAllocationsGroupedByCriteria(); } @@ -274,9 +284,10 @@ public class ResourceLoadModel implements IResourceLoadModel { } private Map> findAllocationsGroupedByCriteria( + Scenario onScenario, List relatedWith) { Map> result = resourceAllocationDAO - .findGenericAllocationsBySomeCriterion(relatedWith, + .findGenericAllocationsBySomeCriterion(onScenario, relatedWith, asDate(initDateFilter), asDate(endDateFilter)); return doReplacementsIfNeeded(result, and(onInterval(), new RelatedWithAnyOf(relatedWith))); @@ -285,6 +296,7 @@ public class ResourceLoadModel implements IResourceLoadModel { private Map> findAllocationsGroupedByCriteria() { return doReplacementsIfNeeded( resourceAllocationDAO.findGenericAllocationsByCriterion( + getCurrentScenario(), asDate(initDateFilter), asDate(endDateFilter)), onInterval()); } @@ -316,7 +328,8 @@ public class ResourceLoadModel implements IResourceLoadModel { List> both = new ArrayList>(); both.addAll(each.getValue()); both.addAll(doReplacementsIfNeeded(resourceAllocationDAO - .findSpecificAllocationsRelatedTo(each.getKey(), + .findSpecificAllocationsRelatedTo(getCurrentScenario(), + each.getKey(), asDate(initDateFilter), asDate(endDateFilter)), and(onInterval(), specificRelatedTo(each.getKey())))); result.put(each.getKey(), both); @@ -680,6 +693,7 @@ public class ResourceLoadModel implements IResourceLoadModel { map.put(resource, ResourceAllocation .sortedByStartDate(doReplacementsIfNeeded( resourceAllocationDAO.findAllocationsRelatedTo( + getCurrentScenario(), resource, initDateFilter, endDateFilter), and(onInterval(), relatedToResource(resource))))); } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/machine/MachineModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/machine/MachineModel.java index 78646bfd7..6d964011d 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/machine/MachineModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/machine/MachineModel.java @@ -56,6 +56,7 @@ import org.navalplanner.business.resources.entities.MachineWorkersConfigurationU 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.scenarios.IScenarioManager; import org.navalplanner.business.workreports.daos.IWorkReportLineDAO; import org.navalplanner.web.common.IntegrationEntityModel; import org.navalplanner.web.common.concurrentdetection.OnConcurrentModification; @@ -112,6 +113,9 @@ public class MachineModel extends IntegrationEntityModel implements @Autowired private IResourceAllocationDAO resourceAllocationDAO; + @Autowired + private IScenarioManager scenarioManager; + private ClassValidator validator = new ClassValidator( Machine.class); @@ -371,9 +375,10 @@ public class MachineModel extends IntegrationEntityModel implements public boolean canRemove(Machine machine) { List resourcesList = new ArrayList(); resourcesList.add(machine); - return dayAssignmentDAO.findByResources(resourcesList).isEmpty() && - workReportLineDAO.findByResources(resourcesList).isEmpty() && - resourceAllocationDAO.findAllocationsRelatedToAnyOf(resourcesList).isEmpty(); + return dayAssignmentDAO.findByResources(resourcesList).isEmpty() + && workReportLineDAO.findByResources(resourcesList).isEmpty() + && resourceAllocationDAO.findAllocationsRelatedToAnyOf( + scenarioManager.getCurrent(), resourcesList).isEmpty(); } @Override diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkerModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkerModel.java index 4d086baa2..3630aab01 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkerModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkerModel.java @@ -58,6 +58,7 @@ import org.navalplanner.business.resources.entities.PredefinedCriterionTypes; import org.navalplanner.business.resources.entities.Resource; import org.navalplanner.business.resources.entities.VirtualWorker; import org.navalplanner.business.resources.entities.Worker; +import org.navalplanner.business.scenarios.IScenarioManager; import org.navalplanner.business.workreports.daos.IWorkReportLineDAO; import org.navalplanner.web.calendars.IBaseCalendarModel; import org.navalplanner.web.common.IntegrationEntityModel; @@ -123,6 +124,9 @@ public class WorkerModel extends IntegrationEntityModel implements IWorkerModel @Autowired private IResourceAllocationDAO resourceAllocationDAO; + @Autowired + private IScenarioManager scenarioManager; + @Autowired public WorkerModel(IResourceDAO resourceDAO, ICriterionDAO criterionDAO) { Validate.notNull(resourceDAO); @@ -597,9 +601,10 @@ public class WorkerModel extends IntegrationEntityModel implements IWorkerModel public boolean canRemove(Worker worker) { List resourcesList = new ArrayList(); resourcesList.add(worker); - return dayAssignmentDAO.findByResources(resourcesList).isEmpty() && - workReportLineDAO.findByResources(resourcesList).isEmpty() && - resourceAllocationDAO.findAllocationsRelatedToAnyOf(resourcesList).isEmpty(); + return dayAssignmentDAO.findByResources(resourcesList).isEmpty() + && workReportLineDAO.findByResources(resourcesList).isEmpty() + && resourceAllocationDAO.findAllocationsRelatedToAnyOf( + scenarioManager.getCurrent(), resourcesList).isEmpty(); } @Override