/******************************************************************************* * 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 com.emf4sw.rdf.BlankNode; import com.emf4sw.rdf.Node; import com.emf4sw.rdf.RDFFactory; import com.emf4sw.rdf.RDFGraph; import com.hp.hpl.jena.rdf.model.AnonId; import com.hp.hpl.jena.rdf.model.Literal; import com.hp.hpl.jena.rdf.model.Property; import com.hp.hpl.jena.rdf.model.RDFVisitor; import com.hp.hpl.jena.rdf.model.Resource; import com.hp.hpl.jena.rdf.model.Statement; /** * * @author <a href="mailto:g.hillairet at gmail.com">Guillaume Hillairet</a> * @since 0.5.5 */ public class TripleInjector { private static final RDFFactory factory = RDFFactory.eINSTANCE; private TripleInjector() {} public static com.emf4sw.rdf.Triple inject(Statement stmt, RDFGraph graph) { final NodeVisitorInjector visitor = new NodeVisitorInjector(graph); final com.emf4sw.rdf.Node subject = (Node) stmt.getSubject().visitWith(visitor); final com.emf4sw.rdf.Property predicate = inject(stmt.getPredicate(), graph); final com.emf4sw.rdf.Node object = (com.emf4sw.rdf.Node) stmt.getObject().visitWith(visitor); return graph.addTriple(subject, predicate, object); } protected static com.emf4sw.rdf.Property inject(Property predicate, RDFGraph graph) { if (predicate.getURI() == null) { return null; } com.emf4sw.rdf.Property ret = graph.getProperty( predicate.getURI() ); if (ret == null) { ret = factory.createProperty(); ret.setURI( predicate.getURI() ); graph.getProperties().add(ret); } return ret; } /** * Implements {@link RDFVisitor} * * @author <a href="mailto:g.hillairet at gmail.com">Guillaume Hillairet</a> * */ public static class NodeVisitorInjector implements RDFVisitor { private final RDFGraph graph; NodeVisitorInjector(RDFGraph graph) { this.graph = graph; } @Override public Object visitBlank(Resource node, AnonId arg1) { final BlankNode ret = factory.createBlankNode(); ret.setNodeID( arg1.toString() ); graph.getBlankNodes().add(ret); return ret; } @Override public Object visitLiteral(Literal literal) { final com.emf4sw.rdf.Literal ret = factory.createLiteral(); ret.setLexicalForm(literal.getLexicalForm()); ret.setLang(literal.getLanguage()); if (literal.getDatatypeURI() != null) { ret.setDatatype(graph.getDatatype(literal.getDatatypeURI())); } graph.getLiterals().add(ret); return ret; } @Override public Object visitURI(Resource resource, String arg1) { if (resource.getURI() == null) { return null; } com.emf4sw.rdf.Resource ret = graph.getResource(resource.getURI()); if (ret == null) { ret = factory.createResource(); ret.setURI( resource.getURI() ); graph.getResources().add( ret ); } return ret; } } }