package com.mysema.rdfbean.jena;
import java.util.HashMap;
import java.util.Map;
import com.google.common.base.Strings;
import com.hp.hpl.jena.datatypes.BaseDatatype;
import com.hp.hpl.jena.datatypes.RDFDatatype;
import com.hp.hpl.jena.graph.Node;
import com.hp.hpl.jena.rdf.model.AnonId;
import com.hp.hpl.jena.sparql.core.Quad;
import com.mysema.commons.l10n.support.LocaleUtil;
import com.mysema.rdfbean.model.AbstractDialect;
import com.mysema.rdfbean.model.BID;
import com.mysema.rdfbean.model.ID;
import com.mysema.rdfbean.model.LIT;
import com.mysema.rdfbean.model.NODE;
import com.mysema.rdfbean.model.NodeType;
import com.mysema.rdfbean.model.Nodes;
import com.mysema.rdfbean.model.RDF;
import com.mysema.rdfbean.model.UID;
import com.mysema.rdfbean.model.XSD;
/**
* @author tiwe
*
*/
public class JenaDialect extends AbstractDialect<Node, Node, Node, Node, Node, Quad> {
private static final Map<UID, RDFDatatype> datatypes = new HashMap<UID, RDFDatatype>();
static {
for (UID uid : Nodes.get(XSD.NS)) {
datatypes.put(uid, new BaseDatatype(uid.getId()));
}
}
@Override
public Node createBNode() {
return Node.createAnon();
}
@Override
public Quad createStatement(Node subject, Node predicate, Node object) {
return new Quad(Quad.defaultGraphIRI, subject, predicate, object);
}
@Override
public Quad createStatement(Node subject, Node predicate, Node object, Node context) {
return new Quad(context, subject, predicate, object);
}
@Override
public BID getBID(Node bnode) {
return new BID(bnode.getBlankNodeLabel());
}
@Override
public Node getBNode(BID bid) {
return Node.createAnon(new AnonId(bid.getId()));
}
@Override
public ID getID(Node resource) {
if (resource.isURI()) {
return new UID(resource.getURI());
} else {
return new BID(resource.getBlankNodeLabel());
}
}
@Override
public LIT getLIT(Node literal) {
if (!Strings.isNullOrEmpty(literal.getLiteralLanguage())) {
return new LIT(literal.getLiteralLexicalForm(), literal.getLiteralLanguage());
} else {
String datatype = literal.getLiteralDatatypeURI();
if (datatype == null || datatype.equals(RDF.text.getId())) {
return new LIT(literal.getLiteralLexicalForm(), RDF.text);
} else {
return new LIT(literal.getLiteralLexicalForm(), getDatatypeUID(datatype));
}
}
}
@Override
public Node getLiteral(LIT lit) {
if (lit.getLang() != null) {
return Node.createLiteral(lit.getValue(), LocaleUtil.toLang(lit.getLang()), false);
} else if (!lit.getDatatype().equals(RDF.text)) {
if (lit.getDatatype().getNamespace().equals(XSD.NS)) {
return Node.createLiteral(lit.getValue(), null, datatypes.get(lit.getDatatype()));
} else {
return Node.createLiteral(lit.getValue(), null, new BaseDatatype(lit.getDatatype().getId()));
}
} else {
return Node.createLiteral(lit.getValue(), null, null);
}
}
@Override
public NODE getNODE(Node node) {
if (node.isURI()) {
return getUID(node);
} else if (node.isBlank()) {
return getBID(node);
} else {
return getLIT(node);
}
}
@Override
public NodeType getNodeType(Node node) {
if (node.isURI()) {
return NodeType.URI;
} else if (node.isBlank()) {
return NodeType.BLANK;
} else if (node.isLiteral()) {
return NodeType.LITERAL;
} else {
throw new IllegalArgumentException(node.toString());
}
}
@Override
public Node getObject(Quad statement) {
return statement.getObject();
}
@Override
public Node getPredicate(Quad statement) {
return statement.getPredicate();
}
@Override
public Node getSubject(Quad statement) {
return statement.getSubject();
}
@Override
public UID getUID(Node resource) {
return new UID(resource.getURI());
}
@Override
public Node getURI(UID uid) {
return Node.createURI(uid.getValue());
}
}