morten      01/12/04 02:30:08

  Modified:    java/src/org/apache/xalan/xsltc NodeIterator.java
               java/src/org/apache/xalan/xsltc/dom AbsoluteIterator.java
                        CurrentNodeListIterator.java DOMImpl.java
                        FilterIterator.java FilteredStepIterator.java
                        KeyIndex.java MatchingIterator.java MultiDOM.java
                        NodeIteratorBase.java NthIterator.java
                        StepIterator.java UnionIterator.java
  Log:
  A fix for the various node iterators cloneIterator() method. This method
  should clear the _isRestartable flag to prevent iterators contained within
  variables and parameters from changing their value. This flag is now wrapped
  inside a setRestartable(boolean flag) method so that the call can be
  propagated down a stack of iterators. This seems to solve many of our
  iterator problems.
  PR:           n/a
  Obtained from:        n/a
  Submitted by: [EMAIL PROTECTED]
  Reviewed by:  [EMAIL PROTECTED]
  
  Revision  Changes    Path
  1.2       +6 -1      
xml-xalan/java/src/org/apache/xalan/xsltc/NodeIterator.java
  
  Index: NodeIterator.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/NodeIterator.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- NodeIterator.java 2001/04/17 18:51:13     1.1
  +++ NodeIterator.java 2001/12/04 10:30:07     1.2
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: NodeIterator.java,v 1.1 2001/04/17 18:51:13 sboag Exp $
  + * @(#)$Id: NodeIterator.java,v 1.2 2001/12/04 10:30:07 morten Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -111,5 +111,10 @@
        * Returns a deep copy of this iterator.
        */
       public NodeIterator cloneIterator();
  +
  +    /**
  +     * Prevents or allows iterator restarts.
  +     */
  +    public void setRestartable(boolean isRestartable);
   
   }
  
  
  
  1.6       +7 -2      
