package org.jboss.windup.rules.apps.java.xml;
import org.apache.commons.lang3.StringUtils;
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.config.parser.xml.RuleProviderHandler;
import org.jboss.windup.rules.apps.java.condition.annotation.AnnotationCondition;
import org.jboss.windup.rules.apps.java.condition.annotation.AnnotationListCondition;
import org.w3c.dom.Element;
import java.util.List;
import static org.joox.JOOX.$;
/**
* Creates an {@link AnnotationListCondition} for matching on arrays inside of annotations.
*
* Syntax is as follows:
* <pre>
* <annotation-list-condition index="[optional attribute specified an array index]">
* [... list of subconditions that will match against this element ...]
* </annotation-list-condition>
* </pre>
*
* If the index is not specified, the condition will be applied to every item in the array. If the conditions apply
* to any element in the array, then the condition will be matched.
*
* @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a>
*/
@NamespaceElementHandler(elementName = AnnotationListConditionHandler.ANNOTATION_LIST_CONDITION, namespace = RuleProviderHandler.WINDUP_RULE_NAMESPACE)
public class AnnotationListConditionHandler extends AnnotationConditionHandler implements ElementHandler<AnnotationCondition>
{
public static final String ANNOTATION_LIST_CONDITION = "annotation-list";
private static final String INDEX = "index";
@Override
public AnnotationCondition processElement(ParserContext handlerManager, Element element) throws ConfigurationException
{
String indexStr = element.getAttribute(INDEX);
AnnotationListCondition condition;
if (StringUtils.isNotBlank(indexStr))
condition = new AnnotationListCondition(Integer.parseInt(indexStr));
else
condition = new AnnotationListCondition();
List<Element> children = $(element).children().get();
for (Element child : children) {
switch (child.getNodeName()) {
case AnnotationTypeConditionHandler.ANNOTATION_TYPE:
case AnnotationListConditionHandler.ANNOTATION_LIST_CONDITION:
case AnnotationLiteralConditionHandler.ANNOTATION_LITERAL:
AnnotationCondition annotationCondition = handlerManager.processElement(child);
condition.addCondition(annotationCondition);
break;
}
}
return condition;
}
}