net.sf.saxon.lib
Class ExtensionFunctionCall

java.lang.Object
  extended by net.sf.saxon.lib.ExtensionFunctionCall
All Implemented Interfaces:
Serializable
Direct Known Subclasses:
DynamicFunctionCallDefinition.DynamicFunctionCall, Evaluate.EvaluateCall, GeneralFilterFunction.GeneralFilterFunctionCall, Parse.ParseCall

public abstract class ExtensionFunctionCall
extends Object
implements Serializable

This abstract class is provided to allow user-written extension functions to be implemented with the full capabilities of functions that are an intrinsic part of the Saxon product. In particular, the class has the opportunity to save data from the static context and to optimize itself at compile time.

Instances of this class are created by calling the method makeCallExpression() on the ExtensionFunctionDefinition object that represents the definition of the function.

The compiler will create one instance of this class for each function call appearing in the expression being compiled. The class must therefore have a public zero-argument constructor.

The compiler will ensure that the supplied arguments in the extension function call are converted if necessary to the declared argument types, by applying the standard conversion rules. The result returned by the function is checked against the declared return type, but no conversion takes place: the returned value must strictly conform to the declared type.

Note that an IntegratedFunction is trusted; calls are allowed even if the configuration option FeatureKeys.ALLOW_EXTERNAL_FUNCTIONS is false. In cases where an IntegratedFunction is used to load and execute untrusted code, it should check this configuration option before doing so.

Since:
9.2
See Also:
Serialized Form

Constructor Summary
ExtensionFunctionCall()
           
 
Method Summary
abstract  SequenceIterator call(SequenceIterator[] arguments, XPathContext context)
          Evaluate this function call at run-time
 void copyLocalData(ExtensionFunctionCall destination)
          Copy local data from one copy of the function to another.
 boolean effectiveBooleanValue(SequenceIterator[] arguments, XPathContext context)
          Compute the effective boolean value of the result.
 Container getContainer()
          Get the container of the expression.
 ExtensionFunctionDefinition getDefinition()
          Get the definition of this extension function
 Executable getExecutable()
          Get the Executable in which this extension function call occurs
 Expression rewrite(StaticContext context, Expression[] arguments)
          Rewrite the function call.
 void setDefinition(ExtensionFunctionDefinition definition, Container container)
          This method is called by the system to provide information about the extension function call.
 void supplyStaticContext(StaticContext context, int locationId, Expression[] arguments)
          Supply static context information.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

ExtensionFunctionCall

public ExtensionFunctionCall()
Method Detail

setDefinition

public final void setDefinition(ExtensionFunctionDefinition definition,
                                Container container)
This method is called by the system to provide information about the extension function call. It should not be called by the implementor of the extension function.

Parameters:
definition - the extension function definition
container - the container of the extension function call, providing access to location information

getDefinition

public final ExtensionFunctionDefinition getDefinition()
Get the definition of this extension function

Returns:
the function definition from which this ExtensionFunctionCall was created

getExecutable

public final Executable getExecutable()
Get the Executable in which this extension function call occurs

Returns:
the containing executable
Since:
9.3

getContainer

public final Container getContainer()
Get the container of the expression. This provides information about the location of the expression (potentially useful for diagnostics). Any new expression that is created while rewriting this expression should have the same container assigned.

Returns:
the container of the extension function call expression
Since:
9.3

supplyStaticContext

public void supplyStaticContext(StaticContext context,
                                int locationId,
                                Expression[] arguments)
                         throws XPathException
Supply static context information.

This method is called during compilation to provide information about the static context in which the function call appears. If the implementation of the function needs information from the static context, then it should save it now, as it will not be available later at run-time.

The implementation also has the opportunity to examine the expressions that appear in the arguments to the function call at this stage. These might already have been modified from the original expressions as written by the user. The implementation must not modify any of these expressions.

The default implementation of this method does nothing.

