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

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

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

import de.gwdg.metadataqa.marc.definition.ControlValue;
import de.gwdg.metadataqa.marc.definition.general.parser.ParserException;
import de.gwdg.metadataqa.marc.definition.general.parser.SubfieldContentParser;
import de.gwdg.metadataqa.marc.model.validation.ValidationError;
import de.gwdg.metadataqa.marc.model.validation.ValidationErrorType;

import java.util.ArrayList;

public class ControlValueValidator extends AbstractValidator {

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

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

  public boolean validate(ControlValue controlValue) {
    var isValid = true;
    validationErrors = new ArrayList<>();

    var definition = controlValue.getDefinition();
    var value = controlValue.getValue();
    if (!definition.getValidCodes().isEmpty()
      && (!definition.getValidCodes().contains(value)
      && definition.getCode(value) == null)) {
      if (definition.isHistoricalCode(value)) {
        addError(controlValue, ValidationErrorType.CONTROL_POSITION_OBSOLETE_CODE, value);
      } else {
        if (definition.isRepeatableContent()) {
          int unitLength = definition.getUnitLength();
          for (int i = 0; i < value.length(); i += unitLength) {
            String unit = value.substring(i, i + unitLength);
            if (!definition.getValidCodes().contains(unit)) {
              addError(controlValue, ValidationErrorType.CONTROL_POSITION_INVALID_CODE, String.format("'%s' in '%s'", unit, value));
            }
          }
        } else {
          addError(controlValue, ValidationErrorType.CONTROL_POSITION_INVALID_VALUE, value);
        }
      }
    }

    if (definition.hasParser()) {
      try {
        SubfieldContentParser parser = definition.getParser();
        parser.parse(value);
      } catch (ParserException e) {
        addError(controlValue, ValidationErrorType.CONTROL_POSITION_INVALID_CODE, e.getMessage());
      }
    }

    return validationErrors.isEmpty();
  }

  private void addError(ControlValue controlValue, ValidationErrorType type, String message) {
    if (!isIgnorableType(type)) {
      var definition = controlValue.getDefinition();
      validationErrors.add(
        new ValidationError(
          ((controlValue.getMarcRecord() == null) ? null : controlValue.getMarcRecord().getId()),
          definition.getPath(),
          type,
          message,
          definition.getDescriptionUrl()
        )
      );
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy