From 6320ca75f3d3451ad09202ab9b4e2dd830a5a60f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Wed, 6 Oct 2010 19:49:23 +0200 Subject: [PATCH] Do not use ConstraintDate directly in CriticalPathCalculator FEA: ItEr61S08TimeUnitConfigurablePlanning --- .../ganttz/data/constraint/Constraint.java | 37 ++++++++++++++++++- .../criticalpath/CriticalPathCalculator.java | 19 +++------- 2 files changed, 42 insertions(+), 14 deletions(-) diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/constraint/Constraint.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/constraint/Constraint.java index 0126286f4..459983b90 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/constraint/Constraint.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/constraint/Constraint.java @@ -33,6 +33,41 @@ import org.zkoss.ganttz.util.WeakReferencedListeners.IListenerNotification; */ public abstract class Constraint { + public static Constraint coalesce( + Collection> constraints) { + if (constraints.size() == 1) { + return constraints.iterator().next(); + } + return new CompoundConstraint(constraints); + } + + private static class CompoundConstraint extends Constraint { + private final List> constraints; + + CompoundConstraint(Collection> constraints) { + this.constraints = new ArrayList>(constraints); + } + + @Override + protected T applyConstraintTo(T value) { + T result = value; + for (Constraint each : constraints) { + result = each.applyTo(result); + } + return result; + } + + @Override + public boolean isSatisfiedBy(T value) { + for (Constraint each : constraints) { + if (!each.isSatisfiedBy(value)) { + return false; + } + } + return true; + } + } + public static Constraint emptyConstraint() { return new Constraint() { @@ -131,7 +166,7 @@ public abstract class Constraint { return result; } - protected abstract T applyConstraintTo(T currentValue); + protected abstract T applyConstraintTo(T value); public abstract boolean isSatisfiedBy(T value); 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 d7eb34c63..942c61f72 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 @@ -36,7 +36,6 @@ import org.zkoss.ganttz.data.GanttDate; import org.zkoss.ganttz.data.IDependency; import org.zkoss.ganttz.data.ITaskFundamentalProperties; import org.zkoss.ganttz.data.constraint.Constraint; -import org.zkoss.ganttz.data.constraint.DateConstraint; /** * Class that calculates the critical path of a Gantt diagram graph. @@ -142,7 +141,7 @@ public class CriticalPathCalculator { Node node = nodes.get(task); DependencyType dependencyType = getDependencyTypeEndStartByDefault( currentTask, task); - DateConstraint constraint = getDateConstraint(task); + Constraint constraint = getDateConstraint(task); switch (dependencyType) { case START_START: @@ -169,7 +168,7 @@ public class CriticalPathCalculator { } private void setEarliestStart(Node node, int earliestStart, - DateConstraint constraint) { + Constraint constraint) { if (constraint != null) { Date date = initDate.plusDays(earliestStart) .toDateTimeAtStartOfDay().toDate(); @@ -180,7 +179,7 @@ public class CriticalPathCalculator { node.setEarliestStart(earliestStart); } - private DateConstraint getDateConstraint(T task) { + private Constraint getDateConstraint(T task) { if (task == null) { return null; } @@ -189,13 +188,7 @@ public class CriticalPathCalculator { if (constraints == null) { return null; } - - for (Constraint constraint : constraints) { - if (constraint instanceof DateConstraint) { - return (DateConstraint) constraint; - } - } - return null; + return Constraint.coalesce(constraints); } private void backward(Node currentNode, T nextTask) { @@ -221,7 +214,7 @@ public class CriticalPathCalculator { Node node = nodes.get(task); DependencyType dependencyType = getDependencyTypeEndStartByDefault( task, currentTask); - DateConstraint constraint = getDateConstraint(task); + Constraint constraint = getDateConstraint(task); switch (dependencyType) { case START_START: @@ -248,7 +241,7 @@ public class CriticalPathCalculator { } private void setLatestFinish(Node node, int latestFinish, - DateConstraint constraint) { + Constraint constraint) { if (constraint != null) { int duration = node.getDuration(); Date date = initDate.plusDays(latestFinish - duration)