package org.jboss.windup.config.parser.xml.perform; import static org.joox.JOOX.$; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.jboss.windup.config.exception.ConfigurationException; import org.jboss.windup.config.operation.Iteration; import org.jboss.windup.config.operation.iteration.IterationBuilderOtherwise; import org.jboss.windup.config.operation.iteration.IterationBuilderOver; import org.jboss.windup.config.operation.iteration.IterationBuilderPerform; 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.ocpsoft.rewrite.config.Condition; import org.ocpsoft.rewrite.config.Operation; import org.ocpsoft.rewrite.config.Perform; import org.w3c.dom.Element; /** * Parses the "iteration" element to produce {@link Iteration} {@link Operation}s. * * @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a> */ @NamespaceElementHandler(elementName = "iteration", namespace = RuleProviderHandler.WINDUP_RULE_NAMESPACE) public class IterationHandler implements ElementHandler<Iteration> { @Override public Iteration processElement(ParserContext handlerManager, Element element) throws ConfigurationException { String overVar = $(element).attr("over"); IterationBuilderOver iterationOver = StringUtils.isEmpty(overVar) ? Iteration.over() : Iteration.over(overVar); List<Element> children = $(element).children().get(); List<Operation> operations = new ArrayList<>(children.size()); List<Operation> otherwise = new ArrayList<>(); for (Element child : children) { if (null != child.getNodeName()) switch (child.getNodeName()) { case "when": List<Element> whenElements = $(child).children().get(); for (Element whenElement : whenElements) { Object object = handlerManager.processElement(whenElement); if (object instanceof Condition) { iterationOver.when((Condition) object); } } break; case "perform": List<Element> performElements = $(child).children().get(); for (Element performElement : performElements) { Object object = handlerManager.processElement(performElement); if (object instanceof Operation) { operations.add((Operation) object); } } break; case "otherwise": List<Element> otherwiseElements = $(child).children().get(); for (Element otherwiseElement : otherwiseElements) { Object object = handlerManager.processElement(otherwiseElement); if (object instanceof Operation) { otherwise.add((Operation) object); } } break; default: Object object = handlerManager.processElement(child); if (object instanceof Operation) { operations.add((Operation) object); } else if (object instanceof Condition) { iterationOver.when((Condition) object); } break; } } IterationBuilderPerform iterationBuilderPerform = iterationOver.perform(operations .toArray(new Operation[operations.size()])); if (otherwise.size() > 0) { IterationBuilderOtherwise iterationBuilderOtherwise = iterationBuilderPerform.otherwise(Perform .all(otherwise.toArray(new Operation[otherwise.size()]))); return (Iteration) iterationBuilderOtherwise; } return (Iteration) iterationBuilderPerform; } }