private ChangeSetResults perform()

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