001: package net.sf.saxon.xpath;
002:
003: import net.sf.saxon.expr.Expression;
004: import net.sf.saxon.functions.FunctionLibrary;
005: import net.sf.saxon.trans.XPathException;
006:
007: import javax.xml.namespace.QName;
008: import javax.xml.xpath.XPathFunction;
009: import javax.xml.xpath.XPathFunctionResolver;
010:
011: /**
012: * The XPathFunctionLibrary is a FunctionLibrary that supports binding of XPath function
013: * calls to instances of the JAXP XPathFunction interface returned by an XPathFunctionResolver.
014: */
015:
016: public class XPathFunctionLibrary implements FunctionLibrary {
017:
018: private XPathFunctionResolver resolver;
019:
020: /**
021: * Construct a XPathFunctionLibrary
022: */
023:
024: public XPathFunctionLibrary() {
025: }
026:
027: /**
028: * Set the resolver
029: * @param resolver The XPathFunctionResolver wrapped by this FunctionLibrary
030: */
031:
032: public void setXPathFunctionResolver(XPathFunctionResolver resolver) {
033: this .resolver = resolver;
034: }
035:
036: /**
037: * Get the resolver
038: * @return the XPathFunctionResolver wrapped by this FunctionLibrary
039: */
040:
041: public XPathFunctionResolver getXPathFunctionResolver() {
042: return resolver;
043: }
044:
045: /**
046: * Test whether an XPath function with a given name and arity is available. This supports
047: * the function-available() function in XSLT. It is thus never used, and always returns false
048: * @param fingerprint The code that identifies the function name in the NamePool. This must
049: * match the supplied URI and local name.
050: * @param uri The URI of the function name
051: * @param local The local part of the function name
052: * @param arity The number of arguments. This is set to -1 in the case of the single-argument
053: * function-available() function; in this case the method should return true if there is some
054: * matching extension function, regardless of its arity.
055: */
056:
057: public boolean isAvailable(int fingerprint, String uri,
058: String local, int arity) {
059: return false;
060: }
061:
062: /**
063: * Bind a function, given the URI and local parts of the function name,
064: * and the list of expressions supplied as arguments. This method is called at compile
065: * time.
066: * @param nameCode The namepool code of the function name. This must match the supplied
067: * URI and local name.
068: * @param uri The URI of the function name
069: * @param local The local part of the function name
070: * @param staticArgs The expressions supplied statically in the function call. The intention is
071: * that the static type of the arguments (obtainable via getItemType() and getCardinality() may
072: * be used as part of the binding algorithm.
073: * @return An object representing the extension function to be called, if one is found;
074: * null if no extension function was found matching the required name, arity, or signature.
075: */
076:
077: public Expression bind(int nameCode, String uri, String local,
078: Expression[] staticArgs) throws XPathException {
079: if (resolver == null) {
080: return null;
081: }
082: QName name = new QName(uri, local);
083: XPathFunction function = resolver.resolveFunction(name,
084: staticArgs.length);
085: if (function == null) {
086: return null;
087: }
088: XPathFunctionCall fc = new XPathFunctionCall(function);
089: fc.setArguments(staticArgs);
090: return fc;
091: }
092:
093: /**
094: * This method creates a copy of a FunctionLibrary: if the original FunctionLibrary allows
095: * new functions to be added, then additions to this copy will not affect the original, or
096: * vice versa.
097: *
098: * @return a copy of this function library. This must be an instance of the original class.
099: */
100:
101: public FunctionLibrary copy() {
102: XPathFunctionLibrary xfl = new XPathFunctionLibrary();
103: xfl.resolver = resolver;
104: return xfl;
105: }
106:
107: }
108:
109: //
110: // The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License");
111: // you may not use this file except in compliance with the License. You may obtain a copy of the
112: // License at http://www.mozilla.org/MPL/
113: //
114: // Software distributed under the License is distributed on an "AS IS" basis,
115: // WITHOUT WARRANTY OF ANY KIND, either express or implied.
116: // See the License for the specific language governing rights and limitations under the License.
117: //
118: // The Original Code is: all this file.
119: //
120: // The Initial Developer of the Original Code is Michael H. Kay.
121: //
122: // Portions created by (your name) are Copyright (C) (your legal entity). All Rights Reserved.
123: //
124: // Contributor(s): none.
125: //
|