sboag 00/07/30 15:45:17
Modified: java/src/org/apache/xalan/extensions
ExtensionFunctionHandler.java
ExtensionNSHandler.java ExtensionsTable.java
MethodResolver.java XSLTJavaClassEngine.java
Log:
In progress. Working on function overloading stuff.
Revision Changes Path
1.4 +18 -14
xml-xalan/java/src/org/apache/xalan/extensions/ExtensionFunctionHandler.java
Index: ExtensionFunctionHandler.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/extensions/ExtensionFunctionHandler.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- ExtensionFunctionHandler.java 2000/07/05 14:38:05 1.3
+++ ExtensionFunctionHandler.java 2000/07/30 22:45:16 1.4
@@ -63,6 +63,8 @@
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
+import org.w3c.xslt.ExpressionContext;
+
import org.xml.sax.SAXException;
import com.ibm.bsf.BSFException;
@@ -240,7 +242,7 @@
* @param object ignored - should always be null
*/
public Object callJava (Object object, String method, Object[] args,
- Object methodKey)
+ Object methodKey, ExpressionContext exprContext)
throws SAXException
{
// if the function name has a "." in it, then its a static
@@ -279,10 +281,8 @@
// className + "'", e);
throw new SAXException(e);
}
- }
- Object[] convertedArgs = (methodArgs.length > 0)
- ? new Object[methodArgs.length] : null;
-
+ }
+ Object[][] convertedArgs = new Object[1][];
if((null != m_cachedMethods) && !isNew && (null != object))
{
try
@@ -291,9 +291,9 @@
if(null != thisMethod)
{
Class[] paramTypes = thisMethod.getParameterTypes();
- MethodResolver.convertParams(methodArgs, convertedArgs,
paramTypes);
+ MethodResolver.convertParams(methodArgs, convertedArgs,
paramTypes, exprContext);
- return thisMethod.invoke (object, methodArgs);
+ return thisMethod.invoke (object, convertedArgs);
}
}
catch(Exception e)
@@ -313,7 +313,8 @@
// otherwise find and invoke the appropriate method. The method
// searching logic is the same of course.
Constructor c = MethodResolver.getConstructor((Class) object,
- methodArgs,
convertedArgs);
+ methodArgs,
convertedArgs,
+ exprContext);
Object obj = c.newInstance (convertedArgs);
return obj;
}
@@ -322,7 +323,7 @@
Class cl = (object instanceof Class) ? ((Class)object) :
object.getClass();
Method m = MethodResolver.getMethod(cl, method,
methodArgs,
- convertedArgs);
+ convertedArgs, exprContext);
Object returnObj = m.invoke (object, convertedArgs);
if(!isNew)
{
@@ -374,7 +375,8 @@
*/
public Object callFunction (String funcName,
Vector args,
- Object methodKey, Class javaClass)
+ Object methodKey, Class javaClass,
+ ExpressionContext exprContext)
throws SAXException
{
if (!componentStarted)
@@ -455,7 +457,7 @@
}
if(isJava)
- return callJava(javaObject, funcName, argArray, methodKey);
+ return callJava(javaObject, funcName, argArray, methodKey,
exprContext);
else
return e.call (null, funcName, argArray);
}
@@ -483,12 +485,14 @@
/////////////////////////////////////////////////////////////////////////
// Private/Protected Functions
/////////////////////////////////////////////////////////////////////////
-
+
/**
* Tell if we've already initialized the bsf engine.
*/
protected static boolean bsfInitialized = false;
+ protected static Boolean bsfInitSynch = new Boolean(true);
+
/**
* Start the component up by executing any script that needs to run
* at startup time. This needs to happen before any functions can be
@@ -499,9 +503,9 @@
protected void startupComponent (Class classObj)
throws SAXException
{
- if(!bsfInitialized)
+ synchronized(bsfInitSynch)
{
- synchronized(com.ibm.bsf.BSFManager.class)
+ if(!bsfInitialized)
{
bsfInitialized = true;
com.ibm.bsf.BSFManager.registerScriptingEngine ("xslt-javaclass",
1.4 +4 -3
xml-xalan/java/src/org/apache/xalan/extensions/ExtensionNSHandler.java
Index: ExtensionNSHandler.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/extensions/ExtensionNSHandler.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- ExtensionNSHandler.java 2000/07/05 14:38:07 1.3
+++ ExtensionNSHandler.java 2000/07/30 22:45:16 1.4
@@ -267,7 +267,8 @@
Vector argv = new Vector (2);
argv.addElement (xpc);
argv.addElement (element);
- result = super.callFunction (localPart, argv, methodKey, classObj);
+ result = super.callFunction (localPart, argv, methodKey, classObj,
+ transformer.getXPathContext());
}
catch (XPathProcessorException e)
{
@@ -295,9 +296,9 @@
protected void startupComponent (Class classObj)
throws SAXException
{
- if(!bsfInitialized)
+ synchronized(bsfInitSynch)
{
- synchronized(com.ibm.bsf.BSFManager.class)
+ if(!bsfInitialized)
{
bsfInitialized = true;
com.ibm.bsf.BSFManager.registerScriptingEngine ("xslt-javaclass",
1.4 +3 -2
xml-xalan/java/src/org/apache/xalan/extensions/ExtensionsTable.java
Index: ExtensionsTable.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/extensions/ExtensionsTable.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- ExtensionsTable.java 2000/07/05 14:38:08 1.3
+++ ExtensionsTable.java 2000/07/30 22:45:16 1.4
@@ -60,6 +60,7 @@
import java.util.Vector;
import org.apache.xpath.objects.XNull;
import org.apache.xpath.XPathProcessorException;
+import org.w3c.xslt.ExpressionContext;
public class ExtensionsTable
{
@@ -168,7 +169,7 @@
* @return result of executing the function
*/
public Object extFunction (String ns, String funcName, Vector argVec,
- Object methodKey)
+ Object methodKey, ExpressionContext exprContext)
throws org.xml.sax.SAXException
{
if(null == m_extensionFunctionNamespaces.get
("http://xml.apache.org/xslt/java"))
@@ -229,7 +230,7 @@
{
try
{
- result = extNS.callFunction (funcName, argVec, methodKey, null);
+ result = extNS.callFunction (funcName, argVec, methodKey, null,
exprContext);
}
catch (Exception e)
{
1.3 +81 -21
xml-xalan/java/src/org/apache/xalan/extensions/MethodResolver.java
Index: MethodResolver.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/extensions/MethodResolver.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- MethodResolver.java 2000/07/05 14:38:10 1.2
+++ MethodResolver.java 2000/07/30 22:45:16 1.3
@@ -9,6 +9,8 @@
import org.apache.xpath.objects.XObject;
import org.apache.xpath.objects.XString;
+import org.w3c.xslt.ExpressionContext;
+
/**
* Utility class to help resolve method overloading with Xalan XSLT
* argument types.
@@ -29,7 +31,8 @@
*/
public static Constructor getConstructor(Class classObj,
Object[] argsIn,
- Object[] argsOut)
+ Object[][] argsOut,
+ ExpressionContext exprContext)
throws NoSuchMethodException,
SecurityException,
org.xml.sax.SAXException
@@ -43,14 +46,35 @@
{
Constructor ctor = constructors[i];
Class[] paramTypes = ctor.getParameterTypes();
- if(argsIn.length == paramTypes.length)
+ int numberMethodParams = paramTypes.length;
+ int paramStart = 0;
+ boolean isFirstExpressionContext = false;
+ int scoreStart = 0;
+ System.out.println("numberMethodParams: "+numberMethodParams);
+ System.out.println("argsIn.length: "+argsIn.length);
+ System.out.println("exprContext: "+exprContext);
+ if(numberMethodParams == (argsIn.length+1))
+ {
+ Class javaClass = paramTypes[0];
+ System.out.println("first javaClass: "+javaClass.getName());
+ if(javaClass.isAssignableFrom(org.w3c.xslt.ExpressionContext.class))
+ {
+ isFirstExpressionContext = true;
+ scoreStart = 5;
+ paramStart++;
+ System.out.println("Incrementing paramStart: "+paramStart);
+ }
+ }
+ if(argsIn.length == (numberMethodParams - paramStart))
{
// then we have our candidate.
- int score = scoreMatch(paramTypes, argsIn);
+ int score = scoreMatch(paramTypes, paramStart, argsIn, scoreStart);
+ System.out.println("score: "+score);
if(-1 == score)
continue;
if(score < bestScore)
{
+ System.out.println("Assigning best ctor: "+ctor);
bestConstructor = ctor;
bestParamTypes = paramTypes;
bestScore = score;
@@ -61,7 +85,7 @@
if(null == bestConstructor)
throw new NoSuchMethodException(classObj.getName()); // Should give
more info...
else
- convertParams(argsIn, argsOut, bestParamTypes);
+ convertParams(argsIn, argsOut, bestParamTypes, exprContext);
return bestConstructor;
}
@@ -82,7 +106,8 @@
*/
public static Method getMethod(Class classObj, String name,
Object[] argsIn,
- Object[] argsOut)
+ Object[][] argsOut,
+ ExpressionContext exprContext)
throws NoSuchMethodException,
SecurityException,
org.xml.sax.SAXException
@@ -98,10 +123,24 @@
if(method.getName().equals(name))
{
Class[] paramTypes = method.getParameterTypes();
- if(argsIn.length == paramTypes.length)
+ int numberMethodParams = paramTypes.length;
+ int paramStart = 0;
+ boolean isFirstExpressionContext = false;
+ int scoreStart = 0;
+ if(numberMethodParams == (argsIn.length+1))
+ {
+ Class javaClass = paramTypes[0];
+
if(javaClass.isAssignableFrom(org.w3c.xslt.ExpressionContext.class))
+ {
+ isFirstExpressionContext = true;
+ scoreStart = 10;
+ paramStart++;
+ }
+ }
+ if(argsIn.length == (numberMethodParams - paramStart))
{
// then we have our candidate.
- int score = scoreMatch(paramTypes, argsIn);
+ int score = scoreMatch(paramTypes, paramStart, argsIn, scoreStart);
if(-1 == score)
continue;
if(score < bestScore)
@@ -117,7 +156,7 @@
if(null == bestMethod)
throw new NoSuchMethodException(name); // Should give more info...
else
- convertParams(argsIn, argsOut, bestParamTypes);
+ convertParams(argsIn, argsOut, bestParamTypes, exprContext);
return bestMethod;
}
@@ -133,13 +172,29 @@
* exceptions.
*/
public static void convertParams(Object[] argsIn,
- Object[] argsOut, Class[] paramTypes)
+ Object[][] argsOut, Class[] paramTypes,
+ ExpressionContext exprContext)
throws org.xml.sax.SAXException
{
+ System.out.println("In convertParams");
int nMethods = argsIn.length;
- for(int i = 0; i < nMethods; i++)
+ int paramIndex = 0;
+ if((paramTypes.length > 0)
+ &&
paramTypes[0].isAssignableFrom(org.w3c.xslt.ExpressionContext.class))
+ {
+ argsOut[0] = new Object[nMethods+1];
+ argsOut[0][0] = exprContext;
+ System.out.println("Incrementing paramIndex in convertParams:
"+paramIndex);
+ paramIndex++;
+ }
+ else
+ {
+ argsOut[0] = (nMethods > 0) ? new Object[nMethods] : null;
+ }
+
+ for(int i = 0; paramIndex < nMethods; i++, paramIndex++)
{
- argsOut[i] = convert(argsIn[i], paramTypes[i]);
+ argsOut[0][paramIndex] = convert(argsIn[i], paramTypes[paramIndex]);
}
}
@@ -199,8 +254,9 @@
new ConversionInfo(Short.TYPE, 6),
new ConversionInfo(Character.TYPE, 7),
new ConversionInfo(Byte.TYPE, 8),
- new ConversionInfo(java.lang.String.class, 9),
- new ConversionInfo(java.lang.Object.class, 10)
+ new ConversionInfo(Boolean.TYPE, 9),
+ new ConversionInfo(java.lang.String.class, 10),
+ new ConversionInfo(java.lang.Object.class, 11)
};
/**
@@ -216,7 +272,8 @@
new ConversionInfo(Long.TYPE, 3),
new ConversionInfo(Integer.TYPE, 3),
new ConversionInfo(Short.TYPE, 3),
- new ConversionInfo(Byte.TYPE, 3)
+ new ConversionInfo(Byte.TYPE, 3),
+ new ConversionInfo(Boolean.TYPE, 4)
};
/**
@@ -235,7 +292,8 @@
new ConversionInfo(Long.TYPE, 6),
new ConversionInfo(Integer.TYPE, 6),
new ConversionInfo(Short.TYPE, 6),
- new ConversionInfo(Byte.TYPE, 6)
+ new ConversionInfo(Byte.TYPE, 6),
+ new ConversionInfo(Boolean.TYPE, 7)
};
/**
@@ -254,7 +312,8 @@
new ConversionInfo(Long.TYPE, 6),
new ConversionInfo(Integer.TYPE, 6),
new ConversionInfo(Short.TYPE, 6),
- new ConversionInfo(Byte.TYPE, 6)
+ new ConversionInfo(Byte.TYPE, 6),
+ new ConversionInfo(Boolean.TYPE, 7)
};
/**
@@ -285,18 +344,19 @@
* that is closer to zero for more preferred, or further from
* zero for less preferred.
*/
- public static int scoreMatch(Class[] javeParamTypes,
- Object[] xsltArgs)
+ public static int scoreMatch(Class[] javeParamTypes, int paramTypesStart,
+ Object[] xsltArgs, int score)
{
int nParams = xsltArgs.length;
- int score = 0;
- for(int i = 0; i < nParams; i++)
+ for(int i = 0, paramTypesIndex = paramTypesStart;
+ paramTypesIndex < nParams;
+ i++, paramTypesIndex++)
{
Object xsltObj = xsltArgs[i];
int xsltClassType = (xsltObj instanceof XObject)
? ((XObject)xsltObj).getType()
: XObject.CLASS_UNKNOWN;
- Class javaClass = javeParamTypes[i];
+ Class javaClass = javeParamTypes[paramTypesIndex];
if(xsltClassType == XObject.CLASS_NULL)
{
1.3 +4 -4
xml-xalan/java/src/org/apache/xalan/extensions/XSLTJavaClassEngine.java
Index: XSLTJavaClassEngine.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/extensions/XSLTJavaClassEngine.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- XSLTJavaClassEngine.java 2000/06/25 06:35:18 1.2
+++ XSLTJavaClassEngine.java 2000/07/30 22:45:16 1.3
@@ -130,8 +130,7 @@
}
}
- Object[] convertedArgs = (methodArgs.length > 0)
- ? new Object[methodArgs.length] : null;
+ Object[][] convertedArgs = new Object[1][];
try
{
if (isNew)
@@ -140,7 +139,8 @@
// otherwise find and invoke the appropriate method. The method
// searching logic is the same of course.
Constructor c = MethodResolver.getConstructor((Class) object,
- methodArgs,
convertedArgs);
+ methodArgs,
convertedArgs,
+ null);
Object obj = c.newInstance (methodArgs);
return obj;
}
@@ -148,7 +148,7 @@
{
Method m = MethodResolver.getMethod(object.getClass(), method,
methodArgs,
- convertedArgs);
+ convertedArgs, null);
return m.invoke (object, methodArgs);
}
}