/* * 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 java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.jboss.as.controller.AttributeDefinition; /** * @author <a href="kabir.khan@jboss.com">Kabir Khan</a> */ abstract class AttributeTransformationDescriptionBuilderImpl<T extends BaseAttributeTransformationDescriptionBuilder<?>> implements BaseAttributeTransformationDescriptionBuilder<T> { private AttributeTransformationDescriptionBuilderRegistry registry; private ResourceTransformationDescriptionBuilder builder; AttributeTransformationDescriptionBuilderImpl(final ResourceTransformationDescriptionBuilder builder, final AttributeTransformationDescriptionBuilderRegistry registry) { this.builder = builder; this.registry = registry; } @Override public ResourceTransformationDescriptionBuilder end() { return builder; } @Override public T setDiscard(DiscardAttributeChecker discardChecker, AttributeDefinition...discardedAttributes) { AttributeDefinition[] useDefs = discardedAttributes; for (AttributeDefinition attribute : useDefs) { String attrName = getAttributeName(attribute); registry.setDiscardedAttribute(discardChecker, attrName); } return thisBuilder(); } @Override public T setDiscard(DiscardAttributeChecker discardChecker, Collection<AttributeDefinition> discardedAttributes) { for (AttributeDefinition attribute : discardedAttributes) { String attrName = getAttributeName(attribute); registry.setDiscardedAttribute(discardChecker, attrName); } return thisBuilder(); } @Override public T setDiscard(DiscardAttributeChecker discardChecker, String... discardedAttributes) { String[] useDefs = discardedAttributes; for (String attrName : useDefs) { registry.setDiscardedAttribute(discardChecker, attrName); } return thisBuilder(); } @Override public T addRejectCheck(final RejectAttributeChecker checker, final AttributeDefinition...rejectedAttributes){ for (AttributeDefinition attribute : rejectedAttributes) { String attrName = getAttributeName(attribute); registry.addAttributeCheck(attrName, checker); } return thisBuilder(); } @Override public T addRejectCheck(RejectAttributeChecker rejectChecker, String... rejectedAttributes) { for (String attribute : rejectedAttributes) { registry.addAttributeCheck(attribute, rejectChecker); } return thisBuilder(); } @Override public T addRejectChecks(List<RejectAttributeChecker> rejectCheckers, AttributeDefinition...rejectedAttributes) { for (RejectAttributeChecker rejectChecker : rejectCheckers) { addRejectCheck(rejectChecker, rejectedAttributes); } return thisBuilder(); } @Override public T addRejectChecks(List<RejectAttributeChecker> rejectCheckers, String... rejectedAttributes) { for (RejectAttributeChecker rejectChecker : rejectCheckers) { addRejectCheck(rejectChecker, rejectedAttributes); } return thisBuilder(); } @Override public T addRename(AttributeDefinition attributeName, String newName) { registry.addRenamedAttribute(getAttributeName(attributeName), newName); return thisBuilder(); } @Override public T addRename(String attributeName, String newName) { registry.addRenamedAttribute(attributeName, newName); return thisBuilder(); } public T addRenames(Map<String, String> renames) { for (Map.Entry<String, String> rename : renames.entrySet()) { registry.addRenamedAttribute(rename.getKey(), rename.getValue()); } return thisBuilder(); } @Override public T setValueConverter(AttributeConverter attributeConverter, AttributeDefinition...convertedAttributes) { for (AttributeDefinition attribute : convertedAttributes) { String attrName = getAttributeName(attribute); registry.addAttributeConverter(attrName, attributeConverter); } return thisBuilder(); } @Override public T setValueConverter(AttributeConverter attributeConverter, String... convertedAttributes) { for (String attribute : convertedAttributes) { registry.addAttributeConverter(attribute, attributeConverter); } return thisBuilder(); } protected String getAttributeName(AttributeDefinition attr) { return attr.getName(); } protected AttributeTransformationDescriptionBuilderRegistry getLocalRegistry() { return registry; } static class AttributeTransformationDescriptionBuilderRegistry { private final Set<String> allAttributes = new HashSet<String>(); private final Map<String, List<RejectAttributeChecker>> attributeRestrictions = new HashMap<String, List<RejectAttributeChecker>>(); private final Map<String, DiscardAttributeChecker> discardedAttributes = new HashMap<String, DiscardAttributeChecker>(); private final Map<String, String> renamedAttributes = new HashMap<String, String>(); private final Map<String, AttributeConverter> convertedAttributes = new HashMap<String, AttributeConverter>(); void addToAllAttributes(String attributeName) { if (!allAttributes.contains(attributeName)) { allAttributes.add(attributeName); } } void addAttributeCheck(final String attributeName, final RejectAttributeChecker checker) { addToAllAttributes(attributeName); List<RejectAttributeChecker> checkers = attributeRestrictions.get(attributeName); if(checkers == null) { checkers = new ArrayList<RejectAttributeChecker>(); attributeRestrictions.put(attributeName, checkers); } checkers.add(checker); } void setDiscardedAttribute(DiscardAttributeChecker discardChecker, String attributeName) { assert discardChecker != null : "Null discard checker"; assert !discardedAttributes.containsKey(attributeName) : "Discard already set"; addToAllAttributes(attributeName); discardedAttributes.put(attributeName, discardChecker); } void addRenamedAttribute(String attributeName, String newName) { assert !renamedAttributes.containsKey(attributeName) : "Rename already set"; addToAllAttributes(attributeName); renamedAttributes.put(attributeName, newName); } void addAttributeConverter(String attributeName, AttributeConverter attributeConverter) { addToAllAttributes(attributeName); convertedAttributes.put(attributeName, attributeConverter); } Map<String, AttributeTransformationDescription> buildAttributes(){ Map<String, AttributeTransformationDescription> attributes = new HashMap<String, AttributeTransformationDescription>(); for (String name : allAttributes) { List<RejectAttributeChecker> checkers = attributeRestrictions.get(name); String newName = renamedAttributes.get(name); DiscardAttributeChecker discardChecker = discardedAttributes.get(name); attributes.put(name, new AttributeTransformationDescription(name, checkers, newName, discardChecker, convertedAttributes.get(name))); } return attributes; } } protected static AttributeTransformationDescriptionBuilderRegistry mergeRegistries(AttributeTransformationDescriptionBuilderRegistry one, AttributeTransformationDescriptionBuilderRegistry two) { final AttributeTransformationDescriptionBuilderRegistry result = new AttributeTransformationDescriptionBuilderRegistry(); result.allAttributes.addAll(one.allAttributes); result.allAttributes.addAll(two.allAttributes); result.attributeRestrictions.putAll(one.attributeRestrictions); result.attributeRestrictions.putAll(two.attributeRestrictions); result.discardedAttributes.putAll(one.discardedAttributes); result.discardedAttributes.putAll(two.discardedAttributes); result.renamedAttributes.putAll(one.renamedAttributes); result.renamedAttributes.putAll(two.renamedAttributes); result.convertedAttributes.putAll(one.convertedAttributes); result.convertedAttributes.putAll(two.convertedAttributes); return result; } /** * @return this builder */ protected abstract T thisBuilder(); }