/** * Performs all changes collected in this ChangeSet on the input stream and * streams the result to the output stream. Perform may be called more than once. * * This method finishes the stream, no other entries should be added * after that. * * @param in * the InputStream to perform the changes on * @param out * the resulting OutputStream with all modifications * @throws IOException * if an read/write error occurs * @return the results of this operation */ public ChangeSetResults perform(ArchiveInputStream inJ, ArchiveOutputStream outJ) //throws IOException { ChangeSetResults results = new ChangeSetResults(); java.util.Set <Change> workingSet = new java.util.LinkedHashSet <Change>(changes); for (java.util.Iterator <Change> it = workingSet.iterator(); it.hasNext();) { Change change = it.next(); if (change.type() == Change.TYPE_ADD && change.isReplaceMode()) { copyStream(change.getInput(), outJ, change.getEntry()); it.remove(); results.addedFromChangeSet(change.getEntry().getName()); } } ArchiveEntry entry = null; while ((entry = inJ.getNextEntry()) != null) { bool copy = true; for (java.util.Iterator <Change> it = workingSet.iterator(); it.hasNext();) { Change change = it.next(); int type = change.type(); 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) { if (name.StartsWith(change.targetFile() + "/")) { copy = false; results.deleted(name); break; } } } if (copy) { if (!isDeletedLater(workingSet, entry) && !results.hasBeenAdded(entry.getName())) { copyStream(inJ, outJ, entry); results.addedFromStream(entry.getName()); } } } // Adds files which hasn't been added from the original and do not have replace mode on for (java.util.Iterator <Change> it = workingSet.iterator(); it.hasNext();) { Change change = it.next(); if (change.type() == Change.TYPE_ADD && !change.isReplaceMode() && !results.hasBeenAdded(change.getEntry().getName())) { copyStream(change.getInput(), outJ, change.getEntry()); it.remove(); results.addedFromChangeSet(change.getEntry().getName()); } } outJ.finish(); return(results); }