diff --git a/java_console/shared_ui/src/com/rusefi/tools/online/UploadResult.java b/java_console/shared_ui/src/com/rusefi/tools/online/UploadResult.java index bc05086756..6131d41cdc 100644 --- a/java_console/shared_ui/src/com/rusefi/tools/online/UploadResult.java +++ b/java_console/shared_ui/src/com/rusefi/tools/online/UploadResult.java @@ -21,7 +21,11 @@ public class UploadResult { return isError; } - public JSONArray getMessage() { + public JSONArray getMessageArray() { return message; } + + public String getFirstMessage() { + return message.get(0).toString(); + } } diff --git a/java_tools/ts_plugin/src/com/rusefi/ts_plugin/PluginEntry.java b/java_tools/ts_plugin/src/com/rusefi/ts_plugin/PluginEntry.java index e8e91f3646..3c903f2438 100644 --- a/java_tools/ts_plugin/src/com/rusefi/ts_plugin/PluginEntry.java +++ b/java_tools/ts_plugin/src/com/rusefi/ts_plugin/PluginEntry.java @@ -63,6 +63,7 @@ public class PluginEntry implements TsPluginBody { timer.stop(); timer.setRepeats(false); this.controllerAccessSupplier = controllerAccessSupplier; + UploadQueue.start(); listener = parameterName -> { // System.out.println("Parameter value changed " + parameterName); timer.restart(); diff --git a/java_tools/ts_plugin/src/com/rusefi/ts_plugin/UploadQueue.java b/java_tools/ts_plugin/src/com/rusefi/ts_plugin/UploadQueue.java index 6d5c1c293e..ac7213b106 100644 --- a/java_tools/ts_plugin/src/com/rusefi/ts_plugin/UploadQueue.java +++ b/java_tools/ts_plugin/src/com/rusefi/ts_plugin/UploadQueue.java @@ -3,12 +3,14 @@ package com.rusefi.ts_plugin; import com.efiAnalytics.plugin.ecu.ControllerAccess; import com.rusefi.shared.FileUtil; import com.rusefi.tools.online.Online; +import com.rusefi.tools.online.UploadResult; import com.rusefi.tune.xml.Msq; import com.rusefi.ui.AuthTokenPanel; import javax.xml.bind.JAXBException; import java.io.File; import java.io.IOException; +import java.util.Objects; import java.util.concurrent.LinkedBlockingDeque; public class UploadQueue { @@ -17,20 +19,36 @@ public class UploadQueue { private static boolean isStarted; - private synchronized static void start() { + public synchronized static void start() { if (isStarted) return; isStarted = true; + readOutbox(); new Thread(() -> { try { - postingLoop(); + uploadLoop(); } catch (InterruptedException e) { throw new IllegalStateException(e); } }, "Positing Thread").start(); } - private static void postingLoop() throws InterruptedException { + private static void readOutbox() { + for (String file : Objects.requireNonNull(new File(OUTBOX_FOLDER).list((dir, name) -> name.endsWith(".msq")))) { + if (queue.size() > 90) + return; + System.out.println(UploadQueue.class.getSimpleName() + " readOutbox " + file); + try { + Msq msg = Msq.readTune(OUTBOX_FOLDER + File.separator + file); + queue.put(msg); + } catch (Exception e) { + e.printStackTrace(); + } + } + System.out.println(UploadQueue.class.getSimpleName() + " readOutbox got " + queue.size()); + } + + private static void uploadLoop() throws InterruptedException { while (true) { Msq msq = queue.take(); @@ -38,13 +56,32 @@ public class UploadQueue { String fileName = OUTBOX_FOLDER + File.separator + System.currentTimeMillis() + ".msq"; try { msq.writeXmlFile(fileName); - Online.upload(new File(fileName), AuthTokenPanel.getAuthToken()); + UploadResult result = Online.upload(new File(fileName), AuthTokenPanel.getAuthToken()); + System.out.println("isError " + result.isError()); + System.out.println("first " + result.getFirstMessage()); + if (result.isError() && result.getFirstMessage().contains("This file already exists")) { + System.out.println(UploadQueue.class.getSimpleName() + " No need to re-try this one"); + delete(fileName); + // do not retry this error + continue; + } + if (result.isError()) { + System.out.println(UploadQueue.class.getSimpleName() + " Re-queueing " + msq); + queue.put(msq); + continue; + } + delete(fileName); } catch (JAXBException | IOException e) { e.printStackTrace(); } } } + private static void delete(String fileName) { + System.out.println(UploadQueue.class.getSimpleName() + " Deleting " + fileName); + new File(fileName).delete(); + } + public static void enqueue(ControllerAccess controllerAccess, String configurationName) { start(); if (queue.size() > 100) { diff --git a/java_tools/ts_plugin/src/com/rusefi/ts_plugin/UploadView.java b/java_tools/ts_plugin/src/com/rusefi/ts_plugin/UploadView.java index 6886c94257..4b2b812334 100644 --- a/java_tools/ts_plugin/src/com/rusefi/ts_plugin/UploadView.java +++ b/java_tools/ts_plugin/src/com/rusefi/ts_plugin/UploadView.java @@ -29,6 +29,7 @@ public class UploadView { @Override public void actionPerformed(ActionEvent e) { PersistentConfiguration.getConfig().getRoot().setProperty(AUTO_UPLOAD, autoUpload.isSelected()); + PersistentConfiguration.getConfig().save(); } }); uploadState.setVisible(false); @@ -39,7 +40,7 @@ public class UploadView { } public void setResult(UploadResult result) { - uploadState.setText(result.getMessage().get(0).toString()); + uploadState.setText(result.getFirstMessage()); uploadState.setVisible(true); }