Author: bayard
Date: Sun Oct 18 07:25:59 2009
New Revision: 826370

URL: http://svn.apache.org/viewvc?rev=826370&view=rev
Log:
Implementing an option to UnicodeUnescaper in which the syntax '\u+0047' is 
supported. By default it remains unsupported to match Java's method of parsing. 
Request in LANG-507

Modified:
    
commons/proper/lang/trunk/src/java/org/apache/commons/lang/text/translate/UnicodeUnescaper.java
    
commons/proper/lang/trunk/src/test/org/apache/commons/lang/text/translate/UnicodeUnescaperTest.java

Modified: 
commons/proper/lang/trunk/src/java/org/apache/commons/lang/text/translate/UnicodeUnescaper.java
URL: 
http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/java/org/apache/commons/lang/text/translate/UnicodeUnescaper.java?rev=826370&r1=826369&r2=826370&view=diff
==============================================================================
--- 
commons/proper/lang/trunk/src/java/org/apache/commons/lang/text/translate/UnicodeUnescaper.java
 (original)
+++ 
commons/proper/lang/trunk/src/java/org/apache/commons/lang/text/translate/UnicodeUnescaper.java
 Sun Oct 18 07:25:59 2009
@@ -26,6 +26,15 @@
  */
 public class UnicodeUnescaper extends CharSequenceTranslator {
 
+    private boolean escapingPlus = false;
+
+    public void setEscapingPlus(boolean b) {
+        this.escapingPlus = b;
+    }
+    public boolean isEscapingPlus() {
+        return this.escapingPlus;
+    }
+
     /**
      * {...@inheritdoc}
      */
@@ -39,6 +48,13 @@
                     i++;
                 }
 
+                // consume + symbol in \\u+0045
+                if(isEscapingPlus()) {
+                    if( (index + i < input.length()) && (input.charAt(index + 
i) == '+') ) {
+                        i++;
+                    }
+                }
+
                 if( (index + i + 4 <= input.length()) ) {
                     // Get 4 hex digits
                     CharSequence unicode = input.subSequence(index + i, index 
+ i + 4);
@@ -47,7 +63,7 @@
                         int value = Integer.parseInt(unicode.toString(), 16);
                         out.write((char) value);
                     } catch (NumberFormatException nfe) {
-                        throw new RuntimeException("Unable to parse unicode 
value: " + unicode, nfe);
+                        throw new IllegalArgumentException("Unable to parse 
unicode value: " + unicode, nfe);
                     }
                     return i + 4;
                 } else {

Modified: 
commons/proper/lang/trunk/src/test/org/apache/commons/lang/text/translate/UnicodeUnescaperTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/test/org/apache/commons/lang/text/translate/UnicodeUnescaperTest.java?rev=826370&r1=826369&r2=826370&view=diff
==============================================================================
--- 
commons/proper/lang/trunk/src/test/org/apache/commons/lang/text/translate/UnicodeUnescaperTest.java
 (original)
+++ 
commons/proper/lang/trunk/src/test/org/apache/commons/lang/text/translate/UnicodeUnescaperTest.java
 Sun Oct 18 07:25:59 2009
@@ -27,6 +27,22 @@
  */
 public class UnicodeUnescaperTest extends TestCase {
 
+    // Requested in LANG-507
+    public void testUPlus() throws IOException {
+        UnicodeUnescaper uu = new UnicodeUnescaper();
+
+        String input = "\\u+0047";
+        try {
+            String result = uu.translate(input);
+            fail("Default behaviour should not parse u+");
+        } catch(IllegalArgumentException iae) {
+            // expected
+        }
+
+        uu.setEscapingPlus(true);
+        assertEquals("Failed to unescape unicode characters with 'u+' 
notation", "G", uu.translate(input));
+    }
+
     public void testUuuuu() throws IOException {
         UnicodeUnescaper uu = new UnicodeUnescaper();
 


Reply via email to