package org.jboss.windup.rules.general;
import org.jboss.windup.config.condition.GraphCondition;
import org.jboss.windup.config.exception.ConfigurationException;
import org.jboss.windup.config.parser.ElementHandler;
import org.jboss.windup.config.parser.NamespaceElementHandler;
import org.jboss.windup.config.parser.ParserContext;
import org.jboss.windup.util.exception.WindupException;
import org.w3c.dom.Element;
import java.util.List;
import java.util.regex.Pattern;
import static org.joox.JOOX.$;
/**
* An {@link ElementHandler} for {@link IterableFilter}
*
* Example:
*
* <pre>
* <iterable-filter size="3" >
* <hint ...../>
* </iterable-filter >
* </pre>
*/
@NamespaceElementHandler(elementName = IterableFilterHandler.ELEMENT_NAME, namespace = "http://windup.jboss.org/schema/jboss-ruleset")
public class IterableFilterHandler implements ElementHandler<IterableFilter>
{
public static final String ELEMENT_NAME = "iterable-filter";
public static final String SIZE_ATTRIBUTE = "size";
@Override
public IterableFilter processElement(ParserContext context, Element element) throws ConfigurationException
{
// Read & Validate
String sizeAttr = $(element).attr(SIZE_ATTRIBUTE);
List<Element> children = $(element).children().get();
validateAttributes(sizeAttr);
validateChildren(children);
Element firstChild = children.get(0);
Object wrappedCondition = context.processElement(firstChild);
validateWrappedCondition(wrappedCondition);
// Create the condition
IterableFilter iterableFilter = new IterableFilter(Integer.parseInt(sizeAttr));
for (Element child : children)
{
Object condition = context.processElement(child);
iterableFilter.withWrappedCondition((GraphCondition) condition);
}
return iterableFilter;
}
private void validateWrappedCondition(Object wrappedCondition)
{
if(! (wrappedCondition instanceof GraphCondition)) {
throw new WindupException("The <" + ELEMENT_NAME + "> element must wrap GraphConditions only." );
}
}
private void validateAttributes(String size) throws WindupException{
if(!Pattern.matches("[0-9]+",size)) {
throw new WindupException("The <" + ELEMENT_NAME + "> element's '" +IterableFilterHandler.SIZE_ATTRIBUTE + " attribute is not a valid number." );
}
}
private void validateChildren(List<Element> children) throws WindupException{
if(children.size() != 1) {
throw new WindupException("The <" + ELEMENT_NAME + "> element must have exactly 1 child." );
}
}
}