FileDocCategorySizeDatePackage
FuncExtFunction.javaAPI DocJava SE 5 API8702Fri Aug 26 14:56:08 BST 2005com.sun.org.apache.xpath.internal.functions

FuncExtFunction

public class FuncExtFunction extends Function
An object of this class represents an extension call expression. When the expression executes, it calls ExtensionsTable#extFunction, and then converts the result to the appropriate XObject.
xsl.usage
advanced

Fields Summary
String
m_namespace
The namespace for the extension function, which should not normally be null or empty.
String
m_extensionName
The local name of the extension.
Object
m_methodKey
Unique method key, which is passed to ExtensionsTable#extFunction in order to allow caching of the method.
Vector
m_argVec
Array of static expressions which represent the parameters to the function.
Constructors Summary
public FuncExtFunction(String namespace, String extensionName, Object methodKey)
Create a new FuncExtFunction based on the qualified name of the extension, and a unique method key.

param
namespace The namespace for the extension function, which should not normally be null or empty.
param
extensionName The local name of the extension.
param
methodKey Unique method key, which is passed to ExtensionsTable#extFunction in order to allow caching of the method.

    //try{throw new Exception("FuncExtFunction() " + namespace + " " + extensionName);} catch (Exception e){e.printStackTrace();}
    m_namespace = namespace;
    m_extensionName = extensionName;
    m_methodKey = methodKey;
  
Methods Summary
public voidcallArgVisitors(com.sun.org.apache.xpath.internal.XPathVisitor visitor)
Call the visitors for the function arguments.

      for (int i = 0; i < m_argVec.size(); i++)
      {
         Expression exp = (Expression)m_argVec.elementAt(i);
         exp.callVisitors(new ArgExtOwner(exp), visitor);
      }
    
  
public voidcheckNumberArgs(int argNum)
Check that the number of arguments passed to this function is correct.

param
argNum The number of arguments that is being passed to the function.
throws
WrongNumberArgsException

public com.sun.org.apache.xpath.internal.objects.XObjectexecute(com.sun.org.apache.xpath.internal.XPathContext xctxt)
Execute the function. The function must return a valid object.

param
xctxt The current execution context.
return
A valid XObject.
throws
javax.xml.transform.TransformerException


    XObject result;
    Vector argVec = new Vector();
    int nArgs = m_argVec.size();

    for (int i = 0; i < nArgs; i++)
    {
      Expression arg = (Expression) m_argVec.elementAt(i);
      
      XObject xobj = arg.execute(xctxt);
      /*
       * Should cache the arguments for func:function
       */
      xobj.allowDetachToRelease(false); 
      argVec.addElement(xobj);
    }
    //dml
    ExtensionsProvider extProvider = (ExtensionsProvider)xctxt.getOwnerObject();
    Object val = extProvider.extFunction(this, argVec);

    if (null != val)
    {
      result = XObject.create(val, xctxt);
    }
    else
    {
      result = new XNull();
    }

    return result;
  
public voidexprSetParent(com.sun.org.apache.xpath.internal.ExpressionNode n)
Set the parent node. For an extension function, we also need to set the parent node for all argument expressions.

param
n The parent node

	
    super.exprSetParent(n);
      
    int nArgs = m_argVec.size();

    for (int i = 0; i < nArgs; i++)
    {
      Expression arg = (Expression) m_argVec.elementAt(i);

      arg.exprSetParent(n);
    }		
  
public voidfixupVariables(java.util.Vector vars, int globalsSize)
This function is used to fixup variables from QNames to stack frame indexes at stylesheet build time.

param
vars List of QNames that correspond to variables. This list should be searched backwards for the first qualified name that corresponds to the variable reference qname. The position of the QName in the vector from the start of the vector will be its position in the stack frame (but variables above the globalsTop value will need to be offset to the current stack frame). NEEDSDOC @param globalsSize


                                                                                            
       
  

    if (null != m_argVec)
    {
      int nArgs = m_argVec.size();

      for (int i = 0; i < nArgs; i++)
      {
        Expression arg = (Expression) m_argVec.elementAt(i);

        arg.fixupVariables(vars, globalsSize);
      }
    }
  
public com.sun.org.apache.xpath.internal.ExpressiongetArg(int n)
Return the nth argument passed to the extension function.

param
n The argument number index.
return
The Expression object at the given index.

    if (n >= 0 && n < m_argVec.size())
      return (Expression) m_argVec.elementAt(n);
    else
      return null;
  
public intgetArgCount()
Return the number of arguments that were passed into this extension function.

return
The number of arguments.

    return m_argVec.size();
  
public java.lang.StringgetFunctionName()
Return the name of the extension function.

return
The name of the extension function.

    return m_extensionName;
  
public java.lang.ObjectgetMethodKey()
Return the method key of the extension function.

return
The method key of the extension function.

    return m_methodKey;
  
public java.lang.StringgetNamespace()
Return the namespace of the extension function.

return
The namespace of the extension function.

    return m_namespace;
  
protected voidreportWrongNumberArgs()
Constructs and throws a WrongNumberArgException with the appropriate message for this function object. This class supports an arbitrary number of arguments, so this method must never be called.

throws
WrongNumberArgsException

    String fMsg = XSLMessages.createXPATHMessage(
        XPATHErrorResources.ER_INCORRECT_PROGRAMMER_ASSERTION,
        new Object[]{ "Programmer's assertion:  the method FunctionMultiArgs.reportWrongNumberArgs() should never be called." });

    throw new RuntimeException(fMsg);
  
public voidsetArg(com.sun.org.apache.xpath.internal.Expression arg, int argNum)
Set an argument expression for a function. This method is called by the XPath compiler.

param
arg non-null expression that represents the argument.
param
argNum The argument number index.
throws
WrongNumberArgsException If the argNum parameter is beyond what is specified for this function.

    m_argVec.addElement(arg);