branch java8-localdate-localtime created (now 1fe8aa3)
This is an automated email from the git hooks/post-receive script. New change to branch java8-localdate-localtime in repository jtimer. See http://git.chorem.org/jtimer.git at 1fe8aa3 refs #1334: Use java 8 api for LocalDate and LocalTime (code won't compile) This branch includes the following new commits: new 1fe8aa3 refs #1334: Use java 8 api for LocalDate and LocalTime (code won't compile) The 1 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit 1fe8aa3ea4ba5f9f28e004f720302579209b36f6 Author: Eric Chatellier <chatellier@codelutin.com> Date: Mon Mar 7 11:10:41 2016 +0100 refs #1334: Use java 8 api for LocalDate and LocalTime (code won't compile) -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.
This is an automated email from the git hooks/post-receive script. New commit to branch java8-localdate-localtime in repository jtimer. See http://git.chorem.org/jtimer.git commit 1fe8aa3ea4ba5f9f28e004f720302579209b36f6 Author: Eric Chatellier <chatellier@codelutin.com> Date: Mon Mar 7 11:10:41 2016 +0100 refs #1334: Use java 8 api for LocalDate and LocalTime (code won't compile) --- src/main/java/org/chorem/jtimer/JTimer.java | 8 +- src/main/java/org/chorem/jtimer/JTimerUtil.java | 55 +++ .../org/chorem/jtimer/data/CommonVetoable.java | 3 +- .../org/chorem/jtimer/data/DataEventListener.java | 3 +- .../org/chorem/jtimer/data/TimerDataManager.java | 5 +- .../jtimer/data/VetoableDataEventListener.java | 3 +- .../java/org/chorem/jtimer/entities/TimerTask.java | 15 +- .../chorem/jtimer/entities/TimerTaskHelper.java | 15 +- .../chorem/jtimer/io/GTimerIncrementalSaver.java | 11 +- .../java/org/chorem/jtimer/io/GTimerTimeUtil.java | 41 +- src/main/java/org/chorem/jtimer/ui/StatusBar.java | 5 +- .../java/org/chorem/jtimer/ui/TimerTaskEditor.java | 22 +- .../chorem/jtimer/ui/systray/SystrayManager.java | 6 +- .../chorem/jtimer/ui/tasks/RefreshTreeTask.java | 6 +- .../org/chorem/jtimer/ui/tasks/RunTaskJob.java | 14 +- .../jtimer/ui/treetable/ProjectsAndTasksModel.java | 74 +-- .../ProjectsAndTasksRunningCellRenderer.java | 60 +-- .../org/chorem/jtimer/utils/DailySortedMap.java | 308 ------------ .../java/org/chorem/jtimer/utils/package-info.java | 25 - .../chorem/jtimer/data/TimerDataManagerTest.java | 3 +- .../org/chorem/jtimer/entities/TimerTaskTest.java | 8 +- .../jtimer/io/GTimerIncrementalSaverTest.java | 24 +- .../chorem/jtimer/utils/DailySortedMapTest.java | 538 --------------------- 23 files changed, 147 insertions(+), 1105 deletions(-) diff --git a/src/main/java/org/chorem/jtimer/JTimer.java b/src/main/java/org/chorem/jtimer/JTimer.java index ccbd29a..d5ddf5a 100644 --- a/src/main/java/org/chorem/jtimer/JTimer.java +++ b/src/main/java/org/chorem/jtimer/JTimer.java @@ -31,6 +31,7 @@ import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.io.File; import java.io.IOException; +import java.time.LocalDate; import java.util.Calendar; import java.util.Date; import java.util.List; @@ -1028,7 +1029,7 @@ public class JTimer extends SingleFrameApplication implements .get(0); // task is not running - Date now = new Date(); + LocalDate now = LocalDate.now(); long todayTime = selectedTask.getTime(now); long newTodayTime = todayTime + increment; @@ -1036,8 +1037,7 @@ public class JTimer extends SingleFrameApplication implements try { // check if + negative increment still positive if (newTodayTime > 0) { - core.getData().changeTaskTime(selectedTask, now, - newTodayTime); + core.getData().changeTaskTime(selectedTask, now, newTodayTime); } else { // force to 0 core.getData().changeTaskTime(selectedTask, now, 0L); @@ -1053,7 +1053,7 @@ public class JTimer extends SingleFrameApplication implements @Action(enabledProperty = "selectedSingleTask") public void setToZero() { TimerTask task = projectsAndTasksTable.getSelectedTasks().get(0); - incrementTaskTime(-task.getTime(new Date())); + incrementTaskTime(-task.getTime(LocalDate.now())); } /** diff --git a/src/main/java/org/chorem/jtimer/JTimerUtil.java b/src/main/java/org/chorem/jtimer/JTimerUtil.java new file mode 100644 index 0000000..6434e9f --- /dev/null +++ b/src/main/java/org/chorem/jtimer/JTimerUtil.java @@ -0,0 +1,55 @@ +/* + * #%L + * jTimer + * %% + * Copyright (C) 2016 CodeLutin, Chatellier Eric + * %% + * 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 3 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, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ +package org.chorem.jtimer; + +import java.time.Instant; +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.Date; + +/** + * This contains some util method used across wall application. + * + * @author Eric Chatellier + */ +public class JTimerUtil { + + /** + * Convert java 8 LocalDate to legacy Date. + * + * @param localDate local date to convert + * @return Date instance + */ + public static Date toDate(LocalDate localDate) { + return Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant()); + } + + /** + * Convert legacy Date to java 8 LocalDate. + * + * @param date date to convert + * @return LocalDate instance + */ + public static LocalDate toLocalDate(Date date) { + return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate(); + } +} diff --git a/src/main/java/org/chorem/jtimer/data/CommonVetoable.java b/src/main/java/org/chorem/jtimer/data/CommonVetoable.java index 0e6914f..c70d7b2 100644 --- a/src/main/java/org/chorem/jtimer/data/CommonVetoable.java +++ b/src/main/java/org/chorem/jtimer/data/CommonVetoable.java @@ -22,6 +22,7 @@ package org.chorem.jtimer.data; +import java.time.LocalDate; import java.util.Collection; import java.util.Date; import java.util.List; @@ -232,7 +233,7 @@ public class CommonVetoable implements VetoableDataEventListener { * {@inheritDoc} */ @Override - public void checkSetTaskTime(TimerTask task, Date date, Long value) { + public void checkSetTaskTime(TimerTask task, LocalDate date, Long value) { } diff --git a/src/main/java/org/chorem/jtimer/data/DataEventListener.java b/src/main/java/org/chorem/jtimer/data/DataEventListener.java index 272dcfd..e7eab70 100644 --- a/src/main/java/org/chorem/jtimer/data/DataEventListener.java +++ b/src/main/java/org/chorem/jtimer/data/DataEventListener.java @@ -22,6 +22,7 @@ package org.chorem.jtimer.data; +import java.time.LocalDate; import java.util.Collection; import java.util.Date; import java.util.EventListener; @@ -98,7 +99,7 @@ public interface DataEventListener extends EventListener { * @param date date * @param time task time */ - void setTaskTime(TimerTask task, Date date, Long time); + void setTaskTime(TimerTask task, LocalDate date, Long time); /** * Change task state. diff --git a/src/main/java/org/chorem/jtimer/data/TimerDataManager.java b/src/main/java/org/chorem/jtimer/data/TimerDataManager.java index 1afccff..ebbc3c6 100644 --- a/src/main/java/org/chorem/jtimer/data/TimerDataManager.java +++ b/src/main/java/org/chorem/jtimer/data/TimerDataManager.java @@ -22,6 +22,7 @@ package org.chorem.jtimer.data; +import java.time.LocalDate; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; @@ -227,7 +228,7 @@ public class TimerDataManager { * @param date date to change time * @param value new time in ms */ - public void changeTaskTime(TimerTask task, Date date, + public void changeTaskTime(TimerTask task, LocalDate date, long value) { // fire vetoable event @@ -524,7 +525,7 @@ public class TimerDataManager { } // copy otherTask times to current task - for (Entry<Date, Long> times : otherTask.getAllDaysAndTimes().entrySet()) { + for (Entry<LocalDate, Long> times : otherTask.getAllDaysAndTimes().entrySet()) { Long currentDuration = destinationTask.getTime(times.getKey()); currentDuration += times.getValue(); destinationTask.setTime(times.getKey(), currentDuration); diff --git a/src/main/java/org/chorem/jtimer/data/VetoableDataEventListener.java b/src/main/java/org/chorem/jtimer/data/VetoableDataEventListener.java index 0f8a9da..89ce017 100644 --- a/src/main/java/org/chorem/jtimer/data/VetoableDataEventListener.java +++ b/src/main/java/org/chorem/jtimer/data/VetoableDataEventListener.java @@ -22,6 +22,7 @@ package org.chorem.jtimer.data; +import java.time.LocalDate; import java.util.Collection; import java.util.Date; import java.util.EventListener; @@ -99,7 +100,7 @@ public interface VetoableDataEventListener extends EventListener { * @param date day of change * @param value new time in seconds */ - void checkSetTaskTime(TimerTask task, Date date, Long value); + void checkSetTaskTime(TimerTask task, LocalDate date, Long value); /** * Check change task state. diff --git a/src/main/java/org/chorem/jtimer/entities/TimerTask.java b/src/main/java/org/chorem/jtimer/entities/TimerTask.java index fd3e443..0402f39 100644 --- a/src/main/java/org/chorem/jtimer/entities/TimerTask.java +++ b/src/main/java/org/chorem/jtimer/entities/TimerTask.java @@ -23,6 +23,7 @@ package org.chorem.jtimer.entities; import java.io.Serializable; +import java.time.LocalDate; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -30,8 +31,6 @@ import java.util.SortedMap; import java.util.TreeMap; import java.util.UUID; -import org.chorem.jtimer.utils.DailySortedMap; - /** * Represents a task. * @@ -71,7 +70,7 @@ public class TimerTask implements Cloneable, /** * Map calendar of day -> time (ms). (ordered on keys) */ - protected SortedMap<Date, Long> allDaysTimes; + protected SortedMap<LocalDate, Long> allDaysTimes; /** * Map date -> annotation text. @@ -92,7 +91,7 @@ public class TimerTask implements Cloneable, * Constructor. */ public TimerTask() { - allDaysTimes = new DailySortedMap<>(); + allDaysTimes = new TreeMap<>(); // les annoation sont à la seconde pres allDaysAnnotations = new TreeMap<>(); subTasks = new ArrayList<>(); @@ -240,7 +239,7 @@ public class TimerTask implements Cloneable, * @param date date * @param time time in ms */ - public void setTime(Date date, Long time) { + public void setTime(LocalDate date, Long time) { allDaysTimes.put(date, time); } @@ -250,7 +249,7 @@ public class TimerTask implements Cloneable, * @param date date * @return time at specified date in ms */ - public long getTime(Date date) { + public long getTime(LocalDate date) { long result = 0; Long t = allDaysTimes.get(date); @@ -266,7 +265,7 @@ public class TimerTask implements Cloneable, * * @return total duration of all projects */ - public SortedMap<Date, Long> getAllDaysAndTimes() { + public SortedMap<LocalDate, Long> getAllDaysAndTimes() { return allDaysTimes; } @@ -364,7 +363,7 @@ public class TimerTask implements Cloneable, : (Date) creationDate.clone(); // make new list instance - task.allDaysTimes = new DailySortedMap<>(allDaysTimes); + task.allDaysTimes = new TreeMap<>(allDaysTimes); task.allDaysAnnotations = new TreeMap<>(allDaysAnnotations); task.subTasks = new ArrayList<>(subTasks); } catch (CloneNotSupportedException e) { diff --git a/src/main/java/org/chorem/jtimer/entities/TimerTaskHelper.java b/src/main/java/org/chorem/jtimer/entities/TimerTaskHelper.java index 830dfaa..4d0c656 100644 --- a/src/main/java/org/chorem/jtimer/entities/TimerTaskHelper.java +++ b/src/main/java/org/chorem/jtimer/entities/TimerTaskHelper.java @@ -22,6 +22,7 @@ package org.chorem.jtimer.entities; +import java.time.LocalDate; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; @@ -124,7 +125,7 @@ public class TimerTaskHelper { * @param date date for day * @return time in seconds */ - public static long getTotalTime(TimerTask task, Date date) { + public static long getTotalTime(TimerTask task, LocalDate date) { long result = 0L; // only task time @@ -144,11 +145,11 @@ public class TimerTaskHelper { * @param task task to find time * @return date */ - public static Date getTaskFirstDateOfTiming(TimerTask task) { + public static LocalDate getTaskFirstDateOfTiming(TimerTask task) { - Date date = null; + LocalDate date = null; - SortedMap<Date, Long> allTiming = task.getAllDaysAndTimes(); + SortedMap<LocalDate, Long> allTiming = task.getAllDaysAndTimes(); if (!allTiming.isEmpty()) { date = allTiming.firstKey(); } @@ -162,11 +163,11 @@ public class TimerTaskHelper { * @param task task to find time * @return date */ - public static Date getTaskLastDateOfTiming(TimerTask task) { + public static LocalDate getTaskLastDateOfTiming(TimerTask task) { - Date date = null; + LocalDate date = null; - SortedMap<Date, Long> allTiming = task.getAllDaysAndTimes(); + SortedMap<LocalDate, Long> allTiming = task.getAllDaysAndTimes(); if (!allTiming.isEmpty()) { date = allTiming.lastKey(); } diff --git a/src/main/java/org/chorem/jtimer/io/GTimerIncrementalSaver.java b/src/main/java/org/chorem/jtimer/io/GTimerIncrementalSaver.java index 85bcaaf..158b14b 100644 --- a/src/main/java/org/chorem/jtimer/io/GTimerIncrementalSaver.java +++ b/src/main/java/org/chorem/jtimer/io/GTimerIncrementalSaver.java @@ -42,6 +42,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.text.DateFormat; import java.text.SimpleDateFormat; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; @@ -517,7 +518,7 @@ public class GTimerIncrementalSaver extends AbstractSaver implements Saver, Matcher m = dataPattern.matcher(sKey); if (m.find()) { try { - Date keyDate = GTimerTimeUtil.yyyyMMdd2Date(sKey); + LocalDate keyDate = GTimerTimeUtil.yyyyMMdd2Date(sKey); String timeString = (String) prop.get(sKey); t.setTime(keyDate, Long.valueOf(timeString) * 1000); } catch (NumberFormatException e) { @@ -1030,9 +1031,9 @@ public class GTimerIncrementalSaver extends AbstractSaver implements Saver, out.write("Data:\n"); // save time of each day - for (Entry<Date, Long> entry : task.getAllDaysAndTimes().entrySet()) { + for (Entry<LocalDate, Long> entry : task.getAllDaysAndTimes().entrySet()) { - Date date = entry.getKey(); + LocalDate date = entry.getKey(); long value = entry.getValue() / 1000; String gtimerDate = GTimerTimeUtil.date2yyyyMMdd(date); out.write(gtimerDate + " " + value + "\n"); @@ -1354,7 +1355,7 @@ public class GTimerIncrementalSaver extends AbstractSaver implements Saver, * @see org.chorem.jtimer.event.DataEventListener#setTaskTime(org.chorem.jtimer.entities.TimerTask, java.util.Date, java.lang.Long) */ @Override - public void setTaskTime(TimerTask task, Date date, Long time) { + public void setTaskTime(TimerTask task, LocalDate date, Long time) { // ne sauve la tache que si elle n'est pas // en cours d'execution if (!runningTasks.contains(task)) { @@ -1578,7 +1579,7 @@ public class GTimerIncrementalSaver extends AbstractSaver implements Saver, * {@inheritDoc} */ @Override - public void checkSetTaskTime(TimerTask task, Date date, Long value) { + public void checkSetTaskTime(TimerTask task, LocalDate date, Long value) { } diff --git a/src/main/java/org/chorem/jtimer/io/GTimerTimeUtil.java b/src/main/java/org/chorem/jtimer/io/GTimerTimeUtil.java index 32686c6..217f65c 100644 --- a/src/main/java/org/chorem/jtimer/io/GTimerTimeUtil.java +++ b/src/main/java/org/chorem/jtimer/io/GTimerTimeUtil.java @@ -2,7 +2,7 @@ * #%L * jTimer * %% - * Copyright (C) 2008 - 2011 CodeLutin, Chatellier Eric + * Copyright (C) 2008 - 2016 CodeLutin, Chatellier Eric * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -22,9 +22,8 @@ package org.chorem.jtimer.io; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.Calendar; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.Date; import org.apache.commons.logging.Log; @@ -44,8 +43,7 @@ public class GTimerTimeUtil { private static Log log = LogFactory.getLog(GTimerTimeUtil.class); /** gtimer day string date format */ - protected static final DateFormat GTIMERDATEFORMAT = new SimpleDateFormat( - "yyyyMMdd"); + protected static final DateTimeFormatter GTIMERDATEFORMAT = DateTimeFormatter.ofPattern("yyyyMMdd"); /** * Protected constructor. @@ -61,34 +59,9 @@ public class GTimerTimeUtil { * @return {@link Date} * @throws IllegalArgumentException */ - public static Date yyyyMMdd2Date(String dateAsString) { + public static LocalDate yyyyMMdd2Date(String dateAsString) { - int year, mouth, day; - Date date = null; - - try { - String syear = dateAsString.substring(0, 4); - String smonth = dateAsString.substring(4, 6); - String sday = dateAsString.substring(6, 8); - - year = Integer.parseInt(syear); - mouth = Integer.parseInt(smonth); - day = Integer.parseInt(sday); - - Calendar calendar = Calendar.getInstance(); - calendar.set(Calendar.YEAR, year); - calendar.set(Calendar.MONTH, mouth - 1); - calendar.set(Calendar.DAY_OF_MONTH, day); - - date = calendar.getTime(); - } catch (NumberFormatException e) { - if (log.isWarnEnabled()) { - log.warn("Can't parse string " + dateAsString + " in yyyyMMdd format", - e); - } - throw new IllegalArgumentException("Can't parse string " + dateAsString - + " in yyyyMMdd format", e); - } + LocalDate date = (LocalDate)GTIMERDATEFORMAT.parse(dateAsString); return date; } @@ -100,7 +73,7 @@ public class GTimerTimeUtil { * @return a string yyyyMMdd date * @throws IllegalArgumentException */ - public static String date2yyyyMMdd(Date date) { + public static String date2yyyyMMdd(LocalDate date) { String dateAsString = GTIMERDATEFORMAT.format(date); diff --git a/src/main/java/org/chorem/jtimer/ui/StatusBar.java b/src/main/java/org/chorem/jtimer/ui/StatusBar.java index 99ff3d3..6810a0e 100644 --- a/src/main/java/org/chorem/jtimer/ui/StatusBar.java +++ b/src/main/java/org/chorem/jtimer/ui/StatusBar.java @@ -23,6 +23,7 @@ package org.chorem.jtimer.ui; import java.awt.GridLayout; +import java.time.LocalDate; import java.util.Collection; import java.util.Date; import java.util.List; @@ -111,7 +112,7 @@ public class StatusBar extends JPanel implements DataEventListener { // refresh time long duration = 0L; for (TimerProject p : dataManager.getProjectsList()) { - duration += TimerTaskHelper.getTotalTime(p, new Date()); + duration += TimerTaskHelper.getTotalTime(p, LocalDate.now()); } lblTime.setText(resourceMap .getString("todayTotalMessage", DurationFormatUtils @@ -175,7 +176,7 @@ public class StatusBar extends JPanel implements DataEventListener { * @see org.chorem.jtimer.event.DataEventListener#setTaskTime(org.chorem.jtimer.entities.TimerTask, java.util.Date, java.lang.Long) */ @Override - public void setTaskTime(TimerTask task, Date date, Long time) { + public void setTaskTime(TimerTask task, LocalDate date, Long time) { modifyTask(task); } diff --git a/src/main/java/org/chorem/jtimer/ui/TimerTaskEditor.java b/src/main/java/org/chorem/jtimer/ui/TimerTaskEditor.java index ca301fb..aa74910 100644 --- a/src/main/java/org/chorem/jtimer/ui/TimerTaskEditor.java +++ b/src/main/java/org/chorem/jtimer/ui/TimerTaskEditor.java @@ -30,6 +30,7 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; +import java.time.LocalDate; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; @@ -62,6 +63,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.chorem.jtimer.JTimer; +import org.chorem.jtimer.JTimerUtil; import org.chorem.jtimer.data.DataViolationException; import org.chorem.jtimer.data.TimerCore; import org.chorem.jtimer.data.TimerDataManager; @@ -168,9 +170,6 @@ public class TimerTaskEditor extends JDialog implements ActionListener { // cause infinite loop under openjdk setName(null); // force nameExplicitlySet to true - // set color on jxmonthview unselectable days - // UIManager.put("JXMonthView.unselectableDayForeground", Color.GRAY); - this.task = task; cloneTask = task.clone(); this.core = core; @@ -613,7 +612,8 @@ public class TimerTaskEditor extends JDialog implements ActionListener { spinnerH.removeChangeListener(spinnerListener); spinnerM.removeChangeListener(spinnerListener); - long time = cloneTask.getTime(date); + LocalDate localDate = JTimerUtil.toLocalDate(date); + long time = cloneTask.getTime(localDate); Calendar cal = Calendar.getInstance(); // FIXME me, not use a calendar here ! cal.setTimeInMillis(time - cal.get(Calendar.ZONE_OFFSET)); @@ -671,7 +671,8 @@ public class TimerTaskEditor extends JDialog implements ActionListener { long seconds = ((Integer) spinnerH.getValue() * 60 * 60) + ((Integer) spinnerM.getValue() * 60) + ((Integer) spinnerS.getValue()); - cloneTask.setTime(getSelectedDay().getTime(), seconds * 1000); + LocalDate localDate = JTimerUtil.toLocalDate(getSelectedDay().getTime()); + cloneTask.setTime(localDate, seconds * 1000); // annotation if (isAnnotationChanged) { @@ -710,8 +711,9 @@ public class TimerTaskEditor extends JDialog implements ActionListener { public void updateFlaggedDates() { ArrayList<Date> dates = new ArrayList<>(); - for (Date date : cloneTask.getAllDaysAndTimes().keySet()) { - if (cloneTask.getTime(date) > 0) { + for (LocalDate localDate : cloneTask.getAllDaysAndTimes().keySet()) { + if (cloneTask.getTime(localDate) > 0) { + Date date = JTimerUtil.toDate(localDate); dates.add(date); } } @@ -748,9 +750,9 @@ public class TimerTaskEditor extends JDialog implements ActionListener { log.debug("Applying changes on: " + date); } - // time - dataManager.changeTaskTime(task, date, cloneTask - .getTime(date)); + // time + LocalDate localDate = JTimerUtil.toLocalDate(date); + dataManager.changeTaskTime(task, localDate, cloneTask.getTime(localDate)); // annotation if (annotationChanged.contains(date)) { diff --git a/src/main/java/org/chorem/jtimer/ui/systray/SystrayManager.java b/src/main/java/org/chorem/jtimer/ui/systray/SystrayManager.java index 4a5b5f3..f29f20b 100644 --- a/src/main/java/org/chorem/jtimer/ui/systray/SystrayManager.java +++ b/src/main/java/org/chorem/jtimer/ui/systray/SystrayManager.java @@ -2,7 +2,7 @@ * #%L * jTimer * %% - * Copyright (C) 2008 - 2011 CodeLutin, Chatellier Eric + * Copyright (C) 2008 - 2016 CodeLutin, Chatellier Eric * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -32,6 +32,7 @@ import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; +import java.time.LocalDate; import java.util.Collection; import java.util.Date; import java.util.List; @@ -388,7 +389,8 @@ public class SystrayManager implements ActionListener, DataEventListener, /* * @see org.chorem.jtimer.event.DataEventListener#setTaskTime(org.chorem.jtimer.entities.TimerTask, java.util.Calendar, java.lang.Long) */ - public void setTaskTime(TimerTask task, Date date, Long time) { + @Override + public void setTaskTime(TimerTask task, LocalDate date, Long time) { } diff --git a/src/main/java/org/chorem/jtimer/ui/tasks/RefreshTreeTask.java b/src/main/java/org/chorem/jtimer/ui/tasks/RefreshTreeTask.java index 08b48ab..2648f35 100644 --- a/src/main/java/org/chorem/jtimer/ui/tasks/RefreshTreeTask.java +++ b/src/main/java/org/chorem/jtimer/ui/tasks/RefreshTreeTask.java @@ -2,7 +2,7 @@ * #%L * jTimer * %% - * Copyright (C) 2008 - 2011 CodeLutin, Chatellier Eric + * Copyright (C) 2008 - 2016 CodeLutin, Chatellier Eric * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -22,7 +22,7 @@ package org.chorem.jtimer.ui.tasks; -import java.util.Date; +import java.time.LocalDate; import java.util.List; import org.apache.commons.logging.Log; @@ -87,7 +87,7 @@ public class RefreshTreeTask extends java.util.TimerTask { refreshTasks(task.getSubTasks()); // fire event - Date now = new Date(); + LocalDate now = LocalDate.now(); // TODO find a better way to do that ! // Only useflull for UI listeners dataManager.changeTaskTime(task, now, task.getTime(now)); diff --git a/src/main/java/org/chorem/jtimer/ui/tasks/RunTaskJob.java b/src/main/java/org/chorem/jtimer/ui/tasks/RunTaskJob.java index 0b3d0b4..0290328 100644 --- a/src/main/java/org/chorem/jtimer/ui/tasks/RunTaskJob.java +++ b/src/main/java/org/chorem/jtimer/ui/tasks/RunTaskJob.java @@ -22,6 +22,9 @@ package org.chorem.jtimer.ui.tasks; +import java.time.Instant; +import java.time.LocalDate; +import java.time.ZoneId; import java.util.Calendar; import java.util.Collection; import java.util.Date; @@ -37,6 +40,7 @@ import org.apache.commons.lang3.time.DurationFormatUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.chorem.jtimer.JTimer; +import org.chorem.jtimer.JTimerUtil; import org.chorem.jtimer.data.TimerDataManager; import org.chorem.jtimer.entities.TimerAlert; import org.chorem.jtimer.entities.TimerAlert.Type; @@ -131,7 +135,7 @@ public class RunTaskJob extends Task<Void, Void> { */ protected void checkAlreadyThrownAlerts(TimerTask task) { - Date now = new Date(); + LocalDate now = LocalDate.now(); // check alert to be fired for (TimerAlert alert : task.getAlerts()) { if (alert.getType().equals(Type.REACH_DAILY_TIME) @@ -274,7 +278,8 @@ public class RunTaskJob extends Task<Void, Void> { Date todayMidnight = DateUtils.truncate(currentDate, Calendar.DAY_OF_MONTH); long msToMidnight = currentDate.getTime() - todayMidnight.getTime(); long toRemove = Math.min(-localDelta, msToMidnight); - dataManager.changeTaskTime(task, currentDate, task.getTime(currentDate) - toRemove); + LocalDate localDate = JTimerUtil.toLocalDate(currentDate); + dataManager.changeTaskTime(task, localDate, task.getTime(localDate) - toRemove); if (log.isDebugEnabled()) { log.debug(" remove delta to task on " + currentDate + " : " + toRemove); } @@ -290,7 +295,8 @@ public class RunTaskJob extends Task<Void, Void> { today235959 = DateUtils.addMilliseconds(today235959, -1); long msToMidnight = today235959.getTime() - currentDate.getTime(); long toAdd = Math.min(localDelta, msToMidnight); - dataManager.changeTaskTime(task, currentDate, task.getTime(currentDate) + toAdd); + LocalDate localDate = JTimerUtil.toLocalDate(currentDate); + dataManager.changeTaskTime(task, localDate, task.getTime(localDate) + toAdd); if (log.isDebugEnabled()) { log.debug(" adding delta to task on " + currentDate + " : " + toAdd); } @@ -308,7 +314,7 @@ public class RunTaskJob extends Task<Void, Void> { * @param task */ protected void checkTaskAlerts(TimerTask task) { - Date now = new Date(); + LocalDate now = LocalDate.now(); // check alert to be fired for (TimerAlert alert : task.getAlerts()) { diff --git a/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksModel.java b/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksModel.java index 741e8c7..6812e3a 100644 --- a/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksModel.java +++ b/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksModel.java @@ -22,6 +22,7 @@ package org.chorem.jtimer.ui.treetable; +import java.time.LocalDate; import java.util.ArrayList; import java.util.Collection; import java.util.Date; @@ -117,25 +118,16 @@ public class ProjectsAndTasksModel extends AbstractTreeTableModel implements subTasksCache = new HashMap<>(); } - /* - * @see org.jdesktop.swingx.treetable.TreeTableModel#getColumnCount() - */ @Override public int getColumnCount() { return columnIdentifiers.size(); } - /* - * @see org.jdesktop.swingx.treetable.TreeTableModel#getColumnName(int) - */ @Override public String getColumnName(int column) { return columnIdentifiers.get(column); } - /* - * @see org.jdesktop.swingx.treetable.DefaultTreeTableModel#getValueAt(java.lang.Object, int) - */ @Override public Object getValueAt(Object object, int column) { @@ -150,12 +142,10 @@ public class ProjectsAndTasksModel extends AbstractTreeTableModel implements value = task.getName(); break; case 1: - value = DurationFormatUtils.formatDuration(TimerTaskHelper - .getTotalTime(task, new Date()), "HH:mm:ss"); + value = DurationFormatUtils.formatDuration(TimerTaskHelper.getTotalTime(task, LocalDate.now()), "HH:mm:ss"); break; case 2: - value = DurationFormatUtils.formatDuration(TimerTaskHelper - .getAllTotalTime(task), "HH:mm:ss"); + value = DurationFormatUtils.formatDuration(TimerTaskHelper.getAllTotalTime(task), "HH:mm:ss"); break; } } else { @@ -169,18 +159,12 @@ public class ProjectsAndTasksModel extends AbstractTreeTableModel implements return value; } - /* - * @see org.jdesktop.swingx.treetable.DefaultTreeTableModel#isCellEditable(java.lang.Object, int) - */ @Override public boolean isCellEditable(Object object, int column) { // non editable return false; } - /* - * @see org.jdesktop.swingx.treetable.DefaultTreeTableModel#getChild(java.lang.Object, int) - */ @Override public Object getChild(Object parent, int index) { @@ -188,9 +172,6 @@ public class ProjectsAndTasksModel extends AbstractTreeTableModel implements return t; } - /* - * @see org.jdesktop.swingx.treetable.DefaultTreeTableModel#getChildCount(java.lang.Object) - */ @Override public int getChildCount(Object parent) { @@ -255,9 +236,6 @@ public class ProjectsAndTasksModel extends AbstractTreeTableModel implements return result; } - /* - * @see org.jdesktop.swingx.treetable.DefaultTreeTableModel#getIndexOfChild(java.lang.Object, java.lang.Object) - */ @Override public int getIndexOfChild(Object parent, Object child) { @@ -265,9 +243,6 @@ public class ProjectsAndTasksModel extends AbstractTreeTableModel implements return childIndex; } - /* - * @see org.jdesktop.swingx.treetable.DefaultTreeTableModel#isLeaf(java.lang.Object) - */ @Override public boolean isLeaf(Object node) { return getChildCount(node) == 0; @@ -360,25 +335,16 @@ public class ProjectsAndTasksModel extends AbstractTreeTableModel implements return updated; } - /* - * @see org.chorem.jtimer.data.event.DataEventListener#addProject(org.chorem.jtimer.entities.TimerProject) - */ @Override public void addProject(TimerProject project) { notifyTaskChanged(project, OPERATION_ADD); } - /* - * @see org.chorem.jtimer.data.event.DataEventListener#addTask(org.chorem.jtimer.entities.TimerTask) - */ @Override public void addTask(TimerTask task) { notifyTaskChanged(task, OPERATION_ADD); } - /* - * @see org.chorem.jtimer.data.event.DataEventListener#dataLoaded(java.util.Collection) - */ @Override public void dataLoaded(Collection<TimerProject> projects) { @@ -429,34 +395,22 @@ public class ProjectsAndTasksModel extends AbstractTreeTableModel implements } - /* - * @see org.chorem.jtimer.data.event.DataEventListener#modifyTask(org.chorem.jtimer.entities.TimerTask) - */ @Override public void modifyTask(TimerTask task) { notifyTaskChanged(task, OPERATION_MODIFY); } - /* - * @see org.chorem.jtimer.event.DataEventListener#setAnnotation(org.chorem.jtimer.entities.TimerTask, java.util.Date, java.lang.String) - */ @Override public void setAnnotation(TimerTask task, Date date, String annotation) { } - /* - * @see org.chorem.jtimer.event.DataEventListener#setTaskTime(org.chorem.jtimer.entities.TimerTask, java.util.Date, java.lang.Long) - */ @Override - public void setTaskTime(TimerTask task, Date date, Long time) { + public void setTaskTime(TimerTask task, LocalDate date, Long time) { notifyTaskChanged(task, OPERATION_MODIFY); } - /* - * @see org.chorem.jtimer.data.event.DataEventListener#changeClosedState(org.chorem.jtimer.entities.TimerTask) - */ @Override public void changeClosedState(TimerTask task) { @@ -480,17 +434,11 @@ public class ProjectsAndTasksModel extends AbstractTreeTableModel implements } } - /* - * @see org.chorem.jtimer.data.event.DataEventListener#startTask(org.chorem.jtimer.entities.TimerTask) - */ @Override public void startTask(TimerTask task) { } - /* - * @see org.chorem.jtimer.data.event.DataEventListener#stopTask(org.chorem.jtimer.entities.TimerTask) - */ @Override public void stopTask(TimerTask task) { @@ -507,25 +455,16 @@ public class ProjectsAndTasksModel extends AbstractTreeTableModel implements dataLoaded(null); } - /* - * @see org.chorem.jtimer.data.event.DataEventListener#postMoveTask(org.chorem.jtimer.entities.TimerTask) - */ @Override public void moveTask(TimerTask task) { notifyTaskChanged(task, OPERATION_ADD); } - /* - * @see org.chorem.jtimer.data.event.DataEventListener#preMoveTask(org.chorem.jtimer.entities.TimerTask) - */ @Override public void preMoveTask(TimerTask task) { notifyTaskChanged(task, OPERATION_DELETE); } - - /* - * @see org.chorem.jtimer.data.DataEventListener#postMergeTasks(org.chorem.jtimer.entities.TimerTask, java.util.List) - */ + @Override public void postMergeTasks(TimerTask destinationTask, List<TimerTask> otherTasks) { @@ -536,9 +475,6 @@ public class ProjectsAndTasksModel extends AbstractTreeTableModel implements } } - /* - * @see org.chorem.jtimer.data.DataEventListener#preMergeTasks(org.chorem.jtimer.entities.TimerTask, java.util.List) - */ @Override public void preMergeTasks(TimerTask destinationTask, List<TimerTask> otherTasks) { diff --git a/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksRunningCellRenderer.java b/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksRunningCellRenderer.java index 1ee3b36..46cc9cf 100644 --- a/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksRunningCellRenderer.java +++ b/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksRunningCellRenderer.java @@ -27,6 +27,7 @@ import java.awt.Image; import java.awt.Rectangle; import java.awt.image.ImageObserver; import java.net.URL; +import java.time.LocalDate; import java.util.Collection; import java.util.Collections; import java.util.Date; @@ -98,9 +99,6 @@ public class ProjectsAndTasksRunningCellRenderer extends ProjectsAndTasksCellRen core.getData().addDataEventListener(this); } - /* - * @see org.jdesktop.swingx.renderer.DefaultTreeRenderer#getTreeCellRendererComponent(javax.swing.JTree, java.lang.Object, boolean, boolean, boolean, int, boolean) - */ @Override public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, @@ -143,9 +141,6 @@ public class ProjectsAndTasksRunningCellRenderer extends ProjectsAndTasksCellRen rows.remove(row); } - /* - * @see java.awt.image.ImageObserver#imageUpdate(java.awt.Image, int, int, int, int, int) - */ @Override public boolean imageUpdate(Image img, int flags, int x, int y, int w, int h) { @@ -159,73 +154,46 @@ public class ProjectsAndTasksRunningCellRenderer extends ProjectsAndTasksCellRen } } - /* - * @see org.chorem.jtimer.data.event.DataEventListener#addProject(org.chorem.jtimer.entities.TimerProject) - */ @Override public void addProject(TimerProject project) { } - /* - * @see org.chorem.jtimer.data.event.DataEventListener#addTask(org.chorem.jtimer.entities.TimerTask) - */ @Override public void addTask(TimerTask task) { } - /* - * @see org.chorem.jtimer.data.event.DataEventListener#dataLoaded(java.util.Collection) - */ @Override public void dataLoaded(Collection<TimerProject> projects) { } - /* - * @see org.chorem.jtimer.data.event.DataEventListener#deleteProject(org.chorem.jtimer.entities.TimerProject) - */ @Override public void deleteProject(TimerProject project) { } - /* - * @see org.chorem.jtimer.data.event.DataEventListener#deleteTask(org.chorem.jtimer.entities.TimerTask) - */ @Override public void deleteTask(TimerTask task) { } - /* - * @see org.chorem.jtimer.data.event.DataEventListener#modifyProject(org.chorem.jtimer.entities.TimerProject) - */ @Override public void modifyProject(TimerProject project) { } - /* - * @see org.chorem.jtimer.data.event.DataEventListener#modifyTask(org.chorem.jtimer.entities.TimerTask) - */ @Override public void modifyTask(TimerTask task) { } - /* - * @see org.chorem.jtimer.data.event.DataEventListener#changeClosedState(org.chorem.jtimer.entities.TimerTask) - */ @Override public void changeClosedState(TimerTask task) { } - /* - * @see org.chorem.jtimer.data.event.DataEventListener#startTask(org.chorem.jtimer.entities.TimerTask) - */ @Override public void startTask(TimerTask task) { @@ -237,9 +205,6 @@ public class ProjectsAndTasksRunningCellRenderer extends ProjectsAndTasksCellRen runningTasks.add(task); } - /* - * @see org.chorem.jtimer.data.event.DataEventListener#stopTask(org.chorem.jtimer.entities.TimerTask) - */ @Override public void stopTask(TimerTask task) { @@ -251,51 +216,32 @@ public class ProjectsAndTasksRunningCellRenderer extends ProjectsAndTasksCellRen runningTasks.remove(task); } - /* - * @see org.chorem.jtimer.data.event.DataEventListener#postMoveTask(org.chorem.jtimer.entities.TimerTask) - */ @Override public void moveTask(TimerTask task) { } - /* - * @see org.chorem.jtimer.data.event.DataEventListener#preMoveTask(org.chorem.jtimer.entities.TimerTask) - */ @Override public void preMoveTask(TimerTask task) { } - /* - * @see org.chorem.jtimer.data.DataEventListener#postMergeTasks(org.chorem.jtimer.entities.TimerTask, java.util.List) - */ @Override public void postMergeTasks(TimerTask destinationTask, List<TimerTask> otherTasks) { } - /* - * @see org.chorem.jtimer.data.DataEventListener#preMergeTasks(org.chorem.jtimer.entities.TimerTask, java.util.List) - */ @Override - public void preMergeTasks(TimerTask destinationTask, - List<TimerTask> otherTasks) { + public void preMergeTasks(TimerTask destinationTask, List<TimerTask> otherTasks) { } - /* - * @see org.chorem.jtimer.event.DataEventListener#setTaskTime(org.chorem.jtimer.entities.TimerTask, java.util.Date, java.lang.Long) - */ @Override - public void setTaskTime(TimerTask task, Date date, Long time) { + public void setTaskTime(TimerTask task, LocalDate date, Long time) { } - /* - * @see org.chorem.jtimer.event.DataEventListener#setAnnotation(org.chorem.jtimer.entities.TimerTask, java.util.Date, java.lang.String) - */ @Override public void setAnnotation(TimerTask task, Date date, String annotation) { diff --git a/src/main/java/org/chorem/jtimer/utils/DailySortedMap.java b/src/main/java/org/chorem/jtimer/utils/DailySortedMap.java deleted file mode 100644 index a7111ac..0000000 --- a/src/main/java/org/chorem/jtimer/utils/DailySortedMap.java +++ /dev/null @@ -1,308 +0,0 @@ -/* - * #%L - * jTimer - * %% - * Copyright (C) 2008 - 2011 CodeLutin, Chatellier Eric - * %% - * 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 3 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, see - * <http://www.gnu.org/licenses/gpl-3.0.html>. - * #L% - */ - -package org.chorem.jtimer.utils; - -import java.util.Calendar; -import java.util.Comparator; -import java.util.Date; -import java.util.Map; -import java.util.NavigableMap; -import java.util.SortedMap; -import java.util.TreeMap; - -/** - * SortedMap that return a unique value for all date for a day. - * - * @see java.util.SortedMap - * @param <T> values type - * - * @author chatellier - * @version $Revision$ - * - * Last update : $Date$ - * By : $Author$ - * - * @deprecated since 1.5, this class can now be replaced by TreeMap<LocalDate, Long> - */ -@Deprecated -public class DailySortedMap<T> extends TreeMap<Date, T> { - - /** serialVersionUID */ - private static final long serialVersionUID = 5736472379626976185L; - - /** - * Constructs a new, empty tree map, using the natural ordering - * of its keys. - */ - public DailySortedMap() { - } - - /** - * Constructs a new, empty tree map, ordered according to - * the given comparator. - * - * @param comparator comparator - */ - public DailySortedMap(Comparator<? super Date> comparator) { - super(comparator); - } - - /** - * Constructs a new tree map containing the same mappings - * as the given map, ordered according to the natural ordering of its keys. - * - * @param m init map - */ - public DailySortedMap(Map<? extends Date, ? extends T> m) { - super(m); - } - - /** - * Constructs a new tree map containing the same mappings and - * using the same ordering as the specified sorted map. - * - * @param m init map - */ - public DailySortedMap(SortedMap<Date, ? extends T> m) { - super(m); - } - - /** - * {@inheritDoc} - */ - @Override - public Map.Entry<Date, T> ceilingEntry(Date key) { - Date dayKey = getDayDate(key); - Map.Entry<Date, T> result = super.ceilingEntry(dayKey); - return result; - - } - - /** - * {@inheritDoc} - */ - @Override - public Date ceilingKey(Date key) { - Date dayKey = getDayDate(key); - Date result = super.ceilingKey(dayKey); - return result; - - } - - /** - * {@inheritDoc} - */ - @Override - public boolean containsKey(Object key) { - boolean result = false; - - if (key instanceof Date) { - Date lDate = getDayDate((Date) key); - result = super.containsKey(lDate); - } - - return result; - } - - /** - * {@inheritDoc} - */ - @Override - public Map.Entry<Date, T> floorEntry(Date key) { - Date dayKey = getDayDate(key); - Map.Entry<Date, T> result = super.floorEntry(dayKey); - return result; - } - - /** - * {@inheritDoc} - */ - @Override - public Date floorKey(Date key) { - Date dayKey = getDayDate(key); - Date result = super.floorKey(dayKey); - return result; - } - - /** - * {@inheritDoc} - */ - @Override - public T get(Object key) { - T result = null; - - if (key instanceof Date) { - Date lDate = getDayDate((Date) key); - result = super.get(lDate); - } - - return result; - } - - /** - * {@inheritDoc} - */ - @Override - public NavigableMap<Date, T> headMap(Date toKey, boolean inclusive) { - Date dayKey = getDayDate(toKey); - NavigableMap<Date, T> result = super.headMap(dayKey, inclusive); - return result; - } - - /** - * {@inheritDoc} - */ - @Override - public SortedMap<Date, T> headMap(Date toKey) { - Date dayKey = getDayDate(toKey); - SortedMap<Date, T> result = super.headMap(dayKey); - return result; - } - - /** - * {@inheritDoc} - */ - @Override - public Map.Entry<Date, T> higherEntry(Date key) { - Date dayKey = getDayDate(key); - Map.Entry<Date, T> result = super.higherEntry(dayKey); - return result; - } - - /** - * {@inheritDoc} - */ - @Override - public Date higherKey(Date key) { - Date dayKey = getDayDate(key); - Date result = super.higherKey(dayKey); - return result; - } - - /** - * {@inheritDoc} - */ - @Override - public Map.Entry<Date, T> lowerEntry(Date key) { - Date dayKey = getDayDate(key); - Map.Entry<Date, T> result = super.lowerEntry(dayKey); - return result; - } - - /** - * {@inheritDoc} - */ - @Override - public Date lowerKey(Date key) { - Date dayKey = getDayDate(key); - Date result = super.lowerKey(dayKey); - return result; - } - - /** - * {@inheritDoc} - */ - @Override - public T put(Date key, T value) { - Date lDate = getDayDate(key); - T result = super.put(lDate, value); - - return result; - } - - /** - * {@inheritDoc} - */ - @Override - public void putAll(Map<? extends Date, ? extends T> map) { - for (Map.Entry<? extends Date, ? extends T> entry : map.entrySet()) { - put(entry.getKey(), entry.getValue()); - } - } - - /** - * {@inheritDoc} - */ - @Override - public NavigableMap<Date, T> subMap(Date fromKey, boolean fromInclusive, - Date toKey, boolean toInclusive) { - Date fromDayKey = getDayDate(fromKey); - Date toDayKey = getDayDate(toKey); - NavigableMap<Date, T> result = super.subMap(fromDayKey, fromInclusive, - toDayKey, toInclusive); - return result; - } - - /** - * {@inheritDoc} - */ - @Override - public SortedMap<Date, T> subMap(Date fromKey, Date toKey) { - Date fromDayKey = getDayDate(fromKey); - Date toDayKey = getDayDate(toKey); - SortedMap<Date, T> result = super.subMap(fromDayKey, toDayKey); - return result; - } - - /** - * {@inheritDoc} - */ - @Override - public NavigableMap<Date, T> tailMap(Date fromKey, boolean inclusive) { - Date fromDayKey = getDayDate(fromKey); - NavigableMap<Date, T> result = super.tailMap(fromDayKey, inclusive); - return result; - } - - /** - * {@inheritDoc} - */ - @Override - public SortedMap<Date, T> tailMap(Date fromKey) { - Date fromDayKey = getDayDate(fromKey); - SortedMap<Date, T> result = super.tailMap(fromDayKey); - return result; - } - - /** - * Get date at 0h00:00.000. - * - * @param date date to convert - * @return day date - */ - protected Date getDayDate(Date date) { - Date ldate = (Date) date.clone(); - - Calendar calendar = Calendar.getInstance(); - calendar.setTime(ldate); - - calendar.set(Calendar.HOUR_OF_DAY, 0); - calendar.set(Calendar.MINUTE, 0); - calendar.set(Calendar.SECOND, 0); - calendar.set(Calendar.MILLISECOND, 0); - - Date result = calendar.getTime(); - - return result; - } -} diff --git a/src/main/java/org/chorem/jtimer/utils/package-info.java b/src/main/java/org/chorem/jtimer/utils/package-info.java deleted file mode 100644 index 400a19f..0000000 --- a/src/main/java/org/chorem/jtimer/utils/package-info.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * #%L - * jTimer - * %% - * Copyright (C) 2007 - 2011 CodeLutin, Chatellier Eric - * %% - * 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 3 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, see - * <http://www.gnu.org/licenses/gpl-3.0.html>. - * #L% - */ -/** - * JTimer util classes. - */ -package org.chorem.jtimer.utils; diff --git a/src/test/java/org/chorem/jtimer/data/TimerDataManagerTest.java b/src/test/java/org/chorem/jtimer/data/TimerDataManagerTest.java index 106c6a3..cbee3dc 100644 --- a/src/test/java/org/chorem/jtimer/data/TimerDataManagerTest.java +++ b/src/test/java/org/chorem/jtimer/data/TimerDataManagerTest.java @@ -22,6 +22,7 @@ package org.chorem.jtimer.data; +import java.time.LocalDate; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -465,7 +466,7 @@ public class TimerDataManagerTest extends AbstractJTimerTest { // add THE conflict task name TimerTask tTreeTests = new TimerTask("Tree tests"); tTreeTests.setCreationDate(new Date()); - tTreeTests.setTime(new Date(), 200000L); + tTreeTests.setTime(LocalDate.now(), 200000L); dataManager.addTask(task1, tTreeTests, null); Assert.assertEquals(task1.getSubTasks().size(), 3); diff --git a/src/test/java/org/chorem/jtimer/entities/TimerTaskTest.java b/src/test/java/org/chorem/jtimer/entities/TimerTaskTest.java index 87cc0e1..6c857cf 100644 --- a/src/test/java/org/chorem/jtimer/entities/TimerTaskTest.java +++ b/src/test/java/org/chorem/jtimer/entities/TimerTaskTest.java @@ -2,7 +2,7 @@ * #%L * jTimer * %% - * Copyright (C) 2008 - 2012 CodeLutin, Chatellier Eric + * Copyright (C) 2008 - 2016 CodeLutin, Chatellier Eric * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -23,9 +23,9 @@ package org.chorem.jtimer.entities; import java.util.Date; +import java.util.TreeMap; import org.chorem.jtimer.AbstractJTimerTest; -import org.chorem.jtimer.utils.DailySortedMap; import org.testng.Assert; import org.testng.annotations.Test; @@ -63,8 +63,8 @@ public class TimerTaskTest extends AbstractJTimerTest { TimerTask clonedTask = task.clone(); - Assert.assertTrue(clonedTask.allDaysTimes instanceof DailySortedMap<?>, "Clone put invalid type for map"); - Assert.assertFalse(clonedTask.allDaysAnnotations instanceof DailySortedMap<?>, "Clone put invalid type for map"); + Assert.assertTrue(clonedTask.allDaysTimes instanceof TreeMap<?, ?>, "Clone put invalid type for map"); + Assert.assertFalse(clonedTask.allDaysAnnotations instanceof TreeMap<?, ?>, "Clone put invalid type for map"); } /** diff --git a/src/test/java/org/chorem/jtimer/io/GTimerIncrementalSaverTest.java b/src/test/java/org/chorem/jtimer/io/GTimerIncrementalSaverTest.java index 26c0675..544e632 100644 --- a/src/test/java/org/chorem/jtimer/io/GTimerIncrementalSaverTest.java +++ b/src/test/java/org/chorem/jtimer/io/GTimerIncrementalSaverTest.java @@ -24,7 +24,7 @@ package org.chorem.jtimer.io; import java.io.File; import java.io.IOException; -import java.util.Calendar; +import java.time.LocalDate; import java.util.Collection; import java.util.Date; import java.util.HashMap; @@ -195,30 +195,16 @@ public class GTimerIncrementalSaverTest extends AbstractJTimerTest { Assert.assertEquals(totalTime, 11391000); // test 20080909 9000 - - Calendar calendar = Calendar.getInstance(); - calendar.set(Calendar.YEAR, 2008); - calendar.set(Calendar.MONTH, 8); - calendar.set(Calendar.DAY_OF_MONTH, 9); - Assert.assertEquals(task.getTime(calendar.getTime()), 9000000); + Assert.assertEquals(task.getTime(LocalDate.of(2008, 8, 9)), 9000000); // 20080922 13 - calendar.set(Calendar.YEAR, 2008); - calendar.set(Calendar.MONTH, 8); - calendar.set(Calendar.DAY_OF_MONTH, 22); - Assert.assertEquals(task.getTime(calendar.getTime()), 13000); + Assert.assertEquals(task.getTime(LocalDate.of(2008, 8, 22)), 13000); // 20080930 2332 - calendar.set(Calendar.YEAR, 2008); - calendar.set(Calendar.MONTH, 8); - calendar.set(Calendar.DAY_OF_MONTH, 30); - Assert.assertEquals(task.getTime(calendar.getTime()), 2332000); + Assert.assertEquals(task.getTime(LocalDate.of(2008, 8, 30)), 2332000); // 20081011 46 - calendar.set(Calendar.YEAR, 2008); - calendar.set(Calendar.MONTH, 9); - calendar.set(Calendar.DAY_OF_MONTH, 11); - Assert.assertEquals(task.getTime(calendar.getTime()), 46000); + Assert.assertEquals(task.getTime(LocalDate.of(2008, 9, 11)), 46000); /*FIXME saver.unlock(); } catch (DataLockingException e) { diff --git a/src/test/java/org/chorem/jtimer/utils/DailySortedMapTest.java b/src/test/java/org/chorem/jtimer/utils/DailySortedMapTest.java deleted file mode 100644 index d586e6b..0000000 --- a/src/test/java/org/chorem/jtimer/utils/DailySortedMapTest.java +++ /dev/null @@ -1,538 +0,0 @@ -/* - * #%L - * jTimer - * %% - * Copyright (C) 2008 - 2016 CodeLutin, Chatellier Eric - * %% - * 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 3 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, see - * <http://www.gnu.org/licenses/gpl-3.0.html>. - * #L% - */ - -package org.chorem.jtimer.utils; - -import java.text.DateFormat; -import java.text.ParseException; -import java.util.Date; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; -import java.util.SortedMap; -import java.util.TreeMap; -import java.util.Map.Entry; - -import org.testng.Assert; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; - -/** - * Test for DailySortedMap class. - * - * @author chatellier - * @version $Revision$ - * - * Last update : $Date$ - * By : $Author$ - */ -public class DailySortedMapTest { - - protected static DateFormat df; - - /** - * Init date format instance. - */ - @BeforeClass - public static void init() { - df = DateFormat.getDateInstance(DateFormat.LONG, Locale.ENGLISH); - } - - /** - * Test le contructeur par defaut. - */ - @Test - public void testConstructor() { - DailySortedMap<Long> map = new DailySortedMap<>(); - Assert.assertNotNull(map); - } - - /** - * Test le constructeur avec comparateur. - * @throws ParseException - */ - @Test - public void testConsctuctorComparator() throws ParseException { - - DailySortedMap<Long> map = new DailySortedMap<>(Date::compareTo); - - Date d1 = df.parse("December 30, 2008"); - Date d2 = df.parse("December 29, 2008"); - - map.put(d1, 1l); - map.put(d2, 2l); - map.put(d1, 3l); - - Assert.assertNotNull(map); - Assert.assertEquals(map.size(), 2); - Assert.assertEquals(map.firstEntry().getValue().longValue(), 2l); - Assert.assertEquals(map.lastEntry().getValue().longValue(), 3l); - } - - /** - * Test du constructeur avec une sorted map. - * @throws ParseException - */ - @Test - public void testConstructorMap() throws ParseException { - Date d1 = df.parse("December 30, 2008, 12:00:00 GMT"); - Date d2 = df.parse("December 30, 2008, 13:00:00 GMT"); - Date d3 = df.parse("December 31, 2008, 12:00:00 GMT"); - Date d4 = df.parse("December 31, 2008, 13:00:00 GMT"); - - SortedMap<Date, Long> map = new TreeMap<>(); - map.put(d1, 1l); - map.put(d2, 2l); - map.put(d3, 3l); - map.put(d4, 4l); - - // d2 erase d1, and d4 erase d3 - DailySortedMap<Long> newMap = new DailySortedMap<>(map); - Assert.assertEquals(newMap.size(), 2); - Assert.assertEquals(newMap.firstEntry().getValue().longValue(), 2l); - Assert.assertEquals(newMap.lastEntry().getValue().longValue(), 4l); - } - - /** - * Test du constructeur avec une map. - * @throws ParseException - */ - @Test - public void testConstructorSortedMap() throws ParseException { - Date d1 = df.parse("December 30, 2008, 12:00:00 GMT"); - Date d2 = df.parse("December 30, 2008, 13:00:00 GMT"); - Date d3 = df.parse("December 31, 2008, 12:00:00 GMT"); - Date d4 = df.parse("December 31, 2008, 13:00:00 GMT"); - - Map<Date, Long> map = new HashMap<>(); - map.put(d1, 1l); - map.put(d2, 2l); - map.put(d3, 3l); - map.put(d4, 4l); - - // d2 erase d1, and d4 erase d3 - DailySortedMap<Long> newMap = new DailySortedMap<>(map); - Assert.assertEquals(newMap.size(), 2); - Assert.assertEquals(newMap.firstEntry().getValue().longValue(), 2l); - Assert.assertEquals(newMap.lastEntry().getValue().longValue(), 4l); - } - - /** - * Test ceilingEntry. - * @throws ParseException - */ - @Test - public void ceilingEntryTest() throws ParseException { - DailySortedMap<Long> map = new DailySortedMap<>(); - - Date d1 = df.parse("May 09, 2009, 12:00:00 GMT"); - Date d2 = df.parse("June 12, 2009, 12:00:00 GMT"); - Date d3 = df.parse("December 07, 2009, 12:00:00 GMT"); - - map.put(d1, 3l); - map.put(d3, 13l); - - Entry<Date, Long> entry = map.ceilingEntry(d2); - - Assert.assertEquals(entry.getKey(), d3); - Assert.assertEquals(entry.getValue().longValue(), 13l); - } - - /** - * Test ceilingKey. - * @throws ParseException - */ - @Test - public void ceilingKeyTest() throws ParseException { - DailySortedMap<Long> map = new DailySortedMap<>(); - - Date d1 = df.parse("May 09, 2009, 12:00:00 GMT"); - Date d2 = df.parse("June 12, 2009, 12:00:00 GMT"); - Date d3 = df.parse("December 07, 2009, 12:00:00 GMT"); - - map.put(d1, 3l); - map.put(d3, 13l); - - Date d = map.ceilingKey(d2); - - Assert.assertEquals(d, d3); - } - - /** - * Test containsKey. - * @throws ParseException - */ - @Test - public void containsKeyTest() throws ParseException { - Date d1 = df.parse("December 30, 2008, 12:00:00 GMT"); - - DailySortedMap<Long> map = new DailySortedMap<>(); - map.put(d1, 1l); - - Assert.assertTrue(map.containsKey(d1)); - - Date d2 = df.parse("December 31, 2008, 12:00:00 GMT"); - Assert.assertFalse(map.containsKey(d2)); - - Date d3 = df.parse("December 30, 2008, 18:48:00 GMT"); - Assert.assertTrue(map.containsKey(d3)); - - // non date object - Assert.assertFalse(map.containsKey("test false")); - } - - /** - * Test floorEntry. - * @throws ParseException - */ - @Test - public void floorEntryTest() throws ParseException { - DailySortedMap<Long> map = new DailySortedMap<>(); - - Date d1 = df.parse("May 09, 2009, 12:00:00 GMT"); - Date d2 = df.parse("June 12, 2009, 12:00:00 GMT"); - Date d3 = df.parse("December 07, 2009, 12:00:00 GMT"); - - map.put(d1, 3l); - map.put(d3, 13l); - - Entry<Date, Long> entry = map.floorEntry(d2); - - Assert.assertEquals(entry.getKey(), d1); - Assert.assertEquals(entry.getValue().longValue(), 3l); - } - - /** - * Test floorKey. - * @throws ParseException - */ - @Test - public void floorKeyTest() throws ParseException { - DailySortedMap<Long> map = new DailySortedMap<>(); - - Date d1 = df.parse("May 09, 2009, 12:00:00 GMT"); - Date d2 = df.parse("June 12, 2009, 12:00:00 GMT"); - Date d3 = df.parse("December 07, 2009, 12:00:00 GMT"); - - map.put(d1, 3l); - map.put(d3, 13l); - - Date d = map.floorKey(d2); - - Assert.assertEquals(d, d1); - } - - /** - * Test get(). - * @throws ParseException - */ - @Test - public void getTest() throws ParseException { - Date d1 = df.parse("December 30, 2008, 12:00:00 GMT"); - Date d2 = df.parse("December 31, 2008, 12:00:00 GMT"); - - DailySortedMap<Long> map = new DailySortedMap<>(); - map.put(d1, 1l); - map.put(d2, 2l); - - Assert.assertEquals(1l, map.get(d1).longValue()); - Assert.assertEquals(2l, map.get(d2).longValue()); - - Date d3 = df.parse("December 29, 2008, 12:00:00 GMT"); - Assert.assertNull(map.get(d3)); - - Date d4 = df.parse("December 30, 2008, 18:48:00 GMT"); - Assert.assertEquals(map.get(d4).longValue(), 1l); - - // non date object - Assert.assertNull(map.get("test false")); - } - - /** - * Test headMap. - * @throws ParseException - */ - @Test - public void headMapTest() throws ParseException { - DailySortedMap<Long> map = new DailySortedMap<>(); - - Date d1 = df.parse("May 09, 2009, 12:00:00 GMT"); - Date d2 = df.parse("June 12, 2009, 12:00:00 GMT"); - Date d3 = df.parse("December 07, 2009, 12:00:00 GMT"); - - map.put(d1, 3l); - map.put(d2, 34l); - map.put(d3, 13l); - - SortedMap<Date, Long> newMap = map.headMap(df.parse("June 12, 2009, 18:44:59 GMT")); - - Assert.assertEquals(newMap.size(), 1); - } - - /** - * Test headMap. - * @throws ParseException - */ - @Test - public void headMapBooleanTest() throws ParseException { - DailySortedMap<Long> map = new DailySortedMap<>(); - - Date d1 = df.parse("May 09, 2009, 12:00:00 GMT"); - Date d2 = df.parse("June 12, 2009, 12:00:00 GMT"); - Date d3 = df.parse("December 07, 2009, 12:00:00 GMT"); - - map.put(d1, 3l); - map.put(d2, 34l); - map.put(d3, 13l); - - SortedMap<Date, Long> newMap = map.headMap(df.parse("June 12, 2009, 18:44:59 GMT"), true); - - Assert.assertEquals(newMap.size(), 2); - } - - /** - * Test higherEntry. - * @throws ParseException - */ - @Test - public void higherEntryTest() throws ParseException { - DailySortedMap<Long> map = new DailySortedMap<>(); - - Date d1 = df.parse("May 09, 2009, 12:00:00 GMT"); - //Date d2 = df.parse("June 12, 2009, 12:00:00 GMT"); - Date d3 = df.parse("December 07, 2009, 12:00:00 GMT"); - - map.put(d1, 3l); - map.put(d3, 13l); - - Entry<Date, Long> entry = map.higherEntry(df.parse("June 12, 2009, 18:44:59 GMT")); - - Assert.assertEquals(entry.getKey(), d3); - Assert.assertEquals(entry.getValue().longValue(), 13l); - } - - /** - * Test higherKey. - * @throws ParseException - */ - @Test - public void higherKeyTest() throws ParseException { - DailySortedMap<Long> map = new DailySortedMap<>(); - - Date d1 = df.parse("May 09, 2009, 12:00:00 GMT"); - //Date d2 = df.parse("June 12, 2009, 12:00:00 GMT"); - Date d3 = df.parse("December 07, 2009, 12:00:00 GMT"); - - map.put(d1, 3l); - map.put(d3, 13l); - - Date d = map.higherKey(df.parse("June 12, 2009, 18:44:59 GMT")); - - Assert.assertEquals(d, d3); - } - - /** - * Test lowerEntry. - * @throws ParseException - */ - @Test - public void lowerEntryTest() throws ParseException { - DailySortedMap<Long> map = new DailySortedMap<>(); - - Date d1 = df.parse("May 09, 2009, 12:00:00 GMT"); - //Date d2 = df.parse("June 12, 2009, 12:00:00 GMT"); - Date d3 = df.parse("December 07, 2009, 12:00:00 GMT"); - - map.put(d1, 3l); - map.put(d3, 13l); - - Entry<Date, Long> entry = map.lowerEntry(df.parse("June 12, 2009, 18:44:59 GMT")); - - Assert.assertEquals(entry.getKey(), d1); - Assert.assertEquals(entry.getValue().longValue(), 3l); - } - - /** - * Test lowerKey. - * @throws ParseException - */ - @Test - public void lowerKeyTest() throws ParseException { - DailySortedMap<Long> map = new DailySortedMap<>(); - - Date d1 = df.parse("May 09, 2009, 12:00:00 GMT"); - //Date d2 = df.parse("June 12, 2009, 12:00:00 GMT"); - Date d3 = df.parse("December 07, 2009, 12:00:00 GMT"); - - map.put(d1, 3l); - map.put(d3, 13l); - - Date d = map.lowerKey(df.parse("June 12, 2009, 18:44:59 GMT")); - - Assert.assertEquals(d, d1); - } - - /** - * Test put(). - * @throws ParseException - */ - @Test - public void putTest() throws ParseException { - Date d1 = df.parse("December 30, 2008, 12:00:00 GMT"); - Date d2 = df.parse("December 30, 2008, 14:00:00 GMT"); - Date d3 = df.parse("December 31, 2008, 12:00:00 GMT"); - Date d4 = df.parse("December 31, 2008, 18:48:00 GMT"); - Date d5 = df.parse("December 31, 2008, 00:00:00 GMT"); - - DailySortedMap<Long> map = new DailySortedMap<>(); - map.put(d1, 1l); - map.put(d2, 2l); - Assert.assertEquals(map.size(), 1); - Assert.assertEquals(map.get(d1).longValue(), 2l); - - map.put(d3, 3l); - Assert.assertEquals(map.size(), 2); - Assert.assertEquals(map.get(d3).longValue(), 3l); - - map.put(d4, 4l); - Assert.assertEquals(map.size(), 2); - Assert.assertEquals(map.get(d3).longValue(), 4l); - - map.put(d5, 5l); - Assert.assertEquals(map.size(), 2); - Assert.assertEquals(map.get(d3).longValue(), 5l); - } - - /** - * Test putAll(). - * @throws ParseException - */ - @Test - public void putAllTest() throws ParseException { - - Date d1 = df.parse("December 30, 2008, 12:00:00 GMT"); - Date d2 = df.parse("December 30, 2008, 14:00:00 GMT"); - Date d3 = df.parse("December 31, 2008, 12:00:00 GMT"); - Date d4 = df.parse("December 31, 2008, 18:48:00 GMT"); - Date d5 = df.parse("December 31, 2008, 00:00:00 GMT"); - - Map<Date, Long> map = new HashMap<>(); - map.put(d1, 1l); - map.put(d2, 2l); - map.put(d3, 3l); - map.put(d4, 4l); - map.put(d5, 5l); - Assert.assertEquals(2, map.size()); - - DailySortedMap<Long> newMap = new DailySortedMap<>(); - newMap.putAll(map); - Assert.assertEquals(map.size(), 2); - Assert.assertEquals(map.get(d1).longValue(), 2l); - Assert.assertEquals(map.get(d3).longValue(), 5l); - } - - /** - * Test subMap. - * @throws ParseException - */ - @Test - public void subMapTest() throws ParseException { - DailySortedMap<Long> map = new DailySortedMap<>(); - - Date d1 = df.parse("May 09, 2009, 12:00:00 GMT"); - Date d2 = df.parse("June 12, 2009, 12:00:00 GMT"); - Date d3 = df.parse("December 07, 2009, 12:00:00 GMT"); - - map.put(d1, 3l); - map.put(d2, 3l); - map.put(d3, 13l); - - SortedMap<Date, Long> newMap = map.subMap(df.parse("May 1, 2009, 11:02:33 GMT"), - df.parse("October 11, 2009, 18:44:59 GMT")); - - Assert.assertEquals(newMap.size(), 2); - } - - /** - * Test subMap. - * @throws ParseException - */ - @Test - public void subMapBooleanTest() throws ParseException { - DailySortedMap<Long> map = new DailySortedMap<>(); - - Date d1 = df.parse("May 09, 2009, 12:00:00 GMT"); - Date d2 = df.parse("June 12, 2009, 12:00:00 GMT"); - Date d3 = df.parse("December 07, 2009, 12:00:00 GMT"); - - map.put(d1, 3l); - map.put(d2, 3l); - map.put(d3, 13l); - - SortedMap<Date, Long> newMap = map.subMap(df.parse("May 09, 2009, 15:45:00 GMT"), true, - df.parse("December 07, 2009, 17:56:12 GMT") , false); - - Assert.assertEquals(newMap.size(), 2); - } - - /** - * Test tailMap. - * @throws ParseException - */ - @Test - public void tailMapTest() throws ParseException { - DailySortedMap<Long> map = new DailySortedMap<>(); - - Date d1 = df.parse("May 09, 2009, 12:00:00 GMT"); - Date d2 = df.parse("June 12, 2009, 12:00:00 GMT"); - Date d3 = df.parse("December 07, 2009, 12:00:00 GMT"); - - map.put(d1, 3l); - map.put(d2, 3l); - map.put(d3, 13l); - - SortedMap<Date, Long> newMap = map.tailMap(df.parse("July 15, 2009, 15:10:00 GMT")); - - Assert.assertEquals(newMap.size(), 1); - } - - /** - * Test tailMap. - * @throws ParseException - */ - @Test - public void tailMapBooleanTest() throws ParseException { - DailySortedMap<Long> map = new DailySortedMap<>(); - - Date d1 = df.parse("May 09, 2009, 12:00:00 GMT"); - Date d2 = df.parse("June 12, 2009, 12:00:00 GMT"); - Date d3 = df.parse("December 07, 2009, 12:00:00 GMT"); - - map.put(d1, 3l); - map.put(d2, 3l); - map.put(d3, 13l); - - SortedMap<Date, Long> newMap = map.tailMap(df.parse("December 07, 2009, 13:58:00 GMT"), false); - - Assert.assertEquals(newMap.size(), 0); - } -} -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.
participants (1)
-
chorem.org scm