GraphToStringConverterDefault.java
package org.linkedopenactors.rdfpub.store.rdf4j;
import java.io.StringWriter;
import org.apache.commons.rdf.api.Graph;
import org.apache.commons.rdfrdf4j.RDF4J;
import org.eclipse.rdf4j.model.Model;
import org.eclipse.rdf4j.model.util.ModelBuilder;
import org.eclipse.rdf4j.rio.Rio;
import org.linkedopenactors.rdfpub.domain.commonsrdf.GraphToStringConverter;
import org.linkedopenactors.rdfpub.domain.commonsrdf.RdfFormat;
import org.linkedopenactors.rdfpub.domain.commonsrdf.SubjectProvider;
import org.springframework.stereotype.Component;
import lombok.extern.slf4j.Slf4j;
@Component
@Slf4j
class GraphToStringConverterDefault implements GraphToStringConverter {
private RDF4J rdf4j;
private SubjectProvider subjectProvider;
public GraphToStringConverterDefault(SubjectProvider subjectProvider) {
this.subjectProvider = subjectProvider;
rdf4j = new RDF4J();
}
public String convert(RdfFormat rdfFormat, Graph graph) {
return convert(rdfFormat, graph, false);
}
public String convert(RdfFormat rdfFormat, Graph graph, boolean resolveIris) {
Model asModel = asModel(graph);
return convert(rdfFormat, asModel, resolveIris);
}
public String convert(RdfFormat rdfFormat, Model asModel) {
return convert(rdfFormat, asModel, false);
}
public String convert(RdfFormat rdfFormat, Model asModel, boolean resolveIris) {
StringWriter sw = new StringWriter();
Rio.write(asModel, sw, RdfFormatConverter.toRdf4j(rdfFormat));
String asString = sw.toString();
if(resolveIris) {
if(subjectProvider==null) {
log.warn("subjectProvider in null! Unable to resolve iris !!");
} else {
String internaleIriPrefix = subjectProvider.getInternaleIriPrefix();
String externalIriPrefix = subjectProvider.getExternalIriPrefix();
externalIriPrefix = externalIriPrefix.endsWith("/") ? externalIriPrefix : externalIriPrefix + "/";
asString = asString.replaceAll(internaleIriPrefix, externalIriPrefix);
}
}
if(RdfFormat.JSONLD.equals(rdfFormat)) {
asString = new CompacterDefault().compact(asString);
}
return asString;
}
private Model asModel(Graph graph) {
Model model = new ModelBuilder().build();
graph.stream().forEach(t->model.add(rdf4j.asStatement(t)));
return model;
}
}