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

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

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

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.FileNotFoundException;
import java.io.FileReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PicaVocabularyManager {
  private JSONParser parser = new JSONParser(JSONParser.MODE_RFC4627);
  private Map map = new HashMap<>();
  private static final Pattern PATTERN = Pattern.compile("^\\^(\\w|\\[\\w+\\])(.*)$");
  private static PicaVocabularyManager instance;

  public static PicaVocabularyManager getInstance() {
    if (instance == null) {
      try {
        instance = new PicaVocabularyManager(PicaVocabularyManager.class.getResourceAsStream("/pica/vocabularies.json"));
      } catch (FileNotFoundException | ParseException e) {
        throw new RuntimeException(e);
      }
    }
    return instance;
  }

  public static PicaVocabularyManager getInstance(InputStream inputStream) {
    if (instance == null) {
      try {
        instance = new PicaVocabularyManager(inputStream);
      } catch (FileNotFoundException | ParseException e) {
        throw new RuntimeException(e);
      }
    }
    return instance;
  }

  public static PicaVocabularyManager getInstance(String filename) {
    if (instance == null) {
      try {
        instance = new PicaVocabularyManager(filename);
      } catch (FileNotFoundException | ParseException e) {
        throw new RuntimeException(e);
      }
    }
    return instance;
  }

  private PicaVocabularyManager(String filename) throws FileNotFoundException, ParseException {
    Object jsonObject = parser.parse(new FileReader(new File(filename)));
    read(jsonObject);
  }

  private PicaVocabularyManager(InputStream inputStream) throws FileNotFoundException, ParseException {
    try {
      Object jsonObject = parser.parse(new InputStreamReader(inputStream, "UTF-8"));
      read(jsonObject);
    } catch (UnsupportedEncodingException e) {
      throw new RuntimeException(e);
    }
  }

  private VocabularyPattern parseId(String id) {
    if (id.startsWith("^")) {
      Matcher m = PATTERN.matcher(id);
      if (m.matches())
        return new VocabularyPattern(m.group(1), m.group(2));
    }
    return null;
  }

  private void read(Object jsonObject) throws FileNotFoundException, ParseException {
    // Object obj = parser.parse(new FileReader(new File(filename)));
    JSONArray items = (JSONArray) jsonObject;
    for (Object item : items) {
      JSONObject record = (JSONObject) item;
      VocabularyEntry entry = new VocabularyEntry();
      entry.setId(parseId((String) record.get("ID")));
      entry.setPica((String) record.get("PICA"));
      entry.setSource(parseId((String) record.get("SRC")));
      entry.setVoc((String) record.get("VOC"));
      entry.setNotationPattern((String) record.get("notationPattern"));
      entry.setNamespace((String) record.get("namespace"));
      if (record.containsKey("COMMENT"))
        entry.setComment((String) record.get("COMMENT"));

      if (record.containsKey("prefLabel")) {
        JSONObject prefLabel = (JSONObject) record.get("prefLabel");
        if (prefLabel.containsKey("en"))
          entry.setPrefLabelEn((String) prefLabel.get("en"));
        if (prefLabel.containsKey("de"))
          entry.setPrefLabelDe((String) prefLabel.get("de"));
      }
      entry.setUri((String) record.get("uri"));
      map.put(entry.getPica(), entry);
    }
  }

  public VocabularyEntry get(String tag) {
    return map.getOrDefault(tag, null);
  }

  public Collection getAll() {
    return map.values();
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy