package org.jboss.windup.config.parser.xml.perform;
import static org.joox.JOOX.$;
import java.util.List;
import org.jboss.windup.config.RuleSubset;
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.RuleHandler;
import org.jboss.windup.config.parser.xml.RuleProviderHandler;
import org.ocpsoft.rewrite.config.ConfigurationBuilder;
import org.ocpsoft.rewrite.config.ConfigurationRuleBuilder;
import org.ocpsoft.rewrite.config.Operation;
import org.ocpsoft.rewrite.config.OperationBuilder;
import org.ocpsoft.rewrite.config.Operations;
import org.w3c.dom.Element;
@NamespaceElementHandler(elementName = "perform", namespace = RuleProviderHandler.WINDUP_RULE_NAMESPACE)
public class PerformHandler implements ElementHandler<Operation>
{
@Override
public Operation processElement(ParserContext handlerManager, Element element) throws ConfigurationException
{
OperationBuilder result = Operations.create();
List<Element> children = $(element).children().get();
for (Element child : children)
{
switch ($(child).tag())
{
// special case to deal with rulesubset (nested rules)
case "rule":
{
// save the parent Rule
ConfigurationRuleBuilder previousRule = handlerManager.getRule();
// create the new (nested) rule
ConfigurationBuilder builder = ConfigurationBuilder.begin();
ConfigurationRuleBuilder newRule = (ConfigurationRuleBuilder) builder.addRule();
handlerManager.setRule(newRule);
RuleHandler.processRuleElement(handlerManager, newRule, child);
// attach this as an operation
Operation operation = RuleSubset.create(builder);
result = result.and(operation);
// set the "current" rule back to the parent rule
handlerManager.setRule(previousRule);
break;
}
default:
{
Operation operation = handlerManager.processElement(child);
result = result.and(operation);
break;
}
}
}
return result;
}
}