This is an automated email from the git hooks/post-receive script. New commit to branch feature/sync in repository jtimer. See https://gitlab.nuiton.org/chorem/jtimer.git commit cf626e7e021add91527984f3c00b94bfb8d94e61 Author: servantie <servantie.c@gmail.com> Date: Tue Jun 14 12:00:08 2016 +0200 major change: List<SyncInfo> added to TimerTask to store synchronization info updated parsing/saving methods to adapt to SyncInfo --- .../org/chorem/jtimer/data/DataEventListener.java | 8 +- .../org/chorem/jtimer/data/TimerDataManager.java | 23 +++-- .../java/org/chorem/jtimer/entities/SyncInfo.java | 85 +++++++++++++++ .../java/org/chorem/jtimer/entities/TimerTask.java | 112 +++++++++++++++----- .../chorem/jtimer/entities/TimerTaskHelper.java | 70 +++++++------ .../chorem/jtimer/io/GTimerIncrementalSaver.java | 115 +++++++++++---------- .../chorem/jtimer/io/TimerTaskSynchronizer.java | 23 ++--- src/main/java/org/chorem/jtimer/ui/StatusBar.java | 3 + .../java/org/chorem/jtimer/ui/TimerTaskEditor.java | 53 +--------- .../jtimer/ui/report/TimerTaskUpdaterView.java | 34 +++--- .../jtimer/ui/treetable/ProjectsAndTasksModel.java | 3 + .../ProjectsAndTasksRunningCellRenderer.java | 1 + 12 files changed, 317 insertions(+), 213 deletions(-) diff --git a/src/main/java/org/chorem/jtimer/data/DataEventListener.java b/src/main/java/org/chorem/jtimer/data/DataEventListener.java index df1ad50..7bad531 100644 --- a/src/main/java/org/chorem/jtimer/data/DataEventListener.java +++ b/src/main/java/org/chorem/jtimer/data/DataEventListener.java @@ -190,11 +190,11 @@ public interface DataEventListener extends EventListener { } /** - * Task url changed - * @param task task with url change - * @param newURLList new URlList to change + * SyncInfo changed + * @param task + * @param syncURL String */ - default void modifyTaskURL(TimerTask task, List<String> newURLList) { + default void changeSyncInfo(TimerTask task, String syncURL) { } } diff --git a/src/main/java/org/chorem/jtimer/data/TimerDataManager.java b/src/main/java/org/chorem/jtimer/data/TimerDataManager.java index cea7003..835af87 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.LocalDateTime; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; @@ -409,17 +410,6 @@ public class TimerDataManager { } /** - * Edit Task URL - */ - public void editTaskURL(TimerTask task, List<String> newURLList) { - - task.setSynchronisingURLList(newURLList); - // send notification - for (DataEventListener dataEventListener : dataEventListeners) { - dataEventListener.modifyTaskURL(task, newURLList); - } - } - /** * Move task. * * @param destination task to move to @@ -646,4 +636,15 @@ public class TimerDataManager { return foundTask; } + + /** + * Edit Synchronisation Information + */ + public void changeSyncInfo(TimerTask task, String url) { + task.addSyncInfo(url, LocalDateTime.MIN, true); + + for (DataEventListener dataEventListener : dataEventListeners) { + dataEventListener.changeSyncInfo(task, url); + } + } } diff --git a/src/main/java/org/chorem/jtimer/entities/SyncInfo.java b/src/main/java/org/chorem/jtimer/entities/SyncInfo.java new file mode 100644 index 0000000..d5d9e00 --- /dev/null +++ b/src/main/java/org/chorem/jtimer/entities/SyncInfo.java @@ -0,0 +1,85 @@ +package org.chorem.jtimer.entities; + + + +import java.time.LocalDateTime; + +/** + * Class to structure synchronization info + * Created by servantie on 13/06/16. + */ +public class SyncInfo { + String syncURL; + LocalDateTime lastSync; + boolean isActiveSync; + + /** + * constructor with all parameters + * @param syncURL the url to sync to + * @param lastSync the last time it was synced successfully + * @param isActiveSync if true, will sync auto + */ + public SyncInfo(String syncURL, LocalDateTime lastSync, boolean isActiveSync) { + this.syncURL = syncURL; + this.lastSync = lastSync; + this.isActiveSync = isActiveSync; + } + + /** + * Constructor with just the url, at creation the sync is considered active by default + * @param syncURL the url to sync to + */ + public SyncInfo(String syncURL) { + this.syncURL = syncURL; + this.isActiveSync = true; + } + + /** + * Returns the time of the last sync + * @return LocalDateTime + */ + public LocalDateTime getLastSync() { + return lastSync; + } + + /** + * Returns a boolean if sync should send to this url + * @return boolean + */ + public boolean getActiveSync() { + return isActiveSync; + } + + /** + * Sets the isActiveSync boolean + * @param isActive boolean + */ + public void setActiveSync(boolean isActive) { + isActiveSync = isActive; + } + + /** + * Set the syncURL + * @param syncURL String + */ + public void setSyncURL(String syncURL) { + this.syncURL = syncURL; + } + + /** + * Get the syncURL + * @return String + */ + public String getSyncURL() { + return syncURL; + } + + /** + * Set Sync time + * @param syncTime LocalDateTime + */ + public void setLastSync(LocalDateTime syncTime) { + lastSync = syncTime; + } +} + diff --git a/src/main/java/org/chorem/jtimer/entities/TimerTask.java b/src/main/java/org/chorem/jtimer/entities/TimerTask.java index ae3acb4..ac18c14 100644 --- a/src/main/java/org/chorem/jtimer/entities/TimerTask.java +++ b/src/main/java/org/chorem/jtimer/entities/TimerTask.java @@ -95,9 +95,10 @@ public class TimerTask implements Cloneable, protected LocalDateTime lastSync; /** - * URL to synchronise task + * Synchronisation Info */ - protected List<String> synchronisingURLList; + protected List<SyncInfo> synchronisingInfoList; + /** * Constructor. */ @@ -107,7 +108,7 @@ public class TimerTask implements Cloneable, allDaysAnnotations = new TreeMap<>(); subTasks = new ArrayList<>(); alerts = new ArrayList<>(); - synchronisingURLList = new ArrayList<>(); + synchronisingInfoList = new ArrayList<>(); // wrong value to detect bug number = -1; } @@ -229,24 +230,59 @@ public class TimerTask implements Cloneable, } /** - * Get task's last sync + * Get task's last sync time associated to the url + * If there is no last sync, will return a very far past time + * @param urlString the url to get the last sync from * @return the date of the sync */ - public LocalDateTime getLastSync() { return lastSync; } + public LocalDateTime getLastSync(String urlString) { + //to avoid null, a default time to return if errors + LocalDateTime resultTime = LocalDateTime.MIN; + if (!synchronisingInfoList.isEmpty()) { + for(SyncInfo sync : synchronisingInfoList) { + if (urlString.equals(sync.getSyncURL())) { + resultTime = sync.lastSync; + } + } + } + return resultTime; + } /** - * Sets task's last sync + * Sets task's last sync time on one url + * (if the url doesn't exist in the task's sync info, adds it) * @param syncDate : date of the sync - */ - public void setLastSync(LocalDateTime syncDate) { - this.lastSync = syncDate; + * @param syncURL : the url that has a change of syncdate + */ + public void setLastSync(LocalDateTime syncDate, String syncURL) { + boolean urlinList = false; + if(!synchronisingInfoList.isEmpty()) { + for (SyncInfo sync : synchronisingInfoList) { + if (sync.syncURL.equals(syncURL)) { + sync.setLastSync(syncDate); + urlinList = true; + } + } + } + if (!urlinList) { + synchronisingInfoList.add(new SyncInfo(syncURL, syncDate, true)); + } } /** * Get task's sync URL List + * returns an empty list if there is no info * @return the URL List */ - public List<String> getSynchronisingURLList() { return synchronisingURLList; } + public List<String> getSynchronizingURLList() { + List<String> resutList = new ArrayList<>(); + if (!synchronisingInfoList.isEmpty()) { + for (SyncInfo sync : synchronisingInfoList) { + resutList.add(sync.getSyncURL()); + } + } + return resutList; + } /** * Returns one String containing all the URLs for sync, separated by " , " @@ -254,12 +290,12 @@ public class TimerTask implements Cloneable, */ public String getSynchronizingURLAsString() { StringBuilder builder = new StringBuilder(); - for (int i = 0; i < synchronisingURLList.size(); ++i) { - if (i == synchronisingURLList.size()-1) { - builder.append(synchronisingURLList.get(i)); + for (int i = 0; i < synchronisingInfoList.size(); ++i) { + if (i == synchronisingInfoList.size()-1) { + builder.append(synchronisingInfoList.get(i).getSyncURL()); } else { - builder.append(synchronisingURLList.get(i)); + builder.append(synchronisingInfoList.get(i).getSyncURL()); builder.append(" , "); } } @@ -268,25 +304,53 @@ public class TimerTask implements Cloneable, } /** - * Sets task's sync URLList - * @param synchronisingURLList : the sync URL List - */ - public void setSynchronisingURLList(List<String> synchronisingURLList) { - this.synchronisingURLList = synchronisingURLList; - } - - /** * Add one URL to the task's syncURLList * @param urlToAdd : the url to add */ public void addURLToSyncList(String urlToAdd) { //no need to have redundant elements - if (!synchronisingURLList.contains(urlToAdd)) { - synchronisingURLList.add(urlToAdd); + if (!getSynchronizingURLAsString().contains(urlToAdd)) { + synchronisingInfoList.add(new SyncInfo(urlToAdd)); } } /** + * Adds a new synchronization info if the url isn't already present + * @param url a string + * @param time a LocalDateTime + * @param isActive a boolean for activity (true to sync auto) + */ + public void addSyncInfo(String url, LocalDateTime time, boolean isActive) { + if (!getSynchronizingURLList().contains(url)) { + synchronisingInfoList.add(new SyncInfo(url, time, isActive)); + } + } + + /** + * Returns all the synchronization info + * @return a list of TimerTask.SyncInfo + */ + public List<SyncInfo> getSynchronizingInfoList() { + return synchronisingInfoList; + } + + + /** + * Returns the sync info matching a url + * @param urlString + */ + public SyncInfo getSynchronizingInfo(String urlString) { + for (SyncInfo sync : synchronisingInfoList) { + if (sync.getSyncURL().equals(urlString)) { + return sync; + } + } + SyncInfo errorInfo = new SyncInfo("error"); + return errorInfo; + + } + + /** * Add task's subtask. * * Also add parent reference. diff --git a/src/main/java/org/chorem/jtimer/entities/TimerTaskHelper.java b/src/main/java/org/chorem/jtimer/entities/TimerTaskHelper.java index c17001c..e6f821d 100644 --- a/src/main/java/org/chorem/jtimer/entities/TimerTaskHelper.java +++ b/src/main/java/org/chorem/jtimer/entities/TimerTaskHelper.java @@ -367,44 +367,46 @@ public class TimerTaskHelper { ArrayList<JsonObject> jsonObjectList = new ArrayList<>(); - for (String url : task.getSynchronisingURLList()) { - - JsonObject responseJSON = new JsonObject(); - LocalDate startPeriodDate = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); - LocalDate endPeriodDate = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); - - JsonArray periodArray = new JsonArray(); - SortedMap<Date, Long> dates = task.getAllDaysAndTimes().subMap(startDate, endDate); - if (dates.size() != 0) { - for (SortedMap.Entry<Date, Long> entry : dates.entrySet()) { - //adding id, startDate and duration - //converting Date to LocalDate (to ease the .toString()) - LocalDate date = entry.getKey().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); - String dateString = date.toString(); - //as jtimer has time entries only for a day, the id of the times will be the date in yyyy-mm-dd format - JsonObject periodElement = new JsonObject(); - periodElement.addProperty("id", dateString); - periodElement.addProperty("startDate", dateString + "T00:00:00" + timezone); - periodElement.addProperty("duration", entry.getValue()/1000); - if (withAnnotations && !(getAnnotation(task, entry.getKey()).isEmpty())) { - StringBuilder builder = new StringBuilder(); - for (String s : getAnnotation(task, entry.getKey())) { - builder.append(s); - builder.append(","); - } - String annotations = builder.toString(); - periodElement.addProperty("info", annotations); + for (String url : task.getSynchronizingURLList()) { + boolean isActive = task.getSynchronizingInfo(url).getActiveSync(); + if (isActive) { + JsonObject responseJSON = new JsonObject(); + LocalDate startPeriodDate = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + LocalDate endPeriodDate = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + + JsonArray periodArray = new JsonArray(); + SortedMap<Date, Long> dates = task.getAllDaysAndTimes().subMap(startDate, endDate); + if (dates.size() != 0) { + for (SortedMap.Entry<Date, Long> entry : dates.entrySet()) { + //adding id, startDate and duration + //converting Date to LocalDate (to ease the .toString()) + LocalDate date = entry.getKey().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + String dateString = date.toString(); + //as jtimer has time entries only for a day, the id of the times will be the date in yyyy-mm-dd format + JsonObject periodElement = new JsonObject(); + periodElement.addProperty("id", dateString); + periodElement.addProperty("startDate", dateString + "T00:00:00" + timezone); + periodElement.addProperty("duration", entry.getValue()/1000); + if (withAnnotations && !(getAnnotation(task, entry.getKey()).isEmpty())) { + StringBuilder builder = new StringBuilder(); + for (String s : getAnnotation(task, entry.getKey())) { + builder.append(s); + builder.append(","); + } + String annotations = builder.toString(); + periodElement.addProperty("info", annotations); + } + periodArray.add(periodElement); } - periodArray.add(periodElement); } - } - responseJSON.addProperty("URL", url); - responseJSON.addProperty("startDate", startPeriodDate.toString() + "T00:00:00" + timezone); - responseJSON.addProperty("endDate", endPeriodDate.toString() + "T00:00:00" + timezone); - responseJSON.add("periods", periodArray); + responseJSON.addProperty("URL", url); + responseJSON.addProperty("startDate", startPeriodDate.toString() + "T00:00:00" + timezone); + responseJSON.addProperty("endDate", endPeriodDate.toString() + "T00:00:00" + timezone); + responseJSON.add("periods", periodArray); - jsonObjectList.add(responseJSON); + jsonObjectList.add(responseJSON); + } } return jsonObjectList; } diff --git a/src/main/java/org/chorem/jtimer/io/GTimerIncrementalSaver.java b/src/main/java/org/chorem/jtimer/io/GTimerIncrementalSaver.java index 7ffbec0..757e583 100644 --- a/src/main/java/org/chorem/jtimer/io/GTimerIncrementalSaver.java +++ b/src/main/java/org/chorem/jtimer/io/GTimerIncrementalSaver.java @@ -43,7 +43,6 @@ import java.text.DateFormat; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeParseException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -67,6 +66,7 @@ import org.apache.commons.logging.LogFactory; import org.chorem.jtimer.JTimer; import org.chorem.jtimer.data.DataEventListener; import org.chorem.jtimer.data.DataViolationException; +import org.chorem.jtimer.entities.SyncInfo; import org.chorem.jtimer.entities.TimerAlert; import org.chorem.jtimer.entities.TimerAlert.Type; import org.chorem.jtimer.entities.TimerProject; @@ -604,51 +604,52 @@ public class GTimerIncrementalSaver extends AbstractSaver implements Saver, try (BufferedReader parseIn = new BufferedReader(new FileReader(syncTaskFile))) { - // first line : "format: 1.2" + //format line String line = parseIn.readLine(); while ((line = parseIn.readLine()) != null) { line = line.trim(); - if (!line.isEmpty()) { - String syncType = line.substring(0, line.indexOf(' ')); - String syncInfo = line.substring(line.indexOf(' ') +1, line.length()); - - - try { - if (syncType.equals("SyncURLList:")) { - String[] urlArray = syncInfo.trim().split(" , "); - List<String> urlList = new ArrayList<>(); - for (String url : urlArray) { - urlList.add(url); - } - task.setSynchronisingURLList(urlList); - - } - else if (syncType.equals("LastSync:")) { - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS"); - LocalDateTime date = LocalDateTime.parse(syncInfo, formatter); - task.setLastSync(date); + if ((!line.isEmpty())) { + String[] urlArray = line.split(" "); + //if there is no lastSyncTime + if (urlArray.length == 2) { + if ("true".equals(urlArray[1])) { + task.addSyncInfo(urlArray[0], LocalDateTime.MIN, true); } else { - if (log.isWarnEnabled()) { - log.warn("Unknown synchronisation type " + syncType); - } - } - }catch (DateTimeParseException e) { - if (log.isErrorEnabled()) { - log.error("Can't parse " + syncInfo - + " as synchronisation date"); + task.addSyncInfo(urlArray[0], LocalDateTime.MIN, false); } } - + //else if there is lastSyncTime + else if (urlArray.length == 3) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS"); + LocalDateTime date = LocalDateTime.parse(urlArray[2], formatter); + if ("true".equals(urlArray[1])) { + task.addSyncInfo(urlArray[0], date, true); + } else { + task.addSyncInfo(urlArray[0], date, false); + } + } } + else { + if (log.isWarnEnabled()) { + log.warn("Unknown synchronization type " + line); + } + } + } + + } + } + else { + if (log.isDebugEnabled()) { + log.debug("Synchronisation information not found for task " + task.getName()); } } - } + /** * Find task alert and load it. * @@ -824,7 +825,7 @@ public class GTimerIncrementalSaver extends AbstractSaver implements Saver, backupDirFile.mkdirs(); } - // + // try (ZipOutputStream outZip = new ZipOutputStream(new FileOutputStream(zipFileName))) { // Create a buffer for reading the files @@ -1138,14 +1139,12 @@ public class GTimerIncrementalSaver extends AbstractSaver implements Saver, * @param task task to save annotation */ protected void saveSynchronisationInfo(TimerTask task) { - - int taskNumber = task.getNumber(); File synchronisationTaskFile = new File(dataSaveDirectory + File.separator + taskNumber + "." + GTIMER_TASK_EXTENSION + "." + GTIMER_SYNC_EXTENSION); - if (task.getSynchronisingURLList() != null) { + if ((task.getSynchronizingURLList() != null) || (!task.getSynchronizingURLList().isEmpty())) { File backupfile = null; try (Writer out = new OutputStreamWriter(new FileOutputStream(synchronisationTaskFile), "ISO-8859-1")) { @@ -1153,17 +1152,27 @@ public class GTimerIncrementalSaver extends AbstractSaver implements Saver, backupfile = makeBackupFile(synchronisationTaskFile); out.write("Format: " + GTIMER_FILE_VERSION + "\n"); - //save URL - if(task.getSynchronisingURLList() !=null && !(task.getSynchronisingURLList().isEmpty())) { - out.write("SyncURLList: " + task.getSynchronizingURLAsString() + "\n"); - } - //save last sync (if there is one) - if (task.getLastSync() !=null) { - String saveLastSync = task.getLastSync().toString(); - out.write("LastSync: " + saveLastSync + "\n"); - + //start Sync Save + out.write("SyncInfo:\n"); + //loop across SyncInfo + for (SyncInfo sync : task.getSynchronizingInfoList()) { + //write url + out.write(sync.getSyncURL() + " "); + //write isActive + if (sync.getActiveSync()) { + out.write("true "); + } + else { + out.write("false "); + } + //write lastsync + if (sync.getLastSync().isAfter(LocalDateTime.MIN)) { + out.write(sync.getLastSync().toString() + "\n"); + } + else { + out.write("\n"); + } } - deleteBackupFile(backupfile); } catch (IOException e) { if (log.isErrorEnabled()) { @@ -1296,6 +1305,11 @@ public class GTimerIncrementalSaver extends AbstractSaver implements Saver, } @Override + public void changeSyncInfo(TimerTask task, String syncURL) { + saveSynchronisationInfo(task); + } + + @Override public void deleteProject(TimerProject project) { deleteTaskOrProject(project, GTIMER_PROJECT_EXTENSION); } @@ -1392,6 +1406,7 @@ public class GTimerIncrementalSaver extends AbstractSaver implements Saver, // Potentiellement aussi lors d'un move. saveTaskAnnotation(task); saveAlerts(task); + saveSynchronisationInfo(task); // fix a bug with the gtimer subtask // save format du to composed task name @@ -1519,11 +1534,5 @@ public class GTimerIncrementalSaver extends AbstractSaver implements Saver, } } - /* - * {@inheritDoc} - */ - @Override - public void modifyTaskURL(TimerTask task, List<String> newURL) { - saveSynchronisationInfo(task); - } -} + +} \ No newline at end of file diff --git a/src/main/java/org/chorem/jtimer/io/TimerTaskSynchronizer.java b/src/main/java/org/chorem/jtimer/io/TimerTaskSynchronizer.java index 03b25c5..b4fb1a1 100644 --- a/src/main/java/org/chorem/jtimer/io/TimerTaskSynchronizer.java +++ b/src/main/java/org/chorem/jtimer/io/TimerTaskSynchronizer.java @@ -116,7 +116,7 @@ public class TimerTaskSynchronizer implements DataEventListener { //sync successful -> change the last sync time if (successfulSync) { log.debug("Sync successful on " + object.get("URL").getAsString()); - task.setLastSync(LocalDateTime.now()); + task.setLastSync(LocalDateTime.now(), object.get("URL").getAsString()); } //-> do not change last sync time else { @@ -158,6 +158,7 @@ public class TimerTaskSynchronizer implements DataEventListener { } else { log.info("Error"); + } } catch (MalformedURLException e) { log.error("URL malformed"); @@ -194,7 +195,7 @@ public class TimerTaskSynchronizer implements DataEventListener { //when a task is modified, add it to the to sync list (if it isn't already there) if(!tasksToSync.contains(task) && (!tasksToSync.isEmpty())) { //add it only if the URL is not empty - if ((task.getSynchronisingURLList() != null) && !(task.getSynchronisingURLList().isEmpty())){ + if ((!task.getSynchronizingInfoList().isEmpty()) && (!task.getSynchronizingURLList().isEmpty())) { tasksToSync.add(task); } } @@ -260,7 +261,7 @@ public class TimerTaskSynchronizer implements DataEventListener { public void stopTask(TimerTask task) { if (!tasksToSync.contains(task)) { //add it only if the URL is not empty - if ((task.getSynchronisingURLList() != null) && !(task.getSynchronisingURLList().isEmpty())) { + if ((task.getSynchronizingURLList() != null) && !(task.getSynchronizingURLList().isEmpty())) { tasksToSync.add(task); } } @@ -271,23 +272,13 @@ public class TimerTaskSynchronizer implements DataEventListener { } - /** - * Tasks are added to synchronization list when the URL is updated - * - * @param task modified task - */ @Override - public void modifyTaskURL(TimerTask task, List<String> newURL) { + public void changeSyncInfo(TimerTask task, String syncURL) { if (!tasksToSync.contains(task)) { //add it only if the URL is not empty - if ((task.getSynchronisingURLList() != null) && !(task.getSynchronisingURLList().isEmpty())){ - tasksToSync.add(task); + if ((task.getSynchronizingURLList() != null) && !(task.getSynchronizingURLList().isEmpty())) { + tasksToSync.add(task); } } } - - @Override - public void modifyTaskSyncDate(TimerTask task, LocalDateTime newDate) { - - } } diff --git a/src/main/java/org/chorem/jtimer/ui/StatusBar.java b/src/main/java/org/chorem/jtimer/ui/StatusBar.java index cd069c0..11b7fde 100644 --- a/src/main/java/org/chorem/jtimer/ui/StatusBar.java +++ b/src/main/java/org/chorem/jtimer/ui/StatusBar.java @@ -137,6 +137,9 @@ public class StatusBar extends JPanel implements DataEventListener { modifyTask(null); } + /* + * @see org.chorem.jtimer.data.event.DataEventListener#deleteProject(org.chorem.jtimer.entities.TimerProject) + */ @Override public void deleteProject(TimerProject project) { updateTodayTime(); diff --git a/src/main/java/org/chorem/jtimer/ui/TimerTaskEditor.java b/src/main/java/org/chorem/jtimer/ui/TimerTaskEditor.java index 1b86b13..a9635fa 100644 --- a/src/main/java/org/chorem/jtimer/ui/TimerTaskEditor.java +++ b/src/main/java/org/chorem/jtimer/ui/TimerTaskEditor.java @@ -90,12 +90,6 @@ public class TimerTaskEditor extends DialogView { /** annotation textarea */ protected JTextArea annotationText; - /** task sync URL */ - protected JTextField synchronizeURL; - - /** change listener on sync URl */ - protected DocumentListener urlChangeListener; - /** change listener on spinners */ protected ChangeListener spinnerListener; @@ -119,9 +113,6 @@ public class TimerTaskEditor extends DialogView { /** did the modified annotation ? */ protected boolean isAnnotationChanged; - /** was the url modified ?*/ - protected boolean isURLChanged; - /** * days modified: You can modify any number of days before you apply changes, * this set keep track of days modified (for time, annotations or title). @@ -230,7 +221,6 @@ public class TimerTaskEditor extends DialogView { // text change listener on annotationTextArea, titleTextField and SyncURLTextField titleChangeListener = new TextChangeListener(); annotationChangeListener = new TextChangeListener(); - urlChangeListener = new TextChangeListener(); panel.add(createTitlePanel(), BorderLayout.NORTH); panel.add(createJXMonthView(), BorderLayout.CENTER); @@ -251,34 +241,18 @@ public class TimerTaskEditor extends DialogView { // task title and listener titleText = new JTextField("", 20); // prevent too long task names titleText.getDocument().addDocumentListener(titleChangeListener); - // task syncronizeURL and listener - synchronizeURL = new JTextField("",20); - synchronizeURL.getDocument().addDocumentListener(urlChangeListener); //labels for title and url JLabel titleLabel = new JLabel(getResourceMap().getString("label.title.text")); - JLabel URLLabel = new JLabel(getResourceMap().getString("label.syncURL.text")); panel.add(titleLabel); panel.add(titleText); - panel.add(synchronizeURL); - panel.add(URLLabel); - - JLabel largerLabel = titleLabel.getText().length() < URLLabel.getText().length() ? URLLabel : titleLabel; layout.putConstraint(SpringLayout.NORTH, titleLabel, 2, SpringLayout.NORTH, panel); layout.putConstraint(SpringLayout.WEST, titleLabel, 2, SpringLayout.WEST, panel); layout.putConstraint(SpringLayout.NORTH, titleText, 2, SpringLayout.NORTH, panel); - layout.putConstraint(SpringLayout.WEST, titleText, 2, SpringLayout.EAST, largerLabel); + layout.putConstraint(SpringLayout.WEST, titleText, 2, SpringLayout.EAST, panel); - layout.putConstraint(SpringLayout.NORTH, URLLabel, 2, SpringLayout.SOUTH, titleText); - layout.putConstraint(SpringLayout.WEST, URLLabel, 2, SpringLayout.WEST, largerLabel); - - layout.putConstraint(SpringLayout.NORTH, synchronizeURL, 2, SpringLayout.SOUTH, titleText); - layout.putConstraint(SpringLayout.WEST, synchronizeURL, 2, SpringLayout.EAST, largerLabel); - - layout.putConstraint(SpringLayout.SOUTH, panel, 2, SpringLayout.SOUTH, synchronizeURL); - layout.putConstraint(SpringLayout.EAST, panel, 2, SpringLayout.EAST, synchronizeURL); return panel; @@ -571,12 +545,6 @@ public class TimerTaskEditor extends DialogView { titleText.setText(cloneTask.getName()); titleText.setCaretPosition(0); titleText.getDocument().addDocumentListener(titleChangeListener); - - //URL - synchronizeURL.getDocument().removeDocumentListener(urlChangeListener); - synchronizeURL.setText(cloneTask.getSynchronizingURLAsString()); - synchronizeURL.getDocument().addDocumentListener(urlChangeListener); - } /** @@ -589,10 +557,8 @@ public class TimerTaskEditor extends DialogView { isTitleChanged = true; } else if (issuer == annotationChangeListener) { isAnnotationChanged = true; - } else if (issuer == urlChangeListener) { - isURLChanged = true; + updateTask(); } - updateTask(); } /** @@ -629,16 +595,6 @@ public class TimerTaskEditor extends DialogView { cloneTask.setName(titleText.getText()); } - // sync URL - if (isURLChanged) { - String[] urlArray = synchronizeURL.getText().trim().split(" , "); - List<String> urlList = new ArrayList<>(); - for (String url : urlArray) { - urlList.add(url); - } - cloneTask.setSynchronisingURLList(urlList); - } - dateChanged.add(getSelectedDay().getTime()); setDataChanged(true); @@ -664,11 +620,6 @@ public class TimerTaskEditor extends DialogView { if (isTitleChanged) { dataManager.editTask(task, cloneTask.getName()); } - // url - if (isURLChanged) { - dataManager.editTaskURL(task, cloneTask.getSynchronisingURLList()); - } - for (Date date : dateChanged) { if (log.isDebugEnabled()) { log.debug("Applying changes on: " + date); diff --git a/src/main/java/org/chorem/jtimer/ui/report/TimerTaskUpdaterView.java b/src/main/java/org/chorem/jtimer/ui/report/TimerTaskUpdaterView.java index 2bdd40a..91bd5fe 100644 --- a/src/main/java/org/chorem/jtimer/ui/report/TimerTaskUpdaterView.java +++ b/src/main/java/org/chorem/jtimer/ui/report/TimerTaskUpdaterView.java @@ -42,8 +42,6 @@ import javax.swing.event.DocumentListener; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.*; @@ -80,9 +78,6 @@ public class TimerTaskUpdaterView extends FrameView implements DocumentListener, /** task in json format (1/synchronizing url) */ protected List<JsonObject> updateJson; - /** list of URLs to sync to */ - protected List<String> urlSyncList; - /** ComboBox of URLs */ protected JComboBox<String> urlComboBox; @@ -111,7 +106,6 @@ public class TimerTaskUpdaterView extends FrameView implements DocumentListener, this.core = core; this.task = task; timezone = "+01:00"; - urlSyncList = task.getSynchronisingURLList(); setComponent(getMainComponent()); @@ -197,16 +191,16 @@ public class TimerTaskUpdaterView extends FrameView implements DocumentListener, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(1, 1, 1, 1), 0, 0)); //display the lastSyncDate - JLabel lastSyncDate = new JLabel(getResourceMap().getString("lastUpdateLabel")); +// JLabel lastSyncDate = new JLabel(getResourceMap().getString("lastUpdateLabel")); //if there has been an update before, display its date - LocalDateTime lastSyncTime = task.getLastSync(); - if (lastSyncTime != null) { - JLabel lastUpdate = new JLabel(lastSyncTime.toString()); - panelOption.add(lastSyncDate, new GridBagConstraints(1, 2, 1, 1, 0, 0, - GridBagConstraints.WEST, GridBagConstraints.VERTICAL, new Insets(2, 1, 1, 1), 0, 0)); - panelOption.add(lastUpdate, new GridBagConstraints(2, 2, 1, 1, 0, 0, - GridBagConstraints.WEST, GridBagConstraints.VERTICAL, new Insets(1, 2, 1, 1), 0, 0)); - } +// LocalDateTime lastSyncTime = task.getLastSync(); +// if (lastSyncTime != null) { +// JLabel lastUpdate = new JLabel(lastSyncTime.toString()); +// panelOption.add(lastSyncDate, new GridBagConstraints(1, 2, 1, 1, 0, 0, +// GridBagConstraints.WEST, GridBagConstraints.VERTICAL, new Insets(2, 1, 1, 1), 0, 0)); +// panelOption.add(lastUpdate, new GridBagConstraints(2, 2, 1, 1, 0, 0, +// GridBagConstraints.WEST, GridBagConstraints.VERTICAL, new Insets(1, 2, 1, 1), 0, 0)); +// } //display the various urls to sync to in a combobox to choose which one will be updated JLabel urlcomboBoxLabel = new JLabel(getResourceMap().getString("urlComboLabel")); @@ -215,7 +209,7 @@ public class TimerTaskUpdaterView extends FrameView implements DocumentListener, urlComboBox.setEditable(true); urlComboBox.addActionListener(this); //add the urls to the combobox - for (String url : urlSyncList) { + for (String url : task.getSynchronizingURLList()) { urlComboBox.addItem(url); } panelOption.add(urlcomboBoxLabel, new GridBagConstraints(1,3,1,1,0,0, @@ -483,7 +477,7 @@ public class TimerTaskUpdaterView extends FrameView implements DocumentListener, log.error("Problem with the connection"); } if (hasUpdated) { - core.getData().editTaskLastSync(task, LocalDateTime.now()); + task.setLastSync(LocalDateTime.now(),syncURL); } else { String message = getResourceMap().getString("action.updateError"); String title = getResourceMap().getString("action.updateErrorTitle"); @@ -534,13 +528,13 @@ public class TimerTaskUpdaterView extends FrameView implements DocumentListener, */ public void itemAdded(){ String urlToAdd = (String) urlComboBox.getSelectedItem(); - if ((!urlToAdd.isEmpty()) && (!urlSyncList.contains(urlToAdd))) { + if ((!urlToAdd.isEmpty()) && (!task.getSynchronizingURLList().contains(urlToAdd))) { urlComboBox.addItem(urlToAdd); - task.addURLToSyncList(urlToAdd); + task.addSyncInfo(urlToAdd, LocalDateTime.MIN, true); + core.getData().changeSyncInfo(task, urlToAdd); } } - @Override public void actionPerformed(ActionEvent actionEvent) { itemAdded(); 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 3a167ec..d365546 100644 --- a/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksModel.java +++ b/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksModel.java @@ -373,6 +373,9 @@ public class ProjectsAndTasksModel extends AbstractTreeTableModel implements }); } + /* + * @see org.chorem.jtimer.data.event.DataEventListener#deleteProject(org.chorem.jtimer.entities.TimerProject) + */ @Override public void deleteProject(TimerProject project) { notifyTaskChanged(project, OPERATION_DELETE); 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 905fa9d..e8e41dd 100644 --- a/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksRunningCellRenderer.java +++ b/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksRunningCellRenderer.java @@ -156,6 +156,7 @@ public class ProjectsAndTasksRunningCellRenderer extends ProjectsAndTasksCellRen } } + @Override public void startTask(TimerTask task) { -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.