package org.jboss.windup.rules.apps.xml.condition; import java.util.List; import java.util.Map; import java.util.logging.Logger; import javax.xml.xpath.XPathFunction; import javax.xml.xpath.XPathFunctionException; import org.jboss.windup.config.GraphRewrite; import org.jboss.windup.util.Logging; import org.jboss.windup.util.xml.XmlUtil; import org.ocpsoft.rewrite.context.EvaluationContext; import org.ocpsoft.rewrite.param.Parameter; import org.ocpsoft.rewrite.param.ParameterStore; import org.ocpsoft.rewrite.param.ParameterizedPatternResult; import org.ocpsoft.rewrite.param.RegexParameterizedPatternParser; import org.w3c.dom.NodeList; public class XmlFileMatchesXPathFunction implements XPathFunction { private static final Logger LOG = Logging.get(XmlFileMatchesXPathFunction.class); private final EvaluationContext context; private final ParameterStore store; private final XmlFileParameterMatchCache paramMatchCache; private final GraphRewrite event; public XmlFileMatchesXPathFunction(EvaluationContext context, ParameterStore store, XmlFileParameterMatchCache paramMatchCache, GraphRewrite event) { this.context = context; this.store = store; this.paramMatchCache = paramMatchCache; this.event = event; } @Override public Object evaluate(@SuppressWarnings("rawtypes") List args) throws XPathFunctionException { int frameIdx = ((Double) args.get(0)).intValue(); NodeList arg1 = (NodeList) args.get(1); String nodeText = XmlUtil.nodeListToString(arg1); String patternString = (String) args.get(2); LOG.fine("matches(" + frameIdx + ", " + nodeText + ", " + patternString + ")"); RegexParameterizedPatternParser paramPattern = new RegexParameterizedPatternParser(patternString); paramPattern.setParameterStore(store); ParameterizedPatternResult referenceResult = paramPattern.parse(nodeText); boolean refMatches = referenceResult.isValid(event, context); if (!refMatches) { return false; } boolean refSubmitOk = true; for (Map.Entry<Parameter<?>, String> paramEntry : referenceResult.getParameters(context).entrySet()) { String name = paramEntry.getKey().getName(); if (!paramMatchCache.checkVariable(frameIdx, name, paramEntry.getValue())) { refSubmitOk = false; break; } } if (!refSubmitOk) { return false; } for (Map.Entry<Parameter<?>, String> paramEntry : referenceResult.getParameters(context).entrySet()) { String name = paramEntry.getKey().getName(); String value = paramEntry.getValue(); paramMatchCache.addVariable(frameIdx, name, value); } return refSubmitOk; } }