Updating comparisons to use updated DiskDiff with FormattedDisk.

This commit is contained in:
Rob Greene
2025-08-23 15:25:56 -05:00
parent 2efacef00c
commit 887bb2fdcd
3 changed files with 43 additions and 44 deletions

View File

@@ -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();

View File

@@ -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<FormattedDisk> diskA, List<FormattedDisk> diskB) {
return new Builder(diskA, diskB);
}
private Disk diskA;
private Disk diskB;
private List<FormattedDisk> diskA;
private List<FormattedDisk> diskB;
private ComparisonResult results = new ComparisonResult();
private BiConsumer<FormattedDisk,FormattedDisk> diskComparisonStrategy = this::compareByNativeGeometry;
private DiskDiff(Disk diskA, Disk diskB) {
private DiskDiff(List<FormattedDisk> diskA, List<FormattedDisk> 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<FormattedDisk> formattedDisksA, List<FormattedDisk> 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<min; i++) {
this.diskComparisonStrategy.accept(formattedDisksA[i], formattedDisksB[i]);
this.diskComparisonStrategy.accept(formattedDisksA.get(i), formattedDisksB.get(i));
}
}
@@ -217,11 +207,11 @@ public class DiskDiff {
List<FileTuple> 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<FileTuple> 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<FormattedDisk> diskA, List<FormattedDisk> diskB) {
diff = new DiskDiff(diskA, diskB);
}
/** Compare disks by whatever native geometry the disks have. Fails if geometries do not match. */

View File

@@ -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<String> errorMessages = new ArrayList<>();
Disk disk1 = null;
List<FormattedDisk> 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<FormattedDisk> 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$