xml-xalan/java/src/org/apache/xalan/xsltc/dom/AbsoluteIterator.java
  
  Index: AbsoluteIterator.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/dom/AbsoluteIterator.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- AbsoluteIterator.java     2001/10/30 15:49:31     1.5
  +++ AbsoluteIterator.java     2001/12/04 10:30:07     1.6
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: AbsoluteIterator.java,v 1.5 2001/10/30 15:49:31 morten Exp $
  + * @(#)$Id: AbsoluteIterator.java,v 1.6 2001/12/04 10:30:07 morten Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -77,6 +77,11 @@
       public int next() {
        return returnNode(_source.next());
       }
  +
  +    public void setRestartable(boolean isRestartable) {
  +     _isRestartable = isRestartable;
  +     _source.setRestartable(isRestartable);
  +    }
        
       public NodeIterator setStartNode(int node) {
        _startNode = DOM.ROOTNODE;
  @@ -90,7 +95,7 @@
       public NodeIterator cloneIterator() {
        try {
            final AbsoluteIterator clone = (AbsoluteIterator)super.clone();
  -         clone._isRestartable = false;
  +         clone.setRestartable(false);
            clone._source = _source.cloneIterator();
            return clone.reset();
        }
  
  
  
  1.5       +7 -2      
xml-xalan/java/src/org/apache/xalan/xsltc/dom/CurrentNodeListIterator.java
  
  Index: CurrentNodeListIterator.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/dom/CurrentNodeListIterator.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- CurrentNodeListIterator.java      2001/11/27 15:20:55     1.4
  +++ CurrentNodeListIterator.java      2001/12/04 10:30:07     1.5
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: CurrentNodeListIterator.java,v 1.4 2001/11/27 15:20:55 morten 
Exp $
  + * @(#)$Id: CurrentNodeListIterator.java,v 1.5 2001/12/04 10:30:07 morten 
Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -104,6 +104,11 @@
        return this;
       }
   
  +    public void setRestartable(boolean isRestartable) {
  +     _isRestartable = isRestartable;
  +     _source.setRestartable(isRestartable);
  +    }
  +
       public boolean isReverse() {
        return !_docOrder;
       }
  @@ -113,7 +118,7 @@
            final CurrentNodeListIterator clone =
                (CurrentNodeListIterator)super.clone();
            clone._nodes = (IntegerArray)_nodes.clone();
  -         clone._isRestartable = false;
  +         clone.setRestartable(false);
            return clone.reset();
        }
        catch (CloneNotSupportedException e) {
  
  
  
  1.65      +24 -14    
xml-xalan/java/src/org/apache/xalan/xsltc/dom/DOMImpl.java
  
  Index: DOMImpl.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/dom/DOMImpl.java,v
  retrieving revision 1.64
  retrieving revision 1.65
  diff -u -r1.64 -r1.65
  --- DOMImpl.java      2001/11/29 11:33:09     1.64
  +++ DOMImpl.java      2001/12/04 10:30:07     1.65
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: DOMImpl.java,v 1.64 2001/11/29 11:33:09 morten Exp $
  + * @(#)$Id: DOMImpl.java,v 1.65 2001/12/04 10:30:07 morten Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -105,6 +105,7 @@
            public boolean isReverse() { return false; }
            public NodeIterator resetOnce() { return this; }
            public NodeIterator includeSelf() { return this; }
  +         public void setRestartable(boolean isRestartable) { }
        };
   
       // Contains the number of nodes and attribute nodes in the tree
  @@ -743,7 +744,7 @@
                final TypedChildrenIterator clone =
                    (TypedChildrenIterator)super.clone();
                clone._nodeType = _nodeType;
  -             clone._isRestartable = false;
  +             clone.setRestartable(false);
                return clone.reset();
            }
            catch (CloneNotSupportedException e) {
  @@ -1201,7 +1202,7 @@
            try {
                final PrecedingIterator clone = 
                    (PrecedingIterator)super.clone();
  -             clone._isRestartable = false;
  +             clone.setRestartable(false);
                return clone.reset();
            }
            catch (CloneNotSupportedException e) {
  @@ -1361,7 +1362,7 @@
        public NodeIterator cloneIterator() {
            try {
                final AncestorIterator clone = (AncestorIterator)super.clone();
  -             clone._isRestartable = false; // must set to false for any clone
  +             clone.setRestartable(false); // must set to false for any clone
                clone._startNode = _startNode;
                return clone.reset();
            }
  @@ -1537,6 +1538,11 @@
            _pos = pos;
        }
   
  +     public void setRestartable(boolean isRestartable) {
  +         _isRestartable = isRestartable;
  +         _source.setRestartable(isRestartable);
  +     }
  +
        // The start node of this iterator is always the root!!!
        public NodeIterator setStartNode(int node) {
            _source.setStartNode(node);
  @@ -1625,6 +1631,11 @@
            }
        }
   
  +     public void setRestartable(boolean isRestartable) {
  +         _isRestartable = isRestartable;
  +         _source.setRestartable(isRestartable);
  +     }
  +
        public NodeIterator setStartNode(int node) {
            if (_children) {
                if (_filter.stripSpace((DOM)DOMImpl.this, node,
  @@ -1724,6 +1735,7 @@
        private boolean _op;
        private final boolean _isReverse;
        private int _returnType = RETURN_PARENT;
  +     private int _pos;
   
        public NodeValueIterator(NodeIterator source, int returnType,
                                 String value, boolean op) {
  @@ -1738,20 +1750,16 @@
            return _isReverse;
        }
       
  +     public void setRestartable(boolean isRestartable) {
  +         _isRestartable = isRestartable;
  +         _source.setRestartable(isRestartable);
  +     }
  +
        public NodeIterator cloneIterator() {
            try {
                NodeValueIterator clone = (NodeValueIterator)super.clone();
                clone._source = _source.cloneIterator();
  -             if (_source instanceof StepIterator) {
  -                 StepIterator source = (StepIterator)clone._source;
  -                 source.setRestartable();
  -             }
  -             else if (_source instanceof NodeIteratorBase) {
  -                 NodeIteratorBase source = (NodeIteratorBase)clone._source;
  -                 source._isRestartable = true;
  -             }
  -             clone._value = _value;
  -             clone._op = _op;
  +             clone.setRestartable(false);
                return clone.reset();
            }
            catch (CloneNotSupportedException e) {
  @@ -1791,10 +1799,12 @@
   
        public void setMark() {
            _source.setMark();
  +         _pos = _position;
        }
   
        public void gotoMark() {
            _source.gotoMark();
  +         _position = _pos;
        }
       }                       
   
  
  
  
  1.4       +8 -3      
xml-xalan/java/src/org/apache/xalan/xsltc/dom/FilterIterator.java
  
  Index: FilterIterator.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/dom/FilterIterator.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- FilterIterator.java       2001/10/30 15:49:32     1.3
  +++ FilterIterator.java       2001/12/04 10:30:07     1.4
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: FilterIterator.java,v 1.3 2001/10/30 15:49:32 morten Exp $
  + * @(#)$Id: FilterIterator.java,v 1.4 2001/12/04 10:30:07 morten Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -80,11 +80,16 @@
       public boolean isReverse() {
        return _isReverse;
       }
  -    
  +
  +    public void setRestartable(boolean isRestartable) {
  +     _isRestartable = isRestartable;
  +     _source.setRestartable(isRestartable);
  +    }
  +
       public NodeIterator cloneIterator() {
        try {
            final FilterIterator clone = (FilterIterator)super.clone();
  -         clone._isRestartable = false;
  +         clone.setRestartable(false);
            clone._source = _source.cloneIterator();
            return clone.reset();
        }
  
  
  
  1.5       +2 -2      
xml-xalan/java/src/org/apache/xalan/xsltc/dom/FilteredStepIterator.java
  
  Index: FilteredStepIterator.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/dom/FilteredStepIterator.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- FilteredStepIterator.java 2001/11/27 15:20:55     1.4
  +++ FilteredStepIterator.java 2001/12/04 10:30:07     1.5
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: FilteredStepIterator.java,v 1.4 2001/11/27 15:20:55 morten Exp $
  + * @(#)$Id: FilteredStepIterator.java,v 1.5 2001/12/04 10:30:07 morten Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -85,7 +85,7 @@
            clone._source = _source.cloneIterator();
            clone._iterator = _iterator.cloneIterator();
            clone._filter = _filter;
  -         clone.setNotRestartable();
  +         clone.setRestartable(false);
            return clone.reset();
        }
        catch (CloneNotSupportedException e) {
  
  
  
  1.7       +5 -1      
xml-xalan/java/src/org/apache/xalan/xsltc/dom/KeyIndex.java
  
  Index: KeyIndex.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/dom/KeyIndex.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- KeyIndex.java     2001/11/27 15:20:55     1.6
  +++ KeyIndex.java     2001/12/04 10:30:07     1.7
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: KeyIndex.java,v 1.6 2001/11/27 15:20:55 morten Exp $
  + * @(#)$Id: KeyIndex.java,v 1.7 2001/12/04 10:30:07 morten Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -85,6 +85,10 @@
        */
       public KeyIndex(int size) {
        _arraySize = size;
  +    }
  +
  +    public void setRestartable(boolean flag) {
  +         
       }
    
       /**
  
  
  
  1.6       +7 -2      
xml-xalan/java/src/org/apache/xalan/xsltc/dom/MatchingIterator.java
  
  Index: MatchingIterator.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/dom/MatchingIterator.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- MatchingIterator.java     2001/11/27 15:20:55     1.5
  +++ MatchingIterator.java     2001/12/04 10:30:07     1.6
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: MatchingIterator.java,v 1.5 2001/11/27 15:20:55 morten Exp $
  + * @(#)$Id: MatchingIterator.java,v 1.6 2001/12/04 10:30:07 morten Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -76,11 +76,16 @@
        _match = match;
       }
   
  +    public void setRestartable(boolean isRestartable) {
  +     _isRestartable = isRestartable;
  +     _source.setRestartable(isRestartable);
  +    }
  +
       public NodeIterator cloneIterator() {
        try {
            final MatchingIterator clone = (MatchingIterator)super.clone();
            clone._source = _source.cloneIterator();
  -         clone._isRestartable = false;
  +         clone.setRestartable(false);
            return clone;
        }
        catch (CloneNotSupportedException e) {
  
  
  
  1.16      +13 -6     
xml-xalan/java/src/org/apache/xalan/xsltc/dom/MultiDOM.java
  
  Index: MultiDOM.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/dom/MultiDOM.java,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- MultiDOM.java     2001/11/27 15:20:55     1.15
  +++ MultiDOM.java     2001/12/04 10:30:07     1.16
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: MultiDOM.java,v 1.15 2001/11/27 15:20:55 morten Exp $
  + * @(#)$Id: MultiDOM.java,v 1.16 2001/12/04 10:30:07 morten Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -107,6 +107,10 @@
            return node != END ? (node | _mask) : END;
        }
        
  +     public void setRestartable(boolean flag) {
  +         _source.setRestartable(flag);
  +     }
  +
        public NodeIterator setStartNode(final int node) {
            _mask = node & SET;
            int dom = node >>> 24;
  @@ -155,7 +159,7 @@
        public NodeIterator cloneIterator() {
            final AxisIterator clone = new AxisIterator(_axis, _type);
            clone._source = _source.cloneIterator();
  -         clone._mask = _mask;            
  +         clone._mask = _mask;
            return clone;
        }
   
  @@ -191,9 +195,7 @@
            try {
                NodeValueIterator clone = (NodeValueIterator)super.clone();
                clone._source = _source.cloneIterator();
  -             clone._value = _value;
  -             clone._op = _op;
  -             _isRestartable = false;
  +             clone.setRestartable(false);
                return clone.reset();
            }
            catch (CloneNotSupportedException e) {
  @@ -202,7 +204,12 @@
                return null;
            }
        }
  -    
  +
  +     public void setRestartable(boolean isRestartable) {
  +         _isRestartable = isRestartable;
  +         _source.setRestartable(isRestartable);
  +     }
  +
        public NodeIterator reset() {
            _source.reset();
            return resetPosition();
  
  
  
  1.6       +6 -1      
xml-xalan/java/src/org/apache/xalan/xsltc/dom/NodeIteratorBase.java
  
  Index: NodeIteratorBase.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/dom/NodeIteratorBase.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- NodeIteratorBase.java     2001/10/30 15:49:32     1.5
  +++ NodeIteratorBase.java     2001/12/04 10:30:07     1.6
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: NodeIteratorBase.java,v 1.5 2001/10/30 15:49:32 morten Exp $
  + * @(#)$Id: NodeIteratorBase.java,v 1.6 2001/12/04 10:30:07 morten Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -58,6 +58,7 @@
    *
    * @author Jacek Ambroziak
    * @author Santiago Pericas-Geertsen
  + * @author Morten Jorgensen
    *
    */
   
  @@ -74,6 +75,10 @@
       protected int _startNode = NodeIterator.END;
       protected boolean _includeSelf = false;
       protected boolean _isRestartable = true;
  +
  +    public void setRestartable(boolean isRestartable) {
  +     _isRestartable = isRestartable;
  +    }
   
       public NodeIterator reset() {
        final boolean temp = _isRestartable;
  
  
  
  1.9       +11 -5     
xml-xalan/java/src/org/apache/xalan/xsltc/dom/NthIterator.java
  
  Index: NthIterator.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/dom/NthIterator.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- NthIterator.java  2001/11/27 15:20:55     1.8
  +++ NthIterator.java  2001/12/04 10:30:07     1.9
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: NthIterator.java,v 1.8 2001/11/27 15:20:55 morten Exp $
  + * @(#)$Id: NthIterator.java,v 1.9 2001/12/04 10:30:07 morten Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -77,6 +77,11 @@
        _source = source;
        _position = n;
       }
  +
  +    public void setRestartable(boolean isRestartable) {
  +     _isRestartable = isRestartable;
  +     _source.setRestartable(isRestartable);
  +    }
       
       public int next() {
        if (_ready && _position > 0) {
  @@ -94,8 +99,10 @@
       }
        
       public NodeIterator setStartNode(final int node) {
  -     _source.setStartNode(node);
  -     _ready = true;
  +     if (_isRestartable) {
  +         _source.setStartNode(node);
  +         _ready = true;
  +     }
        return this;
       }
        
  @@ -127,9 +134,8 @@
   
       public NodeIterator cloneIterator() {
        NodeIterator clone = _source.cloneIterator();
  -     ((NodeIteratorBase)clone)._isRestartable = true;
        NthIterator other = new NthIterator(clone, _position);
  -     other._isRestartable = false;
  +     other.setRestartable(false);
        return other.reset();
       }
   }
  
  
  
  1.11      +6 -24     
xml-xalan/java/src/org/apache/xalan/xsltc/dom/StepIterator.java
  
  Index: StepIterator.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/dom/StepIterator.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- StepIterator.java 2001/11/29 11:33:09     1.10
  +++ StepIterator.java 2001/12/04 10:30:07     1.11
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: StepIterator.java,v 1.10 2001/11/29 11:33:09 morten Exp $
  + * @(#)$Id: StepIterator.java,v 1.11 2001/12/04 10:30:07 morten Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -79,36 +79,18 @@
        _iterator = iterator;
       }
   
  -    protected void setRestartable() {
  -     _isRestartable = true;
  -     if (_source instanceof StepIterator) {
  -         ((StepIterator)_source).setRestartable();
  -     }
  -     else if (_source instanceof NodeIteratorBase) {
  -         ((NodeIteratorBase)_source)._isRestartable = true;
  -     }
  -     if (_iterator instanceof NodeIteratorBase)
  -         ((NodeIteratorBase)_iterator)._isRestartable = true;
  +    public void setRestartable(boolean isRestartable) {
  +     _isRestartable = isRestartable;
  +     _source.setRestartable(isRestartable);
  +     _iterator.setRestartable(true); // must _always_ be restartable
       }
   
  -    protected void setNotRestartable() {
  -     _isRestartable = false;
  -     if (_source instanceof StepIterator) {
  -         ((StepIterator)_source).setNotRestartable();
  -     }
  -     else if (_source instanceof NodeIteratorBase) {
  -         ((NodeIteratorBase)_source)._isRestartable = false;
  -     }
  -     if (_iterator instanceof NodeIteratorBase)
  -         ((NodeIteratorBase)_iterator)._isRestartable = true;
  -    }
  -
       public NodeIterator cloneIterator() {
        try {
            final StepIterator clone = (StepIterator)super.clone();
            clone._source = _source.cloneIterator();
            clone._iterator = _iterator.cloneIterator();
  -         clone.setNotRestartable();
  +         clone.setRestartable(false);
            return clone.reset();
        }
        catch (CloneNotSupportedException e) {
  
  
  
  1.10      +2 -2      
xml-xalan/java/src/org/apache/xalan/xsltc/dom/UnionIterator.java
  
  Index: UnionIterator.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/dom/UnionIterator.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- UnionIterator.java        2001/11/27 15:20:55     1.9
  +++ UnionIterator.java        2001/12/04 10:30:07     1.10
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: UnionIterator.java,v 1.9 2001/11/27 15:20:55 morten Exp $
  + * @(#)$Id: UnionIterator.java,v 1.10 2001/12/04 10:30:07 morten Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -125,7 +125,7 @@
        try {
            final UnionIterator clone = (UnionIterator)super.clone();
            System.arraycopy(_heap, 0, heapCopy, 0, _heap.length);
  -         clone._isRestartable = false;
  +         clone.setRestartable(false);
            clone._heap = heapCopy;
            return clone.reset();
        } 
  
  
  

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

Reply via email to