org.apache.xalan.extensions
Class MethodResolver

java.lang.Object
  extended by org.apache.xalan.extensions.MethodResolver

public class MethodResolver
extends java.lang.Object

Utility class to help resolve method overloading with Xalan XSLT argument types.


Nested Class Summary
(package private) static class MethodResolver.ConversionInfo
          Simple class to hold information about allowed conversions and their relative scores, for use by the table below.
 
Field Summary
static int DYNAMIC
          Specifies a Dynamic method search.
static int INSTANCE_ONLY
          Specifies a search for instance methods only.
private static MethodResolver.ConversionInfo[] m_booleanConversions
          Specification of conversions from XSLT type CLASS_BOOLEAN to allowed Java types.
private static MethodResolver.ConversionInfo[][] m_conversions
          Order is significant in the list below, based on XObject.CLASS_XXX values.
private static MethodResolver.ConversionInfo[] m_javaObjConversions
          Specification of conversions from XSLT type CLASS_UNKNOWN (i.e.
private static MethodResolver.ConversionInfo[] m_nodesetConversions
          Specification of conversions from XSLT type CLASS_NODESET to allowed Java types.
private static MethodResolver.ConversionInfo[] m_numberConversions
          Specification of conversions from XSLT type CLASS_NUMBER to allowed Java types.
private static MethodResolver.ConversionInfo[] m_rtfConversions
          Specification of conversions from XSLT type CLASS_RTREEFRAG to allowed Java types.
private static MethodResolver.ConversionInfo[] m_stringConversions
          Specification of conversions from XSLT type CLASS_STRING to allowed Java types.
private static int SCOREBASE
           
static int STATIC_AND_INSTANCE
          Specifies a search for both static and instance methods.
static int STATIC_ONLY
          Specifies a search for static methods only.
 
Constructor Summary
MethodResolver()
           
 
Method Summary
(package private) static java.lang.Object convert(java.lang.Object xsltObj, java.lang.Class javaClass)
          Convert the given XSLT object to an object of the given class.
(package private) static java.lang.Object convertDoubleToNumber(double num, java.lang.Class javaClass)
          Do a standard conversion of a double to the specified type.
static void convertParams(java.lang.Object[] argsIn, java.lang.Object[][] argsOut, java.lang.Class[] paramTypes, ExpressionContext exprContext)
          Convert a set of parameters based on a set of paramTypes.
private static java.lang.String errArgs(java.lang.Object[] xsltArgs, int startingArg)
           
private static java.lang.String errString(java.lang.String callType, java.lang.String searchType, java.lang.Class classObj, java.lang.String funcName, int searchMethod, java.lang.Object[] xsltArgs)
          Format the message for the NoSuchMethodException containing all the information about the method we're looking for.
static java.lang.reflect.Constructor getConstructor(java.lang.Class classObj, java.lang.Object[] argsIn, java.lang.Object[][] argsOut, ExpressionContext exprContext)
          Given a class, figure out the resolution of the Java Constructor from the XSLT argument types, and perform the conversion of the arguments.
static java.lang.reflect.Method getElementMethod(java.lang.Class classObj, java.lang.String name)
          Given the name of a method, figure out the resolution of the Java Method
static java.lang.reflect.Method getMethod(java.lang.Class classObj, java.lang.String name, java.lang.Object[] argsIn, java.lang.Object[][] argsOut, ExpressionContext exprContext, int searchMethod)
          Given the name of a method, figure out the resolution of the Java Method from the XSLT argument types, and perform the conversion of the arguments.
private static java.lang.String replaceDash(java.lang.String name)
          To support EXSLT extensions, convert names with dash to allowable Java names: e.g., convert abc-xyz to abcXyz.
static int scoreMatch(java.lang.Class[] javaParamTypes, int javaParamsStart, java.lang.Object[] xsltArgs, int score)
          Score the conversion of a set of XSLT arguments to a given set of Java parameters.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

STATIC_ONLY

public static final int STATIC_ONLY
Specifies a search for static methods only.

See Also:
Constant Field Values

INSTANCE_ONLY

public static final int INSTANCE_ONLY
Specifies a search for instance methods only.

See Also:
Constant Field Values

STATIC_AND_INSTANCE

public static final int STATIC_AND_INSTANCE
Specifies a search for both static and instance methods.

See Also:
Constant Field Values

DYNAMIC

public static final int DYNAMIC
Specifies a Dynamic method search. If the method being evaluated is a static method, all arguments are used. Otherwise, it is an instance method and only arguments beginning with the second argument are used.

See Also:
Constant Field Values

SCOREBASE

private static final int SCOREBASE
See Also:
Constant Field Values

m_javaObjConversions

private static final MethodResolver.ConversionInfo[] m_javaObjConversions
Specification of conversions from XSLT type CLASS_UNKNOWN (i.e. some unknown Java object) to allowed Java types.


m_booleanConversions

private static final MethodResolver.ConversionInfo[] m_booleanConversions
Specification of conversions from XSLT type CLASS_BOOLEAN to allowed Java types.


m_numberConversions

private static final MethodResolver.ConversionInfo[] m_numberConversions
Specification of conversions from XSLT type CLASS_NUMBER to allowed Java types.


m_stringConversions

private static final MethodResolver.ConversionInfo[] m_stringConversions
Specification of conversions from XSLT type CLASS_STRING to allowed Java types.


m_rtfConversions

private static final MethodResolver.ConversionInfo[] m_rtfConversions
Specification of conversions from XSLT type CLASS_RTREEFRAG to allowed Java types.


m_nodesetConversions

private static final MethodResolver.ConversionInfo[] m_nodesetConversions
Specification of conversions from XSLT type CLASS_NODESET to allowed Java types. (This is the same as for CLASS_RTREEFRAG)


m_conversions

private static final MethodResolver.ConversionInfo[][] m_conversions
Order is significant in the list below, based on XObject.CLASS_XXX values.

Constructor Detail

MethodResolver

public MethodResolver()
Method Detail

getConstructor

public static java.lang.reflect.Constructor getConstructor(java.lang.Class classObj,
                                                           java.lang.Object[] argsIn,
                                                           java.lang.Object[][] argsOut,
                                                           ExpressionContext exprContext)
                                                    throws java.lang.NoSuchMethodException,
                                                           java.lang.SecurityException,
                                                           javax.xml.transform.TransformerException
Given a class, figure out the resolution of the Java Constructor from the XSLT argument types, and perform the conversion of the arguments.

Parameters:
classObj - the Class of the object to be constructed.
argsIn - An array of XSLT/XPath arguments.
argsOut - An array of the exact size as argsIn, which will be populated with converted arguments if a suitable method is found.
Returns:
A constructor that will work with the argsOut array.
Throws:
javax.xml.transform.TransformerException - may be thrown for Xalan conversion exceptions.
java.lang.NoSuchMethodException
java.lang.SecurityException

getMethod

public static java.lang.reflect.Method getMethod(java.lang.Class classObj,
                                                 java.lang.String name,
                                                 java.lang.Object[] argsIn,
                                                 java.lang.Object[][] argsOut,
                                                 ExpressionContext exprContext,
                                                 int searchMethod)
                                          throws java.lang.NoSuchMethodException,
                                                 java.lang.SecurityException,
                                                 javax.xml.transform.TransformerException
Given the name of a method, figure out the resolution of the Java Method from the XSLT argument types, and perform the conversion of the arguments.

Parameters:
classObj - The Class of the object that should have the method.
name - The name of the method to be invoked.
argsIn - An array of XSLT/XPath arguments.
argsOut - An array of the exact size as argsIn, which will be populated with converted arguments if a suitable method is found.
Returns:
A method that will work with the argsOut array.
Throws:
javax.xml.transform.TransformerException - may be thrown for Xalan conversion exceptions.
java.lang.NoSuchMethodException
java.lang.SecurityException

replaceDash

private static java.lang.String replaceDash(java.lang.String name)
To support EXSLT extensions, convert names with dash to allowable Java names: e.g., convert abc-xyz to abcXyz. Note: dashes only appear in middle of an EXSLT function or element name.


getElementMethod

public static java.lang.reflect.Method getElementMethod(java.lang.Class classObj,
                                                        java.lang.String name)
                                                 throws java.lang.NoSuchMethodException,
                                                        java.lang.SecurityException,
                                                        javax.xml.transform.TransformerException
Given the name of a method, figure out the resolution of the Java Method

Parameters:
classObj - The Class of the object that should have the method.
name - The name of the method to be invoked.
Returns:
A method that will work to be called as an element.
Throws:
javax.xml.transform.TransformerException - may be thrown for Xalan conversion exceptions.
java.lang.NoSuchMethodException
java.lang.SecurityException

convertParams

public static void convertParams(java.lang.Object[] argsIn,
                                 java.lang.Object[][] argsOut,
                                 java.lang.Class[] paramTypes,
                                 ExpressionContext exprContext)
                          throws javax.xml.transform.TransformerException
Convert a set of parameters based on a set of paramTypes.

Parameters:
argsIn - An array of XSLT/XPath arguments.
argsOut - An array of the exact size as argsIn, which will be populated with converted arguments.
paramTypes - An array of class objects, of the exact same size as argsIn and argsOut.
Throws:
javax.xml.transform.TransformerException - may be thrown for Xalan conversion exceptions.

scoreMatch

public static int scoreMatch(java.lang.Class[] javaParamTypes,
                             int javaParamsStart,
                             java.lang.Object[] xsltArgs,
                             int score)
Score the conversion of a set of XSLT arguments to a given set of Java parameters. If any invocations of this function for a method with the same name return the same positive value, then a conflict has occured, and an error should be signaled.

Parameters:
javaParamTypes - Must be filled with valid class names, and of the same length as xsltArgs.
xsltArgs - Must be filled with valid object instances, and of the same length as javeParamTypes.
Returns:
-1 for no allowed conversion, or a positive score that is closer to zero for more preferred, or further from zero for less preferred.

convert

static java.lang.Object convert(java.lang.Object xsltObj,
                                java.lang.Class javaClass)
                         throws javax.xml.transform.TransformerException
Convert the given XSLT object to an object of the given class.

Parameters:
xsltObj - The XSLT object that needs conversion.
javaClass - The type of object to convert to.
Throws:
javax.xml.transform.TransformerException - may be thrown for Xalan conversion exceptions.

convertDoubleToNumber

static java.lang.Object convertDoubleToNumber(double num,
                                              java.lang.Class javaClass)
Do a standard conversion of a double to the specified type.

Parameters:
num - The number to be converted.
javaClass - The class type to be converted to.
Returns:
An object specified by javaClass, or a Double instance.

errString

private static java.lang.String errString(java.lang.String callType,
                                          java.lang.String searchType,
                                          java.lang.Class classObj,
                                          java.lang.String funcName,
                                          int searchMethod,
                                          java.lang.Object[] xsltArgs)
Format the message for the NoSuchMethodException containing all the information about the method we're looking for.


errArgs

private static java.lang.String errArgs(java.lang.Object[] xsltArgs,
                                        int startingArg)