From a5f1cf4f650cba7111a0b838193e85a8da07d1e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Wed, 5 Jan 2011 13:11:46 +0100 Subject: [PATCH] [Bug #786] Fix bug The error was happening due to using Dates instead of LocalDates. The start of the satisfaction was in the middle of a day and the received Date was at the start, so the first day was considered outside of the criterion satisfaction's interval. Criterion satisfactions now use LocalDates instead of Dates and this problem is fixed. FEA: ItEr67S04BugFixing --- .../entities/AvailabilityCalculator.java | 9 +-- .../entities/GenericResourceAllocation.java | 2 +- .../resources/entities/Criterion.java | 6 +- .../entities/CriterionCompounder.java | 15 ++--- .../entities/CriterionSatisfaction.java | 63 +++++++++---------- .../resources/entities/ICriterion.java | 7 ++- .../business/resources/entities/Interval.java | 49 ++++++++------- .../entities/MachineWorkerAssignment.java | 16 +++++ .../MachineWorkersConfigurationUnit.java | 10 ++- .../business/resources/entities/Resource.java | 19 +++--- .../main/resources/db.changelog-initial.xml | 6 ++ .../resources/entities/Resources.hbm.xml | 6 +- ...dAdvanceAssignmentsToOrderElementTest.java | 3 +- .../GenericResourceAllocationTest.java | 8 +-- .../daos/CriterionSatisfactionDAOTest.java | 20 ++---- .../test/resources/daos/ResourceDAOTest.java | 22 +++---- .../entities/CriterionSatisfactionTest.java | 9 +-- .../resources/entities/CriterionTest.java | 6 +- .../test/resources/entities/IntervalTest.java | 7 +-- .../test/resources/entities/ResourceTest.java | 8 +-- .../AssignedMachineCriterionsModel.java | 11 ++-- .../worker/AssignedCriterionsModel.java | 4 +- .../worker/CriterionSatisfactionDTO.java | 55 ++++++++++++---- .../web/resources/worker/WorkerModel.java | 5 +- .../ws/resources/impl/ResourceConverter.java | 8 +-- 25 files changed, 197 insertions(+), 177 deletions(-) diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/AvailabilityCalculator.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/AvailabilityCalculator.java index e17e51e35..ee7c5e68b 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/AvailabilityCalculator.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/AvailabilityCalculator.java @@ -20,7 +20,6 @@ package org.navalplanner.business.planner.entities; import java.util.Collection; -import java.util.Date; import java.util.List; import org.joda.time.LocalDate; @@ -81,14 +80,14 @@ public class AvailabilityCalculator { AvailabilityTimeLine result = AvailabilityTimeLine.allValid(); LocalDate previousEnd = null; for (CriterionSatisfaction each : satisfactions) { - LocalDate startDate = asLocal(each.getStartDate()); + LocalDate startDate = each.getStartDate(); assert startDate != null : "satisfactions start date is not null"; if (previousEnd == null) { result.invalidUntil(startDate); } else { result.invalidAt(previousEnd, startDate); } - previousEnd = asLocal(each.getEndDate()); + previousEnd = each.getEndDate(); if (previousEnd == null) { break; } @@ -99,8 +98,4 @@ public class AvailabilityCalculator { return result; } - private static LocalDate asLocal(Date date) { - return date != null ? LocalDate.fromDateFields(date) : null; - } - } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/GenericResourceAllocation.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/GenericResourceAllocation.java index 65626ea0e..7afc2758b 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/GenericResourceAllocation.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/GenericResourceAllocation.java @@ -221,7 +221,7 @@ public class GenericResourceAllocation extends public boolean isSelectable(Resource resource, LocalDate day) { ICriterion compoundCriterion = CriterionCompounder.buildAnd( criterions).getResult(); - return compoundCriterion.isSatisfiedBy(resource, toDate(day)); + return compoundCriterion.isSatisfiedBy(resource, day); } } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Criterion.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Criterion.java index 9aa60d6eb..d652e20a9 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Criterion.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Criterion.java @@ -26,7 +26,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; -import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -38,6 +37,7 @@ import org.hibernate.validator.AssertTrue; import org.hibernate.validator.NotEmpty; import org.hibernate.validator.NotNull; import org.hibernate.validator.Valid; +import org.joda.time.LocalDate; import org.navalplanner.business.common.IntegrationEntity; import org.navalplanner.business.common.Registry; import org.navalplanner.business.planner.entities.GenericResourceAllocation; @@ -240,13 +240,13 @@ public class Criterion extends IntegrationEntity implements ICriterion { } @Override - public boolean isSatisfiedBy(Resource resource, Date start, Date end) { + public boolean isSatisfiedBy(Resource resource, LocalDate start, LocalDate end) { return !resource.query().from(this).enforcedInAll( Interval.range(start, end)).result().isEmpty(); } @Override - public boolean isSatisfiedBy(Resource resource, Date atThisDate) { + public boolean isSatisfiedBy(Resource resource, LocalDate atThisDate) { return !resource.query().from(this).enforcedInAll( Interval.point(atThisDate)).result().isEmpty(); } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/CriterionCompounder.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/CriterionCompounder.java index 939c3beda..b4f64041c 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/CriterionCompounder.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/CriterionCompounder.java @@ -22,10 +22,11 @@ package org.navalplanner.business.resources.entities; import java.util.ArrayList; import java.util.Collection; -import java.util.Date; import java.util.LinkedList; import java.util.List; +import org.joda.time.LocalDate; + /** * Compounds some {@link ICriterion} into one
* @author Óscar González Fernández @@ -70,12 +71,12 @@ public class CriterionCompounder { } @Override - public boolean isSatisfiedBy(Resource resource, Date start, Date end) { + public boolean isSatisfiedBy(Resource resource, LocalDate start, LocalDate end) { return !criterion.isSatisfiedBy(resource, start, end); } @Override - public boolean isSatisfiedBy(Resource resource, Date atThisDate) { + public boolean isSatisfiedBy(Resource resource, LocalDate atThisDate) { return !criterion.isSatisfiedBy(resource, atThisDate); } } @@ -98,7 +99,7 @@ public class CriterionCompounder { return false; } - public boolean isSatisfiedBy(Resource resource, Date start, Date end) { + public boolean isSatisfiedBy(Resource resource, LocalDate start, LocalDate end) { for (ICriterion criterion : criterions) { if (criterion.isSatisfiedBy(resource, start, end)) { return true; @@ -108,7 +109,7 @@ public class CriterionCompounder { } @Override - public boolean isSatisfiedBy(Resource resource, Date atThisDate) { + public boolean isSatisfiedBy(Resource resource, LocalDate atThisDate) { for (ICriterion criterion : criterions) { if (criterion.isSatisfiedBy(resource, atThisDate)) { return true; @@ -152,7 +153,7 @@ public class CriterionCompounder { } @Override - public boolean isSatisfiedBy(Resource resource, Date start, Date end) { + public boolean isSatisfiedBy(Resource resource, LocalDate start, LocalDate end) { for (ICriterion criterion : criterions) { if (!criterion.isSatisfiedBy(resource, start, end)) { return false; @@ -162,7 +163,7 @@ public class CriterionCompounder { } @Override - public boolean isSatisfiedBy(Resource resource, Date atThisDate) { + public boolean isSatisfiedBy(Resource resource, LocalDate atThisDate) { for (ICriterion criterion : criterions) { if (!criterion.isSatisfiedBy(resource, atThisDate)) { return false; diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/CriterionSatisfaction.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/CriterionSatisfaction.java index 4c28351f5..1f6ee5276 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/CriterionSatisfaction.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/CriterionSatisfaction.java @@ -21,13 +21,13 @@ package org.navalplanner.business.resources.entities; import java.util.Comparator; -import java.util.Date; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; import org.apache.commons.lang.builder.ToStringBuilder; import org.hibernate.validator.AssertTrue; import org.hibernate.validator.NotNull; +import org.joda.time.LocalDate; import org.navalplanner.business.common.IntegrationEntity; import org.navalplanner.business.common.Registry; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; @@ -57,12 +57,10 @@ public class CriterionSatisfaction extends IntegrationEntity { return create(new CriterionSatisfaction()); } - public static CriterionSatisfaction create(Date startDate, + public static CriterionSatisfaction create(LocalDate startDate, Criterion criterion, Resource resource) { - return create( new CriterionSatisfaction(startDate, criterion, resource)); - } public static CriterionSatisfaction create(Criterion criterion, @@ -76,10 +74,10 @@ public class CriterionSatisfaction extends IntegrationEntity { * @throws InstanceNotFoundException if criterion type or criterion does * not exist */ - public static CriterionSatisfaction createUnvalidated( - String code, String criterionTypeName, String criterionName, - Resource resource, Date startDate, Date finishDate) - throws InstanceNotFoundException { + public static CriterionSatisfaction createUnvalidated(String code, + String criterionTypeName, String criterionName, Resource resource, + LocalDate startDate, LocalDate finishDate) + throws InstanceNotFoundException { ICriterionTypeDAO criterionTypeDAO = Registry.getCriterionTypeDAO(); @@ -110,7 +108,7 @@ public class CriterionSatisfaction extends IntegrationEntity { * not exist */ public void updateUnvalidated(String criterionTypeName, - String criterionName, Date startDate, Date finishDate) + String criterionName, LocalDate startDate, LocalDate finishDate) throws InstanceNotFoundException { CriterionType criterionType = null; @@ -149,7 +147,7 @@ public class CriterionSatisfaction extends IntegrationEntity { } - private CriterionSatisfaction(Date startDate, Criterion criterion, + private CriterionSatisfaction(LocalDate startDate, Criterion criterion, Resource resource) { Validate.notNull(startDate, "startDate must be not null"); Validate.notNull(criterion, "criterion must be not null"); @@ -167,9 +165,9 @@ public class CriterionSatisfaction extends IntegrationEntity { } } - private Date startDate; + private LocalDate startDate; - private Date finishDate; + private LocalDate finishDate; private Criterion criterion; @@ -192,16 +190,12 @@ public class CriterionSatisfaction extends IntegrationEntity { } @NotNull(message="criterion satisfaction's start date not specified") - public Date getStartDate() { - return startDate != null ? new Date(startDate.getTime()) : null; + public LocalDate getStartDate() { + return startDate; } - public Date getEndDate() { - if (isFinished()) { - return new Date(finishDate.getTime()); - } else { - return null; - } + public LocalDate getEndDate() { + return finishDate; } public Interval getInterval() { @@ -227,11 +221,11 @@ public class CriterionSatisfaction extends IntegrationEntity { } public boolean isCurrent() { - Date now = new Date(); - return isEnforcedAt(now); + LocalDate today = new LocalDate(); + return isEnforcedAt(today); } - public boolean isEnforcedAt(Date date) { + public boolean isEnforcedAt(LocalDate date) { return getInterval().contains(date); } @@ -239,30 +233,31 @@ public class CriterionSatisfaction extends IntegrationEntity { return getInterval().includes(interval); } - public void finish(Date finish) { + public void finish(LocalDate finish) { Validate.notNull(finish); Validate.isTrue(getStartDate() == null - || getStartDate().equals(finish) || getStartDate().before(finish)); - Validate.isTrue(finishDate == null || isNewObject() || - getEndDate().equals(finish) || getEndDate().before(finish)); - this.finishDate = new Date(finish.getTime()); + || getStartDate().compareTo(finish) <= 0); + Validate.isTrue(finishDate == null || isNewObject() + || getEndDate().equals(finish) || getEndDate().isBefore(finish)); + this.finishDate = finish; } public boolean isFinished() { return finishDate != null; } - public void setEndDate(Date date) { - if(date != null) { + public void setEndDate(LocalDate date) { + if (date != null) { finish(date); } this.finishDate = date; } - public void setStartDate(Date date) { + public void setStartDate(LocalDate date) { if(date != null){ - Validate.isTrue(startDate == null || isNewObject() || - getStartDate().equals(date) || getStartDate().after(date)); + Validate.isTrue(startDate == null || isNewObject() + || getStartDate().equals(date) + || getStartDate().isAfter(date)); } startDate = date; } @@ -307,7 +302,7 @@ public class CriterionSatisfaction extends IntegrationEntity { return true; } - return (finishDate.after(startDate) || startDate.equals(finishDate)); + return (finishDate.isAfter(startDate) || startDate.equals(finishDate)); } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/ICriterion.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/ICriterion.java index f30347ea7..776dc9f19 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/ICriterion.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/ICriterion.java @@ -20,7 +20,8 @@ package org.navalplanner.business.resources.entities; -import java.util.Date; + +import org.joda.time.LocalDate; /** * It's a predicate that can be applied on resources
@@ -30,8 +31,8 @@ public interface ICriterion { boolean isSatisfiedBy(Resource resource); - boolean isSatisfiedBy(Resource resource, Date start, Date end); + boolean isSatisfiedBy(Resource resource, LocalDate start, LocalDate end); - boolean isSatisfiedBy(Resource resource, Date atThisDate); + boolean isSatisfiedBy(Resource resource, LocalDate atThisDate); } \ No newline at end of file diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Interval.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Interval.java index 89e9f5d20..66fa8b728 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Interval.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Interval.java @@ -20,28 +20,29 @@ package org.navalplanner.business.resources.entities; -import java.util.Date; import org.apache.commons.lang.Validate; import org.apache.commons.lang.builder.HashCodeBuilder; +import org.joda.time.LocalDate; /** * Represents a time interval
* @author Óscar González Fernández */ public abstract class Interval { - protected final Date start; - protected final Date end; + protected final LocalDate start; - public static Interval from(Date start) { + protected final LocalDate end; + + public static Interval from(LocalDate start) { return new OpenEndedInterval(start); } - public static Interval point(Date date) { + public static Interval point(LocalDate date) { return new Point(date); } - public static Interval range(Date start, Date end) { + public static Interval range(LocalDate start, LocalDate end) { Validate.notNull(start, "start date must be not null"); if (end == null) { return from(start); @@ -52,7 +53,7 @@ public abstract class Interval { return new Range(start, end); } - protected Interval(Date start, Date end) { + protected Interval(LocalDate start, LocalDate end) { Validate.notNull(start, "start date must be not null"); if (end != null) { Validate.isTrue(start.compareTo(end) <= 0, @@ -62,7 +63,7 @@ public abstract class Interval { this.end = end; } - public abstract boolean contains(Date date); + public abstract boolean contains(LocalDate date); @Override public boolean equals(Object obj) { @@ -79,7 +80,7 @@ public abstract class Interval { return new HashCodeBuilder().append(start).append(end).toHashCode(); } - private boolean dateEquals(Date date1, Date date2) { + private boolean dateEquals(LocalDate date1, LocalDate date2) { return date1 == date2 || (date1 != null && date2 != null && date1.equals(date2)); } @@ -88,30 +89,30 @@ public abstract class Interval { public abstract boolean overlapsWith(Interval interval); - public boolean before(Date date) { - return start.before(date); + public boolean before(LocalDate date) { + return start.isBefore(date); } - public Date getStart() { - return new Date(start.getTime()); + public LocalDate getStart() { + return start; } - public Date getEnd() { - return end != null ? new Date(end.getTime()) : null; + public LocalDate getEnd() { + return end; } } class Range extends Interval { - Range(Date start, Date end) { + Range(LocalDate start, LocalDate end) { super(start, end); Validate.notNull(start); Validate.notNull(end); } @Override - public boolean contains(Date date) { + public boolean contains(LocalDate date) { return date.compareTo(start) >= 0 && date.compareTo(end) < 0; } @@ -122,7 +123,7 @@ class Range extends Interval { return point.overlapsWith(this); } return start.compareTo(included.start) <= 0 && included.end != null - && end.after(included.end); + && end.isAfter(included.end); } @Override @@ -147,12 +148,12 @@ class Range extends Interval { } class OpenEndedInterval extends Interval { - OpenEndedInterval(Date start) { + OpenEndedInterval(LocalDate start) { super(start, null); } @Override - public boolean contains(Date date) { + public boolean contains(LocalDate date) { return date.compareTo(start) >= 0; } @@ -163,8 +164,8 @@ class OpenEndedInterval extends Interval { @Override public boolean overlapsWith(Interval interval) { - return start.before(interval.start) || interval.end == null - || start.before(interval.end); + return start.isBefore(interval.start) || interval.end == null + || start.isBefore(interval.end); } @Override @@ -175,12 +176,12 @@ class OpenEndedInterval extends Interval { class Point extends Interval { - Point(Date date) { + Point(LocalDate date) { super(date, date); } @Override - public boolean contains(Date date) { + public boolean contains(LocalDate date) { return start.equals(date); } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/MachineWorkerAssignment.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/MachineWorkerAssignment.java index 350e9f1e1..be50c6ef9 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/MachineWorkerAssignment.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/MachineWorkerAssignment.java @@ -22,6 +22,7 @@ package org.navalplanner.business.resources.entities; import java.util.Date; +import org.joda.time.LocalDate; import org.navalplanner.business.common.BaseEntity; import org.navalplanner.business.util.deepcopy.OnCopy; import org.navalplanner.business.util.deepcopy.Strategy; @@ -85,4 +86,19 @@ public class MachineWorkerAssignment extends BaseEntity { return worker; } + public LocalDate getStart() { + return asLocalDate(startDate); + } + + public LocalDate getFinish() { + return asLocalDate(finishDate); + } + + private LocalDate asLocalDate(Date date) { + if (date == null) { + return null; + } + return LocalDate.fromDateFields(date); + } + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/MachineWorkersConfigurationUnit.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/MachineWorkersConfigurationUnit.java index 47105e65b..8db94c2d6 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/MachineWorkersConfigurationUnit.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/MachineWorkersConfigurationUnit.java @@ -152,10 +152,9 @@ public class MachineWorkersConfigurationUnit extends BaseEntity { if ((each.getWorker().getId().equals(worker.getId())) && (each.getId() != assignment.getId())) { if (each.getFinishDate() != null) { - range = Interval.range(each.getStartDate(), each - .getFinishDate()); + range = Interval.range(each.getStart(), each.getFinish()); } else { - range = Interval.from(each.getStartDate()); + range = Interval.from(each.getStart()); } if ((range == null) || (interval.overlapsWith(range))) { assigned = true; @@ -191,10 +190,9 @@ public class MachineWorkersConfigurationUnit extends BaseEntity { for (MachineWorkerAssignment each : workerAssignments) { if (each.getStartDate() != null) { if (each.getFinishDate() != null) { - range = Interval.range(each.getStartDate(), each - .getFinishDate()); + range = Interval.range(each.getStart(), each.getFinish()); } else { - range = Interval.from(each.getStartDate()); + range = Interval.from(each.getStart()); } if (((range == null) && existsWorkerAssignmentWithSameWorker(each) || (existsWorkerAssignmentWithSameWorker( diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Resource.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Resource.java index a9565b59b..88545684e 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Resource.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Resource.java @@ -27,7 +27,6 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; -import java.util.Date; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; @@ -267,11 +266,11 @@ public abstract class Resource extends IntegrationEntity { return this; } - public Query at(Date date) { + public Query at(LocalDate date) { return enforcedInAll(Interval.point(date)); } - public Query between(Date start, Date end) { + public Query between(LocalDate start, LocalDate end) { return enforcedInAll(Interval.range(start, end)); } @@ -415,7 +414,8 @@ public abstract class Resource extends IntegrationEntity { public CriterionSatisfaction addSatisfaction( CriterionWithItsType criterionWithItsType) { - return addSatisfaction(criterionWithItsType, Interval.from(new Date())); + LocalDate today = new LocalDate(); + return addSatisfaction(criterionWithItsType, Interval.from(today)); } private static class EnsureSatisfactionIsCorrect { @@ -516,11 +516,12 @@ public abstract class Resource extends IntegrationEntity { public List finish( CriterionWithItsType criterionWithItsType) { - return finishEnforcedAt(criterionWithItsType.getCriterion(), new Date()); + LocalDate today = new LocalDate(); + return finishEnforcedAt(criterionWithItsType.getCriterion(), today); } public List finishEnforcedAt(Criterion criterion, - Date date) { + LocalDate date) { ArrayList result = new ArrayList(); for (CriterionSatisfaction criterionSatisfaction : query().from( criterion).at(date).result()) { @@ -898,11 +899,7 @@ public abstract class Resource extends IntegrationEntity { private boolean satisfiesCriterionAt(ICriterion criterionToSatisfy, LocalDate current) { - return criterionToSatisfy.isSatisfiedBy(this, asDate(current)); - } - - private Date asDate(LocalDate date) { - return date.toDateTimeAtStartOfDay().toDateTime().toDate(); + return criterionToSatisfy.isSatisfiedBy(this, current); } public void addUnvalidatedSatisfaction(CriterionSatisfaction diff --git a/navalplanner-business/src/main/resources/db.changelog-initial.xml b/navalplanner-business/src/main/resources/db.changelog-initial.xml index d35562498..77bce0b0d 100644 --- a/navalplanner-business/src/main/resources/db.changelog-initial.xml +++ b/navalplanner-business/src/main/resources/db.changelog-initial.xml @@ -52,4 +52,10 @@ + + Change types of start and finish date to date for criterion satisfaction table + + + + diff --git a/navalplanner-business/src/main/resources/org/navalplanner/business/resources/entities/Resources.hbm.xml b/navalplanner-business/src/main/resources/org/navalplanner/business/resources/entities/Resources.hbm.xml index ed482d6ef..405d0ef23 100644 --- a/navalplanner-business/src/main/resources/org/navalplanner/business/resources/entities/Resources.hbm.xml +++ b/navalplanner-business/src/main/resources/org/navalplanner/business/resources/entities/Resources.hbm.xml @@ -145,8 +145,10 @@ - - + + diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/orders/entities/AddAdvanceAssignmentsToOrderElementTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/orders/entities/AddAdvanceAssignmentsToOrderElementTest.java index 65bc8bed5..ae9b334b7 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/orders/entities/AddAdvanceAssignmentsToOrderElementTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/orders/entities/AddAdvanceAssignmentsToOrderElementTest.java @@ -114,7 +114,8 @@ public class AddAdvanceAssignmentsToOrderElementTest { .setupVersionUsing(scenarioManager, order); order.useSchedulingDataFor(orderVersion); order.setDescription("description"); - order.setInitDate(CriterionSatisfactionDAOTest.year(2000)); + order.setInitDate(CriterionSatisfactionDAOTest.year(2000) + .toDateTimeAtStartOfDay().toDate()); order.setName("name"); order.setResponsible("responsible"); order.setCode("code"); diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/GenericResourceAllocationTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/GenericResourceAllocationTest.java index 0ca6c8f67..ef6531ae1 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/GenericResourceAllocationTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/GenericResourceAllocationTest.java @@ -38,7 +38,6 @@ import static org.navalplanner.business.workingday.EffortDuration.zero; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -143,8 +142,9 @@ public class GenericResourceAllocationTest { } private void setupIsSatisfiedByAll(Criterion criterion) { - expect(criterion.isSatisfiedBy(isA(Resource.class), isA(Date.class))) - .andReturn(true).anyTimes(); + expect( + criterion.isSatisfiedBy(isA(Resource.class), + isA(LocalDate.class))).andReturn(true).anyTimes(); } private void givenWorkersWithoutLoadAndWithoutCalendar() { @@ -199,7 +199,7 @@ public class GenericResourceAllocationTest { private org.navalplanner.business.resources.entities.Interval fromVeryEarlyTime() { return org.navalplanner.business.resources.entities.Interval - .from(new Date(0)); + .from(new LocalDate(0, 1, 1)); } private void givenCalendarsForResources(int capacity1, int capacity2, diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/daos/CriterionSatisfactionDAOTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/daos/CriterionSatisfactionDAOTest.java index 190bbf1e9..08c36b4ae 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/daos/CriterionSatisfactionDAOTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/daos/CriterionSatisfactionDAOTest.java @@ -27,9 +27,7 @@ import static junit.framework.Assert.assertTrue; import static org.navalplanner.business.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_FILE; import static org.navalplanner.business.test.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_TEST_FILE; -import java.util.Calendar; -import java.util.Date; - +import org.joda.time.LocalDate; import org.junit.Test; import org.junit.runner.RunWith; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; @@ -109,20 +107,12 @@ public class CriterionSatisfactionDAOTest { satisfactionDAO.save(criterionSatisfaction); } - public static Date year(int year) { - Calendar calendar = Calendar.getInstance(); - calendar.clear(); - calendar.set(Calendar.YEAR, year); - return calendar.getTime(); + public static LocalDate year(int year) { + return new LocalDate(year, 1, 1); } - public static Date date(int year,int month, int day) { - Calendar calendar = Calendar.getInstance(); - calendar.clear(); - calendar.set(Calendar.YEAR, year); - calendar.set(Calendar.MONTH, month); - calendar.set(Calendar.DAY_OF_MONTH, day); - return calendar.getTime(); + public static LocalDate date(int year, int month, int day) { + return new LocalDate(year, month, day); } @Test diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/daos/ResourceDAOTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/daos/ResourceDAOTest.java index 4dfae8071..7d589a696 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/daos/ResourceDAOTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/daos/ResourceDAOTest.java @@ -29,8 +29,6 @@ import static org.junit.Assert.assertThat; import static org.navalplanner.business.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_FILE; import static org.navalplanner.business.test.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_TEST_FILE; -import java.text.ParseException; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; @@ -39,6 +37,7 @@ import java.util.Set; import java.util.UUID; import org.hibernate.SessionFactory; +import org.joda.time.LocalDate; import org.junit.Test; import org.junit.runner.RunWith; import org.navalplanner.business.calendars.entities.ResourceCalendar; @@ -148,19 +147,14 @@ public class ResourceDAOTest { private Worker createAndSaveResourceSatisfyingAllCriterions(final Collection criterions) { Worker result = givenValidWorker(); - - SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); - try { - Interval interval = Interval.range(sdf.parse("01/01/1970"), null); - Set satisfactions = new HashSet(); - for (Criterion each: criterions) { - satisfactions.add(CriterionSatisfaction.create(each, result, interval)); - } - result.addSatisfactions(satisfactions); - resourceDAO.save(result); - } catch (ParseException e) { - + Interval interval = Interval.range(new LocalDate(1970, 1, 1), null); + Set satisfactions = new HashSet(); + for (Criterion each : criterions) { + satisfactions.add(CriterionSatisfaction.create(each, result, + interval)); } + result.addSatisfactions(satisfactions); + resourceDAO.save(result); return result; } diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/entities/CriterionSatisfactionTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/entities/CriterionSatisfactionTest.java index 5e65363d1..901e2f377 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/entities/CriterionSatisfactionTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/entities/CriterionSatisfactionTest.java @@ -29,9 +29,9 @@ import static org.navalplanner.business.test.resources.daos.CriterionSatisfactio import java.util.ArrayList; import java.util.Collections; -import java.util.Date; import java.util.List; +import org.joda.time.LocalDate; import org.junit.Test; import org.navalplanner.business.resources.entities.Criterion; import org.navalplanner.business.resources.entities.CriterionSatisfaction; @@ -50,20 +50,17 @@ public class CriterionSatisfactionTest { final Criterion criterion = CriterionDAOTest.createValidCriterion(); Worker worker = Worker.create("firstName", "surName", "2333232"); CriterionSatisfaction criterionSatisfaction = CriterionSatisfaction.create(year(2000), criterion, worker); - Date end = year(2006); + LocalDate end = year(2006); criterionSatisfaction.finish(end); assertTrue(criterionSatisfaction.isFinished()); assertEquals(end, criterionSatisfaction.getEndDate()); - criterionSatisfaction.getEndDate().setTime(end.getTime() + 2000); - assertEquals("endDate must be well encapsulated", end, - criterionSatisfaction.getEndDate()); } @Test public void canFinishWhenItStarted() throws Exception { final Criterion criterion = CriterionDAOTest.createValidCriterion(); Worker worker = Worker.create("firstName", "surName", "2333232"); - Date start = year(2000); + LocalDate start = year(2000); CriterionSatisfaction criterionSatisfaction = CriterionSatisfaction.create(start, criterion, worker); criterionSatisfaction.finish(start); assertTrue(criterionSatisfaction.isFinished()); diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/entities/CriterionTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/entities/CriterionTest.java index 665147b60..b564d20b6 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/entities/CriterionTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/entities/CriterionTest.java @@ -27,10 +27,10 @@ import static org.navalplanner.business.resources.entities.CriterionCompounder.b import static org.navalplanner.business.resources.entities.CriterionCompounder.not; import java.util.Arrays; -import java.util.Date; import java.util.HashSet; import java.util.List; +import org.joda.time.LocalDate; import org.junit.Test; import org.navalplanner.business.resources.entities.Criterion; import org.navalplanner.business.resources.entities.CriterionCompounder; @@ -207,12 +207,12 @@ public class CriterionTest { } @Override - public boolean isSatisfiedBy(Resource resource, Date start, Date end) { + public boolean isSatisfiedBy(Resource resource, LocalDate start, LocalDate end) { return isSatisfiedBy(resource); } @Override - public boolean isSatisfiedBy(Resource resource, Date atThisDate) { + public boolean isSatisfiedBy(Resource resource, LocalDate atThisDate) { return isSatisfiedBy(resource); } }; diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/entities/IntervalTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/entities/IntervalTest.java index de5e278f8..56282aac0 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/entities/IntervalTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/entities/IntervalTest.java @@ -25,8 +25,6 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.navalplanner.business.test.resources.daos.CriterionSatisfactionDAOTest.year; -import java.util.Date; - import org.junit.Test; import org.navalplanner.business.resources.entities.Interval; import org.navalplanner.business.test.resources.daos.CriterionSatisfactionDAOTest; @@ -82,9 +80,8 @@ public class IntervalTest { Interval range = Interval.range(year(1990), year(2000)); assertTrue(range.contains(year(1990))); assertFalse(range.contains(year(2000))); - assertFalse(range.contains(new Date(year(1990).getTime() - 1))); - assertFalse(range.contains(new Date(year(1990).getTime() - 1))); - assertFalse(range.contains(new Date(year(2000).getTime() + 1))); + assertFalse(range.contains(year(1990).minusDays(1))); + assertFalse(range.contains(year(2000).plusDays(1))); } @Test diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/entities/ResourceTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/entities/ResourceTest.java index e339a7dc3..65a7ca4b7 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/entities/ResourceTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/entities/ResourceTest.java @@ -34,7 +34,6 @@ import static org.navalplanner.business.workingday.EffortDuration.hours; import java.util.ArrayList; import java.util.Arrays; -import java.util.Date; import java.util.HashSet; import java.util.List; @@ -243,7 +242,7 @@ public class ResourceTest { assertThat(worker.getCurrentSatisfactionsFor(criterion).size(), equalTo(0)); assertFalse(criterion.isSatisfiedBy(worker)); - Interval fromNow = Interval.from(new Date()); + Interval fromNow = Interval.from(new LocalDate()); assertTrue(worker.canAddSatisfaction(new CriterionWithItsType( criterionType, criterion), fromNow)); worker.addSatisfaction(new CriterionWithItsType(criterionType, @@ -490,8 +489,9 @@ public class ResourceTest { }; CriterionWithItsType criterionWithItsType = new CriterionWithItsType( type, criterion); - assertFalse(worker.canAddSatisfaction(criterionWithItsType, Interval - .from(new Date()))); + LocalDate today = new LocalDate(); + assertFalse(worker.canAddSatisfaction(criterionWithItsType, + Interval.from(today))); worker.addSatisfaction(criterionWithItsType); } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/machine/AssignedMachineCriterionsModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/machine/AssignedMachineCriterionsModel.java index 312524378..db681829d 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/machine/AssignedMachineCriterionsModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/machine/AssignedMachineCriterionsModel.java @@ -23,7 +23,6 @@ package org.navalplanner.web.resources.machine; import static org.navalplanner.web.I18nHelper._; import java.util.ArrayList; -import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -390,11 +389,9 @@ public class AssignedMachineCriterionsModel extends IntegrationEntityModel .getCriterionSatisfaction(); Criterion newCriterion = satisfactionDTO.getCriterionWithItsType() .getCriterion(); - Date newStartDate = satisfactionDTO.getStartDate(); - Date newEndDate = satisfactionDTO.getEndDate(); satisfaction.setCriterion(newCriterion); - satisfaction.setStartDate(newStartDate); - satisfaction.setEndDate(newEndDate); + satisfaction.setStartDate(satisfactionDTO.getStart()); + satisfaction.setEndDate(satisfactionDTO.getEnd()); } @Override @@ -442,9 +439,9 @@ public class AssignedMachineCriterionsModel extends IntegrationEntityModel if (satisfactionDTO.isIsDeleted()) { satisfaction.setIsDeleted(true); } else { - satisfaction.setStartDate(satisfactionDTO.getStartDate()); + satisfaction.setStartDate(satisfactionDTO.getStart()); if (satisfactionDTO.getEndDate() != null) { - satisfaction.finish(satisfactionDTO.getEndDate()); + satisfaction.finish(satisfactionDTO.getEnd()); } } } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/AssignedCriterionsModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/AssignedCriterionsModel.java index b0f4ee5e0..a8b63d1bb 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/AssignedCriterionsModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/AssignedCriterionsModel.java @@ -369,9 +369,9 @@ public class AssignedCriterionsModel extends IntegrationEntityModel implements if (satisfactionDTO.isIsDeleted()) { satisfaction.setIsDeleted(true); } else { - satisfaction.setStartDate(satisfactionDTO.getStartDate()); + satisfaction.setStartDate(satisfactionDTO.getStart()); if (satisfactionDTO.getEndDate() != null) { - satisfaction.finish(satisfactionDTO.getEndDate()); + satisfaction.finish(satisfactionDTO.getEnd()); } } } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/CriterionSatisfactionDTO.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/CriterionSatisfactionDTO.java index b8a9b32b8..b7afd83f0 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/CriterionSatisfactionDTO.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/CriterionSatisfactionDTO.java @@ -30,6 +30,7 @@ import java.util.List; import java.util.Set; import org.hibernate.validator.NotNull; +import org.joda.time.LocalDate; import org.navalplanner.business.INewObject; import org.navalplanner.business.resources.entities.Criterion; import org.navalplanner.business.resources.entities.CriterionSatisfaction; @@ -63,9 +64,9 @@ public class CriterionSatisfactionDTO implements INewObject { private String criterionAndType; @NotNull - private Date startDate; + private LocalDate startDate; - private Date endDate; + private LocalDate endDate; @NotNull private CriterionWithItsType criterionWithItsType; @@ -80,13 +81,13 @@ public class CriterionSatisfactionDTO implements INewObject { this.setNewObject(true); this.state = ""; this.criterionAndType = ""; - this.startDate = new Date(); + this.startDate = new LocalDate(); this.endDate = null; } public CriterionSatisfactionDTO(CriterionSatisfaction criterionSatisfaction) { - this.setStartDate(criterionSatisfaction.getStartDate()); - this.setEndDate(criterionSatisfaction.getEndDate()); + this.startDate = criterionSatisfaction.getStartDate(); + this.endDate = criterionSatisfaction.getEndDate(); this.state = ""; this.criterionAndType = ""; this.setCriterionSatisfaction(criterionSatisfaction); @@ -132,11 +133,26 @@ public class CriterionSatisfactionDTO implements INewObject { } public Date getStartDate() { - return startDate != null ? new Date(startDate.getTime()) : null; + return asDate(startDate); + } + + public LocalDate getStart() { + return startDate; + } + + public LocalDate getEnd() { + return endDate; } public Date getEndDate() { - return endDate != null ? new Date(endDate.getTime()) : null; + return asDate(endDate); + } + + private Date asDate(LocalDate localDate) { + if (localDate == null) { + return null; + } + return localDate.toDateTimeAtStartOfDay().toDate(); } public CriterionSatisfaction getCriterionSatisfaction() { @@ -164,11 +180,11 @@ public class CriterionSatisfactionDTO implements INewObject { } public void setStartDate(Date startDate) { - this.startDate = startDate; + this.startDate = asLocalDate(startDate); } public void setEndDate(Date endDate) { - this.endDate = endDate; + this.endDate = asLocalDate(endDate); } public void setIsDeleted(boolean isDeleted) { @@ -194,7 +210,7 @@ public class CriterionSatisfactionDTO implements INewObject { return false; } - public boolean isPreviousStartDate(Date startDate){ + public boolean isPreviousStartDate(LocalDate startDate) { if (newObject) { return true; } @@ -207,7 +223,11 @@ public class CriterionSatisfactionDTO implements INewObject { return false; } - public boolean isGreaterStartDate(Date endDate){ + public boolean isPreviousStartDate(Date value) { + return isPreviousStartDate(asLocalDate(value)); + } + + public boolean isGreaterStartDate(Date endDate) { if (getStartDate() == null || endDate == null) { return true; } @@ -217,7 +237,7 @@ public class CriterionSatisfactionDTO implements INewObject { return false; } - public boolean isPostEndDate(Date endDate){ + public boolean isPostEndDate(LocalDate endDate) { if (newObject) { return true; } @@ -233,6 +253,17 @@ public class CriterionSatisfactionDTO implements INewObject { return false; } + public boolean isPostEndDate(Date value) { + return isPostEndDate(asLocalDate(value)); + } + + private LocalDate asLocalDate(Date value) { + if (value == null) { + return null; + } + return LocalDate.fromDateFields(value); + } + public String getCriterionAndType() { if (criterionWithItsType == null) { return criterionAndType; 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 4b990f77d..f9a75fcc0 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 @@ -25,7 +25,6 @@ import static org.navalplanner.web.I18nHelper._; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -33,6 +32,7 @@ import java.util.Map; import java.util.Set; import org.apache.commons.lang.Validate; +import org.joda.time.LocalDate; import org.navalplanner.business.calendars.daos.IBaseCalendarDAO; import org.navalplanner.business.calendars.entities.BaseCalendar; import org.navalplanner.business.calendars.entities.CalendarData; @@ -437,7 +437,8 @@ public class WorkerModel extends IntegrationEntityModel implements IWorkerModel } private CriterionSatisfaction createSatisfactionFor(Criterion criterion) { - return CriterionSatisfaction.create(new Date(), criterion, resource); + return CriterionSatisfaction.create(new LocalDate(), criterion, + resource); } @Override diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/impl/ResourceConverter.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/impl/ResourceConverter.java index 89ac28fb2..4487754ea 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/impl/ResourceConverter.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/impl/ResourceConverter.java @@ -167,8 +167,8 @@ public class ResourceConverter { StringUtils.trim(criterionSatisfactionDTO.criterionTypeName), StringUtils.trim(criterionSatisfactionDTO.criterionName), resource, - DateConverter.toDate(criterionSatisfactionDTO.startDate), - DateConverter.toDate(criterionSatisfactionDTO.endDate)); + DateConverter.toLocalDate(criterionSatisfactionDTO.startDate), + DateConverter.toLocalDate(criterionSatisfactionDTO.endDate)); } catch (InstanceNotFoundException e) { @@ -340,8 +340,8 @@ public class ResourceConverter { criterionSatisfaction.updateUnvalidated( StringUtils.trim(criterionSatisfactionDTO.criterionTypeName), StringUtils.trim(criterionSatisfactionDTO.criterionName), - DateConverter.toDate(criterionSatisfactionDTO.startDate), - DateConverter.toDate(criterionSatisfactionDTO.endDate)); + DateConverter.toLocalDate(criterionSatisfactionDTO.startDate), + DateConverter.toLocalDate(criterionSatisfactionDTO.endDate)); } catch (InstanceNotFoundException e) {