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

de.gwdg.metadataqa.marc.utils.pica.PicaSchemaReader Maven / Gradle / Ivy

package de.gwdg.metadataqa.marc.utils.pica;

import de.gwdg.metadataqa.marc.definition.Cardinality;
import de.gwdg.metadataqa.marc.definition.structure.SubfieldDefinition;
import net.minidev.json.JSONArray;
import net.minidev.json.JSONObject;
import net.minidev.json.parser.JSONParser;
import net.minidev.json.parser.ParseException;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

public class PicaSchemaReader {

  private JSONParser parser = new JSONParser(JSONParser.MODE_RFC4627);
  private Map map = new HashMap<>();
  private PicaSchemaManager schema = new PicaSchemaManager();

  private PicaSchemaReader(String fileName) {
    try {
      readSchema(fileName);
    } catch (IOException | ParseException | URISyntaxException e) {
      e.printStackTrace();
    }
  }

  public static Map create(String filename) {
    PicaSchemaReader reader = new PicaSchemaReader(filename);
    return reader.map;
  }

  public static PicaSchemaManager createSchema(String filename) {
    PicaSchemaReader reader = new PicaSchemaReader(filename);
    return reader.getSchema();
  }

  private void readSchema(String fileName) throws IOException, ParseException, URISyntaxException {
    // Path tagsFile = FileUtils.getPath(fileName);
    Object obj = parser.parse(new FileReader(fileName));
    JSONObject jsonObject = (JSONObject) obj;
    JSONObject fields = (JSONObject) jsonObject.get("fields");
    for (String id : fields.keySet()) {
      JSONObject field = (JSONObject) fields.get(id);
      PicaTagDefinition tag = new PicaTagDefinition(
        (String) field.get("pica3"),         // pica3
        (String) field.get("tag"),           // picaplus
        (boolean) field.get("repeatable"),   // repeatable
        false,                               // sheet
        (String) field.get("label")          // label
      );
      tag.setId(id);
      tag.setDescriptionUrl((String) field.get("url"));
      tag.setModified((String) field.get("modified"));
      tag.setOccurrence((String) field.get("occurrence"));
      tag.setCounter((String) field.get("counter"));
      if (tag.getCounter() != null && tag.getOccurrence() != null) {
        System.err.println(id + " has both");
      }
      processSubfields(field, tag);
      PicaFieldDefinition definition = new PicaFieldDefinition(tag);
      addTag(definition);
      if (id.endsWith("/00")) {
        PicaFieldDefinition definition2 = definition.copyWithChangesId();
        addTag(definition2);
      }
    }
  }

  private void processSubfields(JSONObject field, PicaTagDefinition tag) {
    Object subfieldsRaw = field.get("subfields");
    List subfieldDefinitions = new LinkedList<>();
    if (subfieldsRaw != null) {
      if (subfieldsRaw instanceof JSONObject) {
        JSONObject subfields = (JSONObject) subfieldsRaw;
        for (String key : subfields.keySet())
          processSubfield(subfields.get(key), subfieldDefinitions);
      } else if (subfieldsRaw instanceof JSONArray) {
        JSONArray subfields = (JSONArray) subfieldsRaw;
        for (var i = 0; i < subfields.size(); i++)
          processSubfield(subfields.get(i), subfieldDefinitions);
      }
    }
    tag.setSubfields(subfieldDefinitions);
  }

  private void processSubfield(Object o, List subfieldDefinitions) {
    SubfieldDefinition definition = extractSubfield(o);
    if (definition != null)
      subfieldDefinitions.add(definition);
  }

  private SubfieldDefinition extractSubfield(Object o) {
    SubfieldDefinition definition = null;
    if (o instanceof JSONObject) {
      JSONObject subfield = (JSONObject) o;
      String code = (String) subfield.get("code");
      String label = (String) subfield.get("label");
      String cardinalityCode = ((boolean) subfield.get("repeatable")) ? Cardinality.Repeatable.getCode() : Cardinality.Nonrepeatable.getCode();
      definition = new SubfieldDefinition(code, label, cardinalityCode);
      for (String key : subfield.keySet()) {
        Object value = subfield.get(key);
        if (key.equals("code")) {
        } else if (key.equals("label")) {
        } else if (key.equals("repeatable")) {
        } else if (key.equals("modified")) {
          // skip
        } else if (key.equals("order")) {
          // skip
        } else if (key.equals("pica3")) {
          // skip
        } else {
          System.err.println("code: " + key);
        }
      }
    } else {
      System.err.println(o.getClass());
    }
    return definition;
  }

  private void addTag(PicaFieldDefinition definition) {
    /*
    String tag = definition.getTag();
    if (map.containsKey(tag)) {
      System.err.println("xxx Tag is already defined! " + definition.getTag() + " " + map.get(tag));
    }
    map.put(tag, definition);
     */
    schema.add(definition);
  }

  public Map getMap() {
    return map;
  }

  public PicaSchemaManager getSchema() {
    return schema;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy