From 794e6b5f1fcea3792a61fcddc5059e70c3d67234 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Tue, 17 Aug 2010 13:17:44 +0200 Subject: [PATCH] ItEr60S19TimeUnitDataType: Introduce TaskDate in TaskElement. Change some query methods so they keep working. --- .../planner/daos/IResourceAllocationDAO.java | 5 +- .../planner/daos/ResourceAllocationDAO.java | 21 ++++++--- .../business/planner/daos/TaskElementDAO.java | 7 ++- .../planner/entities/TaskElement.java | 47 ++++++++++++------- .../business/planner/entities/Tasks.hbm.xml | 15 +++++- .../daos/ResourceAllocationDAOTest.java | 13 +++-- .../planner/entities/TaskElementTest.java | 13 +++-- .../web/resourceload/ResourceLoadModel.java | 18 ++++++- 8 files changed, 99 insertions(+), 40 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 3224df445..bd37ce74d 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 @@ -46,12 +46,13 @@ public interface IResourceAllocationDAO extends List resources); List> findAllocationsRelatedToAnyOf( - List resources, Date intervalFilterStartDate, Date intervalFilterEndDate); + List resources, LocalDate intervalFilterStartDate, + LocalDate intervalFilterEndDate); List> findAllocationsRelatedTo(Resource resource); List> findAllocationsRelatedTo(Resource resource, - Date intervalFilterStartDate, Date intervalFilterEndDate); + LocalDate intervalFilterStartDate, LocalDate intervalFilterEndDate); Map> findGenericAllocationsByCriterion(); 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 acf9a25c0..c0405b07b 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 @@ -66,7 +66,8 @@ public class ResourceAllocationDAO extends @Override public List> findAllocationsRelatedToAnyOf( - List resources, Date intervalFilterStartDate, Date intervalFilterEndDate) { + List resources, LocalDate intervalFilterStartDate, + LocalDate intervalFilterEndDate) { List> result = new ArrayList>(); result.addAll(findSpecificAllocationsRelatedTo(resources, intervalFilterStartDate, intervalFilterEndDate)); result.addAll(findGenericAllocationsFor(resources, intervalFilterStartDate, intervalFilterEndDate)); @@ -74,7 +75,9 @@ public class ResourceAllocationDAO extends } @SuppressWarnings("unchecked") - private List findGenericAllocationsFor(List resources, Date intervalFilterStartDate, Date intervalFilterEndDate) { + private List findGenericAllocationsFor( + List resources, LocalDate intervalFilterStartDate, + LocalDate intervalFilterEndDate) { if(resources.isEmpty()) { return new ArrayList(); } @@ -92,7 +95,8 @@ public class ResourceAllocationDAO extends @SuppressWarnings("unchecked") private List findSpecificAllocationsRelatedTo( - List resources, Date intervalFilterStartDate, Date intervalFilterEndDate) { + List resources, LocalDate intervalFilterStartDate, + LocalDate intervalFilterEndDate) { if(resources.isEmpty()) { return new ArrayList(); } @@ -106,14 +110,16 @@ public class ResourceAllocationDAO extends } private void filterByDatesIfApplyable(Criteria criteria, - Date intervalFilterStartDate, Date intervalFilterEndDate) { + LocalDate intervalFilterStartDate, LocalDate intervalFilterEndDate) { if(intervalFilterStartDate != null || intervalFilterEndDate != null) { Criteria dateCriteria = criteria.createCriteria("task"); if(intervalFilterEndDate != null) { - dateCriteria.add(Restrictions.le("startDate", intervalFilterEndDate)); + dateCriteria.add(Restrictions.le("startDate.date", + intervalFilterEndDate)); } if(intervalFilterStartDate != null) { - dateCriteria.add(Restrictions.ge("endDate", intervalFilterStartDate)); + dateCriteria.add(Restrictions.ge("endDate.date", + intervalFilterStartDate)); } } } @@ -127,7 +133,8 @@ public class ResourceAllocationDAO extends @Override public List> findAllocationsRelatedTo( - Resource resource, Date intervalFilterStartDate, Date intervalFilterEndDate) { + Resource resource, LocalDate intervalFilterStartDate, + LocalDate intervalFilterEndDate) { return stripAllocationsWithoutAssignations(findAllocationsRelatedToAnyOf(Arrays .asList(resource), intervalFilterStartDate, intervalFilterEndDate)); } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/TaskElementDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/TaskElementDAO.java index f00d99736..09c0eca4e 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/TaskElementDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/TaskElementDAO.java @@ -25,6 +25,7 @@ import java.util.List; import org.hibernate.Criteria; import org.hibernate.criterion.Restrictions; +import org.joda.time.LocalDate; import org.navalplanner.business.common.daos.GenericDAOHibernate; import org.navalplanner.business.planner.entities.GenericDayAssignment; import org.navalplanner.business.planner.entities.SpecificDayAssignment; @@ -66,10 +67,12 @@ public class TaskElementDAO extends GenericDAOHibernate public List listFilteredByDate(Date start, Date end) { Criteria criteria = getSession().createCriteria(TaskElement.class); if(start != null) { - criteria.add(Restrictions.ge("endDate", start)); + criteria.add(Restrictions.ge("endDate.date", + LocalDate.fromDateFields(start))); } if(end != null) { - criteria.add(Restrictions.le("startDate", end)); + criteria.add(Restrictions.le("startDate.date", + LocalDate.fromDateFields(end))); } return criteria.list(); } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskElement.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskElement.java index 2494ac495..7ab3f9598 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskElement.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskElement.java @@ -34,6 +34,7 @@ import java.util.TreeMap; import org.apache.commons.lang.Validate; import org.hibernate.validator.NotNull; +import org.joda.time.DateTime; import org.joda.time.LocalDate; import org.navalplanner.business.calendars.entities.BaseCalendar; import org.navalplanner.business.common.BaseEntity; @@ -43,7 +44,9 @@ import org.navalplanner.business.planner.entities.Dependency.Type; import org.navalplanner.business.scenarios.entities.Scenario; import org.navalplanner.business.util.deepcopy.OnCopy; import org.navalplanner.business.util.deepcopy.Strategy; +import org.navalplanner.business.workingday.EffortDuration; import org.navalplanner.business.workingday.ResourcesPerDay; +import org.navalplanner.business.workingday.TaskDate; /** * @author Óscar González Fernández @@ -112,9 +115,9 @@ public abstract class TaskElement extends BaseEntity { @OnCopy(Strategy.SHARE) private IDatesInterceptor datesInterceptor = EMPTY_INTERCEPTOR; - private Date startDate; + private TaskDate startDate; - private Date endDate; + private TaskDate endDate; private LocalDate deadline; @@ -163,7 +166,7 @@ public abstract class TaskElement extends BaseEntity { protected void copyPropertiesFrom(TaskElement task) { this.name = task.getName(); this.notes = task.getNotes(); - this.startDate = task.getStartDate(); + this.startDate = task.startDate; this.taskSource = task.getTaskSource(); } @@ -226,16 +229,26 @@ public abstract class TaskElement extends BaseEntity { @NotNull public Date getStartDate() { - return startDate != null ? new Date(startDate.getTime()) : null; + return startDate != null ? startDate.getDate().toDateTimeAtStartOfDay() + .toDate() : null; + } + + public LocalDate getStartAsLocalDate() { + return startDate == null ? null : startDate.getDate(); + } + + public LocalDate getEndAsLocalDate() { + return endDate == null ? null : endDate.getDate(); } public void setStartDate(Date startDate) { - Date previousDate = this.startDate; + Date previousDate = getStartDate(); long previousLenghtMilliseconds = getLengthMilliseconds(); - this.startDate = startDate != null ? new Date(startDate.getTime()) + this.startDate = startDate != null ? TaskDate.create( + LocalDate.fromDateFields(startDate), EffortDuration.zero()) : null; datesInterceptor.setStartDate(previousDate, previousLenghtMilliseconds, - this.startDate); + getStartDate()); } /** @@ -246,29 +259,31 @@ public abstract class TaskElement extends BaseEntity { if (newStartDate == null) { return; } - final boolean sameDay = areSameDay(newStartDate, startDate); + final boolean sameDay = this.startDate.areSameDay(newStartDate); long durationMilliseconds = getLengthMilliseconds(); setStartDate(newStartDate); - this.endDate = new Date(this.startDate.getTime() + durationMilliseconds); + DateTime newEnd = this.startDate.toDateTimeAtStartOfDay().plus( + durationMilliseconds); + this.endDate = TaskDate.create(newEnd.toLocalDate(), + EffortDuration.zero()); if (!sameDay) { moveAllocations(scenario); } } - private boolean areSameDay(Date one, Date other) { - return new LocalDate(one).equals(new LocalDate(other)); - } - protected abstract void moveAllocations(Scenario scenario); @NotNull public Date getEndDate() { - return endDate != null ? new Date(endDate.getTime()) : endDate; + return endDate != null ? endDate.toDateTimeAtStartOfDay().toDate() + : null; } public void setEndDate(Date endDate) { long previousLength = getLengthMilliseconds(); - this.endDate = endDate != null ? new Date(endDate.getTime()) : null; + this.endDate = endDate != null ? TaskDate.create( + LocalDate.fromDateFields(endDate), EffortDuration.zero()) + : null; datesInterceptor.setLengthMilliseconds(previousLength, getLengthMilliseconds()); } @@ -277,7 +292,7 @@ public abstract class TaskElement extends BaseEntity { if (!canBeResized()) { return; } - boolean sameDay = areSameDay(this.endDate, endDate); + boolean sameDay = this.endDate.areSameDay(endDate); setEndDate(endDate); if (!sameDay) { moveAllocations(scenario); diff --git a/navalplanner-business/src/main/resources/org/navalplanner/business/planner/entities/Tasks.hbm.xml b/navalplanner-business/src/main/resources/org/navalplanner/business/planner/entities/Tasks.hbm.xml index 836b32bea..a37fb005c 100644 --- a/navalplanner-business/src/main/resources/org/navalplanner/business/planner/entities/Tasks.hbm.xml +++ b/navalplanner-business/src/main/resources/org/navalplanner/business/planner/entities/Tasks.hbm.xml @@ -11,8 +11,19 @@ - - + + + + + + + + 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 55c968102..f1c3d65b2 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 @@ -32,6 +32,7 @@ import java.util.Date; import java.util.List; import java.util.UUID; +import org.joda.time.LocalDate; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -265,19 +266,21 @@ public class ResourceAllocationDAOTest { ResourceAllocation resourceAllocation1 = createValidSpecificResourceAllocation(); resourceAllocationDAO.save(resourceAllocation1); - Date intervalInitDate = resourceAllocation1.getTask().getStartDate(); - Date intervalEndDate = resourceAllocation1.getTask().getEndDate(); + LocalDate intervalInitDate = resourceAllocation1.getTask() + .getStartAsLocalDate(); + LocalDate intervalEndDate = resourceAllocation1.getTask() + .getEndAsLocalDate(); List resources = resourceAllocation1.getAssociatedResources(); assertTrue(resourceAllocationDAO.findAllocationsRelatedToAnyOf(resources, intervalInitDate, intervalEndDate).contains(resourceAllocation1)); - intervalEndDate.setDate(intervalInitDate.getDate()); - intervalInitDate.setMonth(intervalInitDate.getMonth()-1); + intervalEndDate = intervalInitDate; + intervalInitDate = intervalInitDate.minusMonths(1); assertTrue(resourceAllocationDAO.findAllocationsRelatedToAnyOf(resources, intervalInitDate, intervalEndDate).contains(resourceAllocation1)); - intervalEndDate.setMonth(intervalEndDate.getMonth()-1); + intervalEndDate = intervalEndDate.minusMonths(1); assertFalse(resourceAllocationDAO.findAllocationsRelatedToAnyOf(resources, intervalInitDate, intervalEndDate).contains(resourceAllocation1)); diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/TaskElementTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/TaskElementTest.java index d7ce1b7ec..e4b6d7fc0 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/TaskElementTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/TaskElementTest.java @@ -53,13 +53,13 @@ import org.navalplanner.business.orders.entities.OrderLineGroup; import org.navalplanner.business.orders.entities.SchedulingDataForVersion; import org.navalplanner.business.orders.entities.TaskSource; import org.navalplanner.business.planner.entities.Dependency; +import org.navalplanner.business.planner.entities.Dependency.Type; import org.navalplanner.business.planner.entities.StartConstraintType; import org.navalplanner.business.planner.entities.Task; import org.navalplanner.business.planner.entities.TaskElement; import org.navalplanner.business.planner.entities.TaskGroup; import org.navalplanner.business.planner.entities.TaskMilestone; import org.navalplanner.business.planner.entities.TaskStartConstraint; -import org.navalplanner.business.planner.entities.Dependency.Type; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.transaction.annotation.Transactional; @@ -107,12 +107,17 @@ public class TaskElementTest { } @Test - public void taskElementHasStartDateProperty() { + public void taskElementHasStartDatePropertyAndItIsRoundedToTheStartOfTheDay() { Date now = new Date(); task.setStartDate(now); - assertThat(task.getStartDate(), equalTo(now)); + assertThat(task.getStartDate(), equalTo(toStartOfDay(now))); task.setEndDate(now); - assertThat(task.getEndDate(), equalTo(now)); + assertThat(task.getEndDate(), equalTo(toStartOfDay(now))); + } + + private static Date toStartOfDay(Date date) { + return LocalDate.fromDateFields(date) + .toDateTimeAtStartOfDay().toDate(); } @Test 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 4ddd4bbc1..4b623094b 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 @@ -32,8 +32,8 @@ import java.util.LinkedList; import java.util.List; import java.util.ListIterator; import java.util.Map; -import java.util.Set; import java.util.Map.Entry; +import java.util.Set; import org.joda.time.LocalDate; import org.navalplanner.business.calendars.daos.IBaseCalendarDAO; @@ -574,7 +574,9 @@ public class ResourceLoadModel implements IResourceLoadModel { private LoadTimeLine buildGroup(Resource resource) { List> sortedByStartDate = ResourceAllocation .sortedByStartDate(resourceAllocationDAO - .findAllocationsRelatedTo(resource, initDateFilter, endDateFilter)); + .findAllocationsRelatedTo(resource, + asLocalDate(initDateFilter), + asLocalDate(endDateFilter))); TimeLineRole role = getCurrentTimeLineRole(resource); LoadTimeLine result = new LoadTimeLine(buildTimeLine(resource, resource .getName(), sortedByStartDate, "resource", role), @@ -583,6 +585,18 @@ public class ResourceLoadModel implements IResourceLoadModel { } + /** + * @param date + * the date to extract the {@link LocalDate} from + * @return null if date is null + */ + private static LocalDate asLocalDate(Date date) { + if (date == null) { + return null; + } + return LocalDate.fromDateFields(date); + } + private List buildSecondLevel(Resource resource, List> sortedByStartDate) { List result = new ArrayList();