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

io.carml.util.RmlMappingLoader Maven / Gradle / Ivy

package io.carml.util;

import io.carml.model.FileSource;
import io.carml.model.NameableStream;
import io.carml.model.TermType;
import io.carml.model.TriplesMap;
import io.carml.model.XmlSource;
import io.carml.model.impl.CarmlFileSource;
import io.carml.model.impl.CarmlStream;
import io.carml.model.impl.CarmlTriplesMap;
import io.carml.model.impl.CarmlXmlSource;
import io.carml.rdfmapper.impl.MappingCache;
import io.carml.rdfmapper.util.RdfObjectLoader;
import io.carml.vocab.Rdf;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Collection;
import java.util.Set;
import org.eclipse.rdf4j.model.IRI;
import org.eclipse.rdf4j.model.Model;
import org.eclipse.rdf4j.model.Resource;
import org.eclipse.rdf4j.model.util.ModelCollector;
import org.eclipse.rdf4j.rio.RDFFormat;

public class RmlMappingLoader {

  public static RmlMappingLoader build() {
    return new RmlMappingLoader(new RmlConstantShorthandExpander());
  }

  private final RmlConstantShorthandExpander shorthandExpander;

  private RmlMappingLoader(RmlConstantShorthandExpander shorthandExpander) {
    this.shorthandExpander = shorthandExpander;
  }

  public Set load(RDFFormat rdfFormat, String... classPathResources) {
    InputStream[] inputs = Arrays.stream(classPathResources)
        .map(RmlMappingLoader.class.getClassLoader()::getResourceAsStream)
        .toArray(InputStream[]::new);

    return load(rdfFormat, inputs);
  }

  public Set load(RDFFormat rdfFormat, Path... pathsToFile) {
    InputStream[] inputs = Arrays.stream(pathsToFile)
        .map(path -> {
          InputStream input;
          try {
            input = Files.newInputStream(path);
          } catch (IOException ioException) {
            throw new RmlMappingLoaderException(String.format("Exception while load mapping from path %s", path),
                ioException);
          }
          return input;
        })
        .toArray(InputStream[]::new);

    return load(rdfFormat, inputs);
  }

  public Set load(RDFFormat rdfFormat, InputStream... inputs) {
    Model[] models = Arrays.stream(inputs)
        .map(inputStream -> Models.parse(inputStream, rdfFormat))
        .toArray(Model[]::new);

    return load(models);
  }

  public Set load(Model... models) {
    Model model = Arrays.stream(models)
        .flatMap(Collection::stream)
        .collect(ModelCollector.toModel());

    return Set.copyOf(RdfObjectLoader.load(RmlMappingLoader::selectTriplesMaps, CarmlTriplesMap.class, model,
        shorthandExpander, this::addTermTypes, mapper -> {
          mapper.addDecidableType(Rdf.Carml.Stream, NameableStream.class);
          mapper.addDecidableType(Rdf.Carml.XmlDocument, XmlSource.class);
          mapper.addDecidableType(Rdf.Carml.FileSource, FileSource.class);
          mapper.bindInterfaceImplementation(NameableStream.class, CarmlStream.class);
          mapper.bindInterfaceImplementation(XmlSource.class, CarmlXmlSource.class);
          mapper.bindInterfaceImplementation(FileSource.class, CarmlFileSource.class);
        }, RmlNamespaces.RML_NAMESPACES));
  }

  private static Set selectTriplesMaps(Model model) {
    return Set.copyOf(model.filter(null, Rdf.Rml.logicalSource, null)
        .subjects());
  }

  private void addTermTypes(MappingCache cache) {
    class AddTermTypes {

      void add(IRI iri, TermType termType) {
        cache.addCachedMapping(iri, Set.of(TermType.class), termType);
      }

      void run() {
        add(Rdf.Rr.BlankNode, TermType.BLANK_NODE);
        add(Rdf.Rr.IRI, TermType.IRI);
        add(Rdf.Rr.Literal, TermType.LITERAL);
      }
    }

    new AddTermTypes().run();
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy