You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by ni...@apache.org on 2006/12/19 16:10:10 UTC

svn commit: r488702 - in /jakarta/commons/proper/validator/trunk/src: share/org/apache/commons/validator/routines/checkdigit/ test/org/apache/commons/validator/routines/checkdigit/

Author: niallp
Date: Tue Dec 19 07:10:09 2006
New Revision: 488702

URL: http://svn.apache.org/viewvc?view=rev&rev=488702
Log:
Add Verhoeff Check Digit implementation

Added:
    jakarta/commons/proper/validator/trunk/src/share/org/apache/commons/validator/routines/checkdigit/VerhoeffCheckDigit.java   (with props)
    jakarta/commons/proper/validator/trunk/src/test/org/apache/commons/validator/routines/checkdigit/VerhoeffCheckDigitTest.java   (with props)
Modified:
    jakarta/commons/proper/validator/trunk/src/test/org/apache/commons/validator/routines/checkdigit/CheckDigitTestSuite.java

Added: jakarta/commons/proper/validator/trunk/src/share/org/apache/commons/validator/routines/checkdigit/VerhoeffCheckDigit.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/validator/trunk/src/share/org/apache/commons/validator/routines/checkdigit/VerhoeffCheckDigit.java?view=auto&rev=488702
==============================================================================
--- jakarta/commons/proper/validator/trunk/src/share/org/apache/commons/validator/routines/checkdigit/VerhoeffCheckDigit.java (added)
+++ jakarta/commons/proper/validator/trunk/src/share/org/apache/commons/validator/routines/checkdigit/VerhoeffCheckDigit.java Tue Dec 19 07:10:09 2006
@@ -0,0 +1,123 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.validator.routines.checkdigit;
+
+/**
+ * <b>Verhoeff</b> (Dihedral) Check Digit calculation/validation.
+ * <p>
+ * Check digit calculation for numeric codes using a
+ * <a href="http://en.wikipedia.org/wiki/Dihedral_group">Dihedral Group</a>
+ * of order 10.
+ * <p>
+ * See <a href="http://en.wikipedia.org/wiki/Verhoeff_algorithm">Wikipedia
+ *  - Verhoeff algorithm</a> for more details.
+ *    
+ * @version $Revision$ $Date$
+ * @since Validator 1.4
+ */
+public class VerhoeffCheckDigit implements CheckDigit {
+
+    /** Static Verhoeff check digit instance */
+    public static final CheckDigit INSTANCE = new VerhoeffCheckDigit();
+
+    /** D - multiplication table */
+    private static final int[][] D_TABLE = new int[][] {
+        {0,  1,  2,  3,  4,  5,  6,  7,  8,  9}, 
+        {1,  2,  3,  4,  0,  6,  7,  8,  9,  5},
+        {2,  3,  4,  0,  1,  7,  8,  9,  5,  6},
+        {3,  4,  0,  1,  2,  8,  9,  5,  6,  7},
+        {4,  0,  1,  2,  3,  9,  5,  6,  7,  8},
+        {5,  9,  8,  7,  6,  0,  4,  3,  2,  1},
+        {6,  5,  9,  8,  7,  1,  0,  4,  3,  2},
+        {7,  6,  5,  9,  8,  2,  1,  0,  4,  3},
+        {8,  7,  6,  5,  9,  3,  2,  1,  0,  4},
+        {9,  8,  7,  6,  5,  4,  3,  2,  1,  0}};
+
+    /** P - permutation table */
+    private static final int[][] P_TABLE = new int[][] {
+        {0,  1,  2,  3,  4,  5,  6,  7,  8,  9},
+        {1,  5,  7,  6,  2,  8,  3,  0,  9,  4},
+        {5,  8,  0,  3,  7,  9,  6,  1,  4,  2},
+        {8,  9,  1,  6,  0,  4,  3,  5,  2,  7},
+        {9,  4,  5,  3,  1,  2,  6,  8,  7,  0},
+        {4,  2,  8,  6,  5,  7,  3,  9,  0,  1},
+        {2,  7,  9,  3,  8,  0,  6,  4,  1,  5},
+        {7,  0,  4,  6,  9,  1,  3,  2,  5,  8}};
+
+    /** inv: inverse table */
+    private static final int[] INV_TABLE = new int[]
+        {0,  4,  3,  2,  1,  5,  6,  7,  8,  9};
+
+
+    /**
+     * Validate the Verhoeff <i>Check Digit</i> for a code.
+     *
+     * @param code The code to validate
+     * @return <code>true</code> if the check digit is valid,
+     * otherwise <code>false</code>
+     */
+    public boolean isValid(String code) {
+        if (code == null || code.length() == 0) {
+            return false;
+        }
+        try {
+            return (calculateChecksum(code, true) == 0);
+        } catch (CheckDigitException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Calculate a Verhoeff <i>Check Digit</i> for a code.
+     *
+     * @param code The code to calculate the Check Digit for
+     * @return The calculated Check Digit
+     * @throws CheckDigitException if an error occurs calculating
+     * the check digit for the specified code
+     */
+    public String calculate(String code) throws CheckDigitException {
+        if (code == null || code.length() == 0) {
+            throw new CheckDigitException("Code is missing");
+        }
+        int checksum = calculateChecksum(code, false);
+        return Integer.toString(INV_TABLE[checksum]);
+    }
+
+    /**
+     * Calculate the checksum.
+     *
+     * @param code The code to calculate the checksum for.
+     * @param includesCheckDigit Whether the code includes the Check Digit or not.
+     * @return The checksum value
+     * @throws CheckDigitException if the code contains an invalid character (i.e. not numeric)
+     */
+    private int calculateChecksum(String code, boolean includesCheckDigit) throws CheckDigitException {
+        int checksum = 0;
+        for (int i = 0; i < code.length(); i++) {
+            int idx = code.length() - (i + 1); 
+            int num = Character.getNumericValue(code.charAt(idx));
+            if (num < 0 || num > 9) {
+                throw new CheckDigitException("Invalid Character[" + 
+                        i + "] = '" + ((int)code.charAt(idx)) + "'");
+            }
+            int pos = includesCheckDigit ? i : i + 1;
+            checksum = D_TABLE[checksum][P_TABLE[pos % 8][num]];
+        }
+        return checksum;
+    }
+
+}

Propchange: jakarta/commons/proper/validator/trunk/src/share/org/apache/commons/validator/routines/checkdigit/VerhoeffCheckDigit.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jakarta/commons/proper/validator/trunk/src/share/org/apache/commons/validator/routines/checkdigit/VerhoeffCheckDigit.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: jakarta/commons/proper/validator/trunk/src/test/org/apache/commons/validator/routines/checkdigit/CheckDigitTestSuite.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/validator/trunk/src/test/org/apache/commons/validator/routines/checkdigit/CheckDigitTestSuite.java?view=diff&rev=488702&r1=488701&r2=488702
==============================================================================
--- jakarta/commons/proper/validator/trunk/src/test/org/apache/commons/validator/routines/checkdigit/CheckDigitTestSuite.java (original)
+++ jakarta/commons/proper/validator/trunk/src/test/org/apache/commons/validator/routines/checkdigit/CheckDigitTestSuite.java Tue Dec 19 07:10:09 2006
@@ -48,6 +48,7 @@
        suite.addTestSuite(ISBN10CheckDigitTest.class);
        suite.addTestSuite(ISBNCheckDigitTest.class);
        suite.addTestSuite(LuhnCheckDigitTest.class);
+       suite.addTestSuite(VerhoeffCheckDigitTest.class);
 
        return suite;
     }

Added: jakarta/commons/proper/validator/trunk/src/test/org/apache/commons/validator/routines/checkdigit/VerhoeffCheckDigitTest.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/validator/trunk/src/test/org/apache/commons/validator/routines/checkdigit/VerhoeffCheckDigitTest.java?view=auto&rev=488702
==============================================================================
--- jakarta/commons/proper/validator/trunk/src/test/org/apache/commons/validator/routines/checkdigit/VerhoeffCheckDigitTest.java (added)
+++ jakarta/commons/proper/validator/trunk/src/test/org/apache/commons/validator/routines/checkdigit/VerhoeffCheckDigitTest.java Tue Dec 19 07:10:09 2006
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.validator.routines.checkdigit;
+
+/**
+ * Verhoeff Check Digit Test.
+ *
+ * @version $Revision$
+ * @since Validator 1.4
+ */
+public class VerhoeffCheckDigitTest extends CheckDigitTestBase {
+
+    /**
+     * Construct a new test.
+     * @param name test name
+     */
+    public VerhoeffCheckDigitTest(String name) {
+        super(name);
+    }
+
+    /**
+     * Set up routine & valid codes.
+     */
+    protected void setUp() throws Exception {
+        super.setUp();
+        routine = VerhoeffCheckDigit.INSTANCE;
+        valid = new String[] {
+                "15",
+                "1428570",
+                "12345678902"
+                };
+    }
+
+    /**
+     * Test zero sum
+     */
+    public void testZeroSum() {
+        // ignore, don't run this test
+    }
+}

Propchange: jakarta/commons/proper/validator/trunk/src/test/org/apache/commons/validator/routines/checkdigit/VerhoeffCheckDigitTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jakarta/commons/proper/validator/trunk/src/test/org/apache/commons/validator/routines/checkdigit/VerhoeffCheckDigitTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL



---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org