Jtimer-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
March 2012
- 2 participants
- 47 discussions
r2852 - trunk/src/main/java/org/chorem/jtimer/ui/treetable
by echatellier@users.chorem.org 29 Mar '12
by echatellier@users.chorem.org 29 Mar '12
29 Mar '12
Author: echatellier
Date: 2012-03-29 14:04:56 +0200 (Thu, 29 Mar 2012)
New Revision: 2852
Url: http://chorem.org/repositories/revision/jtimer/2852
Log:
Fix un pb de toString() qui arrive ?\195?\160 s'afficher dans l'arbre de temps en temps
Modified:
trunk/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksCellRenderer.java
Modified: trunk/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksCellRenderer.java
===================================================================
--- trunk/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksCellRenderer.java 2012-03-28 21:04:42 UTC (rev 2851)
+++ trunk/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksCellRenderer.java 2012-03-29 12:04:56 UTC (rev 2852)
@@ -100,8 +100,7 @@
boolean selected, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
- super.getTreeCellRendererComponent(tree, value,
- selected, expanded, leaf, row, hasFocus);
+ Object localValue = value;
// if this is a task
if (value instanceof TimerTask) {
@@ -114,15 +113,29 @@
taskName = taskName
.substring(TimerProject.SYNCHRONIZED_PROJECT_NAME_PREFIX
.length());
+ }
+ // task name should not be "null"
+ localValue = taskName;
+ }
+
+ // le fait en 2 temps car sinon, on voit de temps en temps
+ // le toString() suivit du setName()
+ super.getTreeCellRendererComponent(tree, localValue,
+ selected, expanded, leaf, row, hasFocus);
+
+ // if this is a task
+ if (value instanceof TimerTask) {
+ TimerTask task = (TimerTask) value;
+
+ // add style in project in sync
+ if (task instanceof TimerProject
+ && ((TimerProject) task).isSynchronized()) {
setFont(getFont().deriveFont(Font.ITALIC));
} else {
setFont(getFont().deriveFont(Font.PLAIN));
}
- // task name should not be "null"
- setText(taskName);
-
// add icon if task is running
if (runningTasks.contains(task)) {
setIcon(runningIcon);
1
0
r2851 - in trunk/src/site: . en/rst en/rst/devel resources/images/screen rst rst/devel
by echatellier@users.chorem.org 28 Mar '12
by echatellier@users.chorem.org 28 Mar '12
28 Mar '12
Author: echatellier
Date: 2012-03-28 23:04:42 +0200 (Wed, 28 Mar 2012)
New Revision: 2851
Url: http://chorem.org/repositories/revision/jtimer/2851
Log:
Update documentation
Added:
trunk/src/site/resources/images/screen/jtimeralert.jpg
Removed:
trunk/src/site/en/rst/configuration.rst
trunk/src/site/rst/configuration.rst
Modified:
trunk/src/site/en/rst/devel/roadmap.rst
trunk/src/site/en/rst/index.rst
trunk/src/site/en/rst/screenshots.rst
trunk/src/site/resources/images/screen/jtimer.jpg
trunk/src/site/resources/images/screen/jtimeridle.jpg
trunk/src/site/resources/images/screen/jtimerreport.jpg
trunk/src/site/rst/devel/roadmap.rst
trunk/src/site/rst/index.rst
trunk/src/site/rst/screenshots.rst
trunk/src/site/site_en.xml
trunk/src/site/site_fr.xml
Deleted: trunk/src/site/en/rst/configuration.rst
===================================================================
--- trunk/src/site/en/rst/configuration.rst 2012-03-28 20:19:38 UTC (rev 2850)
+++ trunk/src/site/en/rst/configuration.rst 2012-03-28 21:04:42 UTC (rev 2851)
@@ -1,83 +0,0 @@
-.. -
-.. * #%L
-.. * jTimer
-.. *
-.. * $Id$
-.. * $HeadURL$
-.. * %%
-.. * 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%
-.. -
-Configuration
-=============
-
-JTimer.properties
------------------
-
-You can overwrite default configuration by editing
-property file in ``$HOME/.jtimer/JTimer.properties``
-
-Sample:
-
-::
-
- # Service class
- jtimer.service.class=org.chorem.jtimer.ws.xmlrpc.ChoremXMLRPCClient
- # Service resource to use for previous class
- jtimer.service.resource=JTimer
- # Service endpoint to use for previous class
- jtimer.service.endpoint=http://localhost:8080
-
- # Idle time (integer in seconds)
- jtimer.ui.idletime=300
-
- # jtimer io saver directory
- jtimer.io.saver.class=org.chorem.jtimer.io.GTimerIncrementalSaver
- # Saver directory
- jtimer.io.saver.directory=$HOME/.gtimer
- # Save delay
- jtimer.io.saver.autosavedelay=300
-
-Configuration details
-~~~~~~~~~~~~~~~~~~~~~
-
-Webservices
-###########
-
-``jtimer.service.class=org.chorem.jtimer.ws.xmlrpc.ChoremXMLRPCClient``
- Implementation name to use for webservices
-``jtimer.service.resource=JTimer``
- Remote resource name
-``jtimer.service.endpoint``
- Service endpoint
-
-Inactivité
-##########
-
-``jtimer.ui.idletime=300``
- Idle detect delay (in seconds)
-
-Sauvegarde
-##########
-
-``jtimer.io.saver.class=org.chorem.jtimer.io.GTimerIncrementalSaver``
- Save manager to use. Here in GTimer file format.
-``jtimer.io.saver.directory=$HOME/.gtimer``
- Save directory. $HOME variable can be used. It will be
- replaced by user home directory.
-``jtimer.io.saver.autosavedelay=300``
- Running task save delay (in secondes).
Modified: trunk/src/site/en/rst/devel/roadmap.rst
===================================================================
--- trunk/src/site/en/rst/devel/roadmap.rst 2012-03-28 20:19:38 UTC (rev 2850)
+++ trunk/src/site/en/rst/devel/roadmap.rst 2012-03-28 21:04:42 UTC (rev 2851)
@@ -5,7 +5,7 @@
.. * $Id$
.. * $HeadURL$
.. * %%
-.. * Copyright (C) 2007 - 2011 CodeLutin, Chatellier Eric
+.. * Copyright (C) 2007 - 2012 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
@@ -25,11 +25,10 @@
Roadmap
=======
-Version 2.0
+Version 1.4
-----------
-* *non available*
-* File format change
-* gTimer import/export
+* Time tracking algorithm refactoring
+* Switch to Better swing application framework (bsaf)
Version 1.3
-----------
Modified: trunk/src/site/en/rst/index.rst
===================================================================
--- trunk/src/site/en/rst/index.rst 2012-03-28 20:19:38 UTC (rev 2850)
+++ trunk/src/site/en/rst/index.rst 2012-03-28 21:04:42 UTC (rev 2851)
@@ -5,7 +5,7 @@
.. * $Id$
.. * $HeadURL$
.. * %%
-.. * Copyright (C) 2007 - 2011 CodeLutin, Chatellier Eric
+.. * Copyright (C) 2007 - 2012 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,11 +22,9 @@
.. * <http://www.gnu.org/licenses/gpl-3.0.html>.
.. * #L%
.. -
-Home
-====
-
Presentation
-------------
+============
+
jTimer is a time tracking tool for projects activities. It also can
generate activities reports.
@@ -46,8 +44,6 @@
`Download Java`_.
-Warning, a `known issue`_ break jTimer under OpenJDK.
-
Links
-----
* gTimer_.
Modified: trunk/src/site/en/rst/screenshots.rst
===================================================================
--- trunk/src/site/en/rst/screenshots.rst 2012-03-28 20:19:38 UTC (rev 2850)
+++ trunk/src/site/en/rst/screenshots.rst 2012-03-28 21:04:42 UTC (rev 2851)
@@ -5,7 +5,7 @@
.. * $Id$
.. * $HeadURL$
.. * %%
-.. * Copyright (C) 2007 - 2011 CodeLutin, Chatellier Eric
+.. * Copyright (C) 2007 - 2012 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
@@ -25,6 +25,8 @@
Screenshots
===========
+jTimer main screenshots (taken from version 1.4.0).
+
Main view
---------
@@ -40,6 +42,11 @@
.. image:: ../images/screen/jtimeridle.jpg
+Alerts
+------
+
+.. image:: ../images/screen/jtimeralert.jpg
+
System tray
-----------
Modified: trunk/src/site/resources/images/screen/jtimer.jpg
===================================================================
(Binary files differ)
Added: trunk/src/site/resources/images/screen/jtimeralert.jpg
===================================================================
(Binary files differ)
Property changes on: trunk/src/site/resources/images/screen/jtimeralert.jpg
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Modified: trunk/src/site/resources/images/screen/jtimeridle.jpg
===================================================================
(Binary files differ)
Modified: trunk/src/site/resources/images/screen/jtimerreport.jpg
===================================================================
(Binary files differ)
Deleted: trunk/src/site/rst/configuration.rst
===================================================================
--- trunk/src/site/rst/configuration.rst 2012-03-28 20:19:38 UTC (rev 2850)
+++ trunk/src/site/rst/configuration.rst 2012-03-28 21:04:42 UTC (rev 2851)
@@ -1,84 +0,0 @@
-.. -
-.. * #%L
-.. * jTimer
-.. *
-.. * $Id$
-.. * $HeadURL$
-.. * %%
-.. * 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%
-.. -
-Configuration
-=============
-
-JTimer.properties
------------------
-
-Vous pouvez surchargez la configuration par défaut en
-éditant le fichier de propriétés dans ``$HOME/.jtimer/JTimer.properties``
-
-Exemple:
-
-::
-
- # Service class
- jtimer.service.class=org.chorem.jtimer.ws.xmlrpc.ChoremXMLRPCClient
- # Service resource to use for previous class
- jtimer.service.resource=JTimer
- # Service endpoint to use for previous class
- jtimer.service.endpoint=http://localhost:8080
-
- # Idle time (integer in seconds)
- jtimer.ui.idletime=300
-
- # jtimer io saver directory
- jtimer.io.saver.class=org.chorem.jtimer.io.GTimerIncrementalSaver
- # Saver directory
- jtimer.io.saver.directory=$HOME/.gtimer
- # Save delay
- jtimer.io.saver.autosavedelay=300
-
-Détail de la configuration
-~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Webservices
-###########
-
-``jtimer.service.class=org.chorem.jtimer.ws.xmlrpc.ChoremXMLRPCClient``
- Nom de l'implementation a utiliser pour les services web
-``jtimer.service.resource=JTimer``
- Nom de la ressources distante
-``jtimer.service.endpoint``
- Adresse du service
-
-Inactivité
-##########
-
-``jtimer.ui.idletime=300``
- Durée de détection l'inactivité (en secondes)
-
-Sauvegarde
-##########
-
-``jtimer.io.saver.class=org.chorem.jtimer.io.GTimerIncrementalSaver``
- Nom du gestionnaire de sauvegarde à utiliser. Ici sauvegarde au format GTimer.
-``jtimer.io.saver.directory=$HOME/.gtimer``
- Dossier de sauvegarde utilisé. La variable $HOME peut être utilisée, elle sera
- remplacée par le dossier d'accueil de l'utilisateur.
-``jtimer.io.saver.autosavedelay=300``
- Interval de sauvegarde des tâches en cours seulement, les autres modifications
- sont stockées en temps réel (en secondes).
Modified: trunk/src/site/rst/devel/roadmap.rst
===================================================================
--- trunk/src/site/rst/devel/roadmap.rst 2012-03-28 20:19:38 UTC (rev 2850)
+++ trunk/src/site/rst/devel/roadmap.rst 2012-03-28 21:04:42 UTC (rev 2851)
@@ -25,11 +25,10 @@
Roadmap
=======
-Version 2.0
+Version 1.4
-----------
-* *non disponible*
-* Modification du format de stockage.
-* Import/Export gtimer.
+* Modification de l'algorithme de timing des taches
+* Utilisation de Better Swing Application framework (bsaf)
Version 1.3
-----------
Modified: trunk/src/site/rst/index.rst
===================================================================
--- trunk/src/site/rst/index.rst 2012-03-28 20:19:38 UTC (rev 2850)
+++ trunk/src/site/rst/index.rst 2012-03-28 21:04:42 UTC (rev 2851)
@@ -5,7 +5,7 @@
.. * $Id$
.. * $HeadURL$
.. * %%
-.. * Copyright (C) 2007 - 2011 CodeLutin, Chatellier Eric
+.. * Copyright (C) 2007 - 2012 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,11 +22,9 @@
.. * <http://www.gnu.org/licenses/gpl-3.0.html>.
.. * #L%
.. -
-Accueil
-=======
-
Présentation
-------------
+============
+
jTimer est un outil de suivit de temps passé sur des projets. Il permet
également de générer des rapports d'activité.
@@ -47,8 +45,6 @@
`Telecharger Java`_.
-Attention, un `bug connu`_ empeche jTimer de fonctionner sur l'OpenJDK.
-
Liens
-----
* gTimer_.
Modified: trunk/src/site/rst/screenshots.rst
===================================================================
--- trunk/src/site/rst/screenshots.rst 2012-03-28 20:19:38 UTC (rev 2850)
+++ trunk/src/site/rst/screenshots.rst 2012-03-28 21:04:42 UTC (rev 2851)
@@ -5,7 +5,7 @@
.. * $Id$
.. * $HeadURL$
.. * %%
-.. * Copyright (C) 2007 - 2011 CodeLutin, Chatellier Eric
+.. * Copyright (C) 2007 - 2012 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
@@ -25,6 +25,8 @@
Copies d'écran
==============
+Principales captures d'écrans de jTimer (effectuées avec jTimer 1.4.0).
+
Vue principale
--------------
@@ -40,6 +42,11 @@
.. image:: images/screen/jtimeridle.jpg
+Alertes
+-------
+
+.. image:: images/screen/jtimeralert.jpg
+
Zone de notification
--------------------
Modified: trunk/src/site/site_en.xml
===================================================================
--- trunk/src/site/site_en.xml 2012-03-28 20:19:38 UTC (rev 2850)
+++ trunk/src/site/site_en.xml 2012-03-28 21:04:42 UTC (rev 2851)
@@ -6,7 +6,7 @@
$Id$
$HeadURL$
%%
- Copyright (C) 2007 - 2011 CodeLutin, Chatellier Eric
+ Copyright (C) 2007 - 2012 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,8 +23,6 @@
<http://www.gnu.org/licenses/gpl-3.0.html>.
#L%
-->
-
-
<project name="${project.name}">
<publishDate format="MM-dd-yyyy" />
@@ -47,8 +45,8 @@
<body>
<links>
- <item name="[fr" href="../index.html" />
- <item name="en]" href="index.html" />
+ <item name="fr" href="../index.html" />
+ <item name="en" href="index.html" />
</links>
<breadcrumbs>
@@ -59,11 +57,11 @@
<item name="Home" href="index.html" />
<item name="Screenshots" href="screenshots.html" />
<item name="Download" href="http://www.chorem.org/projects/jtimer/files" />
- <item name="Configuration" href="configuration.html" />
- <item name="Release Notes" href="http://www.chorem.org/repositories/entry/jtimer/trunk/changelog.txt" />
+ <item name="Release Notes" href="changes-report.html" />
</menu>
<menu name="Contibute" inherit="top">
+ <item name="Forge" href="http://www.chorem.org/projects/jtimer" />
<item name="Bug tracker" href="http://www.chorem.org/projects/jtimer/issues" />
<item name="I18N" href="contribute/i18n.html" />
</menu>
@@ -71,10 +69,7 @@
<menu name="Developers" inherit="top">
<item name="Roadmap" href="devel/roadmap.html" />
<item name="Operation" href="devel/index.html">
- <!-- item name="User interface" href="devel/ui.html" /-->
<item name="Swing framework" href="devel/saf.html" />
- <!-- item name="Events" href="devel/events.html" /-->
- <!-- item name="Webservices" href="devel/webservices.html" /-->
<item name="File format" href="devel/fileformat.html" />
</item>
</menu>
Modified: trunk/src/site/site_fr.xml
===================================================================
--- trunk/src/site/site_fr.xml 2012-03-28 20:19:38 UTC (rev 2850)
+++ trunk/src/site/site_fr.xml 2012-03-28 21:04:42 UTC (rev 2851)
@@ -6,7 +6,7 @@
$Id$
$HeadURL$
%%
- Copyright (C) 2007 - 2011 CodeLutin, Chatellier Eric
+ Copyright (C) 2007 - 2012 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,8 +23,6 @@
<http://www.gnu.org/licenses/gpl-3.0.html>.
#L%
-->
-
-
<project name="${project.name}">
<skin>
@@ -45,8 +43,8 @@
<body>
<links>
- <item name="[fr" href="index.html" />
- <item name="en]" href="en/index.html" />
+ <item name="fr" href="index.html" />
+ <item name="en" href="en/index.html" />
</links>
<breadcrumbs>
@@ -57,11 +55,11 @@
<item name="Accueil" href="index.html" />
<item name="Copies d'écran" href="screenshots.html" />
<item name="Téléchargement" href="http://www.chorem.org/projects/jtimer/files" />
- <item name="Configuration" href="configuration.html" />
- <item name="Notes de version" href="http://www.chorem.org/repositories/entry/jtimer/trunk/changelog.txt" />
+ <item name="Notes de version" href="changes-report.html" />
</menu>
<menu name="Contribuer" inherit="top">
+ <item name="Forge" href="http://www.chorem.org/projects/jtimer" />
<item name="Bug tracker" href="http://www.chorem.org/projects/jtimer/issues" />
<item name="I18N" href="contribute/i18n.html" />
</menu>
@@ -69,10 +67,7 @@
<menu name="Développeur" inherit="top">
<item name="Roadmap" href="devel/roadmap.html" />
<item name="Fonctionnement" href="devel/index.html">
- <!-- item name="Interface utilisateur" href="devel/ui.html" / -->
<item name="Framework swing" href="devel/saf.html" />
- <!-- item name="Evenements" href="devel/events.html" / -->
- <!-- item name="Webservices" href="devel/webservices.html" / -->
<item name="Format de fichier" href="devel/fileformat.html" />
</item>
</menu>
1
0
28 Mar '12
Author: echatellier
Date: 2012-03-28 22:19:38 +0200 (Wed, 28 Mar 2012)
New Revision: 2850
Url: http://chorem.org/repositories/revision/jtimer/2850
Log:
Remove synchronized (seams to cause application freeze)
Modified:
trunk/src/main/java/org/chorem/jtimer/data/TimerDataManager.java
Modified: trunk/src/main/java/org/chorem/jtimer/data/TimerDataManager.java
===================================================================
--- trunk/src/main/java/org/chorem/jtimer/data/TimerDataManager.java 2012-03-28 20:14:41 UTC (rev 2849)
+++ trunk/src/main/java/org/chorem/jtimer/data/TimerDataManager.java 2012-03-28 20:19:38 UTC (rev 2850)
@@ -82,7 +82,7 @@
*
* @param listener listener
*/
- public synchronized void addDataEventListener(DataEventListener listener) {
+ public void addDataEventListener(DataEventListener listener) {
dataEventListeners.add(listener);
}
@@ -91,7 +91,7 @@
*
* @param listener listener
*/
- public synchronized void removeDataEventListener(DataEventListener listener) {
+ public void removeDataEventListener(DataEventListener listener) {
dataEventListeners.remove(listener);
}
@@ -100,7 +100,7 @@
*
* @param listener listener
*/
- public synchronized void addVetoableDataEventListener(
+ public void addVetoableDataEventListener(
VetoableDataEventListener listener) {
vetoableDataEventListeners.add(listener);
}
@@ -110,7 +110,7 @@
*
* @param listener listener
*/
- public synchronized void removeVetoableDataEventListener(
+ public void removeVetoableDataEventListener(
VetoableDataEventListener listener) {
vetoableDataEventListeners.remove(listener);
}
@@ -120,7 +120,7 @@
*
* @param project a project
*/
- public synchronized void addProject(TimerProject project) {
+ public void addProject(TimerProject project) {
// fire vetoable event
for (VetoableDataEventListener vetoableDataEventListener : vetoableDataEventListeners) {
@@ -141,7 +141,7 @@
* @param parent parent task
* @param task task to add
*/
- public synchronized void addTask(TimerTask parent, TimerTask task) {
+ public void addTask(TimerTask parent, TimerTask task) {
// fire vetoable event
for (VetoableDataEventListener vetoableDataEventListener : vetoableDataEventListeners) {
@@ -161,7 +161,7 @@
*
* @param projects project collection
*/
- public synchronized void addAllProjects(Collection<TimerProject> projects) {
+ public void addAllProjects(Collection<TimerProject> projects) {
if (projects != null) {
projectList.clear();
projectList.addAll(projects);
@@ -180,7 +180,7 @@
*
* @return list of projects
*/
- public synchronized List<TimerProject> getProjectsList() {
+ public List<TimerProject> getProjectsList() {
return projectList;
}
@@ -191,7 +191,7 @@
* @param date date to change time
* @param value new time in ms
*/
- public synchronized void changeTaskTime(TimerTask task, Date date,
+ public void changeTaskTime(TimerTask task, Date date,
long value) {
// fire vetoable event
@@ -212,7 +212,7 @@
*
* @param task task to start
*/
- public synchronized void startTask(TimerTask task) {
+ public void startTask(TimerTask task) {
// send notification
for (DataEventListener dataEventListener : dataEventListeners) {
dataEventListener.startTask(task);
@@ -224,7 +224,7 @@
*
* @param task task to stop
*/
- public synchronized void stopTask(TimerTask task) {
+ public void stopTask(TimerTask task) {
// send notification
for (DataEventListener dataEventListener : dataEventListeners) {
dataEventListener.stopTask(task);
@@ -236,7 +236,7 @@
*
* @param task task to delete
*/
- public synchronized void deleteTask(TimerTask task) {
+ public void deleteTask(TimerTask task) {
// fire vetoable event
for (VetoableDataEventListener vetoableDataEventListener : vetoableDataEventListeners) {
@@ -258,7 +258,7 @@
*
* @param project project to delete
*/
- public synchronized void deleteProject(TimerProject project) {
+ public void deleteProject(TimerProject project) {
// fire vetoable event
for (VetoableDataEventListener vetoableDataEventListener : vetoableDataEventListeners) {
@@ -279,7 +279,7 @@
*
* @param project project to close
*/
- public synchronized void changeProjectCloseState(TimerProject project) {
+ public void changeProjectCloseState(TimerProject project) {
// fire vetoable event
//Iterator<VetoableDataEventListener> itVetoableDataEventListener = vetoableDataEventListeners
@@ -312,7 +312,7 @@
*
* @param task task to close
*/
- public synchronized void changeTaskCloseState(TimerTask task) {
+ public void changeTaskCloseState(TimerTask task) {
// fire vetoable event
for (VetoableDataEventListener vetoableDataEventListener : vetoableDataEventListeners) {
@@ -334,7 +334,7 @@
* @param project project to edit
* @param newProjectName new project name
*/
- public synchronized void editProject(TimerProject project,
+ public void editProject(TimerProject project,
String newProjectName) {
// fire vetoable event
@@ -358,7 +358,7 @@
* @param task task to edit
* @param newTaskName new task name
*/
- public synchronized void editTask(TimerTask task, String newTaskName) {
+ public void editTask(TimerTask task, String newTaskName) {
// fire vetoable event
TimerTask newTask = task.clone();
@@ -381,7 +381,7 @@
* @param destination task to move to
* @param tasksToMove tasks to move
*/
- public synchronized void moveTask(TimerTask destination, Collection<TimerTask> tasksToMove) {
+ public void moveTask(TimerTask destination, Collection<TimerTask> tasksToMove) {
// fire vetoable event
for (VetoableDataEventListener vetoableDataEventListener : vetoableDataEventListeners) {
@@ -416,7 +416,7 @@
* @param destinationTask task where task will be merged
* @param otherTasks task to merge in first task
*/
- public synchronized void mergeTasks(TimerTask destinationTask, List<TimerTask> otherTasks) {
+ public void mergeTasks(TimerTask destinationTask, List<TimerTask> otherTasks) {
// fire vetoable event
for (VetoableDataEventListener vetoableDataEventListener : vetoableDataEventListeners) {
@@ -531,7 +531,7 @@
* @param date day of annotation
* @param annotation annotation
*/
- public synchronized void addAnnotation(TimerTask task, Date date,
+ public void addAnnotation(TimerTask task, Date date,
String annotation) {
// fire vetoable event
@@ -553,7 +553,7 @@
*
* @param task task where alert has been modified
*/
- public synchronized void modifyAlert(TimerTask task) {
+ public void modifyAlert(TimerTask task) {
// send event
for (DataEventListener dataEventListener : dataEventListeners) {
1
0
28 Mar '12
Author: echatellier
Date: 2012-03-28 22:14:41 +0200 (Wed, 28 Mar 2012)
New Revision: 2849
Url: http://chorem.org/repositories/revision/jtimer/2849
Log:
Fix synchronize on boolean (spotted by sonar)
Modified:
trunk/src/main/java/org/chorem/jtimer/ui/tasks/RunTaskJob.java
Modified: trunk/src/main/java/org/chorem/jtimer/ui/tasks/RunTaskJob.java
===================================================================
--- trunk/src/main/java/org/chorem/jtimer/ui/tasks/RunTaskJob.java 2012-03-28 16:37:31 UTC (rev 2848)
+++ trunk/src/main/java/org/chorem/jtimer/ui/tasks/RunTaskJob.java 2012-03-28 20:14:41 UTC (rev 2849)
@@ -29,6 +29,7 @@
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
+import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
import javax.swing.JOptionPane;
@@ -84,7 +85,7 @@
protected AtomicLong lastUserActivity;
/** Want to stop flag. */
- protected Boolean bWantToStop;
+ protected AtomicBoolean bWantToStop;
/**
* Constructor.
@@ -101,7 +102,7 @@
this.parentApp = parentApp;
// init with False
- bWantToStop = Boolean.FALSE;
+ bWantToStop = new AtomicBoolean(false);
// save vars
this.managedTask = managedTask;
@@ -240,7 +241,7 @@
// test if task want to stop
synchronized (bWantToStop) {
- dontWantToStop = !bWantToStop.booleanValue();
+ dontWantToStop = !bWantToStop.get();
}
}
@@ -368,7 +369,7 @@
*/
public void wantToStop() {
synchronized (bWantToStop) {
- bWantToStop = Boolean.TRUE;
+ bWantToStop.set(true);
}
}
@@ -380,7 +381,7 @@
public boolean isStopping() {
boolean stopping;
synchronized (bWantToStop) {
- stopping = bWantToStop.booleanValue();
+ stopping = bWantToStop.get();
}
return stopping;
}
1
0
Author: echatellier
Date: 2012-03-28 18:37:31 +0200 (Wed, 28 Mar 2012)
New Revision: 2848
Url: http://chorem.org/repositories/revision/jtimer/2848
Log:
Merge branche for new time tracking algorithm.
closes #13: Time tacking incorrect after system resume
closes #282: Daily time not counted correctly when crossing midnight
closes #492: Hibernate is not managed as user idleness
Modified:
trunk/
trunk/src/main/java/org/chorem/jtimer/JTimer.java
trunk/src/main/java/org/chorem/jtimer/data/TimerDataManager.java
trunk/src/main/java/org/chorem/jtimer/entities/TimerAlert.java
trunk/src/main/java/org/chorem/jtimer/entities/TimerTask.java
trunk/src/main/java/org/chorem/jtimer/io/GTimerIncrementalSaver.java
trunk/src/main/java/org/chorem/jtimer/ui/StatusBar.java
trunk/src/main/java/org/chorem/jtimer/ui/TimerTaskEditor.java
trunk/src/main/java/org/chorem/jtimer/ui/alert/AlertTableModel.java
trunk/src/main/java/org/chorem/jtimer/ui/report/ReportUtils.java
trunk/src/main/java/org/chorem/jtimer/ui/tasks/RunTaskJob.java
trunk/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksModel.java
trunk/src/main/java/org/chorem/jtimer/ui/widget/DurationEditor.java
trunk/src/main/java/org/chorem/jtimer/utils/DailySortedMap.java
trunk/src/test/java/org/chorem/jtimer/data/TimerDataManagerTest.java
trunk/src/test/java/org/chorem/jtimer/io/GTimerIncrementalSaverTest.java
Property changes on: trunk
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/1.4.0-ttalgo:2840-2847
Modified: trunk/src/main/java/org/chorem/jtimer/JTimer.java
===================================================================
--- trunk/src/main/java/org/chorem/jtimer/JTimer.java 2012-03-27 20:54:44 UTC (rev 2847)
+++ trunk/src/main/java/org/chorem/jtimer/JTimer.java 2012-03-28 16:37:31 UTC (rev 2848)
@@ -718,7 +718,7 @@
RunTaskJob job = null;
TaskMonitor tm = getContext().getTaskMonitor();
- for (Task<Void, Long> t : tm.getTasks()) {
+ for (Task t : tm.getTasks()) {
TimerTask localtask = ((RunTaskJob) t).getTask();
if (task.equals(localtask)) {
job = (RunTaskJob) t;
@@ -770,7 +770,7 @@
public void stopAllTasks() {
TaskMonitor tm = getContext().getTaskMonitor();
- for (Task<Void, Long> t : tm.getTasks()) {
+ for (Task t : tm.getTasks()) {
// task
TimerTask ttask = ((RunTaskJob) t).getTask();
stopTask(ttask);
@@ -937,7 +937,7 @@
*/
@Action(enabledProperty = "selectedSingleTask")
public void increment5Task() {
- incrementTaskTime(5 * 60);
+ incrementTaskTime(5 * 60000);
}
/**
@@ -945,7 +945,7 @@
*/
@Action(enabledProperty = "selectedSingleTask")
public void increment30Task() {
- incrementTaskTime(30 * 60);
+ incrementTaskTime(30 * 60000);
}
/**
@@ -953,7 +953,7 @@
*/
@Action(enabledProperty = "selectedSingleTask")
public void decrement1Task() {
- incrementTaskTime(-60);
+ incrementTaskTime(-60000);
}
/**
@@ -961,7 +961,7 @@
*/
@Action(enabledProperty = "selectedSingleTask")
public void decrement5Task() {
- incrementTaskTime(-5 * 60);
+ incrementTaskTime(-5 * 60000);
}
/**
@@ -969,7 +969,7 @@
*/
@Action(enabledProperty = "selectedSingleTask")
public void decrement30Task() {
- incrementTaskTime(-30 * 60);
+ incrementTaskTime(-30 * 60000);
}
/**
@@ -977,7 +977,7 @@
*/
@Action(enabledProperty = "selectedSingleTask")
public void increment1Task() {
- incrementTaskTime(60);
+ incrementTaskTime(60000);
}
/**
@@ -985,37 +985,29 @@
*
* To decrement, set negative increment:)
*
- * @param increment increment in seconds
+ * @param increment increment in ms
*/
protected void incrementTaskTime(long increment) {
TimerTask selectedTask = projectsAndTasksTable.getSelectedTasks()
.get(0);
- // check if task is running
- RunTaskJob job = getJobForRunningTask(selectedTask);
- if (job != null) {
- // task is running
- // increment is in seconds !!!
- job.incrementTaskTime(increment * 1000);
- } else {
- // task is not running
- Date now = new Date();
- long todayTime = selectedTask.getTime(now);
+ // task is not running
+ Date now = new Date();
+ long todayTime = selectedTask.getTime(now);
- long newTodayTime = todayTime + increment;
+ long newTodayTime = todayTime + increment;
- try {
- // check if + negative increment still positive
- if (newTodayTime > 0) {
- core.getData().changeTaskTime(selectedTask, now,
- newTodayTime);
- } else {
- // force to 0
- core.getData().changeTaskTime(selectedTask, now, 0L);
- }
- } catch (DataViolationException e) {
- displayErrorMessage(e.getExceptionKey());
+ try {
+ // check if + negative increment still positive
+ if (newTodayTime > 0) {
+ core.getData().changeTaskTime(selectedTask, now,
+ newTodayTime);
+ } else {
+ // force to 0
+ core.getData().changeTaskTime(selectedTask, now, 0L);
}
+ } catch (DataViolationException e) {
+ displayErrorMessage(e.getExceptionKey());
}
}
Modified: trunk/src/main/java/org/chorem/jtimer/data/TimerDataManager.java
===================================================================
--- trunk/src/main/java/org/chorem/jtimer/data/TimerDataManager.java 2012-03-27 20:54:44 UTC (rev 2847)
+++ trunk/src/main/java/org/chorem/jtimer/data/TimerDataManager.java 2012-03-28 16:37:31 UTC (rev 2848)
@@ -189,7 +189,7 @@
*
* @param task the task to change time
* @param date date to change time
- * @param value new time in seconds
+ * @param value new time in ms
*/
public synchronized void changeTaskTime(TimerTask task, Date date,
long value) {
@@ -429,18 +429,18 @@
while (itDataEventListener.hasNext()) {
itDataEventListener.next().preMergeTasks(destinationTask, otherTasks);
}
-
+
for (TimerTask otherTask : otherTasks) {
mergeTwoTasks(destinationTask, otherTask);
}
-
+
// send post notification
itDataEventListener = dataEventListeners.iterator();
while (itDataEventListener.hasNext()) {
itDataEventListener.next().postMergeTasks(destinationTask, otherTasks);
}
}
-
+
/**
* Merge two task together.
*
@@ -454,7 +454,7 @@
}
// task is modified during merge, deep clone it
-
+
// make sub task list copy (concurrency)
Collection<TimerTask> otherTaskSubTasks = new ArrayList<TimerTask>(otherTask.getSubTasks());
for (TimerTask otherTaskSubTask : otherTaskSubTasks) {
@@ -467,7 +467,7 @@
sameTaskNameTask = destSubTask;
}
}
-
+
// no similar task found
if (sameTaskNameTask == null) {
if (log.isDebugEnabled()) {
@@ -488,14 +488,14 @@
// TODO possible bug here, task times may not be saved
}
}
-
+
// copy otherTask times to current task
for (Entry<Date, Long> times : otherTask.getAllDaysAndTimes().entrySet()) {
Long currentDuration = destinationTask.getTime(times.getKey());
currentDuration += times.getValue();
destinationTask.setTime(times.getKey(), currentDuration);
}
-
+
// copy annotations
for (Entry<Date, String> note : otherTask.getAllDaysAnnotations().entrySet()) {
Date noteKey = note.getKey();
@@ -513,17 +513,17 @@
}
destinationTask.addAnnotation(noteKey, note.getValue());
}
-
+
// copy alerts
for (TimerAlert alert : otherTask.getAlerts()) {
destinationTask.addAlert(alert);
}
-
+
// finally otherTask still exist
// empty, but still exist
deleteTask(otherTask);
}
-
+
/**
* Add annotation on task for specified calendar, and send event.
*
Modified: trunk/src/main/java/org/chorem/jtimer/entities/TimerAlert.java
===================================================================
--- trunk/src/main/java/org/chorem/jtimer/entities/TimerAlert.java 2012-03-27 20:54:44 UTC (rev 2847)
+++ trunk/src/main/java/org/chorem/jtimer/entities/TimerAlert.java 2012-03-28 16:37:31 UTC (rev 2848)
@@ -52,7 +52,7 @@
/** Alert type. */
protected Type type;
- /** Alert duration. (in seconds) */
+ /** Alert duration. (in ms) */
protected long duration;
/**
@@ -66,7 +66,7 @@
* Constructor.
*
* @param type type
- * @param duration duration
+ * @param duration duration (ms)
*/
public TimerAlert(Type type, long duration) {
this();
Modified: trunk/src/main/java/org/chorem/jtimer/entities/TimerTask.java
===================================================================
--- trunk/src/main/java/org/chorem/jtimer/entities/TimerTask.java 2012-03-27 20:54:44 UTC (rev 2847)
+++ trunk/src/main/java/org/chorem/jtimer/entities/TimerTask.java 2012-03-28 16:37:31 UTC (rev 2848)
@@ -72,7 +72,7 @@
protected TimerTask parent;
/**
- * Map calendar of day -> time. (ordered on keys)
+ * Map calendar of day -> time (ms). (ordered on keys)
*/
protected SortedMap<Date, Long> allDaysTimes;
@@ -240,20 +240,18 @@
/**
* Add time.
*
- * Calendar will be forced to 0h00:00.000
- *
* @param date date
- * @param seconds seconds
+ * @param time time in ms
*/
- public void setTime(Date date, Long seconds) {
- allDaysTimes.put(date, seconds);
+ public void setTime(Date date, Long time) {
+ allDaysTimes.put(date, time);
}
/**
* Get time at date.
*
* @param date date
- * @return time at specified date
+ * @return time at specified date in ms
*/
public long getTime(Date date) {
long result = 0;
Modified: trunk/src/main/java/org/chorem/jtimer/io/GTimerIncrementalSaver.java
===================================================================
--- trunk/src/main/java/org/chorem/jtimer/io/GTimerIncrementalSaver.java 2012-03-27 20:54:44 UTC (rev 2847)
+++ trunk/src/main/java/org/chorem/jtimer/io/GTimerIncrementalSaver.java 2012-03-28 16:37:31 UTC (rev 2848)
@@ -512,7 +512,7 @@
try {
Date keyDate = GTimerTimeUtil.yyyyMMdd2Date(sKey);
String timeString = (String) prop.get(sKey);
- t.setTime(keyDate, Long.valueOf(timeString));
+ t.setTime(keyDate, Long.valueOf(timeString) * 1000);
} catch (NumberFormatException e) {
if (log.isErrorEnabled()) {
log.error("Can't convert " + prop.get(sKey)
@@ -642,12 +642,12 @@
try {
if ("reachtotaltime".equals(alertType)) {
- Long duration = Long.parseLong(alertDuration);
+ Long duration = Long.parseLong(alertDuration) * 1000;
TimerAlert alert = new TimerAlert(
TimerAlert.Type.REACH_TOTAL_TIME, duration);
task.addAlert(alert);
} else if ("reachdailytime".equals(alertType)) {
- Long duration = Long.parseLong(alertDuration);
+ Long duration = Long.parseLong(alertDuration) * 1000;
TimerAlert alert = new TimerAlert(
TimerAlert.Type.REACH_DAILY_TIME, duration);
task.addAlert(alert);
@@ -1004,9 +1004,9 @@
for (Entry<Date, Long> entry : task.getAllDaysAndTimes().entrySet()) {
Date date = entry.getKey();
+ long value = entry.getValue() / 1000;
String gtimerDate = GTimerTimeUtil.date2yyyyMMdd(date);
-
- out.write(gtimerDate + " " + entry.getValue() + "\n");
+ out.write(gtimerDate + " " + value + "\n");
}
out.close();
@@ -1104,7 +1104,7 @@
for (TimerAlert alert : task.getAlerts()) {
Type type = alert.getType();
- long duration = alert.getDuration();
+ long duration = alert.getDuration() / 1000;
switch (type) {
case REACH_DAILY_TIME:
Modified: trunk/src/main/java/org/chorem/jtimer/ui/StatusBar.java
===================================================================
--- trunk/src/main/java/org/chorem/jtimer/ui/StatusBar.java 2012-03-27 20:54:44 UTC (rev 2847)
+++ trunk/src/main/java/org/chorem/jtimer/ui/StatusBar.java 2012-03-28 16:37:31 UTC (rev 2848)
@@ -118,7 +118,7 @@
}
lblTime.setText(resourceMap
.getString("todayTotalMessage", DurationFormatUtils
- .formatDuration(duration * 1000, "HH:mm:ss")));
+ .formatDuration(duration, "HH:mm:ss")));
}
/*
Modified: trunk/src/main/java/org/chorem/jtimer/ui/TimerTaskEditor.java
===================================================================
--- trunk/src/main/java/org/chorem/jtimer/ui/TimerTaskEditor.java 2012-03-27 20:54:44 UTC (rev 2847)
+++ trunk/src/main/java/org/chorem/jtimer/ui/TimerTaskEditor.java 2012-03-28 16:37:31 UTC (rev 2848)
@@ -574,7 +574,7 @@
long time = cloneTask.getTime(date);
Calendar cal = Calendar.getInstance();
// FIXME me, not use a calendar here !
- cal.setTimeInMillis(time * 1000 - cal.get(Calendar.ZONE_OFFSET));
+ cal.setTimeInMillis(time - cal.get(Calendar.ZONE_OFFSET));
spinnerH.setValue(cal.get(Calendar.HOUR_OF_DAY));
spinnerM.setValue(cal.get(Calendar.MINUTE));
@@ -629,7 +629,7 @@
long seconds = ((Integer) spinnerH.getValue() * 60 * 60)
+ ((Integer) spinnerM.getValue() * 60)
+ ((Integer) spinnerS.getValue());
- cloneTask.setTime(getSelectedDay().getTime(), seconds);
+ cloneTask.setTime(getSelectedDay().getTime(), seconds * 1000);
// annotation
if (isAnnotationChanged) {
Modified: trunk/src/main/java/org/chorem/jtimer/ui/alert/AlertTableModel.java
===================================================================
--- trunk/src/main/java/org/chorem/jtimer/ui/alert/AlertTableModel.java 2012-03-27 20:54:44 UTC (rev 2847)
+++ trunk/src/main/java/org/chorem/jtimer/ui/alert/AlertTableModel.java 2012-03-28 16:37:31 UTC (rev 2848)
@@ -105,7 +105,7 @@
break;
case 1:
- result = alert.getDuration();
+ result = alert.getDuration() / 1000;
break;
default:
@@ -130,7 +130,7 @@
case 1:
long duration = ((Long)value).longValue();
- alert.setDuration(duration);
+ alert.setDuration(duration * 1000);
break;
default:
Modified: trunk/src/main/java/org/chorem/jtimer/ui/report/ReportUtils.java
===================================================================
--- trunk/src/main/java/org/chorem/jtimer/ui/report/ReportUtils.java 2012-03-27 20:54:44 UTC (rev 2847)
+++ trunk/src/main/java/org/chorem/jtimer/ui/report/ReportUtils.java 2012-03-28 16:37:31 UTC (rev 2848)
@@ -402,8 +402,7 @@
* @return formated duration
*/
public String formatDuration(long duration) {
- String result = DurationFormatUtils.formatDuration(duration * 1000,
- "HH:mm:ss");
+ String result = DurationFormatUtils.formatDuration(duration, "HH:mm:ss");
return result;
}
Modified: trunk/src/main/java/org/chorem/jtimer/ui/tasks/RunTaskJob.java
===================================================================
--- trunk/src/main/java/org/chorem/jtimer/ui/tasks/RunTaskJob.java 2012-03-27 20:54:44 UTC (rev 2847)
+++ trunk/src/main/java/org/chorem/jtimer/ui/tasks/RunTaskJob.java 2012-03-28 16:37:31 UTC (rev 2848)
@@ -29,20 +29,21 @@
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
-import java.util.List;
+import java.util.concurrent.atomic.AtomicLong;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
+import org.apache.commons.lang3.time.DateUtils;
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.data.TimerDataManager;
import org.chorem.jtimer.entities.TimerAlert;
+import org.chorem.jtimer.entities.TimerAlert.Type;
import org.chorem.jtimer.entities.TimerTask;
import org.chorem.jtimer.entities.TimerTaskHelper;
-import org.chorem.jtimer.entities.TimerAlert.Type;
import org.chorem.jtimer.ui.system.SystemInfo;
import org.chorem.jtimer.ui.system.SystemInfoFactory;
import org.chorem.jtimer.ui.system.UnsupportedSystemInfoException;
@@ -59,7 +60,7 @@
* Last update : $Date$
* By : $Author$
*/
-public class RunTaskJob extends Task<Void, Long> {
+public class RunTaskJob extends Task<Void, Void> {
/** Class logger. */
private static Log log = LogFactory.getLog(RunTaskJob.class);
@@ -79,19 +80,8 @@
/** Already thrown alert. */
protected Collection<TimerAlert> alreadyTrownAlerts;
- /** Calendar instance when timing start. */
- protected Calendar taskStartCalendar;
-
- /**
- * Offset to adjust time for current day.
- * Include :
- * - Task idle time (task was running but time not counted)
- * - Manual user incremented time
- */
- protected long offsetTimeInMs;
-
/** Last publish time to detect hibernate. */
- protected long lastPublishTimestamp;
+ protected AtomicLong lastUserActivity;
/** Want to stop flag. */
protected Boolean bWantToStop;
@@ -146,10 +136,12 @@
// check alert to be fired
for (TimerAlert alert : task.getAlerts()) {
if (alert.getType().equals(Type.REACH_DAILY_TIME)
- && TimerTaskHelper.getTotalTime(task, now) > alert.getDuration()) {
+ && TimerTaskHelper.getTotalTime(task, now) > alert
+ .getDuration()) {
alreadyTrownAlerts.add(alert.clone());
} else if (alert.getType().equals(Type.REACH_TOTAL_TIME)
- && TimerTaskHelper.getAllTotalTime(task) > alert.getDuration()) {
+ && TimerTaskHelper.getAllTotalTime(task) > alert
+ .getDuration()) {
alreadyTrownAlerts.add(alert.clone());
}
}
@@ -171,62 +163,6 @@
return managedTask;
}
- /**
- * Method to increment time while task is running (in ms).
- *
- * @param increment increment, can be negative
- */
- public void incrementTaskTime(long increment) {
-
- long nowTimestamp = Calendar.getInstance().getTimeInMillis();
-
- // new var, to not modify parameter
- long localIncrement = increment;
-
- // do go over 0
- if (nowTimestamp - taskStartCalendar.getTimeInMillis()
- + offsetTimeInMs + increment < 0) {
- localIncrement = -(nowTimestamp - taskStartCalendar.getTimeInMillis()
- + offsetTimeInMs);
- }
-
- offsetTimeInMs += localIncrement;
- }
-
- /**
- * Reset timing.
- *
- * For example if task goes over 0h00, need to reset...
- */
- public void resetTiming() {
-
- taskStartCalendar = Calendar.getInstance();
- lastPublishTimestamp = taskStartCalendar.getTimeInMillis();
- // need to be this for hibernate in same day
- offsetTimeInMs = managedTask.getTime(new Date()) * 1000;
- }
-
- /**
- * Check if task need to be reset.
- *
- * Test if today number if different of taskStartCalendar day number
- */
- protected void checkReset() {
-
- Calendar nowCalendar = Calendar.getInstance();
-
- // si les jours actuel et jours de debut de start ne sont
- // pas identiques : reset
- if (nowCalendar.get(Calendar.DAY_OF_YEAR) != taskStartCalendar
- .get(Calendar.DAY_OF_YEAR)) {
- if (log.isInfoEnabled()) {
- log.info("Day change detected, reset timing");
- }
- resetTiming();
- }
-
- }
-
/*
* @see org.jdesktop.swingworker.SwingWorker#doInBackground()
*/
@@ -237,28 +173,27 @@
// notify ui
parentApp.startedTask(managedTask);
- // reset on start just for init
- resetTiming();
+ // init
+ lastUserActivity = new AtomicLong(System.currentTimeMillis());
// get idle time
long configIdleTime = JTimer.config.getIdleTime() * 1000;
boolean dontWantToStop = true;
while (dontWantToStop) {
- long currentTime = Calendar.getInstance().getTimeInMillis();
- // try to detect hibernate idle time
- if (currentTime - lastPublishTimestamp >= configIdleTime) {
- // hibernate detected
- // update time without idle time for specified day
- if (log.isInfoEnabled()) {
- log.info("Hibernate detected, reseting timing");
- }
- resetTiming();
- }
+ // this algorithm is based on this atomic operation
+ // that ensure hibernate won't break time tracking
+ long oldUserActivity = lastUserActivity.getAndSet(System.currentTimeMillis());
- lastPublishTimestamp = currentTime;
+ // check for idleness with last user activity (real idle and hibernate)
+ long delta = lastUserActivity.get() - oldUserActivity;
+ // time have to be published, even if idle is detected
+ // because time adjustment will remove more time than published
+ // one if done after
+ addTaskDelta(lastUserActivity.get(), delta);
+
// check user idle time
long idleTime = 0;
if (systemInfo != null) { // idle time available
@@ -269,65 +204,36 @@
}
}
- // check reset before publish (day change)
- checkReset();
+ if (delta >= configIdleTime || idleTime >= configIdleTime) {
- // if long idleTime is unavailable, if is always false
- if (idleTime >= configIdleTime) {
+ long userIdleTime = Math.max(delta, idleTime);
- // to not display negative time near midnight
- long idleTimeOffset = Math.min(idleTime, currentTime - taskStartCalendar.getTimeInMillis());
+ // remove delta from now
+ addTaskDelta(lastUserActivity.get(), -userIdleTime);
- // idle detected
- // update time without idle time
- // math.min > for idle detected at 0:00
- offsetTimeInMs -= idleTimeOffset;
- publish(currentTime - taskStartCalendar.getTimeInMillis() + offsetTimeInMs);
-
- // send idle detect event
- JTimer parentApplication = (JTimer)getApplication();
+ // display idle detected (blocking call)
+ JTimer parentApplication = (JTimer) getApplication();
parentApplication.preIdleDetect();
- // ask user what to do (long blocking call)
- int option = IdleDialog.showIdleDialog(currentTime - idleTime);
- // send idle detect event
+ int option = IdleDialog.showIdleDialog(lastUserActivity.get() - userIdleTime);
parentApplication.postIdleDetect();
- // day can have changed during idle
- checkReset();
+ // restart timing from current time after idle
+ // mandadory call, otherwise, next iteration will display idle
+ // dialog again
+ oldUserActivity = lastUserActivity.getAndSet(System.currentTimeMillis());
+ delta = lastUserActivity.get() - oldUserActivity;
- // get time after user idle
- long afterIdleTime = Calendar.getInstance().getTimeInMillis();
- lastPublishTimestamp = afterIdleTime;
-
switch (option) {
-
case IdleDialog.REVERT:
// just stop the task
((JTimer) getApplication()).stopTask(managedTask);
break;
case IdleDialog.CONTINUE:
- // refresh time
- // remove idle time previously added
- offsetTimeInMs += idleTimeOffset;
- publish(afterIdleTime - taskStartCalendar.getTimeInMillis()
- + offsetTimeInMs);
+ // readd delta since oldUserActivity
+ addTaskDelta(lastUserActivity.get() - userIdleTime, delta + userIdleTime);
break;
-
- default: // RESUME
-
- // resume = increment idle time
- offsetTimeInMs -= afterIdleTime - currentTime;
- // update time
- publish(afterIdleTime - taskStartCalendar.getTimeInMillis()
- + offsetTimeInMs);
- break;
-
}
- } else {
- // pas de idle, met a jour le temps
- publish(currentTime - taskStartCalendar.getTimeInMillis() +
- offsetTimeInMs);
}
Thread.sleep(1000); // 1s
@@ -341,20 +247,52 @@
return null;
}
- /*
- * @see application.Task#process(java.util.List)
+ /**
+ * Add task delta.
+ *
+ * @param oldUserActivity time when delta was notified
+ * @param delta delta to add
*/
- @Override
- protected void process(List<Long> durations) {
+ protected void addTaskDelta(long from, long delta) {
- // take last notification
- // can be notified of many result
- // for example, if UI lag...
- long currentDuration = durations.get(durations.size() - 1);
+ long localDelta = delta;
- dataManager.changeTaskTime(managedTask, new Date(),
- currentDuration / 1000);
+ if (log.isDebugEnabled()) {
+ log.debug("Adding delta to task : " + delta);
+ }
+ // remove time
+ if (localDelta < 0) {
+ Date currentDate = new Date(from);
+ while (localDelta < 0) {
+ Date todayMidnight = DateUtils.truncate(currentDate, Calendar.DAY_OF_MONTH);
+ long msToMidnight = currentDate.getTime() - todayMidnight.getTime();
+ long toRemove = Math.min(-localDelta, msToMidnight);
+ dataManager.changeTaskTime(managedTask, currentDate, managedTask.getTime(currentDate) - toRemove);
+ if (log.isDebugEnabled()) {
+ log.debug(" remove delta to task on " + currentDate + " : " + toRemove);
+ }
+ localDelta += toRemove;
+ currentDate = DateUtils.addMilliseconds(todayMidnight, -1);
+ }
+ } else {
+ // add time
+ Date currentDate = new Date(from);
+ while (localDelta > 0) {
+ Date today235959 = DateUtils.truncate(currentDate, Calendar.DAY_OF_MONTH);
+ today235959 = DateUtils.addDays(today235959, 1);
+ today235959 = DateUtils.addMilliseconds(today235959, -1);
+ long msToMidnight = today235959.getTime() - currentDate.getTime();
+ long toAdd = Math.min(localDelta, msToMidnight);
+ dataManager.changeTaskTime(managedTask, currentDate, managedTask.getTime(currentDate) + toAdd);
+ if (log.isDebugEnabled()) {
+ log.debug(" adding delta to task on " + currentDate + " : " + toAdd);
+ }
+ localDelta -= toAdd;
+ currentDate = DateUtils.addMilliseconds(today235959, 1);
+ }
+ }
+
checkTaskAlerts(managedTask);
}
@@ -370,12 +308,16 @@
for (TimerAlert alert : task.getAlerts()) {
if (!alreadyTrownAlerts.contains(alert)) {
if (alert.getType().equals(Type.REACH_DAILY_TIME)
- && TimerTaskHelper.getTotalTime(task, now) >= alert.getDuration()) {
- displayAlert(task, Type.REACH_DAILY_TIME, alert.getDuration());
+ && TimerTaskHelper.getTotalTime(task, now) >= alert
+ .getDuration()) {
+ displayAlert(task, Type.REACH_DAILY_TIME,
+ alert.getDuration());
alreadyTrownAlerts.add(alert.clone());
} else if (alert.getType().equals(Type.REACH_TOTAL_TIME)
- && TimerTaskHelper.getAllTotalTime(task) >= alert.getDuration()) {
- displayAlert(task, Type.REACH_TOTAL_TIME, alert.getDuration());
+ && TimerTaskHelper.getAllTotalTime(task) >= alert
+ .getDuration()) {
+ displayAlert(task, Type.REACH_TOTAL_TIME,
+ alert.getDuration());
alreadyTrownAlerts.add(alert.clone());
}
}
@@ -401,13 +343,16 @@
SwingUtilities.invokeLater(new Runnable() {
public void run() {
String alertMessage = null;
- String formattedTime = DurationFormatUtils.formatDuration(alertDuration * 1000, "HH:mm:ss");
+ String formattedTime = DurationFormatUtils.formatDuration(
+ alertDuration, "HH:mm:ss");
if (Type.REACH_DAILY_TIME.equals(alertType)) {
alertMessage = getResourceMap().getString(
- "alert.dailyAlertMessage", task.getName(), formattedTime);
+ "alert.dailyAlertMessage", task.getName(),
+ formattedTime);
} else if (Type.REACH_TOTAL_TIME.equals(alertType)) {
alertMessage = getResourceMap().getString(
- "alert.totalAlertMessage", task.getName(), formattedTime);
+ "alert.totalAlertMessage", task.getName(),
+ formattedTime);
}
JOptionPane.showMessageDialog(null, alertMessage,
Modified: trunk/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksModel.java
===================================================================
--- trunk/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksModel.java 2012-03-27 20:54:44 UTC (rev 2847)
+++ trunk/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksModel.java 2012-03-28 16:37:31 UTC (rev 2848)
@@ -155,11 +155,11 @@
break;
case 1:
value = DurationFormatUtils.formatDuration(TimerTaskHelper
- .getTotalTime(task, new Date()) * 1000, "HH:mm:ss");
+ .getTotalTime(task, new Date()), "HH:mm:ss");
break;
case 2:
value = DurationFormatUtils.formatDuration(TimerTaskHelper
- .getAllTotalTime(task) * 1000, "HH:mm:ss");
+ .getAllTotalTime(task), "HH:mm:ss");
break;
}
} else {
Modified: trunk/src/main/java/org/chorem/jtimer/ui/widget/DurationEditor.java
===================================================================
--- trunk/src/main/java/org/chorem/jtimer/ui/widget/DurationEditor.java 2012-03-27 20:54:44 UTC (rev 2847)
+++ trunk/src/main/java/org/chorem/jtimer/ui/widget/DurationEditor.java 2012-03-28 16:37:31 UTC (rev 2848)
@@ -68,7 +68,7 @@
/** Second spinner model. */
protected SpinnerNumberModel secondSpinnerModel;
- /** Duration. */
+ /** Duration (in ms). */
protected long duration;
/**
Property changes on: trunk/src/main/java/org/chorem/jtimer/utils/DailySortedMap.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Modified: trunk/src/test/java/org/chorem/jtimer/data/TimerDataManagerTest.java
===================================================================
--- trunk/src/test/java/org/chorem/jtimer/data/TimerDataManagerTest.java 2012-03-27 20:54:44 UTC (rev 2847)
+++ trunk/src/test/java/org/chorem/jtimer/data/TimerDataManagerTest.java 2012-03-28 16:37:31 UTC (rev 2848)
@@ -423,8 +423,8 @@
Assert.assertEquals(task2.getSubTasks().size(), 2);
Assert.assertEquals(getRecursiveAnnotationsCount(Collections.singleton(task2)), 2);
Assert.assertEquals(task3.getSubTasks().size(), 4);
- Assert.assertEquals(TimerTaskHelper.getAllTotalTime(task1), 55035);
- Assert.assertEquals(TimerTaskHelper.getAllTotalTime(task2), 65602);
+ Assert.assertEquals(TimerTaskHelper.getAllTotalTime(task1), 55035000);
+ Assert.assertEquals(TimerTaskHelper.getAllTotalTime(task2), 65602000);
// merge tasks
dataManager.mergeTasks(task1, Collections.singletonList(task2));
@@ -445,7 +445,7 @@
Assert.assertEquals(task1a.getSubTasks().size(), 4);
Assert.assertEquals(getRecursiveAnnotationsCount(Collections.singleton(task1a)), 5 + 2);
Assert.assertEquals(task3a.getSubTasks().size(), 3);
- Assert.assertEquals(TimerTaskHelper.getAllTotalTime(task1a), 55035 + 65602);
+ Assert.assertEquals(TimerTaskHelper.getAllTotalTime(task1a), 55035000 + 65602000);
}
/**
@@ -468,15 +468,15 @@
// add THE conflict task name
TimerTask tTreeTests = new TimerTask("Tree tests");
tTreeTests.setCreationDate(new Date());
- tTreeTests.setTime(new Date(), 200l);
+ tTreeTests.setTime(new Date(), Long.valueOf(200000));
dataManager.addTask(task1, tTreeTests);
Assert.assertEquals(task1.getSubTasks().size(), 3);
- Assert.assertEquals(TimerTaskHelper.getAllTotalTime(task1), 55035 + 200);
+ Assert.assertEquals(TimerTaskHelper.getAllTotalTime(task1), 55035000 + 200000);
TimerTask task2 = findTask(projectsBefore, "jTimer/Unit tests/UI tests");
Assert.assertEquals(task2.getSubTasks().size(), 2);
- Assert.assertEquals(TimerTaskHelper.getAllTotalTime(task2), 65602);
+ Assert.assertEquals(TimerTaskHelper.getAllTotalTime(task2), 65602000);
// merge tasks
dataManager.mergeTasks(task1, Collections.singletonList(task2));
@@ -495,7 +495,7 @@
// 4 = conflict resolved
Assert.assertEquals(task1a.getSubTasks().size(), 4);
Assert.assertEquals(TimerTaskHelper.getAllTotalTime(task1a),
- 55035 + 65602 + 200);
+ 55035000 + 65602000 + 200000);
}
/**
@@ -521,9 +521,9 @@
.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);
+ TimerAlert alert1 = new TimerAlert(TimerAlert.Type.REACH_DAILY_TIME, 3600000);
+ TimerAlert alert2 = new TimerAlert(TimerAlert.Type.REACH_DAILY_TIME, 7200000);
+ TimerAlert alert3 = new TimerAlert(TimerAlert.Type.REACH_TOTAL_TIME, 10800000);
task1.addAlert(alert1);
task1.addAlert(alert2);
task1.addAlert(alert3);
@@ -546,13 +546,13 @@
boolean alert2found = false;
boolean alert3found = false;
for (TimerAlert alert : task1a.getAlerts()) {
- if (alert.getType().equals(Type.REACH_DAILY_TIME) && alert.getDuration() == 3600) {
+ if (alert.getType().equals(Type.REACH_DAILY_TIME) && alert.getDuration() == 3600000) {
alert1found = true;
}
- if (alert.getType().equals(Type.REACH_DAILY_TIME) && alert.getDuration() == 7200) {
+ if (alert.getType().equals(Type.REACH_DAILY_TIME) && alert.getDuration() == 7200000) {
alert2found = true;
}
- if (alert.getType().equals(Type.REACH_TOTAL_TIME) && alert.getDuration() == 10800) {
+ if (alert.getType().equals(Type.REACH_TOTAL_TIME) && alert.getDuration() == 10800000) {
alert3found = true;
}
}
Modified: trunk/src/test/java/org/chorem/jtimer/io/GTimerIncrementalSaverTest.java
===================================================================
--- trunk/src/test/java/org/chorem/jtimer/io/GTimerIncrementalSaverTest.java 2012-03-27 20:54:44 UTC (rev 2847)
+++ trunk/src/test/java/org/chorem/jtimer/io/GTimerIncrementalSaverTest.java 2012-03-28 16:37:31 UTC (rev 2848)
@@ -195,7 +195,7 @@
for (Long time : task.getAllDaysAndTimes().values()) {
totalTime += time.longValue();
}
- Assert.assertEquals(11391, totalTime);
+ Assert.assertEquals(totalTime, 11391000);
// test 20080909 9000
@@ -203,25 +203,25 @@
calendar.set(Calendar.YEAR, 2008);
calendar.set(Calendar.MONTH, 8);
calendar.set(Calendar.DAY_OF_MONTH, 9);
- Assert.assertEquals(task.getTime(calendar.getTime()), 9000);
+ Assert.assertEquals(task.getTime(calendar.getTime()), 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()), 13);
+ Assert.assertEquals(task.getTime(calendar.getTime()), 13000);
// 20080930 2332
calendar.set(Calendar.YEAR, 2008);
calendar.set(Calendar.MONTH, 8);
calendar.set(Calendar.DAY_OF_MONTH, 30);
- Assert.assertEquals(2332, task.getTime(calendar.getTime()));
+ Assert.assertEquals(task.getTime(calendar.getTime()), 2332000);
// 20081011 46
calendar.set(Calendar.YEAR, 2008);
calendar.set(Calendar.MONTH, 9);
calendar.set(Calendar.DAY_OF_MONTH, 11);
- Assert.assertEquals(46, task.getTime(calendar.getTime()));
+ Assert.assertEquals(task.getTime(calendar.getTime()), 46000);
/*FIXME saver.unlock();
} catch (DataLockingException e) {
@@ -303,11 +303,11 @@
// first alert
Assert.assertEquals(task.getAlerts().get(0).getType(), TimerAlert.Type.REACH_DAILY_TIME);
- Assert.assertEquals(task.getAlerts().get(0).getDuration(), 3600);
+ Assert.assertEquals(task.getAlerts().get(0).getDuration(), 3600000);
// second alert
Assert.assertEquals(task.getAlerts().get(1).getType(), TimerAlert.Type.REACH_TOTAL_TIME);
- Assert.assertEquals(task.getAlerts().get(1).getDuration(), 25000);
+ Assert.assertEquals(task.getAlerts().get(1).getDuration(), 25000000);
/*FIXME saver.unlock();
} catch (DataLockingException e) {
@@ -339,7 +339,7 @@
TimerTask task1 = findTask(projects, "No project/Test no parent project");
Assert.assertNotNull(task1);
- Assert.assertEquals(TimerTaskHelper.getAllTotalTime(task1), 9644);
+ Assert.assertEquals(TimerTaskHelper.getAllTotalTime(task1), 9644000);
/*FIXME testSaver.unlock();
} catch (DataLockingException e) {
1
0
r2847 - branches/1.4.0-ttalgo/src/main/java/org/chorem/jtimer/ui/tasks
by echatellier@users.chorem.org 27 Mar '12
by echatellier@users.chorem.org 27 Mar '12
27 Mar '12
Author: echatellier
Date: 2012-03-27 22:54:44 +0200 (Tue, 27 Mar 2012)
New Revision: 2847
Url: http://chorem.org/repositories/revision/jtimer/2847
Log:
Fix continue option
Modified:
branches/1.4.0-ttalgo/src/main/java/org/chorem/jtimer/ui/tasks/RunTaskJob.java
Modified: branches/1.4.0-ttalgo/src/main/java/org/chorem/jtimer/ui/tasks/RunTaskJob.java
===================================================================
--- branches/1.4.0-ttalgo/src/main/java/org/chorem/jtimer/ui/tasks/RunTaskJob.java 2012-03-27 19:25:50 UTC (rev 2846)
+++ branches/1.4.0-ttalgo/src/main/java/org/chorem/jtimer/ui/tasks/RunTaskJob.java 2012-03-27 20:54:44 UTC (rev 2847)
@@ -178,7 +178,6 @@
// get idle time
long configIdleTime = JTimer.config.getIdleTime() * 1000;
- long idleTime = 0;
boolean dontWantToStop = true;
while (dontWantToStop) {
@@ -187,7 +186,16 @@
// that ensure hibernate won't break time tracking
long oldUserActivity = lastUserActivity.getAndSet(System.currentTimeMillis());
+ // check for idleness with last user activity (real idle and hibernate)
+ long delta = lastUserActivity.get() - oldUserActivity;
+
+ // time have to be published, even if idle is detected
+ // because time adjustment will remove more time than published
+ // one if done after
+ addTaskDelta(lastUserActivity.get(), delta);
+
// check user idle time
+ long idleTime = 0;
if (systemInfo != null) { // idle time available
idleTime = systemInfo.getIdleTime();
@@ -196,14 +204,6 @@
}
}
- // check for idleness with last user activity (real idle and hibernate)
- long delta = lastUserActivity.get() - oldUserActivity;
-
- // time have to be published, even if idle is detected
- // because time adjustment will remove more time than published
- // one if done after
- addTaskDelta(lastUserActivity.get(), delta);
-
if (delta >= configIdleTime || idleTime >= configIdleTime) {
long userIdleTime = Math.max(delta, idleTime);
@@ -217,6 +217,12 @@
int option = IdleDialog.showIdleDialog(lastUserActivity.get() - userIdleTime);
parentApplication.postIdleDetect();
+ // restart timing from current time after idle
+ // mandadory call, otherwise, next iteration will display idle
+ // dialog again
+ oldUserActivity = lastUserActivity.getAndSet(System.currentTimeMillis());
+ delta = lastUserActivity.get() - oldUserActivity;
+
switch (option) {
case IdleDialog.REVERT:
// just stop the task
@@ -225,13 +231,9 @@
case IdleDialog.CONTINUE:
// readd delta since oldUserActivity
- addTaskDelta(lastUserActivity.get() - userIdleTime, userIdleTime);
+ addTaskDelta(lastUserActivity.get() - userIdleTime, delta + userIdleTime);
break;
-
}
-
- // need to fix last user activity
- lastUserActivity.set(System.currentTimeMillis());
}
Thread.sleep(1000); // 1s
1
0
r2846 - branches/1.4.0-ttalgo/src/main/java/org/chorem/jtimer/ui/tasks
by echatellier@users.chorem.org 27 Mar '12
by echatellier@users.chorem.org 27 Mar '12
27 Mar '12
Author: echatellier
Date: 2012-03-27 21:25:50 +0200 (Tue, 27 Mar 2012)
New Revision: 2846
Url: http://chorem.org/repositories/revision/jtimer/2846
Log:
Fix reached alert time format
Modified:
branches/1.4.0-ttalgo/src/main/java/org/chorem/jtimer/ui/tasks/RunTaskJob.java
Modified: branches/1.4.0-ttalgo/src/main/java/org/chorem/jtimer/ui/tasks/RunTaskJob.java
===================================================================
--- branches/1.4.0-ttalgo/src/main/java/org/chorem/jtimer/ui/tasks/RunTaskJob.java 2012-03-27 15:59:10 UTC (rev 2845)
+++ branches/1.4.0-ttalgo/src/main/java/org/chorem/jtimer/ui/tasks/RunTaskJob.java 2012-03-27 19:25:50 UTC (rev 2846)
@@ -342,7 +342,7 @@
public void run() {
String alertMessage = null;
String formattedTime = DurationFormatUtils.formatDuration(
- alertDuration * 1000, "HH:mm:ss");
+ alertDuration, "HH:mm:ss");
if (Type.REACH_DAILY_TIME.equals(alertType)) {
alertMessage = getResourceMap().getString(
"alert.dailyAlertMessage", task.getName(),
1
0
r2845 - branches/1.4.0-ttalgo/src/main/java/org/chorem/jtimer/ui/tasks
by echatellier@users.chorem.org 27 Mar '12
by echatellier@users.chorem.org 27 Mar '12
27 Mar '12
Author: echatellier
Date: 2012-03-27 17:59:10 +0200 (Tue, 27 Mar 2012)
New Revision: 2845
Url: http://chorem.org/repositories/revision/jtimer/2845
Log:
Add new algorithm based on atomic long
Modified:
branches/1.4.0-ttalgo/src/main/java/org/chorem/jtimer/ui/tasks/RunTaskJob.java
Modified: branches/1.4.0-ttalgo/src/main/java/org/chorem/jtimer/ui/tasks/RunTaskJob.java
===================================================================
--- branches/1.4.0-ttalgo/src/main/java/org/chorem/jtimer/ui/tasks/RunTaskJob.java 2012-03-27 10:59:05 UTC (rev 2844)
+++ branches/1.4.0-ttalgo/src/main/java/org/chorem/jtimer/ui/tasks/RunTaskJob.java 2012-03-27 15:59:10 UTC (rev 2845)
@@ -198,15 +198,23 @@
// check for idleness with last user activity (real idle and hibernate)
long delta = lastUserActivity.get() - oldUserActivity;
- if (delta + idleTime >= configIdleTime) {
+ // time have to be published, even if idle is detected
+ // because time adjustment will remove more time than published
+ // one if done after
+ addTaskDelta(lastUserActivity.get(), delta);
+
+ if (delta >= configIdleTime || idleTime >= configIdleTime) {
+
+ long userIdleTime = Math.max(delta, idleTime);
+
// remove delta from now
- addTaskDelta(lastUserActivity.get(), -(delta + idleTime));
+ addTaskDelta(lastUserActivity.get(), -userIdleTime);
// display idle detected (blocking call)
JTimer parentApplication = (JTimer) getApplication();
parentApplication.preIdleDetect();
- int option = IdleDialog.showIdleDialog(delta);
+ int option = IdleDialog.showIdleDialog(lastUserActivity.get() - userIdleTime);
parentApplication.postIdleDetect();
switch (option) {
@@ -217,14 +225,13 @@
case IdleDialog.CONTINUE:
// readd delta since oldUserActivity
- addTaskDelta(oldUserActivity, delta + idleTime);
+ addTaskDelta(lastUserActivity.get() - userIdleTime, userIdleTime);
break;
}
- } else {
- // update new time
- addTaskDelta(oldUserActivity, delta);
+ // need to fix last user activity
+ lastUserActivity.set(System.currentTimeMillis());
}
Thread.sleep(1000); // 1s
@@ -248,6 +255,10 @@
long localDelta = delta;
+ if (log.isDebugEnabled()) {
+ log.debug("Adding delta to task : " + delta);
+ }
+
// remove time
if (localDelta < 0) {
Date currentDate = new Date(from);
@@ -256,6 +267,9 @@
long msToMidnight = currentDate.getTime() - todayMidnight.getTime();
long toRemove = Math.min(-localDelta, msToMidnight);
dataManager.changeTaskTime(managedTask, currentDate, managedTask.getTime(currentDate) - toRemove);
+ if (log.isDebugEnabled()) {
+ log.debug(" remove delta to task on " + currentDate + " : " + toRemove);
+ }
localDelta += toRemove;
currentDate = DateUtils.addMilliseconds(todayMidnight, -1);
}
@@ -269,6 +283,9 @@
long msToMidnight = today235959.getTime() - currentDate.getTime();
long toAdd = Math.min(localDelta, msToMidnight);
dataManager.changeTaskTime(managedTask, currentDate, managedTask.getTime(currentDate) + toAdd);
+ if (log.isDebugEnabled()) {
+ log.debug(" adding delta to task on " + currentDate + " : " + toAdd);
+ }
localDelta -= toAdd;
currentDate = DateUtils.addMilliseconds(today235959, 1);
}
1
0
r2844 - in branches/1.4.0-ttalgo/src: main/java/org/chorem/jtimer/entities test/java/org/chorem/jtimer/data test/java/org/chorem/jtimer/io
by echatellier@users.chorem.org 27 Mar '12
by echatellier@users.chorem.org 27 Mar '12
27 Mar '12
Author: echatellier
Date: 2012-03-27 12:59:05 +0200 (Tue, 27 Mar 2012)
New Revision: 2844
Url: http://chorem.org/repositories/revision/jtimer/2844
Log:
Fix unit tests
Modified:
branches/1.4.0-ttalgo/src/main/java/org/chorem/jtimer/entities/TimerAlert.java
branches/1.4.0-ttalgo/src/test/java/org/chorem/jtimer/data/TimerDataManagerTest.java
branches/1.4.0-ttalgo/src/test/java/org/chorem/jtimer/io/GTimerIncrementalSaverTest.java
Modified: branches/1.4.0-ttalgo/src/main/java/org/chorem/jtimer/entities/TimerAlert.java
===================================================================
--- branches/1.4.0-ttalgo/src/main/java/org/chorem/jtimer/entities/TimerAlert.java 2012-03-27 10:47:23 UTC (rev 2843)
+++ branches/1.4.0-ttalgo/src/main/java/org/chorem/jtimer/entities/TimerAlert.java 2012-03-27 10:59:05 UTC (rev 2844)
@@ -66,7 +66,7 @@
* Constructor.
*
* @param type type
- * @param duration duration
+ * @param duration duration (ms)
*/
public TimerAlert(Type type, long duration) {
this();
Modified: branches/1.4.0-ttalgo/src/test/java/org/chorem/jtimer/data/TimerDataManagerTest.java
===================================================================
--- branches/1.4.0-ttalgo/src/test/java/org/chorem/jtimer/data/TimerDataManagerTest.java 2012-03-27 10:47:23 UTC (rev 2843)
+++ branches/1.4.0-ttalgo/src/test/java/org/chorem/jtimer/data/TimerDataManagerTest.java 2012-03-27 10:59:05 UTC (rev 2844)
@@ -423,8 +423,8 @@
Assert.assertEquals(task2.getSubTasks().size(), 2);
Assert.assertEquals(getRecursiveAnnotationsCount(Collections.singleton(task2)), 2);
Assert.assertEquals(task3.getSubTasks().size(), 4);
- Assert.assertEquals(TimerTaskHelper.getAllTotalTime(task1), 55035);
- Assert.assertEquals(TimerTaskHelper.getAllTotalTime(task2), 65602);
+ Assert.assertEquals(TimerTaskHelper.getAllTotalTime(task1), 55035000);
+ Assert.assertEquals(TimerTaskHelper.getAllTotalTime(task2), 65602000);
// merge tasks
dataManager.mergeTasks(task1, Collections.singletonList(task2));
@@ -445,7 +445,7 @@
Assert.assertEquals(task1a.getSubTasks().size(), 4);
Assert.assertEquals(getRecursiveAnnotationsCount(Collections.singleton(task1a)), 5 + 2);
Assert.assertEquals(task3a.getSubTasks().size(), 3);
- Assert.assertEquals(TimerTaskHelper.getAllTotalTime(task1a), 55035 + 65602);
+ Assert.assertEquals(TimerTaskHelper.getAllTotalTime(task1a), 55035000 + 65602000);
}
/**
@@ -468,15 +468,15 @@
// add THE conflict task name
TimerTask tTreeTests = new TimerTask("Tree tests");
tTreeTests.setCreationDate(new Date());
- tTreeTests.setTime(new Date(), 200l);
+ tTreeTests.setTime(new Date(), Long.valueOf(200000));
dataManager.addTask(task1, tTreeTests);
Assert.assertEquals(task1.getSubTasks().size(), 3);
- Assert.assertEquals(TimerTaskHelper.getAllTotalTime(task1), 55035 + 200);
+ Assert.assertEquals(TimerTaskHelper.getAllTotalTime(task1), 55035000 + 200000);
TimerTask task2 = findTask(projectsBefore, "jTimer/Unit tests/UI tests");
Assert.assertEquals(task2.getSubTasks().size(), 2);
- Assert.assertEquals(TimerTaskHelper.getAllTotalTime(task2), 65602);
+ Assert.assertEquals(TimerTaskHelper.getAllTotalTime(task2), 65602000);
// merge tasks
dataManager.mergeTasks(task1, Collections.singletonList(task2));
@@ -495,7 +495,7 @@
// 4 = conflict resolved
Assert.assertEquals(task1a.getSubTasks().size(), 4);
Assert.assertEquals(TimerTaskHelper.getAllTotalTime(task1a),
- 55035 + 65602 + 200);
+ 55035000 + 65602000 + 200000);
}
/**
@@ -521,9 +521,9 @@
.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);
+ TimerAlert alert1 = new TimerAlert(TimerAlert.Type.REACH_DAILY_TIME, 3600000);
+ TimerAlert alert2 = new TimerAlert(TimerAlert.Type.REACH_DAILY_TIME, 7200000);
+ TimerAlert alert3 = new TimerAlert(TimerAlert.Type.REACH_TOTAL_TIME, 10800000);
task1.addAlert(alert1);
task1.addAlert(alert2);
task1.addAlert(alert3);
@@ -546,13 +546,13 @@
boolean alert2found = false;
boolean alert3found = false;
for (TimerAlert alert : task1a.getAlerts()) {
- if (alert.getType().equals(Type.REACH_DAILY_TIME) && alert.getDuration() == 3600) {
+ if (alert.getType().equals(Type.REACH_DAILY_TIME) && alert.getDuration() == 3600000) {
alert1found = true;
}
- if (alert.getType().equals(Type.REACH_DAILY_TIME) && alert.getDuration() == 7200) {
+ if (alert.getType().equals(Type.REACH_DAILY_TIME) && alert.getDuration() == 7200000) {
alert2found = true;
}
- if (alert.getType().equals(Type.REACH_TOTAL_TIME) && alert.getDuration() == 10800) {
+ if (alert.getType().equals(Type.REACH_TOTAL_TIME) && alert.getDuration() == 10800000) {
alert3found = true;
}
}
Modified: branches/1.4.0-ttalgo/src/test/java/org/chorem/jtimer/io/GTimerIncrementalSaverTest.java
===================================================================
--- branches/1.4.0-ttalgo/src/test/java/org/chorem/jtimer/io/GTimerIncrementalSaverTest.java 2012-03-27 10:47:23 UTC (rev 2843)
+++ branches/1.4.0-ttalgo/src/test/java/org/chorem/jtimer/io/GTimerIncrementalSaverTest.java 2012-03-27 10:59:05 UTC (rev 2844)
@@ -195,7 +195,7 @@
for (Long time : task.getAllDaysAndTimes().values()) {
totalTime += time.longValue();
}
- Assert.assertEquals(11391, totalTime);
+ Assert.assertEquals(totalTime, 11391000);
// test 20080909 9000
@@ -203,25 +203,25 @@
calendar.set(Calendar.YEAR, 2008);
calendar.set(Calendar.MONTH, 8);
calendar.set(Calendar.DAY_OF_MONTH, 9);
- Assert.assertEquals(task.getTime(calendar.getTime()), 9000);
+ Assert.assertEquals(task.getTime(calendar.getTime()), 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()), 13);
+ Assert.assertEquals(task.getTime(calendar.getTime()), 13000);
// 20080930 2332
calendar.set(Calendar.YEAR, 2008);
calendar.set(Calendar.MONTH, 8);
calendar.set(Calendar.DAY_OF_MONTH, 30);
- Assert.assertEquals(2332, task.getTime(calendar.getTime()));
+ Assert.assertEquals(task.getTime(calendar.getTime()), 2332000);
// 20081011 46
calendar.set(Calendar.YEAR, 2008);
calendar.set(Calendar.MONTH, 9);
calendar.set(Calendar.DAY_OF_MONTH, 11);
- Assert.assertEquals(46, task.getTime(calendar.getTime()));
+ Assert.assertEquals(task.getTime(calendar.getTime()), 46000);
/*FIXME saver.unlock();
} catch (DataLockingException e) {
@@ -303,11 +303,11 @@
// first alert
Assert.assertEquals(task.getAlerts().get(0).getType(), TimerAlert.Type.REACH_DAILY_TIME);
- Assert.assertEquals(task.getAlerts().get(0).getDuration(), 3600);
+ Assert.assertEquals(task.getAlerts().get(0).getDuration(), 3600000);
// second alert
Assert.assertEquals(task.getAlerts().get(1).getType(), TimerAlert.Type.REACH_TOTAL_TIME);
- Assert.assertEquals(task.getAlerts().get(1).getDuration(), 25000);
+ Assert.assertEquals(task.getAlerts().get(1).getDuration(), 25000000);
/*FIXME saver.unlock();
} catch (DataLockingException e) {
@@ -339,7 +339,7 @@
TimerTask task1 = findTask(projects, "No project/Test no parent project");
Assert.assertNotNull(task1);
- Assert.assertEquals(TimerTaskHelper.getAllTotalTime(task1), 9644);
+ Assert.assertEquals(TimerTaskHelper.getAllTotalTime(task1), 9644000);
/*FIXME testSaver.unlock();
} catch (DataLockingException e) {
1
0
r2843 - branches/1.4.0-ttalgo/src/main/java/org/chorem/jtimer/ui/tasks
by echatellier@users.chorem.org 27 Mar '12
by echatellier@users.chorem.org 27 Mar '12
27 Mar '12
Author: echatellier
Date: 2012-03-27 12:47:23 +0200 (Tue, 27 Mar 2012)
New Revision: 2843
Url: http://chorem.org/repositories/revision/jtimer/2843
Log:
Add new algorithm based on atomic long
Modified:
branches/1.4.0-ttalgo/src/main/java/org/chorem/jtimer/ui/tasks/RunTaskJob.java
Modified: branches/1.4.0-ttalgo/src/main/java/org/chorem/jtimer/ui/tasks/RunTaskJob.java
===================================================================
--- branches/1.4.0-ttalgo/src/main/java/org/chorem/jtimer/ui/tasks/RunTaskJob.java 2012-03-27 09:35:07 UTC (rev 2842)
+++ branches/1.4.0-ttalgo/src/main/java/org/chorem/jtimer/ui/tasks/RunTaskJob.java 2012-03-27 10:47:23 UTC (rev 2843)
@@ -29,7 +29,7 @@
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
-import java.util.List;
+import java.util.concurrent.atomic.AtomicLong;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
@@ -41,9 +41,9 @@
import org.chorem.jtimer.JTimer;
import org.chorem.jtimer.data.TimerDataManager;
import org.chorem.jtimer.entities.TimerAlert;
+import org.chorem.jtimer.entities.TimerAlert.Type;
import org.chorem.jtimer.entities.TimerTask;
import org.chorem.jtimer.entities.TimerTaskHelper;
-import org.chorem.jtimer.entities.TimerAlert.Type;
import org.chorem.jtimer.ui.system.SystemInfo;
import org.chorem.jtimer.ui.system.SystemInfoFactory;
import org.chorem.jtimer.ui.system.UnsupportedSystemInfoException;
@@ -80,21 +80,9 @@
/** Already thrown alert. */
protected Collection<TimerAlert> alreadyTrownAlerts;
- /** Timestamp when timing start. */
- protected long taskStartTimestamp;
-
/** Last publish time to detect hibernate. */
- protected long lastUserActivity;
+ protected AtomicLong lastUserActivity;
- /**
- * Offset to adjust time for current day (last activity day).
- * Include :
- * - Task initial time
- * - Task idle time (task was running but time not counted)
- * - Manual user incremented time
- */
- protected long offsetTimeInMs;
-
/** Want to stop flag. */
protected Boolean bWantToStop;
@@ -175,37 +163,6 @@
return managedTask;
}
- /**
- * Method to increment time while task is running (in ms).
- *
- * @param increment increment, can be negative
- */
- public void incrementTaskTime(long increment) {
-
- long nowTimestamp = Calendar.getInstance().getTimeInMillis();
-
- // new var, to not modify parameter
- long localIncrement = increment;
-
- // do go over 0
- if (nowTimestamp - taskStartTimestamp + offsetTimeInMs + increment < 0) {
- localIncrement = -(nowTimestamp - taskStartTimestamp + offsetTimeInMs);
- }
-
- offsetTimeInMs += localIncrement;
- }
-
- /**
- * Reset timing.
- *
- * For example if task goes over 0h00, need to reset...
- */
- public void resetTiming() {
- taskStartTimestamp = System.currentTimeMillis();
- lastUserActivity = taskStartTimestamp;
- offsetTimeInMs = managedTask.getTime(new Date()) * 1000;
- }
-
/*
* @see org.jdesktop.swingworker.SwingWorker#doInBackground()
*/
@@ -216,8 +173,8 @@
// notify ui
parentApp.startedTask(managedTask);
- // init timing
- resetTiming();
+ // init
+ lastUserActivity = new AtomicLong(System.currentTimeMillis());
// get idle time
long configIdleTime = JTimer.config.getIdleTime() * 1000;
@@ -226,7 +183,9 @@
boolean dontWantToStop = true;
while (dontWantToStop) {
- long currentTime = System.currentTimeMillis();
+ // this algorithm is based on this atomic operation
+ // that ensure hibernate won't break time tracking
+ long oldUserActivity = lastUserActivity.getAndSet(System.currentTimeMillis());
// check user idle time
if (systemInfo != null) { // idle time available
@@ -237,76 +196,35 @@
}
}
- // if long idleTime is unavailable, if is always false
- if (idleTime >= configIdleTime) {
- lastUserActivity -= idleTime;
- }
-
// check for idleness with last user activity (real idle and hibernate)
- if (currentTime - lastUserActivity >= configIdleTime) {
+ long delta = lastUserActivity.get() - oldUserActivity;
+ if (delta + idleTime >= configIdleTime) {
- // update idle to publish time without counting idle
- offsetTimeInMs -= currentTime - lastUserActivity;
- publish();
+ // remove delta from now
+ addTaskDelta(lastUserActivity.get(), -(delta + idleTime));
// display idle detected (blocking call)
JTimer parentApplication = (JTimer) getApplication();
parentApplication.preIdleDetect();
- int option = IdleDialog.showIdleDialog(currentTime - idleTime);
+ int option = IdleDialog.showIdleDialog(delta);
parentApplication.postIdleDetect();
- // manage tracking resume after idle
- currentTime = System.currentTimeMillis();
- lastUserActivity = currentTime;
-
switch (option) {
case IdleDialog.REVERT:
// just stop the task
((JTimer) getApplication()).stopTask(managedTask);
break;
-
+
case IdleDialog.CONTINUE:
- // refresh time
- // remove idle time previously added
- //offsetTimeInMs += idleTimeOffset;
- //publish(taskTimingBeforeStartInMs + afterIdleTime
- // - taskStartCalendar.getTimeInMillis()
- // + offsetTimeInMs);
-
+ // readd delta since oldUserActivity
+ addTaskDelta(oldUserActivity, delta + idleTime);
break;
-
- case IdleDialog.RESUME:
- // resume = increment idle time
- offsetTimeInMs += currentTime - lastUserActivity;
- // check day change (after offset)
- Calendar nowCalendar = Calendar.getInstance();
- Calendar startCalendar = Calendar.getInstance();
- startCalendar.setTimeInMillis(taskStartTimestamp);
- if (!DateUtils.isSameDay(startCalendar, nowCalendar)) {
- resetTiming();
- }
-
- // update time
- publish();
- break;
}
} else {
-
- // no idle detected
- lastUserActivity = currentTime;
-
- // check day change
- Calendar nowCalendar = Calendar.getInstance();
- Calendar startCalendar = Calendar.getInstance();
- startCalendar.setTimeInMillis(taskStartTimestamp);
- if (!DateUtils.isSameDay(startCalendar, nowCalendar)) {
- resetTiming();
- }
-
// update new time
- publish();
+ addTaskDelta(oldUserActivity, delta);
}
Thread.sleep(1000); // 1s
@@ -320,26 +238,42 @@
return null;
}
- /*
- * @see application.Task#process(java.util.List)
+ /**
+ * Add task delta.
+ *
+ * @param oldUserActivity time when delta was notified
+ * @param delta delta to add
*/
- @Override
- protected void process(List<Void> nothing) {
+ protected void addTaskDelta(long from, long delta) {
- // take last notification
- // can be notified of many result
- // for example, if UI lag...
- long currentTime = System.currentTimeMillis();
- long currentDuration = currentTime - taskStartTimestamp + offsetTimeInMs;
+ long localDelta = delta;
- // time can be negative due to adjust caused by idle or hibernate
- // just publish 0 in this case
- if (currentDuration < 0) {
- currentDuration = 0;
+ // remove time
+ if (localDelta < 0) {
+ Date currentDate = new Date(from);
+ while (localDelta < 0) {
+ Date todayMidnight = DateUtils.truncate(currentDate, Calendar.DAY_OF_MONTH);
+ long msToMidnight = currentDate.getTime() - todayMidnight.getTime();
+ long toRemove = Math.min(-localDelta, msToMidnight);
+ dataManager.changeTaskTime(managedTask, currentDate, managedTask.getTime(currentDate) - toRemove);
+ localDelta += toRemove;
+ currentDate = DateUtils.addMilliseconds(todayMidnight, -1);
+ }
+ } else {
+ // add time
+ Date currentDate = new Date(from);
+ while (localDelta > 0) {
+ Date today235959 = DateUtils.truncate(currentDate, Calendar.DAY_OF_MONTH);
+ today235959 = DateUtils.addDays(today235959, 1);
+ today235959 = DateUtils.addMilliseconds(today235959, -1);
+ long msToMidnight = today235959.getTime() - currentDate.getTime();
+ long toAdd = Math.min(localDelta, msToMidnight);
+ dataManager.changeTaskTime(managedTask, currentDate, managedTask.getTime(currentDate) + toAdd);
+ localDelta -= toAdd;
+ currentDate = DateUtils.addMilliseconds(today235959, 1);
+ }
}
- dataManager.changeTaskTime(managedTask, new Date(), currentDuration);
-
checkTaskAlerts(managedTask);
}
1
0