[Bug #1043] Fixed issue changing constraintDate to IntraDayDate.

* Changed constraintDate attribute in class TaskPositionConstraint to
  IntraDayDate.
* Made all modifications needed to get this change working.

FEA: ItEr74S04BugFixing
This commit is contained in:
Manuel Rego Casasnovas 2011-05-10 17:59:51 +02:00
parent 47072040b5
commit 811b7ba759
13 changed files with 68 additions and 41 deletions

View file

@ -68,6 +68,7 @@ import org.navalplanner.business.scenarios.entities.Scenario;
import org.navalplanner.business.templates.entities.OrderElementTemplate;
import org.navalplanner.business.trees.ITreeNode;
import org.navalplanner.business.util.deepcopy.DeepCopy;
import org.navalplanner.business.workingday.IntraDayDate;
public abstract class OrderElement extends IntegrationEntity implements
ICriterionRequirable, ITreeNode<OrderElement> {
@ -892,13 +893,13 @@ public abstract class OrderElement extends IntegrationEntity implements
TaskPositionConstraint constraint = task.getPositionConstraint();
if (getInitDate() != null
&& (getDeadline() == null || !scheduleBackwards)) {
constraint.notEarlierThan(
LocalDate.fromDateFields(this.getInitDate()));
constraint.notEarlierThan(IntraDayDate.startOfDay(LocalDate
.fromDateFields(this.getInitDate())));
return true;
}
if (getDeadline() != null) {
constraint.finishNotLaterThan(
LocalDate.fromDateFields(this.getDeadline()));
constraint.finishNotLaterThan(IntraDayDate.startOfDay(LocalDate
.fromDateFields(this.getDeadline())));
return true;
}
return false;

View file

@ -25,11 +25,11 @@
*/
package org.navalplanner.business.planner.entities;
import org.joda.time.LocalDate;
import org.navalplanner.business.workingday.IntraDayDate;
public interface ITaskPositionConstrained {
TaskPositionConstraint getPositionConstraint();
void explicityMoved(LocalDate date);
void explicityMoved(IntraDayDate date);
}

View file

@ -419,7 +419,7 @@ public class Task extends TaskElement implements ITaskPositionConstrained {
}
}
public void explicityMoved(LocalDate date) {
public void explicityMoved(IntraDayDate date) {
getPositionConstraint().explicityMovedTo(date);
}

View file

@ -30,7 +30,6 @@ import org.apache.commons.lang.Validate;
import org.hibernate.validator.AssertTrue;
import org.joda.time.DateTime;
import org.joda.time.Days;
import org.joda.time.LocalDate;
import org.navalplanner.business.resources.daos.IResourcesSearcher;
import org.navalplanner.business.scenarios.entities.Scenario;
import org.navalplanner.business.workingday.IntraDayDate;
@ -166,7 +165,7 @@ public class TaskMilestone extends TaskElement implements ITaskPositionConstrain
return false;
}
public void explicityMoved(LocalDate date) {
public void explicityMoved(IntraDayDate date) {
getPositionConstraint().explicityMovedTo(date);
}

View file

@ -23,7 +23,7 @@ package org.navalplanner.business.planner.entities;
import java.util.Date;
import org.apache.commons.lang.Validate;
import org.joda.time.LocalDate;
import org.navalplanner.business.workingday.IntraDayDate;
/**
* Component class that encapsulates a {@link PositionConstraintType} and its
@ -34,7 +34,7 @@ public class TaskPositionConstraint {
private PositionConstraintType constraintType = PositionConstraintType.AS_SOON_AS_POSSIBLE;
private LocalDate constraintDate = null;
private IntraDayDate constraintDate = null;
public TaskPositionConstraint() {
}
@ -57,23 +57,23 @@ public class TaskPositionConstraint {
.toDate() : null;
}
public void explicityMovedTo(LocalDate date) {
public void explicityMovedTo(IntraDayDate date) {
Validate.notNull(date);
constraintType = constraintType.newTypeAfterMoved();
constraintDate = date;
}
public LocalDate getConstraintDate() {
public IntraDayDate getConstraintDate() {
return constraintDate;
}
public void notEarlierThan(LocalDate date) {
public void notEarlierThan(IntraDayDate date) {
Validate.notNull(date);
this.constraintDate = date;
this.constraintType = PositionConstraintType.START_NOT_EARLIER_THAN;
}
public void finishNotLaterThan(LocalDate date) {
public void finishNotLaterThan(IntraDayDate date) {
Validate.notNull(date);
this.constraintDate = date;
this.constraintType = PositionConstraintType.FINISH_NOT_LATER_THAN;
@ -89,12 +89,12 @@ public class TaskPositionConstraint {
this.constraintDate = null;
}
public boolean isValid(PositionConstraintType type, LocalDate value) {
public boolean isValid(PositionConstraintType type, IntraDayDate value) {
return type != null
&& type.isAssociatedDateRequired() == (value != null);
}
public void update(PositionConstraintType type, LocalDate value) {
public void update(PositionConstraintType type, IntraDayDate value) {
Validate.isTrue(isValid(type, value));
this.constraintType = type;
this.constraintDate = value;

View file

@ -149,4 +149,23 @@
<sql>UPDATE resource_allocation SET intended_non_consolidated_effort = intended_total_assignment</sql>
</changeSet>
<changeSet id="add-effort-duration-to-task-and-milestone" author="mrego">
<comment>
constraintDate attribute in class TaskPositionConstraint has been changed to IntraDayDate.
It is needed to add some columns to store EffortDuration in Task and TaskMilestone.
</comment>
<addColumn tableName="task">
<column name="constraint_date_effort_duration" type="INTEGER" />
</addColumn>
<addColumn tableName="task_milestone">
<column name="constraint_date_effort_duration" type="INTEGER" />
</addColumn>
<addDefaultValue tableName="task"
columnName="constraint_date_effort_duration"
defaultValueNumeric="0" />
<addDefaultValue tableName="task_milestone"
columnName="constraint_date_effort_duration"
defaultValueNumeric="0" />
</changeSet>
</databaseChangeLog>

View file

@ -64,8 +64,13 @@
<param name="enumClass">org.navalplanner.business.planner.entities.PositionConstraintType</param>
</type>
</property>
<property name="constraintDate" type="org.joda.time.contrib.hibernate.PersistentLocalDate"
column="constraint_date" />
<component name="constraintDate"
class="org.navalplanner.business.workingday.IntraDayDate">
<property name="date" column="constraint_date"
type="org.joda.time.contrib.hibernate.PersistentLocalDate"/>
<property name="effortDuration" column="constraint_date_effort_duration"
type="org.navalplanner.business.workingday.hibernate.EffortDurationType"/>
</component>
</component>
<property name="workableDays" column="workable_days" />
@ -116,8 +121,13 @@
<param name="enumClass">org.navalplanner.business.planner.entities.PositionConstraintType</param>
</type>
</property>
<property name="constraintDate" column="constraint_date"
type="org.joda.time.contrib.hibernate.PersistentLocalDate"/>
<component name="constraintDate"
class="org.navalplanner.business.workingday.IntraDayDate">
<property name="date" column="constraint_date"
type="org.joda.time.contrib.hibernate.PersistentLocalDate"/>
<property name="effortDuration" column="constraint_date_effort_duration"
type="org.navalplanner.business.workingday.hibernate.EffortDurationType"/>
</component>
</component>
</joined-subclass>

View file

@ -298,7 +298,8 @@ public class TaskElementTest {
};
}
private static Matcher<TaskPositionConstraint> hasValue(final LocalDate value) {
private static Matcher<TaskPositionConstraint> hasValue(
final LocalDate value) {
return new BaseMatcher<TaskPositionConstraint>() {
@Override
@ -306,7 +307,8 @@ public class TaskElementTest {
if (object instanceof TaskPositionConstraint) {
TaskPositionConstraint startConstraint = (TaskPositionConstraint) object;
LocalDate constraintDate = startConstraint
.getConstraintDate();
.getConstraintDate().toDateTimeAtStartOfDay()
.toLocalDate();
boolean bothNotNull = value != null
&& constraintDate != null;
return value == constraintDate || bothNotNull

View file

@ -892,7 +892,7 @@ public class LimitingResourceQueueModel implements ILimitingResourceQueueModel {
IntraDayDate endDate) {
task.setIntraDayStartDate(startDate);
task.setIntraDayEndDate(endDate);
task.explicityMoved(startDate.getDate());
task.explicityMoved(startDate);
}
private void addLimitingResourceQueueElementIfNeeded(LimitingResourceQueue queue,

View file

@ -256,13 +256,6 @@ public class TaskElementAdapter implements ITaskElementAdapter {
});
}
public static LocalDate toLocalDate(GanttDate date) {
if (date == null) {
return null;
}
return toIntraDay(date).getDate();
}
static class GanttDateAdapter extends CustomDate {
private static final int DAY_MILLISECONDS = (int) Days.days(1)
@ -456,7 +449,7 @@ public class TaskElementAdapter implements ITaskElementAdapter {
.compareTo(PositionConstraintType.FINISH_NOT_LATER_THAN) == 0
|| constraintType
.compareTo(PositionConstraintType.AS_LATE_AS_POSSIBLE) == 0) {
task.explicityMoved(toLocalDate(endDate));
task.explicityMoved(toIntraDay(endDate));
}
}
}
@ -918,11 +911,11 @@ public class TaskElementAdapter implements ITaskElementAdapter {
ITaskPositionConstrained task = (ITaskPositionConstrained) taskElement;
if (task.getPositionConstraint().isConstraintAppliedToStart()) {
setBeginDate(newStart);
task.explicityMoved(toLocalDate(newStart));
task.explicityMoved(toIntraDay(newStart));
} else {
GanttDate newEnd = inferEndFrom(newStart);
setEndDate(newEnd);
task.explicityMoved(toLocalDate(newEnd));
task.explicityMoved(toIntraDay(newEnd));
}
}
}

View file

@ -119,9 +119,9 @@ public class SubcontractModel implements ISubcontractModel {
private void convertOnStartOnFixedDate(Task task) {
TaskPositionConstraint taskConstraint = task.getPositionConstraint();
if (taskConstraint.isValid(PositionConstraintType.START_IN_FIXED_DATE,
task.getIntraDayStartDate().getDate())) {
taskConstraint.update(PositionConstraintType.START_IN_FIXED_DATE, task
.getIntraDayStartDate().getDate());
task.getIntraDayStartDate())) {
taskConstraint.update(PositionConstraintType.START_IN_FIXED_DATE,
task.getIntraDayStartDate());
}
}

View file

@ -25,6 +25,7 @@ import java.util.List;
import org.apache.commons.lang.Validate;
import org.joda.time.LocalDate;
import org.navalplanner.business.workingday.IntraDayDate;
import org.navalplanner.web.planner.TaskElementAdapter;
import org.zkoss.ganttz.data.Task;
@ -64,8 +65,8 @@ public class ReassignConfiguration {
}
private boolean isAfterDate(Task each) {
LocalDate start = TaskElementAdapter.toLocalDate(each.getBeginDate());
LocalDate end = TaskElementAdapter.toLocalDate(each.getEndDate());
IntraDayDate start = TaskElementAdapter.toIntraDay(each.getBeginDate());
IntraDayDate end = TaskElementAdapter.toIntraDay(each.getEndDate());
return start.compareTo(date) > 0 || end.compareTo(date) > 0;
}

View file

@ -36,6 +36,7 @@ import org.navalplanner.business.planner.entities.Task;
import org.navalplanner.business.planner.entities.TaskElement;
import org.navalplanner.business.planner.entities.TaskPositionConstraint;
import org.navalplanner.business.scenarios.IScenarioManager;
import org.navalplanner.business.workingday.IntraDayDate;
import org.navalplanner.web.I18nHelper;
import org.navalplanner.web.common.Util;
import org.springframework.beans.factory.annotation.Autowired;
@ -354,8 +355,9 @@ public class TaskPropertiesController extends GenericForwardComposer {
.getPositionConstraint();
WebStartConstraintType type = (WebStartConstraintType) startConstraintTypes
.getSelectedItemApi().getValue();
LocalDate inputDate = type.isAssociatedDateRequired() ? LocalDate
.fromDateFields(startConstraintDate.getValue()) : null;
IntraDayDate inputDate = type.isAssociatedDateRequired() ? IntraDayDate
.startOfDay(LocalDate.fromDateFields(startConstraintDate
.getValue())) : null;
if (taskConstraint.isValid(type.getType(), inputDate)) {
taskConstraint.update(type.getType(), inputDate);
if (currentContext != null) {