/* * 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.GraphQueryResult; import org.openrdf.query.QueryEvaluationException; import org.openrdf.query.QueryResultUtil; import org.openrdf.rio.RDFFormat; import org.openrdf.rio.RDFHandlerException; import org.openrdf.rio.RDFWriter; import org.openrdf.rio.RDFWriterFactory; /** * View used to render graph query results. Renders the graph as RDF using a * serialization specified using a parameter or Accept header. * * @author Herko ter Horst * @author Arjohn Kampman */ public class GraphQueryResultView extends QueryResultView { private Logger logger = LoggerFactory.getLogger(this.getClass()); private static final GraphQueryResultView INSTANCE = new GraphQueryResultView(); public static GraphQueryResultView getInstance() { return INSTANCE; } private GraphQueryResultView() { } public String getContentType() { return null; } @SuppressWarnings("unchecked") public void render(Map model, HttpServletRequest request, HttpServletResponse response) throws IOException { RDFWriterFactory rdfWriterFactory = (RDFWriterFactory)model.get(FACTORY_KEY); RDFFormat rdfFormat = rdfWriterFactory.getRDFFormat(); response.setStatus(SC_OK); setContentType(response, rdfFormat); setContentDisposition(model, response, rdfFormat); OutputStream out = response.getOutputStream(); try { RDFWriter rdfWriter = rdfWriterFactory.getWriter(out); GraphQueryResult graphQueryResult = (GraphQueryResult)model.get(QUERY_RESULT_KEY); QueryResultUtil.report(graphQueryResult, rdfWriter); } catch (QueryEvaluationException e) { logger.error("Query evaluation error", e); response.sendError(SC_INTERNAL_SERVER_ERROR, "Query evaluation error: " + e.getMessage()); } catch (RDFHandlerException e) { logger.error("Serialization error", e); response.sendError(SC_INTERNAL_SERVER_ERROR, "Serialization error: " + e.getMessage()); } finally { out.close(); } } }