ISBNCheckDigit.java

  1. /*
  2.  * Licensed to the Apache Software Foundation (ASF) under one or more
  3.  * contributor license agreements.  See the NOTICE file distributed with
  4.  * this work for additional information regarding copyright ownership.
  5.  * The ASF licenses this file to You under the Apache License, Version 2.0
  6.  * (the "License"); you may not use this file except in compliance with
  7.  * the License.  You may obtain a copy of the License at
  8.  *
  9.  *      http://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */
  17. package org.apache.commons.validator.routines.checkdigit;

  18. import java.io.Serializable;

  19. import org.apache.commons.validator.GenericValidator;

  20. /**
  21.  * Combined <b>ISBN-10</b> / <b>ISBN-13</b> Check Digit calculation/validation.
  22.  * <p>
  23.  * This implementation validates/calculates ISBN check digits
  24.  * based on the length of the code passed to it - delegating
  25.  * either to the {@link ISBNCheckDigit#ISBN10_CHECK_DIGIT} or the
  26.  * {@link ISBNCheckDigit#ISBN13_CHECK_DIGIT} routines to perform the actual
  27.  * validation/calculation.
  28.  * <p>
  29.  * <b>N.B.</b> From 1st January 2007 the book industry will start to use a new 13 digit
  30.  * ISBN number (rather than this 10 digit ISBN number) which uses the EAN-13 / UPC
  31.  * standard.
  32.  *
  33.  * @since 1.4
  34.  */
  35. public final class ISBNCheckDigit extends AbstractCheckDigit implements Serializable {

  36.     private static final long serialVersionUID = 1391849166205184558L;

  37.     /** Singleton ISBN-10 Check Digit instance */
  38.     public static final CheckDigit ISBN10_CHECK_DIGIT = ISBN10CheckDigit.ISBN10_CHECK_DIGIT;

  39.     /** Singleton ISBN-13 Check Digit instance */
  40.     public static final CheckDigit ISBN13_CHECK_DIGIT = EAN13CheckDigit.EAN13_CHECK_DIGIT;

  41.     /** Singleton combined ISBN-10 / ISBN-13 Check Digit instance */
  42.     public static final CheckDigit ISBN_CHECK_DIGIT = new ISBNCheckDigit();

  43.     /**
  44.      * Calculate an ISBN-10 or ISBN-13 check digit, depending
  45.      * on the length of the code.
  46.      * <p>
  47.      * If the length of the code is 9, it is treated as an ISBN-10
  48.      * code or if the length of the code is 12, it is treated as an ISBN-13
  49.      * code.
  50.      *
  51.      * @param code The ISBN code to validate (should have a length of
  52.      * 9 or 12)
  53.      * @return The ISBN-10 check digit if the length is 9 or an ISBN-13
  54.      * check digit if the length is 12.
  55.      * @throws CheckDigitException if the code is missing, or an invalid
  56.      * length (i.e. not 9 or 12) or if there is an error calculating the
  57.      * check digit.
  58.      */
  59.     @Override
  60.     public String calculate(final String code) throws CheckDigitException {
  61.         if (GenericValidator.isBlankOrNull(code)) {
  62.             throw new CheckDigitException("ISBN Code is missing");
  63.         }
  64.         if (code.length() == 9) { // CHECKSTYLE IGNORE MagicNumber
  65.             return ISBN10_CHECK_DIGIT.calculate(code);
  66.         }
  67.         if (code.length() == 12) { // CHECKSTYLE IGNORE MagicNumber
  68.             return ISBN13_CHECK_DIGIT.calculate(code);
  69.         }
  70.         throw new CheckDigitException("Invalid ISBN Length = " + code.length());
  71.     }

  72.     /**
  73.      * <p>Validate an ISBN-10 or ISBN-13 check digit, depending
  74.      * on the length of the code.</p>
  75.      * <p>
  76.      * If the length of the code is 10, it is treated as an ISBN-10
  77.      * code or ff the length of the code is 13, it is treated as an ISBN-13
  78.      * code.
  79.      *
  80.      * @param code The ISBN code to validate (should have a length of
  81.      * 10 or 13)
  82.      * @return {@code true} if the code has a length of 10 and is
  83.      * a valid ISBN-10 check digit or the code has a length of 13 and is
  84.      * a valid ISBN-13 check digit - otherwise {@code false}.
  85.      */
  86.     @Override
  87.     public boolean isValid(final String code) {
  88.         if (code == null) {
  89.             return false;
  90.         }
  91.         if (code.length() == 10) { // CHECKSTYLE IGNORE MagicNumber
  92.             return ISBN10_CHECK_DIGIT.isValid(code);
  93.         }
  94.         if (code.length() == 13) { // CHECKSTYLE IGNORE MagicNumber
  95.             return ISBN13_CHECK_DIGIT.isValid(code);
  96.         }
  97.         return false;
  98.     }

  99. }