Author: britter
Date: Thu Jan  1 16:40:05 2015
New Revision: 1648876

URL: http://svn.apache.org/r1648876
Log:
VALIDATOR-345: ISINCheckDigit fails to reject invalid (non-numeric) check 
digits. Fix implemented by Sebb.

Modified:
    commons/proper/validator/trunk/RELEASE-NOTES.txt
    commons/proper/validator/trunk/src/changes/changes.xml
    
commons/proper/validator/trunk/src/main/java/org/apache/commons/validator/routines/checkdigit/ISINCheckDigit.java
    
commons/proper/validator/trunk/src/test/java/org/apache/commons/validator/routines/checkdigit/ISINCheckDigitTest.java

Modified: commons/proper/validator/trunk/RELEASE-NOTES.txt
URL: 
http://svn.apache.org/viewvc/commons/proper/validator/trunk/RELEASE-NOTES.txt?rev=1648876&r1=1648875&r2=1648876&view=diff
==============================================================================
--- commons/proper/validator/trunk/RELEASE-NOTES.txt (original)
+++ commons/proper/validator/trunk/RELEASE-NOTES.txt Thu Jan  1 16:40:05 2015
@@ -60,6 +60,8 @@ BUGS FROM PREVIOUS RELEASE
  * [VALIDATOR-331] - IBANCheckDigitTest.createInvalidCodes(String[] codes) uses
                      wrong values.
  * [VALIDATOR-336] - CUSIPCheckDigit thinks invalid CUSIP is valid.
+ * [VALIDATOR-345] - ISINCheckDigit fails to reject invalid (non-numeric) check
+                     digits
  * [VALIDATOR-347] - toLowerCase() method is Locale-sensitive and should not be
                      used
  * [VALIDATOR-348] - Update TLD list to latest version (Version 2014123000)

Modified: commons/proper/validator/trunk/src/changes/changes.xml
URL: 
http://svn.apache.org/viewvc/commons/proper/validator/trunk/src/changes/changes.xml?rev=1648876&r1=1648875&r2=1648876&view=diff
==============================================================================
--- commons/proper/validator/trunk/src/changes/changes.xml (original)
+++ commons/proper/validator/trunk/src/changes/changes.xml Thu Jan  1 16:40:05 
2015
@@ -43,6 +43,9 @@ The <action> type attribute can be add,u
   <body>
 
   <release version="1.4.1" date="tba" description="1.4 Maintenance release">
+    <action issue="VALIDATOR-345" dev="sebb" type="fix" >
+      ISINCheckDigit fails to reject invalid (non-numeric) check digits
+    </action>
     <action issue="VALIDATOR-336" dev="sebb" type="fix" >
       CUSIPCheckDigit thinks invalid CUSIP is valid
     </action>

Modified: 
commons/proper/validator/trunk/src/main/java/org/apache/commons/validator/routines/checkdigit/ISINCheckDigit.java
URL: 
http://svn.apache.org/viewvc/commons/proper/validator/trunk/src/main/java/org/apache/commons/validator/routines/checkdigit/ISINCheckDigit.java?rev=1648876&r1=1648875&r2=1648876&view=diff
==============================================================================
--- 
commons/proper/validator/trunk/src/main/java/org/apache/commons/validator/routines/checkdigit/ISINCheckDigit.java
 (original)
+++ 
commons/proper/validator/trunk/src/main/java/org/apache/commons/validator/routines/checkdigit/ISINCheckDigit.java
 Thu Jan  1 16:40:05 2015
@@ -67,12 +67,20 @@ public final class ISINCheckDigit extend
      */
     protected int calculateModulus(String code, boolean includesCheckDigit) 
throws CheckDigitException {
         StringBuffer transformed = new  StringBuffer(code.length() * 2);
+        if (includesCheckDigit) {
+            char checkDigit = code.charAt(code.length()-1); // fetch the last 
character
+            if (!Character.isDigit(checkDigit)){
+                throw new CheckDigitException("Invalid checkdigit["+ 
checkDigit+ "] in " + code);
+            }
+        }
         for (int i = 0; i < code.length(); i++) {
             int charValue = Character.getNumericValue(code.charAt(i));
             if (charValue < 0 || charValue > 35) {
                 throw new CheckDigitException("Invalid Character[" +
                         (i + 1) + "] = '" + charValue + "'");
             }
+             // this converts alphanumerics to two digits
+             // so there is no need to overload toInt()
             transformed.append(charValue);
         }
         return super.calculateModulus(transformed.toString(), 
includesCheckDigit);

Modified: 
commons/proper/validator/trunk/src/test/java/org/apache/commons/validator/routines/checkdigit/ISINCheckDigitTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/validator/trunk/src/test/java/org/apache/commons/validator/routines/checkdigit/ISINCheckDigitTest.java?rev=1648876&r1=1648875&r2=1648876&view=diff
==============================================================================
--- 
commons/proper/validator/trunk/src/test/java/org/apache/commons/validator/routines/checkdigit/ISINCheckDigitTest.java
 (original)
+++ 
commons/proper/validator/trunk/src/test/java/org/apache/commons/validator/routines/checkdigit/ISINCheckDigitTest.java
 Thu Jan  1 16:40:05 2015
@@ -48,4 +48,20 @@ public class ISINCheckDigitTest extends
                               };
         invalid = new String[] {"0378#3100"};
     }
+
+    private static String invalidCheckDigits[] =
+                             {"US037833100O", // proper check digit is '5', 
see above
+                              "BMG8571G109D", // proper check digit is '6', 
see above
+                              "AU0000XVGZAD", // proper check digit is '3', 
see above
+                              "GB000263494I", // proper check digit is '6', 
see above
+                              "FR000402625C", // proper check digit is '0', 
see above
+                              "DK000976334H", // proper check digit is '4', 
see above
+                              };
+
+    public void testVALIDATOR_345() {
+        for (int i = 0; i < invalidCheckDigits.length; i++) {
+            String invalidCheckDigit = invalidCheckDigits[i];
+            assertFalse("Should fail: " + invalidCheckDigit, 
routine.isValid(invalidCheckDigit));
+        }
+    }
 }


Reply via email to