diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/IOrderPlanningModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/IOrderPlanningModel.java new file mode 100644 index 000000000..3c9e31811 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/IOrderPlanningModel.java @@ -0,0 +1,19 @@ +package org.navalplanner.web.planner; + +import org.navalplanner.business.orders.entities.Order; +import org.navalplanner.business.planner.entities.TaskElement; +import org.zkoss.ganttz.adapters.PlannerConfiguration; + +/** + * @author Óscar González Fernández + */ +public interface IOrderPlanningModel { + + public interface ConfigurationOnTransaction { + public void use(PlannerConfiguration configuration); + } + + void createConfiguration(Order order, + ConfigurationOnTransaction onTransaction); + +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningController.java index a4a996014..9859dcebb 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningController.java @@ -1,15 +1,16 @@ package org.navalplanner.web.planner; import org.navalplanner.business.orders.entities.Order; +import org.navalplanner.business.planner.entities.TaskElement; import org.navalplanner.web.common.entrypoints.IURLHandlerRegistry; import org.navalplanner.web.common.entrypoints.URLHandler; +import org.navalplanner.web.planner.IOrderPlanningModel.ConfigurationOnTransaction; 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.zkoss.ganttz.Planner; import org.zkoss.ganttz.adapters.PlannerConfiguration; -import org.zkoss.ganttz.util.ITaskFundamentalProperties; /** * @author Óscar González Fernández @@ -22,6 +23,9 @@ public class OrderPlanningController implements @Autowired private IURLHandlerRegistry urlHandlerRegistry; + @Autowired + private IOrderPlanningModel model; + private Planner planner; public OrderPlanningController() { @@ -29,10 +33,13 @@ public class OrderPlanningController implements @Override public void showSchedule(Order order) { - PlannerConfiguration configuration = new DataForPlanner() - .getMediumLoad(); - // TODO just for trying passing medium load - planner.setConfiguration(configuration); + model.createConfiguration(order, new ConfigurationOnTransaction() { + + @Override + public void use(PlannerConfiguration configuration) { + planner.setConfiguration(configuration); + } + }); } public void registerPlanner(Planner planner) { 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 new file mode 100644 index 000000000..ec22e66b1 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningModel.java @@ -0,0 +1,131 @@ +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 { + + @Autowired + private IOrderService orderService; + + private final class TaskElementToFundamentalProperties implements + IAdapterToTaskFundamentalProperties { + + private final Order order; + + 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 final class TaskElementNavigator implements + IStructureNavigator { + @Override + public List getChildren(TaskElement object) { + return object.getChildren(); + } + + @Override + public boolean isLeaf(TaskElement object) { + return object.isLeaf(); + } + } + + @Transactional(readOnly = true) + public void createConfiguration(Order order, + ConfigurationOnTransaction onTransaction) { + Order orderReloaded = reload(order); + if (!orderReloaded.isSomeTaskElementScheduled()) + throw new IllegalArgumentException("the order " + order + + " must be scheduled"); + onTransaction.use(createConfiguration(orderReloaded)); + } + + private PlannerConfiguration createConfiguration( + Order orderReloaded) { + return new PlannerConfiguration( + new TaskElementToFundamentalProperties(orderReloaded), + new TaskElementNavigator(), orderReloaded.getAssociatedTasks()); + } + + private Order reload(Order order) { + try { + return orderService.find(order.getId()); + } catch (InstanceNotFoundException e) { + throw new RuntimeException(e); + } + } + +}