mirror of
https://github.com/AppleCommander/AppleCommander.git
synced 2026-01-23 08:16:04 +00:00
Updating comparisons to use updated DiskDiff with FormattedDisk.
This commit is contained in:
@@ -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();
|
||||
|
||||
|
||||
@@ -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. */
|
||||
|
||||
@@ -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$
|
||||
|
||||
Reference in New Issue
Block a user