001/* 002 * Licensed under the Apache License, Version 2.0 (the "License"); 003 * you may not use this file except in compliance with the License. 004 * You may obtain a copy of the License at 005 * 006 * http://www.apache.org/licenses/LICENSE-2.0 007 * 008 * Unless required by applicable law or agreed to in writing, software 009 * distributed under the License is distributed on an "AS IS" BASIS, 010 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 011 * See the License for the specific language governing permissions and 012 * limitations under the License. 013 */ 014package org.gbif.api.util.validators.identifierschemes; 015 016import java.util.Objects; 017import java.util.regex.Matcher; 018import java.util.regex.Pattern; 019 020/** Validator for ISNI numbers. */ 021public class IsniValidator implements IdentifierSchemeValidator { 022 023 private static final Pattern ISNI_PATTERN = 024 Pattern.compile( 025 "^(?<prefix>http(?:s)?:\\/\\/isni.org\\/isni\\/)?([\\p{Digit}xX\\p{Pd}\\s]{16,24})$"); 026 027 @Override 028 public boolean isValid(String value) { 029 if (value == null || value.isEmpty()) { 030 return false; 031 } 032 033 Matcher matcher = ISNI_PATTERN.matcher(value); 034 if (!matcher.matches()) { 035 return false; 036 } 037 038 String prefixGroup = matcher.group("prefix"); 039 String isniNumber = prefixGroup == null ? value : value.substring(prefixGroup.length()); 040 041 return Mod112.hasValidChecksumDigit(isniNumber); 042 } 043 044 @Override 045 public String normalize(String value) { 046 Objects.requireNonNull(value, "Identifier value can't be null"); 047 return value.trim(); 048 } 049}