sboag       00/11/08 09:15:46

  Modified:    java/src/org/apache/xalan/processor ProcessorLRE.java
                        StylesheetHandler.java
               java/src/org/apache/xalan/utils SAXSourceLocator.java
               java/src/org/apache/xpath Expression.java VariableStack.java
               java/src/org/apache/xpath/axes FilterExprWalker.java
                        LocPathIterator.java
               java/src/org/apache/xpath/compiler Compiler.java
  Log:
  Fixes for variable resolution.
  
  Revision  Changes    Path
  1.11      +11 -1     
xml-xalan/java/src/org/apache/xalan/processor/ProcessorLRE.java
  
  Index: ProcessorLRE.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/processor/ProcessorLRE.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- ProcessorLRE.java 2000/11/03 23:28:03     1.10
  +++ ProcessorLRE.java 2000/11/08 17:13:59     1.11
  @@ -67,6 +67,7 @@
   
   import org.xml.sax.SAXException;
   import org.xml.sax.Attributes;
  +import org.xml.sax.Locator;
   import org.xml.sax.helpers.AttributesImpl;
   
   import javax.xml.transform.TransformerConfigurationException;
  @@ -127,7 +128,16 @@
   
         // stylesheet.setDOMBackPointer(handler.getOriginatingNode());
          // ***** Note that we're assigning an empty locator. Is this 
necessary?
  -      stylesheet.setLocaterInfo(new SAXSourceLocator());
  +      SAXSourceLocator slocator = new SAXSourceLocator();
  +      Locator locator = handler.getLocator();
  +      if(null != locator)
  +      {
  +        slocator.setLineNumber(locator.getLineNumber());
  +        slocator.setColumnNumber(locator.getColumnNumber());
  +        slocator.setPublicId(locator.getPublicId());
  +        slocator.setSystemId(locator.getSystemId());
  +      }
  +      stylesheet.setLocaterInfo(slocator);
         stylesheet.setPrefixes(handler.getNamespaceSupport());
         handler.pushStylesheet(stylesheet);
   
  
  
  
  1.16      +2 -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.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- StylesheetHandler.java    2000/11/03 23:28:03     1.15
  +++ StylesheetHandler.java    2000/11/08 17:14:07     1.16
  @@ -1254,7 +1254,8 @@
         SAXSourceLocator locator = new SAXSourceLocator();
   
         locator.setSystemId(this.getStylesheetProcessor().getDOMsystemID());
  -      m_stylesheetLocatorStack.push(locator);
  +      return locator;
  +      // m_stylesheetLocatorStack.push(locator);
       }
   
       return ((SAXSourceLocator) m_stylesheetLocatorStack.peek());
  
  
  
  1.2       +77 -1     
