/* * JBoss, Home of Professional Open Source. * Copyright 2013, 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.metadata; import static org.jboss.as.patching.IoUtils.NO_CONTENT; import java.util.List; import org.jboss.as.patching.runner.ContentItemFilter; /** * @author Emanuel Muckenhuber */ public abstract class ModificationBuilderTarget<T> { private ContentItemFilter itemFilter; protected ModificationBuilderTarget() { this(ContentItemFilter.ALL); } protected ModificationBuilderTarget(ContentItemFilter itemFilter) { this.itemFilter = itemFilter; } protected abstract T internalAddModification(final ContentModification modification); /** * @return this */ protected abstract T returnThis(); /** * Add a content modification. * * @param modification the content modification */ public T addContentModification(final ContentModification modification) { if (itemFilter.accepts(modification.getItem())) { internalAddModification(modification); } return returnThis(); } /** * Add a bundle. * * @param moduleName the module name * @param slot the module slot * @param newHash the new hash of the added content * @return the builder */ public T addBundle(final String moduleName, final String slot, final byte[] newHash) { final ContentItem item = createBundleItem(moduleName, slot, newHash); addContentModification(createContentModification(item, ModificationType.ADD, NO_CONTENT)); return returnThis(); } /** * Modify a bundle. * * @param moduleName the module name * @param slot the module slot * @param existingHash the existing hash * @param newHash the new hash of the modified content * @return the builder */ public T modifyBundle(final String moduleName, final String slot, final byte[] existingHash, final byte[] newHash) { final ContentItem item = createBundleItem(moduleName, slot, newHash); addContentModification(createContentModification(item, ModificationType.MODIFY, existingHash)); return returnThis(); } /** * Remove a bundle. * * @param moduleName the module name * @param slot the module slot * @param existingHash the existing hash * @return the builder */ public T removeBundle(final String moduleName, final String slot, final byte[] existingHash) { final ContentItem item = createBundleItem(moduleName, slot, NO_CONTENT); addContentModification(createContentModification(item, ModificationType.REMOVE, existingHash)); return returnThis(); } /** * Add a misc file. * * @param name the file name * @param path the relative path * @param newHash the new hash of the added content * @param isDirectory whether the file is a directory or not * @return the builder */ public T addFile(final String name, final List<String> path, final byte[] newHash, final boolean isDirectory) { return addFile(name, path, newHash, isDirectory, null); } public T addFile(final String name, final List<String> path, final byte[] newHash, final boolean isDirectory, ModificationCondition condition) { final ContentItem item = createMiscItem(name, path, newHash, isDirectory); addContentModification(createContentModification(item, ModificationType.ADD, NO_CONTENT, condition)); return returnThis(); } /** * Modify a misc file. * * @param name the file name * @param path the relative path * @param existingHash the existing hash * @param newHash the new hash of the modified content * @param isDirectory whether the file is a directory or not * @return the builder */ public T modifyFile(final String name, final List<String> path, final byte[] existingHash, final byte[] newHash, final boolean isDirectory) { return modifyFile(name, path, existingHash, newHash, isDirectory, null); } public T modifyFile(final String name, final List<String> path, final byte[] existingHash, final byte[] newHash, final boolean isDirectory, ModificationCondition condition) { final ContentItem item = createMiscItem(name, path, newHash, isDirectory); addContentModification(createContentModification(item, ModificationType.MODIFY, existingHash, condition)); return returnThis(); } /** * Remove a misc file. * * @param name the file name * @param path the relative path * @param existingHash the existing hash * @param isDirectory whether the file is a directory or not * @return the builder */ public T removeFile(final String name, final List<String> path, final byte[] existingHash, final boolean isDirectory) { return removeFile(name, path, existingHash, isDirectory, null); } public T removeFile(final String name, final List<String> path, final byte[] existingHash, final boolean isDirectory, ModificationCondition condition) { final ContentItem item = createMiscItem(name, path, NO_CONTENT, isDirectory); addContentModification(createContentModification(item, ModificationType.REMOVE, existingHash, condition)); return returnThis(); } /** * Add a module. * * @param moduleName the module name * @param slot the module slot * @param newHash the new hash of the added content * @return the builder */ public T addModule(final String moduleName, final String slot, final byte[] newHash) { final ContentItem item = createModuleItem(moduleName, slot, newHash); addContentModification(createContentModification(item, ModificationType.ADD, NO_CONTENT)); return returnThis(); } /** * Modify a module. * * @param moduleName the module name * @param slot the module slot * @param existingHash the existing hash * @param newHash the new hash of the modified content * @return the builder */ public T modifyModule(final String moduleName, final String slot, final byte[] existingHash, final byte[] newHash) { final ContentItem item = createModuleItem(moduleName, slot, newHash); addContentModification(createContentModification(item, ModificationType.MODIFY, existingHash)); return returnThis(); } /** * Remove a module. * * @param moduleName the module name * @param slot the module slot * @param existingHash the existing hash * @return the builder */ public T removeModule(final String moduleName, final String slot, final byte[] existingHash) { final ContentItem item = createModuleItem(moduleName, slot, NO_CONTENT); addContentModification(createContentModification(item, ModificationType.REMOVE, existingHash)); return returnThis(); } public void setContentItemFilter(final ContentItemFilter filter) { this.itemFilter = filter; } protected ContentModification createContentModification(final ContentItem item, final ModificationType type, final byte[] existingHash) { return createContentModification(item, type, existingHash, null); } protected ContentModification createContentModification(final ContentItem item, final ModificationType type, final byte[] existingHash, ModificationCondition condition) { return new ContentModification(item, existingHash, type, condition); } protected MiscContentItem createMiscItem(final String name, final List<String> path, final byte[] newHash, final boolean isDirectory) { return new MiscContentItem(name, path, newHash, isDirectory); } protected ModuleItem createBundleItem(final String moduleName, final String slot, final byte[] hash) { return new BundleItem(moduleName, slot, hash); } protected ModuleItem createModuleItem(final String moduleName, final String slot, final byte[] hash) { return new ModuleItem(moduleName, slot, hash); } }