diff --git a/app/cli-acx/src/main/java/io/github/applecommander/acx/base/ReadWriteDiskCommandOptions.java b/app/cli-acx/src/main/java/io/github/applecommander/acx/base/ReadWriteDiskCommandOptions.java index 75ae6a11..a93f3ff6 100644 --- a/app/cli-acx/src/main/java/io/github/applecommander/acx/base/ReadWriteDiskCommandOptions.java +++ b/app/cli-acx/src/main/java/io/github/applecommander/acx/base/ReadWriteDiskCommandOptions.java @@ -19,6 +19,7 @@ */ package io.github.applecommander.acx.base; +import org.applecommander.util.BackupStrategy; import picocli.CommandLine.Option; public abstract class ReadWriteDiskCommandOptions extends ReadOnlyDiskImageCommandOptions { @@ -33,11 +34,7 @@ public abstract class ReadWriteDiskCommandOptions extends ReadOnlyDiskImageComma int returnCode = handleCommand(); if (returnCode == 0) { - BackupStrategy backupStrategy = switch (backupCode) { - case "" -> BackupStrategy.none(); - case "bak" -> BackupStrategy.fileExtension("bak"); - default -> BackupStrategy.directory(backupCode); - }; + BackupStrategy backupStrategy = BackupStrategy.create(backupCode); saveDisk(selectedDisks().getFirst(), backupStrategy); } diff --git a/app/cli-acx/src/main/java/io/github/applecommander/acx/base/ReusableCommandOptions.java b/app/cli-acx/src/main/java/io/github/applecommander/acx/base/ReusableCommandOptions.java index 79d71580..7e0ed8be 100644 --- a/app/cli-acx/src/main/java/io/github/applecommander/acx/base/ReusableCommandOptions.java +++ b/app/cli-acx/src/main/java/io/github/applecommander/acx/base/ReusableCommandOptions.java @@ -20,6 +20,7 @@ package io.github.applecommander.acx.base; import com.webcodepro.applecommander.storage.FormattedDisk; +import org.applecommander.util.BackupStrategy; import picocli.CommandLine.Command; import picocli.CommandLine.Option; diff --git a/app/cli-acx/src/main/java/io/github/applecommander/acx/command/ConvertCommand.java b/app/cli-acx/src/main/java/io/github/applecommander/acx/command/ConvertCommand.java index dc371763..5b55f886 100644 --- a/app/cli-acx/src/main/java/io/github/applecommander/acx/command/ConvertCommand.java +++ b/app/cli-acx/src/main/java/io/github/applecommander/acx/command/ConvertCommand.java @@ -22,7 +22,7 @@ package io.github.applecommander.acx.command; import com.webcodepro.applecommander.storage.DiskFactory; import com.webcodepro.applecommander.storage.Disks; import com.webcodepro.applecommander.storage.FormattedDisk; -import io.github.applecommander.acx.base.BackupStrategy; +import org.applecommander.util.BackupStrategy; import io.github.applecommander.acx.base.ReusableCommandOptions; import org.applecommander.source.Source; import org.applecommander.source.Sources; diff --git a/app/cli-acx/src/main/java/io/github/applecommander/acx/command/CreateDiskCommand.java b/app/cli-acx/src/main/java/io/github/applecommander/acx/command/CreateDiskCommand.java index fb7a19e3..acccbf97 100644 --- a/app/cli-acx/src/main/java/io/github/applecommander/acx/command/CreateDiskCommand.java +++ b/app/cli-acx/src/main/java/io/github/applecommander/acx/command/CreateDiskCommand.java @@ -27,7 +27,7 @@ import com.webcodepro.applecommander.storage.os.pascal.PascalFormatDisk; import com.webcodepro.applecommander.storage.os.prodos.ProdosFormatDisk; import io.github.applecommander.acx.OrderType; import io.github.applecommander.acx.SystemType; -import io.github.applecommander.acx.base.BackupStrategy; +import org.applecommander.util.BackupStrategy; import io.github.applecommander.acx.base.ReusableCommandOptions; import io.github.applecommander.acx.converter.DataSizeConverter; import org.applecommander.device.*; diff --git a/app/cli-acx/src/main/java/io/github/applecommander/acx/base/BackupStrategy.java b/lib/ac-api/src/main/java/org/applecommander/util/BackupStrategy.java similarity index 59% rename from app/cli-acx/src/main/java/io/github/applecommander/acx/base/BackupStrategy.java rename to lib/ac-api/src/main/java/org/applecommander/util/BackupStrategy.java index d812a5d8..079994a5 100644 --- a/app/cli-acx/src/main/java/io/github/applecommander/acx/base/BackupStrategy.java +++ b/lib/ac-api/src/main/java/org/applecommander/util/BackupStrategy.java @@ -17,7 +17,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -package io.github.applecommander.acx.base; +package org.applecommander.util; import java.io.IOException; import java.nio.file.Files; @@ -26,13 +26,46 @@ import java.nio.file.Path; import static java.nio.file.StandardCopyOption.REPLACE_EXISTING; /// Provides a simple but automated backup strategy to the `acx` tool. +/// +/// General usage pattern is as follows: +/// ```java +/// // Only save if there are changes. +/// if (disk.getSource().hasChanged()) { +/// backupStrategy.backup(disk.getFilename()); +/// disk.save(); +/// } +/// ``` +/// +/// To create a `BackupStrategy` in a consistent manner, use the #create +/// method: +/// ```'java +/// BackupStrategy backupStrategy = BackupStrategy.create("bak"); +/// ``` +/// +/// If using in a context where a backup is no expected (as in a new file, or +/// a "save as" situation), simply use `BackupStrategy.none()`. +/// +/// The coding is as follows: +/// * `null` or blank (`""`): Returns an ineffective strategy. (No branches in code.) +/// * `bak`: Returns a backup strategy that renames the existing file from `name.dsk` +/// to `name.dsk.bak`, overwriting any existing files. +/// * The default strategy is to assume the value is a directory, _which will be created_, +/// and make a copy of the file into this directory. +/// +/// @see #create(String) /// @see #none() -/// @see #fileExtension(String) -/// @see #directory(String) -/// @see ReadWriteDiskCommandOptions public interface BackupStrategy { void backup(String filename) throws IOException; + static BackupStrategy create(String backupCode) { + if (backupCode == null) backupCode = ""; + return switch (backupCode) { + case "" -> BackupStrategy.none(); + case "bak" -> BackupStrategy.fileExtension("bak"); + default -> BackupStrategy.directory(backupCode); + }; + } + static BackupStrategy none() { return filename -> { // Do nothing