/* * JBoss, Home of Professional Open Source. * Copyright 2014, Red Hat, Inc., and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.as.patching.validation; import java.io.IOException; import java.util.List; import org.jboss.as.patching.Constants; import org.jboss.as.patching.installation.InstalledIdentity; import org.jboss.as.patching.installation.PatchableTarget; import org.jboss.as.patching.metadata.RollbackPatch; /** * Artifact validating that the overall patches are consistent with the rollback information. * * @author Emanuel Muckenhuber */ class RollbackTargetArtifact extends AbstractArtifact<PatchingXmlArtifact.XmlArtifactState<RollbackPatch>, RollbackTargetArtifact.State> { @Override public boolean process(PatchingXmlArtifact.XmlArtifactState<RollbackPatch> parent, PatchingArtifactProcessor processor) { final RollbackPatch patch = parent.getPatch(); final PatchingArtifacts.PatchID patchID = processor.getParentArtifact(PatchingArtifacts.HISTORY_RECORD); final InstalledIdentity identity = patch.getIdentityState(); processor.getValidationContext().setCurrentPatchIdentity(identity); final State state = new State(identity, patchID); if (identity == null) { processor.getValidationContext().getErrorHandler().addMissing(PatchingArtifacts.ROLLBACK_TARGET, state); return false; } else { return processor.process(this, state); } } static class State implements PatchingArtifact.ArtifactState { private final InstalledIdentity rollbackIdentity; private final PatchingArtifacts.PatchID reference; State(InstalledIdentity rollbackIdentity, PatchingArtifacts.PatchID reference) { this.rollbackIdentity = rollbackIdentity; this.reference = reference; } @Override public boolean isValid(PatchingArtifactValidationContext context) { try { // Check the target state we are rolling back to final PatchableTarget.TargetInfo target = rollbackIdentity.getIdentity().loadTargetInfo(); final List<String> patches = target.getPatchIDs(); final String rollbackTo; if (patches.isEmpty()) { rollbackTo = target.getCumulativePatchID(); } else { rollbackTo = patches.get(0); } final String ref = reference.getNextPatchID(); if (rollbackTo.equals(ref)) { return true; } else if (ref == null && Constants.BASE.equals(rollbackTo)) { return true; } else { context.getErrorHandler().addInconsistent(PatchingArtifacts.ROLLBACK_TARGET, this); } } catch (IOException e) { context.getErrorHandler().addError(PatchingArtifacts.ROLLBACK_TARGET, this); } return false; } @Override public String toString() { return reference.getPatchID() != null ? reference.getPatchID() : Constants.BASE; } } }