You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ba...@apache.org on 2013/04/23 08:00:42 UTC

svn commit: r1470822 - in /commons/proper/lang/trunk/src: changes/changes.xml main/java/org/apache/commons/lang3/text/translate/LookupTranslator.java test/java/org/apache/commons/lang3/text/translate/LookupTranslatorTest.java

Author: bayard
Date: Tue Apr 23 06:00:41 2013
New Revision: 1470822

URL: http://svn.apache.org/r1470822
Log:
Allow LookupTranslator to support CharSequence properly; previously it was working only for CharSequence's that implemented hashCode and equals(Object). LANG-882

Modified:
    commons/proper/lang/trunk/src/changes/changes.xml
    commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/text/translate/LookupTranslator.java
    commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/text/translate/LookupTranslatorTest.java

Modified: commons/proper/lang/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/changes/changes.xml?rev=1470822&r1=1470821&r2=1470822&view=diff
==============================================================================
--- commons/proper/lang/trunk/src/changes/changes.xml (original)
+++ commons/proper/lang/trunk/src/changes/changes.xml Tue Apr 23 06:00:41 2013
@@ -22,6 +22,7 @@
   <body>
 
   <release version="3.2" date="TBA" description="Next release">
+    <action issue="LANG-882" type="update">LookupTranslator now works with implementations of CharSequence other than String </action>
     <action issue="LANG-754" type="fix">ClassUtils.getShortName(String) will now only do a reverse lookup for array types</action>  
     <action issue="LANG-886" type="add">Added CharSetUtils.containsAny(String, String)</action>
     <action issue="LANG-846" type="update">Provide CharSequenceUtils.regionMatches with a proper green implementation instead of inefficiently converting to Strings</action>

Modified: commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/text/translate/LookupTranslator.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/text/translate/LookupTranslator.java?rev=1470822&r1=1470821&r2=1470822&view=diff
==============================================================================
--- commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/text/translate/LookupTranslator.java (original)
+++ commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/text/translate/LookupTranslator.java Tue Apr 23 06:00:41 2013
@@ -23,31 +23,32 @@ import java.util.HashMap;
 /**
  * Translates a value using a lookup table.
  *
- * NOTE: This class is broken for any CharSequence implementation that does not define 
- *       equals(Object) and hashCode() methods as the class uses the CharSequence as 
- *       the key to a HashMap. See http://issues.apache.org/jira/browse/LANG-882.
- * 
  * @since 3.0
  * @version $Id$
  */
 public class LookupTranslator extends CharSequenceTranslator {
 
-    private final HashMap<CharSequence, CharSequence> lookupMap;
+    private final HashMap<String, CharSequence> lookupMap;
     private final int shortest;
     private final int longest;
 
     /**
      * Define the lookup table to be used in translation
      *
+     * Note that, as of Lang 3.1, the key to the lookup table is converted to a 
+     * java.lang.String, while the value remains as a java.lang.CharSequence. 
+     * This is because we need the key to support hashCode and equals(Object), 
+     * allowing it to be the key for a HashMap. See LANG-882.
+     *
      * @param lookup CharSequence[][] table of size [*][2]
      */
     public LookupTranslator(final CharSequence[]... lookup) {
-        lookupMap = new HashMap<CharSequence, CharSequence>();
+        lookupMap = new HashMap<String, CharSequence>();
         int _shortest = Integer.MAX_VALUE;
         int _longest = 0;
         if (lookup != null) {
             for (final CharSequence[] seq : lookup) {
-                this.lookupMap.put(seq[0], seq[1]);
+                this.lookupMap.put(seq[0].toString(), seq[1]);
                 final int sz = seq[0].length();
                 if (sz < _shortest) {
                     _shortest = sz;
@@ -73,7 +74,7 @@ public class LookupTranslator extends Ch
         // descend so as to get a greedy algorithm
         for (int i = max; i >= shortest; i--) {
             final CharSequence subSeq = input.subSequence(index, index + i);
-            final CharSequence result = lookupMap.get(subSeq);
+            final CharSequence result = lookupMap.get(subSeq.toString());
             if (result != null) {
                 out.write(result.toString());
                 return i;

Modified: commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/text/translate/LookupTranslatorTest.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/text/translate/LookupTranslatorTest.java?rev=1470822&r1=1470821&r2=1470822&view=diff
==============================================================================
--- commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/text/translate/LookupTranslatorTest.java (original)
+++ commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/text/translate/LookupTranslatorTest.java Tue Apr 23 06:00:41 2013
@@ -39,4 +39,14 @@ public class LookupTranslatorTest  {
         assertEquals("Incorrect value", "two", out.toString());
     }
 
+    // Tests: https://issues.apache.org/jira/browse/LANG-882
+    @Test
+    public void testLang882() throws IOException {
+        final LookupTranslator lt = new LookupTranslator(new CharSequence[][] { { new StringBuffer("one"), new StringBuffer("two") } });
+        final StringWriter out = new StringWriter();
+        final int result = lt.translate(new StringBuffer("one"), 0, out);
+        assertEquals("Incorrect codepoint consumption", 3, result);
+        assertEquals("Incorrect value", "two", out.toString());
+    }
+
 }