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

de.gwdg.metadataqa.marc.definition.structure.DataFieldDefinition Maven / Gradle / Ivy

package de.gwdg.metadataqa.marc.definition.structure;

import de.gwdg.metadataqa.marc.EncodedValue;
import de.gwdg.metadataqa.marc.Utils;
import de.gwdg.metadataqa.marc.definition.Cardinality;
import de.gwdg.metadataqa.marc.definition.CompilanceLevel;
import de.gwdg.metadataqa.marc.definition.FRBRFunction;
import de.gwdg.metadataqa.marc.definition.MarcVersion;
import de.gwdg.metadataqa.marc.definition.SourceSpecificationType;
import de.gwdg.metadataqa.marc.definition.bibliographic.BibliographicFieldDefinition;
import org.apache.commons.lang3.StringUtils;

import java.io.Serializable;
import java.util.*;

public abstract class DataFieldDefinition implements BibliographicFieldDefinition, Serializable {
  protected String tag;
  protected String bibframeTag;
  protected String mqTag;
  protected String label;
  protected Cardinality cardinality = Cardinality.Nonrepeatable;
  protected Indicator ind1;
  protected Indicator ind2;
  protected String descriptionUrl;
  protected List subfields;
  protected Map subfieldIndex = new LinkedHashMap<>();
  protected List historicalSubfields;
  protected Map historicalSubfieldsIndex;
  protected String indexTag = null;
  protected Map> versionSpecificSubfields;
  protected List functions;
  protected SourceSpecificationType sourceSpecificationType = null;
  protected boolean obsolete = false;
  private CompilanceLevel nationalCompilanceLevel;
  private CompilanceLevel minimalCompilanceLevel;
  private MarcVersion marcVersion;

  public String getTag() {
    return tag;
  }

  public String getIndexTag() {
    if (indexTag == null) {
      if (mqTag != null)
        indexTag = mqTag;
      else if (bibframeTag != null)
        indexTag = bibframeTag.replace("/", "");
      else
        indexTag = tag;
    }
    return indexTag;
  }

  public String getLabel() {
    return label;
  }

  public Cardinality getCardinality() {
    return cardinality;
  }

  public Indicator getInd1() {
    return ind1;
  }

  public Indicator getInd2() {
    return ind2;
  }

  public List getIndicators() {
    return Arrays.asList(ind1, ind2);
  }

  protected void postCreation() {
    setIndicatorFlags();
  }

  protected void setIndicatorFlags() {
    if (ind1 != null) {
      ind1.setParent(this);
      ind1.setIndicatorFlag("ind1");
    }
    if (ind2 != null) {
      ind2.setParent(this);
      ind2.setIndicatorFlag("ind2");
    }
  }

  public List getSubfields() {
    return subfields;
  }

  protected void setSubfields(String... input) {
    subfields = new LinkedList<>();
    for (int i = 0; i < input.length; i += 2) {
      subfields.add(new SubfieldDefinition(input[i], input[i + 1]));
    }
    indexSubfields();
  }

  protected void setSubfieldsWithCardinality(String... input) {
    subfields = new LinkedList<>();
    for (int i = 0; i < input.length; i += 3) {
      String code = input[i];
      String label = input[i + 1];
      String cardinality = input[i + 2];
      SubfieldDefinition definition = new SubfieldDefinition(code, label, cardinality);
      definition.setParent(this);
      subfields.add(definition);
    }
    indexSubfields();
  }

  protected void indexSubfields() {
    for (SubfieldDefinition subfield : subfields) {
      subfieldIndex.put(subfield.getCode(), subfield);
    }
  }

