Merge pull request #222 from brianjlowe/issue/VIVO-1615

Fix errors preventing TPF server from working with TDB. Resolve https…
This commit is contained in:
Ben 2021-04-27 10:43:48 -06:00 committed by GitHub
commit cd437a503e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 72 additions and 54 deletions

View file

@ -13,6 +13,8 @@ import java.nio.file.Paths;
import java.util.List;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.RDFNode;
import edu.cornell.mannlib.vitro.webapp.rdfservice.ResultSetConsumer;
import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
@ -232,6 +234,28 @@ public class RDFServiceTDB extends RDFServiceJena {
return isEquivalentGraph(graphURI, inStream, ModelSerializationFormat.NTRIPLE);
}
@Override
public long countTriples(RDFNode subject, RDFNode predicate, RDFNode object)
throws RDFServiceException {
dataset.begin(ReadWrite.READ);
try {
return super.countTriples(subject, predicate, object);
} finally {
dataset.end();
}
}
@Override
public Model getTriples(RDFNode subject, RDFNode predicate, RDFNode object,
long limit, long offset) throws RDFServiceException {
dataset.begin(ReadWrite.READ);
try {
return super.getTriples(subject, predicate, object, limit, offset);
} finally {
dataset.end();
}
}
/**
* Convert all of the references to integer compatible type to "integer" in the serialized graph.
*

View file

@ -1,15 +1,24 @@
package org.vivoweb.linkeddatafragments.servlet;
import com.fasterxml.jackson.databind.JsonNode;
import edu.cornell.mannlib.vitro.webapp.beans.Ontology;
import edu.cornell.mannlib.vitro.webapp.controller.VitroHttpServlet;
import edu.cornell.mannlib.vitro.webapp.dao.OntologyDao;
import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
import org.apache.jena.riot.Lang;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.jena.riot.Lang;
import org.linkeddatafragments.config.ConfigReader;
import org.linkeddatafragments.datasource.DataSourceFactory;
import org.linkeddatafragments.datasource.DataSourceTypesRegistry;
@ -22,26 +31,19 @@ import org.linkeddatafragments.fragments.ILinkedDataFragment;
import org.linkeddatafragments.fragments.ILinkedDataFragmentRequest;
import org.linkeddatafragments.util.MIMEParse;
import org.linkeddatafragments.views.ILinkedDataFragmentWriter;
import org.vivoweb.linkeddatafragments.views.HtmlTriplePatternFragmentWriterImpl;
import org.vivoweb.linkeddatafragments.views.LinkedDataFragmentWriterFactory;
import org.vivoweb.linkeddatafragments.datasource.rdfservice.RDFServiceBasedRequestProcessorForTPFs;
import org.vivoweb.linkeddatafragments.datasource.rdfservice.RDFServiceDataSourceType;
import org.vivoweb.linkeddatafragments.views.HtmlTriplePatternFragmentWriterImpl;
import org.vivoweb.linkeddatafragments.views.LinkedDataFragmentWriterFactory;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;
import com.fasterxml.jackson.databind.JsonNode;
import edu.cornell.mannlib.vitro.webapp.beans.Ontology;
import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties;
import edu.cornell.mannlib.vitro.webapp.controller.VitroHttpServlet;
import edu.cornell.mannlib.vitro.webapp.dao.OntologyDao;
import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
/**
* Servlet that responds with a Linked Data Fragment.
@ -52,29 +54,13 @@ public class VitroLinkedDataFragmentServlet extends VitroHttpServlet {
private final static long serialVersionUID = 1L;
private static final String PROPERTY_TPF_ACTIVE_FLAG = "tpf.activeFlag";
private static final Log log = LogFactory.getLog(VitroLinkedDataFragmentServlet.class);
private ConfigReader config;
private final HashMap<String, IDataSource> dataSources = new HashMap<>();
private final Collection<String> mimeTypes = new ArrayList<>();
private ConfigurationProperties configProps;
private String tpfActiveFlag;
private File getConfigFile(ServletConfig config) throws IOException {
String path = config.getServletContext().getRealPath("/");
if (path == null) {
// this can happen when running standalone
path = System.getProperty("user.dir");
}
File cfg = new File(path, "config-example.json");
if (!cfg.exists()) {
throw new IOException("Configuration file " + cfg + " not found.");
}
if (!cfg.isFile()) {
throw new IOException("Configuration file " + cfg + " is not a file.");
}
return cfg;
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
try {
@ -82,11 +68,11 @@ public class VitroLinkedDataFragmentServlet extends VitroHttpServlet {
configProps = ConfigurationProperties.getBean(ctx);
if (!configurationPresent()) {
throw new ServletException("TPF is currently disabled. To enable, add 'tpfActive.flag=true' to the runtime.properties.");
} else {
if (!tpfActiveFlag.equalsIgnoreCase("true")) {
throw new ServletException("TPF is currently disabled. To enable, set 'tpfActive.flag=true' in runtime.properties.");
}
throw new ServletException("TPF is currently disabled. To enable, add '"
+ PROPERTY_TPF_ACTIVE_FLAG + " = true' to runtime.properties.");
} else if (!tpfActiveFlag.equalsIgnoreCase("true")) {
throw new ServletException("TPF is currently disabled. To enable, set '"
+ PROPERTY_TPF_ACTIVE_FLAG + " = true' in runtime.properties.");
}
RDFService rdfService = ModelAccess.on(ctx).getRDFService();
@ -215,18 +201,18 @@ public class VitroLinkedDataFragmentServlet extends VitroHttpServlet {
writer.writeFragment(response.getOutputStream(), dataSource, fragment, ldfRequest);
} catch (DataSourceNotFoundException ex) {
log.error(ex, ex);
try {
response.setStatus(404);
writer.writeNotFound(response.getOutputStream(), request);
} catch (Exception ex1) {
log.error(ex1, ex1);
throw new ServletException(ex1);
}
} catch (Exception e) {
response.setStatus(500);
writer.writeError(response.getOutputStream(), e);
}
} catch (Exception e) {
log.error(e, e);
throw new ServletException(e);
}
finally {

View file

@ -154,7 +154,15 @@ proxy.eligibleTypeList = http://www.w3.org/2002/07/owl#Thing
#
# languages.selectableLocales = en, es, fr
# Triple pattern fragments is a very fast, very simple means for querying a triple store.
# The triple pattern fragments API in VIVO puts little load on the server, providing a simple means for getting data from the triple store. The API has a web interface for manual use, can be used from the command line via curl, and can be used by programs.
# Triple Pattern Fragments is a very fast, very simple means for querying a
# triple store. The Triple Pattern Fragments API in VIVO puts little load on
# the server, providing a simple means for getting data from the triple store.
# The API has a web interface for manual use, can be used from the command line
# via curl, and can be used by programs.
#
# Vitro's Triple Pattern Fragments API does not require authentication and
# makes the full RDF graph available regardless of display or publish levels
# set on particular properties. Enable Triple Pattern Fragments only if your
# Vitro does not contain restricted data that should not be shared with others.
#
# tpf.activeFlag = true