dleslie     2002/06/10 12:24:43

  Modified:    java/src/org/apache/xalan/extensions ExpressionContext.java
                        ExtensionsTable.java
               java/src/org/apache/xalan/processor StylesheetHandler.java
                        XSLTSchema.java
               java/src/org/apache/xalan/templates Constants.java
                        ElemExtensionCall.java ElemExtensionDecl.java
                        StylesheetRoot.java
               java/src/org/apache/xalan/transformer TransformerImpl.java
               java/src/org/apache/xpath XPathContext.java
               java/src/org/apache/xpath/functions
                        FuncExtElementAvailable.java FuncExtFunction.java
                        FuncExtFunctionAvailable.java
  Added:       java/src/org/apache/xalan/extensions ExpressionVisitor.java
                        ExtensionHandlerExsltFunction.java
                        ExtensionNamespaceSupport.java
                        ExtensionNamespacesManager.java
               java/src/org/apache/xalan/processor
                        ProcessorExsltFuncResult.java
                        ProcessorExsltFunction.java
               java/src/org/apache/xalan/templates ElemExsltFuncResult.java
                        ElemExsltFunction.java
               java/src/org/apache/xpath ExtensionsProvider.java
  Log:
  Updates to Xalan extensions: (1) EXLST function and (2) architectural modifications.
  This is a merge of the ExtensionEnhancements branch into Main.
  
  1. EXSLT function
  We are well underway in our progress towards providing support for EXSLT extension 
functionss and elements. The EXSLT function and result elements (see 
http://www.exslt.org/func/func.html) require some fairly substantial additions.
  XSLTSchema includes new XSLTElementDefs for a top-level exslt:function element, 
which, along with other items, may contain an exslt:result element. These definitions 
specify a new element class and processor for both of these elements, and a new 
extension handler. I have tested the implementation with the 6 test cases that EXSLT 
provides (including recursive calls), and it passes these tests.
  Note: These additions/updates also provide the infrastructure for the XSLT 2.0 
stylesheet function.
  2. Architectural changes
  During styesheet composition, Stylesheet Root assembles a vector of 
ExtensionNamespaceSupport objects. This object contains the information required 
during a transform to instantiate the required ExtensionHandler. If the stylesheet 
includes no extensions, this vector is null.  I.e.,  it does not include handlers for 
the default extension namespaces (of which there are currently 7, and which the Xalan 
currently loads for each transformation).
  The presence of an extension is detected as follows:
  Compilation of an expression that contains a FuncExtFunction. 
StylesheetHandler.createXPath()  uses an XPathVisitor to locate any FuncExtFunctions 
embedded in the expression.
  Final composition of a component element  -- ElemExtensionDecl.compose().
  Final composition of an extension component for which no component exsits -- 
ElemExtensionCall.compose().
  Final composition of an exslt:function element -- ElemFunction.compose().
  During StylesheetRoot.recompose(), any extension namespaces that are not predefined 
and for which no component or function element exists, are defined as java class (if a 
java class is found) or java package. In the current implementation, this last stab is 
made during the transformation, repeatedly if the element or function cannot be 
processed and is called more than once.
  At the beginning of each transformation -- transformNode() --  if any extensions 
exist, TransformerImpl instantiates an ExtensionsTable with a hashtable containing an 
ExtensionHandler for each of the ExtensionNamespaceSupport objects defined during 
stylesheet assembly. XPathContext  no longer creates or has any direct knowledge of 
the ExtensionsTable. The ExtensionsTable does not contain handlers for predefined 
namespaces that are not being used.
  TransformerImpl implements the org.apache.xpath.ExtensionsProvider interface. The 
relevant XPath functions (FuncExtFunction, FuncExtElememntAvailable, and 
FuncExtFunctionAvailable) call this interface, via XPathContext.getOwnerObject(). The 
implementation contains 3 methods that call through to the ExtensionsTable, which 
passes the call on to the appropriate ExtensionHandler..
  
  Revision  Changes    Path
  1.4       +12 -1     
xml-xalan/java/src/org/apache/xalan/extensions/ExpressionContext.java
  
  Index: ExpressionContext.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/extensions/ExpressionContext.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ExpressionContext.java    10 Jul 2001 07:49:02 -0000      1.3
  +++ ExpressionContext.java    10 Jun 2002 19:24:41 -0000      1.4
  @@ -103,8 +103,19 @@
      *
      * @throws javax.xml.transform.TransformerException
      */
  -
     public XObject getVariableOrParam(org.apache.xml.utils.QName qname)
  +            throws javax.xml.transform.TransformerException;
  +  
  +  /**
  +   * Get the XPathContext that owns this ExpressionContext.
  +   * 
  +   * Note: exslt:function requires the XPathContext to access
  +   * the variable stack and TransformerImpl.
  +   * 
  +   * @return The current XPathContext.
  +   * @throws javax.xml.transform.TransformerException
  +   */
  +  public org.apache.xpath.XPathContext getXPathContext()
               throws javax.xml.transform.TransformerException;
   
   }
  
  
  
  1.19      +59 -154   
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.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- ExtensionsTable.java      22 Mar 2002 14:50:49 -0000      1.18
  +++ ExtensionsTable.java      10 Jun 2002 19:24:41 -0000      1.19
  @@ -58,6 +58,7 @@
   
   import java.util.Hashtable;
   import java.util.Vector;
  +import org.apache.xml.utils.StringVector;
   
   import org.apache.xpath.objects.XNull;
   import org.apache.xpath.XPathProcessorException;
  @@ -65,13 +66,27 @@
   import org.apache.xalan.res.XSLMessages;
   import org.apache.xalan.res.XSLTErrorResources;
   
  +import org.apache.xalan.transformer.TransformerImpl;
  +
  +import org.apache.xalan.templates.Constants;
  +import org.apache.xalan.templates.ElemTemplateElement;
  +import org.apache.xalan.templates.ElemTemplate;
  +import org.apache.xalan.templates.StylesheetRoot;
  +import org.apache.xalan.templates.TemplateList;
  +
  +import org.apache.xpath.XPathContext;
  +
  +import org.apache.xml.utils.QName;
  +
  +import org.w3c.dom.Node;
  +import org.w3c.dom.NodeList;
  +
   /**
    * <meta name="usage" content="internal"/>
    * Class holding a table registered extension namespace handlers
    */
   public class ExtensionsTable
  -{
  -
  +{  
     /**
      * <meta name="usage" content="internal"/>
      * Table of extensions that may be called from the expression language
  @@ -79,50 +94,33 @@
      * name.
      */
     public Hashtable m_extensionFunctionNamespaces = new Hashtable();
  -
  +  
     /**
  -   * <meta name="usage" content="internal"/>
  -   * Primes the new ExtensionsTable object with built-in namespaces.
  +   * The StylesheetRoot associated with this extensions table.
  +   */
  +  private StylesheetRoot m_sroot;
  +  
  +  /**
  +   * <meta name="usage" content="advanced"/>
  +   * The constructor (called from TransformerImpl) registers the
  +   * StylesheetRoot for the transformation and instantiates an
  +   * ExtensionHandler for each extension namespace.
      */
  -  public ExtensionsTable()
  +  public ExtensionsTable(StylesheetRoot sroot)
  +    throws javax.xml.transform.TransformerException
     {
  -
  -    // register the java namespace as being implemented by the 
  -    // xslt-javaclass engine. Note that there's no real code
  -    // per se for this extension as the functions carry the 
  -    // object on which to call etc. and all the logic of breaking
  -    // that up is in the xslt-javaclass engine.
  -    String uri = "http://xml.apache.org/xslt/java";;
  -    ExtensionHandler fh = new ExtensionHandlerJavaPackage(uri,
  -                            "xslt-javaclass", "");
  -
  -    addExtensionNamespace(uri, fh);
  -
  -    uri = "http://xsl.lotus.com/java";;
  -
  -    addExtensionNamespace(uri, fh);
  -
  -    uri = "http://xml.apache.org/xalan";;
  -    fh = new ExtensionHandlerJavaClass(uri, "javaclass",
  -                                       "org.apache.xalan.lib.Extensions");
  -
  -    addExtensionNamespace(uri, fh);
  -    
  -    //Add EXSLT namespaces and map to org.apache.xalan.lib.ExsltXxx.
  -    uri = "http://exslt.org/common";;
  -    fh = new ExtensionHandlerJavaClass(uri, "javaclass",
  -                                       "org.apache.xalan.lib.ExsltCommon");
  -    addExtensionNamespace(uri, fh);
  -    uri = "http://exslt.org/math";;
  -    fh = new ExtensionHandlerJavaClass(uri, "javaclass",
  -                                       "org.apache.xalan.lib.ExsltMath");
  -    addExtensionNamespace(uri, fh);
  -    uri = "http://exslt.org/sets";;
  -    fh = new ExtensionHandlerJavaClass(uri, "javaclass",
  -                                       "org.apache.xalan.lib.ExsltSets");
  -    addExtensionNamespace(uri, fh);    
  -  }
  -
  +    m_sroot = sroot;
  +    Vector extensions = m_sroot.getExtensions();
  +    for (int i = 0; i < extensions.size(); i++)
  +    {
  +      ExtensionNamespaceSupport extNamespaceSpt = 
  +                 (ExtensionNamespaceSupport)extensions.elementAt(i);
  +      ExtensionHandler extHandler = extNamespaceSpt.launch();
  +        if (extHandler != null)
  +          addExtensionNamespace(extNamespaceSpt.getNamespace(), extHandler);
  +      }
  +    }
  +       
     /**
      * Get an ExtensionHandler object that represents the
      * given namespace.
  @@ -162,71 +160,41 @@
     public boolean functionAvailable(String ns, String funcName)
             throws javax.xml.transform.TransformerException
     {
  -
       boolean isAvailable = false;
  -
  +    
       if (null != ns)
       {
  -      ExtensionHandler extNS =
  -        (ExtensionHandler) m_extensionFunctionNamespaces.get(ns);
  -
  -      if (extNS == null)
  -      {
  -        extNS = makeJavaNamespace(ns);
  -
  -        addExtensionNamespace(ns, extNS);
  -      }
  -
  +      ExtensionHandler extNS = 
  +           (ExtensionHandler) m_extensionFunctionNamespaces.get(ns);
         if (extNS != null)
  -      {
           isAvailable = extNS.isFunctionAvailable(funcName);
  -      }
       }
  -
  -    // System.err.println (">>> functionAvailable (ns=" + ns + 
  -    //                    ", func=" + funcName + ") = " + isAvailable);
       return isAvailable;
     }
  -
  +  
     /**
      * Execute the element-available() function.
      * @param ns       the URI of namespace in which the function is needed
  -   * @param funcName the function name being tested
      * @param elemName name of element being tested
      *
  -   * @return whether the given function is available or not.
  +   * @return whether the given element is available or not.
      *
      * @throws javax.xml.transform.TransformerException
      */
     public boolean elementAvailable(String ns, String elemName)
             throws javax.xml.transform.TransformerException
     {
  -
       boolean isAvailable = false;
  -
       if (null != ns)
       {
  -      ExtensionHandler extNS =
  -        (ExtensionHandler) m_extensionFunctionNamespaces.get(ns);
  -
  -      if (extNS == null)
  -      {
  -        extNS = makeJavaNamespace(ns);
  -
  -        addExtensionNamespace(ns, extNS);
  -      }
  -
  -      if (extNS != null)
  -      {
  +      ExtensionHandler extNS = 
  +               (ExtensionHandler) m_extensionFunctionNamespaces.get(ns);
  +      if (extNS != null) // defensive
           isAvailable = extNS.isElementAvailable(elemName);
  -      }
  -    }
  -
  -    // System.err.println (">>> elementAvailable (ns=" + ns + 
  -    //                    ", elem=" + elemName + ") = " + isAvailable);
  -    return isAvailable;
  -  }
  -
  +    } 
  +    return isAvailable;        
  +  }  
  +  
     /**
      * Handle an extension function.
      * @param ns        the URI of namespace in which the function is needed
  @@ -242,28 +210,16 @@
      *
      * @throws javax.xml.transform.TransformerException
      */
  -  public Object extFunction(
  -          String ns, String funcName, Vector argVec, Object methodKey, 
  -          ExpressionContext exprContext)
  +  public Object extFunction(String ns, String funcName, 
  +                            Vector argVec, Object methodKey, 
  +                            ExpressionContext exprContext)
               throws javax.xml.transform.TransformerException
     {
  -
       Object result = null;
  -
       if (null != ns)
       {
         ExtensionHandler extNS =
           (ExtensionHandler) m_extensionFunctionNamespaces.get(ns);
  -
  -      // If the handler for this extension URI is not found try to auto declare 
  -      // this extension namespace:
  -      if (null == extNS)
  -      {
  -        extNS = makeJavaNamespace(ns);
  -
  -        addExtensionNamespace(ns, extNS);
  -      }
  -
         if (null != extNS)
         {
           try
  @@ -282,61 +238,10 @@
         }
         else
         {
  -        throw new 
XPathProcessorException(XSLMessages.createMessage(XSLTErrorResources.ER_EXTENSION_FUNC_UNKNOWN,
 new Object[]{ns, funcName })); //"Extension function '" + ns + ":"
  -                                         // + funcName + "' is unknown");
  +        throw new 
XPathProcessorException(XSLMessages.createMessage(XSLTErrorResources.ER_EXTENSION_FUNC_UNKNOWN,
 new Object[]{ns, funcName })); 
  +        //"Extension function '" + ns + ":" + funcName + "' is unknown");
         }
       }
  -
  -    return result;
  -  }
  -
  -  /**
  -   * Declare the appropriate java extension handler.
  -   * @param ns        the URI of namespace in which the function is needed
  -   * @return          an ExtensionHandler for this namespace, or null if 
  -   *                  not found.
  -   *
  -   * @throws javax.xml.transform.TransformerException
  -   */
  -  public ExtensionHandler makeJavaNamespace(String ns)
  -          throws javax.xml.transform.TransformerException
  -  {
  -    if(null == ns || ns.trim().length() == 0) // defensive. I don't think it's 
needed.  -sb
  -      return null;
  -
  -    // First, prepare the name of the actual class or package.  We strip
  -    // out any leading "class:".  Next, we see if there is a /.  If so,
  -    // only look at anything to the right of the rightmost /.
  -    // In the documentation, we state that any classes or packages
  -    // declared using this technique must start with xalan://.  However,
  -    // in this version, we don't enforce that.
  -    String className = ns;
  -
  -    if (className.startsWith("class:"))
  -    {
  -      className = className.substring(6);
  -    }
  -
  -    int lastSlash = className.lastIndexOf("/");
  -
  -    if (-1 != lastSlash)
  -      className = className.substring(lastSlash + 1);
  -      
  -    // The className can be null here, and can cause an error in getClassForName
  -    // in JDK 1.8.
  -    if(null == className || className.trim().length() == 0) 
  -      return null;
  -
  -    try
  -    {
  -      ExtensionHandler.getClassForName(className);
  -
  -      return new ExtensionHandlerJavaClass(ns, "javaclass", className);
  -    }
  -    catch (ClassNotFoundException e)
  -    {
  -      return new ExtensionHandlerJavaPackage(ns, "javapackage",
  -                                             className + ".");
  -    }
  +    return result;    
     }
   }
  
  
  
  1.2       +106 -0    
xml-xalan/java/src/org/apache/xalan/extensions/ExpressionVisitor.java
  
  
  
  
  1.2       +237 -0    
xml-xalan/java/src/org/apache/xalan/extensions/ExtensionHandlerExsltFunction.java
  
  
  
  
  1.2       +85 -0     
xml-xalan/java/src/org/apache/xalan/extensions/ExtensionNamespaceSupport.java
  
  
  
  
  1.2       +286 -0    
xml-xalan/java/src/org/apache/xalan/extensions/ExtensionNamespacesManager.java
  
  
  
  
  1.51      +6 -1      
