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 d2e14551e26cf9459cdb38d46cb748041253a915 Author: servantie <servantie.c@gmail.com> Date: Thu Jul 7 14:23:29 2016 +0200 changed LocalDateTime type for last sync to Date, used YAML to save sync info adapted test file to comply with yaml output --- .../java/org/chorem/jtimer/entities/SyncInfo.java | 44 +++++- .../java/org/chorem/jtimer/entities/TimerTask.java | 13 +- .../chorem/jtimer/io/GTimerIncrementalSaver.java | 151 ++------------------- .../chorem/jtimer/io/TimerTaskSynchronizer.java | 4 +- .../jtimer/ui/report/TimerTaskSyncInfoEditor.java | 60 ++++---- src/test/resources/testdata/41.task.sync | 9 +- 6 files changed, 95 insertions(+), 186 deletions(-) diff --git a/src/main/java/org/chorem/jtimer/entities/SyncInfo.java b/src/main/java/org/chorem/jtimer/entities/SyncInfo.java index a183ea7..4b7720c 100644 --- a/src/main/java/org/chorem/jtimer/entities/SyncInfo.java +++ b/src/main/java/org/chorem/jtimer/entities/SyncInfo.java @@ -2,7 +2,7 @@ package org.chorem.jtimer.entities; -import java.time.LocalDateTime; +import java.util.Date; /** * Class to structure synchronization info @@ -14,7 +14,7 @@ public class SyncInfo { protected String syncURL; /** the last time the synchronization happened successfully */ - protected LocalDateTime lastSync; + protected Date lastSync; /** true if the synchronization is active */ protected boolean isActiveSync; @@ -23,13 +23,19 @@ public class SyncInfo { protected boolean isWithAnnotations; /** + * Empty constructor (necessary for yaml) + */ + public SyncInfo(){ + } + + /** * 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 * @param isWithAnnotations if true, will add annotations */ - public SyncInfo(String syncURL, LocalDateTime lastSync, boolean isActiveSync, boolean isWithAnnotations) { + public SyncInfo(String syncURL, Date lastSync, boolean isActiveSync, boolean isWithAnnotations) { this.syncURL = syncURL; this.lastSync = lastSync; this.isActiveSync = isActiveSync; @@ -45,14 +51,14 @@ public class SyncInfo { this.syncURL = syncURL; this.isActiveSync = true; this.isWithAnnotations = false; - this.lastSync = LocalDateTime.MIN; + this.lastSync = new Date(0); } /** * Returns the time of the last sync * @return LocalDateTime */ - public LocalDateTime getLastSync() { + public Date getLastSync() { return lastSync; } @@ -103,9 +109,9 @@ public class SyncInfo { /** * Set Sync time - * @param syncTime LocalDateTime + * @param syncTime Date */ - public void setLastSync(LocalDateTime syncTime) { + public void setLastSync(Date syncTime) { lastSync = syncTime; } @@ -116,5 +122,29 @@ public class SyncInfo { public String toString() { return syncURL; } + + /** + * Override the equals + */ + @Override + public boolean equals(Object o) { + if (o instanceof SyncInfo) { + SyncInfo objInfo = (SyncInfo) o; + if (objInfo.getSyncURL() != null) { + if (objInfo.getSyncURL().equals(this.getSyncURL())) { + return true; + } + } + } + return false; + } + /** + * Overriding hashcode + */ + @Override + public int hashCode() { + int hash = syncURL.hashCode(); + return hash; + } } diff --git a/src/main/java/org/chorem/jtimer/entities/TimerTask.java b/src/main/java/org/chorem/jtimer/entities/TimerTask.java index f50d411..79a90c0 100644 --- a/src/main/java/org/chorem/jtimer/entities/TimerTask.java +++ b/src/main/java/org/chorem/jtimer/entities/TimerTask.java @@ -23,7 +23,6 @@ package org.chorem.jtimer.entities; import java.io.Serializable; -import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -230,9 +229,9 @@ public class TimerTask implements Cloneable, * @param urlString the url to get the last sync from * @return the date of the sync */ - public LocalDateTime getLastSync(String urlString) { + public Date getLastSync(String urlString) { //to avoid null, a default time to return if errors - LocalDateTime resultTime = LocalDateTime.MIN; + Date resultTime = new Date(0); if (!synchronisingInfoList.isEmpty()) { for(SyncInfo sync : synchronisingInfoList) { if (urlString.equals(sync.getSyncURL())) { @@ -249,7 +248,7 @@ public class TimerTask implements Cloneable, * @param syncDate : date of the sync * @param syncURL : the url that has a change of syncdate */ - public void setLastSync(LocalDateTime syncDate, String syncURL) { + public void setLastSync(Date syncDate, String syncURL) { boolean urlinList = false; if(!synchronisingInfoList.isEmpty()) { for (SyncInfo sync : synchronisingInfoList) { @@ -302,7 +301,7 @@ public class TimerTask implements Cloneable, * @param isActive a boolean for activity (true to sync auto) * @param isWithAnnotations a boolean for annotations (false default) */ - public void addSyncInfo(String url, LocalDateTime time, boolean isActive, boolean isWithAnnotations) { + public void addSyncInfo(String url, Date time, boolean isActive, boolean isWithAnnotations) { if (!url.isEmpty() && !getSynchronizingURLList().contains(url)) { synchronisingInfoList.add(new SyncInfo(url, time, isActive, isWithAnnotations)); } @@ -313,9 +312,7 @@ public class TimerTask implements Cloneable, * (default isActive = true and isWithAnnotations false) * @param url a String */ - public void addSyncInfo(String url) { - addSyncInfo(url, LocalDateTime.MIN, true, false); - } + public void addSyncInfo(String url) { addSyncInfo(url, new Date(0), true, false); } /** * Adds a SyncInfo to the task diff --git a/src/main/java/org/chorem/jtimer/io/GTimerIncrementalSaver.java b/src/main/java/org/chorem/jtimer/io/GTimerIncrementalSaver.java index 3e1fa4f..1db7f70 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; @@ -71,6 +70,7 @@ import org.chorem.jtimer.entities.TimerAlert; import org.chorem.jtimer.entities.TimerAlert.Type; import org.chorem.jtimer.entities.TimerProject; import org.chorem.jtimer.entities.TimerTask; +import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.Yaml; /** @@ -602,71 +602,14 @@ public class GTimerIncrementalSaver extends AbstractSaver implements Saver, if (log.isDebugEnabled()) { log.debug("Synchronization information found for task " + task.getName()); } - try (BufferedReader parseIn = new BufferedReader(new FileReader(syncTaskFile))) { - //format line - String line = parseIn.readLine(); - while ((line = parseIn.readLine()) != null) { - line = line.trim(); - if (!line.isEmpty()) { - String[] urlArray = line.split(" "); - //if there is no lastSyncTime - if (urlArray.length == 3) { - if ("true".equals(urlArray[1])) { - if ("true".equals(urlArray[2])) { - task.addSyncInfo(urlArray[0], LocalDateTime.MIN, true, true); - } - else { - task.addSyncInfo(urlArray[0], LocalDateTime.MIN, true, false); - } - } - else { - if ("true".equals(urlArray[2])) { - task.addSyncInfo(urlArray[0], LocalDateTime.MIN, false, true); - } - else { - task.addSyncInfo(urlArray[0], LocalDateTime.MIN, false, false); - } - } - } - //else if there is lastSyncTime - else if (urlArray.length == 4) { - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS"); - LocalDateTime date = null; - try { - date = LocalDateTime.parse(urlArray[3], formatter); - } catch (DateTimeParseException e) { - if (log.isErrorEnabled()) { - log.error("Error parsing SyncTime for " + urlArray[0]); - } - } - if ("true".equals(urlArray[1])) { - if ("true".equals(urlArray[2])) { - task.addSyncInfo(urlArray[0], date, true, true); - } - else { - task.addSyncInfo(urlArray[0], date, true, false); - } - } - else { - if ("true".equals(urlArray[2])) { - task.addSyncInfo(urlArray[0], date, false, true); - } - else { - task.addSyncInfo(urlArray[0], date, false, false); - } - } - } - } - else { - if (log.isWarnEnabled()) { - log.warn("Unknown synchronization type " + line); - } + Yaml yaml = new Yaml(); + for (Object obj : yaml.loadAll(parseIn)) { + if (obj instanceof SyncInfo) { + task.addSyncInfo((SyncInfo) obj); } - } - } } else { @@ -1174,22 +1117,13 @@ public class GTimerIncrementalSaver extends AbstractSaver implements Saver, // first make backup backupfile = makeBackupFile(synchronizationTaskFile); - out.write("Format: " + GTIMER_FILE_VERSION + "\n"); - //use Yaml to write it - Yaml yaml = new Yaml(); - for (SyncInfo sync : task.getSynchronizingInfoList()) { - Map<String, Object> dataToSave = new HashMap<>(); - dataToSave.put("url", sync.getSyncURL()); - dataToSave.put("active", sync.getIsActiveSync()); - dataToSave.put("annotations", sync.getIsWithAnnotations()); - if (sync.getLastSync()!= null && sync.getLastSync()!=LocalDateTime.MIN) { - dataToSave.put("lastSyncTime", sync.getLastSync()); - } - yaml.dump(dataToSave, out); - } + //use Yaml to write it with pretty flow to make it easier to read + DumperOptions dumper = new DumperOptions(); + dumper.setPrettyFlow(true); + Yaml yaml = new Yaml(dumper); + yaml.dumpAll(task.getSynchronizingInfoList().iterator(), out); out.close(); - deleteBackupFile(backupfile); } catch (IOException e) { @@ -1205,71 +1139,6 @@ public class GTimerIncrementalSaver extends AbstractSaver implements Saver, } } -// /** -// * Save synchronization info for a task. -// * -// * @param task task to save annotation -// */ -// protected void saveSynchronizationInfo(TimerTask task) { -// int taskNumber = task.getNumber(); -// -// File synchronizationTaskFile = new File(dataSaveDirectory + File.separator -// + taskNumber + "." + GTIMER_TASK_EXTENSION + "." + GTIMER_SYNC_EXTENSION); -// -// if ((task.getSynchronizingURLList() != null) || (!task.getSynchronizingURLList().isEmpty())) { -// File backupfile = null; -// try (Writer out = new OutputStreamWriter(new FileOutputStream(synchronizationTaskFile), "ISO-8859-1")) { -// -// // first make backup -// backupfile = makeBackupFile(synchronizationTaskFile); -// out.write("Format: " + GTIMER_FILE_VERSION + "\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.getIsActiveSync()) { -// out.write("true "); -// } -// else { -// out.write("false "); -// } -// //write isWithAnnotations -// if(sync.getIsWithAnnotations()) { -// out.write("true "); -// } -// else { -// out.write("false "); -// } -// //write lastsync (HH:MM:SS) -// if (sync.getLastSync() != null && sync.getLastSync().isAfter(LocalDateTime.MIN)) { -// //remove the milliseconds -// String syncString = sync.getLastSync().toString(); -// out.write(syncString + "\n"); -// } -// else { -// out.write("\n"); -// } -// } -// deleteBackupFile(backupfile); -// } catch (IOException e) { -// if (log.isErrorEnabled()) { -// log.debug("Can't save task synchronization information", e); -// } -// -// // can be null if backup throws the exception -// if (backupfile != null) { -// restoreBackupFile(backupfile); -// } -// } -// } else { -// synchronizationTaskFile.delete(); -// } -// } - /** * Save task alerts. * diff --git a/src/main/java/org/chorem/jtimer/io/TimerTaskSynchronizer.java b/src/main/java/org/chorem/jtimer/io/TimerTaskSynchronizer.java index ca42cd5..a06519a 100644 --- a/src/main/java/org/chorem/jtimer/io/TimerTaskSynchronizer.java +++ b/src/main/java/org/chorem/jtimer/io/TimerTaskSynchronizer.java @@ -2,6 +2,7 @@ package org.chorem.jtimer.io; import com.google.gson.JsonObject; import java.util.ArrayList; +import java.util.Calendar; import java.util.Collection; import java.util.Collections; import java.util.Date; @@ -140,7 +141,8 @@ public class TimerTaskSynchronizer implements DataEventListener { log.debug("Sync successful on " + syncURL); log.debug(LocalDateTime.now()); } - task.setLastSync(LocalDateTime.now(), syncURL); + Calendar cal = Calendar.getInstance(); + task.setLastSync(cal.getTime(), syncURL); } } } diff --git a/src/main/java/org/chorem/jtimer/ui/report/TimerTaskSyncInfoEditor.java b/src/main/java/org/chorem/jtimer/ui/report/TimerTaskSyncInfoEditor.java index 700dee8..9515df8 100644 --- a/src/main/java/org/chorem/jtimer/ui/report/TimerTaskSyncInfoEditor.java +++ b/src/main/java/org/chorem/jtimer/ui/report/TimerTaskSyncInfoEditor.java @@ -29,8 +29,11 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; -import java.time.LocalDateTime; +import java.text.DateFormat; +import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; import java.util.List; import javax.swing.Box; import javax.swing.BoxLayout; @@ -165,9 +168,9 @@ public class TimerTaskSyncInfoEditor extends FrameView implements ActionListener SyncInfo selectedInfo = (SyncInfo) urlComboBox.getSelectedItem(); if (task.getSynchronizingInfoList().contains(selectedInfo)){ SyncInfo syncInfo = task.getSynchronizingInfo(selectedInfo.getSyncURL()); - LocalDateTime lastSyncTime = syncInfo.getLastSync(); + Date lastSyncTime = syncInfo.getLastSync(); //if there has been an update before, display its date - if ((lastSyncTime != null) && lastSyncTime.isAfter(LocalDateTime.MIN)) { + if ((lastSyncTime != null) && lastSyncTime.after(new Date(0))) { lastUpdate.setText(lastSyncTime.toString()); //logging change of lastSync if (log.isDebugEnabled()) { @@ -303,13 +306,16 @@ public class TimerTaskSyncInfoEditor extends FrameView implements ActionListener if (itemEvent.getStateChange()== ItemEvent.SELECTED) { if (urlComboBox.getSelectedItem() != null) { SyncInfo syncInfo; + String urlToDisplay; if (urlComboBox.getSelectedItem() instanceof String) { - syncInfo = new SyncInfo((String)urlComboBox.getSelectedItem()); + urlToDisplay = (String)urlComboBox.getSelectedItem(); + syncInfo = new SyncInfo(urlToDisplay); + urlComboBox.setSelectedItem(syncInfo); } else { syncInfo = (SyncInfo) urlComboBox.getSelectedItem(); + urlToDisplay = syncInfo.getSyncURL(); } - String urlToDisplay = syncInfo.getSyncURL(); if (!urlToDisplay.isEmpty()) { if (log.isDebugEnabled()) { log.debug("Selected an object : " + urlToDisplay); @@ -322,13 +328,14 @@ public class TimerTaskSyncInfoEditor extends FrameView implements ActionListener } //display last Sync Time if (lastUpdate != null && syncInfo.getLastSync() != null) { - if (syncInfo.getLastSync().isAfter(LocalDateTime.MIN)) { - lastUpdate.setText(syncInfo.getLastSync().toString()); + if (syncInfo.getLastSync().after(new Date(0))) { + DateFormat df = new SimpleDateFormat("dd/MM/yy HH:mm:ss"); + lastUpdate.setText(df.format(syncInfo.getLastSync())); + lastUpdate.setVisible(true); lastSyncDateLabel.setVisible(true); } else { - lastUpdate.setText(""); - + lastUpdate.setVisible(false); lastSyncDateLabel.setVisible(false); } } @@ -342,16 +349,26 @@ public class TimerTaskSyncInfoEditor extends FrameView implements ActionListener String actionCommand = actionEvent.getActionCommand(); SyncInfo infoToUse; + String urlToUse; if (urlComboBox.getSelectedItem() instanceof String) { - String urlToTest = (String) urlComboBox.getSelectedItem(); - infoToUse = new SyncInfo(urlToTest); + urlToUse = (String) urlComboBox.getSelectedItem(); + infoToUse = new SyncInfo(urlToUse); } else{ infoToUse = (SyncInfo) urlComboBox.getSelectedItem(); } - - if ("comboBox".equals(actionCommand)) { - if (!task.getSynchronizingInfoList().contains(infoToUse)) { + if ("deleteURL".equals(actionCommand)) { + //if the delete button has been clicked, delete the task (if it exists) + if ((infoToUse != null) && (task.getSynchronizingInfoList().contains(infoToUse))) { + task.removeSyncInfo(infoToUse); + urlComboBox.removeItem(infoToUse); + core.getData().deleteSyncInfo(task, infoToUse); + } else { + errorBox(getResourceMap().getString("deleteErrorMessage"), getResourceMap().getString("deleteErrorTitle")); + } + } + else if ("comboBox".equals(actionCommand)) { + if ((infoToUse != null) && !task.getSynchronizingInfoList().contains(infoToUse)) { if (log.isDebugEnabled()) { log.debug("New URL added"); } @@ -362,16 +379,6 @@ public class TimerTaskSyncInfoEditor extends FrameView implements ActionListener } } - else if ("deleteURL".equals(actionCommand)) { - //if the delete button has been clicked, delete the task (if it exists) - if ((infoToUse != null) && (task.getSynchronizingInfoList().contains(infoToUse))) { - task.removeSyncInfo(infoToUse); - urlComboBox.removeItem(infoToUse); - core.getData().deleteSyncInfo(task, infoToUse); - } else { - errorBox(getResourceMap().getString("deleteErrorMessage"), getResourceMap().getString("deleteErrorTitle")); - } - } else if ("testURL".equals(actionCommand)) { //if the test button has been clicked, test the sync on the URL and returns a message to the user //tests only if the info exists @@ -380,13 +387,14 @@ public class TimerTaskSyncInfoEditor extends FrameView implements ActionListener int responseCode = TimerTaskSynchronizer.synchronizeTaskOnURL(testObject); if (responseCode > 199 && responseCode < 300) { infoBox(getResourceMap().getString("testSyncSuccessMessage"), getResourceMap().getString("testSyncSuccessTitle")); - infoToUse.setLastSync(LocalDateTime.now()); + Calendar cal = Calendar.getInstance(); + infoToUse.setLastSync(cal.getTime()); + core.getData().changeSyncInfo(task, infoToUse); } else { errorBox(getResourceMap().getString("testSyncFailureMessage"), getResourceMap().getString("testSyncFailureTitle")); } } - } else { if (log.isDebugEnabled()) { diff --git a/src/test/resources/testdata/41.task.sync b/src/test/resources/testdata/41.task.sync index f4d9859..16f07b8 100644 --- a/src/test/resources/testdata/41.task.sync +++ b/src/test/resources/testdata/41.task.sync @@ -1,3 +1,6 @@ -Format: 1.2 -SyncInfo: -http://localhost:3000 true false +!!org.chorem.jtimer.entities.SyncInfo { + isActiveSync: true, + isWithAnnotations: false, + lastSync: !!timestamp '1970-01-01T00:00:00Z', + syncURL: 'http://localhost:3000' +} \ No newline at end of file -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.