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