xml-xalan/java/src/org/apache/xalan/processor/StylesheetHandler.java
  
  Index: StylesheetHandler.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/processor/StylesheetHandler.java,v
  retrieving revision 1.50
  retrieving revision 1.51
  diff -u -r1.50 -r1.51
  --- StylesheetHandler.java    28 Mar 2002 19:52:50 -0000      1.50
  +++ StylesheetHandler.java    10 Jun 2002 19:24:41 -0000      1.51
  @@ -85,6 +85,8 @@
   import org.apache.xpath.XPathFactory;
   import org.apache.xpath.XPath;
   
  +import org.apache.xpath.functions.FuncExtFunction;
  +import org.apache.xalan.extensions.ExpressionVisitor;
   import org.w3c.dom.Node;
   
   import org.xml.sax.Attributes;
  @@ -194,7 +196,10 @@
             throws javax.xml.transform.TransformerException
     {
       ErrorListener handler = m_stylesheetProcessor.getErrorListener();
  -    return new XPath(str, owningTemplate, this, XPath.SELECT, handler);
  +    XPath xpath = new XPath(str, owningTemplate, this, XPath.SELECT, handler);
  +    // Visit the expression, registering namespaces for any extension functions it 
includes.
  +    xpath.callVisitors(xpath, new ExpressionVisitor(getStylesheetRoot()));
  +    return xpath;
     }
   
     /**
  
  
  
  1.26      +200 -164  xml-xalan/java/src/org/apache/xalan/processor/XSLTSchema.java
  
  Index: XSLTSchema.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/processor/XSLTSchema.java,v
  retrieving revision 1.25
  retrieving revision 1.26
  diff -u -r1.25 -r1.26
  --- XSLTSchema.java   5 Jun 2002 14:39:44 -0000       1.25
  +++ XSLTSchema.java   10 Jun 2002 19:24:41 -0000      1.26
  @@ -267,9 +267,12 @@
       XSLTAttributeDef xslResultAttr =
         new XSLTAttributeDef(Constants.S_XSLNAMESPACEURL, "*",
                              XSLTAttributeDef.T_CDATA, false);
  -    XSLTElementDef[] templateElements = new XSLTElementDef[21];
  -    XSLTElementDef[] templateElementsAndParams = new XSLTElementDef[22];
  -    XSLTElementDef[] templateElementsAndSort = new XSLTElementDef[22];
  +    XSLTElementDef[] templateElements = new XSLTElementDef[22];
  +    XSLTElementDef[] templateElementsAndParams = new XSLTElementDef[23];
  +    XSLTElementDef[] templateElementsAndSort = new XSLTElementDef[23];
  +    //exslt
  +    XSLTElementDef[] exsltFunctionElements = new XSLTElementDef[23];
  +    
       XSLTElementDef[] charTemplateElements = new XSLTElementDef[15];
       XSLTElementDef resultElement = new XSLTElementDef(this, null, "*",
                                        null /*alias */,
  @@ -293,8 +296,8 @@
                                                    xslVersionAttr,
                                                    xslResultAttr,
                                                    resultAttr }, 
  -                                                                                    
             new ProcessorUnknown(),
  -                         ElemUnknown.class /* class object */, 20, true);
  +                                                 new ProcessorUnknown(),
  +                                                 ElemUnknown.class /* class object 
*/, 20, true);
       XSLTElementDef xslValueOf = new XSLTElementDef(this,
                                     Constants.S_XSLNAMESPACEURL, "value-of",
                                     null /*alias */, null /* elements */,
  @@ -485,8 +488,27 @@
                                      new XSLTAttributeDef[]{ spaceAttr },
                                      new ProcessorTemplateElem(),
                                      ElemFallback.class /* class object */, 20, true);
  +    //exslt
  +    XSLTElementDef exsltFunction =
  +                                  new XSLTElementDef(this, 
  +                                  Constants.S_EXSLT_FUNCTIONS_URL, 
  +                                  "function",
  +                                  null /*alias */,
  +                                  exsltFunctionElements /* elements */,
  +                                  new XSLTAttributeDef[]{ nameAttrRequired },
  +                                  new ProcessorExsltFunction(),
  +                                  ElemExsltFunction.class /* class object */);
  +    XSLTElementDef exsltResult =
  +                                  new XSLTElementDef(this, 
  +                                  Constants.S_EXSLT_FUNCTIONS_URL, 
  +                                  "result",
  +                                  null /*alias */,
  +                                  templateElements /* elements */,
  +                                  new XSLTAttributeDef[]{ selectAttrOpt },
  +                                  new ProcessorExsltFuncResult(),
  +                                  ElemExsltFuncResult.class  /* class object */);   
         
  +    
       int i = 0;
  -
       templateElements[i++] = charData;  // #PCDATA
   
       // char-instructions
  @@ -512,22 +534,20 @@
       templateElements[i++] = xslAttribute;
       templateElements[i++] = resultElement;
       templateElements[i++] = unknownElement;
  +    templateElements[i++] = exsltResult;
   
       int k;
   
       for (k = 0; k < i; k++)
       {
         templateElementsAndParams[k] = templateElements[k];
  -    }
  -
  -    templateElementsAndParams[k] = xslParam;
  -
  -    for (k = 0; k < i; k++)
  -    {
         templateElementsAndSort[k] = templateElements[k];
  +      exsltFunctionElements[k]     = templateElements[k];
       }
  -
  +    templateElementsAndParams[k] = xslParam;
       templateElementsAndSort[k] = xslSort;
  +    exsltFunctionElements[k]   = xslParam;
  +
       i = 0;
       charTemplateElements[i++] = charData;  // #PCDATA
   
  @@ -561,156 +581,172 @@
                                     new ProcessorInclude(),
                                     null /* class object */,
                                                  20, true);
  -    XSLTElementDef[] topLevelElements = new XSLTElementDef[]{ includeDef,
  -                                                              importDef,
  -                                                              // resultElement,
  -                                                              whiteSpaceOnly,
  -                                                              unknownElement,
  -                                                              new XSLTElementDef(
  -                                                                this,
  -                                                                
Constants.S_XSLNAMESPACEURL,
  -                                                                "strip-space",
  -                                                                null /*alias */,
  -                                                                null /* elements */,
  -                                                                new 
XSLTAttributeDef[]{
  -                                                                elementsAttr },
  -                                                                new 
ProcessorStripSpace(),
  -                                                                null /* class 
object */, 20, true),
  -                                                              new XSLTElementDef(
  -                                                                this,
  -                                                                
Constants.S_XSLNAMESPACEURL,
  -                                                                "preserve-space",
  -                                                                null /*alias */,
  -                                                                null /* elements */,
  -                                                                new 
XSLTAttributeDef[]{
  -                                                                elementsAttr },
  -                                                                new 
ProcessorPreserveSpace(),
  -                                                                null /* class 
object */, 20, true),
  -                                                              new XSLTElementDef(
  -                                                                this,
  -                                                                
Constants.S_XSLNAMESPACEURL,
  -                                                                "output",
  -                                                                null /*alias */,
  -                                                                null /* elements */,
  -                                                                new 
XSLTAttributeDef[]{
  -                                                                  methodAttr,
  -                                                                  versionAttr,
  -                                                                  encodingAttr,
  -                                                                  
omitXmlDeclarationAttr,
  -                                                                  standaloneAttr,
  -                                                                  doctypePublicAttr,
  -                                                                  doctypeSystemAttr,
  -                                                                  
cdataSectionElementsAttr,
  -                                                                  indentAttr,
  -                                                                  mediaTypeAttr,
  -                                                                  
XSLTAttributeDef.m_foreignAttr }, 
  -                                                                new 
ProcessorOutputElem(), null /* class object */, 20, true), 
  -                                                              new XSLTElementDef(
  -                                                                this,
  -                                                                
Constants.S_XSLNAMESPACEURL,
  -                                                                "key",
  -                                                                null /*alias */,
  -                                                                null /* elements 
*/,  // EMPTY
  -                                                                new 
XSLTAttributeDef[]{ nameAttrRequired,
  -                                                                                    
        matchAttrRequired,
  -                                                                                    
        useAttr }, 
  -                                                                                    
           new ProcessorKey(), null /* class object */, 20, true),
  -                                                              new XSLTElementDef(
  -                                                                this,
  -                                                                
Constants.S_XSLNAMESPACEURL,
  -                                                                "decimal-format",
  -                                                                null /*alias */,
  -                                                                null /* elements 
*/,  // EMPTY
  -                                                                                 
new XSLTAttributeDef[]{
  -                                                                                   
nameAttrOpt,
  -                                                                                   
decimalSeparatorAttr,
  -                                                                                   
groupingSeparatorAttr,
  -                                                                                   
infinityAttr,
  -                                                                                   
minusSignAttr,
  -                                                                                   
NaNAttr,
  -                                                                                   
percentAttr,
  -                                                                                   
perMilleAttr,
  -                                                                                   
zeroDigitAttr,
  -                                                                                   
digitAttr,
  -                                                                                   
patternSeparatorAttr }, 
  -                                                                                    
           new ProcessorDecimalFormat(),
  -                                                                null /* class 
object */, 20, true),
  -                                                              new XSLTElementDef(
  -                                                                this,
  -                                                                
Constants.S_XSLNAMESPACEURL,
  -                                                                "attribute-set",
  -                                                                null /*alias */,
  -                                                                new 
XSLTElementDef[]{
  -                                                                xslAttribute } /* 
elements */,
  -                                                                new 
XSLTAttributeDef[]{
  -                                                                  nameAttrRequired,
  -                                                                  
useAttributeSetsAttr }, new ProcessorAttributeSet(),
  -                                                                                    
      null /* class object */, 20, true),
  -                                                              new XSLTElementDef(
  -                                                                this,
  -                                                                
Constants.S_XSLNAMESPACEURL,
  -                                                                "variable",
  -                                                                null /*alias */,
  -                                                                templateElements /* 
elements */,
  -                                                                new 
XSLTAttributeDef[]{
  -                                                                  nameAttrRequired,
  -                                                                  selectAttrOpt }, 
new ProcessorGlobalVariableDecl(),
  -                                                                                   
ElemVariable.class /* class object */, 20, true),
  -                                                              new XSLTElementDef(
  -                                                                this,
  -                                                                
Constants.S_XSLNAMESPACEURL,
  -                                                                "param",
  -                                                                null /*alias */,
  -                                                                templateElements /* 
elements */,
  -                                                                new 
XSLTAttributeDef[]{
  -                                                                  nameAttrRequired,
  -                                                                  selectAttrOpt }, 
new ProcessorGlobalParamDecl(),
  -                                                                                   
ElemParam.class /* class object */, 20, true),
  -                                                              new XSLTElementDef(
  -                                                                this,
  -                                                                
Constants.S_XSLNAMESPACEURL,
  -                                                                "template",
  -                                                                null /*alias */,
  -                                                                
templateElementsAndParams /* elements */,
  -                                                                new 
XSLTAttributeDef[]{
  -                                                                  matchAttrOpt,
  -                                                                  nameAttrOpt,
  -                                                                  priorityAttr,
  -                                                                  modeAttr,
  -                                                                  spaceAttr }, new 
ProcessorTemplate(), ElemTemplate.class /* class object */, true, 20, true), 
  -                                                                                    
         new XSLTElementDef(
  -                                                                    this,
  -                                                                    
Constants.S_XSLNAMESPACEURL,
  -                                                                    
"namespace-alias",
  -                                                                    null /*alias */,
  -                                                                    null /* 
elements */,  // EMPTY
  -                                                                    new 
XSLTAttributeDef[]{ stylesheetPrefixAttr,
  -                                                                                    
        resultPrefixAttr }, 
  -                                                                                    
               new ProcessorNamespaceAlias(), null /* class object */, 20, true),
  -                                                              new XSLTElementDef(
  -                                                                this,
  -                                                                
Constants.S_BUILTIN_EXTENSIONS_URL,
  -                                                                "component",
  -                                                                null /*alias */,
  -                                                                new 
XSLTElementDef[]{
  -                                                                  new 
XSLTElementDef(
  -                                                                    this,
  -                                                                    
Constants.S_BUILTIN_EXTENSIONS_URL,
  -                                                                    "script",
  -                                                                    null /*alias */,
  -                                                                    new 
XSLTElementDef[]{ charData } /* elements */,
  -                                                                    new 
XSLTAttributeDef[]{
  -                                                                      new 
XSLTAttributeDef(
  -                                                                        null,
  -                                                                        "lang",
  -                                                                        
XSLTAttributeDef.T_NMTOKEN,
  -                                                                        true),
  -                                                                      new 
XSLTAttributeDef(null, "src", XSLTAttributeDef.T_URL, false) }, 
  -                                                                                    
              new ProcessorLRE(),
  -                                                                   
ElemExtensionScript.class /* class object */, 20, true) },  // EMPTY
  -                                                                                    
          new XSLTAttributeDef[]{ new XSLTAttributeDef(null, "prefix", 
XSLTAttributeDef.T_NMTOKEN, true),
  -                                                                                    
                                  new XSLTAttributeDef(null, "elements", 
XSLTAttributeDef.T_STRINGLIST, false),
  -                                                                                    
                                  new XSLTAttributeDef(null, "functions", 
XSLTAttributeDef.T_STRINGLIST, false) }, new ProcessorLRE(), ElemExtensionDecl.class 
/* class object */) };
  +
  +    XSLTElementDef[] topLevelElements = new XSLTElementDef[]
  +                                 {includeDef,
  +                                  importDef,
  +                                  // resultElement,
  +                                  whiteSpaceOnly,
  +                                  unknownElement,
  +                                  new XSLTElementDef(
  +                                         this,
  +                                         Constants.S_XSLNAMESPACEURL,
  +                                         "strip-space",
  +                                         null /*alias */,
  +                                         null /* elements */,
  +                                         new XSLTAttributeDef[]{
  +                                                elementsAttr },
  +                                                new ProcessorStripSpace(),
  +                                         null /* class object */, 20, true),
  +                                  new XSLTElementDef(
  +                                         this,
  +                                         Constants.S_XSLNAMESPACEURL,
  +                                         "preserve-space",
  +                                         null /*alias */,
  +                                         null /* elements */,
  +                                         new XSLTAttributeDef[]{
  +                                                 elementsAttr },
  +                                                 new ProcessorPreserveSpace(),
  +                                         null /* class object */, 20, true),
  +                                  new XSLTElementDef(
  +                                         this,
  +                                         Constants.S_XSLNAMESPACEURL,
  +                                         "output",
  +                                         null /*alias */,
  +                                         null /* elements */,
  +                                         new XSLTAttributeDef[]{
  +                                                  methodAttr,
  +                                                  versionAttr,
  +                                                  encodingAttr,
  +                                                  omitXmlDeclarationAttr,
  +                                                  standaloneAttr,
  +                                                  doctypePublicAttr,
  +                                                  doctypeSystemAttr,
  +                                                  cdataSectionElementsAttr,
  +                                                  indentAttr,
  +                                                  mediaTypeAttr,
  +                                                  XSLTAttributeDef.m_foreignAttr }, 
  +                                          new ProcessorOutputElem(), null /* class 
object */, 20, true), 
  +                                  new XSLTElementDef(
  +                                          this,
  +                                          Constants.S_XSLNAMESPACEURL,
  +                                          "key",
  +                                          null /*alias */,
  +                                          null /* elements */,  // EMPTY
  +                                          new XSLTAttributeDef[]{ nameAttrRequired,
  +                                                  matchAttrRequired,
  +                                                  useAttr }, 
  +                                          new ProcessorKey(), null /* class object 
*/, 20, true),
  +                                  new XSLTElementDef(
  +                                          this,
  +                                          Constants.S_XSLNAMESPACEURL,
  +                                          "decimal-format",
  +                                          null /*alias */,
  +                                          null /* elements */,  // EMPTY
  +                                          new XSLTAttributeDef[]{
  +                                                  nameAttrOpt,
  +                                                  decimalSeparatorAttr,
  +                                                  groupingSeparatorAttr,
  +                                                  infinityAttr,
  +                                                  minusSignAttr,
  +                                                  NaNAttr,
  +                                                  percentAttr,
  +                                                  perMilleAttr,
  +                                                  zeroDigitAttr,
  +                                                  digitAttr,
  +                                                  patternSeparatorAttr }, 
  +                                           new ProcessorDecimalFormat(),
  +                                           null /* class object */, 20, true),
  +                                  new XSLTElementDef(
  +                                           this,
  +                                           Constants.S_XSLNAMESPACEURL,
  +                                           "attribute-set",
  +                                           null /*alias */,
  +                                           new XSLTElementDef[]{
  +                                                   xslAttribute } /* elements */,
  +                                           new XSLTAttributeDef[]{
  +                                                   nameAttrRequired,
  +                                                   useAttributeSetsAttr }, 
  +                                           new ProcessorAttributeSet(),
  +                                           null /* class object */, 20, true),
  +                                  new XSLTElementDef(
  +                                           this,
  +                                           Constants.S_XSLNAMESPACEURL,
  +                                           "variable",
  +                                           null /*alias */,
  +                                           templateElements /* elements */,
  +                                           new XSLTAttributeDef[]{
  +                                                   nameAttrRequired,
  +                                                   selectAttrOpt }, 
  +                                           new ProcessorGlobalVariableDecl(),
  +                                           ElemVariable.class /* class object */, 
20, true),
  +                                  new XSLTElementDef(
  +                                           this,
  +                                           Constants.S_XSLNAMESPACEURL,
  +                                           "param",
  +                                           null /*alias */,
  +                                           templateElements /* elements */,
  +                                           new XSLTAttributeDef[]{
  +                                                   nameAttrRequired,
  +                                                   selectAttrOpt }, 
  +                                           new ProcessorGlobalParamDecl(),
  +                                           ElemParam.class /* class object */, 20, 
true),
  +                                  new XSLTElementDef(
  +                                           this,
  +                                           Constants.S_XSLNAMESPACEURL,
  +                                           "template",
  +                                           null /*alias */,
  +                                           templateElementsAndParams /* elements */,
  +                                           new XSLTAttributeDef[]{
  +                                                   matchAttrOpt,
  +                                                   nameAttrOpt,
  +                                                   priorityAttr,
  +                                                   modeAttr,
  +                                                   spaceAttr }, 
  +                                           new ProcessorTemplate(), 
ElemTemplate.class /* class object */, true, 20, true), 
  +                                  new XSLTElementDef(
  +                                           this,
  +                                           Constants.S_XSLNAMESPACEURL,
  +                                           "namespace-alias",
  +                                           null /*alias */,
  +                                          null /* elements */,  // EMPTY
  +                                           new XSLTAttributeDef[]{ 
  +                                                   stylesheetPrefixAttr,
  +                                                   resultPrefixAttr }, 
  +                                           new ProcessorNamespaceAlias(), null /* 
class object */, 20, true),
  +                                  new XSLTElementDef(
  +                                           this,
  +                                           Constants.S_BUILTIN_EXTENSIONS_URL,
  +                                           "component",
  +                                           null /*alias */,
  +                                           new XSLTElementDef[]{
  +                                                    new XSLTElementDef(
  +                                                        this,
  +                                                        
Constants.S_BUILTIN_EXTENSIONS_URL,
  +                                                        "script",
  +                                                        null /*alias */,
  +                                                    new XSLTElementDef[]{ 
  +                                                        charData } /* elements */,
  +                                                        new XSLTAttributeDef[]{
  +                                                            new XSLTAttributeDef(
  +                                                                null,
  +                                                                "lang",
  +                                                                
XSLTAttributeDef.T_NMTOKEN,
  +                                                                true),
  +                                                            new XSLTAttributeDef(
  +                                                                null, "src", 
XSLTAttributeDef.T_URL, false) }, 
  +                                                                new ProcessorLRE(),
  +                                                                
ElemExtensionScript.class /* class object */, 20, true) },  // EMPTY
  +                                                            new XSLTAttributeDef[]{ 
  +                                                                new 
XSLTAttributeDef(
  +                                                                    null, "prefix", 
XSLTAttributeDef.T_NMTOKEN, true),
  +                                                                new 
XSLTAttributeDef(
  +                                                                    null, 
"elements", XSLTAttributeDef.T_STRINGLIST, false),
  +                                                                new 
XSLTAttributeDef(
  +                                                                    null, 
"functions", XSLTAttributeDef.T_STRINGLIST, false) }, 
  +                                                    new ProcessorLRE(), 
ElemExtensionDecl.class /* class object */),
  +                                  exsltFunction}/* exslt */;  //end of 
