NIHVIVO-1363 Create a separate controller to handle AJAX sparql queries. The calling sequence changes slightly.
This commit is contained in:
parent
aeac1ba058
commit
80d5602dea
3 changed files with 173 additions and 0 deletions
|
@ -1255,6 +1255,15 @@
|
||||||
<url-pattern>/edit/primitiveDelete</url-pattern>
|
<url-pattern>/edit/primitiveDelete</url-pattern>
|
||||||
</servlet-mapping>
|
</servlet-mapping>
|
||||||
|
|
||||||
|
<servlet>
|
||||||
|
<servlet-name>ajaxSparqlQuery</servlet-name>
|
||||||
|
<servlet-class>edu.cornell.mannlib.vitro.webapp.controller.ajax.SparqlQueryAjaxController</servlet-class>
|
||||||
|
</servlet>
|
||||||
|
<servlet-mapping>
|
||||||
|
<servlet-name>ajaxSparqlQuery</servlet-name>
|
||||||
|
<url-pattern>/ajax/sparqlQuery</url-pattern>
|
||||||
|
</servlet-mapping>
|
||||||
|
|
||||||
<!-- ============================== servlet-mappings ======================== -->
|
<!-- ============================== servlet-mappings ======================== -->
|
||||||
<servlet-mapping>
|
<servlet-mapping>
|
||||||
<servlet-name>fetch</servlet-name>
|
<servlet-name>fetch</servlet-name>
|
||||||
|
|
|
@ -0,0 +1,110 @@
|
||||||
|
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
|
||||||
|
|
||||||
|
package edu.cornell.mannlib.vitro.webapp.controller.ajax;
|
||||||
|
|
||||||
|
import static javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
|
||||||
|
import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
|
||||||
|
import com.hp.hpl.jena.query.DataSource;
|
||||||
|
import com.hp.hpl.jena.query.Dataset;
|
||||||
|
import com.hp.hpl.jena.query.DatasetFactory;
|
||||||
|
import com.hp.hpl.jena.query.Query;
|
||||||
|
import com.hp.hpl.jena.query.QueryExecution;
|
||||||
|
import com.hp.hpl.jena.query.QueryExecutionFactory;
|
||||||
|
import com.hp.hpl.jena.query.QueryFactory;
|
||||||
|
import com.hp.hpl.jena.query.ResultSet;
|
||||||
|
import com.hp.hpl.jena.query.ResultSetFormatter;
|
||||||
|
import com.hp.hpl.jena.query.Syntax;
|
||||||
|
import com.hp.hpl.jena.rdf.model.Model;
|
||||||
|
|
||||||
|
import edu.cornell.mannlib.vedit.beans.LoginStatusBean;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle an AJAX request for a SPARQL query. On entry, the "query" parameter
|
||||||
|
* contains the query string.
|
||||||
|
*
|
||||||
|
* The result is delivered in JSON format.
|
||||||
|
*/
|
||||||
|
public class SparqlQueryAjaxController extends VitroAjaxController {
|
||||||
|
private static final Log log = LogFactory
|
||||||
|
.getLog(SparqlQueryAjaxController.class);
|
||||||
|
|
||||||
|
private static final String PARAMETER_QUERY = "query";
|
||||||
|
private static final String RESPONSE_MIME_TYPE = "application/javascript";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If you are logged in, you can use this servlet.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected boolean testIsAuthorized(HttpServletRequest request) {
|
||||||
|
return LoginStatusBean.getBean(request).isLoggedIn();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doRequest(VitroRequest vreq, HttpServletResponse response)
|
||||||
|
throws ServletException, IOException {
|
||||||
|
|
||||||
|
Model model = vreq.getJenaOntModel();
|
||||||
|
if (model == null) {
|
||||||
|
log.error("JenaOntModel not found.");
|
||||||
|
response.sendError(SC_INTERNAL_SERVER_ERROR,
|
||||||
|
"JenaOntModel not found");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String queryParam = vreq.getParameter(PARAMETER_QUERY);
|
||||||
|
log.debug("queryParam was : " + queryParam);
|
||||||
|
if ((queryParam == null) || queryParam.isEmpty()) {
|
||||||
|
response.sendError(SC_NOT_FOUND, "'" + PARAMETER_QUERY
|
||||||
|
+ "' parameter is required");
|
||||||
|
}
|
||||||
|
|
||||||
|
Query query = QueryFactory.create(queryParam, Syntax.syntaxARQ);
|
||||||
|
if (!query.isSelectType()) {
|
||||||
|
log.debug("Not a 'select' query.");
|
||||||
|
response.sendError(SC_NOT_FOUND,
|
||||||
|
"Only 'select' queries are allowed.");
|
||||||
|
}
|
||||||
|
|
||||||
|
Dataset dataset = chooseDatasetToQueryAgainst(vreq);
|
||||||
|
|
||||||
|
executeQuery(response, query, dataset);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Dataset chooseDatasetToQueryAgainst(VitroRequest vreq) {
|
||||||
|
Dataset dataset = vreq.getDataset();
|
||||||
|
if (dataset != null) {
|
||||||
|
return dataset;
|
||||||
|
}
|
||||||
|
|
||||||
|
DataSource dataSource = DatasetFactory.create();
|
||||||
|
dataSource.setDefaultModel(vreq.getJenaOntModel());
|
||||||
|
return dataSource;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void executeQuery(HttpServletResponse response, Query query,
|
||||||
|
Dataset dataset) throws IOException {
|
||||||
|
QueryExecution qe = QueryExecutionFactory.create(query, dataset);
|
||||||
|
try {
|
||||||
|
ResultSet results = qe.execSelect();
|
||||||
|
response.setContentType(RESPONSE_MIME_TYPE);
|
||||||
|
OutputStream out = response.getOutputStream();
|
||||||
|
ResultSetFormatter.outputAsJSON(out, results);
|
||||||
|
} finally {
|
||||||
|
qe.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
|
||||||
|
|
||||||
|
package edu.cornell.mannlib.vitro.webapp.controller.ajax;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServlet;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A base class for servlets that handle AJAX requests.
|
||||||
|
*/
|
||||||
|
public abstract class VitroAjaxController extends HttpServlet {
|
||||||
|
/**
|
||||||
|
* Sub-classes must implement this method to verify that the user is
|
||||||
|
* authorized to execute this request.
|
||||||
|
*/
|
||||||
|
protected abstract boolean testIsAuthorized(HttpServletRequest request);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sub-classes must implement this method to handle both GET and POST
|
||||||
|
* requests.
|
||||||
|
*/
|
||||||
|
protected abstract void doRequest(VitroRequest vreq,
|
||||||
|
HttpServletResponse resp) throws ServletException, IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sub-classes should not override this. Instead, implement doRequest().
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected final void doGet(HttpServletRequest req, HttpServletResponse resp)
|
||||||
|
throws ServletException, IOException {
|
||||||
|
VitroRequest vreq = new VitroRequest(req);
|
||||||
|
if (testIsAuthorized(vreq)) {
|
||||||
|
doRequest(vreq, resp);
|
||||||
|
} else {
|
||||||
|
resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Not authorized");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sub-classes should not override this. Instead, implement doRequest().
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected final void doPost(HttpServletRequest req, HttpServletResponse resp)
|
||||||
|
throws ServletException, IOException {
|
||||||
|
doGet(req, resp);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue