1 /*
   2  * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 /*
  27  *******************************************************************************
  28  * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved                     *
  29  *                                                                             *
  30  * The original version of this source code and documentation is copyrighted   *
  31  * and owned by IBM, These materials are provided under terms of a License     *
  32  * Agreement between IBM and Sun. This technology is protected by multiple     *
  33  * US and International patents. This notice and attribution to IBM may not    *
  34  * to removed.                                                                 *
  35  *******************************************************************************
  36  */
  37 
  38 package sun.text.normalizer;
  39 
  40 /**
  41  * DLF docs must define behavior when Replaceable is mutated underneath
  42  * the iterator.
  43  *
  44  * This and ICUCharacterIterator share some code, maybe they should share
  45  * an implementation, or the common state and implementation should be
  46  * moved up into UCharacterIterator.
  47  *
  48  * What are first, last, and getBeginIndex doing here?!?!?!
  49  */
  50 public class ReplaceableUCharacterIterator extends UCharacterIterator {
  51 
  52     // public constructor ------------------------------------------------------
  53 
  54     /**
  55      * Public constructor
  56      * @param str text which the iterator will be based on
  57      */
  58     public ReplaceableUCharacterIterator(String str){
  59         if(str==null){
  60             throw new IllegalArgumentException();
  61         }
  62         this.replaceable  = new ReplaceableString(str);
  63         this.currentIndex = 0;
  64     }
  65 
  66     //// for StringPrep
  67     /**
  68      * Public constructor
  69      * @param buf buffer of text on which the iterator will be based
  70      */
  71     public ReplaceableUCharacterIterator(StringBuffer buf){
  72         if(buf==null){
  73             throw new IllegalArgumentException();
  74         }
  75         this.replaceable  = new ReplaceableString(buf);
  76         this.currentIndex = 0;
  77     }
  78 
  79     // public methods ----------------------------------------------------------
  80 
  81     /**
  82      * Creates a copy of this iterator, does not clone the underlying
  83      * <code>Replaceable</code>object
  84      * @return copy of this iterator
  85      */
  86     public Object clone(){
  87         try {
  88           return super.clone();
  89         } catch (CloneNotSupportedException e) {
  90             return null; // never invoked
  91         }
  92     }
  93 
  94     /**
  95      * Returns the current UTF16 character.
  96      * @return current UTF16 character
  97      */
  98     public int current(){
  99         if (currentIndex < replaceable.length()) {
 100             return replaceable.charAt(currentIndex);
 101         }
 102         return DONE;
 103     }
 104 
 105     /**
 106      * Returns the length of the text
 107      * @return length of the text
 108      */
 109     public int getLength(){
 110         return replaceable.length();
 111     }
 112 
 113     /**
 114      * Gets the current currentIndex in text.
 115      * @return current currentIndex in text.
 116      */
 117     public int getIndex(){
 118         return currentIndex;
 119     }
 120 
 121     /**
 122      * Returns next UTF16 character and increments the iterator's currentIndex by 1.
 123      * If the resulting currentIndex is greater or equal to the text length, the
 124      * currentIndex is reset to the text length and a value of DONECODEPOINT is
 125      * returned.
 126      * @return next UTF16 character in text or DONE if the new currentIndex is off the
 127      *         end of the text range.
 128      */
 129     public int next(){
 130         if (currentIndex < replaceable.length()) {
 131             return replaceable.charAt(currentIndex++);
 132         }
 133         return DONE;
 134     }
 135 
 136 
 137     /**
 138      * Returns previous UTF16 character and decrements the iterator's currentIndex by
 139      * 1.
 140      * If the resulting currentIndex is less than 0, the currentIndex is reset to 0 and a
 141      * value of DONECODEPOINT is returned.
 142      * @return next UTF16 character in text or DONE if the new currentIndex is off the
 143      *         start of the text range.
 144      */
 145     public int previous(){
 146         if (currentIndex > 0) {
 147             return replaceable.charAt(--currentIndex);
 148         }
 149         return DONE;
 150     }
 151 
 152     /**
 153      * <p>Sets the currentIndex to the specified currentIndex in the text and returns that
 154      * single UTF16 character at currentIndex.
 155      * This assumes the text is stored as 16-bit code units.</p>
 156      * @param currentIndex the currentIndex within the text.
 157      * @exception IllegalArgumentException is thrown if an invalid currentIndex is
 158      *            supplied. i.e. currentIndex is out of bounds.
 159      * @return the character at the specified currentIndex or DONE if the specified
 160      *         currentIndex is equal to the end of the text.
 161      */
 162     public void setIndex(int currentIndex) {
 163         if (currentIndex < 0 || currentIndex > replaceable.length()) {
 164             throw new IllegalArgumentException();
 165         }
 166         this.currentIndex = currentIndex;
 167     }
 168 
 169     //// for StringPrep
 170     public int getText(char[] fillIn, int offset){
 171         int length = replaceable.length();
 172         if(offset < 0 || offset + length > fillIn.length){
 173             throw new IndexOutOfBoundsException(Integer.toString(length));
 174         }
 175         replaceable.getChars(0,length,fillIn,offset);
 176         return length;
 177     }
 178 
 179     // private data members ----------------------------------------------------
 180 
 181     /**
 182      * Replaceable object
 183      */
 184     private Replaceable replaceable;
 185     /**
 186      * Current currentIndex
 187      */
 188     private int currentIndex;
 189 
 190 }