/*
* 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.Collections;
import java.util.LinkedList;
import java.util.List;
import org.jboss.as.controller.PathElement;
import org.jboss.as.controller.ResourceDefinition;
import org.jboss.as.controller.transform.OperationTransformer;
import org.jboss.as.controller.transform.PathAddressTransformer;
import org.jboss.as.controller.transform.ResourceTransformer;
/**
* @author Emanuel Muckenhuber
* @author <a href="kabir.khan@jboss.com">Kabir Khan</a>
*/
class ResourceTransformationDescriptionBuilderImpl extends AbstractTransformationDescriptionBuilder implements ResourceTransformationDescriptionBuilder {
private final List<String> discardedOperations = new LinkedList<String>();
private DiscardPolicy discardPolicy = DiscardPolicy.NEVER;
private final AttributeTransformationDescriptionBuilderImpl.AttributeTransformationDescriptionBuilderRegistry registry = new AttributeTransformationDescriptionBuilderImpl.AttributeTransformationDescriptionBuilderRegistry();
protected ResourceTransformationDescriptionBuilderImpl(final PathElement pathElement) {
this(pathElement, PathAddressTransformer.DEFAULT);
}
protected ResourceTransformationDescriptionBuilderImpl(final PathElement pathElement, final PathAddressTransformer pathAddressTransformer) {
this(pathElement, pathAddressTransformer, null);
}
protected ResourceTransformationDescriptionBuilderImpl(PathElement pathElement, DynamicDiscardPolicy dynamicDiscardPolicy) {
this(pathElement, PathAddressTransformer.DEFAULT, dynamicDiscardPolicy);
}
protected ResourceTransformationDescriptionBuilderImpl(final PathElement pathElement,
final PathAddressTransformer pathAddressTransformer, DynamicDiscardPolicy dynamicDiscardPolicy) {
super(pathElement, pathAddressTransformer, ResourceTransformer.DEFAULT, OperationTransformer.DEFAULT,
dynamicDiscardPolicy);
}
@Override
public ResourceTransformationDescriptionBuilder addChildResource(final PathElement pathElement) {
return addChildResource(pathElement, null);
}
@Override
public ResourceTransformationDescriptionBuilder addChildResource(PathElement pathElement, DynamicDiscardPolicy dynamicDiscardPolicy) {
final ResourceTransformationDescriptionBuilderImpl builder = new ResourceTransformationDescriptionBuilderImpl(
pathElement, dynamicDiscardPolicy);
children.add(builder);
return builder;
}
@Override
public ResourceTransformationDescriptionBuilder addChildResource(final ResourceDefinition definition) {
return addChildResource(definition.getPathElement(), null);
}
@Override
public ResourceTransformationDescriptionBuilder addChildResource(ResourceDefinition definition, DynamicDiscardPolicy dynamicDiscardPolicy) {
return addChildResource(definition.getPathElement(), dynamicDiscardPolicy);
}
@Override
public DiscardTransformationDescriptionBuilder discardChildResource(final PathElement pathElement) {
final DiscardTransformationDescriptionBuilder builder = TransformationDescriptionBuilder.Factory.createDiscardInstance(pathElement);
children.add(builder);
return builder;
}
@Override
public RejectTransformationDescriptionBuilder rejectChildResource(PathElement pathElement) {
final RejectTransformationDescriptionBuilder builder = TransformationDescriptionBuilder.Factory.createRejectInstance(pathElement);
children.add(builder);
return builder;
}
@Override
public ResourceTransformationDescriptionBuilder addChildRedirection(final PathElement current, final PathElement legacy) {
return addChildRedirection(current, legacy, null);
}
@Override
public ResourceTransformationDescriptionBuilder addChildRedirection(PathElement current, PathElement legacy, DynamicDiscardPolicy dynamicDiscardPolicy) {
final PathAddressTransformer transformation;
if (legacy.isWildcard()) {
assert current.isWildcard() : "legacy is wildcard while current is not";
transformation = new PathAddressTransformer.ReplaceElementKey(legacy.getKey());
} else {
assert !current.isWildcard() : "legacy is fixed while current is not";
transformation = new PathAddressTransformer.BasicPathAddressTransformer(legacy);
}
return addChildRedirection(current, transformation, dynamicDiscardPolicy);
}
@Override
public ResourceTransformationDescriptionBuilder addChildRedirection(final PathElement oldAddress, final PathAddressTransformer pathAddressTransformer) {
return addChildRedirection(oldAddress, pathAddressTransformer, null);
}
@Override
public ResourceTransformationDescriptionBuilder addChildRedirection(PathElement oldAddress, PathAddressTransformer pathAddressTransformer, DynamicDiscardPolicy dynamicDiscardPolicy) {
final ResourceTransformationDescriptionBuilderImpl builder = new ResourceTransformationDescriptionBuilderImpl(oldAddress, pathAddressTransformer, dynamicDiscardPolicy);
children.add(builder);
return builder;
}
@Override
public ResourceTransformationDescriptionBuilder addChildBuilder(TransformationDescriptionBuilder builder) {
children.add(builder);
return this;
}
@Override
public ResourceTransformationDescriptionBuilder setCustomResourceTransformer(final ResourceTransformer resourceTransformer) {
super.setResourceTransformer(resourceTransformer);
return this;
}
@Override
public TransformationDescription build() {
return buildDefault(discardPolicy, false, registry, discardedOperations);
}
@Override
public OperationTransformationOverrideBuilder addOperationTransformationOverride(final String operationName) {
final OperationTransformationOverrideBuilderImpl transformationBuilder = new OperationTransformationOverrideBuilderImpl(operationName, this);
addOperationTransformerEntry(operationName, new OperationTransformationEntry() {
@Override
OperationTransformer getOperationTransformer(AttributeTransformationDescriptionBuilderImpl.AttributeTransformationDescriptionBuilderRegistry resourceRegistry) {
return transformationBuilder.createTransformer(resourceRegistry);
}
});
return transformationBuilder;
}
@Override
public ResourceTransformationDescriptionBuilder addRawOperationTransformationOverride(final String operationName, final OperationTransformer operationTransformer) {
addOperationTransformerEntry(operationName, new OperationTransformationEntry() {
@Override
OperationTransformer getOperationTransformer(AttributeTransformationDescriptionBuilderImpl.AttributeTransformationDescriptionBuilderRegistry resourceRegistry) {
return operationTransformer;
}
});
return this;
}
@Override
public ConcreteAttributeTransformationDescriptionBuilder getAttributeBuilder() {
return new ConcreteAttributeTransformationDescriptionBuilder(this, registry);
}
@Override
public ResourceTransformationDescriptionBuilder discardOperations(String... operationNames) {
Collections.addAll(discardedOperations, operationNames);
return this;
}
}