Parameters:
context - The static context in which the function call appears. The method must not modify the static context.
locationId - An integer code representing the location of the call to the extension function in the stylesheet; can be used in conjunction with the locationMap held in the static context for diagnostics
arguments - The XPath expressions supplied in the call to this function. The method must not modify this array, or any of the expressions contained in the array.
Throws:
XPathException - if the implementation is able to detect a static error in the way the function is being called (for example it might require that the types of the arguments are consistent with each other).

rewrite

public Expression rewrite(StaticContext context,
                          Expression[] arguments)
                   throws XPathException
Rewrite the function call. This method is called at compile time. It gives the implementation an opportunity to replace itself with an optimized implementation that returns the same result. This includes the ability to pre-evaluate the function and return its result as a literal value.

There is also a further opportunity to perform static checking at this stage and to throw an error if the arguments are invalid.

Parameters:
context - The static context in which the function call appears. The method must not modify the static context.
arguments - The XPath expressions supplied in the call to this function. This method is called after type-checking, so these expressions may have been modified by adding atomization operators or type-checking operations, for example.
Returns:
an expression to be evaluated at run-time in place of this function call. Return null if no rewriting is required and the function call should be used unchanged. Return a Literal representing the result of the function call if the function call can be precomputed at compile time
Throws:
XPathException - if the implementation is able to detect a static error in the way the function is being called (for example it might require that the types of the arguments are consistent with each other).

copyLocalData

public void copyLocalData(ExtensionFunctionCall destination)
Copy local data from one copy of the function to another. This method must be implemented in any implementation that maintains local data retained from the static context; the job of the method is to copy this local data to the supplied destination function.

This method is called if a call to the extension function needs to be copied during the process of optimization. For example, this occurs if the function containing the call to the extension function is inlined.

If any objects held as local data for the function call are mutable then deep copies must be made.

Parameters:
destination - the function to which the local data must be copied. This will always be an instance of the same function class as the source function.

call

public abstract SequenceIterator call(SequenceIterator[] arguments,
                                      XPathContext context)
                               throws XPathException
Evaluate this function call at run-time

Parameters:
arguments - The values of the arguments to the function call. Each argument value (which is in general a sequence) is supplied in the form of an iterator over the items in the sequence. If required, the supplied sequence can be materialized by calling, for example, new SequenceExtent(arguments[i]). If the argument is always a singleton, then the single item may be obtained by calling arguments[i].next(). The implementation is not obliged to read all the items in each SequenceIterator if they are not required to compute the result; but if any SequenceIterator is not read to completion, it is good practice to call its close() method.
context - The XPath dynamic evaluation context
Returns:
an iterator over the results of the function. If the result is a single item, it can be returned in the form of a SingletonIterator. If the result is an empty sequence, the method should return EmptyIterator.getInstance()
Throws:
XPathException - if a dynamic error occurs during evaluation of the function. The Saxon run-time code will add information about the error location.

effectiveBooleanValue

public boolean effectiveBooleanValue(SequenceIterator[] arguments,
                                     XPathContext context)
                              throws XPathException
Compute the effective boolean value of the result.

Implementations can override this method but are not required to do so. If it is overridden, the result must be consistent with the rules for calculating effective boolean value. The method should be implemented in cases where computing the effective boolean value is significantly cheaper than computing the full result.

Parameters:
context - The XPath dynamic evaluation context
arguments - The values of the arguments to the function call. Each argument value (which is in general a sequence) is supplied in the form of an iterator over the items in the sequence. If required, the supplied sequence can be materialized by calling, for example, new SequenceExtent(arguments[i]). If the argument is always a singleton, then the single item may be obtained by calling arguments[i].next(). The implementation is not obliged to read all the items in each SequenceIterator if they are not required to compute the result; but if any SequenceIterator is not read to completion, it is good practice to call its close() method.
Returns:
the effective boolean value of the result
Throws:
XPathException - if a dynamic error occurs during evaluation of the function. The Saxon run-time code will add information about the error location.


Copyright (c) 2004-2010 Saxonica Limited. All rights reserved.