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);
         }
       }
  
  
  

Reply via email to