You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by sb...@locus.apache.org on 2000/08/01 00:11:36 UTC

cvs commit: xml-xalan/java/src/org/apache/xalan/extensions ExtensionFunctionHandler.java ExtensionNSHandler.java ExtensionsTable.java MethodResolver.java

sboag       00/07/31 15:11:35

  Modified:    java/src/org/apache/xalan/extensions
                        ExtensionFunctionHandler.java
                        ExtensionNSHandler.java ExtensionsTable.java
                        MethodResolver.java
  Log:
  Fix problems with calling extension elements, method overloading.  More work to come...
  
  Revision  Changes    Path
  1.6       +51 -30    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.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- ExtensionFunctionHandler.java	2000/07/31 03:53:49	1.5
  +++ ExtensionFunctionHandler.java	2000/07/31 22:11:30	1.6
  @@ -171,9 +171,8 @@
     public void setElements (String elemNames) 
     {
       if (elemNames == null) 
  -    {
         return;
  -    }
  +
       StringTokenizer st = new StringTokenizer (elemNames, " \t\n\r", false);
       Object junk = new Object ();
       while (st.hasMoreTokens ()) 
  @@ -342,6 +341,7 @@
       }
       catch (Exception e) 
       {
  +      e.printStackTrace();
         throw new SAXException(e);
         /*
         Throwable t = (e instanceof InvocationTargetException) ?
  @@ -417,69 +417,78 @@
             }
             javaObject = null;
             hasCalledCTor = true;
  +          
  +          for (int i = 0; i < argArray.length; i++) 
  +          {
  +            Object o = args.elementAt (i);
  +            argArray[i] = o;
  +          }
  +
           }
           else
           {
             if(!hasCalledCTor)
             {
  +            // System.out.println("this.classObject: "+this.classObject);
               if(null == javaObject)
               {
  -              javaObject = this.classObject.newInstance();
  +              if(null != this.classObject)
  +                javaObject = this.classObject.newInstance();
  +              else
  +                javaObject = this.classObject;
               }
               
               argArray = new Object[args.size () + 1];
               
               argArray[0] = javaObject;
  -            argStart = 1;
  -            // argArray = new Object[args.size ()];
  -            // argStart = 0;
  +            
  +            for (int i = 0; i < args.size(); i++) 
  +            {
  +              Object o = args.elementAt (i);
  +              argArray[i+1] = o;
  +            }
             }
             else
             {
  -            argArray = new Object[args.size ()];
               if(args.size() > 0)
               {
  +              argArray = new Object[args.size ()];
                 Object o = args.elementAt (0);
                 argArray[0] = (o instanceof XObject) ? ((XObject)o).object () : o;
  -              argStart = 1;
  +              for (int i = 1; i < args.size(); i++) 
  +              {
  +                o = args.elementAt (i);
  +                argArray[i] = o;
  +              }
               }
               else
  -              argStart = 0;
  +            {
  +              argArray = new Object[1];
  +              Object o = args.elementAt (0);
  +              argArray[0] = (o instanceof XObject) ? ((XObject)o).object () : o;
  +            }
             }
           }
  +        return callJava(javaObject, funcName, argArray, methodKey, exprContext);
         }
         else 
         {
           e = ((com.ibm.bsf.BSFManager)mgr).loadScriptingEngine (scriptLang);
           argArray = new Object[args.size ()];
  -        argStart = 0;
  -      }
  -
  -      if(isJava)
  -      {
  -        // TODO: Fix all this.
  -        for (int i = argStart; i < args.size (); i++) 
  -        {
  -          Object o = args.elementAt (i);
  -          argArray[i] = o;
  -        }
  -        return callJava(javaObject, funcName, argArray, methodKey, exprContext);
  -      }
  -      else
  -      {
  -        // convert the xobject args to their object forms
  +        
           for (int i = 0; i < args.size (); i++) 
           {
             Object o = args.elementAt (i);
  -          argArray[i+argStart] = 
  -                                (o instanceof XObject) ? ((XObject)o).object () : o;
  +          argArray[i] = (o instanceof XObject) ? ((XObject)o).object () : o;
           }
           
           return e.call (null, funcName, argArray);
         }
  +
       }
       catch (Exception e) 
       {
  +      e.printStackTrace();
         String msg = e.getMessage();
         if(null != msg)
         {
  @@ -544,8 +553,11 @@
         }
         return;
       }
  -    else
  +    else // classObj = null
       {
  +      if(null == scriptSrcURL)
  +        scriptSrcURL = namespaceUri; // Use the namespace URL
  +
         if (scriptLang.equals ("javaclass") && (scriptSrcURL != null)) 
         {
           try 
  @@ -557,7 +569,15 @@
               cname = scriptSrcURL.substring (6);
               isClass = true;
             }
  +          else
  +          {
  +            // ?? -sb
  +            cname = scriptSrcURL;
  +            isClass = true;
  +          }
             classObject = Class.forName (cname);
  +          // System.out.println("classObject: "+classObject);
  +          
             if (isClass) 
             {
               javaObject = classObject;
  @@ -579,9 +599,10 @@
       }
   
       // if scriptSrcURL is specified read it off
  -    if (scriptSrcURL != null) 
  +    if ((scriptSrcURL != null) && !(scriptLang.equals ("javaclass") 
  +                                    || scriptLang.equals ("xslt-javaclass"))) 
       {
  -      throw new SAXException ("src attr not supported (yet)");
  +      throw new SAXException ("src attr not supported (yet) for: "+scriptLang);
       }
   
       if (scriptSrc == null) 
  
  
  
  1.5       +4 -12     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.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- ExtensionNSHandler.java	2000/07/30 22:45:16	1.4
  +++ ExtensionNSHandler.java	2000/07/31 22:11:31	1.5
  @@ -89,7 +89,6 @@
   public class ExtensionNSHandler extends ExtensionFunctionHandler
   {
     TransformerImpl xslp;        // xsl transformer for whom I'm working
  -  Hashtable elements = new Hashtable (); // ext. elements of this namespace
     boolean componentDescLoaded; // true when info from the component desc
     // has been loaded. This gets set as soon
     // as any of the info has been specified.
  @@ -186,17 +185,9 @@
      */
     public void setElements (String elemNames)
     {
  -    if (elemNames == null)
  -    {
  +    if (elemNames == null) 
         return;
  -    }
  -    StringTokenizer st = new StringTokenizer (elemNames, " \t\n\r", false);
  -    Object junk = new Object ();
  -    while (st.hasMoreTokens ())
  -    {
  -      String tok = st.nextToken ();
  -      elements.put (tok, junk); // just stick it in there basically
  -    }
  +    super.setElements(elemNames);
       componentDescLoaded = true;
     }
   
  @@ -498,7 +489,8 @@
       public void error (SAXParseException exception)
         throws SAXException
       {
  -      System.out.println("Parser error: "+exception.getMessage());
  +      throw exception;
  +      // System.out.println("Parser error: "+exception.getMessage());
       }
   
       /**
  
  
  
  1.5       +1 -1      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.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- ExtensionsTable.java	2000/07/30 22:45:16	1.4
  +++ ExtensionsTable.java	2000/07/31 22:11:31	1.5
  @@ -234,7 +234,7 @@
           }
           catch (Exception e)
           {
  -          // e.printStackTrace();
  +          e.printStackTrace();
             // throw new XPathProcessorException ("Extension function '" + ns +
             //  ":" + funcName +
             //  "', threw exception: " + e, e);
  
  
  
  1.5       +40 -22    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.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- MethodResolver.java	2000/07/31 03:53:49	1.4
  +++ MethodResolver.java	2000/07/31 22:11:31	1.5
  @@ -49,27 +49,32 @@
         int numberMethodParams = paramTypes.length;
         int paramStart = 0;
         boolean isFirstExpressionContext = false;
  -      int scoreStart = 0;
  +      int scoreStart;
         // 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());
  +        // System.out.println("first javaClass: "+javaClass.getName());
           if(javaClass.isAssignableFrom(org.w3c.xslt.ExpressionContext.class))
           {
             isFirstExpressionContext = true;
  -          scoreStart = 5;
  +          scoreStart = 0;
             paramStart++;
  -      // System.out.println("Incrementing paramStart: "+paramStart);
  +          // System.out.println("Incrementing paramStart: "+paramStart);
           }
  +        else
  +          scoreStart = 100;
         }
  +      else
  +          scoreStart = 100;
  +      
         if(argsIn.length == (numberMethodParams - paramStart))
         {
           // then we have our candidate.
           int score = scoreMatch(paramTypes, paramStart, argsIn, scoreStart);
  -      // System.out.println("score: "+score);
  +        // System.out.println("score: "+score);
           if(-1 == score)
             continue;
           if(score < bestScore)
  @@ -112,8 +117,8 @@
              SecurityException,
              org.xml.sax.SAXException
     {
  -    System.out.println("---> Looking for method: "+name);
  -    System.out.println("---> classObj: "+classObj);
  +    // System.out.println("---> Looking for method: "+name);
  +    // System.out.println("---> classObj: "+classObj);
       Method bestMethod = null;
       Class[] bestParamTypes = null;
       Method[] methods = classObj.getMethods();
  @@ -129,30 +134,37 @@
           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);
  +        int scoreStart;
  +        // 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];
             if(javaClass.isAssignableFrom(org.w3c.xslt.ExpressionContext.class))
             {
               isFirstExpressionContext = true;
  -            scoreStart = 5;
  +            scoreStart = 0;
               paramStart++;
             }
  +          else
  +          {
  +            scoreStart = 100;
  +          }
           }
  +        else
  +            scoreStart = 100;
  +        
           if(argsIn.length == (numberMethodParams - paramStart))
           {
             // then we have our candidate.
             int score = scoreMatch(paramTypes, paramStart, argsIn, scoreStart);
  -          System.out.println("score: "+score);
  +          // System.out.println("score: "+score);
             if(-1 == score)
               continue;
             if(score < bestScore)
             {
  -            System.out.println("Assigning best method: "+method);
  +            // System.out.println("Assigning best method: "+method);
               bestMethod = method;
               bestParamTypes = paramTypes;
               bestScore = score;
  @@ -184,7 +196,7 @@
                                      ExpressionContext exprContext)
       throws org.xml.sax.SAXException
     {
  -    System.out.println("In convertParams");
  +    // System.out.println("In convertParams");
       int nMethods = argsIn.length;
       int paramIndex = 0;
       if((paramTypes.length > 0) 
  @@ -192,7 +204,7 @@
       {
         argsOut[0] = new Object[nMethods+1];
         argsOut[0][0] = exprContext;
  -      System.out.println("Incrementing paramIndex in convertParams: "+paramIndex);
  +      // System.out.println("Incrementing paramIndex in convertParams: "+paramIndex);
         paramIndex++;
       }
       else
  @@ -200,8 +212,9 @@
         argsOut[0] = (nMethods > 0) ? new Object[nMethods] : null;
       }
   
  -    for(int i = 0; paramIndex < nMethods; i++, paramIndex++)
  +    for(int i = 0; i < nMethods; i++, paramIndex++)
       {
  +      // System.out.println("paramTypes[i]: "+paramTypes[i]);
         argsOut[0][paramIndex] = convert(argsIn[i], paramTypes[paramIndex]);
       }
     }
  @@ -222,6 +235,8 @@
       int m_score; // Match score, closer to zero is more matched.
     }
     
  +  private static final int SCOREBASE=1;
  +  
     /**
      * Specification of conversions from XSLT type CLASS_UNKNOWN
      * (i.e. some unknown Java object) to allowed Java types.
  @@ -237,7 +252,7 @@
       new ConversionInfo(Byte.TYPE, 7),
       new ConversionInfo(java.lang.String.class, 8)
     };
  -    
  +  
     /**
      * Specification of conversions from XSLT type CLASS_BOOLEAN
      * to allowed Java types.
  @@ -247,7 +262,7 @@
       new ConversionInfo(java.lang.Boolean.class, 1),
       new ConversionInfo(java.lang.Object.class, 1),
       new ConversionInfo(java.lang.String.class, 2)
  -    };
  +  };
   
     /**
      * Specification of conversions from XSLT type CLASS_NUMBER
  @@ -357,7 +372,7 @@
     {
       int nParams = xsltArgs.length;
       for(int i = 0, paramTypesIndex = paramTypesStart; 
  -        paramTypesIndex < nParams; 
  +        i < nParams; 
           i++, paramTypesIndex++)
       {
         Object xsltObj = xsltArgs[i];
  @@ -366,6 +381,9 @@
                               : XObject.CLASS_UNKNOWN;
         Class javaClass = javeParamTypes[paramTypesIndex];
         
  +      // System.out.println("Checking xslt: "+xsltObj.getClass().getName()+
  +      //                   " against java: "+javaClass.getName());
  +      
         if(xsltClassType == XObject.CLASS_NULL)
         {
           // In Xalan I have objects of CLASS_NULL, though I'm not 
  @@ -386,7 +404,7 @@
         for(k = 0; k < nConversions; k++)
         {
           ConversionInfo cinfo = convInfo[k];
  -        if(javaClass.isAssignableFrom(cinfo.m_class))
  +        if(cinfo.m_class.isAssignableFrom(javaClass))
           {
             score += cinfo.m_score;
             break; // from k loop
  @@ -520,7 +538,7 @@
             }
           }
           // break; Unreachable
  -      
  +        
           // No default:, fall-through on purpose
         } // end switch
         xsltObj = xobj.object();