topevelElements
  +    
       XSLTAttributeDef excludeResultPrefixesAttr =
         new XSLTAttributeDef(null, "exclude-result-prefixes",
                              XSLTAttributeDef.T_STRINGLIST, false);
  @@ -788,4 +824,4 @@
     {
       return m_availElems.containsKey(elemName);
     }
  -}
  \ No newline at end of file
  +}
  
  
  
  1.2       +116 -0    
xml-xalan/java/src/org/apache/xalan/processor/ProcessorExsltFuncResult.java
  
  
  
  
  1.2       +212 -0    
xml-xalan/java/src/org/apache/xalan/processor/ProcessorExsltFunction.java
  
  
  
  
  1.13      +31 -1     xml-xalan/java/src/org/apache/xalan/templates/Constants.java
  
  Index: Constants.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/templates/Constants.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- Constants.java    13 Dec 2000 19:47:20 -0000      1.12
  +++ Constants.java    10 Jun 2002 19:24:42 -0000      1.13
  @@ -110,6 +110,25 @@
       S_BUILTIN_EXTENSIONS_URL = "http://xml.apache.org/xslt";; 
     
     /**
  +   * Xalan extension namespaces.
  +   */
  +  public static final String 
  +    S_EXTENSIONS_JAVA_URL = "http://xml.apache.org/xslt/java";,
  +    S_EXTENSIONS_LOTUSXSL_JAVA_URL = "http://xsl.lotus.com/java";,
  +    S_EXTENSIONS_XALANLIB_URL = "http://xml.apache.org/xalan";;   
  +  
  +  /**
  +   * EXSLT extension namespaces.
  +   */
  +  public static final String
  +    S_EXSLT_COMMON_URL = "http://exslt.org/common";,
  +    S_EXSLT_MATH_URL = "http://exslt.org/math";,
  +    S_EXSLT_SETS_URL = "http://exslt.org/sets";,
  +    S_EXSLT_DATETIME_URL = "http://exslt.org/dates-and-times";,
  +    S_EXSLT_FUNCTIONS_URL = "http://exslt.org/functions";;
  +    
  +    
  +  /**
      * The minimum version of XSLT supported by this processor.
      */
     public static final double XSLTVERSUPPORTED = 1.0;
  @@ -177,7 +196,7 @@
     ELEMNAME_EXTENSIONSCRIPT = 86, ELEMNAME_OUTPUT = 80,
     ELEMNAME_COMPONENT = 81, ELEMNAME_SCRIPT = 82;
   
  -  // Next free number: 87
  +  // Next free number: 90 (88 and 89 used for EXSLT elements);
   
     /**
      * Literals for XSL element names.  Note that there are more
  @@ -251,6 +270,17 @@
         ELEMNAME_VARIABLE_STRING = "variable",
         ELEMNAME_WHEN_STRING = "when",
         ELEMNAME_WITHPARAM_STRING = "with-param";
  +  
  +  /**
  +   * Literals for EXSLT function elements.
  +   */
  +  public static final String
  +    EXSLT_ELEMNAME_FUNCTION_STRING = "function",
  +    EXSLT_ELEMNAME_FUNCRESULT_STRING = "result";
  +  public static final int
  +    EXSLT_ELEMNAME_FUNCTION = 88,
  +    EXSLT_ELEMNAME_FUNCRESULT = 89;
  +  
     
     /**
      * Literals for XSL attribute names.  Note that there may be more
  
  
  
  1.28      +10 -60    
xml-xalan/java/src/org/apache/xalan/templates/ElemExtensionCall.java
  
  Index: ElemExtensionCall.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/templates/ElemExtensionCall.java,v
  retrieving revision 1.27
  retrieving revision 1.28
  diff -u -r1.27 -r1.28
  --- ElemExtensionCall.java    22 Mar 2002 01:04:40 -0000      1.27
  +++ ElemExtensionCall.java    10 Jun 2002 19:24:42 -0000      1.28
  @@ -91,8 +91,6 @@
   public class ElemExtensionCall extends ElemLiteralResult
   {
   
  -  // ExtensionNSHandler nsh;
  -
     /** The Namespace URI for this extension call element.
      *  @serial          */
     String m_extns;
  @@ -144,51 +142,15 @@
      */
     public void compose(StylesheetRoot sroot) throws TransformerException
     {
  -
       super.compose(sroot);
  -    m_extns = this.getNamespace();
  -
  -    StylesheetRoot stylesheet = this.getStylesheetRoot();
  -
  -    m_decl = getElemExtensionDecl(stylesheet, m_extns);
  -
  -    if (null != m_decl)
  -    {
  -      for (ElemTemplateElement child = m_decl.getFirstChildElem();
  -              child != null; child = child.getNextSiblingElem())
  -      {
  -        if (Constants.ELEMNAME_EXTENSIONSCRIPT == child.getXSLToken())
  -        {
  -          ElemExtensionScript sdecl = (ElemExtensionScript) child;
  -
  -          m_lang = sdecl.getLang();
  -          m_srcURL = sdecl.getSrc();
  -
  -          ElemTemplateElement childOfSDecl = sdecl.getFirstChildElem();
  -
  -          if (null != childOfSDecl)
  -          {
  -            if (Constants.ELEMNAME_TEXTLITERALRESULT
  -                    == childOfSDecl.getXSLToken())
  -            {
  -              ElemTextLiteral tl = (ElemTextLiteral) childOfSDecl;
  -              char[] chars = tl.getChars();
  -
  -              m_scriptSrc = new String(chars);
  -            }
  -          }
  -
  -          break;
  -        }
  -      }
  -    }
  -    else
  -    {
  -
  -      // stylesheet.error(xxx);
  -    }
  +    m_extns = this.getNamespace();   
  +    m_decl = getElemExtensionDecl(sroot, m_extns);
  +    // Register the extension namespace if the extension does not have
  +    // an ElemExtensionDecl ("component").
  +    if (m_decl == null)
  +      sroot.getExtensionNamespacesManager().registerExtension(m_extns);
     }
  -
  + 
     /**
      * Return the ElemExtensionDecl for this extension element 
      *
  @@ -281,25 +243,13 @@
       {
         transformer.getResultTreeHandler().flushPending();
   
  -      XPathContext liaison = ((XPathContext) transformer.getXPathContext());
  -      ExtensionsTable etable = liaison.getExtensionsTable();
  +      ExtensionsTable etable = transformer.getExtensionsTable();
         ExtensionHandler nsh = etable.get(m_extns);
   
  -      // We're seeing this extension namespace used for the first time.  Try to
  -      // autodeclare it as a java namespace.
  -
         if (null == nsh)
         {
  -        nsh = etable.makeJavaNamespace(m_extns);
  -
  -        if(null != nsh)
  -          etable.addExtensionNamespace(m_extns, nsh);
  -        else
  -        {
  -          executeFallbacks(transformer);
  -          return;
  -        }
  -
  +        executeFallbacks(transformer);
  +        return;
         }
   
         try
  
  
  
  1.17      +86 -12    
xml-xalan/java/src/org/apache/xalan/templates/ElemExtensionDecl.java
  
  Index: ElemExtensionDecl.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/templates/ElemExtensionDecl.java,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- ElemExtensionDecl.java    31 Jul 2001 21:33:18 -0000      1.16
  +++ ElemExtensionDecl.java    10 Jun 2002 19:24:42 -0000      1.17
  @@ -73,6 +73,10 @@
   import org.apache.xalan.res.XSLTErrorResources;
   import org.apache.xalan.res.XSLMessages;
   
  +// dml
  +import org.apache.xalan.extensions.ExtensionNamespacesManager;
  +import org.apache.xalan.extensions.ExtensionNamespaceSupport;
  +
   /**
    * <meta name="usage" content="internal"/>
    * Implement the declaration of an extension element 
  @@ -106,7 +110,7 @@
     }
   
     /**
  -   * Set the prefix for this extension element
  +   * Get the prefix for this extension element
      *
      *
      * @return Prefix for this extension element
  @@ -238,7 +242,78 @@
     {
       return Constants.ELEMNAME_EXTENSIONDECL;
     }
  +  
  +  public void compose(StylesheetRoot sroot) throws TransformerException
  +  {
  +    super.compose(sroot);
  +    String prefix = getPrefix();
  +    String declNamespace = getNamespaceForPrefix(prefix);
  +    String lang = null;
  +    String srcURL = null;
  +    String scriptSrc = null;
  +    if (null == declNamespace)
  +      throw new 
TransformerException(XSLMessages.createMessage(XSLTErrorResources.ER_NO_NAMESPACE_DECL,
 new Object[]{prefix})); 
  +      //"Prefix " + prefix does not have a corresponding namespace declaration");
  +    for (ElemTemplateElement child = getFirstChildElem(); child != null;
  +          child = child.getNextSiblingElem())
  +    {
  +      if (Constants.ELEMNAME_EXTENSIONSCRIPT == child.getXSLToken())
  +      {
  +        ElemExtensionScript sdecl = (ElemExtensionScript) child;
  +        lang = sdecl.getLang();
  +        srcURL = sdecl.getSrc();
  +        ElemTemplateElement childOfSDecl = sdecl.getFirstChildElem();
  +        if (null != childOfSDecl)
  +        {
  +          if (Constants.ELEMNAME_TEXTLITERALRESULT
  +                  == childOfSDecl.getXSLToken())
  +          {
  +            ElemTextLiteral tl = (ElemTextLiteral) childOfSDecl;
  +            char[] chars = tl.getChars();
  +            scriptSrc = new String(chars);
  +            if (scriptSrc.trim().length() == 0)
  +              scriptSrc = null;
  +          }
  +        }
  +      }
  +    }
  +    if (null == lang)
  +      lang = "javaclass";
  +    if (lang.equals("javaclass") && (scriptSrc != null))
  +        throw new 
TransformerException(XSLMessages.createMessage(XSLTErrorResources.ER_ELEM_CONTENT_NOT_ALLOWED,
 new Object[]{scriptSrc})); 
  +        //"Element content not allowed for lang=javaclass " + scriptSrc);
  +
  +    // Register the extension namespace if it has not already been registered.
  +    ExtensionNamespaceSupport extNsSpt = null;
  +    ExtensionNamespacesManager extNsMgr = sroot.getExtensionNamespacesManager();
  +    if (extNsMgr.namespaceIndex(declNamespace,
  +                                extNsMgr.getExtensions()) == -1)
  +    {
  +      if (lang.equals("javaclass"))
  +      {
  +        if (null == srcURL)
  +        {
  +           extNsSpt = extNsMgr.defineJavaNamespace(declNamespace);
  +        }
  +        else if (extNsMgr.namespaceIndex(srcURL,
  +                                         extNsMgr.getExtensions()) == -1)
  +        {
  +          extNsSpt = extNsMgr.defineJavaNamespace(declNamespace, srcURL);
  +        }
  +      }
  +      else  // not java
  +      {
  +        String handler = "org.apache.xalan.extensions.ExtensionHandlerGeneral";
  +        Object [] args = {declNamespace, this.m_elements, this.m_functions,
  +                          lang, srcURL, scriptSrc, getSystemId()};
  +        extNsSpt = new ExtensionNamespaceSupport(declNamespace, handler, args);
  +      }
  +    }
  +    if (extNsSpt != null)
  +      extNsMgr.registerExtension(extNsSpt);
  +  }
   
  +  
     /**
      * This function will be called on top-level elements
      * only, just before the transform begins.
  @@ -246,10 +321,10 @@
      * @param transformer The XSLT TransformerFactory.
      *
      * @throws TransformerException
  -   */
  +   */  
     public void runtimeInit(TransformerImpl transformer) throws TransformerException
     {
  -
  +/*    //System.out.println("ElemExtensionDecl.runtimeInit()");
       String lang = null;
       String srcURL = null;
       String scriptSrc = null;
  @@ -257,9 +332,8 @@
       String declNamespace = getNamespaceForPrefix(prefix);
   
       if (null == declNamespace)
  -      throw new 
TransformerException(XSLMessages.createMessage(XSLTErrorResources.ER_NO_NAMESPACE_DECL,
 new Object[]{prefix})); //"Prefix " + prefix
  -                             //+ " does not have a corresponding "
  -                             //+ "namespace declaration");
  +      throw new 
TransformerException(XSLMessages.createMessage(XSLTErrorResources.ER_NO_NAMESPACE_DECL,
 new Object[]{prefix})); 
  +      //"Prefix " + prefix does not have a corresponding namespace declaration");
   
       for (ElemTemplateElement child = getFirstChildElem(); child != null;
               child = child.getNextSiblingElem())
  @@ -294,11 +368,11 @@
         lang = "javaclass";
   
       if (lang.equals("javaclass") && (scriptSrc != null))
  -      throw new 
TransformerException(XSLMessages.createMessage(XSLTErrorResources.ER_ELEM_CONTENT_NOT_ALLOWED,
 new Object[]{scriptSrc})); //"Element content not allowed for lang=javaclass "
  -                             //+ scriptSrc);
  -
  -    XPathContext liaison = ((XPathContext) transformer.getXPathContext());
  -    ExtensionsTable etable = liaison.getExtensionsTable();
  +      throw new 
TransformerException(XSLMessages.createMessage(XSLTErrorResources.ER_ELEM_CONTENT_NOT_ALLOWED,
 new Object[]{scriptSrc})); 
  +      //"Element content not allowed for lang=javaclass " + scriptSrc);
  +    
  +    // Instantiate a handler for this extension namespace.
  +    ExtensionsTable etable = transformer.getExtensionsTable();    
       ExtensionHandler nsh = etable.get(declNamespace);
   
       // If we have no prior ExtensionHandler for this namespace, we need to
  @@ -337,6 +411,6 @@
         }
   
         etable.addExtensionNamespace(declNamespace, nsh);
  -    }
  +    }*/
     }
   }
  
  
  
  1.47      +44 -8     
