You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by te...@apache.org on 2006/10/11 00:18:37 UTC

svn commit: r462605 [1/8] - in /incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java: java/text/ org/apache/harmony/text/ org/apache/harmony/text/internal/nls/

Author: tellison
Date: Tue Oct 10 15:18:35 2006
New Revision: 462605

URL: http://svn.apache.org/viewvc?view=rev&rev=462605
Log:
Tidy-up of TEXT implementation including
 - formatting
 - adding @Override annotations
 - fix minor compile warnings

Modified:
    incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/Annotation.java
    incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/AttributedCharacterIterator.java
    incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/AttributedString.java
    incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/Bidi.java
    incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/BreakIterator.java
    incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/CharacterIterator.java
    incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/ChoiceFormat.java
    incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/CollationElementIterator.java
    incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/CollationKey.java
    incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/Collator.java
    incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/DateFormat.java
    incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/DateFormatSymbols.java
    incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/DecimalFormat.java
    incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/DecimalFormatSymbols.java
    incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/FieldPosition.java
    incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/Format.java
    incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/MessageFormat.java
    incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/NumberFormat.java
    incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/ParseException.java
    incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/ParsePosition.java
    incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/RuleBasedBreakIterator.java
    incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/RuleBasedCollator.java
    incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/SimpleDateFormat.java
    incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/StringCharacterIterator.java
    incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/org/apache/harmony/text/BidiRun.java
    incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/org/apache/harmony/text/BidiWrapper.java
    incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/org/apache/harmony/text/internal/nls/Messages.java

Modified: incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/Annotation.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/Annotation.java?view=diff&rev=462605&r1=462604&r2=462605
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/Annotation.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/Annotation.java Tue Oct 10 15:18:35 2006
@@ -17,23 +17,23 @@
 
 package java.text;
 
-
 /**
  * Annotation
  */
 public class Annotation {
 
-	private Object value;
+    private Object value;
 
-	public Annotation(Object attribute) {
-		value = attribute;
-	}
+    public Annotation(Object attribute) {
+        value = attribute;
+    }
 
-	public Object getValue() {
-		return value;
-	}
+    public Object getValue() {
+        return value;
+    }
 
-	public String toString() {
-		return getClass().getName() + "[value=" + value + ']'; //$NON-NLS-1$
-	}
+    @Override
+    public String toString() {
+        return getClass().getName() + "[value=" + value + ']'; //$NON-NLS-1$
+    }
 }

Modified: incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/AttributedCharacterIterator.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/AttributedCharacterIterator.java?view=diff&rev=462605&r1=462604&r2=462605
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/AttributedCharacterIterator.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/AttributedCharacterIterator.java Tue Oct 10 15:18:35 2006
@@ -17,7 +17,6 @@
 
 package java.text;
 
-
 import java.io.InvalidObjectException;
 import java.io.Serializable;
 import java.util.Map;
@@ -30,71 +29,79 @@
  */
 public interface AttributedCharacterIterator extends CharacterIterator {
 
-	public static class Attribute implements Serializable {
+    public static class Attribute implements Serializable {
 
-		private static final long serialVersionUID = -9142742483513960612L;
+        private static final long serialVersionUID = -9142742483513960612L;
 
-		public static final Attribute INPUT_METHOD_SEGMENT = new Attribute(
-				"input_method_segment"); //$NON-NLS-1$
+        public static final Attribute INPUT_METHOD_SEGMENT = new Attribute(
+                "input_method_segment"); //$NON-NLS-1$
 
-		public static final Attribute LANGUAGE = new Attribute("language"); //$NON-NLS-1$
+        public static final Attribute LANGUAGE = new Attribute("language"); //$NON-NLS-1$
 
-		public static final Attribute READING = new Attribute("reading"); //$NON-NLS-1$
+        public static final Attribute READING = new Attribute("reading"); //$NON-NLS-1$
 
-		private String name;
+        private String name;
 
-		protected Attribute(String name) {
-			this.name = name;
-		}
+        protected Attribute(String name) {
+            this.name = name;
+        }
 
-		public final boolean equals(Object object) {
-			if (object == null || !(object.getClass().equals(this.getClass())))
-				return false;
-			return name.equals(((Attribute) object).name);
-		}
+        @Override
+        public final boolean equals(Object object) {
+            if (object == null || !(object.getClass().equals(this.getClass()))) {
+                return false;
+            }
+            return name.equals(((Attribute) object).name);
+        }
 
-		protected String getName() {
-			return name;
-		}
+        protected String getName() {
+            return name;
+        }
 
-		public final int hashCode() {
-			return name.hashCode();
-		}
+        @Override
+        public final int hashCode() {
+            return name.hashCode();
+        }
 
-		protected Object readResolve() throws InvalidObjectException {
-			if (this.getClass() != Attribute.class)
+        protected Object readResolve() throws InvalidObjectException {
+            if (this.getClass() != Attribute.class) {
                 // text.0C=cannot resolve subclasses
-				throw new InvalidObjectException(Messages.getString("text.0C")); //$NON-NLS-1$
-			if (this.equals(INPUT_METHOD_SEGMENT))
-				return INPUT_METHOD_SEGMENT;
-			if (this.equals(LANGUAGE))
-				return LANGUAGE;
-			if (this.equals(READING))
-				return READING;
+                throw new InvalidObjectException(Messages.getString("text.0C")); //$NON-NLS-1$
+            }
+            if (this.equals(INPUT_METHOD_SEGMENT)) {
+                return INPUT_METHOD_SEGMENT;
+            }
+            if (this.equals(LANGUAGE)) {
+                return LANGUAGE;
+            }
+            if (this.equals(READING)) {
+                return READING;
+            }
             // text.02=Unknown attribute
-			throw new InvalidObjectException(Messages.getString("text.02")); //$NON-NLS-1$
-		}
+            throw new InvalidObjectException(Messages.getString("text.02")); //$NON-NLS-1$
+        }
 
-		public String toString() {
-			return getClass().getName() + '(' + getName() + ')';
-		}
-	}
+        @Override
+        public String toString() {
+            return getClass().getName() + '(' + getName() + ')';
+        }
+    }
 
-	public Set<Attribute> getAllAttributeKeys();
+    public Set<Attribute> getAllAttributeKeys();
 
-	public Object getAttribute(Attribute attribute);
+    public Object getAttribute(Attribute attribute);
 
-	public Map<Attribute, Object> getAttributes();
+    public Map<Attribute, Object> getAttributes();
 
-	public int getRunLimit();
+    public int getRunLimit();
 
-	public int getRunLimit(Attribute attribute);
+    public int getRunLimit(Attribute attribute);
 
-	public int getRunLimit(Set<? extends Attribute> attributes);
+    public int getRunLimit(Set<? extends Attribute> attributes);
 
-	public int getRunStart();
+    public int getRunStart();
 
-	public int getRunStart(Attribute attribute);
+    public int getRunStart(Attribute attribute);
 
-	public int getRunStart(Set<? extends Attribute> attributes);
+    public int getRunStart(Set<? extends Attribute> attributes);
 }

