/* * JBoss, Home of Professional Open Source. * Copyright 2012, 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.runner; import java.util.Arrays; import org.jboss.as.patching.metadata.ContentItem; import org.jboss.as.patching.metadata.ContentModification; import org.jboss.as.patching.metadata.ContentType; import org.jboss.as.patching.metadata.ModificationType; /** * @author Emanuel Muckenhuber */ class PatchingTaskDescription { private final String patchId; private final ContentModification modification; private final PatchContentLoader loader; private final boolean conflicts; private final boolean skipIfTheSame; private final boolean rollback; PatchingTaskDescription(String patchId, ContentModification modification, PatchContentLoader loader, boolean conflicts, boolean skipIfExists, boolean rollback) { this.patchId = patchId; this.modification = modification; this.loader = loader; this.conflicts = conflicts; this.skipIfTheSame = skipIfExists; this.rollback = rollback; } public String getPatchId() { return patchId; } public boolean isRolledback() { return rollback; } public ContentModification getModification() { return modification; } public ModificationType getModificationType() { return modification.getType(); } public ContentItem getContentItem() { return modification.getItem(); } public <T extends ContentItem> T getContentItem(Class<T> expected) { return modification.getItem(expected); } public ContentType getContentType() { return modification.getItem().getContentType(); } public PatchContentLoader getLoader() { return loader; } public boolean hasConflicts() { return conflicts; } public boolean skipIfTheSame() { return skipIfTheSame; } static PatchingTaskDescription create(final PatchingTasks.ContentTaskDefinition definition, final PatchContentLoader loader) { final ContentModification modification = resolveDefinition(definition); // Check if we already have the new content final ContentItem item = definition.getTarget().getItem(); final byte[] currentHash = definition.getLatest().getTargetHash(); final byte[] newContentHash = item.getContentHash(); boolean skipIfExists = Arrays.equals(currentHash, newContentHash); return new PatchingTaskDescription(definition.getTarget().getPatchId(), modification, loader, definition.hasConflicts(), skipIfExists, definition.isRollback()); } static ContentModification resolveDefinition(final PatchingTasks.ContentTaskDefinition definition) { // Only available in a single patch, yay! if(definition.getLatest() == definition.getTarget()) { return definition.getTarget().getModification(); } // Create a new modification replacing the latest final ContentItem backupItem = definition.getTarget().getItem(); final ContentModification modification = definition.getTarget().getModification(); final byte[] target = definition.getLatest().getTargetHash(); return new ContentModification(backupItem, target, modification.getType(), modification.getCondition()); } }