xml-xalan/java/src/org/apache/xalan/templates/StylesheetRoot.java
  
  Index: StylesheetRoot.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/templates/StylesheetRoot.java,v
  retrieving revision 1.46
  retrieving revision 1.47
  diff -u -r1.46 -r1.47
  --- StylesheetRoot.java       30 Jan 2002 19:08:01 -0000      1.46
  +++ StylesheetRoot.java       10 Jun 2002 19:24:42 -0000      1.47
  @@ -89,6 +89,11 @@
   import javax.xml.transform.ErrorListener;
   
   import org.apache.xml.dtm.ref.ExpandedNameTable;
  +//dml
  +import org.apache.xml.utils.StringVector;
  +import org.apache.xalan.extensions.ExtensionNamespaceSupport;
  +import org.apache.xalan.extensions.ExtensionHandler;
  +import org.apache.xalan.extensions.ExtensionNamespacesManager;
   
   /**
    * <meta name="usage" content="general"/>
  @@ -126,7 +131,7 @@
      * @serial
      */
     private Hashtable m_availElems;
  -
  +  
     /**
      * Creates a StylesheetRoot and retains a pointer to the schema used to create 
this
      * StylesheetRoot.  The schema may be needed later for an element-available() 
function call.
  @@ -139,7 +144,6 @@
   
       this(listener);
       m_availElems = schema.getElemsAvailable();
  -
     }
   
     /**
  @@ -162,6 +166,39 @@
     {
       return m_availElems;
     }
  +  
  +  private ExtensionNamespacesManager m_extNsMgr = null;
  +  
  +  /**
  +   * Only instantiate an ExtensionNamespacesManager if one is called for
  +   * (i.e., if the stylesheet contains  extension functions and/or elements).
  +   */
  +  public ExtensionNamespacesManager getExtensionNamespacesManager()
  +  {
  +     if (m_extNsMgr == null)
  +       m_extNsMgr = new ExtensionNamespacesManager();
  +     return m_extNsMgr;
  +  }
  +  
  +  /**
  +   * Get the vector of extension namespaces. Used to provide
  +   * the extensions table access to a list of extension
  +   * namespaces encountered during composition of a stylesheet.
  +   */
  +  public Vector getExtensions()
  +  {
  +    return m_extNsMgr != null ? m_extNsMgr.getExtensions() : null;
  +  }  
  +
  +/*
  +  public void runtimeInit(TransformerImpl transformer) throws TransformerException
  +  {
  +    System.out.println("StylesheetRoot.runtimeInit()");
  +      
  +  //    try{throw new Exception("StylesheetRoot.runtimeInit()");} catch(Exception 
e){e.printStackTrace();}
  +
  +    }
  +*/  
   
     //============== Templates Interface ================
   
  @@ -243,12 +280,8 @@
           // Calculate the number of this import.    
           m_globalImportList[j--].recomposeImports();        
         }
  -    }
  -
  -    
  -
  +    }    
       // Next, we walk the import tree and add all of the recomposable elements to 
the vector.
  -
       int n = getGlobalImportCount();
   
       for (int i = 0; i < n; i++)
  @@ -303,7 +336,10 @@
           composeTemplates(included);
         }
       }
  -    
  +    // Attempt to register any remaining unregistered extension namespaces.
  +    if (m_extNsMgr != null)
  +      m_extNsMgr.registerUnregisteredNamespaces();
  +
       clearComposeState();
     }
   
  
  
  
  1.2       +93 -0     
xml-xalan/java/src/org/apache/xalan/templates/ElemExsltFuncResult.java
  
  
  
  
  1.2       +242 -0    
xml-xalan/java/src/org/apache/xalan/templates/ElemExsltFunction.java
  
  
  
  
  1.133     +73 -7     
xml-xalan/java/src/org/apache/xalan/transformer/TransformerImpl.java
  
  Index: TransformerImpl.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/transformer/TransformerImpl.java,v
  retrieving revision 1.132
  retrieving revision 1.133
  diff -u -r1.132 -r1.133
  --- TransformerImpl.java      8 Jun 2002 20:41:00 -0000       1.132
  +++ TransformerImpl.java      10 Jun 2002 19:24:42 -0000      1.133
  @@ -130,6 +130,10 @@
   import org.xml.sax.ext.DeclHandler;
   import org.xml.sax.ext.LexicalHandler;
   
  +//dml
  +import org.apache.xpath.ExtensionsProvider;
  +import org.apache.xalan.extensions.ExtensionsTable;
  +
   /**
    * <meta name="usage" content="advanced"/>
    * This class implements the
  @@ -137,7 +141,7 @@
    * representation of the transformation execution.</p>
    */
   public class TransformerImpl extends Transformer
  -        implements Runnable, DTMWSFilter
  +        implements Runnable, DTMWSFilter, ExtensionsProvider
   {
   
     // Synch object to gaurd against setting values from the TrAX interface 
  @@ -382,7 +386,7 @@
     private Stack m_modes = new Stack();
   
     //==========================================================
  -  // SECTION: Constructors
  +  // SECTION: Constructor
     //==========================================================
   
     /**
  @@ -391,13 +395,74 @@
      * @param stylesheet The root of the stylesheet tree.
      */
     public TransformerImpl(StylesheetRoot stylesheet)
  +   // throws javax.xml.transform.TransformerException    
     {
  -
       setStylesheet(stylesheet);
       setXPathContext(new XPathContext(this));
       getXPathContext().setNamespaceContext(stylesheet);
       m_stackGuard = new StackGuard(this);
     }
  +  
  +  // ================ ExtensionsTable ===================
  +
  +  /**
  +   * The table of ExtensionHandlers.
  +   */
  +  private ExtensionsTable m_extensionsTable = null;
  +
  +  /**
  +   * Get the extensions table object. 
  +   *
  +   * @return The extensions table.
  +   */
  +  public ExtensionsTable getExtensionsTable()
  +  {
  +    return m_extensionsTable;
  +  }
  +
  +  /**
  +   * If the stylesheet contains extensions, set the extensions table object.
  +   *
  +   *
  +   * @param sroot The stylesheet.
  +   * @throws javax.xml.transform.TransformerException
  +   */
  +  void setExtensionsTable(StylesheetRoot sroot)
  +       throws javax.xml.transform.TransformerException
  +  {
  +    try
  +    {
  +      if (sroot.getExtensions() != null)
  +        m_extensionsTable = new ExtensionsTable(sroot);
  +    }
  +    catch (javax.xml.transform.TransformerException te)
  +    {te.printStackTrace();}
  +  }
  +  
  +  //== Implementation of the XPath ExtensionsProvider interface.
  +  
  +  public boolean functionAvailable(String ns, String funcName)
  +          throws javax.xml.transform.TransformerException
  +  {
  +    return getExtensionsTable().functionAvailable(ns, funcName);
  +  }
  +  
  +  public boolean elementAvailable(String ns, String elemName)
  +          throws javax.xml.transform.TransformerException
  +  {
  +    return getExtensionsTable().elementAvailable(ns, elemName);   
  +  }
  +   
  +  public Object extFunction(String ns, String funcName, 
  +                            Vector argVec, Object methodKey)
  +            throws javax.xml.transform.TransformerException
  +  {//System.out.println("TransImpl.extFunction() " + ns + " " + funcName +" " + 
getExtensionsTable());
  +    return getExtensionsTable().extFunction(ns, funcName, 
  +                                        argVec, methodKey,
  +                                        getXPathContext().getExpressionContext());  
 
  +  }
  +  
  +  //=========================
   
     /**
      * Reset the state.  This needs to be called after a process() call
  @@ -1068,6 +1133,7 @@
     public void transformNode(int node, Result outputTarget)
             throws TransformerException
     {
  +    
   
       ContentHandler handler = createResultContentHandler(outputTarget);
   
  @@ -1089,7 +1155,8 @@
      */
     public void transformNode(int node) throws TransformerException
     {
  -
  +    //dml
  +    setExtensionsTable(getStylesheet());
       // Make sure we're not writing to the same output content handler.
       synchronized (m_outputContentHandler)
       {
  @@ -1126,8 +1193,7 @@
               }
             }
           }
  -
  -        // ===========
  +        // ===========        
           // System.out.println("Calling applyTemplateToNode - 
