in src/main/java/org/apache/commons/compress/changes/ChangeSetPerformer.java [177:242]
private ChangeSetResults perform(final ArchiveEntryIterator entryIterator,
final ArchiveOutputStream out)
throws IOException {
final ChangeSetResults results = new ChangeSetResults();
final Set<Change> workingSet = new LinkedHashSet<>(changes);
for (final Iterator<Change> it = workingSet.iterator(); it.hasNext();) {
final Change change = it.next();
if (change.type() == Change.TYPE_ADD && change.isReplaceMode()) {
copyStream(change.getInput(), out, change.getEntry());
it.remove();
results.addedFromChangeSet(change.getEntry().getName());
}
}
while (entryIterator.hasNext()) {
final ArchiveEntry entry = entryIterator.next();
boolean copy = true;
for (final Iterator<Change> it = workingSet.iterator(); it.hasNext();) {
final Change change = it.next();
final int type = change.type();
final String name = entry.getName();
if (type == Change.TYPE_DELETE && name != null) {
if (name.equals(change.targetFile())) {
copy = false;
it.remove();
results.deleted(name);
break;
}
} else if (type == Change.TYPE_DELETE_DIR && name != null) {
// don't combine ifs to make future extensions more easy
if (name.startsWith(change.targetFile() + "/")) { // NOPMD NOSONAR
copy = false;
results.deleted(name);
break;
}
}
}
if (copy
&& !isDeletedLater(workingSet, entry)
&& !results.hasBeenAdded(entry.getName())) {
copyStream(entryIterator.getInputStream(), out, entry);
results.addedFromStream(entry.getName());
}
}
// Adds files which hasn't been added from the original and do not have replace mode on
for (final Iterator<Change> it = workingSet.iterator(); it.hasNext();) {
final Change change = it.next();
if (change.type() == Change.TYPE_ADD &&
!change.isReplaceMode() &&
!results.hasBeenAdded(change.getEntry().getName())) {
copyStream(change.getInput(), out, change.getEntry());
it.remove();
results.addedFromChangeSet(change.getEntry().getName());
}
}
out.finish();
return results;
}