  protected DataFieldDefinition setHistoricalSubfields(String... input) {
    historicalSubfields = new LinkedList<>();
    for (int i = 0; i();
    for (EncodedValue code : historicalSubfields) {
      historicalSubfieldsIndex.put(code.getCode(), code);
    }
  }

  public boolean isHistoricalSubfield(String code) {
    return historicalSubfields != null
      && !historicalSubfields.isEmpty()
      && historicalSubfieldsIndex.containsKey(code);
  }

  public String getDescriptionUrl() {
    return descriptionUrl;
  }

  /**
   *
   * @param code
   * @return The subfield definition or null
   */
  public SubfieldDefinition getSubfield(String code) {
    return subfieldIndex.getOrDefault(code, null);
  }

  public void putVersionSpecificSubfields(MarcVersion marcVersion,
                                          List subfieldDefinitions) {
    if (versionSpecificSubfields == null)
      versionSpecificSubfields = new EnumMap<>(MarcVersion.class);

    for (SubfieldDefinition subfieldDefinition : subfieldDefinitions) {
      subfieldDefinition.setParent(this);
      subfieldDefinition.setMarcVersion(marcVersion);
    }

    versionSpecificSubfields.put(marcVersion, subfieldDefinitions);
  }

  public Map> getVersionSpecificSubfields() {
    return versionSpecificSubfields;
  }

  public boolean hasVersionSpecificSubfields(MarcVersion marcVersion) {
    return versionSpecificSubfields.containsKey(marcVersion);
  }

  public boolean isVersionSpecificSubfields(MarcVersion marcVersion, String code) {
    if (versionSpecificSubfields != null
      && !versionSpecificSubfields.isEmpty()
      && versionSpecificSubfields.containsKey(marcVersion)
      && !versionSpecificSubfields.get(marcVersion).isEmpty()) {
      for (SubfieldDefinition subfieldDefinition : versionSpecificSubfields.get(marcVersion)) {
        if (subfieldDefinition.getCode().equals(code))
          return true;
      }
    }
    return false;
  }

  public SubfieldDefinition getVersionSpecificSubfield(MarcVersion marcVersion, String code) {
    if (isVersionSpecificSubfields(marcVersion, code)) {
      for (SubfieldDefinition subfieldDefinition : versionSpecificSubfields.get(marcVersion)) {
        if (subfieldDefinition.getCode().equals(code))
          return subfieldDefinition;
      }
    }
    return null;
  }

  public List getHistoricalSubfields() {
    return historicalSubfields;
  }

  public String getMqTag() {
    return mqTag;
  }

  public List getFrbrFunctions() {
    return functions;
  }

  public SourceSpecificationType getSourceSpecificationType() {
    return sourceSpecificationType;
  }

  public void setCompilanceLevels(String national) {
    setNationalCompilanceLevel(national);
  }

  public void setCompilanceLevels(String national, String minimal) {
    setNationalCompilanceLevel(national);
    setMinimalCompilanceLevel(minimal);
  }

  public CompilanceLevel getNationalCompilanceLevel() {
    return nationalCompilanceLevel;
  }

  public void setNationalCompilanceLevel(CompilanceLevel nationalLevel) {
    this.nationalCompilanceLevel = nationalLevel;
  }

  public void setNationalCompilanceLevel(String level) {
    if (StringUtils.isNotBlank(level))
      this.nationalCompilanceLevel = CompilanceLevel.byAbbreviation(level);
  }

  public CompilanceLevel getMinimalCompilanceLevel() {
    return minimalCompilanceLevel;
  }

  public void setMinimalCompilanceLevel(String level) {
    if (StringUtils.isNotBlank(level))
      this.minimalCompilanceLevel = CompilanceLevel.byAbbreviation(level);
  }

  public void setMinimalCompilanceLevel(CompilanceLevel minimalLevel) {
    this.minimalCompilanceLevel = minimalLevel;
  }

  public MarcVersion getMarcVersion() {
    if (marcVersion == null)
      marcVersion = Utils.getVersion(this);
    return marcVersion;
  }

  public boolean isObsolete() {
    return obsolete;
  }


  @Override
  public String toString() {
    return "DataFieldDefinition{" +
      "tag='" + tag + '\'' +
      ", label='" + label + '\'' +
      ", cardinality=" + cardinality +
      // ", ind1=" + ind1 +
      // ", ind2=" + ind2 +
      ", descriptionUrl='" + descriptionUrl + '\'' +
      // ", subfields=" + subfields +
      '}';
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy