From a11c38d34c304113959d4a32c527f009b913c2b7 Mon Sep 17 00:00:00 2001 From: Diego Pino Date: Tue, 12 Jun 2012 16:02:28 +0200 Subject: [PATCH] Refactoring: Class for creating GanttDiagram Move code in CriticalPathBuilder for creating a Gantt diagram in memory to its own class FEA: ItEr76S04BugFixing --- .../libreplan/web/common/TemplateModel.java | 48 ++-------- .../web/planner/tabs/CriticalPathBuilder.java | 61 +----------- .../web/planner/tabs/GanttDiagramBuilder.java | 94 +++++++++++++++++++ 3 files changed, 106 insertions(+), 97 deletions(-) create mode 100644 libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/GanttDiagramBuilder.java diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/common/TemplateModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/common/TemplateModel.java index 9f7f7765e..9cfc3ad53 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/common/TemplateModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/common/TemplateModel.java @@ -25,7 +25,6 @@ import static org.libreplan.web.I18nHelper._; import java.util.ArrayList; import java.util.Date; -import java.util.HashSet; import java.util.List; import java.util.Map.Entry; import java.util.Set; @@ -52,6 +51,7 @@ import org.libreplan.business.scenarios.entities.Scenario; import org.libreplan.business.users.daos.IUserDAO; import org.libreplan.business.users.entities.User; import org.libreplan.web.UserUtil; +import org.libreplan.web.planner.tabs.GanttDiagramBuilder; import org.libreplan.web.security.SecurityUtils; import org.libreplan.web.users.bootstrap.MandatoryUser; import org.libreplan.web.users.services.CustomUser; @@ -60,13 +60,10 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.zkoss.ganttz.adapters.PlannerConfiguration; import org.zkoss.ganttz.data.ConstraintCalculator; import org.zkoss.ganttz.data.DependencyType; import org.zkoss.ganttz.data.DependencyType.Point; import org.zkoss.ganttz.data.GanttDate; -import org.zkoss.ganttz.data.GanttDiagramGraph; -import org.zkoss.ganttz.data.GanttDiagramGraph.IAdapter; import org.zkoss.ganttz.data.IDependency; import org.zkoss.ganttz.data.constraint.Constraint; import org.zkoss.ganttz.util.LongOperationFeedback; @@ -134,14 +131,17 @@ public class TemplateModel implements ITemplateModel { return visible; } + @Override public TaskElement getSource() { return source; } + @Override public TaskElement getDestination() { return destination; } + @Override public DependencyType getType() { return type; } @@ -369,9 +369,10 @@ public class TemplateModel implements ITemplateModel { private void doReassignationsOn(Order order, Scenario from, Scenario to) { copyAssignments(order, from, to); - installDependenciesEnforcer(order, TemplateModelAdapter.create(to, - asLocalDate(order.getInitDate()), - asLocalDate(order.getDeadline()), resourcesSearcher)); + GanttDiagramBuilder.createForcingDependencies(order, + TemplateModelAdapter.create(to, + asLocalDate(order.getInitDate()), + asLocalDate(order.getDeadline()), resourcesSearcher)); doReassignations(order, to); doTheSaving(order); } @@ -386,39 +387,6 @@ public class TemplateModel implements ITemplateModel { } } - private void installDependenciesEnforcer(Order order, TemplateModelAdapter adapter) { - GanttDiagramGraph graph = createFor(order, adapter); - TaskSource taskSource = order.getTaskSource(); - graph.addTopLevel(taskSource.getTask()); - for (Dependency each : getAllDependencies(order)) { - graph.addWithoutEnforcingConstraints(DependencyWithVisibility - .existent(each)); - } - } - - private GanttDiagramGraph createFor( - Order order, IAdapter adapter) { - List> startConstraints = PlannerConfiguration - .getStartConstraintsGiven((GanttDate) GanttDate.createFrom(order.getInitDate())); - List> endConstraints = PlannerConfiguration - .getEndConstraintsGiven((GanttDate) GanttDate.createFrom(order.getDeadline())); - GanttDiagramGraph result = GanttDiagramGraph - .create(order.isScheduleBackwards(), adapter, startConstraints, - endConstraints, - order.getDependenciesConstraintsHavePriority()); - return result; - } - - private Set getAllDependencies(Order order) { - Set dependencies = new HashSet(); - for (TaskElement each : getTaskElementsFrom(order)) { - Set dependenciesWithThisOrigin = each - .getDependenciesWithThisOrigin(); - dependencies.addAll(dependenciesWithThisOrigin); - } - return dependencies; - } - private void doReassignations(Order order, Scenario scenario) { for (Task each : getTasksFrom(order)) { each.reassignAllocationsWithNewResources(scenario, diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/CriticalPathBuilder.java b/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/CriticalPathBuilder.java index ca6565913..f0266f71c 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/CriticalPathBuilder.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/CriticalPathBuilder.java @@ -21,19 +21,14 @@ package org.libreplan.web.planner.tabs; -import java.util.ArrayList; import java.util.Date; -import java.util.HashSet; import java.util.List; -import java.util.Set; import org.joda.time.LocalDate; import org.libreplan.business.common.IAdHocTransactionService; import org.libreplan.business.common.IOnTransaction; import org.libreplan.business.common.Registry; import org.libreplan.business.orders.entities.Order; -import org.libreplan.business.orders.entities.TaskSource; -import org.libreplan.business.planner.entities.Dependency; import org.libreplan.business.planner.entities.TaskElement; import org.libreplan.business.resources.daos.IResourcesSearcher; import org.libreplan.business.scenarios.entities.Scenario; @@ -42,11 +37,8 @@ import org.libreplan.web.common.TemplateModelAdapter; import org.libreplan.web.planner.order.PlanningStateCreator; import org.libreplan.web.planner.order.PlanningStateCreator.IActionsOnRetrieval; import org.libreplan.web.planner.order.PlanningStateCreator.PlanningState; -import org.zkoss.ganttz.adapters.PlannerConfiguration; -import org.zkoss.ganttz.data.GanttDate; import org.zkoss.ganttz.data.GanttDiagramGraph; import org.zkoss.ganttz.data.GanttDiagramGraph.IAdapter; -import org.zkoss.ganttz.data.constraint.Constraint; import org.zkoss.ganttz.data.criticalpath.CriticalPathCalculator; import org.zkoss.zk.ui.Desktop; @@ -108,16 +100,13 @@ public class CriticalPathBuilder { final Order order = state.getOrder(); final Scenario currentScenario = state.getCurrentScenario(); - CriticalPathCalculator criticalPathCalculator = CriticalPathCalculator - .create(order.getDependenciesConstraintsHavePriority()); IAdapter adapter = TemplateModelAdapter .create(currentScenario, asLocalDate(order.getInitDate()), asLocalDate(order.getDeadline()), resourcesSearcher); - GanttDiagramGraph graph = createFor( - order, adapter); - TaskSource taskSource = order.getTaskSource(); - graph.addTopLevel(taskSource.getTask()); - addDependencies(graph, order); + GanttDiagramGraph graph = GanttDiagramBuilder + .createForcingDependencies(order, adapter); + CriticalPathCalculator criticalPathCalculator = CriticalPathCalculator + .create(order.getDependenciesConstraintsHavePriority()); return criticalPathCalculator.calculateCriticalPath(graph); } @@ -125,46 +114,4 @@ public class CriticalPathBuilder { return date != null ? LocalDate.fromDateFields(date) : null; } - private void addDependencies( - GanttDiagramGraph graph, - Order order) { - for (Dependency each : getAllDependencies(order)) { - graph.addWithoutEnforcingConstraints(DependencyWithVisibility - .existent(each)); - } - } - - private Set getAllDependencies(Order order) { - Set dependencies = new HashSet(); - for (TaskElement each : getTaskElementsFrom(order)) { - Set dependenciesWithThisOrigin = each - .getDependenciesWithThisOrigin(); - dependencies.addAll(dependenciesWithThisOrigin); - } - return dependencies; - } - - private List getTaskElementsFrom(Order order) { - List result = new ArrayList(); - for (TaskSource each : order.getTaskSourcesFromBottomToTop()) { - result.add(each.getTask()); - } - return result; - } - - private GanttDiagramGraph createFor( - Order order, IAdapter adapter) { - GanttDate orderStart = GanttDate.createFrom(order.getInitDate()); - List> startConstraints = PlannerConfiguration - .getStartConstraintsGiven(orderStart); - GanttDate deadline = GanttDate.createFrom(order.getDeadline()); - List> endConstraints = PlannerConfiguration - .getEndConstraintsGiven(deadline); - GanttDiagramGraph result = GanttDiagramGraph - .create(order.isScheduleBackwards(), adapter, startConstraints, - endConstraints, - order.getDependenciesConstraintsHavePriority()); - return result; - } - } \ No newline at end of file diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/GanttDiagramBuilder.java b/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/GanttDiagramBuilder.java new file mode 100644 index 000000000..0b31077e7 --- /dev/null +++ b/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/GanttDiagramBuilder.java @@ -0,0 +1,94 @@ +/* + * This file is part of LibrePlan + * + * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e + * Desenvolvemento Tecnolóxico de Galicia + * Copyright (C) 2010-2012 Igalia, S.L. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.libreplan.web.planner.tabs; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.libreplan.business.orders.entities.Order; +import org.libreplan.business.orders.entities.TaskSource; +import org.libreplan.business.planner.entities.Dependency; +import org.libreplan.business.planner.entities.TaskElement; +import org.libreplan.web.common.TemplateModel.DependencyWithVisibility; +import org.zkoss.ganttz.adapters.PlannerConfiguration; +import org.zkoss.ganttz.data.GanttDate; +import org.zkoss.ganttz.data.GanttDiagramGraph; +import org.zkoss.ganttz.data.GanttDiagramGraph.IAdapter; +import org.zkoss.ganttz.data.constraint.Constraint; + +/** + * + * @author Diego Pino García + * + * Builds a Gantt Diagram in memory, useful for doing operations with a + * Gantt Diagram out of the Gantt View + * + */ +public class GanttDiagramBuilder { + + public static GanttDiagramGraph createForcingDependencies( + Order order, IAdapter adapter) { + GanttDiagramGraph graph = createFor( + order, adapter); + TaskSource taskSource = order.getTaskSource(); + graph.addTopLevel(taskSource.getTask()); + for (Dependency each : getAllDependencies(order)) { + graph.addWithoutEnforcingConstraints(DependencyWithVisibility + .existent(each)); + } + return graph; + } + + private static GanttDiagramGraph createFor( + Order order, IAdapter adapter) { + List> startConstraints = PlannerConfiguration + .getStartConstraintsGiven(GanttDate.createFrom(order.getInitDate())); + List> endConstraints = PlannerConfiguration + .getEndConstraintsGiven(GanttDate.createFrom(order.getDeadline())); + GanttDiagramGraph result = GanttDiagramGraph + .create(order.isScheduleBackwards(), adapter, startConstraints, + endConstraints, + order.getDependenciesConstraintsHavePriority()); + return result; + } + + private static Set getAllDependencies(Order order) { + Set dependencies = new HashSet(); + for (TaskElement each : getTaskElementsFrom(order)) { + Set dependenciesWithThisOrigin = each + .getDependenciesWithThisOrigin(); + dependencies.addAll(dependenciesWithThisOrigin); + } + return dependencies; + } + + private static List getTaskElementsFrom(Order order) { + List result = new ArrayList(); + for (TaskSource each : order.getTaskSourcesFromBottomToTop()) { + result.add(each.getTask()); + } + return result; + } + +} \ No newline at end of file