"+Thread.currentThread().getName());
           DTMIterator dtmIter = new org.apache.xpath.axes.SelfIteratorNoPredicate();
           dtmIter.setRoot(node, xctxt);
  @@ -1589,7 +1655,7 @@
      * <p>If we encounter a variable
      * that is already defined in the variable stack, we ignore it.  This
      * is because the second variable definition will be at a lower import
  -   * precedence.  Presumably, global variables at the same import precedence
  +   * precedence.  Presumably, global"variables at the same import precedence
      * with the same name will have been caught during the recompose process.
      * <p>However, if we encounter a parameter that is already defined in the
      * variable stack, we need to see if this is a parameter whose value was
  
  
  
  1.40      +2 -33     xml-xalan/java/src/org/apache/xpath/XPathContext.java
  
  Index: XPathContext.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xpath/XPathContext.java,v
  retrieving revision 1.39
  retrieving revision 1.40
  diff -u -r1.39 -r1.40
  --- XPathContext.java 8 Jun 2002 20:34:21 -0000       1.39
  +++ XPathContext.java 10 Jun 2002 19:24:42 -0000      1.40
  @@ -92,9 +92,6 @@
   import javax.xml.transform.sax.SAXSource;
   import javax.xml.transform.dom.DOMSource;
   
  -// Temporary!!!
  -import org.apache.xalan.extensions.ExtensionsTable;
  -
   import javax.xml.transform.SourceLocator;
   import javax.xml.transform.Source;
   import javax.xml.transform.ErrorListener;
  @@ -198,7 +195,7 @@
     }
                                
     /**
  -   * Get an instance of a DTM that "owns" a node handle.
  +   * Get an instance of a DTM that "owns" a node handle. 
      *
      * @param nodeHandle the nodeHandle.
      *
  @@ -484,34 +481,6 @@
       return m_owner;
     }
   
  -  // ================ extensionsTable ===================
  -
  -  /**
  -   * The table of Extension Handlers.
  -   */
  -  private ExtensionsTable m_extensionsTable = new ExtensionsTable();
  -
  -  /**
  -   * Get the extensions table object.
  -   *
  -   * @return The extensions table.
  -   */
  -  public ExtensionsTable getExtensionsTable()
  -  {
  -    return m_extensionsTable;
  -  }
  -
  -  /**
  -   * Set the extensions table object.
  -   *
  -   *
  -   * @param table The extensions table object.
  -   */
  -  void setExtensionsTable(ExtensionsTable table)
  -  {
  -    m_extensionsTable = table;
  -  }
  -
     // ================ VarStack ===================
   
     /**
  @@ -531,7 +500,7 @@
       return m_variableStacks;
     }
   
  -  /**
  +  /** 
      * Get the variable stack, which is in charge of variables and
      * parameters.
      *
  
  
  
  1.2       +87 -0     xml-xalan/java/src/org/apache/xpath/ExtensionsProvider.java
  
  
  
  
  1.8       +4 -3      
xml-xalan/java/src/org/apache/xpath/functions/FuncExtElementAvailable.java
  
  Index: FuncExtElementAvailable.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xpath/functions/FuncExtElementAvailable.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- FuncExtElementAvailable.java      12 Jun 2001 19:16:33 -0000      1.7
  +++ FuncExtElementAvailable.java      10 Jun 2002 19:24:42 -0000      1.8
  @@ -68,6 +68,7 @@
   
   import org.apache.xpath.XPathContext;
   import org.apache.xpath.XPath;
  +import org.apache.xpath.ExtensionsProvider;
   import org.apache.xpath.objects.XObject;
   import org.apache.xpath.objects.XBoolean;
   
  @@ -128,9 +129,9 @@
       }
       else
       {
  -      ExtensionsTable etable = xctxt.getExtensionsTable();
  -
  -      return etable.elementAvailable(namespace, methName)
  +      //dml
  +      ExtensionsProvider extProvider = (ExtensionsProvider)xctxt.getOwnerObject();
  +      return extProvider.elementAvailable(namespace, methName)
                ? XBoolean.S_TRUE : XBoolean.S_FALSE;
       }
     }
  
  
  
  1.15      +16 -6     
xml-xalan/java/src/org/apache/xpath/functions/FuncExtFunction.java
  
  Index: FuncExtFunction.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xpath/functions/FuncExtFunction.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- FuncExtFunction.java      22 Mar 2002 01:04:44 -0000      1.14
  +++ FuncExtFunction.java      10 Jun 2002 19:24:42 -0000      1.15
  @@ -60,7 +60,9 @@
   
   import org.apache.xpath.Expression;
   import org.apache.xpath.XPathContext;
  +import org.apache.xpath.ExtensionsProvider;
   import org.apache.xpath.objects.*;
  +import org.apache.xalan.transformer.TransformerImpl;
   import org.apache.xalan.extensions.ExtensionsTable;
   import org.apache.xml.dtm.DTMIterator;
   
  @@ -133,6 +135,15 @@
         }
       }
     }
  +  //called by StylesheetHandler.createXPath() -- dml 
  +  public String getNamespace()
  +  {
  +    return m_namespace;
  +  }
  +  public String getFunctionName()
  +  {
  +    return m_extensionName;
  +  }
   
     /**
      * Create a new FuncExtFunction based on the qualified name of the extension,
  @@ -148,7 +159,7 @@
     public FuncExtFunction(java.lang.String namespace,
                            java.lang.String extensionName, Object methodKey)
     {
  -
  +    //try{throw new Exception("FuncExtFunction() " + namespace + " " + 
extensionName);} catch (Exception e){e.printStackTrace();}
       m_namespace = namespace;
       m_extensionName = extensionName;
       m_methodKey = methodKey;
  @@ -178,11 +189,10 @@
   
         argVec.addElement(xobj);
       }
  -
  -    ExtensionsTable etable = xctxt.getExtensionsTable();
  -    Object val = etable.extFunction(m_namespace, m_extensionName, argVec,
  -                                    m_methodKey,
  -                                    xctxt.getExpressionContext());
  +    //dml
  +    ExtensionsProvider extProvider = (ExtensionsProvider)xctxt.getOwnerObject();
  +    Object val = extProvider.extFunction(m_namespace, m_extensionName, 
  +                                         argVec, m_methodKey);
   
       if (null != val)
       {
  
  
  
  1.7       +6 -4      
xml-xalan/java/src/org/apache/xpath/functions/FuncExtFunctionAvailable.java
  
  Index: FuncExtFunctionAvailable.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xpath/functions/FuncExtFunctionAvailable.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- FuncExtFunctionAvailable.java     12 Jun 2001 19:16:34 -0000      1.6
  +++ FuncExtFunctionAvailable.java     10 Jun 2002 19:24:42 -0000      1.7
  @@ -58,7 +58,8 @@
   
   import org.apache.xml.utils.PrefixResolver;
   import org.apache.xalan.templates.Constants;
  -import org.apache.xalan.extensions.ExtensionsTable;
  +//import org.apache.xalan.transformer.TransformerImpl;
  +//import org.apache.xalan.extensions.ExtensionsTable;
   
   //import org.w3c.dom.Node;
   
  @@ -66,6 +67,7 @@
   
   import org.apache.xpath.XPathContext;
   import org.apache.xpath.XPath;
  +import org.apache.xpath.ExtensionsProvider;
   import org.apache.xpath.compiler.Keywords;
   import org.apache.xpath.objects.XObject;
   import org.apache.xpath.objects.XBoolean;
  @@ -123,9 +125,9 @@
       }
       else
       {
  -      ExtensionsTable etable = xctxt.getExtensionsTable();
  -
  -      return etable.functionAvailable(namespace, methName)
  +      //dml
  +      ExtensionsProvider extProvider = (ExtensionsProvider)xctxt.getOwnerObject();
  +      return extProvider.functionAvailable(namespace, methName)
                ? XBoolean.S_TRUE : XBoolean.S_FALSE;
       }
     }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to