All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.gwdg.metadataqa.marc.analysis.BLClassifier Maven / Gradle / Ivy

package de.gwdg.metadataqa.marc.analysis;

import de.gwdg.metadataqa.marc.MarcSubfield;
import de.gwdg.metadataqa.marc.analysis.bl.UseCase;
import de.gwdg.metadataqa.marc.analysis.bl.Element;
import de.gwdg.metadataqa.marc.dao.DataField;
import de.gwdg.metadataqa.marc.dao.record.BibliographicRecord;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

import static de.gwdg.metadataqa.marc.analysis.bl.Band.BASIC;
import static de.gwdg.metadataqa.marc.analysis.bl.Band.DEFICIENT;
import static de.gwdg.metadataqa.marc.analysis.bl.Band.SATISFACTORY;
import static de.gwdg.metadataqa.marc.analysis.bl.Band.EFFECTIVE;

public class BLClassifier implements Classifier {

  private static final Logger logger = Logger.getLogger(BLClassifier.class.getCanonicalName());

  private List basicUseCases = new ArrayList<>();
  private List satisfactoryUseCases = new ArrayList<>();
  private List effectiveUseCases = new ArrayList<>();

  public BLClassifier() {
    for (UseCase useCase : UseCase.values()) {
      if (useCase.getBand().equals(BASIC))
        basicUseCases.add(useCase);
      else if (useCase.getBand().equals(SATISFACTORY))
        satisfactoryUseCases.add(useCase);
      else if (useCase.getBand().equals(EFFECTIVE))
        effectiveUseCases.add(useCase);
    }
  }

  @Override
  public String classify(BibliographicRecord marcRecord) {
    String level = DEFICIENT.name();

    for (UseCase useCase : basicUseCases)
      if (useCase.getStatus().equals("Mandatory") && !useCase.getElements().isEmpty() && !satisfy(marcRecord, useCase))
        return level;
    level = BASIC.name();

    for (UseCase useCase : satisfactoryUseCases)
      if (!useCase.getElements().isEmpty() && !satisfy(marcRecord, useCase))
        return level;
    level = SATISFACTORY.name();

    for (UseCase useCase : effectiveUseCases)
      if (!useCase.getElements().isEmpty() && !satisfy(marcRecord, useCase))
        return level;
    level = EFFECTIVE.name();
    return level;
  }

  private boolean satisfy(BibliographicRecord marcRecord, UseCase useCase) {
    for (Element element : useCase.getElements()) {
      if (marcRecord.hasDatafield(element.getTag())) {
        if (element.getSubfield() == null) {
          return true;
        } else {
          for (DataField field : marcRecord.getDatafield(element.getTag())) {
            List subfields = field.getSubfield(element.getSubfield());
            if (subfields != null && !subfields.isEmpty())
              return true;
          }
        }
      }
    }
    logger.info(String.format("failed for %s (%s -- %s -- %s)", useCase.name(), useCase.getUseCase(), useCase.getEncoding(), useCase.getDataElelemntsNormalized()));
    return false;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy