package org.jboss.as.patching.runner; import static org.jboss.as.patching.IoUtils.recursiveDelete; import java.io.File; import java.util.Collection; import java.util.Collections; import org.jboss.as.patching.DirectoryStructure; import org.jboss.as.patching.installation.InstalledImage; import org.jboss.as.patching.metadata.ContentModification; import org.jboss.as.patching.metadata.Patch; import org.jboss.as.patching.metadata.PatchElement; import org.jboss.as.patching.metadata.PatchImpl; import org.jboss.as.patching.metadata.RollbackPatch; import org.jboss.as.patching.metadata.impl.IdentityImpl; /** * Callback when rolling back a patch. This will cleanup the patch directories and history if completed successfully. * * @author Emanuel Muckenhuber */ class IdentityRollbackCallback implements IdentityPatchContext.FinalizeCallback { private final Patch patch; private final Collection<String> patches; private final boolean resetConfiguration; private final DirectoryStructure directoryStructure; public IdentityRollbackCallback(final String patchId, final Collection<String> patches, boolean resetConfiguration, final DirectoryStructure directoryStructure) { this.patches = patches; this.directoryStructure = directoryStructure; this.resetConfiguration = resetConfiguration; // Create an empty patch, we don't do anything with the processedPatch final IdentityImpl identity = new IdentityImpl("", ""); identity.setPatchType(Patch.PatchType.ONE_OFF); // Does not matter, we delete the temp directory anyway this.patch = new PatchImpl(patchId, "no description", identity, Collections.<PatchElement>emptyList(), Collections.<ContentModification>emptyList()); } @Override public Patch getPatch() { return patch; } @Override public void finishPatch(final Patch processedPatch, final RollbackPatch patch, final IdentityPatchContext context) throws Exception { context.restoreConfiguration(patch.getPatchId(), resetConfiguration); } @Override public void completed(IdentityPatchContext context) { final InstalledImage installedImage = directoryStructure.getInstalledImage(); final File history = installedImage.getPatchHistoryDir(patch.getPatchId()); if (!recursiveDelete(history)) { context.failedToCleanupDir(history); } // Cleanup all the recorded rollbacks cleanupEntry(context.getLayers()); cleanupEntry(context.getAddOns()); cleanupEntry(Collections.singleton(context.getIdentityEntry())); } @Override public void operationCancelled(IdentityPatchContext context) { // nothing to do here } static void cleanupEntry(final Collection<IdentityPatchContext.PatchEntry> entries) { for (final IdentityPatchContext.PatchEntry entry : entries) { entry.cleanupRollbackPatchHistory(); } } }