blob: c951637cccc8744008c63850f9b7843c12654cc5 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.ode.bpel.elang.xpath20.compiler;
import java.util.List;
import net.sf.saxon.Configuration;
import net.sf.saxon.functions.FunctionLibrary;
import net.sf.saxon.functions.FunctionLibraryList;
import net.sf.saxon.xpath.JAXPXPathStaticContext;
import net.sf.saxon.xpath.XPathFunctionLibrary;
/**
* Hooks on Saxon StandaloneContext to be notified when the compilation
* finds some variables and functions. This allows us to prepare the
* OXpathExpression with variable references and all the things needed
* at runtime.
* @author mriou <mriou at apache dot org>
*/
public class SaxonContext extends JAXPXPathStaticContext {
private JaxpVariableResolver _varResolver;
private JaxpFunctionResolver _funcResolver;
public SaxonContext(Configuration config, JaxpVariableResolver varResolver,
JaxpFunctionResolver funcResolver) {
super(config);
// We need to remove the default XPathFunctionLibrary to replace it
// with our own
List libList = ((FunctionLibraryList)getFunctionLibrary()).libraryList;
XPathFunctionLibrary xpathLib = null;
for (Object lib : libList) {
FunctionLibrary flib = (FunctionLibrary) lib;
if (flib instanceof XPathFunctionLibrary) xpathLib = (XPathFunctionLibrary) flib;
}
if (xpathLib != null) libList.remove(xpathLib);
OdeXPathFunctionLibrary oxpfl = new OdeXPathFunctionLibrary(funcResolver);
oxpfl.setXPathFunctionResolver(funcResolver);
oxpfl.setXPathFunctionResolver(_funcResolver);
((FunctionLibraryList)getFunctionLibrary()).addFunctionLibrary(oxpfl);
setXPathFunctionResolver(funcResolver);
setXPathVariableResolver(varResolver);
_varResolver = varResolver;
_funcResolver = funcResolver;
}
// The following methods don't apply to the JAXPXPathStaticContext interface.
// public Variable declareVariable(String qname, Object initialValue) throws XPathException {
// String prefix;
// String localName;
// final NameChecker checker = getConfiguration().getNameChecker();
// try {
// String[] parts = checker.getQNameParts(qname);
// prefix = parts[0];
// localName = parts[1];
// } catch (QNameException err) {
// throw new StaticError("Invalid QName for variable: " + qname);
// }
// String uri = "";
// if (!("".equals(prefix))) {
// uri = getURIForPrefix(prefix);
// }
//
// _varResolver.resolveVariable(new QName(uri, localName, prefix));
//
// return super.declareVariable(qname, initialValue);
// }
// public VariableReference bindVariable(int fingerprint) throws StaticError {
// String localName = getNamePool().getLocalName(fingerprint);
// String prefix = getNamePool().getPrefix(fingerprint);
// String ns = getNamePool().getURI(fingerprint);
// // The prefix is lost by compilation, hardcoding it from the ns.
// if (Namespaces.ODE_EXTENSION_NS.equals(ns)) prefix = "ode";
// if (prefix != null && prefix.length() > 0) prefix = prefix + ":";
// try {
// declareVariable(prefix + localName, null);
// } catch (XPathException e) {
// throw new StaticError(e);
// }
//// return super.bindVariable(fingerprint);
// return null;
// }
// public VariableReference bindVariable(StructuredQName qName) {
// // The prefix is lost by compilation, hardcoding it from the ns.
// String prefix = qName.getPrefix();
// String ns = qName.getNamespaceURI();
// if (prefix == null && Namespaces.ODE_EXTENSION_NS.equals(ns)) {
// qName = new StructuredQName("ode", ns, qName.getLocalName());
// }
// return super.bindVariable(qName);
// }
}