///////////////////////////////////////////////////////////////////////////// // // Project ProjectForge Community Edition // www.projectforge.org // // Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de) // // ProjectForge is dual-licensed. // // This community edition is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as published // by the Free Software Foundation; version 3 of the License. // // This community edition 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 General // Public License for more details. // // You should have received a copy of the GNU General Public License along // with this program; if not, see http://www.gnu.org/licenses/. // ///////////////////////////////////////////////////////////////////////////// package org.projectforge.gantt; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import java.math.BigDecimal; import java.util.Calendar; import java.util.Date; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.junit.Test; import org.projectforge.calendar.DayHolder; import org.projectforge.task.TaskDO; import org.projectforge.task.TaskDao; import org.projectforge.test.TestBase; public class Task2GanttTaskConverterTest extends TestBase { private GanttChartDao ganttChartDao; private TaskDao taskDao; @Test public void testConvertingTaskTree() { logon(TEST_ADMIN_USER); final String prefix = "task2Gantt"; initTestDB.addTask(prefix, "root"); initTestDB.addTask(prefix + "1", prefix); initTestDB.addTask(prefix + "1.1", prefix + "1"); initTestDB.addTask(prefix + "1.1.1", prefix + "1.1"); initTestDB.addTask(prefix + "1.1.2", prefix + "1.1"); initTestDB.addTask(prefix + "1.2", prefix + "1"); initTestDB.addTask(prefix + "1.2.1", prefix + "1.2"); initTestDB.addTask(prefix + "1.2.2", prefix + "1.2"); initTestDB.addTask(prefix + "2", prefix); initTestDB.addTask(prefix + "2.1", prefix + "2"); initTestDB.addTask(prefix + "2.2", prefix + "2"); initTestDB.addTask(prefix + "2.3", prefix + "2"); final DayHolder day = new DayHolder(); day.setDate(2010, Calendar.AUGUST, 16); taskDao.update(getTask(prefix + "2.1").setStartDate(day.getDate()).setDuration(BigDecimal.TEN)); taskDao.update(getTask(prefix + "2.2").setGanttPredecessor(getTask(prefix + "2.1")).setDuration(BigDecimal.TEN)); taskDao.update(getTask(prefix + "1.1.1").setGanttPredecessor(getTask(prefix + "2.1")).setDuration(BigDecimal.TEN)); taskDao.update(getTask(prefix + "1.1.2").setGanttPredecessor(getTask(prefix + "1.1.1")).setDuration(BigDecimal.TEN)); taskDao.update(getTask(prefix + "1.2.1").setGanttPredecessor(getTask(prefix + "2.2")).setDuration(BigDecimal.TEN)); taskDao.update(getTask(prefix + "1.2.2").setGanttPredecessor(getTask(prefix + "1.2.1")).setDuration(BigDecimal.TEN)); final GanttChartData ganttChartData = Task2GanttTaskConverter.convertToGanttObjectTree(taskDao.getTaskTree(), getTask(prefix + "1")); assertEquals("Two external objects (2.1 and 2.2) exptected.", 2, ganttChartData.getExternalObjects().size()); assertExternalTasks(ganttChartData, prefix); final GanttChartDO ganttChartDO = new GanttChartDO().setTask(getTask(prefix + "1")); ganttChartDao.writeGanttObjects(ganttChartDO, ganttChartData.getRootObject()); assertEquals("No output because there is no further information in the GanttObject tree.", "", ganttChartDO.getGanttObjectsAsXml()); GanttChartData data = ganttChartDao.readGanttObjects(ganttChartDO); assertExternalTasks(data, prefix); final GanttTask external2_1 = ganttChartData.getExternalObject(getTask(prefix + "2.1").getId()); // Change predecessors: findById(ganttChartData, prefix, "1.2").setPredecessor(ganttChartData.ensureAndGetExternalGanttObject(getTask(prefix + "2.3"))); findById(ganttChartData, prefix, "1.1.1").setPredecessor(null); findById(ganttChartData, prefix, "1.2.1").setPredecessor(external2_1); findById(ganttChartData, prefix, "1.1.2").setPredecessor(findById(ganttChartData, prefix, "1.2.2")); findById(ganttChartData, prefix, "1.2.2").setPredecessor(null); ganttChartDao.writeGanttObjects(ganttChartDO, ganttChartData.getRootObject()); final String xml = transform(prefix, "<ganttObject id='{1}'>" // + "<children>" + "<ganttObject id='{1.1}'>" + "<children>" + "<ganttObject id='{1.1.1}' predecessor='null'/>" // Write null predecessor (modified). + "<ganttObject id='{1.1.2}'><predecessor id='{1.2.2}' predecessor='null' o-id='0'/></ganttObject>" // Write null predecessor // (modified). + "</children>" + "</ganttObject>" + "<ganttObject id='{1.2}'><predecessor id='{2.3}'/>" + "<children>" + "<ganttObject id='{1.2.1}'><predecessor id='{2.1}'/></ganttObject>" // Write external Gantt object only with id + "<ganttObject ref-id='0'/>" + "</children>" + "</ganttObject>" + "</children>" + "</ganttObject>"); assertEquals("Gantt objects as xml.", xml, ganttChartDO.getGanttObjectsAsXml()); data = ganttChartDao.readGanttObjects(ganttChartDO); ganttChartDao.writeGanttObjects(ganttChartDO, data.getRootObject()); assertEquals("Gantt objects as xml.", xml, ganttChartDO.getGanttObjectsAsXml()); assertNull("Predecessor was set to null.", findById(data, prefix, "1.2.2").getPredecessor()); assertEquals("External predecessor expected.", prefix + "2.3", findById(data, prefix, "1.2").getPredecessor().getTitle()); } private GanttTask findById(final GanttChartData ganttChartData, final String prefix, final String id) { return ganttChartData.findById(getTask(prefix + id).getId()); } private void assertExternalTasks(final GanttChartData ganttChartData, final String prefix) { GanttTask externalGanttTask = ganttChartData.getExternalObject(getTaskId(prefix + "2.1")); assertNull("Predecessor should be null.", externalGanttTask.getPredecessor()); assertDate("Start date unmodified.", 2010, Calendar.AUGUST, 16, externalGanttTask.getStartDate()); assertDate("End date should have been calculated and set.", 2010, Calendar.AUGUST, 30, externalGanttTask.getEndDate()); externalGanttTask = ganttChartData.getExternalObject(getTaskId(prefix + "2.2")); assertNull("Predecessor should be null.", externalGanttTask.getPredecessor()); assertDate("Start date should have been calculated and set.", 2010, Calendar.AUGUST, 30, externalGanttTask.getStartDate()); assertDate("End date should have been calculated and set.", 2010, Calendar.SEPTEMBER, 13, externalGanttTask.getEndDate()); } private void assertDate(final String message, final int year, final int month, final int dayOfMonth, final Date date) { final DayHolder dh = new DayHolder(date); assertEquals(message, year, dh.getYear()); assertEquals(message, month, dh.getMonth()); assertEquals(message, dayOfMonth, dh.getDayOfMonth()); } private Integer getTaskId(final String taskName) { final TaskDO task = getTask(taskName); if (task != null) { return task.getId(); } return null; } private String transform(final String prefix, final String str) { final String text = str.replace('\'', '"'); final Pattern p = Pattern.compile("\\{([0-9\\.]*)\\}", Pattern.MULTILINE); final StringBuffer buf = new StringBuffer(); final Matcher m = p.matcher(text); while (m.find()) { if (m.group(1) != null) { final TaskDO task = getTask(prefix + m.group(1)); if (task != null) { m.appendReplacement(buf, String.valueOf(task.getId())); } else { m.appendReplacement(buf, "*** task " + m.group(1) + " not-found***"); } } } m.appendTail(buf); return buf.toString(); } public void setGanttChartDao(GanttChartDao ganttChartDao) { this.ganttChartDao = ganttChartDao; } public void setTaskDao(TaskDao taskDao) { this.taskDao = taskDao; } }