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());
+ }
+
}