igorh       2004/03/09 12:12:16

  Modified:    java/src/org/apache/xalan/xsltc/dom NodeCounter.java
  Log:
  fixing wrong commit
  
  Revision  Changes    Path
  1.12      +346 -346  
xml-xalan/java/src/org/apache/xalan/xsltc/dom/NodeCounter.java
  
  Index: NodeCounter.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/dom/NodeCounter.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- NodeCounter.java  9 Mar 2004 20:06:07 -0000       1.11
  +++ NodeCounter.java  9 Mar 2004 20:12:16 -0000       1.12
  @@ -1,346 +1,346 @@
  -/*
  - * Copyright 2001-2004 The Apache Software Foundation.
  - *
  - * Licensed under the Apache License, Version 2.0 (the "License");
  - * you may not use this file except in compliance with the License.
  - * You may obtain a copy of the License at
  - *
  - *     http://www.apache.org/licenses/LICENSE-2.0
  - *
  - * Unless required by applicable law or agreed to in writing, software
  - * distributed under the License is distributed on an "AS IS" BASIS,
  - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  - * See the License for the specific language governing permissions and
  - * limitations under the License.
  - */
  -/*
  - * $Id$
  - */
  -
  -package org.apache.xalan.xsltc.dom;
  -
  -import java.util.Vector;
  -
  -import org.apache.xalan.xsltc.DOM;
  -import org.apache.xalan.xsltc.Translet;
  -import org.apache.xml.dtm.DTM;
  -import org.apache.xml.dtm.DTMAxisIterator;
  -
  -/**
  - * @author Jacek Ambroziak
  - * @author Santiago Pericas-Geertsen
  - * @author Morten Jorgensen
  - */
  -public abstract class NodeCounter implements Axis {
  -    public static final int END = DTM.NULL;
  -
  -    protected int _node = END;
  -    protected int _nodeType = DOM.FIRST_TYPE - 1;
  -    protected int _value = Integer.MIN_VALUE;
  -
  -    public final DOM          _document;
  -    public final DTMAxisIterator _iterator;
  -    public final Translet     _translet;
  -
  -    protected String _format;
  -    protected String _lang;
  -    protected String _letterValue;
  -    protected String _groupSep;
  -    protected int    _groupSize;
  -
  -    private boolean _separFirst = true;
  -    private boolean _separLast = false;
  -    private Vector _separToks = new Vector();
  -    private Vector _formatToks = new Vector();
  -    private int _nSepars  = 0;
  -    private int _nFormats = 0;
  -
  -    private final static String[] Thousands = 
  -        {"", "m", "mm", "mmm" };
  -    private final static String[] Hundreds = 
  -     {"", "c", "cc", "ccc", "cd", "d", "dc", "dcc", "dccc", "cm"};
  -    private final static String[] Tens = 
  -     {"", "x", "xx", "xxx", "xl", "l", "lx", "lxx", "lxxx", "xc"};
  -    private final static String[] Ones = 
  -     {"", "i", "ii", "iii", "iv", "v", "vi", "vii", "viii", "ix"};
  -  
  -  private StringBuffer _tempBuffer = new StringBuffer();
  -    
  -    protected NodeCounter(Translet translet,
  -                       DOM document, DTMAxisIterator iterator) {
  -     _translet = translet;
  -     _document = document;
  -     _iterator = iterator;
  -    }
  -
  -    /** 
  -     * Set the start node for this counter. The same <tt>NodeCounter</tt>
  -     * object can be used multiple times by resetting the starting node.
  -     */
  -    abstract public NodeCounter setStartNode(int node);
  -
  -    /** 
  -     * If the user specified a value attribute, use this instead of 
  -     * counting nodes.
  -     */
  -    public NodeCounter setValue(int value) {
  -     _value = value;
  -     return this;
  -    }
  -
  -    /**
  -     * Sets formatting fields before calling formatNumbers().
  -     */
  -    protected void setFormatting(String format, String lang, String 
letterValue,
  -                              String groupSep, String groupSize) {
  -     _lang = lang;
  -     _groupSep = groupSep;
  -     _letterValue = letterValue;
  -
  -     try {
  -         _groupSize = Integer.parseInt(groupSize);
  -     }
  -     catch (NumberFormatException e) {
  -         _groupSize = 0;
  -     }
  -    setTokens(format);
  -     
  - }
  -  
  -  // format == null assumed here 
  - private final void setTokens(final String format){
  -     if( (_format!=null) &&(format.equals(_format)) ){// has already been set
  -        return;
  -     }
  -     _format = format;
  -     // reset
  -     final int length = _format.length();
  -     boolean isFirst = true;
  -     _separFirst = true;
  -     _separLast = false;
  -     _nSepars  = 0;
  -     _nFormats = 0;
  -     _separToks.clear() ;
  -     _formatToks.clear();
  -
  -         /* 
  -          * Tokenize the format string into alphanumeric and non-alphanumeric
  -          * tokens as described in M. Kay page 241.
  -          */
  -         for (int j = 0, i = 0; i < length;) {
  -                 char c = format.charAt(i);
  -                 for (j = i; Character.isLetterOrDigit(c);) {
  -                     if (++i == length) break;
  -             c = format.charAt(i);
  -                 }
  -                 if (i > j) {
  -                     if (isFirst) {
  -                         _separToks.addElement(".");
  -                         isFirst = _separFirst = false;
  -                     }
  -                     _formatToks.addElement(format.substring(j, i));
  -                 }
  -
  -                 if (i == length) break;
  -
  -                 c = format.charAt(i);
  -                 for (j = i; !Character.isLetterOrDigit(c);) {
  -                     if (++i == length) break;
  -                     c = format.charAt(i);
  -                     isFirst = false;
  -                 }
  -                 if (i > j) {
  -                     _separToks.addElement(format.substring(j, i));
  -                 }
  -             }
  -
  -         _nSepars = _separToks.size();
  -         _nFormats = _formatToks.size(); 
  -         if (_nSepars > _nFormats) _separLast = true;
  -
  -         if (_separFirst) _nSepars--;
  -         if (_separLast) _nSepars--;
  -         if (_nSepars == 0) {
  -             _separToks.insertElementAt(".", 1);
  -             _nSepars++;
  -         }
  -         if (_separFirst) _nSepars ++;
  - 
  - }
  -    /**
  -     * Sets formatting fields to their default values.
  -     */
  -    public NodeCounter setDefaultFormatting() {
  -     setFormatting("1", "en", "alphabetic", null, null);
  -     return this;
  -    }
  -
  -    /**
  -     * Returns the position of <tt>node</tt> according to the level and 
  -     * the from and count patterns.
  -     */
  -    abstract public String getCounter();
  -
  -    /**
  -     * Returns the position of <tt>node</tt> according to the level and 
  -     * the from and count patterns. This position is converted into a
  -     * string based on the arguments passed.
  -     */
  -    public String getCounter(String format, String lang, String letterValue,
  -                          String groupSep, String groupSize) {
  -     setFormatting(format, lang, letterValue, groupSep, groupSize);
  -     return getCounter();
  -    }
  -
  -    /**
  -     * Returns true if <tt>node</tt> matches the count pattern. By
  -     * default a node matches the count patterns if it is of the 
  -     * same type as the starting node.
  -     */
  -    public boolean matchesCount(int node) {
  -     return _nodeType == _document.getExpandedTypeID(node);
  -    }
  -
  -    /**
  -     * Returns true if <tt>node</tt> matches the from pattern. By default, 
  -     * no node matches the from pattern.
  -     */
  -    public boolean matchesFrom(int node) {
  -     return false;
  -    }
  -
  -    /**
  -     * Format a single value according to the format parameters.
  -     */
  -    protected String formatNumbers(int value) {
  -     return formatNumbers(new int[] { value });
  -    }
  -
  -    /**
  -     * Format a sequence of values according to the format paramaters
  -     * set by calling setFormatting().
  -     */
  -    protected String formatNumbers(int[] values) {
  -     final int nValues = values.length;
  -     final int length = _format.length();
  -
  -     boolean isEmpty = true;
  -     for (int i = 0; i < nValues; i++)
  -         if (values[i] != Integer.MIN_VALUE)
  -             isEmpty = false;
  -     if (isEmpty) return("");
  -
  -     // Format the output string using the values array and the fmt. tokens
  -     boolean isFirst = true;
  -     int t = 0, n = 0, s = 1;
  -  _tempBuffer.setLength(0);
  -     final StringBuffer buffer = _tempBuffer;
  -
  -     // Append separation token before first digit/letter/numeral
  -     if (_separFirst) buffer.append((String)_separToks.elementAt(0));
  -
  -     // Append next digit/letter/numeral and separation token
  -     while (n < nValues) {
  -         final int value = values[n];
  -         if (value != Integer.MIN_VALUE) {
  -             if (!isFirst) buffer.append((String) _separToks.elementAt(s++));
  -             formatValue(value, (String)_formatToks.elementAt(t++), buffer);
  -             if (t == _nFormats) t--;
  -             if (s >= _nSepars) s--;
  -             isFirst = false;
  -         }
  -         n++;
  -     }
  -
  -     // Append separation token after last digit/letter/numeral
  -     if (_separLast) buffer.append((String)_separToks.lastElement());
  -     return buffer.toString();
  -    }
  -
  -    /**
  -     * Format a single value based on the appropriate formatting token. 
  -     * This method is based on saxon (Michael Kay) and only implements
  -     * lang="en".
  -     */
  -    private void formatValue(int value, String format, StringBuffer buffer) {
  -        char c = format.charAt(0);
  -
  -        if (Character.isDigit(c)) {
  -            char zero = (char)(c - Character.getNumericValue(c));
  -
  -            StringBuffer temp = buffer;
  -            if (_groupSize > 0) {
  -                temp = new StringBuffer();
  -            }
  -            String s = "";
  -            int n = value;
  -            while (n > 0) {
  -                s = (char) ((int) zero + (n % 10)) + s;
  -                n = n / 10;
  -            }
  -                
  -            for (int i = 0; i < format.length() - s.length(); i++) {
  -                temp.append(zero);
  -            }
  -            temp.append(s);
  -            
  -            if (_groupSize > 0) {
  -                for (int i = 0; i < temp.length(); i++) {
  -                    if (i != 0 && ((temp.length() - i) % _groupSize) == 0) {
  -                        buffer.append(_groupSep);
  -                    }
  -                    buffer.append(temp.charAt(i));
  -                }
  -            }
  -        } 
  -     else if (c == 'i' && !_letterValue.equals("alphabetic")) {
  -            buffer.append(romanValue(value));
  -        } 
  -     else if (c == 'I' && !_letterValue.equals("alphabetic")) {
  -            buffer.append(romanValue(value).toUpperCase());
  -        } 
  -     else {
  -         int min = (int) c;
  -         int max = (int) c;
  -
  -         // Special case for Greek alphabet 
  -         if (c >= 0x3b1 && c <= 0x3c9) {
  -             max = 0x3c9;    // omega
  -         }
  -         else {
  -             // General case: search for end of group
  -             while (Character.isLetterOrDigit((char) (max + 1))) {
  -                 max++;
  -             }
  -         }
  -            buffer.append(alphaValue(value, min, max));
  -        }
  -    }
  -
  -    private String alphaValue(int value, int min, int max) {
  -        if (value <= 0) {
  -         return "" + value;
  -     }
  -
  -        int range = max - min + 1;
  -        char last = (char)(((value-1) % range) + min);
  -        if (value > range) {
  -            return alphaValue((value-1) / range, min, max) + last;
  -        } 
  -     else {
  -            return "" + last;
  -        }
  -    }
  -
  -    private String romanValue(int n) {
  -        if (n <= 0 || n > 4000) {
  -         return "" + n;
  -     }
  -        return
  -         Thousands[n / 1000] +
  -         Hundreds[(n / 100) % 10] +
  -         Tens[(n/10) % 10] +
  -         Ones[n % 10];
  -    }
  -}
  -
  +/*
  + * Copyright 2001-2004 The Apache Software Foundation.
  + *
  + * Licensed under the Apache License, Version 2.0 (the "License");
  + * you may not use this file except in compliance with the License.
  + * You may obtain a copy of the License at
  + *
  + *     http://www.apache.org/licenses/LICENSE-2.0
  + *
  + * Unless required by applicable law or agreed to in writing, software
  + * distributed under the License is distributed on an "AS IS" BASIS,
  + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  + * See the License for the specific language governing permissions and
  + * limitations under the License.
  + */
  +/*
  + * $Id$
  + */
  +
  +package org.apache.xalan.xsltc.dom;
  +
  +import java.util.Vector;
  +
  +import org.apache.xalan.xsltc.DOM;
  +import org.apache.xalan.xsltc.Translet;
  +import org.apache.xml.dtm.DTM;
  +import org.apache.xml.dtm.DTMAxisIterator;
  +
  +/**
  + * @author Jacek Ambroziak
  + * @author Santiago Pericas-Geertsen
  + * @author Morten Jorgensen
  + */
  +public abstract class NodeCounter implements Axis {
  +    public static final int END = DTM.NULL;
  +
  +    protected int _node = END;
  +    protected int _nodeType = DOM.FIRST_TYPE - 1;
  +    protected int _value = Integer.MIN_VALUE;
  +
  +    public final DOM          _document;
  +    public final DTMAxisIterator _iterator;
  +    public final Translet     _translet;
  +
  +    protected String _format;
  +    protected String _lang;
  +    protected String _letterValue;
  +    protected String _groupSep;
  +    protected int    _groupSize;
  +
  +    private boolean _separFirst = true;
  +    private boolean _separLast = false;
  +    private Vector _separToks = new Vector();
  +    private Vector _formatToks = new Vector();
  +    private int _nSepars  = 0;
  +    private int _nFormats = 0;
  +
  +    private final static String[] Thousands = 
  +        {"", "m", "mm", "mmm" };
  +    private final static String[] Hundreds = 
  +     {"", "c", "cc", "ccc", "cd", "d", "dc", "dcc", "dccc", "cm"};
  +    private final static String[] Tens = 
  +     {"", "x", "xx", "xxx", "xl", "l", "lx", "lxx", "lxxx", "xc"};
  +    private final static String[] Ones = 
  +     {"", "i", "ii", "iii", "iv", "v", "vi", "vii", "viii", "ix"};
  +  
  +  private StringBuffer _tempBuffer = new StringBuffer();
  +    
  +    protected NodeCounter(Translet translet,
  +                       DOM document, DTMAxisIterator iterator) {
  +     _translet = translet;
  +     _document = document;
  +     _iterator = iterator;
  +    }
  +
  +    /** 
  +     * Set the start node for this counter. The same <tt>NodeCounter</tt>
  +     * object can be used multiple times by resetting the starting node.
  +     */
  +    abstract public NodeCounter setStartNode(int node);
  +
  +    /** 
  +     * If the user specified a value attribute, use this instead of 
  +     * counting nodes.
  +     */
  +    public NodeCounter setValue(int value) {
  +     _value = value;
  +     return this;
  +    }
  +
  +    /**
  +     * Sets formatting fields before calling formatNumbers().
  +     */
  +    protected void setFormatting(String format, String lang, String 
letterValue,
  +                              String groupSep, String groupSize) {
  +     _lang = lang;
  +     _groupSep = groupSep;
  +     _letterValue = letterValue;
  +
  +     try {
  +         _groupSize = Integer.parseInt(groupSize);
  +     }
  +     catch (NumberFormatException e) {
  +         _groupSize = 0;
  +     }
  +    setTokens(format);
  +     
  + }
  +  
  +  // format == null assumed here 
  + private final void setTokens(final String format){
  +     if( (_format!=null) &&(format.equals(_format)) ){// has already been set
  +        return;
  +     }
  +     _format = format;
  +     // reset
  +     final int length = _format.length();
  +     boolean isFirst = true;
  +     _separFirst = true;
  +     _separLast = false;
  +     _nSepars  = 0;
  +     _nFormats = 0;
  +     _separToks.clear() ;
  +     _formatToks.clear();
  +
  +         /* 
  +          * Tokenize the format string into alphanumeric and non-alphanumeric
  +          * tokens as described in M. Kay page 241.
  +          */
  +         for (int j = 0, i = 0; i < length;) {
  +                 char c = format.charAt(i);
  +                 for (j = i; Character.isLetterOrDigit(c);) {
  +                     if (++i == length) break;
  +             c = format.charAt(i);
  +                 }
  +                 if (i > j) {
  +                     if (isFirst) {
  +                         _separToks.addElement(".");
  +                         isFirst = _separFirst = false;
  +                     }
  +                     _formatToks.addElement(format.substring(j, i));
  +                 }
  +
  +                 if (i == length) break;
  +
  +                 c = format.charAt(i);
  +                 for (j = i; !Character.isLetterOrDigit(c);) {
  +                     if (++i == length) break;
  +                     c = format.charAt(i);
  +                     isFirst = false;
  +                 }
  +                 if (i > j) {
  +                     _separToks.addElement(format.substring(j, i));
  +                 }
  +             }
  +
  +         _nSepars = _separToks.size();
  +         _nFormats = _formatToks.size(); 
  +         if (_nSepars > _nFormats) _separLast = true;
  +
  +         if (_separFirst) _nSepars--;
  +         if (_separLast) _nSepars--;
  +         if (_nSepars == 0) {
  +             _separToks.insertElementAt(".", 1);
  +             _nSepars++;
  +         }
  +         if (_separFirst) _nSepars ++;
  + 
  + }
  +    /**
  +     * Sets formatting fields to their default values.
  +     */
  +    public NodeCounter setDefaultFormatting() {
  +     setFormatting("1", "en", "alphabetic", null, null);
  +     return this;
  +    }
  +
  +    /**
  +     * Returns the position of <tt>node</tt> according to the level and 
  +     * the from and count patterns.
  +     */
  +    abstract public String getCounter();
  +
  +    /**
  +     * Returns the position of <tt>node</tt> according to the level and 
  +     * the from and count patterns. This position is converted into a
  +     * string based on the arguments passed.
  +     */
  +    public String getCounter(String format, String lang, String letterValue,
  +                          String groupSep, String groupSize) {
  +     setFormatting(format, lang, letterValue, groupSep, groupSize);
  +     return getCounter();
  +    }
  +
  +    /**
  +     * Returns true if <tt>node</tt> matches the count pattern. By
  +     * default a node matches the count patterns if it is of the 
  +     * same type as the starting node.
  +     */
  +    public boolean matchesCount(int node) {
  +     return _nodeType == _document.getExpandedTypeID(node);
  +    }
  +
  +    /**
  +     * Returns true if <tt>node</tt> matches the from pattern. By default, 
  +     * no node matches the from pattern.
  +     */
  +    public boolean matchesFrom(int node) {
  +     return false;
  +    }
  +
  +    /**
  +     * Format a single value according to the format parameters.
  +     */
  +    protected String formatNumbers(int value) {
  +     return formatNumbers(new int[] { value });
  +    }
  +
  +    /**
  +     * Format a sequence of values according to the format paramaters
  +     * set by calling setFormatting().
  +     */
  +    protected String formatNumbers(int[] values) {
  +     final int nValues = values.length;
  +     final int length = _format.length();
  +
  +     boolean isEmpty = true;
  +     for (int i = 0; i < nValues; i++)
  +         if (values[i] != Integer.MIN_VALUE)
  +             isEmpty = false;
  +     if (isEmpty) return("");
  +
  +     // Format the output string using the values array and the fmt. tokens
  +     boolean isFirst = true;
  +     int t = 0, n = 0, s = 1;
  +  _tempBuffer.setLength(0);
  +     final StringBuffer buffer = _tempBuffer;
  +
  +     // Append separation token before first digit/letter/numeral
  +     if (_separFirst) buffer.append((String)_separToks.elementAt(0));
  +
  +     // Append next digit/letter/numeral and separation token
  +     while (n < nValues) {
  +         final int value = values[n];
  +         if (value != Integer.MIN_VALUE) {
  +             if (!isFirst) buffer.append((String) _separToks.elementAt(s++));
  +             formatValue(value, (String)_formatToks.elementAt(t++), buffer);
  +             if (t == _nFormats) t--;
  +             if (s >= _nSepars) s--;
  +             isFirst = false;
  +         }
  +         n++;
  +     }
  +
  +     // Append separation token after last digit/letter/numeral
  +     if (_separLast) buffer.append((String)_separToks.lastElement());
  +     return buffer.toString();
  +    }
  +
  +    /**
  +     * Format a single value based on the appropriate formatting token. 
  +     * This method is based on saxon (Michael Kay) and only implements
  +     * lang="en".
  +     */
  +    private void formatValue(int value, String format, StringBuffer buffer) {
  +        char c = format.charAt(0);
  +
  +        if (Character.isDigit(c)) {
  +            char zero = (char)(c - Character.getNumericValue(c));
  +
  +            StringBuffer temp = buffer;
  +            if (_groupSize > 0) {
  +                temp = new StringBuffer();
  +            }
  +            String s = "";
  +            int n = value;
  +            while (n > 0) {
  +                s = (char) ((int) zero + (n % 10)) + s;
  +                n = n / 10;
  +            }
  +                
  +            for (int i = 0; i < format.length() - s.length(); i++) {
  +                temp.append(zero);
  +            }
  +            temp.append(s);
  +            
  +            if (_groupSize > 0) {
  +                for (int i = 0; i < temp.length(); i++) {
  +                    if (i != 0 && ((temp.length() - i) % _groupSize) == 0) {
  +                        buffer.append(_groupSep);
  +                    }
  +                    buffer.append(temp.charAt(i));
  +                }
  +            }
  +        } 
  +     else if (c == 'i' && !_letterValue.equals("alphabetic")) {
  +            buffer.append(romanValue(value));
  +        } 
  +     else if (c == 'I' && !_letterValue.equals("alphabetic")) {
  +            buffer.append(romanValue(value).toUpperCase());
  +        } 
  +     else {
  +         int min = (int) c;
  +         int max = (int) c;
  +
  +         // Special case for Greek alphabet 
  +         if (c >= 0x3b1 && c <= 0x3c9) {
  +             max = 0x3c9;    // omega
  +         }
  +         else {
  +             // General case: search for end of group
  +             while (Character.isLetterOrDigit((char) (max + 1))) {
  +                 max++;
  +             }
  +         }
  +            buffer.append(alphaValue(value, min, max));
  +        }
  +    }
  +
  +    private String alphaValue(int value, int min, int max) {
  +        if (value <= 0) {
  +         return "" + value;
  +     }
  +
  +        int range = max - min + 1;
  +        char last = (char)(((value-1) % range) + min);
  +        if (value > range) {
  +            return alphaValue((value-1) / range, min, max) + last;
  +        } 
  +     else {
  +            return "" + last;
  +        }
  +    }
  +
  +    private String romanValue(int n) {
  +        if (n <= 0 || n > 4000) {
  +         return "" + n;
  +     }
  +        return
  +         Thousands[n / 1000] +
  +         Hundreds[(n / 100) % 10] +
  +         Tens[(n/10) % 10] +
  +         Ones[n % 10];
  +    }
  +}
  +
  
  
  

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

Reply via email to