Author: echatellier Date: 2009-08-21 11:27:37 +0200 (Fri, 21 Aug 2009) New Revision: 2649 Modified: trunk/src/main/java/org/chorem/jtimer/io/GTimerIncrementalSaver.java trunk/src/test/java/org/chorem/jtimer/data/TimerDataManagerTest.java trunk/src/test/java/org/chorem/jtimer/io/GTimerIncrementalSaverTest.java trunk/src/test/resources/testdata/24.alert Log: Alert file can't be loaded using Properties.load(). Key appears multiples times. Use readLines now. Modified: trunk/src/main/java/org/chorem/jtimer/io/GTimerIncrementalSaver.java =================================================================== --- trunk/src/main/java/org/chorem/jtimer/io/GTimerIncrementalSaver.java 2009-08-21 08:35:37 UTC (rev 2648) +++ trunk/src/main/java/org/chorem/jtimer/io/GTimerIncrementalSaver.java 2009-08-21 09:27:37 UTC (rev 2649) @@ -19,10 +19,12 @@ package org.chorem.jtimer.io; import java.io.BufferedInputStream; +import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; +import java.io.FileReader; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.RandomAccessFile; @@ -604,6 +606,9 @@ /** * Find task alert and load it. * + * This file can't be loaded by {@code Properties#load(java.io.InputStream)}. + * Constains duplicated keys. + * * @param task task to load alert * @throws IOException if can't read ann file */ @@ -618,47 +623,45 @@ log.debug("Alert found for task " + task.getName()); } - Properties prop = new Properties(); - prop.load(new BufferedInputStream( - new FileInputStream(alertTaskFile))); + BufferedReader alertIn = new BufferedReader(new FileReader( + alertTaskFile)); - // analyse des donnees (temps) - for (Object key : prop.keySet()) { - String keyName = (String) key; + // skip first line : "format: 1.2" + String line = alertIn.readLine(); + while ((line = alertIn.readLine()) != null) { - // test if key format match - if ("reachtotaltime".equals(keyName)) { - String alertInfo = prop.getProperty(keyName); + line = line.trim(); + if (!line.isEmpty()) { + String alertType = line.substring(0, line.indexOf(' ')); + String alertDuration = line.substring( + line.indexOf(' ') + 1, line.length()); + try { - long duration = Long.parseLong(alertInfo); - - TimerAlert alert = new TimerAlert( - TimerAlert.Type.REACH_TOTAL_TIME, duration); - task.addAlert(alert); - } catch (NumberFormatException e) { - if (log.isErrorEnabled()) { - log.error("Can't convert " + alertInfo - + " into long"); + if ("reachtotaltime".equals(alertType)) { + Long duration = Long.parseLong(alertDuration); + TimerAlert alert = new TimerAlert( + TimerAlert.Type.REACH_TOTAL_TIME, duration); + task.addAlert(alert); + } else if ("reachdailytime".equals(alertType)) { + Long duration = Long.parseLong(alertDuration); + TimerAlert alert = new TimerAlert( + TimerAlert.Type.REACH_TOTAL_TIME, duration); + task.addAlert(alert); + } else { + if (log.isWarnEnabled()) { + log.warn("Unknow alert type " + alertType); + } } - } - } - - if ("reachdailytime".equals(keyName)) { - String alertInfo = prop.getProperty(keyName); - try { - long duration = Long.parseLong(alertInfo); - - TimerAlert alert = new TimerAlert( - TimerAlert.Type.REACH_DAILY_TIME, duration); - task.addAlert(alert); } catch (NumberFormatException e) { if (log.isErrorEnabled()) { - log.error("Can't convert " + alertInfo + log.error("Can't convert " + alertDuration + " into long"); } } } } + + alertIn.close(); } } Modified: trunk/src/test/java/org/chorem/jtimer/data/TimerDataManagerTest.java =================================================================== --- trunk/src/test/java/org/chorem/jtimer/data/TimerDataManagerTest.java 2009-08-21 08:35:37 UTC (rev 2648) +++ trunk/src/test/java/org/chorem/jtimer/data/TimerDataManagerTest.java 2009-08-21 09:27:37 UTC (rev 2649) @@ -24,6 +24,7 @@ import java.util.List; import org.chorem.jtimer.AbstractJTimerTest; +import org.chorem.jtimer.entities.TimerAlert; import org.chorem.jtimer.entities.TimerProject; import org.chorem.jtimer.entities.TimerTask; import org.chorem.jtimer.entities.TimerTaskHelper; @@ -215,7 +216,7 @@ Assert.assertEquals(task1a.getSubTasks().size(), 2); Assert.assertNotNull(task2a); } - + /** * Test edit task. */ @@ -384,7 +385,7 @@ Assert.assertEquals(task3a.getSubTasks().size(), 3); Assert.assertEquals(TimerTaskHelper.getAllTotalTime(task1a), 55035 + 65602); } - + /** * Merge two tasks together. * @@ -430,16 +431,81 @@ Assert.assertNotNull(task1a); Assert.assertNull(task2a); // 4 = conflict resolved - Assert.assertEquals(task1a.getSubTasks().size(), 4); - Assert.assertEquals(TimerTaskHelper.getAllTotalTime(task1a), 55035 + 65602 + 200); + Assert.assertEquals(task1a.getSubTasks().size(), 4); + Assert.assertEquals(TimerTaskHelper.getAllTotalTime(task1a), + 55035 + 65602 + 200); } - + /** + * Test add alert. + * + * Alert reloading was buggy when multiple alert types were defined. + * (i.e. two alert type REACH_DAILY_TIME) + */ + @Test + public void testAddAlert() { + // 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, "jTimer/Refactoring"); + + Assert.assertNotNull(task1); + Assert.assertEquals(getRecursiveAlertsCount(Collections + .singleton(task1)), 0); + + // add new project + TimerAlert alert1 = new TimerAlert(TimerAlert.Type.REACH_DAILY_TIME, 3600); + TimerAlert alert2 = new TimerAlert(TimerAlert.Type.REACH_DAILY_TIME, 7200); + TimerAlert alert3 = new TimerAlert(TimerAlert.Type.REACH_TOTAL_TIME, 10800); + task1.addAlert(alert1); + task1.addAlert(alert2); + task1.addAlert(alert3); + dataManager.modifyAlert(task1); + core.exit(); + + // second reload + // and test reloaded data + //core.init(); + core.load(); + List<TimerProject> projectsAfter = dataManager.getProjectsList(); + TimerTask task1a = findTask(projectsAfter, "jTimer/Refactoring"); + + Assert.assertNotNull(task1a); + Assert.assertEquals(getRecursiveAlertsCount(Collections + .singleton(task1a)), 3); + + // test correct alert loading + boolean alert1found = false; + boolean alert2found = false; + boolean alert3found = false; + for (TimerAlert alert : task1a.getAlerts()) { + // TODO commenct on fait pour comparer des enum ? + if (/*alert.getType().equals(Type.REACH_DAILY_TIME) && */alert.getDuration() == 3600) { + alert1found = true; + } + if (/*alert.getType().equals(Type.REACH_DAILY_TIME) && */alert.getDuration() == 7200) { + alert2found = true; + } + if (/*alert.getType().equals(Type.REACH_TOTAL_TIME) && */alert.getDuration() == 10800) { + alert3found = true; + } + } + Assert.assertTrue(alert1found, "Missing first alert"); + Assert.assertTrue(alert2found, "Missing second alert"); + Assert.assertTrue(alert3found, "Missing third alert"); + } + + /** * Merge two tasks (tests alerts merge). */ @Test public void testMergeTasksWithAlerts() { - // first load all + // first load all TimerCore core = new TimerCore(); TimerDataManager dataManager = core.getData(); @@ -455,7 +521,7 @@ Assert.assertNotNull(task3); Assert.assertEquals(getRecursiveAlertsCount(Collections.singleton(task1)), 1); Assert.assertEquals(getRecursiveAlertsCount(Collections.singleton(task2)), 0); - Assert.assertEquals(getRecursiveAlertsCount(Collections.singleton(task3)), 2); + Assert.assertEquals(getRecursiveAlertsCount(Collections.singleton(task3)), 3); // merge tasks List<TimerTask> othersTask = new ArrayList<TimerTask>(); @@ -476,6 +542,6 @@ Assert.assertNull(task1a); Assert.assertNotNull(task2a); Assert.assertNull(task3a); - Assert.assertEquals(getRecursiveAlertsCount(Collections.singleton(task2)), 3); + Assert.assertEquals(getRecursiveAlertsCount(Collections.singleton(task2)), 4); } } Modified: trunk/src/test/java/org/chorem/jtimer/io/GTimerIncrementalSaverTest.java =================================================================== --- trunk/src/test/java/org/chorem/jtimer/io/GTimerIncrementalSaverTest.java 2009-08-21 08:35:37 UTC (rev 2648) +++ trunk/src/test/java/org/chorem/jtimer/io/GTimerIncrementalSaverTest.java 2009-08-21 09:27:37 UTC (rev 2649) @@ -95,7 +95,7 @@ Assert.assertEquals(getProjectsCount(projects), 5); Assert.assertEquals(getTasksCount(projects), 39); Assert.assertEquals(getAnnotationsCount(projects), 9); - Assert.assertEquals(getAlertsCount(projects), 5); + Assert.assertEquals(getAlertsCount(projects), 6); /*FIXME saver.unlock(); } catch (DataLockingException e) { Modified: trunk/src/test/resources/testdata/24.alert =================================================================== --- trunk/src/test/resources/testdata/24.alert 2009-08-21 08:35:37 UTC (rev 2648) +++ trunk/src/test/resources/testdata/24.alert 2009-08-21 09:27:37 UTC (rev 2649) @@ -1,3 +1,4 @@ Format: 1.2 reachdailytime 3600 +reachdailytime 7200 reachtotaltime 26600