From 31a5eb4c25616adaab5e3dafb4d3b1517a28a31f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Thu, 7 Oct 2010 00:14:26 +0200 Subject: [PATCH] Use GanttDates in GanttDiagramGraph when enforcing constraints and dependencies FEA: ItEr61S08TimeUnitConfigurablePlanning --- .../org/zkoss/ganttz/DependencyComponent.java | 10 +- .../java/org/zkoss/ganttz/TaskComponent.java | 8 +- .../ganttz/adapters/PlannerConfiguration.java | 12 +- .../data/DefaultFundamentalProperties.java | 2 +- .../org/zkoss/ganttz/data/Dependency.java | 21 ++-- .../org/zkoss/ganttz/data/DependencyType.java | 30 ++--- .../java/org/zkoss/ganttz/data/GanttDate.java | 4 + .../zkoss/ganttz/data/GanttDiagramGraph.java | 119 ++++++++++-------- .../data/ITaskFundamentalProperties.java | 2 +- .../main/java/org/zkoss/ganttz/data/Task.java | 17 ++- .../criticalpath/CriticalPathCalculator.java | 30 ++--- .../ConstraintOnComparableValuesTest.java | 3 +- .../CriticalPathCalculatorTest.java | 11 +- .../web/common/TemplateModel.java | 56 +++++---- .../web/planner/TaskElementAdapter.java | 20 +-- 15 files changed, 183 insertions(+), 162 deletions(-) diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/DependencyComponent.java b/ganttzk/src/main/java/org/zkoss/ganttz/DependencyComponent.java index 340664856..626f04cac 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/DependencyComponent.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/DependencyComponent.java @@ -22,11 +22,11 @@ package org.zkoss.ganttz; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import java.util.Date; import org.apache.commons.lang.Validate; import org.zkoss.ganttz.data.Dependency; import org.zkoss.ganttz.data.DependencyType; +import org.zkoss.ganttz.data.GanttDate; import org.zkoss.ganttz.data.Task; import org.zkoss.ganttz.data.constraint.Constraint; import org.zkoss.ganttz.data.constraint.Constraint.IConstraintViolationListener; @@ -49,7 +49,7 @@ public class DependencyComponent extends XulElement implements AfterCompose { private Dependency dependency; - private IConstraintViolationListener violationListener; + private IConstraintViolationListener violationListener; public DependencyComponent(TaskComponent source, TaskComponent destination, Dependency dependency) { @@ -62,11 +62,11 @@ public class DependencyComponent extends XulElement implements AfterCompose { this.source = source; this.destination = destination; this.dependency = dependency; - violationListener = new IConstraintViolationListener() { + violationListener = new IConstraintViolationListener() { @Override - public void constraintViolated(Constraint constraint, - Date value) { + public void constraintViolated(Constraint constraint, + GanttDate value) { // TODO mark graphically dependency as violated } }; diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/TaskComponent.java b/ganttzk/src/main/java/org/zkoss/ganttz/TaskComponent.java index 64c950f2e..607f40f45 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/TaskComponent.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/TaskComponent.java @@ -193,11 +193,11 @@ public class TaskComponent extends Div implements AfterCompose { setId(UUID.randomUUID().toString()); this.disabilityConfiguration = disabilityConfiguration; - taskViolationListener = new IConstraintViolationListener() { + taskViolationListener = new IConstraintViolationListener() { @Override - public void constraintViolated(Constraint constraint, - Date value) { + public void constraintViolated(Constraint constraint, + GanttDate value) { // TODO mark graphically task as violated } }; @@ -291,7 +291,7 @@ public class TaskComponent extends Div implements AfterCompose { private final Task task; private transient PropertyChangeListener propertiesListener; - private IConstraintViolationListener taskViolationListener; + private IConstraintViolationListener taskViolationListener; public TaskRow getRow() { if (getParent() == null) { diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/adapters/PlannerConfiguration.java b/ganttzk/src/main/java/org/zkoss/ganttz/adapters/PlannerConfiguration.java index 5327345e3..88eedde3b 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/adapters/PlannerConfiguration.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/adapters/PlannerConfiguration.java @@ -31,6 +31,7 @@ import java.util.Map; import org.apache.commons.lang.Validate; import org.zkoss.ganttz.Planner; +import org.zkoss.ganttz.data.GanttDate; import org.zkoss.ganttz.data.GanttDiagramGraph.IGraphChangeListener; import org.zkoss.ganttz.data.constraint.Constraint; import org.zkoss.ganttz.extensions.ICommand; @@ -264,12 +265,13 @@ public class PlannerConfiguration implements IDisabilityConfiguration { this.editingDatesEnabled = editingDatesEnabled; } - public List> getStartConstraints() { - return getStartConstraintsGiven(this.notBeforeThan); + public List> getStartConstraints() { + return getStartConstraintsGiven(GanttDate + .createFrom(this.notBeforeThan)); } - public static List> getStartConstraintsGiven( - Date notBeforeThan) { + public static List> getStartConstraintsGiven( + GanttDate notBeforeThan) { if (notBeforeThan != null) { return Collections.singletonList(biggerOrEqualThan(notBeforeThan)); } else { @@ -277,7 +279,7 @@ public class PlannerConfiguration implements IDisabilityConfiguration { } } - public List> getEndConstraints() { + public List> getEndConstraints() { return Collections.emptyList(); } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/DefaultFundamentalProperties.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/DefaultFundamentalProperties.java index 4b7397aa7..eb40111b3 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/DefaultFundamentalProperties.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/DefaultFundamentalProperties.java @@ -177,7 +177,7 @@ public class DefaultFundamentalProperties implements ITaskFundamentalProperties } @Override - public List> getStartConstraints() { + public List> getStartConstraints() { return Collections.emptyList(); } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/Dependency.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/Dependency.java index 5b6efe863..2b1da2a6e 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/Dependency.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/Dependency.java @@ -22,7 +22,6 @@ package org.zkoss.ganttz.data; import java.util.ArrayList; import java.util.Collection; -import java.util.Date; import java.util.List; import org.apache.commons.lang.builder.EqualsBuilder; @@ -43,36 +42,36 @@ public class Dependency implements IDependency { private enum Calculation { START { @Override - public List> toConstraints(Task source, + public List> toConstraints(Task source, DependencyType type) { return type.getStartConstraints(source); } }, END { @Override - public List> toConstraints(Task source, + public List> toConstraints(Task source, DependencyType type) { return type.getEndConstraints(source); } }; - abstract List> toConstraints(Task source, + abstract List> toConstraints(Task source, DependencyType type); } - public static List> getStartConstraints( + public static List> getStartConstraints( Collection dependencies) { return getConstraintsFor(dependencies, Calculation.START); } - public static List> getEndConstraints( + public static List> getEndConstraints( Collection incoming) { return getConstraintsFor(incoming, Calculation.END); } - private static List> getConstraintsFor( + private static List> getConstraintsFor( Collection dependencies, Calculation calculation) { - List> result = new ArrayList>(); + List> result = new ArrayList>(); for (Dependency dependency : dependencies) { result.addAll(dependency.toConstraints(calculation)); } @@ -87,7 +86,7 @@ public class Dependency implements IDependency { private final boolean visible; - private ConstraintViolationNotificator violationsNotificator = ConstraintViolationNotificator + private ConstraintViolationNotificator violationsNotificator = ConstraintViolationNotificator .create(); public Dependency(Task source, Task destination, @@ -112,13 +111,13 @@ public class Dependency implements IDependency { this(source, destination, type, true); } - private List> toConstraints(Calculation calculation) { + private List> toConstraints(Calculation calculation) { return violationsNotificator.withListener(calculation.toConstraints( source, type)); } public void addConstraintViolationListener( - IConstraintViolationListener listener) { + IConstraintViolationListener listener) { violationsNotificator.addConstraintViolationListener(listener); } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/DependencyType.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/DependencyType.java index e2d724366..4784b8e2a 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/DependencyType.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/DependencyType.java @@ -49,12 +49,12 @@ public enum DependencyType { return current; } - public List> getStartConstraints(V source, + public List> getStartConstraints(V source, IAdapter adapter) { return Collections.emptyList(); } - public List> getEndConstraints(V source, + public List> getEndConstraints(V source, IAdapter adapter) { return Collections.emptyList(); } @@ -78,13 +78,13 @@ public enum DependencyType { current); } - public List> getStartConstraints(V source, + public List> getStartConstraints(V source, IAdapter adapter) { return Collections.singletonList(biggerThanTaskEndDate(adapter, source)); } - public List> getEndConstraints(V source, + public List> getEndConstraints(V source, GanttDiagramGraph.IAdapter adapter) { return Collections.emptyList(); } @@ -108,13 +108,13 @@ public enum DependencyType { current); } - public List> getStartConstraints(V source, + public List> getStartConstraints(V source, GanttDiagramGraph.IAdapter adapter) { return Collections.singletonList(biggerThanTaskStartDate(adapter, source)); } - public List> getEndConstraints(V source, + public List> getEndConstraints(V source, GanttDiagramGraph.IAdapter adapter) { return Collections.emptyList(); } @@ -143,25 +143,25 @@ public enum DependencyType { } @Override - public List> getEndConstraints(V source, + public List> getEndConstraints(V source, IAdapter adapter) { return Collections.singletonList(biggerThanTaskEndDate(adapter, source)); } @Override - public List> getStartConstraints(V source, + public List> getStartConstraints(V source, IAdapter adapter) { return Collections.emptyList(); } }; - protected Constraint biggerThanTaskEndDate( + protected Constraint biggerThanTaskEndDate( IAdapter adapter, V source) { return biggerOrEqualThan(adapter.getEndDateFor(source)); } - protected Constraint biggerThanTaskStartDate( + protected Constraint biggerThanTaskStartDate( IAdapter adapter, V source) { return biggerOrEqualThan(adapter.getStartDate(source)); } @@ -179,18 +179,18 @@ public enum DependencyType { public abstract Date calculateStartDestinyTask(Task originTask, Date current); - public final List> getStartConstraints(Task source) { + public final List> getStartConstraints(Task source) { return getStartConstraints(source, GanttDiagramGraph.taskAdapter()); } - public abstract List> getStartConstraints(V source, - IAdapter adapter); + public abstract List> getStartConstraints( + V source, IAdapter adapter); - public final List> getEndConstraints(Task source) { + public final List> getEndConstraints(Task source) { return getEndConstraints(source, GanttDiagramGraph.taskAdapter()); } - public abstract List> getEndConstraints(V source, + public abstract List> getEndConstraints(V source, IAdapter adapter); public abstract PointType getPointModified(); diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/GanttDate.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/GanttDate.java index 6929e5fca..92c8fb74a 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/GanttDate.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/GanttDate.java @@ -199,4 +199,8 @@ public abstract class GanttDate implements Comparable { protected abstract int compareToLocalDate(LocalDate localDate); } + public boolean after(GanttDate other) { + return compareTo(other) > 0; + } + } 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 f50739ecb..df0a2032b 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/GanttDiagramGraph.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/GanttDiagramGraph.java @@ -23,7 +23,6 @@ package org.zkoss.ganttz.data; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; @@ -85,25 +84,27 @@ public class GanttDiagramGraph { void registerDependenciesEnforcerHookOn(V task, IDependenciesEnforcerHookFactory hookFactory); - Date getStartDate(V task); + GanttDate getStartDate(V task); - void setStartDateFor(V task, Date newStart); + void setStartDateFor(V task, GanttDate newStart); - Date getEndDateFor(V task); + GanttDate getEndDateFor(V task); - void setEndDateFor(V task, Date newEnd); + void setEndDateFor(V task, GanttDate newEnd); - Date getSmallestBeginDateFromChildrenFor(V container); + GanttDate getSmallestBeginDateFromChildrenFor(V container); - Constraint getCurrentLenghtConstraintFor(V task); + Constraint getCurrentLenghtConstraintFor(V task); - Constraint getEndDateBiggerThanStartDateConstraintFor(V task); + Constraint getEndDateBiggerThanStartDateConstraintFor(V task); - List> getEndConstraintsGivenIncoming(Set incoming); + List> getEndConstraintsGivenIncoming( + Set incoming); - List> getStartCosntraintsGiven(Set withDependencies); + List> getStartConstraintsGiven( + Set withDependencies); - List> getStartConstraintsFor(V task); + List> getStartConstraintsFor(V task); V getSource(D dependency); @@ -179,57 +180,57 @@ public class GanttDiagramGraph { } @Override - public Date getEndDateFor(Task task) { - return task.getEndDate().toDateApproximation(); + public GanttDate getEndDateFor(Task task) { + return task.getEndDate(); } @Override - public Constraint getCurrentLenghtConstraintFor(Task task) { + public Constraint getCurrentLenghtConstraintFor(Task task) { return task.getCurrentLengthConstraint(); } @Override - public Constraint getEndDateBiggerThanStartDateConstraintFor( + public Constraint getEndDateBiggerThanStartDateConstraintFor( Task task) { return task.getEndDateBiggerThanStartDate(); } @Override - public List> getEndConstraintsGivenIncoming( + public List> getEndConstraintsGivenIncoming( Set incoming) { return Dependency.getEndConstraints(incoming); } @Override - public void setEndDateFor(Task task, Date newEnd) { - task.setEndDate(GanttDate.createFrom(newEnd)); + public void setEndDateFor(Task task, GanttDate newEnd) { + task.setEndDate(newEnd); } @Override - public Date getStartDate(Task task) { - return task.getBeginDate().toDateApproximation(); + public GanttDate getStartDate(Task task) { + return task.getBeginDate(); } @Override - public void setStartDateFor(Task task, Date newStart) { - task.setBeginDate(GanttDate.createFrom(newStart)); + public void setStartDateFor(Task task, GanttDate newStart) { + task.setBeginDate(newStart); } @Override - public List> getStartCosntraintsGiven( + public List> getStartConstraintsGiven( Set withDependencies) { return Dependency.getStartConstraints(withDependencies); } @Override - public List> getStartConstraintsFor(Task task) { + public List> getStartConstraintsFor(Task task) { return task.getStartConstraints(); } @Override - public Date getSmallestBeginDateFromChildrenFor(Task container) { + public GanttDate getSmallestBeginDateFromChildrenFor(Task container) { return ((TaskContainer) container) - .getSmallestBeginDateFromChildren().toDateApproximation(); + .getSmallestBeginDateFromChildren(); } @Override @@ -244,8 +245,8 @@ public class GanttDiagramGraph { ICriticalPathCalculable { private GanttZKDiagramGraph( - List> globalStartConstraints, - List> globalEndConstraints, + List> globalStartConstraints, + List> globalEndConstraints, boolean dependenciesConstraintsHavePriority) { super(GANTTZK_ADAPTER, globalStartConstraints, globalEndConstraints, @@ -259,8 +260,8 @@ public class GanttDiagramGraph { } public static GanttZKDiagramGraph create( - List> globalStartConstraints, - List> globalEndConstraints, + List> globalStartConstraints, + List> globalEndConstraints, boolean dependenciesConstraintsHavePriority) { return new GanttZKDiagramGraph(globalStartConstraints, globalEndConstraints, dependenciesConstraintsHavePriority); @@ -274,9 +275,9 @@ public class GanttDiagramGraph { private Map fromChildToParent = new HashMap(); - private final List> globalStartConstraints; + private final List> globalStartConstraints; - private final List> globalEndConstraints; + private final List> globalEndConstraints; private DependenciesEnforcer enforcer = new DependenciesEnforcer(); @@ -344,16 +345,16 @@ public class GanttDiagramGraph { } public static GanttDiagramGraph create(IAdapter adapter, - List> globalStartConstraints, - List> globalEndConstraints, + List> globalStartConstraints, + List> globalEndConstraints, boolean dependenciesConstraintsHavePriority) { return new GanttDiagramGraph(adapter, globalStartConstraints, globalEndConstraints, dependenciesConstraintsHavePriority); } protected GanttDiagramGraph(IAdapter adapter, - List> globalStartConstraints, - List> globalEndConstraints, + List> globalStartConstraints, + List> globalEndConstraints, boolean dependenciesConstraintsHavePriority) { this.adapter = adapter; this.globalStartConstraints = globalStartConstraints; @@ -849,10 +850,10 @@ public class GanttDiagramGraph { } boolean enforceParentShrinkage(V container) { - Date oldBeginDate = adapter.getStartDate(container); - Date firstStart = adapter + GanttDate oldBeginDate = adapter.getStartDate(container); + GanttDate firstStart = adapter .getSmallestBeginDateFromChildrenFor(container); - Date previousEnd = adapter.getEndDateFor(container); + GanttDate previousEnd = adapter.getEndDateFor(container); if (firstStart.after(oldBeginDate)) { adapter.setStartDateFor(container, firstStart); adapter.setEndDateFor(container, previousEnd); @@ -1019,7 +1020,7 @@ public class GanttDiagramGraph { private boolean enforceStartAndEnd(V task) { Set incoming = graph.incomingEdgesOf(task); - Date previousEndDate = adapter.getEndDateFor(task); + GanttDate previousEndDate = adapter.getEndDateFor(task); boolean startDateChanged = enforceStartDate(task, incoming); boolean endDateChanged = !parentRecalculation && enforceEndDate(task, previousEndDate, incoming); @@ -1028,26 +1029,27 @@ public class GanttDiagramGraph { private boolean enforceEnd(V task) { Set incoming = graph.incomingEdgesOf(task); - Date previousEndDate = adapter.getEndDateFor(task); + GanttDate previousEndDate = adapter.getEndDateFor(task); return enforceEndDate(task, previousEndDate, incoming); } @SuppressWarnings("unchecked") - private boolean enforceEndDate(V task, Date previousEndDate, + private boolean enforceEndDate(V task, GanttDate previousEndDate, Set incoming) { if (adapter.isFixed(task)) { return false; } - Constraint currentLength = adapter + Constraint currentLength = adapter .getCurrentLenghtConstraintFor(task); - Constraint respectStartDate = adapter + Constraint respectStartDate = adapter .getEndDateBiggerThanStartDateConstraintFor(task); - Date newEnd = Constraint. initialValue(null) + GanttDate newEnd = Constraint + . initialValue(null) .withConstraints(currentLength) .withConstraints(adapter.getEndConstraintsGivenIncoming(incoming)) .withConstraints(respectStartDate) .apply(); - if (!adapter.getEndDateFor(task).equals(newEnd)) { + if (hasChanged(previousEndDate, newEnd)) { adapter.setEndDateFor(task, newEnd); } return !previousEndDate.equals(newEnd); @@ -1057,26 +1059,35 @@ public class GanttDiagramGraph { if (adapter.isFixed(task)) { return false; } - Date newStart = calculateStartDateFor(task, incoming); - if (!adapter.getStartDate(task).equals(newStart)) { + GanttDate newStart = calculateStartDateFor(task, incoming); + GanttDate old = adapter.getStartDate(task); + if (hasChanged(old, newStart)) { adapter.setStartDateFor(task, newStart); return true; } return false; } - private Date calculateStartDateFor(V task, Set withDependencies) { - List> dependencyConstraints = adapter - .getStartCosntraintsGiven(withDependencies); - Date newStart; + private boolean hasChanged(GanttDate old, GanttDate newValue) { + if (old == newValue) { + return false; + } + return (old == null) != (newValue == null) + || old.compareTo(newValue) != 0; + } + + private GanttDate calculateStartDateFor(V task, Set withDependencies) { + List> dependencyConstraints = adapter + .getStartConstraintsGiven(withDependencies); + GanttDate newStart; if (dependenciesConstraintsHavePriority) { - newStart = Constraint. initialValue(null) + newStart = Constraint. initialValue(null) .withConstraints(adapter.getStartConstraintsFor(task)) .withConstraints(dependencyConstraints) .withConstraints(globalStartConstraints).apply(); } else { - newStart = Constraint. initialValue(null) + newStart = Constraint. initialValue(null) .withConstraints(dependencyConstraints) .withConstraints(adapter.getStartConstraintsFor(task)) .withConstraints(globalStartConstraints).apply(); diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/ITaskFundamentalProperties.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/ITaskFundamentalProperties.java index d5d28befd..3f0ea8bea 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/ITaskFundamentalProperties.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/ITaskFundamentalProperties.java @@ -74,7 +74,7 @@ public interface ITaskFundamentalProperties { public String getResourcesText(); - List> getStartConstraints(); + List> getStartConstraints(); public void moveTo(GanttDate date); 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 5e196bf76..132a6ba4b 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/Task.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/Task.java @@ -70,7 +70,7 @@ public abstract class Task implements ITaskFundamentalProperties { private boolean inCriticalPath = false; - private ConstraintViolationNotificator violationNotificator = ConstraintViolationNotificator + private ConstraintViolationNotificator violationNotificator = ConstraintViolationNotificator .create(); private IDependenciesEnforcerHook dependenciesEnforcerHook = GanttDiagramGraph.doNothingHook(); @@ -102,7 +102,7 @@ public abstract class Task implements ITaskFundamentalProperties { } @Override - public List> getStartConstraints() { + public List> getStartConstraints() { return violationNotificator.withListener(fundamentalProperties .getStartConstraints()); } @@ -217,18 +217,17 @@ public abstract class Task implements ITaskFundamentalProperties { return fundamentalProperties.getEndDate(); } - public Constraint getCurrentLengthConstraint() { + public Constraint getCurrentLengthConstraint() { if (isContainer()) { return Constraint.emptyConstraint(); } - return violationNotificator.withListener(biggerOrEqualThan(getEndDate() - .toDateApproximation())); + return violationNotificator + .withListener(biggerOrEqualThan(getEndDate())); } - public Constraint getEndDateBiggerThanStartDate() { + public Constraint getEndDateBiggerThanStartDate() { return violationNotificator - .withListener(biggerOrEqualThan(getBeginDate() - .toDateApproximation())); + .withListener(biggerOrEqualThan(getBeginDate())); } public String getNotes() { @@ -327,7 +326,7 @@ public abstract class Task implements ITaskFundamentalProperties { } public void addConstraintViolationListener( - IConstraintViolationListener listener) { + IConstraintViolationListener listener) { violationNotificator.addConstraintViolationListener(listener); } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/criticalpath/CriticalPathCalculator.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/criticalpath/CriticalPathCalculator.java index 942c61f72..239999306 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/criticalpath/CriticalPathCalculator.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/criticalpath/CriticalPathCalculator.java @@ -22,7 +22,6 @@ package org.zkoss.ganttz.data.criticalpath; import java.util.ArrayList; import java.util.Collections; -import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -141,7 +140,7 @@ public class CriticalPathCalculator { Node node = nodes.get(task); DependencyType dependencyType = getDependencyTypeEndStartByDefault( currentTask, task); - Constraint constraint = getDateConstraint(task); + Constraint constraint = getDateConstraint(task); switch (dependencyType) { case START_START: @@ -168,23 +167,24 @@ public class CriticalPathCalculator { } private void setEarliestStart(Node node, int earliestStart, - Constraint constraint) { + Constraint constraint) { if (constraint != null) { - Date date = initDate.plusDays(earliestStart) - .toDateTimeAtStartOfDay().toDate(); + GanttDate date = GanttDate.createFrom(initDate + .plusDays(earliestStart)); date = constraint.applyTo(date); - earliestStart = Days.daysBetween(initDate, new LocalDate(date)) + earliestStart = Days.daysBetween(initDate, + LocalDate.fromDateFields(date.toDateApproximation())) .getDays(); } node.setEarliestStart(earliestStart); } - private Constraint getDateConstraint(T task) { + private Constraint getDateConstraint(T task) { if (task == null) { return null; } - List> constraints = task.getStartConstraints(); + List> constraints = task.getStartConstraints(); if (constraints == null) { return null; } @@ -214,7 +214,7 @@ public class CriticalPathCalculator { Node node = nodes.get(task); DependencyType dependencyType = getDependencyTypeEndStartByDefault( task, currentTask); - Constraint constraint = getDateConstraint(task); + Constraint constraint = getDateConstraint(task); switch (dependencyType) { case START_START: @@ -241,15 +241,15 @@ public class CriticalPathCalculator { } private void setLatestFinish(Node node, int latestFinish, - Constraint constraint) { + Constraint constraint) { if (constraint != null) { int duration = node.getDuration(); - Date date = initDate.plusDays(latestFinish - duration) - .toDateTimeAtStartOfDay().toDate(); + GanttDate date = GanttDate.createFrom(initDate.plusDays(latestFinish - duration)); date = constraint.applyTo(date); - latestFinish = Days.daysBetween(initDate, new LocalDate(date)) - .getDays() - + duration; + int daysBetween = Days.daysBetween(initDate, + LocalDate.fromDateFields(date.toDateApproximation())) + .getDays(); + latestFinish = daysBetween + duration; } node.setLatestFinish(latestFinish); } diff --git a/ganttzk/src/test/java/org/zkoss/ganttz/data/constraint/ConstraintOnComparableValuesTest.java b/ganttzk/src/test/java/org/zkoss/ganttz/data/constraint/ConstraintOnComparableValuesTest.java index 9087bf231..6b3785ebc 100644 --- a/ganttzk/src/test/java/org/zkoss/ganttz/data/constraint/ConstraintOnComparableValuesTest.java +++ b/ganttzk/src/test/java/org/zkoss/ganttz/data/constraint/ConstraintOnComparableValuesTest.java @@ -44,7 +44,8 @@ public class ConstraintOnComparableValuesTest { @Test public void biggerOrEqualThanNullLeaveValuesUnmodified() { - Constraint biggerThanNull = biggerOrEqualThan(null); + Constraint biggerThanNull = ConstraintOnComparableValues + . biggerOrEqualThan(null); Date eraStart = new Date(0); assertThat(biggerThanNull.applyConstraintTo(new Date(0)), equalTo(eraStart)); diff --git a/ganttzk/src/test/java/org/zkoss/ganttz/data/criticalpath/CriticalPathCalculatorTest.java b/ganttzk/src/test/java/org/zkoss/ganttz/data/criticalpath/CriticalPathCalculatorTest.java index aa6ac427d..7bd0dce54 100644 --- a/ganttzk/src/test/java/org/zkoss/ganttz/data/criticalpath/CriticalPathCalculatorTest.java +++ b/ganttzk/src/test/java/org/zkoss/ganttz/data/criticalpath/CriticalPathCalculatorTest.java @@ -29,7 +29,6 @@ import static org.junit.Assert.assertThat; import static org.zkoss.ganttz.data.constraint.ConstraintOnComparableValues.biggerOrEqualThan; import java.util.Arrays; -import java.util.Date; import java.util.HashSet; import java.util.List; @@ -70,9 +69,8 @@ public class CriticalPathCalculatorTest { expect(result.getBeginDate()).andReturn(toDate(start)).anyTimes(); expect(result.getEndDate()).andReturn( toDate(start.plusDays(durationDays))).anyTimes(); - - Constraint constraint = biggerOrEqualThan(date - .toDateTimeAtStartOfDay().toDate()); + GanttDate ganttDate = GanttDate.createFrom(date); + Constraint constraint = biggerOrEqualThan(ganttDate); expect(result.getStartConstraints()).andReturn( Arrays.asList(constraint)).anyTimes(); @@ -87,8 +85,9 @@ public class CriticalPathCalculatorTest { expect(result.getEndDate()).andReturn( toDate(start.plusDays(durationDays))).anyTimes(); - Constraint constraint = ConstraintOnComparableValues.equalTo(date - .toDateTimeAtStartOfDay().toDate()); + GanttDate ganttDate = GanttDate.createFrom(date); + Constraint constraint = ConstraintOnComparableValues + .equalTo(ganttDate); expect(result.getStartConstraints()).andReturn( Arrays.asList(constraint)).anyTimes(); 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 a5723b131..e56bfcdb3 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 @@ -21,11 +21,12 @@ package org.navalplanner.web.common; import static org.navalplanner.business.i18n.I18nHelper._; +import static org.navalplanner.web.planner.TaskElementAdapter.toGantt; +import static org.navalplanner.web.planner.TaskElementAdapter.toIntraDay; import static org.zkoss.ganttz.data.constraint.ConstraintOnComparableValues.biggerOrEqualThan; import java.util.ArrayList; import java.util.Collections; -import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Map.Entry; @@ -102,10 +103,9 @@ public class TemplateModel implements ITemplateModel { .getDestination(), toGraphicalType(each.getType()), true); } - public static List> getStartConstraintsGiven( - Adapter adapter, - Set withDependencies) { - List> result = new ArrayList>(); + public static List> getStartConstraintsGiven( + Adapter adapter, Set withDependencies) { + List> result = new ArrayList>(); for (DependencyWithVisibility each : withDependencies) { TaskElement source = each.getSource(); DependencyType type = each.getGraphicalType(); @@ -114,10 +114,10 @@ public class TemplateModel implements ITemplateModel { return result; } - public static List> getEndConstraintsGiven( + public static List> getEndConstraintsGiven( Adapter adapter, Set withDependencies) { - List> result = new ArrayList>(); + List> result = new ArrayList>(); for (DependencyWithVisibility each : withDependencies) { TaskElement source = each.getSource(); DependencyType type = each.getGraphicalType(); @@ -235,14 +235,15 @@ public class TemplateModel implements ITemplateModel { } @Override - public List> getEndConstraintsGivenIncoming( + public List> getEndConstraintsGivenIncoming( Set incoming) { return DependencyWithVisibility.getEndConstraintsGiven(this, incoming); } @Override - public Constraint getCurrentLenghtConstraintFor(TaskElement task) { + public Constraint getCurrentLenghtConstraintFor( + TaskElement task) { if (isContainer(task)) { return Constraint.emptyConstraint(); } @@ -267,22 +268,21 @@ public class TemplateModel implements ITemplateModel { } @Override - public Constraint getEndDateBiggerThanStartDateConstraintFor( + public Constraint getEndDateBiggerThanStartDateConstraintFor( TaskElement task) { return biggerOrEqualThan(getStartDate(task)); } @Override - public Date getEndDateFor(TaskElement task) { - return task.getEndDate(); + public GanttDate getEndDateFor(TaskElement task) { + return toGantt(task.getIntraDayEndDate()); } @Override - public Date getSmallestBeginDateFromChildrenFor(TaskElement container) { + public GanttDate getSmallestBeginDateFromChildrenFor( + TaskElement container) { TaskGroup taskGroup = (TaskGroup) container; - IntraDayDate smallestStart = taskGroup - .getSmallestStartDateFromChildren(); - return smallestStart.toDateTimeAtStartOfDay().toDate(); + return toGantt(taskGroup.getSmallestStartDateFromChildren()); } @Override @@ -291,20 +291,21 @@ public class TemplateModel implements ITemplateModel { } @Override - public List> getStartConstraintsFor(TaskElement task) { + public List> getStartConstraintsFor( + TaskElement task) { return TaskElementAdapter.getStartConstraintsFor(task); } @Override - public List> getStartCosntraintsGiven( + public List> getStartConstraintsGiven( Set withDependencies) { return DependencyWithVisibility.getStartConstraintsGiven(this, withDependencies); } @Override - public Date getStartDate(TaskElement task) { - return task.getStartDate(); + public GanttDate getStartDate(TaskElement task) { + return toGantt(task.getIntraDayStartDate()); } @Override @@ -330,13 +331,13 @@ public class TemplateModel implements ITemplateModel { } @Override - public void setEndDateFor(TaskElement task, Date newEnd) { - task.setEndDate(newEnd); + public void setEndDateFor(TaskElement task, GanttDate newEnd) { + task.setIntraDayEndDate(toIntraDay(newEnd)); } @Override - public void setStartDateFor(TaskElement task, Date newStart) { - task.moveTo(scenario, LocalDate.fromDateFields(newStart)); + public void setStartDateFor(TaskElement task, GanttDate newStart) { + task.moveTo(scenario, toIntraDay(newStart)); } @Override @@ -565,9 +566,10 @@ public class TemplateModel implements ITemplateModel { private GanttDiagramGraph createFor( Order order, IAdapter adapter) { - List> startConstraints = PlannerConfiguration - .getStartConstraintsGiven(order.getInitDate()); - List> endConstraints = Collections.emptyList(); + List> startConstraints = PlannerConfiguration + .getStartConstraintsGiven(GanttDate.createFrom(order + .getInitDate())); + List> endConstraints = Collections.emptyList(); GanttDiagramGraph result = GanttDiagramGraph .create(adapter, startConstraints, endConstraints, order.getDependenciesConstraintsHavePriority()); diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/TaskElementAdapter.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/TaskElementAdapter.java index 32139738b..8ba69357f 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/TaskElementAdapter.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/TaskElementAdapter.java @@ -99,7 +99,7 @@ public class TaskElementAdapter implements ITaskElementAdapter { this.preventCalculateResourcesText = preventCalculateResourcesText; } - public static List> getStartConstraintsFor( + public static List> getStartConstraintsFor( TaskElement taskElement) { if (taskElement instanceof ITaskLeafConstraint) { ITaskLeafConstraint task = (ITaskLeafConstraint) taskElement; @@ -110,11 +110,12 @@ public class TaskElementAdapter implements ITaskElementAdapter { case AS_SOON_AS_POSSIBLE: return Collections.emptyList(); case START_IN_FIXED_DATE: - return Collections.singletonList(equalTo(asDate(startConstraint + return Collections + .singletonList(equalTo(toGantt(startConstraint .getConstraintDate()))); case START_NOT_EARLIER_THAN: return Collections - .singletonList(biggerOrEqualThan(asDate(startConstraint + .singletonList(biggerOrEqualThan(toGantt(startConstraint .getConstraintDate()))); default: throw new RuntimeException("can't handle " + constraintType); @@ -124,10 +125,6 @@ public class TaskElementAdapter implements ITaskElementAdapter { } } - private static Date asDate(LocalDate date) { - return date.toDateTimeAtStartOfDay().toDate(); - } - @Autowired private IAdHocTransactionService transactionService; @@ -161,6 +158,13 @@ public class TaskElementAdapter implements ITaskElementAdapter { return new GanttDateAdapter(date); } + public static GanttDate toGantt(LocalDate date) { + if (date == null) { + return null; + } + return GanttDate.createFrom(date); + } + public static IntraDayDate toIntraDay(GanttDate date) { if (date == null) { return null; @@ -605,7 +609,7 @@ public class TaskElementAdapter implements ITaskElementAdapter { } @Override - public List> getStartConstraints() { + public List> getStartConstraints() { return getStartConstraintsFor(this.taskElement); }