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

de.gwdg.metadataqa.marc.analysis.validator.Validator Maven / Gradle / Ivy

package de.gwdg.metadataqa.marc.analysis.validator;

import de.gwdg.metadataqa.marc.Utils;
import de.gwdg.metadataqa.marc.dao.DataField;
import de.gwdg.metadataqa.marc.dao.MarcControlField;
import de.gwdg.metadataqa.marc.dao.record.BibliographicRecord;
import de.gwdg.metadataqa.marc.definition.Cardinality;
import de.gwdg.metadataqa.marc.definition.ValidatorResponse;
import de.gwdg.metadataqa.marc.definition.bibliographic.SchemaType;
import de.gwdg.metadataqa.marc.definition.general.validator.ClassificationReferenceValidator;
import de.gwdg.metadataqa.marc.definition.structure.DataFieldDefinition;
import de.gwdg.metadataqa.marc.model.validation.ValidationError;
import de.gwdg.metadataqa.marc.model.validation.ValidationErrorType;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;

import static de.gwdg.metadataqa.marc.Utils.count;

public class Validator extends AbstractValidator {
  private BibliographicRecord marcRecord;

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

  public Validator() {
    super(new ValidatorConfiguration());
  }

  public Validator(ValidatorConfiguration configuration) {
    super(configuration);
  }

  public boolean validate(BibliographicRecord marcRecord) {
    this.marcRecord = marcRecord;

    validationErrors = new ArrayList<>();
    boolean isValidRecord = true;
    if (!marcRecord.getSchemaType().equals(SchemaType.PICA))
      isValidRecord = validateLeader(isValidRecord);
    isValidRecord = validateUnhandledTags(isValidRecord);
    isValidRecord = validateControlfields(isValidRecord);
    isValidRecord = validateDatafields(isValidRecord);

    // TODO: use reflection to get all validator class
    // ValidatorResponse validatorResponse;

    return validationErrors.isEmpty();
  }

  private boolean validateLeader(boolean isValidRecord) {
    boolean isValidComponent;
    LeaderValidator leaderValidator = new LeaderValidator(configuration);
    isValidComponent = leaderValidator.validate(marcRecord.getLeader());
    // isValidComponent = marcRecord.getLeader().validate(configuration.getMarcVersion());
    if (!isValidComponent) {
      List leaderErrors = leaderValidator.getValidationErrors();
      for (ValidationError leaderError : leaderErrors)
        if (leaderError.getRecordId() == null)
          leaderError.setRecordId(marcRecord.getId());
      validationErrors.addAll(filterErrors(leaderErrors));
      isValidRecord = isValidComponent;
    }
    return isValidRecord;
  }

  private boolean validateUnhandledTags(boolean isValidRecord) {
    if (!marcRecord.getUnhandledTags().isEmpty()) {
      if (configuration.doSummary()) {
        for (String tag : marcRecord.getUnhandledTags()) {
          if (!marcRecord.isIgnorableField(tag, configuration.getIgnorableFields())
              && (!isIgnorableType(ValidationErrorType.FIELD_UNDEFINED)))
            validationErrors.add(new ValidationError(marcRecord.getId(), tag, ValidationErrorType.FIELD_UNDEFINED, tag, null));
        }
      } else {
        Map tags = new LinkedHashMap<>();
        for (String tag : marcRecord.getUnhandledTags())
          Utils.count(tag, tags);

        List unhandledTagsList = new ArrayList<>();
        for (Map.Entry entry : tags.entrySet()) {
          String tag = entry.getKey();
          if (entry.getValue() == 1)
            unhandledTagsList.add(tag);
          else
            unhandledTagsList.add(String.format("%s (%d*)", tag, entry.getValue()));
        }
        for (String tag : unhandledTagsList) {
          if (!marcRecord.isIgnorableField(tag, configuration.getIgnorableFields())
              && !isIgnorableType(ValidationErrorType.FIELD_UNDEFINED))
            validationErrors.add(new ValidationError(marcRecord.getId(), tag, ValidationErrorType.FIELD_UNDEFINED, tag, null));
        }
      }

      isValidRecord = false;
    }
    return isValidRecord;
  }

  private boolean validateControlfields(boolean isValidRecord) {
    boolean isValidComponent;
    ControlFieldValidator controlFieldValidator = new ControlFieldValidator(configuration);
    for (MarcControlField controlField : marcRecord.getControlfields()) {
      if (controlField != null) {
        isValidComponent = controlFieldValidator.validate(controlField);
        if (!isValidComponent) {
          validationErrors.addAll(filterErrors(controlFieldValidator.getValidationErrors()));
          isValidRecord = isValidComponent;
        }
      }
    }
    return isValidRecord;
  }

  private boolean validateDatafields(boolean isValidRecord) {
    DataFieldValidator validator = new DataFieldValidator(configuration);
    ValidatorResponse validatorResponse;
    Map repetitionCounter = new HashMap<>();
    for (DataField field : marcRecord.getDatafields()) {
      if (field.getDefinition() != null && !marcRecord.isIgnorableField(field.getTag(), configuration.getIgnorableFields())) {
        count(field.getDefinition(), repetitionCounter);
        if (!validator.validate(field)) {
          isValidRecord = false;
          validationErrors.addAll(filterErrors(validator.getValidationErrors()));
        }

        validatorResponse = ClassificationReferenceValidator.validate(field);
        if (!validatorResponse.isValid()) {
          validationErrors.addAll(filterErrors(validatorResponse.getValidationErrors()));
          isValidRecord = false;
        }
      }
    }

    if (!isIgnorableType(ValidationErrorType.FIELD_NONREPEATABLE)) {
      for (Map.Entry entry : repetitionCounter.entrySet()) {
        DataFieldDefinition fieldDefinition = entry.getKey();
        Integer count = entry.getValue();
        if (count > 1
            && fieldDefinition.getCardinality().equals(Cardinality.Nonrepeatable)) {
          validationErrors.add(new ValidationError(marcRecord.getId(), fieldDefinition.getTag(),
            ValidationErrorType.FIELD_NONREPEATABLE,
            String.format("there are %d instances", count),
            fieldDefinition.getDescriptionUrl()
          ));
          isValidRecord = false;
        }
      }
    }
    return isValidRecord;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy