/*******************************************************************************
* Copyright (c) 2011 Guillaume Hillairet.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Guillaume Hillairet - initial API and implementation
*******************************************************************************/
package com.emf4sw.rdf.jena;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.emf.ecore.EObject;
import com.emf4sw.rdf.BlankNode;
import com.emf4sw.rdf.Datatype;
import com.emf4sw.rdf.Literal;
import com.emf4sw.rdf.NamedGraph;
import com.emf4sw.rdf.Property;
import com.emf4sw.rdf.RDFBag;
import com.emf4sw.rdf.RDFSeq;
import com.emf4sw.rdf.Triple;
import com.emf4sw.rdf.TripleNode;
import com.emf4sw.rdf.util.RDFSwitch;
import com.emf4sw.rdf.vocabulary.RDFS;
import com.hp.hpl.jena.datatypes.RDFDatatype;
import com.hp.hpl.jena.datatypes.TypeMapper;
import com.hp.hpl.jena.graph.NodeVisitor;
import com.hp.hpl.jena.rdf.model.AnonId;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.RDFList;
import com.hp.hpl.jena.rdf.model.RDFNode;
import com.hp.hpl.jena.rdf.model.Statement;
public class TripleExtractor {
public static Iterable<Statement> extract(Iterable<Triple> triples, Model model) {
final Iterable<Statement> stmts = new ArrayList<Statement>();
for (Triple tr: triples) {
Statement stmt = extract(tr, model);
if (stmt != null) {
((ArrayList<Statement>) stmts).add(stmt);
model.add(stmt);
}
}
return stmts;
}
public static Statement extract(Triple triple, Model model) {
if ( triple.getSubject() == null || triple.getPredicate() == null || triple.getObject() == null ) {
return null;
}
final NodeSwitchExtractor visitor = new NodeSwitchExtractor(model);
final com.hp.hpl.jena.rdf.model.RDFNode subject = visitor.doSwitch(triple.getSubject());
final com.hp.hpl.jena.rdf.model.Property predicate = (com.hp.hpl.jena.rdf.model.Property) visitor.doSwitch(triple.getPredicate());
final com.hp.hpl.jena.rdf.model.RDFNode object = visitor.doSwitch(triple.getObject());
if (subject == null || predicate == null || object == null) {
return null;
}
return model.createStatement((com.hp.hpl.jena.rdf.model.Resource) subject, predicate, object);
}
private static final Map<String, RDFNode> blanks = new HashMap<String, RDFNode>();
/**
* Implements the {@link NodeVisitor} interface.
*
* @author <a href="mailto:g.hillairet at gmail.com">Guillaume Hillairet</a>
*
*/
public static class NodeSwitchExtractor extends RDFSwitch<RDFNode> {
private final Model model;
public NodeSwitchExtractor(Model model) {
this.model = model;
}
@Override
public RDFNode caseBlankNode(BlankNode object) {
if (!blanks.containsKey(object.getNodeID())) {
blanks.put(object.getNodeID(), model.createResource(
object.getNodeID() != null ?
AnonId.create(object.getNodeID()) :
AnonId.create()));
}
return blanks.get(object.getNodeID());
}
@Override
public RDFNode caseResource(com.emf4sw.rdf.Resource object) {
RDFNode resultinNode = null;
if (object.getURI() != null) {
final String uri = object.getURI().replaceAll("[\\s]+", "_");
resultinNode = model.getResource( uri );
if (resultinNode == null)
{
resultinNode = model.createResource( uri );
}
} else {
resultinNode = model.createResource(AnonId.create());
}
if (object.getLabel() != null)
{
model.add(resultinNode.asResource(), model.getProperty(RDFS.label), model.createLiteral(object.getLabel()));
}
if (object.getComment() != null)
{
model.add(resultinNode.asResource(), model.getProperty(RDFS.comment), model.createLiteral(object.getComment()));
}
return resultinNode;
}
@Override
public RDFNode caseProperty(Property object) {
RDFNode resultinNode = null;
if (object.getURI() != null) {
final String uri = object.getURI().replaceAll("[\\s]+", "_");
resultinNode = model.getProperty( uri );
if (resultinNode == null)
{
resultinNode = model.createProperty( uri );
}
}
if (object.getLabel() != null)
{
model.add(resultinNode.asResource(), model.getProperty(RDFS.label), model.createLiteral(object.getLabel()));
}
if (object.getComment() != null)
{
model.add(resultinNode.asResource(), model.getProperty(RDFS.comment), model.createLiteral(object.getComment()));
}
return resultinNode;
}
@Override
public RDFNode caseNamedGraph(NamedGraph object) {
RDFNode resultinNode = null;
if (object.getURI() != null) {
final String uri = object.getURI().replaceAll("[\\s]+", "_");
resultinNode = model.getResource( uri );
if (resultinNode == null)
{
resultinNode = model.createResource( uri );
}
}
if (object.getLabel() != null)
{
model.add(resultinNode.asResource(), model.getProperty(RDFS.label), model.createLiteral(object.getLabel()));
}
if (object.getComment() != null)
{
model.add(resultinNode.asResource(), model.getProperty(RDFS.comment), model.createLiteral(object.getComment()));
}
return resultinNode;
}
@Override
public RDFNode caseTripleNode(TripleNode object) {
RDFNode resultinNode = null;
if (object.getURI() != null) {
final String uri = object.getURI().replaceAll("[\\s]+", "_");
resultinNode = model.getResource( uri );
if (resultinNode == null)
{
resultinNode = model.createResource( uri );
}
}
if (object.getLabel() != null)
{
model.add(resultinNode.asResource(), model.getProperty(RDFS.label), model.createLiteral(object.getLabel()));
}
if (object.getComment() != null)
{
model.add(resultinNode.asResource(), model.getProperty(RDFS.comment), model.createLiteral(object.getComment()));
}
return resultinNode;
}
@Override
public RDFNode caseDatatype(Datatype object) {
RDFNode resultinNode = null;
if (object.getURI() != null) {
final String uri = object.getURI().replaceAll("[\\s]+", "_");
resultinNode = model.getResource( uri );
if (resultinNode == null)
{
resultinNode = model.createResource( uri );
}
}
if (object.getLabel() != null)
{
model.add(resultinNode.asResource(), model.getProperty(RDFS.label), model.createLiteral(object.getLabel()));
}
if (object.getComment() != null)
{
model.add(resultinNode.asResource(), model.getProperty(RDFS.comment), model.createLiteral(object.getComment()));
}
return resultinNode;
}
@Override
public RDFNode caseLiteral(Literal object) {
RDFNode resultinNode = null;
if (object.getLang() != null && !object.getLang().trim().isEmpty()) {
resultinNode = model.createLiteral( object.getLexicalForm(), object.getLang() );
} else {
final RDFDatatype dType = object.getDatatype() == null ? null :
TypeMapper.getInstance().getSafeTypeByName( object.getDatatype().getURI() );
resultinNode = dType != null ?
model.createTypedLiteral( object.getLexicalForm(), dType ) :
model.createTypedLiteral( object.getLexicalForm(),
TypeMapper.getInstance().getSafeTypeByName( RDFS.Literal ) );
}
return resultinNode;
}
@Override
public RDFNode caseRDFList(com.emf4sw.rdf.RDFList object) {
RDFList list = model.createList();
for (EObject obj: object.getElements()) {
RDFNode node = doSwitch(obj);
list = list.cons(node);
}
return list;
}
@Override
public RDFNode caseRDFSeq(RDFSeq object) {
com.hp.hpl.jena.rdf.model.Seq seq = model.createSeq();
for (EObject obj: object.getElements()) {
seq.add(doSwitch(obj));
}
return seq;
}
@Override
public RDFNode caseRDFBag(RDFBag object) {
com.hp.hpl.jena.rdf.model.Bag bag = model.createBag();
for (EObject obj: object.getElements()) {
bag.add(doSwitch(obj));
}
return bag;
}
}
}