package org.xbib.elasticsearch.common.standardnumber; import org.elasticsearch.common.component.AbstractLifecycleComponent; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.settings.Settings; import org.xbib.elasticsearch.action.isbnformat.ISBNFormatResponse; import org.xbib.elasticsearch.index.mapper.standardnumber.StandardnumberMapper; import org.xbib.standardnumber.ISBN; import org.xbib.standardnumber.NoSuchStandardNumberException; import org.xbib.standardnumber.StandardNumber; import java.util.Collection; import java.util.LinkedList; /** * */ public class StandardnumberService extends AbstractLifecycleComponent { private static final String[] DEFAULT_STANDARD_NUMBERS = { "isbn", "issn", "ismn", "isni", "orcid", "ppn", "zdb" }; @Inject public StandardnumberService(Settings settings) { super(settings); } /** * Called from StandardnumberTokenFilterFactory. * @param standardNumberTypeParser the type parser */ public void setStandardNumberTypeParser(StandardnumberMapper.TypeParser standardNumberTypeParser) { standardNumberTypeParser.setService(this); } @Override protected void doStart() { // nothing to do } @Override protected void doStop() { // nothing to do } @Override protected void doClose() { // nothing to do } /** * Called from {@link org.xbib.elasticsearch.index.analysis.standardnumber.StandardnumberTokenFilter}. * @param settings settings * @param content content * @return a collection of variants of the detected standard number or an empty collection */ public Collection<CharSequence> lookup(Settings settings, CharSequence content) { String[] stdnums = settings.getAsArray("standardnumbers", DEFAULT_STANDARD_NUMBERS); if (stdnums.length == 0) { stdnums = DEFAULT_STANDARD_NUMBERS; } Collection<CharSequence> variants = new LinkedList<>(); for (String stdnum : stdnums) { try { StandardNumber standardNumber = StandardNumber.getInstance(stdnum); if (standardNumber instanceof ISBN) { handleISBN((ISBN) standardNumber, content, variants); } else { standardNumber = standardNumber.set(content).normalize(); if (standardNumber.isValid()) { for (String variant : standardNumber.getTypedVariants()) { if (variant != null) { variants.add(variant); } } } } } catch (NoSuchStandardNumberException e) { logger.error(e.getMessage(), e); } } return variants; } public void handle(String value, ISBNFormatResponse isbnFormatResponse) { ISBN isbn = new ISBN(); isbn = (ISBN)isbn.set(value).normalize().verify(); isbnFormatResponse.setIsbn10(isbn.ean(false).normalizedValue()); isbnFormatResponse.setIsbn10Formatted(isbn.ean(false).format()); isbnFormatResponse.setIsbn13(isbn.ean(true).normalizedValue()); isbnFormatResponse.setIsbn13Formatted(isbn.ean(true).format()); } private void handleISBN(ISBN isbn, CharSequence content, Collection<CharSequence> variants) { ISBN normalizedISBN = (ISBN)isbn.set(content).normalize(); if (normalizedISBN.isValid()) { if (!normalizedISBN.isEAN()) { // create variants: ISBN, ISBN normalized, ISBN-13, ISBN-13 normalized variants.add(normalizedISBN.ean(false).format()); variants.add(normalizedISBN.ean(false).normalizedValue()); StandardNumber normalizedEAN = normalizedISBN.ean(true).set(content).normalize(); if (normalizedEAN.isValid()) { variants.add(normalizedEAN.format()); variants.add(normalizedEAN.normalizedValue()); } } else { // 2 variants, do not create ISBN-10 for an ISBN-13 variants.add(normalizedISBN.ean(true).format()); variants.add(normalizedISBN.ean(true).normalizedValue()); } } } }