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