/*
* Copyright Aduna (http://www.aduna-software.com/) (c) 2007.
*
* Licensed under the Aduna BSD-style license.
*/
package org.openrdf.http.server.repository;
import static javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
import static javax.servlet.http.HttpServletResponse.SC_OK;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.QueryResultUtil;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.query.TupleQueryResultHandlerException;
import org.openrdf.query.resultio.TupleQueryResultFormat;
import org.openrdf.query.resultio.TupleQueryResultWriter;
import org.openrdf.query.resultio.TupleQueryResultWriterFactory;
/**
* View used to render tuple query results. Renders results in a format
* specified using a parameter or Accept header.
*
* @author Herko ter Horst
* @author Arjohn Kampman
*/
public class TupleQueryResultView extends QueryResultView {
private Logger logger = LoggerFactory.getLogger(this.getClass());
private static final TupleQueryResultView INSTANCE = new TupleQueryResultView();
public static TupleQueryResultView getInstance() {
return INSTANCE;
}
private TupleQueryResultView() {
}
public String getContentType() {
return null;
}
@SuppressWarnings("unchecked")
public void render(Map model, HttpServletRequest request, HttpServletResponse response)
throws IOException
{
TupleQueryResultWriterFactory qrWriterFactory = (TupleQueryResultWriterFactory)model.get(FACTORY_KEY);
TupleQueryResultFormat qrFormat = qrWriterFactory.getTupleQueryResultFormat();
response.setStatus(SC_OK);
setContentType(response, qrFormat);
setContentDisposition(model, response, qrFormat);
OutputStream out = response.getOutputStream();
try {
TupleQueryResultWriter qrWriter = qrWriterFactory.getWriter(out);
TupleQueryResult tupleQueryResult = (TupleQueryResult)model.get(QUERY_RESULT_KEY);
QueryResultUtil.report(tupleQueryResult, qrWriter);
}
catch (QueryEvaluationException e) {
logger.error("Query evaluation error", e);
response.sendError(SC_INTERNAL_SERVER_ERROR, "Query evaluation error: " + e.getMessage());
}
catch (TupleQueryResultHandlerException e) {
logger.error("Serialization error", e);
response.sendError(SC_INTERNAL_SERVER_ERROR, "Serialization error: " + e.getMessage());
}
finally {
out.close();
}
}
}