/* * 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.controller.transform.description; import org.jboss.as.controller.PathAddress; import org.jboss.as.controller.transform.TransformationContext; import org.jboss.dmr.ModelNode; import org.jboss.dmr.ModelType; /** * Checks whether an attribute should be discarded or not * * @author <a href="kabir.khan@jboss.com">Kabir Khan</a> */ public interface DiscardAttributeChecker { /** * Returns {@code true} if the attribute should be discarded if expressions are used * * @return whether to discard if expressions are used */ boolean isDiscardExpressions(); /** * Returns {@code true} if the attribute should be discarded if it is undefined * * @return whether to discard if the attribute is undefined */ boolean isDiscardUndefined(); /** * Gets whether the given operation parameter can be discarded * * @param address the address of the operation * @param attributeName the name of the operation parameter * @param attributeValue the value of the operation parameter * @param operation the operation executed. This is unmodifiable. * @param context the context of the transformation * * @return {@code true} if the operation parameter value should be discarded, {@code false} otherwise. */ boolean isOperationParameterDiscardable(PathAddress address, String attributeName, ModelNode attributeValue, ModelNode operation, TransformationContext context); /** * Gets whether the given attribute can be discarded * * @param address the address of the resource * @param attributeName the name of the attribute * @param attributeValue the value of the attribute * @param context the context of the transformation * * @return {@code true} if the attribute value should be discarded, {@code false} otherwise. */ boolean isResourceAttributeDiscardable(PathAddress address, String attributeName, ModelNode attributeValue, TransformationContext context); /** * A default implementation of DiscardAttributeChecker * */ abstract class DefaultDiscardAttributeChecker implements DiscardAttributeChecker { protected final boolean discardExpressions; protected final boolean discardUndefined; /** * Constructor * * @param discardExpressions {@code true} if the attribute should be discarded if expressions are used * @param discardUndefined {@code true} if the attribute should be discarded if expressions are used */ protected DefaultDiscardAttributeChecker(final boolean discardExpressions, final boolean discardUndefined) { this.discardExpressions = discardExpressions; this.discardUndefined = discardUndefined; } /** * Constructor. * * Sets it up with {@code discardExpressions==false} and {@code discardUndefined==true} * */ public DefaultDiscardAttributeChecker() { this(false, true); } /** {@inheritDoc} */ public boolean isDiscardExpressions() { return discardExpressions; } /** {@inheritDoc} */ public boolean isDiscardUndefined() { return discardUndefined; } /** {@inheritDoc} */ @Override public boolean isOperationParameterDiscardable(PathAddress address, String attributeName, ModelNode attributeValue, ModelNode operation, TransformationContext context) { return isValueDiscardable(address, attributeName, attributeValue, context); } /** {@inheritDoc} */ @Override public boolean isResourceAttributeDiscardable(PathAddress address, String attributeName, ModelNode attributeValue, TransformationContext context) { return isValueDiscardable(address, attributeName, attributeValue, context); } /** * Gets called by the default implementations of {@link #isOperationParameterDiscardable(PathAddress, String, ModelNode, ModelNode, TransformationContext)} and * {@link #isResourceAttributeDiscardable(PathAddress, String, ModelNode, TransformationContext)}. * * @param address the address of the operation or resource * @param attributeName the name of the attribute * @param attributeValue the value of the attribute * @param context the context of the transformation * * @return {@code true} if the attribute or parameter value is not understandable by the target process and so needs to be rejected, {@code false} otherwise. */ protected abstract boolean isValueDiscardable(PathAddress address, String attributeName, ModelNode attributeValue, TransformationContext context); } /** * A standard checker which will discard the attribute always. */ DiscardAttributeChecker ALWAYS = new DefaultDiscardAttributeChecker(true, true) { @Override public boolean isValueDiscardable(PathAddress address, String attributeName, ModelNode attributeValue, TransformationContext context) { return true; } }; /** * A standard checker which will discard the attribute if it is undefined, as long as it is not an expression */ DiscardAttributeChecker UNDEFINED = new DefaultDiscardAttributeChecker(false, true) { @Override public boolean isValueDiscardable(PathAddress address, String attributeName, ModelNode attributeValue, TransformationContext context) { return false; } }; /** * An attribute checker that discards attributes if they are one or more allowed values */ public static class DiscardAttributeValueChecker extends DefaultDiscardAttributeChecker { final ModelNode[] values; /** * Constructor. Discards if the attribute value is either undefined or matches one of the * allowed values; * * @param values the allowed values */ public DiscardAttributeValueChecker(ModelNode...values) { super(false, true); this.values = values; } /** * Constructor. Discards if the attribute value if it matches one of the * passed in values; * * @param discardExpressions {@code true} if the attribute should be discarded if expressions are used * @param discardUndefined {@code true} if the attribute should be discarded if expressions are used * @param values the allowed values */ public DiscardAttributeValueChecker(boolean discardExpressions, boolean discardUndefined, ModelNode...values) { super(discardExpressions, discardUndefined); this.values = values; } @Override protected boolean isValueDiscardable(PathAddress address, String attributeName, ModelNode attributeValue, TransformationContext context) { if (attributeValue.getType() != ModelType.EXPRESSION) { for (ModelNode value : values) { if (attributeValue.equals(value)){ return true; } } } return false; } } }