package org.jboss.windup.rules.apps.java.xml;
import static org.joox.JOOX.$;
import java.util.List;
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.AnnotationTypeCondition;
import org.jboss.windup.util.exception.WindupException;
import org.w3c.dom.Element;
/**
* Creates an {@link AnnotationTypeCondition} for matching on arrays inside of annotations.
*
* Syntax is as follows:
* <pre>
* <annotation-type pattern="class name pattern">
* [... subconditions that will match against annotation elements ...]
* </annotation-type>
* </pre>
*
* @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a>
*/
@NamespaceElementHandler(elementName = AnnotationTypeConditionHandler.ANNOTATION_TYPE, namespace = RuleProviderHandler.WINDUP_RULE_NAMESPACE)
public class AnnotationTypeConditionHandler extends AnnotationConditionHandler implements ElementHandler<AnnotationTypeCondition>
{
public static final String ANNOTATION_TYPE = "annotation-type";
private static final String PATTERN = "pattern";
@Override
public AnnotationTypeCondition processElement(ParserContext handlerManager, Element element) throws ConfigurationException
{
String pattern = element.getAttribute(PATTERN);
if (StringUtils.isBlank(pattern))
throw new WindupException("Element: " + ANNOTATION_TYPE + " requires a " + PATTERN + " attribute!");
AnnotationTypeCondition condition = new AnnotationTypeCondition(pattern);
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:
String name = child.getAttribute(AnnotationConditionHandler.NAME);
AnnotationCondition annotationCondition = handlerManager.processElement(child);
condition.addCondition(name, annotationCondition);
break;
}
}
return condition;
}
}