/*
* Copyright Aduna (http://www.aduna-software.com/) (c) 2006-2007.
*
* Licensed under the Aduna BSD-style license.
*/
package org.openrdf.http.webclient.repository.query;
import java.io.ByteArrayOutputStream;
import java.util.Map;
import java.util.TreeMap;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindException;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.servlet.ModelAndView;
import org.openrdf.http.webclient.SessionKeys;
import org.openrdf.http.webclient.properties.RDFFormatPropertyEditor;
import org.openrdf.query.GraphQueryResult;
import org.openrdf.query.MalformedQueryException;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.resultio.QueryResultIO;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.RepositoryException;
import org.openrdf.repository.http.HTTPGraphQuery;
import org.openrdf.repository.http.HTTPQueryEvaluationException;
import org.openrdf.repository.http.HTTPRepository;
import org.openrdf.rio.RDFFormat;
import org.openrdf.rio.RDFHandlerException;
import org.openrdf.rio.RDFWriterFactory;
import org.openrdf.rio.RDFWriterRegistry;
import org.openrdf.rio.UnsupportedRDFormatException;
public class ConstructQueryFormController extends QueryFormController {
final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder)
throws ServletException
{
binder.registerCustomEditor(RDFFormat.class, new RDFFormatPropertyEditor());
}
@Override
public ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command,
BindException errors)
throws Exception
{
ModelAndView result = null;
HTTPRepository repo = (HTTPRepository)request.getSession().getAttribute(SessionKeys.REPOSITORY_KEY);
ConstructQueryInfo qInfo = (ConstructQueryInfo)command;
String resultString = "";
RepositoryConnection conn = null;
try {
conn = repo.getConnection();
HTTPGraphQuery query = (HTTPGraphQuery)conn.prepareGraphQuery(qInfo.getQueryLanguage(),
qInfo.getQueryString());
query.setIncludeInferred(qInfo.isIncludeInferred());
GraphQueryResult queryResult = null;
try {
queryResult = query.evaluate();
}
catch (HTTPQueryEvaluationException e) {
if (e.isCausedByMalformedQueryException()) {
throw e.getCauseAsMalformedQueryException();
}
else if (e.isCausedByRepositoryException()) {
throw e.getCauseAsRepositoryException();
}
else if (e.isCausedByIOException()) {
throw e.getCauseAsIOException();
}
else {
throw e;
}
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
QueryResultIO.write(queryResult, qInfo.getResultFormat(), out);
resultString = new String(out.toByteArray(), qInfo.getResultFormat().getCharset().name());
}
catch (RDFHandlerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (UnsupportedRDFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
catch (RepositoryException e) {
errors.reject("repository.error");
}
catch (MalformedQueryException e) {
errors.rejectValue("queryString", "repository.query.error.malformed", new String[] { e.getMessage() }, "Malformed query");
}
catch (QueryEvaluationException e) {
errors.reject("repository.query.error.evaluation");
}
finally {
// FIXME: check to see where this connection gets closed
// if (conn != null) {
// try {
// conn.close();
// }
// catch (RepositoryException e) {
// e.printStackTrace();
// }
// }
}
if (errors.hasErrors()) {
result = showForm(request, response, errors, errors.getModel());
}
else {
@SuppressWarnings("unchecked")
Map<String, Object> model = errors.getModel();
model.put("queryinfo", qInfo);
model.put("queryresult", resultString);
result = new ModelAndView(getSuccessView(), model);
}
return result;
}
@Override
protected Map<String, Object> referenceData(HttpServletRequest request) {
@SuppressWarnings("unchecked")
Map<String, Object> result = (Map<String, Object>)super.referenceData(request);
Map<String, String> resultFormats = new TreeMap<String, String>();
for (RDFWriterFactory factory : RDFWriterRegistry.getInstance().getAll()) {
RDFFormat resultFormat = factory.getRDFFormat();
resultFormats.put(resultFormat.getName(), resultFormat.getName());
}
result.put("resultFormats", resultFormats);
return result;
}
}