# Advanced Archive Processing
# Diffing Two JAR Files
The following code diffs the base JAR file base.jar to the update JAR file update.jar and generates the delta JAR
file delta.jar.
In addition to the CommonsCompress facade for accessing the archive files, it uses the Delta facade for diffing
them:
import static global.namespace.fun.io.commons.compress.CommonsCompress.jar; // from module `fun-io-commons-compress`
import static global.namespace.fun.io.delta.Delta.diff; // from module `fun-io-delta`
class Scratch {
public static void main(String[] args) throws Exception {
diff().base(jar("base.jar")).update(jar("update.jar")).to(jar("delta.jar"));
}
}
If you wanted to use the module fun-io-bios instead of fun-io-commons-compress, then, apart from configuring the
classpath, you would only have to edit the import statement as shown in the next example.
# Patching The Base JAR File
The following code patches the base JAR file base.jar with the delta JAR file delta.jar to an(other) update JAR
file update.jar.
For the purpose of illustration, it uses the BIOS facade from the module fun-io-bios instead of the
CommonsCompress facade from the module fun-io-commons-compress for accessing the JAR file format using the JRE.
For production, using the CommonsCompress facade is recommend for better accuracy and performance.
It also uses the Delta facade again for patching the base archive file with the delta archive file:
import static global.namespace.fun.io.bios.BIOS.jar; // from module `fun-io-bios`
import static global.namespace.fun.io.delta.Delta.patch;
class Scratch {
public static void main(String[] args) throws Exception {
patch().base(jar("base.jar")).delta(jar("delta.jar")).to(jar("update.jar"));
}
}
# Diffing Two Directories
The following code diffs the base directory base to the update directory update and generates the delta ZIP file
delta.zip:
import static global.namespace.fun.io.bios.BIOS.directory;
import static global.namespace.fun.io.commons.compress.CommonsCompress.zip;
import static global.namespace.fun.io.delta.Delta.diff;
class Scratch {
public static void main(String[] args) throws Exception {
diff().base(directory("base")).update(directory("update")).to(zip("delta.zip"));
}
}
# Patching The Base Directory
The following code patches the base directory base with the delta ZIP file delta.zip to the update directory
update:
import static global.namespace.fun.io.bios.BIOS.directory;
import static global.namespace.fun.io.commons.compress.CommonsCompress.zip;
import static global.namespace.fun.io.delta.Delta.patch;
class Scratch {
public static void main(String[] args) throws Exception {
patch().base(directory("base")).delta(zip("delta.zip")).to(directory("update"));
}
}
# Computing A Delta Model
Maybe you just want to examine the delta of two archive files or directories, but not generate a delta archive file or
directory from that?
The following code diffs the base directory base to the update directory update and computes a delta model:
import global.namespace.fun.io.delta.model.DeltaModel;
import static global.namespace.fun.io.bios.BIOS.directory;
import static global.namespace.fun.io.delta.Delta.diff;
class Scratch {
public static void main(String[] args) throws Exception {
DeltaModel model = diff().base(directory("base")).update(directory("update")).toModel();
model.changedEntries().forEach(entry -> { /* do something with it */ });
}
}
The delta model has properties describing the changed, unchanged, added and removed entries.