diff --git a/libreplan-webapp/src/main/java/org/libreplan/importers/IOrderImporter.java b/libreplan-webapp/src/main/java/org/libreplan/importers/IOrderImporter.java index 53c1a247f..242391d9a 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/importers/IOrderImporter.java +++ b/libreplan-webapp/src/main/java/org/libreplan/importers/IOrderImporter.java @@ -22,6 +22,7 @@ package org.libreplan.importers; import java.io.InputStream; import org.libreplan.business.orders.entities.Order; +import org.libreplan.business.planner.entities.TaskGroup; /** * Contract for the {@link OrderImporterMPXJ}. @@ -54,12 +55,24 @@ public interface IOrderImporter { public Order convertImportDataToOrder(OrderDTO project); /** - * Saves a {@link Order} which has all the data that we want to store in the - * database. + * Makes a {@link TaskGroup} from a {@link ImportData}. + * + * @param project + * ImportData to extract data from. + * @return TaskGroup with the data that we want. + */ + public TaskGroup createTask(OrderDTO project); + + /** + * Saves a {@link Order} and a {@link TaskGroup} which has all the data that + * we want to store in the database. * * @param Order * Order with the data. + * + * @param TaskGroup + * TaskGroup with the data. */ - public void storeOrder(Order order); + public void storeOrder(Order order, TaskGroup taskGroup); } diff --git a/libreplan-webapp/src/main/java/org/libreplan/importers/OrderImporterMPXJ.java b/libreplan-webapp/src/main/java/org/libreplan/importers/OrderImporterMPXJ.java index 21e9d8ee4..0774a1ac8 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/importers/OrderImporterMPXJ.java +++ b/libreplan-webapp/src/main/java/org/libreplan/importers/OrderImporterMPXJ.java @@ -22,7 +22,6 @@ package org.libreplan.importers; import java.io.InputStream; import java.util.ArrayList; import java.util.ConcurrentModificationException; -import java.util.Date; import java.util.List; import java.util.UUID; @@ -36,10 +35,16 @@ import org.libreplan.business.common.daos.IConfigurationDAO; import org.libreplan.business.common.daos.IEntitySequenceDAO; import org.libreplan.business.common.entities.EntityNameEnum; import org.libreplan.business.orders.daos.IOrderDAO; +import org.libreplan.business.orders.daos.IOrderElementDAO; import org.libreplan.business.orders.entities.Order; import org.libreplan.business.orders.entities.OrderElement; import org.libreplan.business.orders.entities.OrderLine; import org.libreplan.business.orders.entities.OrderLineGroup; +import org.libreplan.business.orders.entities.TaskSource; +import org.libreplan.business.planner.daos.ITaskElementDAO; +import org.libreplan.business.planner.daos.ITaskSourceDAO; +import org.libreplan.business.planner.entities.TaskElement; +import org.libreplan.business.planner.entities.TaskGroup; import org.libreplan.business.scenarios.IScenarioManager; import org.libreplan.business.scenarios.entities.OrderVersion; import org.libreplan.business.scenarios.entities.Scenario; @@ -72,6 +77,15 @@ public class OrderImporterMPXJ implements IOrderImporter { @Autowired private IOrderDAO orderDAO; + @Autowired + private IOrderElementDAO orderElementDAO; + + @Autowired + private ITaskElementDAO taskDAO; + + @Autowired + private ITaskSourceDAO taskSourceDAO; + @Autowired private IScenarioManager scenarioManager; @@ -167,7 +181,9 @@ public class OrderImporterMPXJ implements IOrderImporter { orderElement.setName(project.name + ": " + project.hashCode()); orderElement.setCode(code); - orderElement.setInitDate(new Date()); + orderElement.setInitDate(project.startDate); + + project.order = (Order) orderElement; ((Order) orderElement).generateOrderElementCodes(entitySequenceDAO .getNumberOfDigitsCode(EntityNameEnum.ORDER)); @@ -203,8 +219,10 @@ public class OrderImporterMPXJ implements IOrderImporter { } } else { + orderElement = OrderLineGroup.createUnvalidated(UUID.randomUUID() .toString()); + orderElement.useSchedulingDataFor(orderVersion); } @@ -221,24 +239,142 @@ public class OrderImporterMPXJ implements IOrderImporter { } orderElement.setName(task.name); - orderElement.setInitDate(new Date()); + + task.orderElement = orderElement; return orderElement; } /** - * Saves an {@link Order} which has all the data that we want to store in - * the database. + * Creates a {@link TaskGroup} from a {@link ImportData} * - * @param Order - * Order with the data. + * @param project + * ImportData to extract data from + * + * @return TaskGroup TaskGroup with the data extracted. */ @Override @Transactional - public void storeOrder(final Order order) { + public TaskGroup createTask(OrderDTO project) { + + Order order = project.order; + + TaskSource taskSource = TaskSource.createForGroup(order + .getCurrentSchedulingDataForVersion()); + + TaskGroup taskGroup = taskSource + .createTaskGroupWithoutDatesInitializedAndLinkItToTaskSource(); + + BaseCalendar calendar = configurationDAO.getConfiguration() + .getDefaultCalendar(); + + taskGroup.setCalendar(calendar); + + List taskElements = new ArrayList(); + + for (OrderElementDTO importTask : project.tasks) { + + taskElements.add(createTask(importTask)); + + } + + for (TaskElement taskElement : taskElements) { + taskGroup.addTaskElement(taskElement); + } + + return taskGroup; + + } + + /** + * Private method. + * + * It makes a {@link TaskElement} from a {@link ImportTask} + * + * @param task + * ImportTask to extract data from. + * + * @return TaskElement TaskElement that represent the data. + */ + private TaskElement createTask(OrderElementDTO task) { + + OrderElement orderElement = task.orderElement; + + TaskElement taskElement; + + TaskSource taskSource; + + if (task.children.size() == 0) { + + taskSource = TaskSource.create( + orderElement.getCurrentSchedulingDataForVersion(), + orderElement.getHoursGroups()); + + taskElement = taskSource + .createTaskWithoutDatesInitializedAndLinkItToTaskSource(); + + } else { + + taskSource = TaskSource.createForGroup(orderElement + .getCurrentSchedulingDataForVersion()); + + taskElement = taskSource + .createTaskGroupWithoutDatesInitializedAndLinkItToTaskSource(); + + List taskElements = new ArrayList(); + + for (OrderElementDTO importTask : task.children) { + + taskElements.add(createTask(importTask)); + + } + + for (TaskElement childTaskElement : taskElements) { + ((TaskGroup) taskElement).addTaskElement(childTaskElement); + } + + } + + taskElement.setStartDate(task.startDate); + taskElement.setEndDate(task.endDate); + + return taskElement; + } + + /** + * Saves an {@link Order} which has all the data that we want to store in + * the database. Also save all the related {@link TaskElement} and its + * {@link TaskSource} + * + * @param Order + * Order with the data. + * @param TaskGroup + * TaskGroup with the data. It also contains the link to the + * TaskSources. + */ + @Override + @Transactional + public void storeOrder(final Order order, final TaskGroup taskGroup) { + + final List taskSources = new ArrayList(); + + taskSources.add(taskGroup.getTaskSource()); + + for (TaskElement taskElement : taskGroup.getAllChildren()) { + taskSources.add(taskElement.getTaskSource()); + } orderDAO.save(order); + taskDAO.save(taskGroup); + + for (TaskSource taskSource : taskSources) { + + taskSource.validate(); + taskSourceDAO.save(taskSource); + + } + } } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/importers/ProjectImportController.java b/libreplan-webapp/src/main/java/org/libreplan/web/importers/ProjectImportController.java index b5871c3fa..2df538839 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/importers/ProjectImportController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/importers/ProjectImportController.java @@ -4,7 +4,10 @@ import static org.libreplan.web.I18nHelper._; import java.io.InputStream; +import org.libreplan.business.orders.entities.Order; +import org.libreplan.business.planner.entities.TaskGroup; import org.libreplan.importers.IOrderImporter; +import org.libreplan.importers.OrderDTO; import org.libreplan.web.common.IMessagesForUser; import org.libreplan.web.common.Level; import org.libreplan.web.common.MessagesForUser; @@ -70,9 +73,13 @@ public class ProjectImportController extends GenericForwardComposer { @Transactional private void importProject(InputStream streamData, String file) { - orderImporterMPXJ.storeOrder(orderImporterMPXJ - .convertImportDataToOrder(orderImporterMPXJ.getImportData( - streamData, file))); + OrderDTO importData = orderImporterMPXJ.getImportData(streamData, file); + + Order order = orderImporterMPXJ.convertImportDataToOrder(importData); + + TaskGroup taskGroup = orderImporterMPXJ.createTask(importData); + + orderImporterMPXJ.storeOrder(order, taskGroup); }