From 887bb2fdcd74936339cbc436c629097cdace3f93 Mon Sep 17 00:00:00 2001 From: Rob Greene Date: Sat, 23 Aug 2025 15:25:56 -0500 Subject: [PATCH] Updating comparisons to use updated DiskDiff with FormattedDisk. --- .../acx/command/CompareCommand.java | 3 +- .../storage/compare/DiskDiff.java | 58 ++++++++----------- .../comparedisks/CompareDisksResultsPane.java | 26 ++++++--- 3 files changed, 43 insertions(+), 44 deletions(-) diff --git a/app/cli-acx/src/main/java/io/github/applecommander/acx/command/CompareCommand.java b/app/cli-acx/src/main/java/io/github/applecommander/acx/command/CompareCommand.java index fa2e26da..b27b79aa 100644 --- a/app/cli-acx/src/main/java/io/github/applecommander/acx/command/CompareCommand.java +++ b/app/cli-acx/src/main/java/io/github/applecommander/acx/command/CompareCommand.java @@ -19,6 +19,7 @@ */ package io.github.applecommander.acx.command; +import java.util.Arrays; import java.util.Optional; import java.util.function.Consumer; @@ -46,7 +47,7 @@ public class CompareCommand extends ReadOnlyDiskImageCommandOptions { @Override public int handleCommand() throws Exception { - DiskDiff.Builder builder = DiskDiff.create(disk, disk2); + DiskDiff.Builder builder = DiskDiff.create(Arrays.asList(disk.getFormattedDisks()), Arrays.asList(disk2.getFormattedDisks())); strategySelection.strategy.accept(builder); ComparisonResult result = builder.compare(); diff --git a/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/compare/DiskDiff.java b/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/compare/DiskDiff.java index 63196e0a..cd608cdc 100644 --- a/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/compare/DiskDiff.java +++ b/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/compare/DiskDiff.java @@ -32,10 +32,7 @@ import java.util.Set; import java.util.function.BiConsumer; import java.util.stream.Collectors; -import com.webcodepro.applecommander.storage.Disk; -import com.webcodepro.applecommander.storage.DiskException; import com.webcodepro.applecommander.storage.DiskGeometry; -import com.webcodepro.applecommander.storage.DiskUnrecognizedException; import com.webcodepro.applecommander.storage.FormattedDisk; import com.webcodepro.applecommander.storage.physical.ImageOrder; import com.webcodepro.applecommander.util.Range; @@ -48,20 +45,20 @@ import com.webcodepro.applecommander.util.readerwriter.FileEntryReader; * Perform a disk comparison based on selected strategy. */ public class DiskDiff { - public static ComparisonResult compare(Disk diskA, Disk diskB) { - return new DiskDiff(diskA, diskB).compare(); + public static Builder create(FormattedDisk diskA, FormattedDisk diskB) { + return new Builder(List.of(diskA), List.of(diskB)); } - public static Builder create(Disk diskA, Disk diskB) { + public static Builder create(List diskA, List diskB) { return new Builder(diskA, diskB); } - private Disk diskA; - private Disk diskB; + private List diskA; + private List diskB; private ComparisonResult results = new ComparisonResult(); private BiConsumer diskComparisonStrategy = this::compareByNativeGeometry; - private DiskDiff(Disk diskA, Disk diskB) { + private DiskDiff(List diskA, List diskB) { Objects.requireNonNull(diskA); Objects.requireNonNull(diskB); this.diskA = diskA; @@ -69,38 +66,31 @@ public class DiskDiff { } public ComparisonResult compare() { - FormattedDisk[] formattedDisksA = null; - try { - formattedDisksA = diskA.getFormattedDisks(); - } catch (DiskUnrecognizedException e) { - results.addError(e); + if (diskA.isEmpty()) { + results.addError("No disks identified for disk #1"); } - FormattedDisk[] formattedDisksB = null; - try { - formattedDisksB = diskB.getFormattedDisks(); - } catch (DiskUnrecognizedException e) { - results.addError(e); + if (diskB.isEmpty()) { + results.addError("No disks identified for disk #2"); } - + if (!results.hasErrors()) { - compareAll(formattedDisksA, formattedDisksB); + compareAll(diskA, diskB); } return results; } - public void compareAll(FormattedDisk[] formattedDisksA, FormattedDisk[] formattedDisksB) { + public void compareAll(List formattedDisksA, List formattedDisksB) { Objects.requireNonNull(formattedDisksA); Objects.requireNonNull(formattedDisksB); - if (formattedDisksA.length != formattedDisksB.length) { - results.addWarning("Cannot compare all disks; %s has %d while %s has %d.", - diskA.getFilename(), formattedDisksA.length, - diskB.getFilename(), formattedDisksB.length); + if (formattedDisksA.size() != formattedDisksB.size()) { + results.addWarning("Cannot compare all disks; disk #1 has %d while disk #2 has %d.", + formattedDisksA.size(), formattedDisksB.size()); } - int min = Math.min(formattedDisksA.length, formattedDisksB.length); + int min = Math.min(formattedDisksA.size(), formattedDisksB.size()); for (int i=0; i tuplesB = filesB.get(path); // Since this is by name, we expect a single file; report oddities - FileTuple tupleA = tuplesA.get(0); + FileTuple tupleA = tuplesA.getFirst(); if (tuplesA.size() > 1) { results.addWarning("Path %s on disk %s has %d entries.", path, formattedDiskA.getFilename(), tuplesA.size()); } - FileTuple tupleB = tuplesB.get(0); + FileTuple tupleB = tuplesB.getFirst(); if (tuplesB.size() > 1) { results.addWarning("Path %s on disk %s has %d entries.", path, formattedDiskB.getFilename(), tuplesB.size()); } @@ -280,12 +270,12 @@ public class DiskDiff { List tuplesB = contentB.get(content); // This is by content, but uncertain how to report multiple per disk, so pick first one - FileTuple tupleA = tuplesA.get(0); + FileTuple tupleA = tuplesA.getFirst(); if (tuplesA.size() > 1) { results.addWarning("Hash %s on disk %s has %d entries.", content, formattedDiskA.getFilename(), tuplesA.size()); } - FileTuple tupleB = tuplesB.get(0); + FileTuple tupleB = tuplesB.getFirst(); if (tuplesB.size() > 1) { results.addWarning("Hash %s on disk %s has %d entries.", content, formattedDiskB.getFilename(), tuplesB.size()); @@ -347,9 +337,9 @@ public class DiskDiff { } public static class Builder { - private DiskDiff diff; + private final DiskDiff diff; - public Builder(Disk diskA, Disk diskB) { + public Builder(List diskA, List diskB) { diff = new DiskDiff(diskA, diskB); } /** Compare disks by whatever native geometry the disks have. Fails if geometries do not match. */ diff --git a/lib/ac-swt-common/src/main/java/com/webcodepro/applecommander/ui/swt/wizard/comparedisks/CompareDisksResultsPane.java b/lib/ac-swt-common/src/main/java/com/webcodepro/applecommander/ui/swt/wizard/comparedisks/CompareDisksResultsPane.java index 6804068f..2a3b44de 100644 --- a/lib/ac-swt-common/src/main/java/com/webcodepro/applecommander/ui/swt/wizard/comparedisks/CompareDisksResultsPane.java +++ b/lib/ac-swt-common/src/main/java/com/webcodepro/applecommander/ui/swt/wizard/comparedisks/CompareDisksResultsPane.java @@ -22,12 +22,16 @@ package com.webcodepro.applecommander.ui.swt.wizard.comparedisks; import java.util.ArrayList; import java.util.List; +import com.webcodepro.applecommander.storage.DiskFactory; +import com.webcodepro.applecommander.storage.Disks; +import com.webcodepro.applecommander.storage.FormattedDisk; +import org.applecommander.source.Source; +import org.applecommander.source.Sources; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; -import com.webcodepro.applecommander.storage.Disk; import com.webcodepro.applecommander.storage.compare.ComparisonResult; import com.webcodepro.applecommander.storage.compare.DiskDiff; import com.webcodepro.applecommander.ui.UiBundle; @@ -40,11 +44,11 @@ import com.webcodepro.applecommander.util.TextBundle; * @author Rob Greene */ public class CompareDisksResultsPane extends WizardPane { - private TextBundle textBundle = UiBundle.getInstance(); - private Composite parent; - private Object layoutData; + private static final TextBundle textBundle = UiBundle.getInstance(); + private final Composite parent; + private final Object layoutData; private Composite control; - private CompareDisksWizard wizard; + private final CompareDisksWizard wizard; /** * Constructor for ExportFileStartPane. */ @@ -99,17 +103,21 @@ public class CompareDisksResultsPane extends WizardPane { protected String compareDisks() { List errorMessages = new ArrayList<>(); - Disk disk1 = null; + List disk1 = null; try { - disk1 = new Disk(wizard.getDiskname1()); + Source source = Sources.create(wizard.getDiskname1()).orElseThrow(); + DiskFactory.Context ctx = Disks.inspect(source); + disk1 = ctx.disks; } catch (Throwable t) { errorMessages.add(textBundle. format("CompareDisksResultsPane.UnableToLoadDiskN", //$NON-NLS-1$ 1, t.getLocalizedMessage())); } - Disk disk2 = null; + List disk2 = null; try { - disk2 = new Disk(wizard.getDiskname2()); + Source source = Sources.create(wizard.getDiskname2()).orElseThrow(); + DiskFactory.Context ctx = Disks.inspect(source); + disk2 = ctx.disks; } catch (Throwable t) { errorMessages.add(textBundle. format("CompareDisksResultsPane.UnableToLoadDiskN", //$NON-NLS-1$