blob: 2513e8230a548f458855f0b714cf00e7b936e734 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.rdf.jena.experimental;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.util.function.Consumer;
import org.apache.commons.rdf.api.IRI;
import org.apache.commons.rdf.api.QuadLike;
import org.apache.commons.rdf.api.RDF;
import org.apache.commons.rdf.api.RDFTerm;
import org.apache.commons.rdf.api.TripleLike;
import org.apache.commons.rdf.jena.JenaGraph;
import org.apache.commons.rdf.jena.JenaRDF;
import org.apache.commons.rdf.simple.experimental.AbstractRDFParser;
import org.apache.jena.graph.Graph;
import org.apache.jena.riot.Lang;
import org.apache.jena.riot.RDFParser;
import org.apache.jena.riot.system.StreamRDF;
import org.apache.jena.riot.system.StreamRDFLib;
public class JenaRDFParser extends AbstractRDFParser<JenaRDFParser> {
private Consumer<TripleLike> generalizedConsumerTriple;
private Consumer<QuadLike<RDFTerm>> generalizedConsumerQuad;
@Override
protected RDF createRDFTermFactory() {
return new JenaRDF();
}
public JenaRDFParser targetGeneralizedTriple(final Consumer<TripleLike> consumer) {
final JenaRDFParser c = this.clone();
c.resetTarget();
c.generalizedConsumerTriple = consumer;
return c;
}
public JenaRDFParser targetGeneralizedQuad(final Consumer<QuadLike<RDFTerm>> consumer) {
final JenaRDFParser c = this.clone();
c.resetTarget();
c.generalizedConsumerQuad = consumer;
return c;
}
@Override
protected void resetTarget() {
super.resetTarget();
this.generalizedConsumerTriple = null;
this.generalizedConsumerQuad = null;
}
@Override
protected void parseSynchronusly() throws IOException {
StreamRDF dest;
final JenaRDF jenaRDF = getJenaFactory();
if (getTargetGraph().isPresent() && getTargetGraph().get() instanceof JenaGraph) {
final Graph jenaGraph = ((JenaGraph) getTargetGraph().get()).asJenaGraph();
dest = StreamRDFLib.graph(jenaGraph);
} else {
if (generalizedConsumerQuad != null) {
dest = jenaRDF.streamJenaToGeneralizedQuad(generalizedConsumerQuad);
} else if (generalizedConsumerTriple != null) {
dest = jenaRDF.streamJenaToGeneralizedTriple(generalizedConsumerTriple);
} else {
dest = JenaRDF.streamJenaToQuad(getRdfTermFactory().get(), getTarget());
}
}
final Lang lang = getContentTypeSyntax().flatMap(jenaRDF::asJenaLang).orElse(null);
final String baseStr = getBase().map(IRI::getIRIString).orElse(null);
if (getSourceIri().isPresent()) {
RDFParser.source(getSourceIri().get().toString()).base(baseStr).lang(lang).parse(dest);
} else if (getSourceFile().isPresent()) {
try (InputStream s = Files.newInputStream(getSourceFile().get())) {
RDFParser.source(s).base(baseStr).lang(lang).parse(dest);
}
} else {
RDFParser.source(getSourceInputStream().get()).base(baseStr).lang(lang).parse(dest);
}
}
private JenaRDF getJenaFactory() {
return (JenaRDF) getRdfTermFactory().filter(JenaRDF.class::isInstance).orElseGet(this::createRDFTermFactory);
}
}