diff --git a/java_console/ui/src/main/java/com/rusefi/maintenance/CalibrationsBackuper.java b/java_console/ui/src/main/java/com/rusefi/maintenance/CalibrationsBackuper.java index 59d5b80ca6..018e857ada 100644 --- a/java_console/ui/src/main/java/com/rusefi/maintenance/CalibrationsBackuper.java +++ b/java_console/ui/src/main/java/com/rusefi/maintenance/CalibrationsBackuper.java @@ -9,17 +9,32 @@ import com.rusefi.binaryprotocol.BinaryProtocol; import com.rusefi.io.UpdateOperationCallbacks; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.Optional; import static com.devexperts.logging.Logging.getLogging; import static com.rusefi.binaryprotocol.BinaryProtocol.iniFileProvider; +import static java.nio.file.StandardCopyOption.REPLACE_EXISTING; public class CalibrationsBackuper { private static final Logging log = getLogging(CalibrationsBackuper.class); + private static final String PREVIOUS_CALIBRATIONS_INI = "prev_calibrations.ini"; private static final String PREVIOUS_CALIBRATIONS_BINARY = "prev_calibrations.zip"; private static final String PREVIOUS_CALIBRATIONS_XML = "prev_calibrations.msq"; - private static Optional readMeta( + private static class CalibrationsMeta { + private final String iniFilePath; + private final ConfigurationImageMetaVersion0_0 meta; + + CalibrationsMeta(final String iniFilePath, final ConfigurationImageMetaVersion0_0 meta) { + this.iniFilePath = iniFilePath; + this.meta = meta; + } + } + + private static Optional readMeta( final BinaryProtocol binaryProtocol, final UpdateOperationCallbacks callbacks ) { @@ -29,7 +44,10 @@ public class CalibrationsBackuper { final IniFileModel iniFile = iniFileProvider.provide(signature); final int pageSize = iniFile.getMetaInfo().getTotalSize(); callbacks.logLine(String.format("Page size is %d", pageSize)); - return Optional.of(new ConfigurationImageMetaVersion0_0(pageSize, signature)); + return Optional.of(new CalibrationsMeta( + iniFile.getIniFilePath(), + new ConfigurationImageMetaVersion0_0(pageSize, signature) + )); } catch (final IOException e) { log.error("Failed to read meta:", e); callbacks.logLine("Failed to read meta"); @@ -46,17 +64,28 @@ public class CalibrationsBackuper { callbacks, (binaryProtocol) -> { try { - final Optional meta = readMeta(binaryProtocol, callbacks); + final Optional meta = readMeta(binaryProtocol, callbacks); if (meta.isPresent()) { + final CalibrationsMeta receivedMeta = meta.get(); callbacks.logLine("Reading current calibrations..."); - final ConfigurationImageWithMeta image = binaryProtocol.readFullImageFromController(meta.get()); + final ConfigurationImageWithMeta image = binaryProtocol.readFullImageFromController( + receivedMeta.meta + ); + final Path iniFilePath = Paths.get(receivedMeta.iniFilePath); + callbacks.logLine(String.format("Backing up current file %s...", iniFilePath)); + Files.copy( + iniFilePath, + Paths.get(PREVIOUS_CALIBRATIONS_INI), + REPLACE_EXISTING + ); + callbacks.logLine(String.format("%s file is backed up", iniFilePath.getFileName())); callbacks.logLine("Save current calibrations to files..."); binaryProtocol.saveConfigurationImageToFiles( image, PREVIOUS_CALIBRATIONS_BINARY, PREVIOUS_CALIBRATIONS_XML ); - callbacks.logLine("Current calibrations are saved to files"); + callbacks.logLine("Current calibrations are backed up to files"); return true; } else { return false;