in src/main/java/org/apache/commons/compress/changes/ChangeSetPerformer.java [173:236]
private ChangeSetResults perform(final ArchiveEntryIterator<E> entryIterator, final O outputStream) throws IOException {
final ChangeSetResults results = new ChangeSetResults();
final Set<Change<E>> workingSet = new LinkedHashSet<>(changes);
for (final Iterator<Change<E>> it = workingSet.iterator(); it.hasNext();) {
final Change<E> change = it.next();
if (change.getType() == ChangeType.ADD && change.isReplaceMode()) {
@SuppressWarnings("resource") // InputStream not allocated here
final InputStream inputStream = change.getInputStream();
copyStream(inputStream, outputStream, change.getEntry());
it.remove();
results.addedFromChangeSet(change.getEntry().getName());
}
}
while (entryIterator.hasNext()) {
final E entry = entryIterator.next();
boolean copy = true;
for (final Iterator<Change<E>> it = workingSet.iterator(); it.hasNext();) {
final Change<E> change = it.next();
final ChangeType type = change.getType();
final String name = entry.getName();
if (type == ChangeType.DELETE && name != null) {
if (name.equals(change.getTargetFileName())) {
copy = false;
it.remove();
results.deleted(name);
break;
}
} else // don't combine ifs to make future extensions more easy
if (type == ChangeType.DELETE_DIR && name != null && name.startsWith(change.getTargetFileName() + "/")) { // NOPMD NOSONAR
copy = false;
results.deleted(name);
break;
}
}
if (copy && !isDeletedLater(workingSet, entry) && !results.hasBeenAdded(entry.getName())) {
@SuppressWarnings("resource") // InputStream not allocated here
final InputStream inputStream = entryIterator.getInputStream();
copyStream(inputStream, outputStream, 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<E>> it = workingSet.iterator(); it.hasNext();) {
final Change<E> change = it.next();
if (change.getType() == ChangeType.ADD && !change.isReplaceMode() && !results.hasBeenAdded(change.getEntry().getName())) {
@SuppressWarnings("resource")
final InputStream input = change.getInputStream();
copyStream(input, outputStream, change.getEntry());
it.remove();
results.addedFromChangeSet(change.getEntry().getName());
}
}
outputStream.finish();
return results;
}