[VIVO-1270] Changes to adhere to the RDF 1.1 spec

This commit is contained in:
Graham Triggs 2016-09-06 16:11:10 +01:00
parent a3c378bb25
commit 50bef0d85e
10 changed files with 41 additions and 457 deletions

View file

@ -10,10 +10,6 @@ import java.util.Collection;
import org.apache.commons.io.IOUtils;
import com.github.jsonldjava.core.JSONLD;
import com.github.jsonldjava.core.JSONLDProcessingError;
import com.github.jsonldjava.impl.JenaRDFParser;
import com.github.jsonldjava.utils.JSONUtils;
import org.apache.jena.rdf.model.Model;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
@ -56,15 +52,7 @@ abstract class SparqlQueryApiRdfProducer extends SparqlQueryApiExecutor {
if (mediaType.isNativeFormat()) {
IOUtils.copy(rawResult, out);
} else if (mediaType.getJenaResponseFormat().equals("JSON")) {
// JSON-LD is a special case, since jena 2.6.4 doesn't support it.
try {
JenaRDFParser parser = new JenaRDFParser();
Object json = JSONLD.fromRDF(parseToModel(rawResult), parser);
JSONUtils.write(new OutputStreamWriter(out, "UTF-8"), json);
} catch (JSONLDProcessingError e) {
throw new RDFServiceException(
"Could not convert from Jena model to JSON-LD", e);
}
parseToModel(rawResult).write(out, "JSON-LD");
} else {
parseToModel(rawResult).write(out,
mediaType.getJenaResponseFormat());

View file

@ -21,11 +21,6 @@ import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.github.jsonldjava.core.JSONLD;
import com.github.jsonldjava.core.JSONLDProcessingError;
import com.github.jsonldjava.impl.JenaRDFParser;
import com.github.jsonldjava.utils.JSONUtils;
import edu.cornell.mannlib.vitro.webapp.auth.permissions.SimplePermission;
import edu.cornell.mannlib.vitro.webapp.auth.policy.PolicyHelper;
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.AuthorizationRequest;
@ -325,28 +320,17 @@ public class FreemarkerHttpServlet extends VitroHttpServlet {
String mediaType = values.getContentType().getMediaType();
response.setContentType(mediaType);
if ( JSON_MIMETYPE.equals(mediaType) || JSON_LD_MIMETYPE.equals(mediaType)){
//json-ld is not supported by jena v2.6.4
try {
JenaRDFParser parser = new JenaRDFParser();
Object json = JSONLD.fromRDF( values.getModel() , parser);
JSONUtils.write(response.getWriter(), json);
} catch (JSONLDProcessingError e) {
throw new IOException("Could not convert from Jena model to JSON-LD", e);
}
}else{
String format = "";
if ( RDFXML_MIMETYPE.equals(mediaType)) {
format = "RDF/XML";
} else if( N3_MIMETYPE.equals(mediaType)) {
format = "N3";
} else if ( TTL_MIMETYPE.equals(mediaType)) {
format ="TTL";
}
values.getModel().write( response.getOutputStream(), format );
String format = "";
if ( RDFXML_MIMETYPE.equals(mediaType)) {
format = "RDF/XML";
} else if( N3_MIMETYPE.equals(mediaType)) {
format = "N3";
} else if ( TTL_MIMETYPE.equals(mediaType)) {
format = "TTL";
} else if ( JSON_MIMETYPE.equals(mediaType) || JSON_LD_MIMETYPE.equals(mediaType)) {
format = "JSON-LD";
}
values.getModel().write( response.getOutputStream(), format );
}
protected void doException(VitroRequest vreq, HttpServletResponse response,

View file

@ -14,6 +14,7 @@ import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.jena.atlas.io.StringWriterI;
import org.apache.jena.query.QuerySolution;
import org.apache.jena.query.ResultSet;
import org.apache.jena.query.ResultSetFactory;
@ -24,6 +25,8 @@ import org.apache.jena.rdf.model.Resource;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceException;
import org.apache.jena.riot.out.NodeFormatter;
import org.apache.jena.riot.out.NodeFormatterTTL;
/**
* Utilities for executing queries and working with query results.
@ -195,14 +198,10 @@ public class QueryUtils {
}
private static String literalToString(Literal l) {
StringBuilder buffer = new StringBuilder();
buffer.append('"').append(l.getLexicalForm()).append('"');
if (l.getDatatypeURI() != null) {
buffer.append("^^<").append(l.getDatatypeURI()).append(">");
} else if (StringUtils.isNotEmpty(l.getLanguage())) {
buffer.append("@").append(l.getLanguage());
}
return buffer.toString();
StringWriterI sw = new StringWriterI();
NodeFormatter fmt = new NodeFormatterTTL(null, null);
fmt.formatLiteral(sw, l.asNode());
return sw.toString();
}

View file

@ -48,18 +48,17 @@ public class RdfLiteralHash {
if( stmt.getDatapropURI() == null || stmt.getDatapropURI().trim().length() == 0)
throw new Error("Cannot make a hash for a statement with no predicate URI");
String language = "9876NONE";
String langOrDatatype = "9876NONE";
if( stmt.getLanguage() != null && stmt.getLanguage().trim().length() > 0){
language = stmt.getLanguage();
}
langOrDatatype = stmt.getLanguage();
}else{
if( stmt.getDatatypeURI() != null && stmt.getDatatypeURI().trim().length() > 0){
langOrDatatype = stmt.getDatatypeURI();
}
}
String datatype = "9876NONE";
if( stmt.getDatatypeURI() != null && stmt.getDatatypeURI().trim().length() > 0){
datatype = stmt.getDatatypeURI();
}
String hashMe = language + "_" + datatype + "_" + stmt.getIndividualURI() + "_" + stmt.getDatapropURI() + "_" + stmt.getData();
String hashMe = langOrDatatype + "_" + stmt.getIndividualURI() + "_" + stmt.getDatapropURI() + "_" + stmt.getData();
if( log.isDebugEnabled() )
log.debug("got hash " + hashMe.hashCode() + " for String '" + hashMe + "'");
return hashMe.hashCode();

View file

@ -1,182 +0,0 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.rdfservice.adapters;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.net.URL;
import java.util.Iterator;
import java.util.List;
import org.apache.jena.graph.GraphUtil;
import org.apache.jena.graph.Triple;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.rdf.model.Property;
import org.apache.jena.rdf.model.RDFReaderF;
import org.apache.jena.rdf.model.Resource;
import org.apache.jena.rdf.model.Statement;
import org.apache.jena.rdf.model.StmtIterator;
import org.apache.jena.rdf.model.impl.RDFReaderFImpl;
import org.apache.jena.rdf.model.impl.StatementImpl;
import org.apache.jena.shared.WrappedIOException;
import org.apache.jena.util.iterator.Map1;
/**
* A model that still handles bulk updates in the old-fashioned way: with a
* BulkUpdateHandler.
*/
public class BulkUpdatingModel extends AbstractModelDecorator {
private static final RDFReaderF readerFactory = new RDFReaderFImpl();
public BulkUpdatingModel(Model inner) {
super(inner);
}
@SuppressWarnings("deprecation")
@Override
public Model add(StmtIterator iter) {
try {
this.getGraph().getTransactionHandler().begin();
GraphUtil.add(this.getGraph(), asTriples(iter));
this.getGraph().getTransactionHandler().commit();
} finally {
iter.close();
}
return this;
}
@SuppressWarnings("deprecation")
@Override
public Model read(String url) {
Model m = ModelFactory.createDefaultModel();
readerFactory.getReader().read(m, url);
this.getGraph().getTransactionHandler().begin();
GraphUtil.addInto(this.getGraph(), m.getGraph());
this.getGraph().getTransactionHandler().commit();
return this;
}
@SuppressWarnings("deprecation")
@Override
public Model read(Reader reader, String base) {
Model m = ModelFactory.createDefaultModel();
readerFactory.getReader().read(m, reader, base);
this.getGraph().getTransactionHandler().begin();
GraphUtil.addInto(this.getGraph(), m.getGraph());
this.getGraph().getTransactionHandler().commit();
return this;
}
@SuppressWarnings("deprecation")
@Override
public Model read(InputStream reader, String base) {
Model m = ModelFactory.createDefaultModel();
readerFactory.getReader().read(m, reader, base);
this.getGraph().getTransactionHandler().begin();
GraphUtil.addInto(this.getGraph(), m.getGraph());
this.getGraph().getTransactionHandler().commit();
return this;
}
@SuppressWarnings("deprecation")
@Override
public Model read(String url, String lang) {
Model m = ModelFactory.createDefaultModel();
readerFactory.getReader(lang).read(m, url);
this.getGraph().getTransactionHandler().begin();
GraphUtil.addInto(this.getGraph(), m.getGraph());
this.getGraph().getTransactionHandler().commit();
return this;
}
@Override
public Model read(String url, String base, String lang) {
try {
InputStream is = new URL(url).openStream();
try {
read(is, base, lang);
} finally {
if (null != is) {
is.close();
}
}
} catch (IOException e) {
throw new WrappedIOException(e);
}
return this;
}
@SuppressWarnings("deprecation")
@Override
public Model read(Reader reader, String base, String lang) {
Model m = ModelFactory.createDefaultModel();
readerFactory.getReader(lang).read(m, reader, base);
this.getGraph().getTransactionHandler().begin();
GraphUtil.addInto(this.getGraph(), m.getGraph());
this.getGraph().getTransactionHandler().commit();
return this;
}
@SuppressWarnings("deprecation")
@Override
public Model read(InputStream reader, String base, String lang) {
Model m = ModelFactory.createDefaultModel();
readerFactory.getReader(lang).read(m, reader, base);
this.getGraph().getTransactionHandler().begin();
GraphUtil.addInto(this.getGraph(), m.getGraph());
this.getGraph().getTransactionHandler().commit();
return this;
}
@SuppressWarnings("deprecation")
@Override
public Model remove(StmtIterator iter) {
this.getGraph().getTransactionHandler().begin();
GraphUtil.delete(this.getGraph(), asTriples(iter));
this.getGraph().getTransactionHandler().commit();
return this;
}
@SuppressWarnings("deprecation")
@Override
public Model add(Statement[] statements) {
this.getGraph().getTransactionHandler().begin();
GraphUtil.add(this.getGraph(), StatementImpl.asTriples(statements));
this.getGraph().getTransactionHandler().commit();
return this;
}
@Override
public Model add(List<Statement> statements) {
add(statements.toArray(new Statement[statements.size()]));
return this;
}
@SuppressWarnings("deprecation")
@Override
public Model remove(Statement[] statements) {
this.getGraph().getTransactionHandler().begin();
GraphUtil.delete(this.getGraph(), StatementImpl.asTriples(statements));
this.getGraph().getTransactionHandler().commit();
return this;
}
@Override
public Model remove(List<Statement> statements) {
remove(statements.toArray(new Statement[statements.size()]));
return this;
}
private Iterator<Triple> asTriples(StmtIterator it) {
return it.mapWith(mapAsTriple);
}
private Map1<Statement, Triple> mapAsTriple = new Map1<Statement, Triple>() {
@Override
public Triple apply(Statement statement) {
return statement.asTriple();
}
};
}

View file

@ -1,193 +0,0 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.rdfservice.adapters;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;
import java.net.URL;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.jena.graph.Graph;
import org.apache.jena.graph.GraphUtil;
import org.apache.jena.graph.Triple;
import org.apache.jena.graph.impl.GraphWithPerform;
import org.apache.jena.ontology.OntModel;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.rdf.model.Property;
import org.apache.jena.rdf.model.RDFReaderF;
import org.apache.jena.rdf.model.Resource;
import org.apache.jena.rdf.model.Statement;
import org.apache.jena.rdf.model.StmtIterator;
import org.apache.jena.rdf.model.impl.RDFReaderFImpl;
import org.apache.jena.rdf.model.impl.StatementImpl;
import org.apache.jena.shared.WrappedIOException;
import org.apache.jena.util.iterator.Map1;
/**
* A model that still handles bulk updates in the old-fashioned way: with a
* BulkUpdateHandler.
*/
public class BulkUpdatingOntModel extends AbstractOntModelDecorator {
private static final Log log = LogFactory
.getLog(BulkUpdatingOntModel.class);
private static final RDFReaderF readerFactory = new RDFReaderFImpl();
public BulkUpdatingOntModel(OntModel inner) {
super(inner);
}
@SuppressWarnings("deprecation")
@Override
public Model add(StmtIterator iter) {
try {
this.getGraph().getTransactionHandler().begin();
GraphUtil.add(this.getGraph(), asTriples(iter));
this.getGraph().getTransactionHandler().commit();
} finally {
iter.close();
}
return this;
}
@SuppressWarnings("deprecation")
@Override
public Model read(String url) {
Model m = ModelFactory.createDefaultModel();
readerFactory.getReader().read(m, url);
this.getGraph().getTransactionHandler().begin();
GraphUtil.addInto(this.getGraph(), m.getGraph());
this.getGraph().getTransactionHandler().commit();
return this;
}
@SuppressWarnings("deprecation")
@Override
public Model read(Reader reader, String base) {
Model m = ModelFactory.createDefaultModel();
readerFactory.getReader().read(m, reader, base);
this.getGraph().getTransactionHandler().begin();
GraphUtil.addInto(this.getGraph(), m.getGraph());
this.getGraph().getTransactionHandler().commit();
return this;
}
@SuppressWarnings("deprecation")
@Override
public Model read(InputStream reader, String base) {
Model m = ModelFactory.createDefaultModel();
readerFactory.getReader().read(m, reader, base);
this.getGraph().getTransactionHandler().begin();
GraphUtil.addInto(this.getGraph(), m.getGraph());
this.getGraph().getTransactionHandler().commit();
return this;
}
@SuppressWarnings("deprecation")
@Override
public Model read(String url, String lang) {
Model m = ModelFactory.createDefaultModel();
readerFactory.getReader(lang).read(m, url);
this.getGraph().getTransactionHandler().begin();
GraphUtil.addInto(this.getGraph(), m.getGraph());
this.getGraph().getTransactionHandler().commit();
return this;
}
@Override
public Model read(String url, String base, String lang) {
try {
InputStream is = new URL(url).openStream();
try {
read(is, base, lang);
} finally {
if (null != is) {
is.close();
}
}
} catch (IOException e) {
throw new WrappedIOException(e);
}
return this;
}
@SuppressWarnings("deprecation")
@Override
public Model read(Reader reader, String base, String lang) {
Model m = ModelFactory.createDefaultModel();
readerFactory.getReader(lang).read(m, reader, base);
this.getGraph().getTransactionHandler().begin();
GraphUtil.addInto(this.getGraph(), m.getGraph());
this.getGraph().getTransactionHandler().commit();
return this;
}
@SuppressWarnings("deprecation")
@Override
public Model read(InputStream reader, String base, String lang) {
Model m = ModelFactory.createDefaultModel();
readerFactory.getReader(lang).read(m, reader, base);
this.getGraph().getTransactionHandler().begin();
GraphUtil.addInto(this.getGraph(), m.getGraph());
this.getGraph().getTransactionHandler().commit();
return this;
}
@SuppressWarnings("deprecation")
@Override
public Model remove(StmtIterator iter) {
this.getGraph().getTransactionHandler().begin();
GraphUtil.delete(this.getGraph(), asTriples(iter));
this.getGraph().getTransactionHandler().commit();
return this;
}
@SuppressWarnings("deprecation")
@Override
public Model add(Statement[] statements) {
this.getGraph().getTransactionHandler().begin();
GraphUtil.add(this.getGraph(), StatementImpl.asTriples(statements));
this.getGraph().getTransactionHandler().commit();
return this;
}
@Override
public Model add(List<Statement> statements) {
add(statements.toArray(new Statement[statements.size()]));
return this;
}
@SuppressWarnings("deprecation")
@Override
public Model remove(Statement[] statements) {
this.getGraph().getTransactionHandler().begin();
GraphUtil.delete(this.getGraph(), StatementImpl.asTriples(statements));
this.getGraph().getTransactionHandler().commit();
return this;
}
@Override
public Model remove(List<Statement> statements) {
remove(statements.toArray(new Statement[statements.size()]));
return this;
}
private Iterator<Triple> asTriples(StmtIterator it) {
return it.mapWith(mapAsTriple);
}
private Map1<Statement, Triple> mapAsTriple = new Map1<Statement, Triple>() {
@Override
public Triple apply(Statement statement) {
return statement.asTriple();
}
};
}

View file

@ -35,7 +35,7 @@ public class VitroModelFactory {
Graph graph = model.getGraph();
Model bareModel = new ModelCom(graph);
OntModel ontModel = new OntModelImpl(OWL_MEM, bareModel);
return new BulkUpdatingOntModel(ontModel);
return ontModel;
}
public static Model createUnion(Model baseModel, Model plusModel) {
@ -45,7 +45,7 @@ public class VitroModelFactory {
plusGraph);
Model unionModel = ModelFactory.createModelForGraph(unionGraph);
return new BulkUpdatingModel(unionModel);
return unionModel;
}
public static OntModel createUnion(OntModel baseModel, OntModel plusModel) {
@ -57,11 +57,11 @@ public class VitroModelFactory {
Model unionModel = ModelFactory.createModelForGraph(unionGraph);
OntModel unionOntModel = ModelFactory.createOntologyModel(OWL_MEM,
unionModel);
return new BulkUpdatingOntModel(unionOntModel);
return unionOntModel;
}
public static Model createModelForGraph(Graph g) {
return new BulkUpdatingModel(ModelFactory.createModelForGraph(g));
return ModelFactory.createModelForGraph(g);
}
private static class BulkUpdatingUnion extends Union {

View file

@ -9,6 +9,7 @@ import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.apache.jena.datatypes.RDFDatatype;
import org.apache.jena.datatypes.xsd.impl.RDFLangString;
import org.apache.jena.rdf.model.Literal;
import org.apache.jena.rdf.model.Property;
import org.apache.jena.rdf.model.RDFNode;
@ -68,7 +69,7 @@ public enum PropertyType {
if (object.isLiteral()) {
Literal literal = object.asLiteral();
RDFDatatype datatype = literal.getDatatype();
if (datatype == null || datatype.equals(XSDstring)) {
if (datatype == null || datatype.equals(XSDstring) || datatype.equals(RDFLangString.rdfLangString)) {
return STRING;
}
if (datatype.equals(XSDfloat)) {

View file

@ -244,8 +244,8 @@ public class VitroModelFactoryTest extends AbstractTestClass {
public void addMultipleToVitroOntModel() {
omg = new VitroOntModelGroup();
omg.om.add(MULTIPLE_STATEMENTS);
new MethodCalls().add(omg.g, "performAdd", "performAdd")
.add(omg.l, "addedStatements")
new MethodCalls().add(omg.g, "add", "add")
.add(omg.l, "addedStatement", "addedStatement")
.add(omg.ol, "addedStatements").test();
}
@ -346,8 +346,8 @@ public class VitroModelFactoryTest extends AbstractTestClass {
public void addMultipleToVitroUnion() {
umg = new VitroUnionModelGroup();
umg.m.add(MULTIPLE_STATEMENTS);
new MethodCalls().add(umg.base.g, "performAdd", "performAdd")
.add(umg.base.l, "addedStatements")
new MethodCalls().add(umg.base.g, "add", "add")
.add(umg.base.l, "addedStatement", "addedStatement")
.add(umg.plus.g).add(umg.plus.l)
.add(umg.l, "addedStatements").test();
}
@ -452,8 +452,8 @@ public class VitroModelFactoryTest extends AbstractTestClass {
public void addMultipleToVitroOntUnion() {
uomg = new VitroUnionOntModelGroup();
uomg.om.add(MULTIPLE_STATEMENTS);
new MethodCalls().add(uomg.base.g, "performAdd", "performAdd")
.add(uomg.base.l, "addedStatements")
new MethodCalls().add(uomg.base.g, "add", "add")
.add(uomg.base.l, "addedStatement", "addedStatement")
.add(uomg.plus.g).add(uomg.plus.l)
.add(uomg.l, "addedStatements").test();
}
@ -567,9 +567,9 @@ public class VitroModelFactoryTest extends AbstractTestClass {
omumg = new VitroOntModelUnionModelGroup();
omumg.om.add(MULTIPLE_STATEMENTS);
new MethodCalls().add(omumg.om, "add").add(omumg.ol, "addedStatements")
.add(omumg.union.base.g, "performAdd", "performAdd")
.add(omumg.union.base.g, "add", "add")
.add(omumg.union.base.m)
.add(omumg.union.base.l, "addedStatements")
.add(omumg.union.base.l, "addedStatement", "addedStatement")
.add(omumg.union.plus.g)
.add(omumg.union.plus.m).add(omumg.union.plus.l).test();
}

12
dependencies/pom.xml vendored
View file

@ -65,18 +65,6 @@
<dependency>
<!-- 0.3 requires code changes -->
<groupId>com.github.jsonld-java</groupId>
<artifactId>jsonld-java</artifactId>
<version>0.2</version>
</dependency>
<dependency>
<!-- 0.3 requires code changes -->
<groupId>com.github.jsonld-java</groupId>
<artifactId>jsonld-java-jena</artifactId>
<version>0.2</version>
</dependency>
<dependency>
<groupId>com.ibm.icu</groupId>
<artifactId>icu4j</artifactId>