diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/GanttDiagramGraph.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/GanttDiagramGraph.java index 03451a2bc..28a652f38 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/GanttDiagramGraph.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/GanttDiagramGraph.java @@ -61,12 +61,11 @@ public class GanttDiagramGraph { return new IDependenciesEnforcerHook() { @Override - public void setLengthMilliseconds(long previousLengthMilliseconds, - long lengthMilliseconds) { + public void setNewEnd(Date previousEnd, Date newEnd) { } @Override - public void setStartDate(Date previousStart, long previousLength, + public void setStartDate(Date previousStart, Date previousEnd, Date newStart) { } }; @@ -408,11 +407,10 @@ public class GanttDiagramGraph { } public interface IDependenciesEnforcerHook { - public void setStartDate(Date previousStart, long previousLength, + public void setStartDate(Date previousStart, Date previousEnd, Date newStart); - public void setLengthMilliseconds(long previousLengthMilliseconds, - long newLengthMilliseconds); + public void setNewEnd(Date previousEnd, Date newEnd); } public interface IDependenciesEnforcerHookFactory { @@ -423,21 +421,21 @@ public class GanttDiagramGraph { } public interface INotificationAfterDependenciesEnforcement { - public void onStartDateChange(Date previousStart, long previousLength, + public void onStartDateChange(Date previousStart, Date previousEnd, Date newStart); - public void onLengthChange(long previousLength, long newLength); + public void onEndDateChange(Date previousEnd, Date newEnd); } private static final INotificationAfterDependenciesEnforcement EMPTY_NOTIFICATOR = new INotificationAfterDependenciesEnforcement() { @Override - public void onStartDateChange(Date previousStart, long previousLength, + public void onStartDateChange(Date previousStart, Date previousEnd, Date newStart) { } @Override - public void onLengthChange(long previousLength, long newLength) { + public void onEndDateChange(Date previousEnd, Date newEnd) { } }; @@ -503,54 +501,52 @@ public class GanttDiagramGraph { private final INotificationAfterDependenciesEnforcement notification; private final Date previousStart; - private final long previousLength; + private final Date previousEnd; private final Date newStart; public StartDateNofitication( INotificationAfterDependenciesEnforcement notification, - Date previousStart, long previousLength, Date newStart) { + Date previousStart, Date previousEnd, Date newStart) { this.notification = notification; this.previousStart = previousStart; - this.previousLength = previousLength; + this.previousEnd = previousEnd; this.newStart = newStart; } public StartDateNofitication coalesce( StartDateNofitication startDateNofitication) { return new StartDateNofitication(notification, previousStart, - previousLength, startDateNofitication.newStart); + previousEnd, startDateNofitication.newStart); } void doNotification() { - notification.onStartDateChange(previousStart, previousLength, - newStart); + notification + .onStartDateChange(previousStart, previousEnd, newStart); } } private class LengthNotification { private final INotificationAfterDependenciesEnforcement notification; - private final long previousLengthMilliseconds; - private final long newLengthMilliseconds; + private final Date previousEnd; + private final Date newEnd; public LengthNotification( INotificationAfterDependenciesEnforcement notification, - long previousLengthMilliseconds, long lengthMilliseconds) { + Date previousEnd, Date newEnd) { this.notification = notification; - this.previousLengthMilliseconds = previousLengthMilliseconds; - this.newLengthMilliseconds = lengthMilliseconds; + this.previousEnd = previousEnd; + this.newEnd = newEnd; } public LengthNotification coalesce(LengthNotification lengthNofitication) { - return new LengthNotification(notification, - previousLengthMilliseconds, - lengthNofitication.newLengthMilliseconds); + return new LengthNotification(notification, previousEnd, + lengthNofitication.newEnd); } void doNotification() { - notification.onLengthChange(previousLengthMilliseconds, - newLengthMilliseconds); + notification.onEndDateChange(previousEnd, newEnd); } } @@ -574,17 +570,16 @@ public class GanttDiagramGraph { private IDependenciesEnforcerHook onEntrance(final V task) { return new IDependenciesEnforcerHook() { - @Override - public void setStartDate(Date previousStart, - long previousLength, Date newStart) { + public void setStartDate(Date previousStart, Date previousEnd, + Date newStart) { taskPositionModified(task); } @Override - public void setLengthMilliseconds( - long previousLengthMilliseconds, long lengthMilliseconds) { + public void setNewEnd(Date previousEnd, Date newEnd) { taskPositionModified(task); } + }; } @@ -593,22 +588,19 @@ public class GanttDiagramGraph { return new IDependenciesEnforcerHook() { @Override - public void setStartDate(Date previousStart, - long previousLength, Date newStart) { + public void setStartDate(Date previousStart, Date previousEnd, + Date newStart) { StartDateNofitication startDateNotification = new StartDateNofitication( - notification, - previousStart, previousLength, newStart); + notification, previousStart, previousEnd, + newStart); deferedNotifier.get().add(task, startDateNotification); } @Override - public void setLengthMilliseconds( - long previousLengthMilliseconds, - long newLengthMilliseconds) { + public void setNewEnd(Date previousEnd, Date newEnd) { LengthNotification lengthNotification = new LengthNotification( - notification, previousLengthMilliseconds, - newLengthMilliseconds); + notification, previousEnd, newEnd); deferedNotifier.get().add(task, lengthNotification); } }; @@ -622,7 +614,7 @@ public class GanttDiagramGraph { @Override public void setStartDate(final Date previousStart, - final long previousLength, final Date newStart) { + final Date previousEnd, final Date newStart) { positionsUpdatingGuard .entranceRequested(new IReentranceCases() { @@ -634,10 +626,10 @@ public class GanttDiagramGraph { public void doAction() { notification.setStartDate( previousStart, - previousLength, newStart); + previousEnd, newStart); onEntrance.setStartDate( - previousStart, - previousLength, newStart); + previousStart, previousEnd, + newStart); } }); } @@ -645,16 +637,14 @@ public class GanttDiagramGraph { @Override public void ifAlreadyInside() { notification.setStartDate(previousStart, - previousLength, newStart); + previousEnd, newStart); } }); } @Override - public void setLengthMilliseconds( - final long previousLengthMilliseconds, - final long lengthMilliseconds) { + public void setNewEnd(final Date previousEnd, final Date newEnd) { positionsUpdatingGuard .entranceRequested(new IReentranceCases() { @@ -664,21 +654,17 @@ public class GanttDiagramGraph { @Override public void doAction() { - notification.setLengthMilliseconds( - previousLengthMilliseconds, - lengthMilliseconds); - onEntrance.setLengthMilliseconds( - previousLengthMilliseconds, - lengthMilliseconds); + notification.setNewEnd(previousEnd, + newEnd); + onEntrance.setNewEnd(previousEnd, + newEnd); } }); } @Override public void ifAlreadyInside() { - notification.setLengthMilliseconds( - previousLengthMilliseconds, - lengthMilliseconds); + notification.setNewEnd(previousEnd, newEnd); } }); } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/Task.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/Task.java index b04441c81..78a0f937f 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/Task.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/Task.java @@ -74,23 +74,22 @@ public abstract class Task implements ITaskFundamentalProperties { private final INotificationAfterDependenciesEnforcement notifyDates = new INotificationAfterDependenciesEnforcement() { @Override - public void onStartDateChange(Date previousStart, long oldLength, + public void onStartDateChange(Date previousStart, Date previousEnd, Date newStart) { fundamentalPropertiesListeners.firePropertyChange("beginDate", previousStart, fundamentalProperties.getBeginDate()); - fireLengthMilliseconds(oldLength); + fireEndDate(previousEnd); reloadResourcesTextIfChange(newStart, previousStart); } @Override - public void onLengthChange(long previousLength, long newLength) { - fireLengthMilliseconds(previousLength); + public void onEndDateChange(Date previousEnd, Date newEnd) { + fireEndDate(previousEnd); } - private void fireLengthMilliseconds(long previousValue) { - fundamentalPropertiesListeners.firePropertyChange( - "lengthMilliseconds", previousValue, fundamentalProperties - .getLengthMilliseconds()); + private void fireEndDate(Date previousEnd) { + fundamentalPropertiesListeners.firePropertyChange("endDate", + previousEnd, fundamentalProperties.getEndDate()); } }; @@ -177,9 +176,9 @@ public abstract class Task implements ITaskFundamentalProperties { public long setBeginDate(Date newStart) { Date previousValue = fundamentalProperties.getBeginDate(); - long previousLength = fundamentalProperties.getLengthMilliseconds(); + Date previousEnd = fundamentalProperties.getEndDate(); fundamentalProperties.setBeginDate(newStart); - dependenciesEnforcerHook.setStartDate(previousValue, previousLength, + dependenciesEnforcerHook.setStartDate(previousValue, previousEnd, newStart); return fundamentalProperties.getLengthMilliseconds(); } @@ -191,11 +190,10 @@ public abstract class Task implements ITaskFundamentalProperties { } public void fireChangesForPreviousValues(Date previousStart, - long previousLength) { - dependenciesEnforcerHook.setStartDate(previousStart, previousLength, + Date previousEnd) { + dependenciesEnforcerHook.setStartDate(previousStart, previousEnd, fundamentalProperties.getBeginDate()); - dependenciesEnforcerHook.setLengthMilliseconds(previousLength, - fundamentalProperties.getLengthMilliseconds()); + dependenciesEnforcerHook.setNewEnd(previousEnd, getEndDate()); } public Date getBeginDate() { @@ -203,14 +201,11 @@ public abstract class Task implements ITaskFundamentalProperties { } public void setLengthMilliseconds(long lengthMilliseconds) { - long previousValue = fundamentalProperties.getLengthMilliseconds(); - fundamentalProperties.setLengthMilliseconds(lengthMilliseconds); - dependenciesEnforcerHook.setLengthMilliseconds(previousValue, - lengthMilliseconds); + setEndDate(new Date(getBeginDate().getTime() + lengthMilliseconds)); } public long getLengthMilliseconds() { - return fundamentalProperties.getLengthMilliseconds(); + return getEndDate().getTime() - getBeginDate().getTime(); } public void addVisibilityPropertiesChangeListener( @@ -235,7 +230,7 @@ public abstract class Task implements ITaskFundamentalProperties { @Override public Date getEndDate() { - return new Date(getBeginDate().getTime() + getLengthMilliseconds()); + return fundamentalProperties.getEndDate(); } public Constraint getCurrentLengthConstraint() { @@ -267,7 +262,10 @@ public abstract class Task implements ITaskFundamentalProperties { if (value == null) { return; } - setLengthMilliseconds(value.getTime() - getBeginDate().getTime()); + Date previousEnd = fundamentalProperties.getEndDate(); + fundamentalProperties.setEndDate(value); + dependenciesEnforcerHook.setNewEnd(previousEnd, + fundamentalProperties.getEndDate()); } public void removed() { @@ -312,9 +310,9 @@ public abstract class Task implements ITaskFundamentalProperties { public void moveTo(Date date) { Date previousStart = getBeginDate(); - long previousLength = getLengthMilliseconds(); + Date previousEnd = getEndDate(); fundamentalProperties.moveTo(date); - dependenciesEnforcerHook.setStartDate(previousStart, previousLength, date); + dependenciesEnforcerHook.setStartDate(previousStart, previousEnd, date); } @Override 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 c2065f455..66eb939ff 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 @@ -54,24 +54,23 @@ import org.navalplanner.business.workingday.ResourcesPerDay; public abstract class TaskElement extends BaseEntity { public interface IDatesInterceptor { - public void setStartDate(Date previousStart, long previousLength, - Date newStart); + public void setStartDate(IntraDayDate previousStart, + IntraDayDate previousEnd, IntraDayDate newStart); - public void setLengthMilliseconds(long previousLengthMilliseconds, - long newLengthMilliseconds); + public void setNewEnd(IntraDayDate previousEnd, IntraDayDate newEnd); } private static final IDatesInterceptor EMPTY_INTERCEPTOR = new IDatesInterceptor() { @Override - public void setStartDate(Date previousStart, long previousLength, - Date newStart) { + public void setStartDate(IntraDayDate previousStart, + IntraDayDate previousEnd, IntraDayDate newStart) { } @Override - public void setLengthMilliseconds(long previousLengthMilliseconds, - long newLengthMilliseconds) { + public void setNewEnd(IntraDayDate previousEnd, IntraDayDate newEnd) { } + }; public static Comparator getByStartDateComparator() { @@ -252,11 +251,11 @@ public abstract class TaskElement extends BaseEntity { } public void setIntraDayStartDate(IntraDayDate startDate) { - Date previousDate = getStartDate(); - long previousLenghtMilliseconds = getLengthMilliseconds(); + IntraDayDate previousStart = getIntraDayStartDate(); + IntraDayDate previousEnd = getIntraDayEndDate(); this.startDate = startDate; - datesInterceptor.setStartDate(previousDate, previousLenghtMilliseconds, - getStartDate()); + datesInterceptor.setStartDate(previousStart, previousEnd, + getIntraDayStartDate()); } /** @@ -294,10 +293,9 @@ public abstract class TaskElement extends BaseEntity { } public void setIntraDayEndDate(IntraDayDate endDate) { - long previousLength = getLengthMilliseconds(); + IntraDayDate previousEnd = getIntraDayEndDate(); this.endDate = endDate; - datesInterceptor.setLengthMilliseconds(previousLength, - getLengthMilliseconds()); + datesInterceptor.setNewEnd(previousEnd, this.endDate); } public IntraDayDate getIntraDayEndDate() { diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/TemplateModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/TemplateModel.java index 2b4caa816..a3fe50ca0 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/TemplateModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/TemplateModel.java @@ -27,10 +27,11 @@ import java.util.Collections; import java.util.Date; import java.util.HashSet; import java.util.List; -import java.util.Set; import java.util.Map.Entry; +import java.util.Set; import org.apache.commons.lang.Validate; +import org.joda.time.LocalDate; import org.navalplanner.business.common.IAdHocTransactionService; import org.navalplanner.business.common.IOnTransaction; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; @@ -38,11 +39,11 @@ import org.navalplanner.business.orders.entities.Order; import org.navalplanner.business.orders.entities.TaskSource; import org.navalplanner.business.planner.daos.ITaskSourceDAO; import org.navalplanner.business.planner.entities.Dependency; +import org.navalplanner.business.planner.entities.Dependency.Type; 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.Dependency.Type; import org.navalplanner.business.planner.entities.TaskElement.IDatesInterceptor; +import org.navalplanner.business.planner.entities.TaskGroup; import org.navalplanner.business.resources.daos.IResourceDAO; import org.navalplanner.business.scenarios.daos.IOrderVersionDAO; import org.navalplanner.business.scenarios.daos.IScenarioDAO; @@ -50,6 +51,7 @@ import org.navalplanner.business.scenarios.entities.OrderVersion; import org.navalplanner.business.scenarios.entities.Scenario; import org.navalplanner.business.users.daos.IUserDAO; import org.navalplanner.business.users.entities.User; +import org.navalplanner.business.workingday.IntraDayDate; import org.navalplanner.web.planner.TaskElementAdapter; import org.navalplanner.web.users.services.CustomUser; import org.springframework.beans.factory.annotation.Autowired; @@ -186,20 +188,25 @@ public class TemplateModel implements ITemplateModel { return new IDatesInterceptor() { @Override - public void setStartDate(Date previousStart, long previousLength, - Date newStart) { - hook.setStartDate(previousStart, previousLength, newStart); + public void setStartDate(IntraDayDate previousStart, + IntraDayDate previousEnd, IntraDayDate newStart) { + hook.setStartDate(convert(previousStart.getDate()), + convert(previousEnd.asExclusiveEnd()), + convert(newStart.getDate())); } @Override - public void setLengthMilliseconds(long previousLengthMilliseconds, - long newLengthMilliseconds) { - hook.setLengthMilliseconds(previousLengthMilliseconds, - newLengthMilliseconds); + public void setNewEnd(IntraDayDate previousEnd, IntraDayDate newEnd) { + hook.setNewEnd(convert(previousEnd.getDate()), + convert(newEnd.asExclusiveEnd())); } }; } + private static Date convert(LocalDate date) { + return date.toDateTimeAtStartOfDay().toDate(); + } + public class Adapter implements IAdapter { diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/ResourceAllocationModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/ResourceAllocationModel.java index f3a0ced6d..24576cd8d 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/ResourceAllocationModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/ResourceAllocationModel.java @@ -196,10 +196,9 @@ public class ResourceAllocationModel implements IResourceAllocationModel { IOnTransaction allocationDoer) { org.zkoss.ganttz.data.Task ganttTask = context.getTask(); Date previousStartDate = ganttTask.getBeginDate(); - long previousLength = ganttTask.getLengthMilliseconds(); + Date previousEnd = ganttTask.getEndDate(); transactionService.runOnReadOnlyTransaction(allocationDoer); - ganttTask.fireChangesForPreviousValues(previousStartDate, - previousLength); + ganttTask.fireChangesForPreviousValues(previousStartDate, previousEnd); } private void stepsBeforeDoingAllocation() { diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/consolidations/AdvanceConsolidationModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/consolidations/AdvanceConsolidationModel.java index 00e3da585..c15b4893a 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/consolidations/AdvanceConsolidationModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/consolidations/AdvanceConsolidationModel.java @@ -143,7 +143,7 @@ public class AdvanceConsolidationModel implements IAdvanceConsolidationModel { if (context != null && orderElement != null && isVisibleAdvances()) { org.zkoss.ganttz.data.Task ganttTask = context.getTask(); Date previousStartDate = ganttTask.getBeginDate(); - long previousLength = ganttTask.getLengthMilliseconds(); + Date previousEnd = ganttTask.getEndDate(); createConsolidationIfNeeded(); @@ -158,7 +158,7 @@ public class AdvanceConsolidationModel implements IAdvanceConsolidationModel { updateConsolidationInAdvanceIfIsNeeded(); ganttTask.fireChangesForPreviousValues(previousStartDate, - previousLength); + previousEnd); ganttTask.reloadResourcesText(); context.reloadCharts(); } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/SubcontractModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/SubcontractModel.java index 221594b09..86eb8bc0c 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/SubcontractModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/SubcontractModel.java @@ -125,13 +125,12 @@ public class SubcontractModel implements ISubcontractModel { private void recalculateTaskLength() { Date previousStartDate = ganttTask.getBeginDate(); - long previousLength = ganttTask.getLengthMilliseconds(); + Date previousEnd = ganttTask.getEndDate(); task.setStartDate(startDate); task.setEndDate(endDate); - ganttTask.fireChangesForPreviousValues(previousStartDate, - previousLength); + ganttTask.fireChangesForPreviousValues(previousStartDate, previousEnd); } @Override diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/reassign/ReassignCommand.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/reassign/ReassignCommand.java index 44dcd7b26..9c226d255 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/reassign/ReassignCommand.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/reassign/ReassignCommand.java @@ -46,8 +46,8 @@ import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import org.zkoss.ganttz.adapters.IDomainAndBeansMapper; import org.zkoss.ganttz.data.GanttDiagramGraph; -import org.zkoss.ganttz.data.Task; import org.zkoss.ganttz.data.GanttDiagramGraph.DeferedNotifier; +import org.zkoss.ganttz.data.Task; import org.zkoss.ganttz.extensions.IContext; import org.zkoss.ganttz.util.IAction; import org.zkoss.ganttz.util.LongOperationFeedback; @@ -146,14 +146,13 @@ public class ReassignCommand implements IReassignCommand { for (final WithAssociatedEntity each : reassignations) { Task ganttTask = each.ganntTask; final Date previousBeginDate = ganttTask.getBeginDate(); - final long previousLength = ganttTask - .getLengthMilliseconds(); + final Date previousEnd = ganttTask.getEndDate(); transactionService .runOnReadOnlyTransaction(reassignmentTransaction(each)); diagramGraph.enforceRestrictions(each.ganntTask); ganttTask.fireChangesForPreviousValues(previousBeginDate, - previousLength); + previousEnd); updater.doUpdate(showCompleted(i, total)); i++; }