xml-xalan/java/src/org/apache/xalan/utils/SAXSourceLocator.java
  
  Index: SAXSourceLocator.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/utils/SAXSourceLocator.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- SAXSourceLocator.java     2000/11/03 23:28:13     1.1
  +++ SAXSourceLocator.java     2000/11/08 17:14:30     1.2
  @@ -71,6 +71,7 @@
   public class SAXSourceLocator extends LocatorImpl
           implements SourceLocator, Serializable
   {
  +  Locator m_locator;
   
     /**
      * Constructor SAXSourceLocator
  @@ -86,10 +87,85 @@
      */
     public SAXSourceLocator(Locator locator)
     {
  -
  +    m_locator = locator;
       this.setColumnNumber(locator.getColumnNumber());
       this.setLineNumber(locator.getLineNumber());
       this.setPublicId(locator.getPublicId());
       this.setSystemId(locator.getSystemId());
  +  }
  +  
  +  /**
  +   * Return the public identifier for the current document event.
  +   *
  +   * <p>The return value is the public identifier of the document
  +   * entity or of the external parsed entity in which the markup
  +   * triggering the event appears.</p>
  +   *
  +   * @return A string containing the public identifier, or
  +   *         null if none is available.
  +   * @see #getSystemId
  +   */
  +  public String getPublicId()
  +  {
  +    return (null == m_locator) ? super.getPublicId() : 
m_locator.getPublicId();
  +  }
  +
  +  /**
  +   * Return the system identifier for the current document event.
  +   *
  +   * <p>The return value is the system identifier of the document
  +   * entity or of the external parsed entity in which the markup
  +   * triggering the event appears.</p>
  +   *
  +   * <p>If the system identifier is a URL, the parser must resolve it
  +   * fully before passing it to the application.</p>
  +   *
  +   * @return A string containing the system identifier, or null
  +   *         if none is available.
  +   * @see #getPublicId
  +   */
  +  public String getSystemId()
  +  {
  +    return (null == m_locator) ? super.getSystemId() : 
m_locator.getSystemId();
  +  }
  +  
  +  /**
  +   * Return the line number where the current document event ends.
  +   *
  +   * <p><strong>Warning:</strong> The return value from the method
  +   * is intended only as an approximation for the sake of error
  +   * reporting; it is not intended to provide sufficient information
  +   * to edit the character content of the original XML document.</p>
  +   *
  +   * <p>The return value is an approximation of the line number
  +   * in the document entity or external parsed entity where the
  +   * markup triggering the event appears.</p>
  +   *
  +   * @return The line number, or -1 if none is available.
  +   * @see #getColumnNumber
  +   */
  +  public int getLineNumber()
  +  {
  +    return (null == m_locator) ? super.getLineNumber() : 
m_locator.getLineNumber();
  +  }
  +
  +  /**
  +   * Return the column number where the current document event ends.
  +   *
  +   * <p><strong>Warning:</strong> The return value from the method
  +   * is intended only as an approximation for the sake of error
  +   * reporting; it is not intended to provide sufficient information
  +   * to edit the character content of the original XML document.</p>
  +   *
  +   * <p>The return value is an approximation of the column number
  +   * in the document entity or external parsed entity where the
  +   * markup triggering the event appears.</p>
  +   *
  +   * @return The column number, or -1 if none is available.
  +   * @see #getLineNumber
  +   */
  +  public int getColumnNumber()
  +  {
  +    return (null == m_locator) ? super.getColumnNumber() : 
m_locator.getColumnNumber();
     }
   }
  
  
  
  1.8       +11 -6     xml-xalan/java/src/org/apache/xpath/Expression.java
  
  Index: Expression.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xpath/Expression.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- Expression.java   2000/11/06 19:27:32     1.7
  +++ Expression.java   2000/11/08 17:14:48     1.8
  @@ -79,7 +79,12 @@
   {
   
     /** NEEDSDOC Field m_xpath          */
  -  protected XPath m_xpath;
  +  protected SourceLocator m_slocator;
  +  
  +  public void setSourceLocator(SourceLocator locator)
  +  {
  +    m_slocator = locator;
  +  }
   
     /**
      * NEEDSDOC Method execute 
  @@ -120,9 +125,9 @@
       else
       {
         // Where to send diagnostics in this case?
  -      if(null != m_xpath)
  +      if(null != m_slocator)
         {
  -        SourceLocator slocator = m_xpath.getLocator();
  +        SourceLocator slocator = m_slocator;
           System.out.println(fmsg + "; file " + slocator.getSystemId()
                              + "; line " + slocator.getLineNumber() + "; 
column "
                              + slocator.getColumnNumber()); 
  @@ -178,14 +183,14 @@
         ErrorHandler eh = reader.getErrorHandler();
   
         SAXParseException te = new SAXParseException(fmsg,
  -                                                   
(SAXSourceLocator)m_xpath.getLocator());
  +                                                   
(SAXSourceLocator)m_slocator);
         eh.fatalError(te);
       }
       else
       {
  -      if(null != m_xpath)
  +      if(null != m_slocator)
         {
  -        SourceLocator slocator = m_xpath.getLocator();
  +        SourceLocator slocator = m_slocator;
           System.out.println(fmsg + "; file " + slocator.getSystemId()
                              + "; line " + slocator.getLineNumber() + "; 
column "
                              + slocator.getColumnNumber());
  
  
  
  1.8       +9 -1      xml-xalan/java/src/org/apache/xpath/VariableStack.java
  
  Index: VariableStack.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xpath/VariableStack.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- VariableStack.java        2000/11/06 20:55:46     1.7
  +++ VariableStack.java        2000/11/08 17:14:52     1.8
  @@ -121,9 +121,17 @@
     /**
      * NEEDSDOC
      */
  -  public int getSearchStart()
  +  public int getSearchStartOrTop()
     {
       return (-1 == m_searchStart) ? this.size() : m_searchStart;
  +  }
  +  
  +  /**
  +   * NEEDSDOC
  +   */
  +  public int getSearchStart()
  +  {
  +    return m_searchStart;
     }
   
     /**
  
  
  
  1.6       +2 -1      
xml-xalan/java/src/org/apache/xpath/axes/FilterExprWalker.java
  
  Index: FilterExprWalker.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/FilterExprWalker.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- FilterExprWalker.java     2000/10/30 18:58:49     1.5
  +++ FilterExprWalker.java     2000/11/08 17:15:13     1.6
  @@ -139,9 +139,10 @@
   
         // System.out.println("calling 
m_expr.execute(m_lpi.getXPathContext())");
         XObject obj = m_expr.execute(m_lpi.getXPathContext());
  -
  +      
         // System.out.println("Back from 
m_expr.execute(m_lpi.getXPathContext()): "+obj);
         m_nodeSet = (null != obj) ? obj.nodeset() : null;
  +      
         m_peek = null;
       }
       catch (org.xml.sax.SAXException se)
  
  
  
  1.10      +57 -21    
xml-xalan/java/src/org/apache/xpath/axes/LocPathIterator.java
  
  Index: LocPathIterator.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/LocPathIterator.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- LocPathIterator.java      2000/11/06 20:57:20     1.9
  +++ LocPathIterator.java      2000/11/08 17:15:18     1.10
  @@ -222,11 +222,26 @@
     }
     
     /** NEEDSDOC Method initContext **/
  -  private int m_varStackPos;
  +  int m_varStackPos = -1;
   
     /** NEEDSDOC Method initContext **/
  -  private int m_varStackContext;
  -
  +  int m_varStackContext;
  +  
  +  /**
  +   * Value determined at compile time.
  +   */
  +  private boolean m_isTopLevel = false;
  +  
  +  /**
  +   * <meta name="usage" content="internal"/>
  +   * Set if this is an iterator at the upper level of 
  +   * the XPath.
  +   */
  +  public void setIsTopLevel(boolean b)
  +  {
  +    m_isTopLevel = b;
  +  }
  +  
     /**
      * NEEDSDOC Method initContext 
      *
  @@ -241,9 +256,12 @@
       this.m_execContext = execContext;
       this.m_prefixResolver = execContext.getNamespaceContext();
       this.m_dhelper = execContext.getDOMHelper();
  -    VariableStack vars = execContext.getVarStack();
  -    this.m_varStackPos = vars.getSearchStart();
  -    this.m_varStackContext = vars.getContextPos();
  +    if(m_isTopLevel)
  +    {
  +      VariableStack vars = execContext.getVarStack();
  +      this.m_varStackPos = vars.getSearchStartOrTop();
  +      this.m_varStackContext = vars.getContextPos();
  +    }
     }
   
     /**
  @@ -477,6 +495,8 @@
       this.m_execContext = null;
       this.m_prefixResolver = null;
       this.m_dhelper = null;
  +    this.m_varStackPos = -1;
  +    this.m_varStackContext = 0;
   
       m_pool.freeInstance(this);
     }
  @@ -509,6 +529,8 @@
     {
   
       LocPathIterator clone = (LocPathIterator) super.clone();
  +    clone.m_varStackPos = this.m_varStackPos;
  +    clone.m_varStackContext = this.m_varStackContext;
   
       if (null != m_firstWalker)
       {
  @@ -588,26 +610,40 @@
   
         return next;
       }
  -
  -    VariableStack vars = m_execContext.getVarStack();
  -    int savedStart = vars.getSearchStart();
  -    vars.setSearchStart(m_varStackPos);
  -    vars.pushContextPosition(m_varStackContext);
       
  -    if (null == m_firstWalker.getRoot())
  +    if(-1 == m_varStackPos)
       {
  -      this.setNextPosition(0);
  -      m_firstWalker.setRoot(m_context);
  +      if (null == m_firstWalker.getRoot())
  +      {
  +        this.setNextPosition(0);
  +        m_firstWalker.setRoot(m_context);
   
  -      m_lastUsedWalker = m_firstWalker;
  +        m_lastUsedWalker = m_firstWalker;
  +      }
  +      return returnNextNode(m_firstWalker.nextNode());
       }
  -    
  -    Node n = returnNextNode(m_firstWalker.nextNode());
  -    
  -    vars.setSearchStart(savedStart);
  -    vars.popContextPosition();
  +    else
  +    {
  +      VariableStack vars = m_execContext.getVarStack();
  +      int savedStart = vars.getSearchStart();
  +      vars.setSearchStart(m_varStackPos);
  +      vars.pushContextPosition(m_varStackContext);
  +      
  +      if (null == m_firstWalker.getRoot())
  +      {
  +        this.setNextPosition(0);
  +        m_firstWalker.setRoot(m_context);
  +
  +        m_lastUsedWalker = m_firstWalker;
  +      }
   
  -    return n;
  +      Node n = returnNextNode(m_firstWalker.nextNode());
  +      
  +      vars.setSearchStart(savedStart);
  +      vars.popContextPosition();
  +
  +      return n;
  +    }
     }
   
     /**
  
  
  
  1.11      +52 -34    
xml-xalan/java/src/org/apache/xpath/compiler/Compiler.java
  
  Index: Compiler.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xpath/compiler/Compiler.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- Compiler.java     2000/11/03 23:28:16     1.10
  +++ Compiler.java     2000/11/08 17:15:36     1.11
  @@ -114,7 +114,15 @@
     public Compiler(ErrorHandler errorHandler, SourceLocator locator)
     {
       m_errorHandler = errorHandler;
  -    m_locator = locator;
  +    if(null != locator)
  +    {
  +      SAXSourceLocator ssl = new SAXSourceLocator();
  +      ssl.setColumnNumber(locator.getColumnNumber());
  +      ssl.setLineNumber(locator.getLineNumber());
  +      ssl.setPublicId(locator.getPublicId());
  +      ssl.setSystemId(locator.getSystemId());
  +      m_locator = ssl;
  +    }
     }
   
     /**
  @@ -144,77 +152,80 @@
   
       int op = m_opMap[opPos];
   
  +    Expression expr = null;
       // System.out.println(getPatternString()+"op: "+op);
       switch (op)
       {
       case OpCodes.OP_XPATH :
  -      return compile(opPos + 2);
  +      expr = compile(opPos + 2); break;
       case OpCodes.OP_OR :
  -      return or(opPos);
  +      expr = or(opPos); break;
       case OpCodes.OP_AND :
  -      return and(opPos);
  +      expr = and(opPos); break;
       case OpCodes.OP_NOTEQUALS :
  -      return notequals(opPos);
  +      expr = notequals(opPos); break;
       case OpCodes.OP_EQUALS :
  -      return equals(opPos);
  +      expr = equals(opPos); break;
       case OpCodes.OP_LTE :
  -      return lte(opPos);
  +      expr = lte(opPos); break;
       case OpCodes.OP_LT :
  -      return lt(opPos);
  +      expr = lt(opPos); break;
       case OpCodes.OP_GTE :
  -      return gte(opPos);
  +      expr = gte(opPos); break;
       case OpCodes.OP_GT :
  -      return gt(opPos);
  +      expr = gt(opPos); break;
       case OpCodes.OP_PLUS :
  -      return plus(opPos);
  +      expr = plus(opPos); break;
       case OpCodes.OP_MINUS :
  -      return minus(opPos);
  +      expr = minus(opPos); break;
       case OpCodes.OP_MULT :
  -      return mult(opPos);
  +      expr = mult(opPos); break;
       case OpCodes.OP_DIV :
  -      return div(opPos);
  +      expr = div(opPos); break;
       case OpCodes.OP_MOD :
  -      return mod(opPos);
  +      expr = mod(opPos); break;
       case OpCodes.OP_QUO :
  -      return quo(opPos);
  +      expr = quo(opPos); break;
       case OpCodes.OP_NEG :
  -      return neg(opPos);
  +      expr = neg(opPos); break;
       case OpCodes.OP_STRING :
  -      return string(opPos);
  +      expr = string(opPos); break;
       case OpCodes.OP_BOOL :
  -      return bool(opPos);
  +      expr = bool(opPos); break;
       case OpCodes.OP_NUMBER :
  -      return number(opPos);
  +      expr = number(opPos); break;
       case OpCodes.OP_UNION :
  -      return union(opPos);
  +      expr = union(opPos); break;
       case OpCodes.OP_LITERAL :
  -      return literal(opPos);
  +      expr = literal(opPos); break;
       case OpCodes.OP_VARIABLE :
  -      return variable(opPos);
  +      expr = variable(opPos); break;
       case OpCodes.OP_GROUP :
  -      return group(opPos);
  +      expr = group(opPos); break;
       case OpCodes.OP_NUMBERLIT :
  -      return numberlit(opPos);
  +      expr = numberlit(opPos); break;
       case OpCodes.OP_ARGUMENT :
  -      return arg(opPos);
  +      expr = arg(opPos); break;
       case OpCodes.OP_EXTFUNCTION :
  -      return compileExtension(opPos);
  +      expr = compileExtension(opPos); break;
       case OpCodes.OP_FUNCTION :
  -      return compileFunction(opPos);
  +      expr = compileFunction(opPos); break;
       case OpCodes.OP_LOCATIONPATH :
  -      return locationPath(opPos);
  +      expr = locationPath(opPos); break;
       case OpCodes.OP_PREDICATE :
  -      return null;  // should never hit this here.
  +      expr = null; break;  // should never hit this here.
       case OpCodes.OP_MATCHPATTERN :
  -      return matchPattern(opPos + 2);
  +      expr = matchPattern(opPos + 2); break;
       case OpCodes.OP_LOCATIONPATHPATTERN :
  -      return locationPathPattern(opPos);
  +      expr = locationPathPattern(opPos); break;
       default :
         error(XPATHErrorResources.ER_UNKNOWN_OPCODE,
               new Object[]{ Integer.toString(m_opMap[opPos]) });  //"ERROR! 
Unknown op code: "+m_opMap[opPos]);
       }
  +    if(null != expr)
  +      expr.setSourceLocator(m_locator);
   
  -    return null;
  +    return expr;
     }
   
     /**
  @@ -639,6 +650,8 @@
     {
       return new UnionPathIterator(this, opPos);
     }
  +  
  +  private int locPathDepth = -1;
   
     /**
      * <meta name="usage" content="advanced"/>
  @@ -655,7 +668,12 @@
      */
     public Expression locationPath(int opPos) throws org.xml.sax.SAXException
     {
  -    return WalkerFactory.newLocPathIterator(this, opPos);
  +    locPathDepth++;
  +    LocPathIterator iter = WalkerFactory.newLocPathIterator(this, opPos);
  +    if(locPathDepth == 0)
  +      iter.setIsTopLevel(true);
  +    locPathDepth--;
  +    return iter;
     }
   
     /**
  
  
  

Reply via email to