private ChangeSetResults perform()

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;
    }