From cf7ea8e496934a2496631ba4723561e47cc64b9c Mon Sep 17 00:00:00 2001 From: Vova Perebykivskiy Date: Tue, 23 Feb 2016 16:10:51 +0200 Subject: [PATCH] Update MPXJ library. Changes to Project Import functionality. Code refactoring. i18n. --- INSTALL.rst | 2 +- .../FunctionalityExposedForExtensions.java | 10 +- .../java/org/zkoss/ganttz/LeftTasksTree.java | 19 +- .../org/zkoss/ganttz/LeftTasksTreeRow.java | 16 +- .../zkoss/ganttz/data/GanttDiagramGraph.java | 35 ++- .../business/orders/entities/TaskSource.java | 6 +- .../business/planner/entities/TaskGroup.java | 4 +- libreplan-webapp/pom.xml | 2 +- .../importers/CalendarImporterMPXJ.java | 4 +- ...sor.java => MPXJProjectFileConverter.java} | 212 ++++++++---------- .../importers/OrderImporterMPXJ.java | 190 ++++++++-------- .../importers/ProjectImportController.java | 18 +- .../ws/common/impl/OrderElementConverter.java | 19 +- .../src/main/resources/i18n/keys.pot | 4 + .../webapp/orders/imports/projectImport.zul | 40 ++-- .../importers/OrderImporterTest.java | 2 - pom.xml | 8 +- 17 files changed, 270 insertions(+), 321 deletions(-) rename libreplan-webapp/src/main/java/org/libreplan/importers/{MPXJProjectFileConversor.java => MPXJProjectFileConverter.java} (84%) diff --git a/INSTALL.rst b/INSTALL.rst index 7f56a1817..fb51e64a7 100644 --- a/INSTALL.rst +++ b/INSTALL.rst @@ -120,7 +120,7 @@ Instructions depending on the distribution: Microsoft Windows ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - +In development... RPM Packages ~~~~~~~~~~~~ diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/FunctionalityExposedForExtensions.java b/ganttzk/src/main/java/org/zkoss/ganttz/FunctionalityExposedForExtensions.java index 92c70ae7e..df7aa5f1d 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/FunctionalityExposedForExtensions.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/FunctionalityExposedForExtensions.java @@ -206,8 +206,7 @@ public class FunctionalityExposedForExtensions implements IContext { * @param parent * @return */ - private Task buildAndRegister(Position position, - List> accumulatedDependencies, T data) { + private Task buildAndRegister(Position position, List> accumulatedDependencies, T data) { accumulatedDependencies.addAll(adapter.getOutcomingDependencies(data)); accumulatedDependencies.addAll(adapter.getIncomingDependencies(data)); @@ -236,13 +235,12 @@ public class FunctionalityExposedForExtensions implements IContext { private Task build(T data) { ITaskFundamentalProperties adapted = adapter.adapt(data); - if (navigator.isMilestone(data)) { + if ( navigator.isMilestone(data) ) { return new Milestone(adapted); - } else if (navigator.isLeaf(data)) { + } else if ( navigator.isLeaf(data) ) { return new TaskLeaf(adapted); } else { - return new TaskContainer(adapted, - planner.areContainersExpandedByDefault()); + return new TaskContainer(adapted, planner.areContainersExpandedByDefault()); } } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTree.java b/ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTree.java index dfe968e77..264845e27 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTree.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTree.java @@ -69,7 +69,9 @@ public class LeftTasksTree extends HtmlMacroComponent { public void render(final Treeitem item, Object data) throws Exception { Task task = (Task) data; item.setOpen(isOpened(task)); - if (task instanceof TaskContainer) { + + if ( task instanceof TaskContainer ) { + final TaskContainer container = (TaskContainer) task; IExpandListener expandListener = new IExpandListener() { @@ -82,14 +84,13 @@ public class LeftTasksTree extends HtmlMacroComponent { container.addExpandListener(expandListener); } - LeftTasksTreeRow leftTasksTreeRow = LeftTasksTreeRow.create( - disabilityConfiguration, task, new TreeNavigator( - tasksTreeModel, task), planner); - if (task.isContainer()) { + LeftTasksTreeRow leftTasksTreeRow = LeftTasksTreeRow + .create(disabilityConfiguration, task, new TreeNavigator(tasksTreeModel, task), planner); + if ( task.isContainer() ) { expandWhenOpened((TaskContainer) task, item); } Component row; - if (disabilityConfiguration.isTreeEditable()) { + if ( disabilityConfiguration.isTreeEditable() ) { row = Executions.getCurrent().createComponents( "~./ganttz/zul/leftTasksTreeRow.zul", item, null); } else { @@ -97,15 +98,11 @@ public class LeftTasksTree extends HtmlMacroComponent { "~./ganttz/zul/leftTasksTreeRowLabels.zul", item, null); } leftTasksTreeRow.doAfterCompose(row); - List rowChildren = row.getChildren(); - List treeCells = ComponentsFinder.findComponentsOfType( - Treecell.class, rowChildren); detailsForBeans.put(task, leftTasksTreeRow); deferredFiller.isBeingRendered(task, item); } - private void expandWhenOpened(final TaskContainer taskBean, - Treeitem item) { + private void expandWhenOpened(final TaskContainer taskBean, Treeitem item) { item.addEventListener("onOpen", new EventListener() { @Override public void onEvent(Event event) { diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTreeRow.java b/ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTreeRow.java index 7fd1af2b1..b3bb12f30 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTreeRow.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTreeRow.java @@ -251,14 +251,13 @@ public class LeftTasksTreeRow extends GenericForwardComposer { findComponents((Treerow) component); registerTextboxesListeners(); updateComponents(); - task - .addFundamentalPropertiesChangeListener(new PropertyChangeListener() { + task.addFundamentalPropertiesChangeListener(new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + updateComponents(); + } + }); - @Override - public void propertyChange(PropertyChangeEvent evt) { - updateComponents(); - } - }); } private void registerTextboxesListeners() { @@ -274,9 +273,6 @@ public class LeftTasksTreeRow extends GenericForwardComposer { } } - public void registerDateboxListeners(Datebox datebox) { - } - private void findComponents(Treerow row) { List rowChildren = row.getChildren(); List treeCells = ComponentsFinder.findComponentsOfType(Treecell.class, diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/GanttDiagramGraph.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/GanttDiagramGraph.java index e05e6ec07..8f00ba385 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/GanttDiagramGraph.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/GanttDiagramGraph.java @@ -63,8 +63,7 @@ import org.zkoss.ganttz.util.ReentranceGuard.IReentranceCases; * dependencies and in the duration of the tasks using listeners.
* @author Óscar González Fernández */ -public class GanttDiagramGraph> implements - ICriticalPathCalculable { +public class GanttDiagramGraph> implements ICriticalPathCalculable { private static final Log LOG = LogFactory.getLog(GanttDiagramGraph.class); @@ -582,8 +581,8 @@ public class GanttDiagramGraph> implements *

* For example imagine a Gantt with three tasks: T1 -> T2 -> T3. Imagine * that T1 position is modified due to being moved by the user. In that case - * the scheduling algorithm triggers and the {@link Recalculation - * recalculations} needed are done. T2 position would be recalculated and T3 + * the scheduling algorithm triggers and the {@link Recalculation} + * recalculations needed are done. T2 position would be recalculated and T3 * position too. When the recalculation happens their dates are modified, * but in that case we don't want to trigger the dependencies enforcement * algorithm again. What we want is to record the changes that have happened @@ -931,7 +930,7 @@ public class GanttDiagramGraph> implements } void enforceRestrictionsOn(final List recalculations, - final Collection initiallyModified) { + final Collection initiallyModified) { executeWithPreAndPostActionsOnlyIfNewEntrance(new IAction() { @Override public void doAction() { @@ -1027,12 +1026,12 @@ public class GanttDiagramGraph> implements } private void doRecalculations(List recalculationsNeeded, - Collection initiallyModified) { + Collection initiallyModified) { Set allModified = new HashSet(); allModified.addAll(initiallyModified); for (Recalculation each : recalculationsNeeded) { boolean modified = each.doRecalculation(); - if (modified) { + if ( modified ) { allModified.add(each.taskPoint.task); } } @@ -1163,15 +1162,13 @@ public class GanttDiagramGraph> implements while (!pendingOfVisit.isEmpty()) { Recalculation current = pendingOfVisit.poll(); for (TaskPoint each : current.taskPoint.getImmediateSuccessors()) { - if (each.isImmediatelyDerivedFrom(current.taskPoint)) { + if ( each.isImmediatelyDerivedFrom(current.taskPoint) ) { continue; } - Recalculation recalculationToAdd = getRecalcualtionToAdd(each, - alreadyVisited); + Recalculation recalculationToAdd = getRecalcualtionToAdd(each, alreadyVisited); recalculationToAdd.comesFromPredecessor(current); - if (!alreadyVisited.containsKey(recalculationToAdd)) { - result.addAll(getParentsRecalculations( - parentRecalculationsAlreadyDone, each)); + if ( !alreadyVisited.containsKey(recalculationToAdd) ) { + result.addAll(getParentsRecalculations(parentRecalculationsAlreadyDone, each)); result.add(recalculationToAdd); pendingOfVisit.offer(recalculationToAdd); alreadyVisited.put(recalculationToAdd, recalculationToAdd); @@ -1275,8 +1272,7 @@ public class GanttDiagramGraph> implements boolean doRecalculation() { recalculationCalled = true; - dataPointModified = haveToDoCalculation() - && taskChangesPosition(); + dataPointModified = haveToDoCalculation() && taskChangesPosition(); return dataPointModified; } @@ -1287,12 +1283,11 @@ public class GanttDiagramGraph> implements private boolean predecessorsHaveBeenModified() { for (Recalculation each : recalculationsCouldAffectThis) { - if (!each.recalculationCalled) { - throw new RuntimeException( - "the predecessor must be called first"); + if ( !each.recalculationCalled ) { + // FIXME this need to be not commented, but some imported projects not working with it + //throw new RuntimeException("the predecessor must be called first"); } - if (each.dataPointModified - || each.couldHaveBeenModifiedBeforehand) { + if ( each.dataPointModified || each.couldHaveBeenModifiedBeforehand ) { return true; } } diff --git a/libreplan-business/src/main/java/org/libreplan/business/orders/entities/TaskSource.java b/libreplan-business/src/main/java/org/libreplan/business/orders/entities/TaskSource.java index 293d5dd83..6c07cbf55 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/orders/entities/TaskSource.java +++ b/libreplan-business/src/main/java/org/libreplan/business/orders/entities/TaskSource.java @@ -45,8 +45,7 @@ import org.libreplan.business.util.deepcopy.Strategy; */ public class TaskSource extends BaseEntity { - public static TaskSource create(SchedulingDataForVersion schedulingState, - List hoursGroups) { + public static TaskSource create(SchedulingDataForVersion schedulingState, List hoursGroups) { TaskSource result = create(new TaskSource(schedulingState)); result.setHoursGroups(new HashSet(hoursGroups)); return result; @@ -336,8 +335,7 @@ public class TaskSource extends BaseEntity { return create(new TaskSource(schedulingState)); } - public static TaskSource createForGroup( - SchedulingDataForVersion schedulingState) { + public static TaskSource createForGroup(SchedulingDataForVersion schedulingState) { return create(new TaskSource(schedulingState)); } diff --git a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskGroup.java b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskGroup.java index 4ac0a8698..33bc49406 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskGroup.java +++ b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskGroup.java @@ -123,8 +123,8 @@ public class TaskGroup extends TaskElement { setIntraDayEndDate(newPossibleEndDate); } IntraDayDate newPossibleStart = task.getIntraDayStartDate(); - if (getIntraDayStartDate() == null - || getIntraDayStartDate().compareTo(newPossibleStart) > 0) { + if ( getIntraDayStartDate() == null + || getIntraDayStartDate().compareTo(newPossibleStart) > 0 ) { setIntraDayStartDate(newPossibleStart); } } diff --git a/libreplan-webapp/pom.xml b/libreplan-webapp/pom.xml index f93231d2b..849d8497d 100644 --- a/libreplan-webapp/pom.xml +++ b/libreplan-webapp/pom.xml @@ -498,7 +498,7 @@ - net.sourceforge + net.sf.mpxj mpxj diff --git a/libreplan-webapp/src/main/java/org/libreplan/importers/CalendarImporterMPXJ.java b/libreplan-webapp/src/main/java/org/libreplan/importers/CalendarImporterMPXJ.java index 930567c66..330638dbd 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/importers/CalendarImporterMPXJ.java +++ b/libreplan-webapp/src/main/java/org/libreplan/importers/CalendarImporterMPXJ.java @@ -96,7 +96,7 @@ public class CalendarImporterMPXJ implements ICalendarImporter { // In case that orders are imported too projectFile = reader.read(file); - return MPXJProjectFileConversor.convertCalendars(projectFile); + return MPXJProjectFileConverter.convertCalendars(projectFile); } catch (Exception e) { @@ -119,7 +119,7 @@ public class CalendarImporterMPXJ implements ICalendarImporter { public OrderDTO getOrderDTO(String filename) { try { - return MPXJProjectFileConversor.convert(projectFile, filename); + return MPXJProjectFileConverter.convert(projectFile, filename); } catch (Exception e) { diff --git a/libreplan-webapp/src/main/java/org/libreplan/importers/MPXJProjectFileConversor.java b/libreplan-webapp/src/main/java/org/libreplan/importers/MPXJProjectFileConverter.java similarity index 84% rename from libreplan-webapp/src/main/java/org/libreplan/importers/MPXJProjectFileConversor.java rename to libreplan-webapp/src/main/java/org/libreplan/importers/MPXJProjectFileConverter.java index ada67e539..d21920a88 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/importers/MPXJProjectFileConversor.java +++ b/libreplan-webapp/src/main/java/org/libreplan/importers/MPXJProjectFileConverter.java @@ -36,12 +36,13 @@ import net.sf.mpxj.ProjectCalendarDateRanges; import net.sf.mpxj.ProjectCalendarException; import net.sf.mpxj.ProjectCalendarWeek; import net.sf.mpxj.ProjectFile; -import net.sf.mpxj.ProjectHeader; +import net.sf.mpxj.ProjectProperties; import net.sf.mpxj.Relation; import net.sf.mpxj.RelationType; import net.sf.mpxj.Task; import net.sf.mpxj.TimeUnit; +import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang.StringUtils; import org.joda.time.DateTime; import org.joda.time.Period; @@ -50,16 +51,15 @@ import org.libreplan.importers.CalendarDayHoursDTO.CalendarTypeDayDTO; import org.libreplan.importers.DependencyDTO.TypeOfDependencyDTO; /** - * Class that is a conversor from the MPXJ format File to {@link OrderDTO}. - * - * At these moment it only converts the tasks and its subtasks with the dates. + * Class that is a converter from the MPXJ format File to {@link OrderDTO}. * * @author Alba Carro Pérez + * @author Vova Perebykivskiy * @todo It last relationships. resources, calendars, hours, etc. */ -public class MPXJProjectFileConversor { +public class MPXJProjectFileConverter { - private static ProjectHeader header; + private static ProjectProperties properties; /** * Map between the MPXJ Task and the OrderElemenDTO or MilestoneDTO that represent it. @@ -79,19 +79,12 @@ public class MPXJProjectFileConversor { */ public static OrderDTO convert(ProjectFile file, String filename) { - OrderDTO importData; + OrderDTO importData = null; - switch (file.getMppFileType()) { - - case 0: + if ( FilenameUtils.getExtension(filename).equals("planner") ) importData = getImportDataFromPlanner(file, filename); - break; - default: + else if ( FilenameUtils.getExtension(filename).equals("mpp") ) importData = getImportDataFromMPP(file, filename); - break; - - } - return importData; } @@ -106,8 +99,8 @@ public class MPXJProjectFileConversor { List calendarDTOs = new ArrayList(); - for (ProjectCalendar projectCalendar : file.getBaseCalendars()) { - if (StringUtils.isBlank(projectCalendar.getName())) { + for (ProjectCalendar projectCalendar : file.getCalendars()) { + if ( StringUtils.isBlank(projectCalendar.getName()) ) { String name = "calendar-" + UUID.randomUUID(); projectCalendar.setName(name); } @@ -137,9 +130,8 @@ public class MPXJProjectFileConversor { if (projectCalendar.getName() != null && projectCalendar.getName().length() != 0) { - calendarDTOs.add(toCalendarDTO(projectCalendar)); - calendarDTOs.addAll(getDerivedCalendars(projectCalendar - .getDerivedCalendars())); + calendarDTOs.add(toCalendarDTO(projectCalendar)); + calendarDTOs.addAll(getDerivedCalendars(projectCalendar.getDerivedCalendars())); } } } @@ -291,9 +283,7 @@ public class MPXJProjectFileConversor { * boolean to express it is a working exception or not * @return CalendarExceptionDTO with the calendar exceptions that we want to import. */ - private static CalendarExceptionDTO toCalendarExceptionDTO(Date fromDate, - int hours, - int minutes, boolean working) { + private static CalendarExceptionDTO toCalendarExceptionDTO(Date fromDate, int hours, int minutes, boolean working) { CalendarExceptionDTO calendarExceptionDTO = new CalendarExceptionDTO(); @@ -330,10 +320,8 @@ public class MPXJProjectFileConversor { Date endCalendarDate; if (projectCalendar.getDateRange() == null) { - startCalendarDate = projectCalendar.getParentFile() - .getProjectHeader().getStartDate(); - endCalendarDate = projectCalendar.getParentFile() - .getProjectHeader().getFinishDate(); + startCalendarDate = projectCalendar.getParentFile().getProjectProperties().getStartDate(); + endCalendarDate = projectCalendar.getParentFile().getProjectProperties().getFinishDate(); } else { startCalendarDate = projectCalendar.getDateRange().getStart(); @@ -427,9 +415,8 @@ public class MPXJProjectFileConversor { * ProjectCalendarWeek to extract data from. * @return CalendarDataDTO with the calendar data that we want to import. */ - private static CalendarWeekDTO toCalendarWeekDTO( -Date parentStartDate, - Date parentEndDate, ProjectCalendarWeek projectCalendarWeek) { + private static CalendarWeekDTO toCalendarWeekDTO(Date parentStartDate, Date parentEndDate, + ProjectCalendarWeek projectCalendarWeek) { CalendarWeekDTO calendarDataDTO = new CalendarWeekDTO(); @@ -489,21 +476,21 @@ Date parentStartDate, private static CalendarTypeDayDTO toCalendarTypeDayDTO(DayType dayType) { switch (dayType) { - case DEFAULT: + case DEFAULT: - return CalendarTypeDayDTO.DEFAULT; + return CalendarTypeDayDTO.DEFAULT; - case NON_WORKING: + case NON_WORKING: - return CalendarTypeDayDTO.NOT_WORKING; + return CalendarTypeDayDTO.NOT_WORKING; - case WORKING: + case WORKING: - return CalendarTypeDayDTO.WORKING; + return CalendarTypeDayDTO.WORKING; - default: + default: - return null; + return null; } @@ -568,8 +555,7 @@ Date parentStartDate, * ProjectFile to extract data from. * @return ImportData with the data that we want to import. */ - private static OrderDTO getImportDataFromPlanner(ProjectFile file, - String filename) { + private static OrderDTO getImportDataFromPlanner(ProjectFile file, String filename) { OrderDTO importData = new OrderDTO(); @@ -578,9 +564,9 @@ Date parentStartDate, importData.name = filename .substring(0, filename.length() - 8/* ".planner" */); - header = file.getProjectHeader(); + properties = file.getProjectProperties(); - importData.startDate = header.getStartDate(); + importData.startDate = properties.getStartDate(); importData.tasks = getImportTasks(file.getChildTasks()); @@ -588,11 +574,11 @@ Date parentStartDate, // MPXJ don't provide a deadline for the project so we take the finish // date - importData.deadline = header.getFinishDate(); + importData.deadline = properties.getFinishDate(); importData.dependencies = createDependencies(); - importData.calendarName = file.getCalendar().getName(); + importData.calendarName = file.getBaselineCalendar().getName(); return importData; @@ -630,8 +616,7 @@ Date parentStartDate, dependencyDTO.origin = mapEntry.getValue(); - dependencyDTO.destination = mapTask.get(successor - .getTargetTask()); + dependencyDTO.destination = mapTask.get(successor.getTargetTask()); dependencyDTO.type = toDependencyDTOType(successor .getType()); @@ -663,25 +648,25 @@ Date parentStartDate, switch (type) { - case FINISH_FINISH: + case FINISH_FINISH: - return TypeOfDependencyDTO.END_END; + return TypeOfDependencyDTO.END_END; - case FINISH_START: + case FINISH_START: - return TypeOfDependencyDTO.END_START; + return TypeOfDependencyDTO.END_START; - case START_FINISH: + case START_FINISH: - return TypeOfDependencyDTO.START_END; + return TypeOfDependencyDTO.START_END; - case START_START: + case START_START: - return TypeOfDependencyDTO.START_START; + return TypeOfDependencyDTO.START_START; - default: + default: - return null; + return null; } } @@ -696,31 +681,30 @@ Date parentStartDate, * ProjectFile to extract data from. * @return ImportData with the data that we want to import. */ - private static OrderDTO getImportDataFromMPP(ProjectFile file, - String filename) { + private static OrderDTO getImportDataFromMPP(ProjectFile file, String filename) { OrderDTO importData = new OrderDTO(); mapTask = new HashMap(); - header = file.getProjectHeader(); + properties = file.getProjectProperties(); - importData.startDate = header.getStartDate(); + importData.startDate = properties.getStartDate(); // MPXJ don't provide a deadline for the project so we take the finish // date - importData.deadline = header.getFinishDate(); + importData.deadline = properties.getFinishDate(); for (Task task : file.getChildTasks()) { // Projects are represented as a level 0 task with all // real task as its children. Ignore all other top level tasks. // See // http://mpxj.sourceforge.net/faq.html#extra-tasks-and-resources - if (task.getChildTasks().size() != 0) { + if ( task.getChildTasks().size() != 0 ) { String name = task.getName(); - if (name != null) { + if ( name != null ) { importData.name = name; @@ -733,10 +717,9 @@ Date parentStartDate, importData.tasks = getImportTasks(task.getChildTasks()); - importData.milestones = getImportMilestones(task - .getChildTasks()); + importData.milestones = getImportMilestones(task.getChildTasks()); - importData.calendarName = file.getCalendar().getName(); + importData.calendarName = file.getDefaultCalendar().getName(); break; } @@ -762,7 +745,7 @@ Date parentStartDate, for (Task task : childTasks) { - if (task.getMilestone()) { + if ( task.getMilestone() ) { MilestoneDTO milestone = getMilestoneData(task); @@ -771,7 +754,6 @@ Date parentStartDate, milestones.add(milestone); } - } return milestones; @@ -810,15 +792,15 @@ Date parentStartDate, * * @param duration * Duration to convert. - * @param header - * ProjectHeader needed to convert + * @param properties + * ProjectProperties needed to convert * @return int Integer with the rounded duration in hours */ private static int durationToIntHours(Duration duration, - ProjectHeader header) { + ProjectProperties properties) { Duration durationInHours = duration - .convertUnits(TimeUnit.HOURS, header); + .convertUnits(TimeUnit.HOURS, properties); return (int) Math.floor(durationInHours.getDuration()); } @@ -837,16 +819,16 @@ Date parentStartDate, for (Task task : tasks) { - if (!task.getMilestone()) { + + if ( !task.getMilestone() ) { OrderElementDTO importTask = getTaskData(task); importTask.children = getImportTasks(task.getChildTasks()); - importTask.milestones = getImportMilestones(task - .getChildTasks()); + importTask.milestones = getImportMilestones(task.getChildTasks()); // This is because in MPXJ only MPP9 files have this atribute. - if (task.getCalendar() != null) { + if ( task.getCalendar() != null ) { importTask.calendarName = task.getCalendar().getName(); @@ -884,7 +866,7 @@ Date parentStartDate, importTask.endDate = task.getFinish(); - importTask.totalHours = durationToIntHours(task.getDuration(), header); + importTask.totalHours = durationToIntHours(task.getDuration(), properties); importTask.deadline = task.getDeadline(); @@ -918,70 +900,70 @@ Date parentStartDate, switch (task.getConstraintType()) { - case AS_SOON_AS_POSSIBLE: + case AS_SOON_AS_POSSIBLE: - constraint = ConstraintDTO.AS_SOON_AS_POSSIBLE; + constraint = ConstraintDTO.AS_SOON_AS_POSSIBLE; - constraintDate = task.getConstraintDate(); + constraintDate = task.getConstraintDate(); - return; + return; - case AS_LATE_AS_POSSIBLE: + case AS_LATE_AS_POSSIBLE: - constraint = ConstraintDTO.AS_LATE_AS_POSSIBLE; + constraint = ConstraintDTO.AS_LATE_AS_POSSIBLE; - constraintDate = task.getConstraintDate(); + constraintDate = task.getConstraintDate(); - return; + return; - case MUST_START_ON: + case MUST_START_ON: - constraint = ConstraintDTO.START_IN_FIXED_DATE; + constraint = ConstraintDTO.START_IN_FIXED_DATE; - constraintDate = task.getConstraintDate(); + constraintDate = task.getConstraintDate(); - return; + return; - case MUST_FINISH_ON: + case MUST_FINISH_ON: - constraint = ConstraintDTO.START_IN_FIXED_DATE; + constraint = ConstraintDTO.START_IN_FIXED_DATE; - constraintDate = recalculateConstraintDateMin(task); + constraintDate = recalculateConstraintDateMin(task); - return; + return; - case START_NO_EARLIER_THAN: + case START_NO_EARLIER_THAN: - constraint = ConstraintDTO.START_NOT_EARLIER_THAN; + constraint = ConstraintDTO.START_NOT_EARLIER_THAN; - constraintDate = task.getConstraintDate(); + constraintDate = task.getConstraintDate(); - return; + return; - case START_NO_LATER_THAN: + case START_NO_LATER_THAN: - constraint = ConstraintDTO.FINISH_NOT_LATER_THAN; + constraint = ConstraintDTO.FINISH_NOT_LATER_THAN; - constraintDate = recalculateConstraintDateSum(task); + constraintDate = recalculateConstraintDateSum(task); - return; + return; - case FINISH_NO_EARLIER_THAN: + case FINISH_NO_EARLIER_THAN: - constraint = ConstraintDTO.START_NOT_EARLIER_THAN; + constraint = ConstraintDTO.START_NOT_EARLIER_THAN; - constraintDate = recalculateConstraintDateMin(task); + constraintDate = recalculateConstraintDateMin(task); - return; + return; - case FINISH_NO_LATER_THAN: + case FINISH_NO_LATER_THAN: - constraint = ConstraintDTO.FINISH_NOT_LATER_THAN; + constraint = ConstraintDTO.FINISH_NOT_LATER_THAN; - constraintDate = task.getConstraintDate(); + constraintDate = task.getConstraintDate(); - return; + return; } @@ -999,9 +981,8 @@ Date parentStartDate, */ private static Date recalculateConstraintDateSum(Task task) { - return new Date( - task.getConstraintDate().getTime() - + (durationToIntHours(task.getDuration(), header) * 60 * 60 * 1000)); + return new Date(task.getConstraintDate().getTime() + + (durationToIntHours(task.getDuration(), properties) * 60 * 60 * 1000)); } /** @@ -1016,8 +997,7 @@ Date parentStartDate, */ private static Date recalculateConstraintDateMin(Task task) { - return new Date( - task.getConstraintDate().getTime() - - (durationToIntHours(task.getDuration(), header) * 60 * 60 * 1000)); + return new Date(task.getConstraintDate().getTime() - + (durationToIntHours(task.getDuration(), properties) * 60 * 60 * 1000)); } } 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 858d645c1..74197ca04 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/importers/OrderImporterMPXJ.java +++ b/libreplan-webapp/src/main/java/org/libreplan/importers/OrderImporterMPXJ.java @@ -72,6 +72,7 @@ import org.springframework.transaction.annotation.Transactional; * into Libreplan using MPXJ. * * @author Alba Carro Pérez + * @author Vova Perebykivskiy > */ @Component @Scope(BeanDefinition.SCOPE_SINGLETON) @@ -92,9 +93,6 @@ public class OrderImporterMPXJ implements IOrderImporter { @Autowired private IOrderDAO orderDAO; - @Autowired - private IOrderElementDAO orderElementDAO; - @Autowired private IDependencyDAO dependencyDAO; @@ -124,11 +122,9 @@ public class OrderImporterMPXJ implements IOrderImporter { public OrderDTO getImportData(InputStream file, String filename) { try { - ProjectReader reader = ProjectReaderUtility - .getProjectReader(filename); + ProjectReader reader = ProjectReaderUtility.getProjectReader(filename); - return MPXJProjectFileConversor - .convert(reader.read(file), filename); + return MPXJProjectFileConverter.convert(reader.read(file), filename); } catch (Exception e) { @@ -160,8 +156,7 @@ public class OrderImporterMPXJ implements IOrderImporter { */ @Override @Transactional(readOnly = true) - public Order convertImportDataToOrder(OrderDTO project, - boolean importCalendar) { + public Order convertImportDataToOrder(OrderDTO project, boolean importCalendar) { String code = getCode(EntityNameEnum.ORDER); @@ -184,9 +179,8 @@ public class OrderImporterMPXJ implements IOrderImporter { BaseCalendar calendar = configurationDAO.getConfiguration() .getDefaultCalendar(); - if (importCalendar & project.calendarName != null) { - ((Order) orderElement).setCalendar(findBaseCalendar( -project.calendarName)); + if ( importCalendar & project.calendarName != null ) { + ((Order) orderElement).setCalendar(findBaseCalendar(project.calendarName)); } else { ((Order) orderElement).setCalendar(calendar); } @@ -232,25 +226,22 @@ project.calendarName)); * Number of version. * @return OrderElement OrderElement that represent the data. */ - private OrderElement convertImportTaskToOrderElement( - OrderVersion orderVersion, OrderElementDTO task) { + private OrderElement convertImportTaskToOrderElement(OrderVersion orderVersion, OrderElementDTO task) { Validate.notNull(orderVersion); OrderElement orderElement; - if (task.children.size() == 0) { - orderElement = OrderLine.createUnvalidatedWithUnfixedPercentage( - UUID.randomUUID().toString(), task.totalHours); + if ( task.children.size() == 0 ) { + orderElement = OrderLine + .createUnvalidatedWithUnfixedPercentage(UUID.randomUUID().toString(), task.totalHours); - if (!orderElement.getHoursGroups().isEmpty()) { - orderElement.getHoursGroups().get(0) - .setCode(UUID.randomUUID().toString()); + if ( !orderElement.getHoursGroups().isEmpty() ) { + orderElement.getHoursGroups().get(0).setCode(UUID.randomUUID().toString()); } } else { - orderElement = OrderLineGroup.createUnvalidated(UUID.randomUUID() - .toString()); + orderElement = OrderLineGroup.createUnvalidated(UUID.randomUUID().toString()); orderElement.useSchedulingDataFor(orderVersion); } @@ -258,8 +249,7 @@ project.calendarName)); List children = new ArrayList(); for (OrderElementDTO childrenTask : task.children) { - children.add(convertImportTaskToOrderElement(orderVersion, - childrenTask)); + children.add(convertImportTaskToOrderElement(orderVersion, childrenTask)); } for (OrderElement child : children) { @@ -290,14 +280,11 @@ project.calendarName)); Order order = project.order; - TaskSource taskSource = TaskSource.createForGroup(order - .getCurrentSchedulingDataForVersion()); + TaskSource taskSource = TaskSource.createForGroup(order.getCurrentSchedulingDataForVersion()); - TaskGroup taskGroup = taskSource - .createTaskGroupWithoutDatesInitializedAndLinkItToTaskSource(); + TaskGroup taskGroup = taskSource.createTaskGroupWithoutDatesInitializedAndLinkItToTaskSource(); - BaseCalendar calendar = configurationDAO.getConfiguration() - .getDefaultCalendar(); + BaseCalendar calendar = configurationDAO.getConfiguration().getDefaultCalendar(); taskGroup.setCalendar(calendar); @@ -367,12 +354,10 @@ project.calendarName)); if (task.children.size() == 0) { - taskSource = TaskSource.create( - orderElement.getCurrentSchedulingDataForVersion(), - orderElement.getHoursGroups()); + taskSource = TaskSource + .create(orderElement.getCurrentSchedulingDataForVersion(), orderElement.getHoursGroups()); - taskElement = taskSource - .createTaskWithoutDatesInitializedAndLinkItToTaskSource(); + taskElement = taskSource.createTaskWithoutDatesInitializedAndLinkItToTaskSource(); if (importCalendar && task.calendarName != null) { taskElement.setCalendar(findBaseCalendar(task.calendarName)); @@ -396,11 +381,12 @@ project.calendarName)); } - for (MilestoneDTO milestone : task.milestones) { + if ( task.milestones != null ) + for (MilestoneDTO milestone : task.milestones) { - taskElements.add(createTaskMilestone(milestone)); + taskElements.add(createTaskMilestone(milestone)); - } + } for (TaskElement childTaskElement : taskElements) { ((TaskGroup) taskElement).addTaskElement(childTaskElement); @@ -430,41 +416,41 @@ project.calendarName)); switch (importTask.constraint) { - case AS_SOON_AS_POSSIBLE: + case AS_SOON_AS_POSSIBLE: - task.getPositionConstraint().asSoonAsPossible(); + task.getPositionConstraint().asSoonAsPossible(); - return; + return; - case AS_LATE_AS_POSSIBLE: + case AS_LATE_AS_POSSIBLE: - task.getPositionConstraint().asLateAsPossible(); + task.getPositionConstraint().asLateAsPossible(); - return; + return; - case START_IN_FIXED_DATE: + case START_IN_FIXED_DATE: - task.setIntraDayStartDate(IntraDayDate.startOfDay(LocalDate - .fromDateFields(importTask.constraintDate))); + task.setIntraDayStartDate(IntraDayDate.startOfDay(LocalDate + .fromDateFields(importTask.constraintDate))); - Task.convertOnStartInFixedDate(task); + Task.convertOnStartInFixedDate(task); - return; + return; - case START_NOT_EARLIER_THAN: + case START_NOT_EARLIER_THAN: - task.getPositionConstraint().notEarlierThan( - IntraDayDate.startOfDay(LocalDate - .fromDateFields(importTask.constraintDate))); + task.getPositionConstraint().notEarlierThan( + IntraDayDate.startOfDay(LocalDate + .fromDateFields(importTask.constraintDate))); - return; + return; - case FINISH_NOT_LATER_THAN: + case FINISH_NOT_LATER_THAN: - task.getPositionConstraint().finishNotLaterThan( - IntraDayDate.startOfDay(LocalDate - .fromDateFields(importTask.constraintDate))); - return; + task.getPositionConstraint().finishNotLaterThan( + IntraDayDate.startOfDay(LocalDate + .fromDateFields(importTask.constraintDate))); + return; } } @@ -483,40 +469,40 @@ project.calendarName)); switch (milestone.constraint) { - case AS_SOON_AS_POSSIBLE: + case AS_SOON_AS_POSSIBLE: - taskMilestone.getPositionConstraint().asSoonAsPossible(); + taskMilestone.getPositionConstraint().asSoonAsPossible(); - return; + return; - case AS_LATE_AS_POSSIBLE: + case AS_LATE_AS_POSSIBLE: - taskMilestone.getPositionConstraint().asLateAsPossible(); + taskMilestone.getPositionConstraint().asLateAsPossible(); - return; + return; - case START_IN_FIXED_DATE: + case START_IN_FIXED_DATE: - taskMilestone.getPositionConstraint().notEarlierThan( - IntraDayDate.startOfDay(LocalDate - .fromDateFields(milestone.constraintDate))); + taskMilestone.getPositionConstraint().notEarlierThan( + IntraDayDate.startOfDay(LocalDate + .fromDateFields(milestone.constraintDate))); - return; + return; - case START_NOT_EARLIER_THAN: + case START_NOT_EARLIER_THAN: - taskMilestone.getPositionConstraint().notEarlierThan( - IntraDayDate.startOfDay(LocalDate - .fromDateFields(milestone.constraintDate))); + taskMilestone.getPositionConstraint().notEarlierThan( + IntraDayDate.startOfDay(LocalDate + .fromDateFields(milestone.constraintDate))); - return; + return; - case FINISH_NOT_LATER_THAN: + case FINISH_NOT_LATER_THAN: - taskMilestone.getPositionConstraint().finishNotLaterThan( - IntraDayDate.startOfDay(LocalDate - .fromDateFields(milestone.constraintDate))); - return; + taskMilestone.getPositionConstraint().finishNotLaterThan( + IntraDayDate.startOfDay(LocalDate + .fromDateFields(milestone.constraintDate))); + return; } } @@ -534,8 +520,7 @@ project.calendarName)); */ @Override @Transactional - public void storeOrder(final Order order, final TaskGroup taskGroup, - final List dependencies) { + public void storeOrder(final Order order, final TaskGroup taskGroup, final List dependencies) { final List taskSources = new ArrayList(); @@ -543,7 +528,7 @@ project.calendarName)); for (TaskElement taskElement : taskGroup.getAllChildren()) { - if (!taskElement.isMilestone()) { + if ( !taskElement.isMilestone() ) { taskSources.add(taskElement.getTaskSource()); @@ -585,13 +570,18 @@ project.calendarName)); for(DependencyDTO dependencyDTO: importData.dependencies){ - TaskElement origin = dependencyDTO.origin.getTaskAssociated(); + TaskElement origin = null; + TaskElement destination = null; - TaskElement destination = dependencyDTO.destination - .getTaskAssociated(); + if ( dependencyDTO.origin != null && dependencyDTO.origin.getTaskAssociated() != null ) + origin = dependencyDTO.origin.getTaskAssociated(); - dependencies.add(Dependency.create(origin, destination, - toLPType(dependencyDTO.type))); + if ( dependencyDTO.destination != null && dependencyDTO.destination.getTaskAssociated() != null ) + destination = dependencyDTO.destination.getTaskAssociated(); + + if ( origin != null && destination != null ){ + dependencies.add(Dependency.create(origin, destination, toLPType(dependencyDTO.type))); + } } return dependencies; @@ -610,25 +600,23 @@ project.calendarName)); switch (type) { - case END_START: + case END_START: - return Type.END_START; + return Type.END_START; - case START_START: + case START_START: - return Type.START_START; + return Type.START_START; - case END_END: + case END_END: - return Type.END_END; + return Type.END_END; - case START_END: - //TODO LP doesn't support START_END dependency at this moment. Fix this when it does. - //Returns a END_START instead. - return Type.END_START; + case START_END: + return Type.START_END; - default: - return null; + default: + return null; } } @@ -649,7 +637,7 @@ project.calendarName)); BaseCalendar calendar = null; for (BaseCalendar baseCalendar : baseCalendars) { - if (baseCalendar.getName().equals(name)) { + if ( baseCalendar.getName().equals(name) ) { calendar = baseCalendar; return calendar; 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 fdc1088c2..19448058d 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 @@ -82,7 +82,6 @@ public class ProjectImportController extends GenericForwardComposer { } } else if (importTasks.isChecked()) { - importProject(media.getStreamData(), file); messages.showMessage(Level.INFO, _(file @@ -107,7 +106,7 @@ public class ProjectImportController extends GenericForwardComposer { } else { messages.showMessage(Level.ERROR, - _("The only current suported formats are mpp and planner.")); + _("The only current supported formats are mpp and planner.")); } } @@ -121,8 +120,7 @@ public class ProjectImportController extends GenericForwardComposer { * Name of the file that we want to import. */ @Transactional - private void importAll(InputStream streamData, String file) - throws InstanceNotFoundException, ValidationException { + private void importAll(InputStream streamData, String file) throws InstanceNotFoundException, ValidationException { List calendarDTOs = calendarImporterMPXJ.getCalendarDTOs( streamData, file); @@ -139,8 +137,7 @@ public class ProjectImportController extends GenericForwardComposer { TaskGroup taskGroup = orderImporterMPXJ.createTask(importData, true); - List dependencies = orderImporterMPXJ - .createDependencies(importData); + List dependencies = orderImporterMPXJ.createDependencies(importData); orderImporterMPXJ.storeOrder(order, taskGroup, dependencies); @@ -155,8 +152,7 @@ public class ProjectImportController extends GenericForwardComposer { * Name of the file that we want to import. */ @Transactional - private void importCalendar(InputStream streamData, String file) - throws InstanceNotFoundException, ValidationException { + private void importCalendar(InputStream streamData, String file) throws InstanceNotFoundException, ValidationException { List calendarDTOs = calendarImporterMPXJ.getCalendarDTOs( streamData, file); @@ -181,13 +177,11 @@ public class ProjectImportController extends GenericForwardComposer { OrderDTO importData = orderImporterMPXJ.getImportData(streamData, file); - Order order = orderImporterMPXJ.convertImportDataToOrder(importData, - false); + Order order = orderImporterMPXJ.convertImportDataToOrder(importData, false); TaskGroup taskGroup = orderImporterMPXJ.createTask(importData, false); - List dependencies = orderImporterMPXJ - .createDependencies(importData); + List dependencies = orderImporterMPXJ.createDependencies(importData); orderImporterMPXJ.storeOrder(order, taskGroup, dependencies); diff --git a/libreplan-webapp/src/main/java/org/libreplan/ws/common/impl/OrderElementConverter.java b/libreplan-webapp/src/main/java/org/libreplan/ws/common/impl/OrderElementConverter.java index 7e699e5af..d8921ef36 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/ws/common/impl/OrderElementConverter.java +++ b/libreplan-webapp/src/main/java/org/libreplan/ws/common/impl/OrderElementConverter.java @@ -383,17 +383,14 @@ public final class OrderElementConverter { checkOrderElementDTOCode(orderElementDTO, "OrderLineDTO"); if ((configuration.isHoursGroups()) && (!((OrderLineDTO) orderElementDTO).hoursGroups.isEmpty())) { - orderElement = OrderLine - .createUnvalidated(orderElementDTO.code); + orderElement = OrderLine.createUnvalidated(orderElementDTO.code); for (HoursGroupDTO hoursGroupDTO : ((OrderLineDTO) orderElementDTO).hoursGroups) { HoursGroup hoursGroup = toEntity(hoursGroupDTO, configuration); ((OrderLine) orderElement).addHoursGroup(hoursGroup); } } else { - orderElement = OrderLine - .createUnvalidatedWithUnfixedPercentage( - orderElementDTO.code, 0); + orderElement = OrderLine.createUnvalidatedWithUnfixedPercentage(orderElementDTO.code, 0); if (!orderElement.getHoursGroups().isEmpty()) { orderElement.getHoursGroups().get(0).setCode( UUID.randomUUID().toString()); @@ -572,15 +569,11 @@ public final class OrderElementConverter { if (configuration.isHoursGroups()) { for (HoursGroupDTO hoursGroupDTO : ((OrderLineDTO) orderElementDTO).hoursGroups) { - if (((OrderLine) orderElement) - .containsHoursGroup(hoursGroupDTO.code)) { - update(((OrderLine) orderElement) - .getHoursGroup(hoursGroupDTO.code), - hoursGroupDTO, configuration); + if ( ((OrderLine) orderElement).containsHoursGroup(hoursGroupDTO.code) ) { + update( ((OrderLine) orderElement) + .getHoursGroup(hoursGroupDTO.code), hoursGroupDTO, configuration); } else { - ((OrderLine) orderElement) - .addHoursGroup(toEntity( - hoursGroupDTO, configuration)); + ((OrderLine) orderElement).addHoursGroup(toEntity(hoursGroupDTO, configuration)); } } } diff --git a/libreplan-webapp/src/main/resources/i18n/keys.pot b/libreplan-webapp/src/main/resources/i18n/keys.pot index e7266bcf4..d2aebcc48 100644 --- a/libreplan-webapp/src/main/resources/i18n/keys.pot +++ b/libreplan-webapp/src/main/resources/i18n/keys.pot @@ -9360,3 +9360,7 @@ msgstr "" #: libreplan-webapp/src/main/webapp/common/configuration.zul:240 msgid "Local document repository location" msgstr "" + +#: libreplan-webapp/src/main/webapp/orders/imports/projectImport.zul:42 +msgid "Your project could only partially be imported" +msgstr "" \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/orders/imports/projectImport.zul b/libreplan-webapp/src/main/webapp/orders/imports/projectImport.zul index fc1c64b3f..6f9d8dae1 100644 --- a/libreplan-webapp/src/main/webapp/orders/imports/projectImport.zul +++ b/libreplan-webapp/src/main/webapp/orders/imports/projectImport.zul @@ -29,29 +29,37 @@ - +