package org.apache.synapse.util.xpath;

import org.apache.synapse.MessageContext;
import org.apache.synapse.SynapseConstants;
import org.apache.synapse.SynapseException;
import org.jaxen.UnresolvableException;
import org.jaxen.VariableContext;

import javax.xml.namespace.QName;
import javax.xml.xpath.XPathVariableResolver;

public class DOMSynapseXPathVariableResolver implements XPathVariableResolver {

    MessageContext synCtx;
    VariableContext parentVariableContext;

    public DOMSynapseXPathVariableResolver(VariableContext parentVariableContext, MessageContext synCtx) {
        this.parentVariableContext = parentVariableContext;
        this.synCtx = synCtx;
    }

    public Object resolveVariable(QName variable) {

        try {
            SynapseXPathVariableContext variableContext = new SynapseXPathVariableContext(
                    parentVariableContext, synCtx);
            return variableContext.getVariableValue(SynapseConstants.SYNAPSE_NAMESPACE.equals(
                    variable.getNamespaceURI())?null:variable.getNamespaceURI()
                    , variable.getPrefix(), variable.getLocalPart());
        } catch (UnresolvableException e) {
            throw new SynapseException("DOM Synapse XPATH variable resolution failed",e);
        }
    }

    public void setSynCtx(MessageContext synCtx) {
        this.synCtx = synCtx;
    }
}
