This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository jtimer. See http://git.chorem.org/jtimer.git commit 48a11de728d49802f3e8f507b3e6d37339e44740 Author: Eric Chatellier <chatellier@codelutin.com> Date: Wed Mar 2 14:21:04 2016 +0100 fixes #1319: Remplace json format by yaml --- pom.xml | 12 ++----- src/main/java/org/chorem/jtimer/JTimerConfig.java | 40 +++++++++++++++------- .../org/chorem/jtimer/data/TimerDataManager.java | 26 +++++++------- .../java/org/chorem/jtimer/ui/NewTaskPanel.java | 2 +- src/site/rst/configuration.rst | 8 ++--- .../java/org/chorem/jtimer/JTimerFactoryTest.java | 10 +++--- src/test/resources/jtimertest.properties | 5 ++- src/test/resources/templates/project1.txt | 11 ++++++ src/test/resources/templates/project2.yaml | 3 ++ 9 files changed, 69 insertions(+), 48 deletions(-) diff --git a/pom.xml b/pom.xml index a7cf280..b0deb26 100644 --- a/pom.xml +++ b/pom.xml @@ -309,15 +309,9 @@ <version>2.3.23</version> </dependency> <dependency> - <groupId>com.googlecode.json-simple</groupId> - <artifactId>json-simple</artifactId> - <version>1.1.1</version> - <exclusions> - <exclusion> - <artifactId>junit</artifactId> - <groupId>junit</groupId> - </exclusion> - </exclusions> + <groupId>org.yaml</groupId> + <artifactId>snakeyaml</artifactId> + <version>1.17</version> </dependency> <!-- commons-xxx lib --> diff --git a/src/main/java/org/chorem/jtimer/JTimerConfig.java b/src/main/java/org/chorem/jtimer/JTimerConfig.java index 46dfbed..ac98d49 100644 --- a/src/main/java/org/chorem/jtimer/JTimerConfig.java +++ b/src/main/java/org/chorem/jtimer/JTimerConfig.java @@ -22,17 +22,23 @@ package org.chorem.jtimer; -import java.util.List; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.DirectoryIteratorException; +import java.nio.file.DirectoryStream; +import java.nio.file.FileSystems; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.Map; -import java.util.Map.Entry; -import java.util.Properties; import java.util.TreeMap; +import org.apache.commons.io.FilenameUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.json.simple.JSONValue; import org.nuiton.config.ApplicationConfig; import org.nuiton.config.ArgumentsParserException; +import org.yaml.snakeyaml.Yaml; /** * JTimer configuration. @@ -152,14 +158,23 @@ public class JTimerConfig { * * @return task template as map */ - public Map<String, List<?>> getTaskTemplates() { - String prefix = "jtimer.ui.task.templates."; - Properties props = appConfig.getOptionStartsWith(prefix); - Map<String, List<?>> result = new TreeMap<>(); - for (Entry<Object, Object> e : props.entrySet()) { - String name = ((String)e.getKey()).substring(prefix.length()); - List<?> value = (List<?>)JSONValue.parse((String)e.getValue()); - result.put(name, value); + public Map<String, Object> getTaskTemplates() { + Map<String, Object> result = new TreeMap<>(); + String tplDirectory = appConfig.getOption(JTimerOption.UI_TEMPLATE_DIRECTORY.key); + Path backupDir = FileSystems.getDefault().getPath(tplDirectory); + try (DirectoryStream<Path> stream = Files.newDirectoryStream(backupDir)) { + Yaml yaml = new Yaml(); + for (Path file : stream) { + try (InputStream is = new FileInputStream(file.toFile())) { + Object r = yaml.load(is); + String name = FilenameUtils.removeExtension(file.getFileName().toString()); + result.put(name, r); + } + } + } catch (DirectoryIteratorException|IOException ex) { + if (log.isErrorEnabled()) { + log.error("Can't create backup", ex); + } } return result; } @@ -208,6 +223,7 @@ public class JTimerConfig { IO_SAVER_CLASS("jtimer.io.saver.class", "org.chorem.jtimer.io.GTimerIncrementalSaver"), IO_SAVER_DIRECTORY("jtimer.io.saver.directory", "${user.home}/.gtimer"), IO_SAVER_AUTOSAVEDELAY("jtimer.io.saver.autosavedelay", "300"), + UI_TEMPLATE_DIRECTORY("jtimer.ui.template.directory", "${jtimer.io.saver.directory}/templates"), UI_IDLE_TIME("jtimer.ui.idletime", "300"), UI_SHOW_CLOSED("jtimer.ui.showclosed", "false"), UI_CLOSE_TO_SYSTRAY("jtimer.ui.closetosystray", "true"), diff --git a/src/main/java/org/chorem/jtimer/data/TimerDataManager.java b/src/main/java/org/chorem/jtimer/data/TimerDataManager.java index 3031466..1afccff 100644 --- a/src/main/java/org/chorem/jtimer/data/TimerDataManager.java +++ b/src/main/java/org/chorem/jtimer/data/TimerDataManager.java @@ -29,6 +29,7 @@ import java.util.Collections; import java.util.Date; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Map.Entry; import org.apache.commons.lang3.ArrayUtils; @@ -38,7 +39,6 @@ import org.chorem.jtimer.JTimer; import org.chorem.jtimer.entities.TimerAlert; import org.chorem.jtimer.entities.TimerProject; import org.chorem.jtimer.entities.TimerTask; -import org.json.simple.JSONObject; /** * Gere les donnees. Des objets peuvent s'enregistrer pour etre notifies des @@ -157,7 +157,7 @@ public class TimerDataManager { } if (taskTemplate != null) { - List<?> subTasks = JTimer.config.getTaskTemplates().get(taskTemplate); + Object subTasks = JTimer.config.getTaskTemplates().get(taskTemplate); createSubTasks(subTasks, task); } } @@ -168,26 +168,26 @@ public class TimerDataManager { * @param subTasks template to apply * @param task current subtask */ - protected void createSubTasks(List<?> subTasks, TimerTask task) { - for (JSONObject subTask : (List<JSONObject>)subTasks) { - String name = (String)subTask.get("name"); - if (name != null) { + protected void createSubTasks(Object subTasks, TimerTask task) { + if (subTasks != null && subTasks instanceof Map) { + Map<String, Object> realSubTasks = (Map<String, Object>)subTasks; + for (Map.Entry<String, Object> entry : realSubTasks.entrySet()) { + String name = entry.getKey(); + Object newSubTasks = entry.getValue(); + TimerTask newTask = new TimerTask(name); - + // Fix creation date newTask.setCreationDate(new Date()); - - task.addTask(newTask); + task.addTask(newTask); + // send notification for (DataEventListener dataEventListener : dataEventListeners) { dataEventListener.addTask(newTask); } - List<?> newSubTasks = (List<?>)subTask.get("tasks"); - if (newSubTasks != null) { - createSubTasks(newSubTasks, newTask); - } + createSubTasks(newSubTasks, newTask); } } } diff --git a/src/main/java/org/chorem/jtimer/ui/NewTaskPanel.java b/src/main/java/org/chorem/jtimer/ui/NewTaskPanel.java index dc4afde..222ad30 100644 --- a/src/main/java/org/chorem/jtimer/ui/NewTaskPanel.java +++ b/src/main/java/org/chorem/jtimer/ui/NewTaskPanel.java @@ -72,7 +72,7 @@ public class NewTaskPanel extends JPanel { new Insets(1, 1, 1, 1), 0, 0)); // Task template - Map<String, List<?>> templates = JTimer.config.getTaskTemplates(); + Map<String, Object> templates = JTimer.config.getTaskTemplates(); newTaskTemplateBox = new JComboBox<>(); diff --git a/src/site/rst/configuration.rst b/src/site/rst/configuration.rst index 8788b5d..e2ba12e 100644 --- a/src/site/rst/configuration.rst +++ b/src/site/rst/configuration.rst @@ -42,12 +42,10 @@ Default idle time is ``300`` seconds (5 minutes). It is possible to modify this Task template ------------- -jTimer can create a task using subtask template. You can specify template, as json format, using cofiguration option:: +jTimer can create a task using subtask template. You can specify template, as yaml format, by creating +a file into ``${userHome}/.gtimer/template`` directory (one file per template). - jtimer.ui.task.templates.templatename1=[{"name":"dev", "tasks":[{"name":"E1"},{"name":"E2"}]},{"name":"ano", "tasks":[{"name":"A1"}]},{"name":"admin", "tasks":[{"name":"database", "tasks":[{"name":"sub database task1"},{"name":"sub database task2"}]}]},{"name":"meetings"},{"name":"releases"}] - jtimer.ui.task.templates.templatename2=[{"name":"dev"}, {"name":"admin"}] - -The template named 'templatename1' will create following hierachy version is:: +For example, in file ``templatename1.txt``:: dev: E1: diff --git a/src/test/java/org/chorem/jtimer/JTimerFactoryTest.java b/src/test/java/org/chorem/jtimer/JTimerFactoryTest.java index 95db308..9085ef4 100644 --- a/src/test/java/org/chorem/jtimer/JTimerFactoryTest.java +++ b/src/test/java/org/chorem/jtimer/JTimerFactoryTest.java @@ -71,16 +71,16 @@ public class JTimerFactoryTest extends AbstractJTimerTest { */ @Test public void testJsonTaskTemplates() { - Map<String, List<?>> templates = JTimer.config.getTaskTemplates(); - List<?> p1Tpl = templates.get("project1"); + Map<String, Object> templates = JTimer.config.getTaskTemplates(); + Map<String, Object> p1Tpl = (Map<String, Object>)templates.get("project1"); Assert.assertNotNull(p1Tpl); - List<?> p2Tpl = templates.get("project2"); + Map<String, Object> p2Tpl = (Map<String, Object>)templates.get("project2"); Assert.assertNotNull(p2Tpl); - List<?> p3Tpl = templates.get("project3"); + Object p3Tpl = templates.get("project3"); Assert.assertNull(p3Tpl); Assert.assertEquals(p1Tpl.size(), 5); - Assert.assertEquals(p2Tpl.size(), 5); + Assert.assertEquals(p2Tpl.size(), 3); } /** diff --git a/src/test/resources/jtimertest.properties b/src/test/resources/jtimertest.properties index 6bd82b7..20f5ba3 100644 --- a/src/test/resources/jtimertest.properties +++ b/src/test/resources/jtimertest.properties @@ -30,6 +30,5 @@ jtimer.io.saver.directory=${user.home}/testngdata # Save delay jtimer.io.saver.autosavedelay=199 -# Task templates as json -jtimer.ui.task.templates.project1=[{"name":"dev1", "tasks":[{"name":"E1"},{"name":"E2"}]},{"name":"ano1", "tasks":[{"name":"A1"}]},{"name":"admin", "tasks":[{"name":"database", "tasks":[{"name":"sub database task1"},{"name":"sub database task2"}]}]},{"name":"meetings"},{"name":"releases"}] -jtimer.ui.task.templates.project2=[{"name":"dev2", "tasks":[{"name":"E1"},{"name":"E2"}]},{"name":"ano2", "tasks":[{"name":"A1"}]},{"name":"admin", "tasks":[{"name":"database", "tasks":[{"name":"sub database task1"},{"name":"sub database task2"}]}]},{"name":"meetings"},{"name":"releases"}] +# sandbox in test +jtimer.ui.template.directory=src/test/resources/templates diff --git a/src/test/resources/templates/project1.txt b/src/test/resources/templates/project1.txt new file mode 100644 index 0000000..cd2dd20 --- /dev/null +++ b/src/test/resources/templates/project1.txt @@ -0,0 +1,11 @@ +dev: + E1: + E2: +ano: + A1: +admin: + database: + sub database task1: + sub database task2: +meetings: +releases: \ No newline at end of file diff --git a/src/test/resources/templates/project2.yaml b/src/test/resources/templates/project2.yaml new file mode 100644 index 0000000..2fcdbd3 --- /dev/null +++ b/src/test/resources/templates/project2.yaml @@ -0,0 +1,3 @@ +dev: +admin: +releases: -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.