From 5a7c6686d277c97d92e4c1de1f144acc3150273f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Sun, 19 Jul 2009 17:41:46 +0200 Subject: [PATCH] ItEr17S10CUCreacionProxectoPlanificacionItEr16S12: The adapter is moved to a top level class managed by Spring to allow the posibility of using reatachments. Changes are still not saved. --- .../web/planner/ITaskElementAdapter.java | 15 +++ .../web/planner/OrderPlanningModel.java | 124 ++++-------------- .../web/planner/TaskElementAdapter.java | 110 ++++++++++++++++ .../navalplanner-webapp-spring-config.xml | 4 + 4 files changed, 154 insertions(+), 99 deletions(-) create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/web/planner/ITaskElementAdapter.java create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/web/planner/TaskElementAdapter.java diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/ITaskElementAdapter.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/ITaskElementAdapter.java new file mode 100644 index 000000000..71429e5c6 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/ITaskElementAdapter.java @@ -0,0 +1,15 @@ +package org.navalplanner.web.planner; + +import org.navalplanner.business.orders.entities.Order; +import org.navalplanner.business.planner.entities.TaskElement; +import org.zkoss.ganttz.adapters.IAdapterToTaskFundamentalProperties; + +/** + * Contract for {@link TaskElementAdapter}
+ * @author Óscar González Fernández + */ +public interface ITaskElementAdapter extends IAdapterToTaskFundamentalProperties{ + + void setOrder(Order order); + +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningModel.java index 2c93d802b..48649af3e 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningModel.java @@ -1,124 +1,30 @@ package org.navalplanner.web.planner; -import java.util.ArrayList; import java.util.List; -import java.util.Set; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.orders.entities.Order; -import org.navalplanner.business.orders.entities.OrderElement; import org.navalplanner.business.orders.services.IOrderService; -import org.navalplanner.business.planner.entities.Dependency; import org.navalplanner.business.planner.entities.TaskElement; -import org.navalplanner.business.planner.entities.Dependency.Type; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; -import org.zkoss.ganttz.adapters.DomainDependency; -import org.zkoss.ganttz.adapters.IAdapterToTaskFundamentalProperties; import org.zkoss.ganttz.adapters.IStructureNavigator; import org.zkoss.ganttz.adapters.PlannerConfiguration; -import org.zkoss.ganttz.util.DefaultFundamentalProperties; -import org.zkoss.ganttz.util.DependencyType; -import org.zkoss.ganttz.util.ITaskFundamentalProperties; /** * @author Óscar González Fernández */ @Component @Scope(BeanDefinition.SCOPE_SINGLETON) -public class OrderPlanningModel implements IOrderPlanningModel { +public abstract class OrderPlanningModel implements IOrderPlanningModel { @Autowired private IOrderService orderService; - private final class TaskElementToFundamentalProperties implements - IAdapterToTaskFundamentalProperties { - - private final Order order; - - private List dependenciesCreated = new ArrayList(); - - private TaskElementToFundamentalProperties(Order order) { - this.order = order; - } - - @Override - public ITaskFundamentalProperties adapt(final TaskElement taskElement) { - // FIXME We'll need a custom ITaskFundamentalProperties - // implementation to edit the taskElement - - DefaultFundamentalProperties result = new DefaultFundamentalProperties(); - result.setName(taskElement.getOrderElement().getName()); - result - .setBeginDate(taskElement.getStartDate() != null ? taskElement - .getStartDate() - : order.getInitDate()); - OrderElement orderElement = taskElement.getOrderElement(); - Integer workHours = orderElement.getWorkHours(); - result.setLengthMilliseconds(workHours * 3600l * 1000); - result.setNotes(null); - return result; - } - - @Override - public List> getDependenciesOriginating( - TaskElement taskElement) { - Set dependenciesWithThisOrigin = taskElement - .getDependenciesWithThisOrigin(); - List> result = new ArrayList>(); - for (Dependency dependency : dependenciesWithThisOrigin) { - result.add(DomainDependency.createDependency(taskElement, - dependency.getDestination(), toGanntType(dependency - .getType()))); - } - return result; - } - - private DependencyType toGanntType(Type type) { - switch (type) { - case END_START: - return DependencyType.END_START; - case START_START: - return DependencyType.START_START; - case END_END: - return DependencyType.END_END; - case START_END: - default: - throw new RuntimeException(type + " not supported yet"); - } - } - - private Type toDomainType(DependencyType type) { - switch (type) { - case END_START: - return Type.END_START; - case START_START: - return Type.START_START; - case END_END: - return Type.END_END; - default: - throw new RuntimeException(type + " not supported yet"); - } - } - - @Override - public void addDependency(DomainDependency dependency) { - TaskElement source = dependency.getSource(); - TaskElement destination = dependency.getDestination(); - Type domainType = toDomainType(dependency.getType()); - Dependency domainDependency = Dependency.createDependency(source, - destination, domainType); - - } - - @Override - public boolean canAddDependency(DomainDependency dependency) { - return true; - } - } + private List state; private final class TaskElementNavigator implements IStructureNavigator { @@ -145,11 +51,31 @@ public class OrderPlanningModel implements IOrderPlanningModel { private PlannerConfiguration createConfiguration( Order orderReloaded) { - return new PlannerConfiguration( - new TaskElementToFundamentalProperties(orderReloaded), - new TaskElementNavigator(), orderReloaded.getAssociatedTasks()); + ITaskElementAdapter taskElementAdapter = getTaskElementAdapter(); + taskElementAdapter.setOrder(orderReloaded); + state = orderReloaded.getAssociatedTasks(); + forceLoadOfDependenciesCollections(state); + return new PlannerConfiguration(taskElementAdapter, + new TaskElementNavigator(), state); } + private void forceLoadOfDependenciesCollections(List elements) { + for (TaskElement task : elements) { + forceLoadOfDepedenciesCollections(task); + if (!task.isLeaf()) { + forceLoadOfDependenciesCollections(task.getChildren()); + } + } + } + + private void forceLoadOfDepedenciesCollections(TaskElement task) { + task.getDependenciesWithThisOrigin().size(); + task.getDependenciesWithThisDestination().size(); + } + + // spring method injection + protected abstract ITaskElementAdapter getTaskElementAdapter(); + private Order reload(Order order) { try { return orderService.find(order.getId()); 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 new file mode 100644 index 000000000..c2177d695 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/TaskElementAdapter.java @@ -0,0 +1,110 @@ +package org.navalplanner.web.planner; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import org.navalplanner.business.orders.entities.Order; +import org.navalplanner.business.orders.entities.OrderElement; +import org.navalplanner.business.planner.entities.Dependency; +import org.navalplanner.business.planner.entities.TaskElement; +import org.navalplanner.business.planner.entities.Dependency.Type; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; +import org.zkoss.ganttz.adapters.DomainDependency; +import org.zkoss.ganttz.util.DefaultFundamentalProperties; +import org.zkoss.ganttz.util.DependencyType; +import org.zkoss.ganttz.util.ITaskFundamentalProperties; + +/** + * Responsible of adaptating a {@link TaskElement} into a + * {@link ITaskFundamentalProperties}
+ * This class is managed by spring so version checking and reatachments are + * allowed, but they're not used by now. + * @author Óscar González Fernández + */ +@Component +@Scope(BeanDefinition.SCOPE_SINGLETON) +public class TaskElementAdapter implements ITaskElementAdapter { + + private Order order; + + @Override + public void setOrder(Order order) { + this.order = order; + } + + public TaskElementAdapter() { + } + + @Override + public ITaskFundamentalProperties adapt(final TaskElement taskElement) { + // FIXME We'll need a custom ITaskFundamentalProperties + // implementation to edit the taskElement + + DefaultFundamentalProperties result = new DefaultFundamentalProperties(); + result.setName(taskElement.getOrderElement().getName()); + result.setBeginDate(taskElement.getStartDate() != null ? taskElement + .getStartDate() : order.getInitDate()); + OrderElement orderElement = taskElement.getOrderElement(); + Integer workHours = orderElement.getWorkHours(); + result.setLengthMilliseconds(workHours * 3600l * 1000); + result.setNotes(null); + return result; + } + + @Override + public List> getDependenciesOriginating( + TaskElement taskElement) { + Set dependenciesWithThisOrigin = taskElement + .getDependenciesWithThisOrigin(); + List> result = new ArrayList>(); + for (Dependency dependency : dependenciesWithThisOrigin) { + result.add(DomainDependency.createDependency(taskElement, + dependency.getDestination(), toGanntType(dependency + .getType()))); + } + return result; + } + + private DependencyType toGanntType(Type type) { + switch (type) { + case END_START: + return DependencyType.END_START; + case START_START: + return DependencyType.START_START; + case END_END: + return DependencyType.END_END; + case START_END: + default: + throw new RuntimeException(type + " not supported yet"); + } + } + + private Type toDomainType(DependencyType type) { + switch (type) { + case END_START: + return Type.END_START; + case START_START: + return Type.START_START; + case END_END: + return Type.END_END; + default: + throw new RuntimeException(type + " not supported yet"); + } + } + + @Override + public void addDependency(DomainDependency dependency) { + TaskElement source = dependency.getSource(); + TaskElement destination = dependency.getDestination(); + Type domainType = toDomainType(dependency.getType()); + Dependency.createDependency(source, destination, domainType); + } + + @Override + public boolean canAddDependency(DomainDependency dependency) { + return true; + } +} \ No newline at end of file diff --git a/navalplanner-webapp/src/main/resources/navalplanner-webapp-spring-config.xml b/navalplanner-webapp/src/main/resources/navalplanner-webapp-spring-config.xml index 828662434..bfba9720e 100644 --- a/navalplanner-webapp/src/main/resources/navalplanner-webapp-spring-config.xml +++ b/navalplanner-webapp/src/main/resources/navalplanner-webapp-spring-config.xml @@ -15,5 +15,9 @@ + + + + \ No newline at end of file