r2687 - in trunk: . src/main/java/org/chorem/jtimer/data src/main/java/org/chorem/jtimer/io src/main/java/org/chorem/jtimer/ui/treetable/dnd src/main/java/org/chorem/jtimer/ws/xmlrpc src/main/resources/org/chorem/jtimer/resources src/test/java/org/chorem/jtimer/data
Author: echatellier Date: 2009-11-03 11:06:13 +0100 (Tue, 03 Nov 2009) New Revision: 2687 Added: trunk/src/test/java/org/chorem/jtimer/data/CommonVetoableTest.java Modified: trunk/changelog.txt trunk/src/main/java/org/chorem/jtimer/data/CommonVetoable.java trunk/src/main/java/org/chorem/jtimer/data/TimerDataManager.java trunk/src/main/java/org/chorem/jtimer/data/VetoableDataEventListener.java trunk/src/main/java/org/chorem/jtimer/io/GTimerIncrementalSaver.java trunk/src/main/java/org/chorem/jtimer/ui/treetable/dnd/TimerTaskTransferHandler.java trunk/src/main/java/org/chorem/jtimer/ws/xmlrpc/ChoremXMLRPCClient.java trunk/src/main/resources/org/chorem/jtimer/resources/JTimer.properties trunk/src/main/resources/org/chorem/jtimer/resources/JTimer_fr.properties trunk/src/test/java/org/chorem/jtimer/data/TimerDataManagerTest.java Log: Add multiples tasks move support. Add test about forbidden actions. Modified: trunk/changelog.txt =================================================================== --- trunk/changelog.txt 2009-11-03 09:02:37 UTC (rev 2686) +++ trunk/changelog.txt 2009-11-03 10:06:13 UTC (rev 2687) @@ -3,6 +3,7 @@ jTimer (1.3.1) stable; urgency=low + * Add multiples task move support * Readd jnlp launch * Fix systray popup menu not closed on focus lost * Force task selection on right clic Modified: trunk/src/main/java/org/chorem/jtimer/data/CommonVetoable.java =================================================================== --- trunk/src/main/java/org/chorem/jtimer/data/CommonVetoable.java 2009-11-03 09:02:37 UTC (rev 2686) +++ trunk/src/main/java/org/chorem/jtimer/data/CommonVetoable.java 2009-11-03 10:06:13 UTC (rev 2687) @@ -1,5 +1,5 @@ /* *##% - * Copyright (C) 2008 Code Lutin + * Copyright (C) 2008, 2009 Code Lutin * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -18,6 +18,7 @@ package org.chorem.jtimer.data; +import java.util.Collection; import java.util.Date; import java.util.List; @@ -50,7 +51,9 @@ protected static final String DUPLICATED_PROJECT_VIOLATION = "vetoable.common.duplicated.project.name"; /** Duplicated task violation key. */ protected static final String DUPLICATED_TASK_VIOLATION = "vetoable.common.duplicated.task.name"; - /** Violation if try to merge task and projet */ + /** Violation if try to move project into task. */ + protected static final String MOVE_INVALID_TYPES_VIOLATION = "vetoable.common.move.invalid.types"; + /** Violation if try to merge task and project. */ protected static final String MERGE_INVALID_TYPES_VIOLATION = "vetoable.common.merge.invalid.types"; /** Data manager */ @@ -178,14 +181,27 @@ * {@inheritDoc} */ @Override - public void checkMoveTask(TimerTask task, TimerTask taskToMoveTo) { - // check duplicated task name - if (isSameTaskName(task, taskToMoveTo.getSubTasks())) { - if (log.isDebugEnabled()) { - log.debug("Duplicated name, checkMoveTask won't pass"); + public void checkMoveTask(TimerTask destination, Collection<TimerTask> tasksToMove) { + + for (TimerTask taskToMove : tasksToMove) { + + // can't move projects + if (taskToMove instanceof TimerProject) { + if (log.isDebugEnabled()) { + log.debug("Move project, impossible"); + } + throw new DataViolationException("Can't move project", + MOVE_INVALID_TYPES_VIOLATION); } - throw new DataViolationException("Can't move task", - DUPLICATED_TASK_VIOLATION); + + // check duplicated task name + if (isSameTaskName(taskToMove, destination.getSubTasks())) { + if (log.isDebugEnabled()) { + log.debug("Duplicated name, checkMoveTask won't pass"); + } + throw new DataViolationException("Can't move task", + DUPLICATED_TASK_VIOLATION); + } } } Modified: trunk/src/main/java/org/chorem/jtimer/data/TimerDataManager.java =================================================================== --- trunk/src/main/java/org/chorem/jtimer/data/TimerDataManager.java 2009-11-03 09:02:37 UTC (rev 2686) +++ trunk/src/main/java/org/chorem/jtimer/data/TimerDataManager.java 2009-11-03 10:06:13 UTC (rev 2687) @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; +import java.util.Collections; import java.util.Date; import java.util.Iterator; import java.util.List; @@ -425,36 +426,37 @@ /** * Move task. * - * @param taskToMove task to move - * @param newParentTask task to move to + * @param destination task to move to + * @param tasksToMove tasks to move */ - public synchronized void moveTask(TimerTask taskToMove, - TimerTask newParentTask) { + public synchronized void moveTask(TimerTask destination, Collection<TimerTask> tasksToMove) { // fire vetoable event Iterator<VetoableDataEventListener> itVetoableDataEventListener = vetoableDataEventListeners .iterator(); while (itVetoableDataEventListener.hasNext()) { - itVetoableDataEventListener.next().checkMoveTask(taskToMove, - newParentTask); + itVetoableDataEventListener.next().checkMoveTask(destination, tasksToMove); } - // send notification (pre) - Iterator<DataEventListener> itDataEventListener = dataEventListeners - .iterator(); - while (itDataEventListener.hasNext()) { - itDataEventListener.next().preMoveTask(taskToMove); - } + for (TimerTask taskToMove : tasksToMove) { - // move task - TimerTask actualParent = taskToMove.getParent(); - actualParent.getSubTasks().remove(taskToMove); - newParentTask.addTask(taskToMove); + // send notification (pre) + Iterator<DataEventListener> itDataEventListener = dataEventListeners + .iterator(); + while (itDataEventListener.hasNext()) { + itDataEventListener.next().preMoveTask(taskToMove); + } - // send notification (post) - itDataEventListener = dataEventListeners.iterator(); - while (itDataEventListener.hasNext()) { - itDataEventListener.next().moveTask(taskToMove); + // move task + TimerTask actualParent = taskToMove.getParent(); + actualParent.getSubTasks().remove(taskToMove); + destination.addTask(taskToMove); + + // send notification (post) + itDataEventListener = dataEventListeners.iterator(); + while (itDataEventListener.hasNext()) { + itDataEventListener.next().moveTask(taskToMove); + } } } @@ -524,7 +526,7 @@ log.debug("Moving task " + otherTaskSubTask.getName() + " to " + destinationTask.getName()); } // just move - moveTask(otherTaskSubTask, destinationTask); + moveTask(destinationTask, Collections.singleton(otherTaskSubTask)); } else { // task must be merged Modified: trunk/src/main/java/org/chorem/jtimer/data/VetoableDataEventListener.java =================================================================== --- trunk/src/main/java/org/chorem/jtimer/data/VetoableDataEventListener.java 2009-11-03 09:02:37 UTC (rev 2686) +++ trunk/src/main/java/org/chorem/jtimer/data/VetoableDataEventListener.java 2009-11-03 10:06:13 UTC (rev 2687) @@ -18,6 +18,7 @@ package org.chorem.jtimer.data; +import java.util.Collection; import java.util.Date; import java.util.EventListener; import java.util.List; @@ -106,10 +107,10 @@ /** * Check move task. * - * @param task task to move - * @param taskToMoveTo task to move to + * @param destination task to move to + * @param tasksToMove tasks to move */ - public void checkMoveTask(TimerTask task, TimerTask taskToMoveTo); + public void checkMoveTask(TimerTask destination, Collection<TimerTask> tasksToMove); /** * Check merge task. Modified: trunk/src/main/java/org/chorem/jtimer/io/GTimerIncrementalSaver.java =================================================================== --- trunk/src/main/java/org/chorem/jtimer/io/GTimerIncrementalSaver.java 2009-11-03 09:02:37 UTC (rev 2686) +++ trunk/src/main/java/org/chorem/jtimer/io/GTimerIncrementalSaver.java 2009-11-03 10:06:13 UTC (rev 2687) @@ -1574,7 +1574,7 @@ * {@inheritDoc} */ @Override - public void checkMoveTask(TimerTask task, TimerTask taskToMoveTo) { + public void checkMoveTask(TimerTask destination, Collection<TimerTask> tasksToMove) { } Modified: trunk/src/main/java/org/chorem/jtimer/ui/treetable/dnd/TimerTaskTransferHandler.java =================================================================== --- trunk/src/main/java/org/chorem/jtimer/ui/treetable/dnd/TimerTaskTransferHandler.java 2009-11-03 09:02:37 UTC (rev 2686) +++ trunk/src/main/java/org/chorem/jtimer/ui/treetable/dnd/TimerTaskTransferHandler.java 2009-11-03 10:06:13 UTC (rev 2687) @@ -22,6 +22,7 @@ import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.IOException; +import java.util.Collections; import java.util.List; import javax.swing.JComponent; @@ -177,7 +178,7 @@ TimerTask movedTask = (TimerTask) myObject; try { - dataManager.moveTask(movedTask, destinationTask); + dataManager.moveTask(destinationTask, Collections.singleton(movedTask)); } catch(DataViolationException e) { String title = resourceMap.getString("action.invalidActionTitle"); Modified: trunk/src/main/java/org/chorem/jtimer/ws/xmlrpc/ChoremXMLRPCClient.java =================================================================== --- trunk/src/main/java/org/chorem/jtimer/ws/xmlrpc/ChoremXMLRPCClient.java 2009-11-03 09:02:37 UTC (rev 2686) +++ trunk/src/main/java/org/chorem/jtimer/ws/xmlrpc/ChoremXMLRPCClient.java 2009-11-03 10:06:13 UTC (rev 2687) @@ -1018,12 +1018,25 @@ * {@inheritDoc} */ @Override - public void checkMoveTask(TimerTask task, TimerTask taskToMoveTo) { + public void checkMoveTask(TimerTask destination, Collection<TimerTask> tasksToMove) { - TimerProject project1 = TimerTaskHelper.getTaskProject(task); - TimerProject project2 = TimerTaskHelper.getTaskProject(taskToMoveTo); + boolean syncProject = false; + // destination (single) + TimerProject project1 = TimerTaskHelper.getTaskProject(destination); + if (project1.isSynchronized()) { + syncProject = true; + } - if (project1.isSynchronized() || project2.isSynchronized()) { + // sources (multiples) + for (TimerTask taskToMove : tasksToMove) { + TimerProject project2 = TimerTaskHelper.getTaskProject(taskToMove); + + if (project2.isSynchronized()) { + syncProject = true; + } + } + + if (syncProject) { if (log.isDebugEnabled()) { log.debug("Project is synchronized, checkMoveTask won't pass"); } Modified: trunk/src/main/resources/org/chorem/jtimer/resources/JTimer.properties =================================================================== --- trunk/src/main/resources/org/chorem/jtimer/resources/JTimer.properties 2009-11-03 09:02:37 UTC (rev 2686) +++ trunk/src/main/resources/org/chorem/jtimer/resources/JTimer.properties 2009-11-03 10:06:13 UTC (rev 2687) @@ -139,6 +139,7 @@ vetoable.common.duplicated.project.name=A project already exists with that name at this level ! vetoable.common.duplicated.task.name=A task already exists with that name at this level ! vetoable.common.merge.invalid.types=Can't merge project and task ! +vetoable.common.move.invalid.types=Can't move project ! vetoable.saver.empty.task.name=Empty task name ! vetoable.saver.invalid.task.characters=Task name contains invalid characters ! vetoable.ws.chorem.cant.modify.synchronized.project=Can't do this action on a synchronized project ! Modified: trunk/src/main/resources/org/chorem/jtimer/resources/JTimer_fr.properties =================================================================== --- trunk/src/main/resources/org/chorem/jtimer/resources/JTimer_fr.properties 2009-11-03 09:02:37 UTC (rev 2686) +++ trunk/src/main/resources/org/chorem/jtimer/resources/JTimer_fr.properties 2009-11-03 10:06:13 UTC (rev 2687) @@ -119,6 +119,7 @@ vetoable.common.duplicated.project.name=Un projet avec ce nom existe d\u00E9j\u00E0 \u00E0 ce niveau ! vetoable.common.duplicated.task.name=Une t\u00E2che avec ce nom existe d\u00E9j\u00E0 \u00E0 ce niveau ! vetoable.common.merge.invalid.types=Impossible de fusionner un projet et une t\u00E2che ! +vetoable.common.move.invalid.types=Impossible de d\u00E9placer un projet ! vetoable.saver.empty.name=Le nom est vide ! vetoable.saver.invalid.characters=Le nom contient des caract\u00E8res invalide ! vetoable.ws.chorem.cant.modify.synchronized.project=Impossible d'effectuer cette action sur un projet synchronis\u00E9 ! Added: trunk/src/test/java/org/chorem/jtimer/data/CommonVetoableTest.java =================================================================== --- trunk/src/test/java/org/chorem/jtimer/data/CommonVetoableTest.java (rev 0) +++ trunk/src/test/java/org/chorem/jtimer/data/CommonVetoableTest.java 2009-11-03 10:06:13 UTC (rev 2687) @@ -0,0 +1,155 @@ +/* *##% + * Copyright (C) 2009 Code Lutin + * + * This program 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; either version 2 + * of the License, or (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + *##%*/ + +package org.chorem.jtimer.data; + +import java.util.Collections; +import java.util.Date; +import java.util.List; + +import junit.framework.Assert; + +import org.chorem.jtimer.AbstractJTimerTest; +import org.chorem.jtimer.entities.TimerProject; +import org.chorem.jtimer.entities.TimerTask; +import org.testng.annotations.Test; + +/** + * Test that all forbidden operation by {@link CommonVetoable} throws + * excepted exception. + * + * @author chatellier + * @version $Revision$ + * + * Last update : $Date$ + * By : $Author$ + */ +public class CommonVetoableTest extends AbstractJTimerTest { + + /** + * Test create with already existing name. + */ + @Test(expectedExceptions = DataViolationException.class) + public void testAddProject() { + // first load all + // and make a move operation + TimerCore core = new TimerCore(); + TimerDataManager dataManager = core.getData(); + + //core.init(); + core.load(); + + // add new project + TimerProject project = new TimerProject("jTimer"); + project.setCreationDate(new Date()); + dataManager.addProject(project); + } + + /** + * Test create task with already existing name. + */ + @Test(expectedExceptions = DataViolationException.class) + public void testAddTask() { + + // first load all + // and make a move operation + TimerCore core = new TimerCore(); + TimerDataManager dataManager = core.getData(); + + //core.init(); + core.load(); + List<TimerProject> projectsBefore = dataManager.getProjectsList(); + TimerTask task1 = findTask(projectsBefore, "IsisFish/UserInterface"); + + // add a new task + TimerTask newTask = new TimerTask("Debug"); + newTask.setCreationDate(new Date()); + dataManager.addTask(task1, newTask); + } + + /** + * Test single task move, trying to move projects into tasks. + */ + @Test(expectedExceptions = DataViolationException.class) + public void testMoveTask() { + + // first load all + // and make a move operation + TimerCore core = new TimerCore(); + TimerDataManager dataManager = core.getData(); + + //core.init(); + core.load(); + List<TimerProject> projectsBefore = dataManager.getProjectsList(); + TimerTask task1 = findProject(projectsBefore, "Topia"); + TimerTask task2 = findTask(projectsBefore, "jTimer/Add workspace support"); + + Assert.assertNotNull(task1); + Assert.assertNotNull(task2); + + // move task + dataManager.moveTask(task2, Collections.singleton(task1)); + } + + /** + * Test single task move, into another task where name already exists. + */ + @Test(expectedExceptions = DataViolationException.class) + public void testMoveTask2() { + + // first load all + // and make a move operation + TimerCore core = new TimerCore(); + TimerDataManager dataManager = core.getData(); + + //core.init(); + core.load(); + List<TimerProject> projectsBefore = dataManager.getProjectsList(); + TimerTask task1 = findTask(projectsBefore, "Chorem/Add webservice"); + TimerTask task2 = findTask(projectsBefore, "jTimer"); + + Assert.assertNotNull(task1); + Assert.assertNotNull(task2); + + // rename tank before move + // (task jTimer/Add workspace support exists !) + dataManager.editTask(task1, "Add workspace support"); + + // move task + dataManager.moveTask(task2, Collections.singleton(task1)); + } + + /** + * Merge two projects and tasks. + */ + @Test(expectedExceptions = DataViolationException.class) + public void testMergeTasks() { + // first load all + TimerCore core = new TimerCore(); + TimerDataManager dataManager = core.getData(); + + //core.init(); + core.load(); + List<TimerProject> projectsBefore = dataManager.getProjectsList(); + TimerTask task1 = findTask(projectsBefore, "Chorem"); + TimerTask task2 = findTask(projectsBefore, "jTimer/Unit tests/UI tests"); + + // merge tasks + dataManager.mergeTasks(task2, Collections.singletonList(task1)); + } +} Property changes on: trunk/src/test/java/org/chorem/jtimer/data/CommonVetoableTest.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL" Modified: trunk/src/test/java/org/chorem/jtimer/data/TimerDataManagerTest.java =================================================================== --- trunk/src/test/java/org/chorem/jtimer/data/TimerDataManagerTest.java 2009-11-03 09:02:37 UTC (rev 2686) +++ trunk/src/test/java/org/chorem/jtimer/data/TimerDataManagerTest.java 2009-11-03 10:06:13 UTC (rev 2687) @@ -19,8 +19,10 @@ package org.chorem.jtimer.data; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.Date; +import java.util.HashSet; import java.util.List; import org.chorem.jtimer.AbstractJTimerTest; @@ -257,12 +259,10 @@ } /** - * Test move task. - * - * A task with subtasks should be valid. + * Test single task move. */ @Test - public void testTaskMove() { + public void testMoveTask() { // first load all // and make a move operation @@ -281,7 +281,7 @@ Assert.assertNull(task3); // move task 3 in jTimer/3 - dataManager.moveTask(task2, task1); + dataManager.moveTask(task1, Collections.singleton(task2)); core.exit(); // second reload @@ -297,7 +297,61 @@ Assert.assertNull(task2a); Assert.assertNotNull(task3a); } + + /** + * Test multiples tasks move. + */ + @Test + public void testMoveMultiplesTasks() { + // first load all + // and make a move operation + TimerCore core = new TimerCore(); + TimerDataManager dataManager = core.getData(); + + //core.init(); + core.load(); + List<TimerProject> projectsBefore = dataManager.getProjectsList(); + TimerProject project1 = findProject(projectsBefore, "Chorem"); + TimerTask task1 = findTask(projectsBefore, "jTimer/Add workspace support"); + TimerTask task2 = findTask(projectsBefore, "jTimer/Interact with chorem services"); + TimerTask task3 = findTask(projectsBefore, "jTimer/Refactoring"); + TimerTask task4 = findTask(projectsBefore, "jTimer/Unit tests"); + + Assert.assertNotNull(project1); + Assert.assertNotNull(task1); + Assert.assertNotNull(task2); + Assert.assertNotNull(task3); + Assert.assertNotNull(task4); + + Collection<TimerTask> tasksToMove = new HashSet<TimerTask>(); + tasksToMove.add(task1); + tasksToMove.add(task2); + tasksToMove.add(task3); + tasksToMove.add(task4); + + // move task 3 in jTimer/3 + dataManager.moveTask(project1, tasksToMove); + core.exit(); + + // second reload + // and test reloaded data + //core.init(); + core.load(); + List<TimerProject> projectsAfter = dataManager.getProjectsList(); + TimerTask task1a = findTask(projectsAfter, "Chorem/Add workspace support"); + TimerTask task2a = findTask(projectsAfter, "Chorem/Interact with chorem services"); + TimerTask task3a = findTask(projectsAfter, "Chorem/Refactoring"); + TimerTask task4a = findTask(projectsAfter, "Chorem/Unit tests"); + TimerProject project1a = findProject(projectsBefore, "jTimer"); + + Assert.assertNotNull(task1a); + Assert.assertNotNull(task2a); + Assert.assertNotNull(task3a); + Assert.assertNotNull(task4a); + Assert.assertEquals(0, project1a.getSubTasks().size()); + } + /* * Merge two project together. *
participants (1)
-
echatellier@users.chorem.org