Modified: incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/AttributedString.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/AttributedString.java?view=diff&rev=462605&r1=462604&r2=462605
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/AttributedString.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/AttributedString.java Tue Oct 10 15:18:35 2006
@@ -69,7 +69,8 @@
         }
 
         AttributedIterator(AttributedString attrString,
-                AttributedCharacterIterator.Attribute[] attributes, int begin, int end) {
+                AttributedCharacterIterator.Attribute[] attributes, int begin,
+                int end) {
             if (begin < 0 || end > attrString.text.length() || begin > end) {
                 throw new IllegalArgumentException();
             }
@@ -78,7 +79,8 @@
             offset = begin;
             this.attrString = attrString;
             if (attributes != null) {
-                HashSet<Attribute> set = new HashSet<Attribute>((attributes.length * 4 / 3) + 1);
+                HashSet<Attribute> set = new HashSet<Attribute>(
+                        (attributes.length * 4 / 3) + 1);
                 for (int i = attributes.length; --i >= 0;) {
                     set.add(attributes[i]);
                 }
@@ -94,11 +96,14 @@
          * 
          * @see java.lang.Cloneable
          */
+        @Override
+        @SuppressWarnings("unchecked")
         public Object clone() {
             try {
                 AttributedIterator clone = (AttributedIterator) super.clone();
                 if (attributesAllowed != null) {
-                    clone.attributesAllowed = (HashSet<Attribute>) attributesAllowed.clone();
+                    clone.attributesAllowed = (HashSet<Attribute>) attributesAllowed
+                            .clone();
                 }
                 return clone;
             } catch (CloneNotSupportedException e) {
@@ -164,8 +169,8 @@
             if (!(range.value instanceof Annotation)) {
                 return true;
             }
-            return range.start >= begin && range.start < end && range.end > begin
-                    && range.end <= end;
+            return range.start >= begin && range.start < end
+                    && range.end > begin && range.end <= end;
         }
 
         private boolean inRange(List<Range> ranges) {
@@ -184,16 +189,19 @@
         }
 
         public Set<AttributedIterator.Attribute> getAllAttributeKeys() {
-            if (begin == 0 && end == attrString.text.length() && attributesAllowed == null) {
+            if (begin == 0 && end == attrString.text.length()
+                    && attributesAllowed == null) {
                 return attrString.attributeMap.keySet();
             }
 
             Set<AttributedIterator.Attribute> result = new HashSet<Attribute>(
                     (attrString.attributeMap.size() * 4 / 3) + 1);
-            Iterator<Map.Entry<Attribute, List<Range>>> it = attrString.attributeMap.entrySet().iterator();
+            Iterator<Map.Entry<Attribute, List<Range>>> it = attrString.attributeMap
+                    .entrySet().iterator();
             while (it.hasNext()) {
                 Map.Entry<Attribute, List<Range>> entry = it.next();
-                if (attributesAllowed == null || attributesAllowed.contains(entry.getKey())) {
+                if (attributesAllowed == null
+                        || attributesAllowed.contains(entry.getKey())) {
                     List<Range> ranges = entry.getValue();
                     if (inRange(ranges)) {
                         result.add(entry.getKey());
@@ -214,11 +222,14 @@
             return null;
         }
 
-        public Object getAttribute(AttributedCharacterIterator.Attribute attribute) {
-            if (attributesAllowed != null && !attributesAllowed.contains(attribute)) {
+        public Object getAttribute(
+                AttributedCharacterIterator.Attribute attribute) {
+            if (attributesAllowed != null
+                    && !attributesAllowed.contains(attribute)) {
                 return null;
             }
-            ArrayList<Range> ranges = (ArrayList<Range>) attrString.attributeMap.get(attribute);
+            ArrayList<Range> ranges = (ArrayList<Range>) attrString.attributeMap
+                    .get(attribute);
             if (ranges == null) {
                 return null;
             }
@@ -228,11 +239,12 @@
         public Map<Attribute, Object> getAttributes() {
             Map<Attribute, Object> result = new HashMap<Attribute, Object>(
                     (attrString.attributeMap.size() * 4 / 3) + 1);
-            Iterator<Map.Entry<Attribute, List<Range>>> it = attrString.attributeMap.entrySet()
-                    .iterator();
+            Iterator<Map.Entry<Attribute, List<Range>>> it = attrString.attributeMap
+                    .entrySet().iterator();
             while (it.hasNext()) {
                 Map.Entry<Attribute, List<Range>> entry = it.next();
-                if (attributesAllowed == null || attributesAllowed.contains(entry.getKey())) {
+                if (attributesAllowed == null
+                        || attributesAllowed.contains(entry.getKey())) {
                     Object value = currentValue(entry.getValue());
                     if (value != null) {
                         result.put(entry.getKey(), value);
@@ -265,10 +277,12 @@
         }
 
         public int getRunLimit(AttributedCharacterIterator.Attribute attribute) {
-            if (attributesAllowed != null && !attributesAllowed.contains(attribute)) {
+            if (attributesAllowed != null
+                    && !attributesAllowed.contains(attribute)) {
                 return end;
             }
-            ArrayList<Range> ranges = (ArrayList<Range>) attrString.attributeMap.get(attribute);
+            ArrayList<Range> ranges = (ArrayList<Range>) attrString.attributeMap
+                    .get(attribute);
             if (ranges == null) {
                 return end;
             }
@@ -311,10 +325,12 @@
         }
 
         public int getRunStart(AttributedCharacterIterator.Attribute attribute) {
-            if (attributesAllowed != null && !attributesAllowed.contains(attribute)) {
+            if (attributesAllowed != null
+                    && !attributesAllowed.contains(attribute)) {
                 return begin;
             }
-            ArrayList<Range> ranges = (ArrayList<Range>) attrString.attributeMap.get(attribute);
+            ArrayList<Range> ranges = (ArrayList<Range>) attrString.attributeMap
+                    .get(attribute);
             if (ranges == null) {
                 return begin;
             }
@@ -383,8 +399,9 @@
          * @return the character at the new index, or DONE if the index is past
          *         the end
          * 
-         * @exception IllegalArgumentException when the new index is less than
-         *            the begin index or greater than the end index
+         * @exception IllegalArgumentException
+         *                when the new index is less than the begin index or
+         *                greater than the end index
          */
         public char setIndex(int location) {
             if (location < begin || location > end) {
@@ -401,19 +418,21 @@
     public AttributedString(AttributedCharacterIterator iterator) {
         if (iterator.getBeginIndex() > iterator.getEndIndex()) {
             // text.0A=Invalid substring range
-        	throw new IllegalArgumentException(Messages.getString("text.0A")); //$NON-NLS-1$
+            throw new IllegalArgumentException(Messages.getString("text.0A")); //$NON-NLS-1$
         }
         StringBuffer buffer = new StringBuffer();
-        for (int i = iterator.getBeginIndex(); i < iterator.getEndIndex(); i++) { 
+        for (int i = iterator.getBeginIndex(); i < iterator.getEndIndex(); i++) {
             buffer.append(iterator.current());
             iterator.next();
         }
         text = buffer.toString();
-        Set<AttributedCharacterIterator.Attribute> attributes = iterator.getAllAttributeKeys();
+        Set<AttributedCharacterIterator.Attribute> attributes = iterator
+                .getAllAttributeKeys();
         if (attributes == null) {
-        	return;
+            return;
         }
-        attributeMap = new HashMap<Attribute, List<Range>>((attributes.size() * 4 / 3) + 1);
+        attributeMap = new HashMap<Attribute, List<Range>>(
+                (attributes.size() * 4 / 3) + 1);
 
         Iterator<Attribute> it = attributes.iterator();
         while (it.hasNext()) {
@@ -431,13 +450,14 @@
         }
     }
 
-    private AttributedString(AttributedCharacterIterator iterator, int start, int end,
-            Set<Attribute> attributes) {
-        if (start < iterator.getBeginIndex() || end > iterator.getEndIndex() || start > end) {
+    private AttributedString(AttributedCharacterIterator iterator, int start,
+            int end, Set<Attribute> attributes) {
+        if (start < iterator.getBeginIndex() || end > iterator.getEndIndex()
+                || start > end) {
             throw new IllegalArgumentException();
         }
-        
-        if(attributes == null){
+
+        if (attributes == null) {
             return;
         }
 
@@ -448,7 +468,8 @@
             iterator.next();
         }
         text = buffer.toString();
-        attributeMap = new HashMap<Attribute, List<Range>>((attributes.size() * 4 / 3) + 1);
+        attributeMap = new HashMap<Attribute, List<Range>>(
+                (attributes.size() * 4 / 3) + 1);
 
         Iterator<Attribute> it = attributes.iterator();
         while (it.hasNext()) {
@@ -460,7 +481,8 @@
                 int limit = iterator.getRunLimit(attribute);
                 if ((value instanceof Annotation && runStart >= start && limit <= end)
                         || (value != null && !(value instanceof Annotation))) {
-                    addAttribute(attribute, value, (runStart < start ? start : runStart)
+                    addAttribute(attribute, value, (runStart < start ? start
+                            : runStart)
                             - start, (limit > end ? end : limit) - start);
                 }
                 iterator.setIndex(limit);
@@ -468,13 +490,15 @@
         }
     }
 
-    public AttributedString(AttributedCharacterIterator iterator, int start, int end) {
+    public AttributedString(AttributedCharacterIterator iterator, int start,
+            int end) {
         this(iterator, start, end, iterator.getAllAttributeKeys());
     }
 
-    public AttributedString(AttributedCharacterIterator iterator, int start, int end,
-            AttributedCharacterIterator.Attribute[] attributes) {
-        this(iterator, start, end, new HashSet<Attribute>(Arrays.asList(attributes)));
+    public AttributedString(AttributedCharacterIterator iterator, int start,
+            int end, AttributedCharacterIterator.Attribute[] attributes) {
+        this(iterator, start, end, new HashSet<Attribute>(Arrays
+                .asList(attributes)));
     }
 
     public AttributedString(String value) {
@@ -495,18 +519,21 @@
             throw new IllegalArgumentException(Messages.getString("text.0B")); //$NON-NLS-1$
         }
         text = value;
-        attributeMap = new HashMap<Attribute, List<Range>>((attributes.size() * 4 / 3) + 1);
+        attributeMap = new HashMap<Attribute, List<Range>>(
+                (attributes.size() * 4 / 3) + 1);
         Iterator<?> it = attributes.entrySet().iterator();
         while (it.hasNext()) {
             Map.Entry<?, ?> entry = (Map.Entry<?, ?>) it.next();
             ArrayList<Range> ranges = new ArrayList<Range>(1);
             ranges.add(new Range(0, text.length(), entry.getValue()));
-            attributeMap.put((AttributedCharacterIterator.Attribute) entry.getKey(), ranges);
+            attributeMap.put((AttributedCharacterIterator.Attribute) entry
+                    .getKey(), ranges);
         }
     }
 
-    public void addAttribute(AttributedCharacterIterator.Attribute attribute, Object value) {
-        if(null == attribute){
+    public void addAttribute(AttributedCharacterIterator.Attribute attribute,
+            Object value) {
+        if (null == attribute) {
             throw new NullPointerException();
         }
         if (text.length() == 0) {
@@ -523,9 +550,9 @@
         ranges.add(new Range(0, text.length(), value));
     }
 
-    public void addAttribute(AttributedCharacterIterator.Attribute attribute, Object value,
-            int start, int end) {
-        if(null == attribute){
+    public void addAttribute(AttributedCharacterIterator.Attribute attribute,
+            Object value, int start, int end) {
+        if (null == attribute) {
             throw new NullPointerException();
         }
         if (start < 0 || end > text.length() || start >= end) {
@@ -550,8 +577,8 @@
                 it.previous();
                 break;
             } else if (start < range.end
-                    || (start == range.end && (value == null ? range.value == null : value
-                            .equals(range.value)))) {
+                    || (start == range.end && (value == null ? range.value == null
+                            : value.equals(range.value)))) {
                 Range r1 = null, r3;
                 it.remove();
                 r1 = new Range(range.start, start, range.value);
@@ -573,21 +600,25 @@
                 }
 
                 if (value == null ? r1.value == null : value.equals(r1.value)) {
-                    if (value == null ? r3.value == null : value.equals(r3.value)) {
+                    if (value == null ? r3.value == null : value
+                            .equals(r3.value)) {
                         it.add(new Range(r1.start < start ? r1.start : start,
                                 r3.end > end ? r3.end : end, r1.value));
                     } else {
-                        it.add(new Range(r1.start < start ? r1.start : start, end, r1.value));
+                        it.add(new Range(r1.start < start ? r1.start : start,
+                                end, r1.value));
                         if (r3.start < r3.end) {
                             it.add(r3);
                         }
                     }
                 } else {
-                    if (value == null ? r3.value == null : value.equals(r3.value)) {
+                    if (value == null ? r3.value == null : value
+                            .equals(r3.value)) {
                         if (r1.start < r1.end) {
                             it.add(r1);
                         }
-                        it.add(new Range(start, r3.end > end ? r3.end : end, r3.value));
+                        it.add(new Range(start, r3.end > end ? r3.end : end,
+                                r3.value));
                     } else {
                         if (r1.start < r1.end) {
                             it.add(r1);
@@ -605,13 +636,14 @@
     }
 
     public void addAttributes(
-            Map<? extends AttributedCharacterIterator.Attribute, ?> attributes, int start,
-            int end) {
+            Map<? extends AttributedCharacterIterator.Attribute, ?> attributes,
+            int start, int end) {
         Iterator<?> it = attributes.entrySet().iterator();
         while (it.hasNext()) {
             Map.Entry<?, ?> entry = (Map.Entry<?, ?>) it.next();
-            addAttribute((AttributedCharacterIterator.Attribute) entry.getKey(), entry
-                    .getValue(), start, end);
+            addAttribute(
+                    (AttributedCharacterIterator.Attribute) entry.getKey(),
+                    entry.getValue(), start, end);
         }
     }
 
@@ -625,7 +657,8 @@
     }
 
     public AttributedCharacterIterator getIterator(
-            AttributedCharacterIterator.Attribute[] attributes, int start, int end) {
+            AttributedCharacterIterator.Attribute[] attributes, int start,
+            int end) {
         return new AttributedIterator(this, attributes, start, end);
     }
 }

Modified: incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/Bidi.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/Bidi.java?view=diff&rev=462605&r1=462604&r2=462605
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/Bidi.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/Bidi.java Tue Oct 10 15:18:35 2006
@@ -17,17 +17,15 @@
 
 package java.text;
 
-
+import java.awt.font.NumericShaper;
+import java.awt.font.TextAttribute;
 import java.util.Arrays;
 import java.util.LinkedList;
-import java.awt.font.TextAttribute;
-import java.awt.font.NumericShaper;
 
 import org.apache.harmony.text.BidiRun;
 import org.apache.harmony.text.BidiWrapper;
 import org.apache.harmony.text.internal.nls.Messages;
 
-
 /**
  * Bidi is the class providing the bidirectional algorithm. The algorithm is
  * defined in the Unicode Standard Annex #9, version 13, also described in The
@@ -45,55 +43,55 @@
  * 
  */
 public final class Bidi {
-	/**
-	 * Constant that indicates the default base level. If there is no strong
-	 * character, then set the paragraph level to 0 (left-to-right).
-	 */
-	public static final int DIRECTION_DEFAULT_LEFT_TO_RIGHT = -2;
-
-	/**
-	 * Constant that indicates the default base level. If there is no strong
-	 * character, then set the paragraph level to 1 (right-to-left).
-	 */
-	public static final int DIRECTION_DEFAULT_RIGHT_TO_LEFT = -1;
-
-	/**
-	 * Constant that specifies the default base level as 0 (left-to-right).
-	 */
-	public static final int DIRECTION_LEFT_TO_RIGHT = 0;
-
-	/**
-	 * Constant that specifies the default base level as 1 (right-to-left).
-	 */
-	public static final int DIRECTION_RIGHT_TO_LEFT = 1;
-
-	/**
-	 * Create a Bidi object from the AttributedCharacterIterator of a paragraph
-	 * text.
-	 * 
-	 * The RUN_DIRECTION attribute determines the base direction of the
-	 * bidirectional text. If it's not specified explicitly, the algorithm uses
-	 * DIRECTION_DEFAULT_LEFT_TO_RIGHT by default.
-	 * 
-	 * The BIDI_EMBEDDING attribute specifies the level of embedding for each
-	 * character. Values between -1 and -62 denote overrides at the level's
-	 * absolute value, values from 1 to 62 indicate embeddings, and the
-	 * 0 value indicates the level is calculated by the algorithm automatically.
-	 * For the character with no BIDI_EMBEDDING attribute or with a improper
-	 * attribute value, such as a null value, the algorithm treats its embedding
-	 * level as 0.
-	 * 
-	 * The NUMERIC_SHAPING attribute specifies the instance of NumericShaper
-	 * used to convert European digits to other decimal digits before performing
-	 * the bidi algorithm.
-	 * 
-	 * @param paragraph
-	 * 
-	 * @see TextAttribute.BIDI_EMBEDDING
-	 * @see TextAttribute.NUMERIC_SHAPING
-	 * @see TextAttribute.RUN_DIRECTION
-	 */
-	public Bidi(AttributedCharacterIterator paragraph) {
+    /**
+     * Constant that indicates the default base level. If there is no strong
+     * character, then set the paragraph level to 0 (left-to-right).
+     */
+    public static final int DIRECTION_DEFAULT_LEFT_TO_RIGHT = -2;
+
+    /**
+     * Constant that indicates the default base level. If there is no strong
+     * character, then set the paragraph level to 1 (right-to-left).
+     */
+    public static final int DIRECTION_DEFAULT_RIGHT_TO_LEFT = -1;
+
+    /**
+     * Constant that specifies the default base level as 0 (left-to-right).
+     */
+    public static final int DIRECTION_LEFT_TO_RIGHT = 0;
+
+    /**
+     * Constant that specifies the default base level as 1 (right-to-left).
+     */
+    public static final int DIRECTION_RIGHT_TO_LEFT = 1;
+
+    /**
+     * Create a Bidi object from the AttributedCharacterIterator of a paragraph
+     * text.
+     * 
+     * The RUN_DIRECTION attribute determines the base direction of the
+     * bidirectional text. If it's not specified explicitly, the algorithm uses
+     * DIRECTION_DEFAULT_LEFT_TO_RIGHT by default.
+     * 
+     * The BIDI_EMBEDDING attribute specifies the level of embedding for each
+     * character. Values between -1 and -62 denote overrides at the level's
+     * absolute value, values from 1 to 62 indicate embeddings, and the 0 value
+     * indicates the level is calculated by the algorithm automatically. For the
+     * character with no BIDI_EMBEDDING attribute or with a improper attribute
+     * value, such as a null value, the algorithm treats its embedding level as
+     * 0.
+     * 
+     * The NUMERIC_SHAPING attribute specifies the instance of NumericShaper
+     * used to convert European digits to other decimal digits before performing
+     * the bidi algorithm.
+     * 
+     * @param paragraph
+     * 
+     * @see TextAttribute.BIDI_EMBEDDING
+     * @see TextAttribute.NUMERIC_SHAPING
+     * @see TextAttribute.RUN_DIRECTION
+     */
+    public Bidi(AttributedCharacterIterator paragraph) {
         if (paragraph == null) {
             // text.14=paragraph is null
             throw new IllegalArgumentException(Messages.getString("text.14")); //$NON-NLS-1$
@@ -102,7 +100,8 @@
         int begin = paragraph.getBeginIndex();
         int end = paragraph.getEndIndex();
         int length = end - begin;
-        char text[] = new char[length+1]; // One more char for AttributedCharacterIterator.DONE
+        char text[] = new char[length + 1]; // One more char for
+        // AttributedCharacterIterator.DONE
 
         if (length != 0) {
             text[0] = paragraph.first();
@@ -123,12 +122,11 @@
 
         // Retrieve the text and gather BIDI_EMBEDDINGS
         byte embeddings[] = null;
-        for (
-                int textLimit = 1, i = 1;
-                i < length;
-                textLimit = paragraph.getRunLimit(TextAttribute.BIDI_EMBEDDING) - begin + 1
-        ) {
-            Object embedding = paragraph.getAttribute(TextAttribute.BIDI_EMBEDDING);
+        for (int textLimit = 1, i = 1; i < length; textLimit = paragraph
+                .getRunLimit(TextAttribute.BIDI_EMBEDDING)
+                - begin + 1) {
+            Object embedding = paragraph
+                    .getAttribute(TextAttribute.BIDI_EMBEDDING);
             if (embedding != null && embedding instanceof Integer) {
                 int embLevel = ((Integer) embedding).intValue();
 
@@ -138,7 +136,7 @@
 
                 for (; i < textLimit; i++) {
                     text[i] = paragraph.next();
-                    embeddings[i-1] = (byte) embLevel;
+                    embeddings[i - 1] = (byte) embLevel;
                 }
             } else {
                 for (; i < textLimit; i++) {
@@ -148,7 +146,8 @@
         }
 
         // Apply NumericShaper to the text
-        Object numericShaper = paragraph.getAttribute(TextAttribute.NUMERIC_SHAPING);
+        Object numericShaper = paragraph
+                .getAttribute(TextAttribute.NUMERIC_SHAPING);
         if (numericShaper != null && numericShaper instanceof NumericShaper) {
             ((NumericShaper) numericShaper).shape(text, 0, length);
         }
@@ -158,344 +157,349 @@
         BidiWrapper.ubidi_close(pBidi);
     }
 
-	/**
-	 * Create a Bidi object.
-	 * 
-	 * @param text
-	 *            the char array of the paragraph text.
-	 * @param textStart
-	 *            the start offset of the text array to perform the algorithm.
-	 * @param embeddings
-	 *            the embedding level array of the paragraph text, specifying
-	 *            the embedding level information for each character. Values
-	 *            between -1 and -62 denote overrides at the level's absolute
-	 *            value, values from 1 to 62 indicate embeddings, and the 0
-	 *            value indicates the level is calculated by the algorithm
-	 *            automatically.
-	 * @param embStart
-	 *            the start offset of the embeddings array to perform the
-	 *            algorithm.
-	 * @param paragraphLength
-	 *            the length of the text to perform the algorithm. It must be
-	 *            text.length >= textStart + paragraphLength, and
-	 *            embeddings.length >= embStart + paragraphLength.
-	 * @param flags
-	 *            indicates the base direction of the bidirectional text. It is
-	 *            expected that this will be one of the direction constant
-	 *            values defined in this class. An unknown value is treated as
-	 *            DIRECTION_DEFAULT_LEFT_TO_RIGHT.
-	 * 
-	 * @see #DIRECTION_LEFT_TO_RIGHT
-	 * @see #DIRECTION_RIGHT_TO_LEFT
-	 * @see #DIRECTION_DEFAULT_RIGHT_TO_LEFT
-	 * @see #DIRECTION_DEFAULT_LEFT_TO_RIGHT
-	 */
-	public Bidi(char[] text, int textStart, byte[] embeddings, int embStart,
-			int paragraphLength, int flags) {
-		if (textStart < 0) {
+    /**
+     * Create a Bidi object.
+     * 
+     * @param text
+     *            the char array of the paragraph text.
+     * @param textStart
+     *            the start offset of the text array to perform the algorithm.
+     * @param embeddings
+     *            the embedding level array of the paragraph text, specifying
+     *            the embedding level information for each character. Values
+     *            between -1 and -62 denote overrides at the level's absolute
+     *            value, values from 1 to 62 indicate embeddings, and the 0
+     *            value indicates the level is calculated by the algorithm
+     *            automatically.
+     * @param embStart
+     *            the start offset of the embeddings array to perform the
+     *            algorithm.
+     * @param paragraphLength
+     *            the length of the text to perform the algorithm. It must be
+     *            text.length >= textStart + paragraphLength, and
+     *            embeddings.length >= embStart + paragraphLength.
+     * @param flags
+     *            indicates the base direction of the bidirectional text. It is
+     *            expected that this will be one of the direction constant
+     *            values defined in this class. An unknown value is treated as
+     *            DIRECTION_DEFAULT_LEFT_TO_RIGHT.
+     * 
+     * @see #DIRECTION_LEFT_TO_RIGHT
+     * @see #DIRECTION_RIGHT_TO_LEFT
+     * @see #DIRECTION_DEFAULT_RIGHT_TO_LEFT
+     * @see #DIRECTION_DEFAULT_LEFT_TO_RIGHT
+     */
+    public Bidi(char[] text, int textStart, byte[] embeddings, int embStart,
+            int paragraphLength, int flags) {
+        if (textStart < 0) {
             // text.0D=Negative textStart value {0}
-			throw new IllegalArgumentException(Messages.getString("text.0D", textStart));   //$NON-NLS-1$
-		}
-		if (embStart < 0) {
+            throw new IllegalArgumentException(Messages.getString(
+                    "text.0D", textStart)); //$NON-NLS-1$
+        }
+        if (embStart < 0) {
             // text.10=Negative embStart value {0}
-			throw new IllegalArgumentException(Messages.getString("text.10", embStart));   //$NON-NLS-1$
-		}
-		if (paragraphLength < 0) {
+            throw new IllegalArgumentException(Messages.getString(
+                    "text.10", embStart)); //$NON-NLS-1$
+        }
+        if (paragraphLength < 0) {
             // text.11=Negative paragraph length {0}
-			throw new IllegalArgumentException(Messages.getString("text.11", paragraphLength));   //$NON-NLS-1$
-		}
-		long pBidi = createUBiDi(text, textStart, embeddings, embStart,
-				paragraphLength, flags);
-		readBidiInfo(pBidi);
-		BidiWrapper.ubidi_close(pBidi);
-	}
-
-	/**
-	 * Create a Bidi object.
-	 * 
-	 * @param paragraph
-	 *            the String containing the paragraph text to perform the
-	 *            algorithm.
-	 * @param flags
-	 *            indicates the base direction of the bidirectional text. It is
-	 *            expected that this will be one of the direction constant
-	 *            values defined in this class. An unknown value is treated as
-	 *            DIRECTION_DEFAULT_LEFT_TO_RIGHT.
-	 * 
-	 * @see #DIRECTION_LEFT_TO_RIGHT
-	 * @see #DIRECTION_RIGHT_TO_LEFT
-	 * @see #DIRECTION_DEFAULT_RIGHT_TO_LEFT
-	 * @see #DIRECTION_DEFAULT_LEFT_TO_RIGHT
-	 */
-	public Bidi(String paragraph, int flags) {
-		this((paragraph == null ? null : paragraph.toCharArray()), 0, null, 0,
-				(paragraph == null ? 0 : paragraph.length()), flags);
-	}
-
-	// create the native UBiDi struct, need to be closed with ubidi_close().
-	private static long createUBiDi(char[] text, int textStart,
-			byte[] embeddings, int embStart, int paragraphLength, int flags) {
-		char[] realText = null;
-
-		byte[] realEmbeddings = null;
-
-		if (text == null || text.length - textStart< paragraphLength) {
-			throw new IllegalArgumentException();
-		}
-		realText = new char[paragraphLength];
-		System.arraycopy(text, textStart, realText, 0, paragraphLength);
-
-		if (embeddings != null) {
-			if (embeddings.length - embStart < paragraphLength) {
-				throw new IllegalArgumentException();
-			}
-			if (paragraphLength > 0) {
-				Bidi temp = new Bidi(text, textStart, null, 0, paragraphLength,
-						flags);
-				realEmbeddings = new byte[paragraphLength];
-				System.arraycopy(temp.offsetLevel, 0, realEmbeddings, 0,
-						paragraphLength);
-				for (int i = 0; i < paragraphLength; i++) {
-					byte e = embeddings[i];
-					if (e < 0) {
-						realEmbeddings[i] = (byte) (BidiWrapper.UBIDI_LEVEL_OVERRIDE - e);
-					} else if (e > 0) {
-						realEmbeddings[i] = e;
-					} else {
-						realEmbeddings[i] |= (byte) BidiWrapper.UBIDI_LEVEL_OVERRIDE;
-					}
-				}
-			}
-		}
-
-		if (flags > 1 || flags < -2) {
-			flags = 0;
-		}
-
-		long bidi = BidiWrapper.ubidi_open();
-		BidiWrapper.ubidi_setPara(bidi, realText, paragraphLength,
-				(byte) flags, realEmbeddings);
-		return bidi;
-	}
-
-	// private constructor, used by createLineBidi()
-	private Bidi(long pBidi) {
-		readBidiInfo(pBidi);
-	}
-
-	// read info from the native UBiDi struct
-	private void readBidiInfo(long pBidi) {
+            throw new IllegalArgumentException(Messages.getString(
+                    "text.11", paragraphLength)); //$NON-NLS-1$
+        }
+        long pBidi = createUBiDi(text, textStart, embeddings, embStart,
+                paragraphLength, flags);
+        readBidiInfo(pBidi);
+        BidiWrapper.ubidi_close(pBidi);
+    }
+
+    /**
+     * Create a Bidi object.
+     * 
+     * @param paragraph
+     *            the String containing the paragraph text to perform the
+     *            algorithm.
+     * @param flags
+     *            indicates the base direction of the bidirectional text. It is
+     *            expected that this will be one of the direction constant
+     *            values defined in this class. An unknown value is treated as
+     *            DIRECTION_DEFAULT_LEFT_TO_RIGHT.
+     * 
+     * @see #DIRECTION_LEFT_TO_RIGHT
+     * @see #DIRECTION_RIGHT_TO_LEFT
+     * @see #DIRECTION_DEFAULT_RIGHT_TO_LEFT
+     * @see #DIRECTION_DEFAULT_LEFT_TO_RIGHT
+     */
+    public Bidi(String paragraph, int flags) {
+        this((paragraph == null ? null : paragraph.toCharArray()), 0, null, 0,
+                (paragraph == null ? 0 : paragraph.length()), flags);
+    }
+
+    // create the native UBiDi struct, need to be closed with ubidi_close().
+    private static long createUBiDi(char[] text, int textStart,
+            byte[] embeddings, int embStart, int paragraphLength, int flags) {
+        char[] realText = null;
 
-		length = BidiWrapper.ubidi_getLength(pBidi);
+        byte[] realEmbeddings = null;
 
-		offsetLevel = (length == 0) ? null : BidiWrapper.ubidi_getLevels(pBidi);
+        if (text == null || text.length - textStart < paragraphLength) {
+            throw new IllegalArgumentException();
+        }
+        realText = new char[paragraphLength];
+        System.arraycopy(text, textStart, realText, 0, paragraphLength);
+
+        if (embeddings != null) {
+            if (embeddings.length - embStart < paragraphLength) {
+                throw new IllegalArgumentException();
+            }
+            if (paragraphLength > 0) {
+                Bidi temp = new Bidi(text, textStart, null, 0, paragraphLength,
+                        flags);
+                realEmbeddings = new byte[paragraphLength];
+                System.arraycopy(temp.offsetLevel, 0, realEmbeddings, 0,
+                        paragraphLength);
+                for (int i = 0; i < paragraphLength; i++) {
+                    byte e = embeddings[i];
+                    if (e < 0) {
+                        realEmbeddings[i] = (byte) (BidiWrapper.UBIDI_LEVEL_OVERRIDE - e);
+                    } else if (e > 0) {
+                        realEmbeddings[i] = e;
+                    } else {
+                        realEmbeddings[i] |= (byte) BidiWrapper.UBIDI_LEVEL_OVERRIDE;
+                    }
+                }
+            }
+        }
+
+        if (flags > 1 || flags < -2) {
+            flags = 0;
+        }
 
-		baseLevel = BidiWrapper.ubidi_getParaLevel(pBidi);
+        long bidi = BidiWrapper.ubidi_open();
+        BidiWrapper.ubidi_setPara(bidi, realText, paragraphLength,
+                (byte) flags, realEmbeddings);
+        return bidi;
+    }
+
+    // private constructor, used by createLineBidi()
+    private Bidi(long pBidi) {
+        readBidiInfo(pBidi);
+    }
+
+    // read info from the native UBiDi struct
+    private void readBidiInfo(long pBidi) {
 
-		int runCount = BidiWrapper.ubidi_countRuns(pBidi);
-		if (runCount == 0) {
+        length = BidiWrapper.ubidi_getLength(pBidi);
+
+        offsetLevel = (length == 0) ? null : BidiWrapper.ubidi_getLevels(pBidi);
+
+        baseLevel = BidiWrapper.ubidi_getParaLevel(pBidi);
+
+        int runCount = BidiWrapper.ubidi_countRuns(pBidi);
+        if (runCount == 0) {
             unidirectional = true;
             runs = null;
-		} else if (runCount < 0) {
-			runs = null;
-		} else {
-			runs = BidiWrapper.ubidi_getRuns(pBidi);
+        } else if (runCount < 0) {
+            runs = null;
+        } else {
+            runs = BidiWrapper.ubidi_getRuns(pBidi);
 
             // Simplified case for one run which has the base level
             if (runCount == 1 && runs[0].getLevel() == baseLevel) {
                 unidirectional = true;
                 runs = null;
             }
-		}
+        }
 
-		direction = BidiWrapper.ubidi_getDirection(pBidi);
-	}
+        direction = BidiWrapper.ubidi_getDirection(pBidi);
+    }
 
-	private int baseLevel;
+    private int baseLevel;
 
-	private int length;
+    private int length;
 
-	private byte[] offsetLevel;
+    private byte[] offsetLevel;
 
-	private BidiRun[] runs;
+    private BidiRun[] runs;
 
-	private int direction;
+    private int direction;
 
     private boolean unidirectional;
 
-	/**
-	 * Return whether the base level is from left to right.
-	 * 
-	 * @return true if the base level is from left to right.
-	 */
-	public boolean baseIsLeftToRight() {
-		return baseLevel % 2 == 0 ? true : false;
-	}
-
-	/**
-	 * Create a new Bidi object containing the infomation of one line from this
-	 * object.
-	 * 
-	 * @param lineStart
-	 *            the start offset of the line.
-	 * @param lineLimit
-	 *            the limit of the line.
-	 * @return the new line Bidi object. In this new object, the indices will
-	 *         range from 0 to (limit - start - 1).
-	 */
-	public Bidi createLineBidi(int lineStart, int lineLimit) {
-		if (lineStart < 0 || lineLimit < 0 || lineLimit > length || lineStart > lineLimit) {
-			// text.12=Invalid ranges (start={0}, limit={1}, length={2})
+    /**
+     * Return whether the base level is from left to right.
+     * 
+     * @return true if the base level is from left to right.
+     */
+    public boolean baseIsLeftToRight() {
+        return baseLevel % 2 == 0 ? true : false;
+    }
+
+    /**
+     * Create a new Bidi object containing the infomation of one line from this
+     * object.
+     * 
+     * @param lineStart
+     *            the start offset of the line.
+     * @param lineLimit
+     *            the limit of the line.
+     * @return the new line Bidi object. In this new object, the indices will
+     *         range from 0 to (limit - start - 1).
+     */
+    public Bidi createLineBidi(int lineStart, int lineLimit) {
+        if (lineStart < 0 || lineLimit < 0 || lineLimit > length
+                || lineStart > lineLimit) {
+            // text.12=Invalid ranges (start={0}, limit={1}, length={2})
             throw new IllegalArgumentException(Messages.getString(
                     "text.12", new Object[] { lineStart, lineLimit, length })); //$NON-NLS-1$
-		}
-		char[] text = new char[this.length];
-		Arrays.fill(text, 'a');
-		byte[] embeddings = new byte[this.length];
-		for (int i = 0; i < embeddings.length; i++) {
-			embeddings[i] = (byte) -this.offsetLevel[i];
-		}
-
-		int dir = this.baseIsLeftToRight() ? Bidi.DIRECTION_LEFT_TO_RIGHT
-				: Bidi.DIRECTION_RIGHT_TO_LEFT;
-
-		long parent = createUBiDi(text, 0, embeddings, 0, this.length, dir);
-
-		long line = BidiWrapper.ubidi_setLine(parent, lineStart, lineLimit);
-		Bidi result = new Bidi(line);
-		BidiWrapper.ubidi_close(line);
-		BidiWrapper.ubidi_close(parent);
-		return result;
-	}
-
-	/**
-	 * Return the base level.
-	 * 
-	 * @return the int value of the base level.
-	 */
-	public int getBaseLevel() {
-		return baseLevel;
-	}
-
-	/**
-	 * Return the length of the text in the Bidi object.
-	 * 
-	 * @return the int value of the length.
-	 */
-	public int getLength() {
-		return length;
-	}
-
-	/**
-	 * Return the level of a specified character.
-	 * 
-	 * @param offset
-	 *            the offset of the character.
-	 * @return the int value of the level.
-	 */
-	public int getLevelAt(int offset) {
-		try {
-			return offsetLevel[offset] & ~BidiWrapper.UBIDI_LEVEL_OVERRIDE;
-		} catch (RuntimeException e) {
-			return baseLevel;
-		}
-	}
-
-	/**
-	 * Return the number of runs in the bidirectional text.
-	 * 
-	 * @return the int value of runs, at least 1.
-	 */
-	public int getRunCount() {
-		return unidirectional ? 1 : runs.length;
-	}
-
-	/**
-	 * Return the level of a specified run.
-	 * 
-	 * @param run
-	 *            the index of the run.
-	 * @return the level of the run.
-	 */
-	public int getRunLevel(int run) {
-		return unidirectional ? baseLevel : runs[run].getLevel();
-	}
-
-	/**
-	 * Return the limit offset of a specified run.
-	 * 
-	 * @param run
-	 *            the index of the run.
-	 * @return the limit offset of the run.
-	 */
-	public int getRunLimit(int run) {
-		return unidirectional ? length : runs[run].getLimit();
-	}
-
-	/**
-	 * Return the start offset of a specified run.
-	 * 
-	 * @param run
-	 *            the index of the run.
-	 * @return the start offset of the run.
-	 */
-	public int getRunStart(int run) {
-		return unidirectional ? 0 : runs[run].getStart();
-	}
-
-	/**
-	 * Return whether the text is from left to right, that is, both the base
-	 * direction and the text direction is from left to right.
-	 * 
-	 * @return true if the text is from left to right.
-	 */
-	public boolean isLeftToRight() {
-		return direction == BidiWrapper.UBiDiDirection_UBIDI_LTR;
-	}
-
-	/**
-	 * Return whether the text direction is mixed.
-	 * 
-	 * @return true if the text direction is mixed.
-	 */
-	public boolean isMixed() {
-		return direction == BidiWrapper.UBiDiDirection_UBIDI_MIXED;
-	}
-
-	/**
-	 * Return whether the text is from right to left, that is, both the base
-	 * direction and the text direction is from right to left.
-	 * 
-	 * @return true if the text is from right to left.
-	 */
-	public boolean isRightToLeft() {
-		return direction == BidiWrapper.UBiDiDirection_UBIDI_RTL;
-	}
-
-	/**
-	 * Reorder a range of objects according to their spefied levels. This is a
-	 * convenience function that does not use a Bidi object. The range of
-	 * objects at index from objectStart to objectStart + count will be
-	 * reordered according to the range of levels at index from levelStart to
-	 * levelStart + count.
-	 * 
-	 * @param levels
-	 *            the level array, which is already determined.
-	 * @param levelStart
-	 *            the start offset of the range of the levels.
-	 * @param objects
-	 *            the object array to reoeder.
-	 * @param objectStart
-	 *            the start offset of the range of objects.
-	 * @param count
-	 *            the count of the range of objects to reorder.
-	 */
-	public static void reorderVisually(byte[] levels, int levelStart,
-			Object[] objects, int objectStart, int count) {
+        }
+        char[] text = new char[this.length];
+        Arrays.fill(text, 'a');
+        byte[] embeddings = new byte[this.length];
+        for (int i = 0; i < embeddings.length; i++) {
+            embeddings[i] = (byte) -this.offsetLevel[i];
+        }
+
+        int dir = this.baseIsLeftToRight() ? Bidi.DIRECTION_LEFT_TO_RIGHT
+                : Bidi.DIRECTION_RIGHT_TO_LEFT;
+
+        long parent = createUBiDi(text, 0, embeddings, 0, this.length, dir);
+
+        long line = BidiWrapper.ubidi_setLine(parent, lineStart, lineLimit);
+        Bidi result = new Bidi(line);
+        BidiWrapper.ubidi_close(line);
+        BidiWrapper.ubidi_close(parent);
+        return result;
+    }
+
+    /**
+     * Return the base level.
+     * 
+     * @return the int value of the base level.
+     */
+    public int getBaseLevel() {
+        return baseLevel;
+    }
+
+    /**
+     * Return the length of the text in the Bidi object.
+     * 
+     * @return the int value of the length.
+     */
+    public int getLength() {
+        return length;
+    }
+
+    /**
+     * Return the level of a specified character.
+     * 
+     * @param offset
+     *            the offset of the character.
+     * @return the int value of the level.
+     */
+    public int getLevelAt(int offset) {
+        try {
+            return offsetLevel[offset] & ~BidiWrapper.UBIDI_LEVEL_OVERRIDE;
+        } catch (RuntimeException e) {
+            return baseLevel;
+        }
+    }
+
+    /**
+     * Return the number of runs in the bidirectional text.
+     * 
+     * @return the int value of runs, at least 1.
+     */
+    public int getRunCount() {
+        return unidirectional ? 1 : runs.length;
+    }
+
+    /**
+     * Return the level of a specified run.
+     * 
+     * @param run
+     *            the index of the run.
+     * @return the level of the run.
+     */
+    public int getRunLevel(int run) {
+        return unidirectional ? baseLevel : runs[run].getLevel();
+    }
+
+    /**
+     * Return the limit offset of a specified run.
+     * 
+     * @param run
+     *            the index of the run.
+     * @return the limit offset of the run.
+     */
+    public int getRunLimit(int run) {
+        return unidirectional ? length : runs[run].getLimit();
+    }
+
+    /**
+     * Return the start offset of a specified run.
+     * 
+     * @param run
+     *            the index of the run.
+     * @return the start offset of the run.
+     */
+    public int getRunStart(int run) {
+        return unidirectional ? 0 : runs[run].getStart();
+    }
+
+    /**
+     * Return whether the text is from left to right, that is, both the base
+     * direction and the text direction is from left to right.
+     * 
+     * @return true if the text is from left to right.
+     */
+    public boolean isLeftToRight() {
+        return direction == BidiWrapper.UBiDiDirection_UBIDI_LTR;
+    }
+
+    /**
+     * Return whether the text direction is mixed.
+     * 
+     * @return true if the text direction is mixed.
+     */
+    public boolean isMixed() {
+        return direction == BidiWrapper.UBiDiDirection_UBIDI_MIXED;
+    }
+
+    /**
+     * Return whether the text is from right to left, that is, both the base
+     * direction and the text direction is from right to left.
+     * 
+     * @return true if the text is from right to left.
+     */
+    public boolean isRightToLeft() {
+        return direction == BidiWrapper.UBiDiDirection_UBIDI_RTL;
+    }
+
+    /**
+     * Reorder a range of objects according to their spefied levels. This is a
+     * convenience function that does not use a Bidi object. The range of
+     * objects at index from objectStart to objectStart + count will be
+     * reordered according to the range of levels at index from levelStart to
+     * levelStart + count.
+     * 
+     * @param levels
+     *            the level array, which is already determined.
+     * @param levelStart
+     *            the start offset of the range of the levels.
+     * @param objects
+     *            the object array to reoeder.
+     * @param objectStart
+     *            the start offset of the range of objects.
+     * @param count
+     *            the count of the range of objects to reorder.
+     */
+    public static void reorderVisually(byte[] levels, int levelStart,
+            Object[] objects, int objectStart, int count) {
         if (count < 0 || levelStart < 0 || objectStart < 0
                 || count > levels.length - levelStart
                 || count > objects.length - objectStart) {
-            // text.13=Invalid ranges (levels={0}, levelStart={1}, objects={2}, objectStart={3}, count={4})
+            // text.13=Invalid ranges (levels={0}, levelStart={1}, objects={2},
+            // objectStart={3}, count={4})
             throw new IllegalArgumentException(Messages.getString("text.13", //$NON-NLS-1$
                     new Object[] { levels.length, levelStart, objects.length,
                             objectStart, count }));
@@ -511,36 +515,38 @@
         }
 
         System.arraycopy(result.toArray(), 0, objects, objectStart, count);
-	}
+    }
 
-	/**
-	 * Return whether a range of characters of a text requires a Bidi object to
-	 * display properly.
-	 * 
-	 * @param text
-	 *            the char array of the text.
-	 * @param start
-	 *            the start offset of the range of characters.
-	 * @param limit
-	 *            the limit offset of the range of characters.
-	 * @return true if the range of characters requires a Bidi object.
-	 */
-	public static boolean requiresBidi(char[] text, int start, int limit) {
+    /**
+     * Return whether a range of characters of a text requires a Bidi object to
+     * display properly.
+     * 
+     * @param text
+     *            the char array of the text.
+     * @param start
+     *            the start offset of the range of characters.
+     * @param limit
+     *            the limit offset of the range of characters.
+     * @return true if the range of characters requires a Bidi object.
+     */
+    public static boolean requiresBidi(char[] text, int start, int limit) {
         int length = text.length;
-        if(limit < 0 || start < 0 || start > limit || limit > length){
+        if (limit < 0 || start < 0 || start > limit || limit > length) {
             throw new IllegalArgumentException();
         }
         Bidi bidi = new Bidi(text, start, null, 0, limit - start, 0);
-		return !bidi.isLeftToRight();
-	}
+        return !bidi.isLeftToRight();
+    }
 
-	/**
-	 * Return the internal message of the Bidi object, used in debugging.
-	 * 
-	 * @return a string containing the internal message.
-	 */
-	public String toString() {
-		return super.toString() + "[direction: " + direction + " baselevel: " + baseLevel //$NON-NLS-1$ //$NON-NLS-2$
-			 + " length: " + length + " runs: " + (unidirectional ? "null" : runs.toString()) + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-	}
+    /**
+     * Return the internal message of the Bidi object, used in debugging.
+     * 
+     * @return a string containing the internal message.
+     */
+    @Override
+    public String toString() {
+        return super.toString()
+                + "[direction: " + direction + " baselevel: " + baseLevel //$NON-NLS-1$ //$NON-NLS-2$
+                + " length: " + length + " runs: " + (unidirectional ? "null" : runs.toString()) + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+    }
 }

Modified: incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/BreakIterator.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/BreakIterator.java?view=diff&rev=462605&r1=462604&r2=462605
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/BreakIterator.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/BreakIterator.java Tue Oct 10 15:18:35 2006
@@ -50,400 +50,409 @@
  */
 public abstract class BreakIterator implements Cloneable {
 
-	/*
-	 * -----------------------------------------------------------------------
-	 * constants
-	 * -----------------------------------------------------------------------
-	 */
-	/**
-	 * This constant is returned by iterate methods like previous() or next() if
-	 * they have returned all valid boundaries.
-	 */
-	public static final int DONE = -1;
-
-	private static final int LONG_LENGTH = 8;
-	private static final int INT_LENGTH = 4;
-	private static final int SHORT_LENGTH = 2;
-
-	/*
-	 * -----------------------------------------------------------------------
-	 * variables
-	 * -----------------------------------------------------------------------
-	 */
-	// the wrapped ICU implementation
-	com.ibm.icu.text.BreakIterator wrapped;
-
-	/*
-	 * -----------------------------------------------------------------------
-	 * constructors
-	 * -----------------------------------------------------------------------
-	 */
-	/**
-	 * Default constructor, just for invocation by subclass.
-	 */
-	protected BreakIterator() {
-		super();
-	}
-
-	/*
-	 * wrapping constructor
-	 */
-	BreakIterator(com.ibm.icu.text.BreakIterator iterator) {
-		wrapped = iterator;
-	}
-
-	/*
-	 * -----------------------------------------------------------------------
-	 * methods
-	 * -----------------------------------------------------------------------
-	 */
-	/**
-	 * Return all supported locales.
-	 * 
-	 * @return all supported locales
-	 */
-	public static Locale[] getAvailableLocales() {
-		return com.ibm.icu.text.BreakIterator.getAvailableLocales();
-	}
-
-	/**
-	 * Return a new instance of BreakIterator used to iterate characters using
-	 * default locale.
-	 * 
-	 * @return a new instance of BreakIterator used to iterate characters using
-	 *         default locale.
-	 */
-	public static BreakIterator getCharacterInstance() {
-		return new RuleBasedBreakIterator(com.ibm.icu.text.BreakIterator
-				.getCharacterInstance());
-	}
-
-	/**
-	 * Return a new instance of BreakIterator used to iterate characters using
-	 * given locale.
-	 * 
-	 * @param where
-	 *            the given locale
-	 * @return a new instance of BreakIterator used to iterate characters using
-	 *         given locale.
-	 */
-	public static BreakIterator getCharacterInstance(Locale where) {
-	    if (where == null) {
+    /*
+     * -----------------------------------------------------------------------
+     * constants
+     * -----------------------------------------------------------------------
+     */
+    /**
+     * This constant is returned by iterate methods like previous() or next() if
+     * they have returned all valid boundaries.
+     */
+    public static final int DONE = -1;
+
+    private static final int LONG_LENGTH = 8;
+
+    private static final int INT_LENGTH = 4;
+
+    private static final int SHORT_LENGTH = 2;
+
+    /*
+     * -----------------------------------------------------------------------
+     * variables
+     * -----------------------------------------------------------------------
+     */
+    // the wrapped ICU implementation
+    com.ibm.icu.text.BreakIterator wrapped;
+
+    /*
+     * -----------------------------------------------------------------------
+     * constructors
+     * -----------------------------------------------------------------------
+     */
+    /**
+     * Default constructor, just for invocation by subclass.
+     */
+    protected BreakIterator() {
+        super();
+    }
+
+    /*
+     * wrapping constructor
+     */
+    BreakIterator(com.ibm.icu.text.BreakIterator iterator) {
+        wrapped = iterator;
+    }
+
+    /*
+     * -----------------------------------------------------------------------
+     * methods
+     * -----------------------------------------------------------------------
+     */
+    /**
+     * Return all supported locales.
+     * 
+     * @return all supported locales
+     */
+    public static Locale[] getAvailableLocales() {
+        return com.ibm.icu.text.BreakIterator.getAvailableLocales();
+    }
+
+    /**
+     * Return a new instance of BreakIterator used to iterate characters using
+     * default locale.
+     * 
+     * @return a new instance of BreakIterator used to iterate characters using
+     *         default locale.
+     */
+    public static BreakIterator getCharacterInstance() {
+        return new RuleBasedBreakIterator(com.ibm.icu.text.BreakIterator
+                .getCharacterInstance());
+    }
+
+    /**
+     * Return a new instance of BreakIterator used to iterate characters using
+     * given locale.
+     * 
+     * @param where
+     *            the given locale
+     * @return a new instance of BreakIterator used to iterate characters using
+     *         given locale.
+     */
+    public static BreakIterator getCharacterInstance(Locale where) {
+        if (where == null) {
             throw new NullPointerException();
         }
 
-	    return new RuleBasedBreakIterator(com.ibm.icu.text.BreakIterator
-	            .getCharacterInstance(where));
-	}
-
-	/**
-	 * Return a new instance of BreakIterator used to iterate line-breaks using
-	 * default locale.
-	 * 
-	 * @return a new instance of BreakIterator used to iterate line-breaks using
-	 *         default locale.
-	 */
-	public static BreakIterator getLineInstance() {
-		return new RuleBasedBreakIterator(com.ibm.icu.text.BreakIterator
-				.getLineInstance());
-	}
-
-	/**
-	 * Return a new instance of BreakIterator used to iterate line-breaks using
-	 * given locale.
-	 * 
-	 * @param where
-	 *            the given locale
-	 * @return a new instance of BreakIterator used to iterate line-breaks using
-	 *         given locale.
-	 */
-	public static BreakIterator getLineInstance(Locale where) {
-	    if (where == null) {
+        return new RuleBasedBreakIterator(com.ibm.icu.text.BreakIterator
+                .getCharacterInstance(where));
+    }
+
+    /**
+     * Return a new instance of BreakIterator used to iterate line-breaks using
+     * default locale.
+     * 
+     * @return a new instance of BreakIterator used to iterate line-breaks using
+     *         default locale.
+     */
+    public static BreakIterator getLineInstance() {
+        return new RuleBasedBreakIterator(com.ibm.icu.text.BreakIterator
+                .getLineInstance());
+    }
+
+    /**
+     * Return a new instance of BreakIterator used to iterate line-breaks using
+     * given locale.
+     * 
+     * @param where
+     *            the given locale
+     * @return a new instance of BreakIterator used to iterate line-breaks using
+     *         given locale.
+     */
+    public static BreakIterator getLineInstance(Locale where) {
+        if (where == null) {
             throw new NullPointerException();
         }
 
-	    return new RuleBasedBreakIterator(com.ibm.icu.text.BreakIterator
-	            .getLineInstance(where));
-	}
-
-	/**
-	 * Return a new instance of BreakIterator used to iterate sentence-breaks
-	 * using default locale.
-	 * 
-	 * @return a new instance of BreakIterator used to iterate sentence-breaks
-	 *         using default locale.
-	 */
-	public static BreakIterator getSentenceInstance() {
-		return new RuleBasedBreakIterator(com.ibm.icu.text.BreakIterator
-				.getSentenceInstance());
-	}
-
-	/**
-	 * Return a new instance of BreakIterator used to iterate sentence-breaks
-	 * using given locale.
-	 * 
-	 * @param where
-	 *            the given locale
-	 * @return a new instance of BreakIterator used to iterate sentence-breaks
-	 *         using given locale.
-	 */
-	public static BreakIterator getSentenceInstance(Locale where) {
-	    if (where == null) {
+        return new RuleBasedBreakIterator(com.ibm.icu.text.BreakIterator
+                .getLineInstance(where));
+    }
+
+    /**
+     * Return a new instance of BreakIterator used to iterate sentence-breaks
+     * using default locale.
+     * 
+     * @return a new instance of BreakIterator used to iterate sentence-breaks
+     *         using default locale.
+     */
+    public static BreakIterator getSentenceInstance() {
+        return new RuleBasedBreakIterator(com.ibm.icu.text.BreakIterator
+                .getSentenceInstance());
+    }
+
+    /**
+     * Return a new instance of BreakIterator used to iterate sentence-breaks
+     * using given locale.
+     * 
+     * @param where
+     *            the given locale
+     * @return a new instance of BreakIterator used to iterate sentence-breaks
+     *         using given locale.
+     */
+    public static BreakIterator getSentenceInstance(Locale where) {
+        if (where == null) {
             throw new NullPointerException();
         }
 
-	    return new RuleBasedBreakIterator(com.ibm.icu.text.BreakIterator
-	            .getSentenceInstance(where));
-	}
-
-	/**
-	 * Return a new instance of BreakIterator used to iterate word-breaks using
-	 * default locale.
-	 * 
-	 * @return a new instance of BreakIterator used to iterate word-breaks using
-	 *         default locale.
-	 */
-	public static BreakIterator getWordInstance() {
-		return new RuleBasedBreakIterator(com.ibm.icu.text.BreakIterator
-				.getWordInstance());
-	}
-
-	/**
-	 * Return a new instance of BreakIterator used to iterate word-breaks using
-	 * given locale.
-	 * 
-	 * @param where
-	 *            the given locale
-	 * @return a new instance of BreakIterator used to iterate word-breaks using
-	 *         given locale.
-	 */
-	public static BreakIterator getWordInstance(Locale where) {
-	    if (where == null) {
+        return new RuleBasedBreakIterator(com.ibm.icu.text.BreakIterator
+                .getSentenceInstance(where));
+    }
+
+    /**
+     * Return a new instance of BreakIterator used to iterate word-breaks using
+     * default locale.
+     * 
+     * @return a new instance of BreakIterator used to iterate word-breaks using
+     *         default locale.
+     */
+    public static BreakIterator getWordInstance() {
+        return new RuleBasedBreakIterator(com.ibm.icu.text.BreakIterator
+                .getWordInstance());
+    }
+
+    /**
+     * Return a new instance of BreakIterator used to iterate word-breaks using
+     * given locale.
+     * 
+     * @param where
+     *            the given locale
+     * @return a new instance of BreakIterator used to iterate word-breaks using
+     *         given locale.
+     */
+    public static BreakIterator getWordInstance(Locale where) {
+        if (where == null) {
             throw new NullPointerException();
         }
 
-	    return new RuleBasedBreakIterator(com.ibm.icu.text.BreakIterator
-	            .getWordInstance(where));
-	}
-
-	/**
-	 * Return true if the given offset is a boundary position. If this method
-	 * returns true, the current iteration position is set to the given
-	 * position; if the function returns false, the current iteration position
-	 * is set as though following() had been called.
-	 * 
-	 * @param offset
-	 *            the given offset to check
-	 * @return true if the given offset is a boundary position
-	 */
-	public boolean isBoundary(int offset) {
-		return wrapped.isBoundary(offset);
-	}
-
-	/**
-	 * Return the position of last boundary precede the given offset, and set
-	 * current position to returned value, or <code>DONE</code> if the given
-	 * offset specifies the starting position.
-	 * <p>
-	 * <code>IllegalArgumentException</code> will be thrown if given offset is
-	 * invalid.
-	 * </p>
-	 * 
-	 * @param offset
-	 *            the given start position to be searched for
-	 * @return the position of last boundary precede the given offset
-	 */
-	public int preceding(int offset) {
-		return wrapped.preceding(offset);
-	}
-
-	/**
-	 * Set the new text string to be analyzed, the current position will be
-	 * reset to beginning of this new string, and the old string will lost.
-	 * 
-	 * @param newText
-	 *            the new text string to be analyzed
-	 */
-	public void setText(String newText) {
-		wrapped.setText(newText);
-	}
-
-	/*
-	 * -----------------------------------------------------------------------
-	 * abstract methods
-	 * -----------------------------------------------------------------------
-	 */
-	/**
-	 * Return this iterator's current position.
-	 * 
-	 * @return this iterator's current position
-	 */
-	public abstract int current();
-
-	/**
-	 * Set this iterator's current position to the first boundary, and return
-	 * this position.
-	 * 
-	 * @return the position of first boundary
-	 */
-	public abstract int first();
-
-	/**
-	 * Set the position of the first boundary following the given offset, and
-	 * return this position. If there is no boundary after the given offset,
-	 * return DONE.
-	 * <p>
-	 * <code>IllegalArgumentException</code> will be thrown if given offset is
-	 * invalid.
-	 * </p>
-	 * 
-	 * @param offset
-	 *            the given position to be searched for
-	 * @return the position of the first boundary following the given offset
-	 */
-	public abstract int following(int offset);
-
-	/**
-	 * Return a <code>CharacterIterator</code> which represents the text being
-	 * analyzed. Please note that the returned value is probably the internal
-	 * iterator used by this object, so that if the invoker want to modify the
-	 * status of the returned iterator, a clone operation at first is
-	 * recommended.
-	 * 
-	 * @return a <code>CharacterIterator</code> which represents the text
-	 *         being analyzed.
-	 */
-	public abstract CharacterIterator getText();
-
-	/**
-	 * Set this iterator's current position to the last boundary, and return
-	 * this position.
-	 * 
-	 * @return the position of last boundary
-	 */
-	public abstract int last();
-
-	/**
-	 * Set this iterator's current position to the next boundary after current
-	 * position, and return this position. Return <code>DONE</code> if no
-	 * boundary found after current position.
-	 * 
-	 * @return the position of last boundary
-	 */
-	public abstract int next();
-
-	/**
-	 * Set this iterator's current position to the next boundary after the given
-	 * position, and return this position. Return <code>DONE</code> if no
-	 * boundary found after the given position.
-	 * 
-	 * @param n
-	 *            the given position.
-	 * @return the position of last boundary
-	 */
-	public abstract int next(int n);
-
-	/**
-	 * Set this iterator's current position to the previous boundary before
-	 * current position, and return this position. Return <code>DONE</code> if
-	 * no boundary found before current position.
-	 * 
-	 * @return the position of last boundary
-	 */
-	public abstract int previous();
-
-	/**
-	 * Set new text to be analyzed by given <code>CharacterIterator</code>.
-	 * The position will be reset to the beginning of the new text, and other
-	 * status of this iterator will be kept.
-	 * 
-	 * @param newText
-	 *            the given <code>CharacterIterator</code> refer to the text
-	 *            to be analyzed
-	 */
-	public abstract void setText(CharacterIterator newText);
-
-	/*
-	 * -----------------------------------------------------------------------
-	 * methods override Object
-	 * -----------------------------------------------------------------------
-	 */
-	/**
-	 * Create copy of this iterator, all status including current position is
-	 * kept.
-	 * 
-	 * @return copy of this iterator
-	 */
-	public Object clone() {
-		try {
-			BreakIterator cloned = (BreakIterator) super.clone();
-			cloned.wrapped = (com.ibm.icu.text.BreakIterator) wrapped.clone();
-			return cloned;
-		} catch (CloneNotSupportedException e) {
-			throw new InternalError(e.getMessage());
-		}
-	}
-
-	/**
-	 * Get a long value from the given byte array, start from given offset.
-	 * 
-	 * @param buf	the bytes to be converted
-	 * @param offset	the start position of conversion
-	 * @return	the converted long value
-	 */
-	protected static long getLong(byte[] buf, int offset) {
-		if(null == buf){
-			throw new NullPointerException();
-		}
-		if(offset < 0 || buf.length - offset < LONG_LENGTH){
-			throw new ArrayIndexOutOfBoundsException();
-		}
-		long result = 0;
-		for (int i = offset; i < offset + LONG_LENGTH; i++) {
-			result = (result << 8) | (buf[i] & 0xff);
-		}
-		return result;
-	}
-
-	/**
-	 * Get an int value from the given byte array, start from given offset.
-	 * 
-	 * @param buf	the bytes to be converted
-	 * @param offset	the start position of conversion
-	 * @return	the converted int value
-	 */	
-	protected static int getInt(byte[] buf, int offset) {
-		if(null == buf){
-			throw new NullPointerException();
-		}
-		if(offset < 0 || buf.length - INT_LENGTH < offset){
-			throw new ArrayIndexOutOfBoundsException();
-		}
-		int result = 0;
-		for (int i = offset; i < offset + INT_LENGTH; i++) {
-			result = (result << 8) | (buf[i] & 0xff);
-		}
-		return result;
-	}
-
-	/**
-	 * Get a short value from the given byte array, start from given offset.
-	 * 
-	 * @param buf	the bytes to be converted
-	 * @param offset	the start position of conversion
-	 * @return	the converted short value
-	 */
-	protected static short getShort(byte[] buf, int offset) {        
-		if(null == buf){
-			throw new NullPointerException();
-		}
-		if(offset < 0 || buf.length - SHORT_LENGTH < offset){
-			throw new ArrayIndexOutOfBoundsException();
-		}
-		short result = 0;
-		for (int i = offset; i < offset + SHORT_LENGTH; i++) {
-			result = (short)((result << 8) | (buf[i] & 0xff));
-		}
-		return result;
-	}
+        return new RuleBasedBreakIterator(com.ibm.icu.text.BreakIterator
+                .getWordInstance(where));
+    }
+
+    /**
+     * Return true if the given offset is a boundary position. If this method
+     * returns true, the current iteration position is set to the given
+     * position; if the function returns false, the current iteration position
+     * is set as though following() had been called.
+     * 
+     * @param offset
+     *            the given offset to check
+     * @return true if the given offset is a boundary position
+     */
+    public boolean isBoundary(int offset) {
+        return wrapped.isBoundary(offset);
+    }
+
+    /**
+     * Return the position of last boundary precede the given offset, and set
+     * current position to returned value, or <code>DONE</code> if the given
+     * offset specifies the starting position.
+     * <p>
+     * <code>IllegalArgumentException</code> will be thrown if given offset is
+     * invalid.
+     * </p>
+     * 
+     * @param offset
+     *            the given start position to be searched for
+     * @return the position of last boundary precede the given offset
+     */
+    public int preceding(int offset) {
+        return wrapped.preceding(offset);
+    }
+
+    /**
+     * Set the new text string to be analyzed, the current position will be
+     * reset to beginning of this new string, and the old string will lost.
+     * 
+     * @param newText
+     *            the new text string to be analyzed
+     */
+    public void setText(String newText) {
+        wrapped.setText(newText);
+    }
+
+    /*
+     * -----------------------------------------------------------------------
+     * abstract methods
+     * -----------------------------------------------------------------------
+     */
+    /**
+     * Return this iterator's current position.
+     * 
+     * @return this iterator's current position
+     */
+    public abstract int current();
+
+    /**
+     * Set this iterator's current position to the first boundary, and return
+     * this position.
+     * 
+     * @return the position of first boundary
+     */
+    public abstract int first();
+
+    /**
+     * Set the position of the first boundary following the given offset, and
+     * return this position. If there is no boundary after the given offset,
+     * return DONE.
+     * <p>
+     * <code>IllegalArgumentException</code> will be thrown if given offset is
+     * invalid.
+     * </p>
+     * 
+     * @param offset
+     *            the given position to be searched for
+     * @return the position of the first boundary following the given offset
+     */
+    public abstract int following(int offset);
+
+    /**
+     * Return a <code>CharacterIterator</code> which represents the text being
+     * analyzed. Please note that the returned value is probably the internal
+     * iterator used by this object, so that if the invoker want to modify the
+     * status of the returned iterator, a clone operation at first is
+     * recommended.
+     * 
+     * @return a <code>CharacterIterator</code> which represents the text
+     *         being analyzed.
+     */
+    public abstract CharacterIterator getText();
+
+    /**
+     * Set this iterator's current position to the last boundary, and return
+     * this position.
+     * 
+     * @return the position of last boundary
+     */
+    public abstract int last();
+
+    /**
+     * Set this iterator's current position to the next boundary after current
+     * position, and return this position. Return <code>DONE</code> if no
+     * boundary found after current position.
+     * 
+     * @return the position of last boundary
+     */
+    public abstract int next();
+
+    /**
+     * Set this iterator's current position to the next boundary after the given
+     * position, and return this position. Return <code>DONE</code> if no
+     * boundary found after the given position.
+     * 
+     * @param n
+     *            the given position.
+     * @return the position of last boundary
+     */
+    public abstract int next(int n);
+
+    /**
+     * Set this iterator's current position to the previous boundary before
+     * current position, and return this position. Return <code>DONE</code> if
+     * no boundary found before current position.
+     * 
+     * @return the position of last boundary
+     */
+    public abstract int previous();
+
+    /**
+     * Set new text to be analyzed by given <code>CharacterIterator</code>.
+     * The position will be reset to the beginning of the new text, and other
+     * status of this iterator will be kept.
+     * 
+     * @param newText
+     *            the given <code>CharacterIterator</code> refer to the text
+     *            to be analyzed
+     */
+    public abstract void setText(CharacterIterator newText);
+
+    /*
+     * -----------------------------------------------------------------------
+     * methods override Object
+     * -----------------------------------------------------------------------
+     */
+    /**
+     * Create copy of this iterator, all status including current position is
+     * kept.
+     * 
+     * @return copy of this iterator
+     */
+    @Override
+    public Object clone() {
+        try {
+            BreakIterator cloned = (BreakIterator) super.clone();
+            cloned.wrapped = (com.ibm.icu.text.BreakIterator) wrapped.clone();
+            return cloned;
+        } catch (CloneNotSupportedException e) {
+            throw new InternalError(e.getMessage());
+        }
+    }
+
+    /**
+     * Get a long value from the given byte array, start from given offset.
+     * 
+     * @param buf
+     *            the bytes to be converted
+     * @param offset
+     *            the start position of conversion
+     * @return the converted long value
+     */
+    protected static long getLong(byte[] buf, int offset) {
+        if (null == buf) {
+            throw new NullPointerException();
+        }
+        if (offset < 0 || buf.length - offset < LONG_LENGTH) {
+            throw new ArrayIndexOutOfBoundsException();
+        }
+        long result = 0;
+        for (int i = offset; i < offset + LONG_LENGTH; i++) {
+            result = (result << 8) | (buf[i] & 0xff);
+        }
+        return result;
+    }
+
+    /**
+     * Get an int value from the given byte array, start from given offset.
+     * 
+     * @param buf
+     *            the bytes to be converted
+     * @param offset
+     *            the start position of conversion
+     * @return the converted int value
+     */
+    protected static int getInt(byte[] buf, int offset) {
+        if (null == buf) {
+            throw new NullPointerException();
+        }
+        if (offset < 0 || buf.length - INT_LENGTH < offset) {
+            throw new ArrayIndexOutOfBoundsException();
+        }
+        int result = 0;
+        for (int i = offset; i < offset + INT_LENGTH; i++) {
+            result = (result << 8) | (buf[i] & 0xff);
+        }
+        return result;
+    }
+
+    /**
+     * Get a short value from the given byte array, start from given offset.
+     * 
+     * @param buf
+     *            the bytes to be converted
+     * @param offset
+     *            the start position of conversion
+     * @return the converted short value
+     */
+    protected static short getShort(byte[] buf, int offset) {
+        if (null == buf) {
+            throw new NullPointerException();
+        }
+        if (offset < 0 || buf.length - SHORT_LENGTH < offset) {
+            throw new ArrayIndexOutOfBoundsException();
+        }
+        short result = 0;
+        for (int i = offset; i < offset + SHORT_LENGTH; i++) {
+            result = (short) ((result << 8) | (buf[i] & 0xff));
+        }
+        return result;
+    }
 }

Modified: incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/CharacterIterator.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/CharacterIterator.java?view=diff&rev=462605&r1=462604&r2=462605
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/CharacterIterator.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/CharacterIterator.java Tue Oct 10 15:18:35 2006
@@ -17,7 +17,6 @@
 
 package java.text;
 
-
 /**
  * CharacterIterator is used to sequence over a group of characters. The
  * iteration starts at the begin index in the group of character and continues
@@ -25,90 +24,90 @@
  */
 public interface CharacterIterator extends Cloneable {
 
-	/**
-	 * A constant which indicates there is no character.
-	 */
-	public static char DONE = '\uffff';
-
-	/**
-	 * Answers a new CharacterIterator with the same properties.
-	 * 
-	 * @return a shallow copy of this CharacterIterator
-	 * 
-	 * @see java.lang.Cloneable
-	 */
-	public Object clone();
-
-	/**
-	 * Answers the character at the current index.
-	 * 
-	 * @return the current character, or DONE if the current index is past the
-	 *         end
-	 */
-	public char current();
-
-	/**
-	 * Sets the current position to the begin index and answers the character at
-	 * the begin index.
-	 * 
-	 * @return the character at the begin index
-	 */
-	public char first();
-
-	/**
-	 * Answers the begin index.
-	 * 
-	 * @return the index of the first character to iterate
-	 */
-	public int getBeginIndex();
-
-	/**
-	 * Answers the end index.
-	 * 
-	 * @return the index one past the last character to iterate
-	 */
-	public int getEndIndex();
-
-	/**
-	 * Answers the current index.
-	 * 
-	 * @return the current index
-	 */
-	public int getIndex();
-
-	/**
-	 * Sets the current position to the end index - 1 and answers the character
-	 * at the current position.
-	 * 
-	 * @return the character before the end index
-	 */
-	public char last();
-
-	/**
-	 * Increments the current index and returns the character at the new index.
-	 * 
-	 * @return the character at the next index, or DONE if the next index is
-	 *         past the end
-	 */
-	public char next();
-
-	/**
-	 * Decrements the current index and returns the character at the new index.
-	 * 
-	 * @return the character at the previous index, or DONE if the previous
-	 *         index is past the beginning
-	 */
-	public char previous();
-
-	/**
-	 * Sets the current index.
-	 * 
-	 * @return the character at the new index, or DONE if the index is past the
-	 *         end
-	 * 
-	 * @exception IllegalArgumentException
-	 *                when the new index is less than the begin index or greater
-	 *                than the end index
-	 */
-	public char setIndex(int location);
+    /**
+     * A constant which indicates there is no character.
+     */
+    public static char DONE = '\uffff';
+
+    /**
+     * Answers a new CharacterIterator with the same properties.
+     * 
+     * @return a shallow copy of this CharacterIterator
+     * 
+     * @see java.lang.Cloneable
+     */
+    public Object clone();
+
+    /**
+     * Answers the character at the current index.
+     * 
+     * @return the current character, or DONE if the current index is past the
+     *         end
+     */
+    public char current();
+
+    /**
+     * Sets the current position to the begin index and answers the character at
+     * the begin index.
+     * 
+     * @return the character at the begin index
+     */
+    public char first();
+
+    /**
+     * Answers the begin index.
+     * 
+     * @return the index of the first character to iterate
+     */
+    public int getBeginIndex();
+
+    /**
+     * Answers the end index.
+     * 
+     * @return the index one past the last character to iterate
+     */
+    public int getEndIndex();
+
+    /**
+     * Answers the current index.
+     * 
+     * @return the current index
+     */
+    public int getIndex();
+
+    /**
+     * Sets the current position to the end index - 1 and answers the character
+     * at the current position.
+     * 
+     * @return the character before the end index
+     */
+    public char last();
+
+    /**
+     * Increments the current index and returns the character at the new index.
+     * 
+     * @return the character at the next index, or DONE if the next index is
+     *         past the end
+     */
+    public char next();
+
+    /**
+     * Decrements the current index and returns the character at the new index.
+     * 
+     * @return the character at the previous index, or DONE if the previous
+     *         index is past the beginning
+     */
+    public char previous();
+
+    /**
+     * Sets the current index.
+     * 
+     * @return the character at the new index, or DONE if the index is past the
+     *         end
+     * 
+     * @exception IllegalArgumentException
+     *                when the new index is less than the begin index or greater
+     *                than the end index
+     */
+    public char setIndex(int location);
 }