/*
* Copyright Aduna (http://www.aduna-software.com/) (c) 2007.
*
* Licensed under the Aduna BSD-style license.
*/
package org.openrdf.http.server.repository.statements;
import static javax.servlet.http.HttpServletResponse.SC_OK;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.View;
import org.openrdf.http.server.ServerHTTPException;
import org.openrdf.http.server.repository.RepositoryInterceptor;
import org.openrdf.model.Resource;
import org.openrdf.model.URI;
import org.openrdf.model.Value;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFFormat;
import org.openrdf.rio.RDFHandlerException;
import org.openrdf.rio.RDFWriter;
import org.openrdf.rio.RDFWriterFactory;
/**
* View used to export statements. Renders the statements as RDF using a
* serialization specified using a parameter or Accept header.
*
* @author Herko ter Horst
*/
public class ExportStatementsView implements View {
public static final String SUBJECT_KEY = "subject";
public static final String PREDICATE_KEY = "predicate";
public static final String OBJECT_KEY = "object";
public static final String CONTEXTS_KEY = "contexts";
public static final String USE_INFERENCING_KEY = "useInferencing";
public static final String FACTORY_KEY = "factory";
private static final ExportStatementsView INSTANCE = new ExportStatementsView();
public static ExportStatementsView getInstance() {
return INSTANCE;
}
private ExportStatementsView() {
}
public String getContentType() {
return null;
}
@SuppressWarnings("unchecked")
public void render(Map model, HttpServletRequest request, HttpServletResponse response)
throws Exception
{
RepositoryConnection repositoryCon = RepositoryInterceptor.getRepositoryConnection(request);
Resource subj = (Resource)model.get(SUBJECT_KEY);
URI pred = (URI)model.get(PREDICATE_KEY);
Value obj = (Value)model.get(OBJECT_KEY);
Resource[] contexts = (Resource[])model.get(CONTEXTS_KEY);
boolean useInferencing = (Boolean)model.get(USE_INFERENCING_KEY);
RDFWriterFactory rdfWriterFactory = (RDFWriterFactory)model.get(FACTORY_KEY);
RDFFormat rdfFormat = rdfWriterFactory.getRDFFormat();
try {
OutputStream out = response.getOutputStream();
RDFWriter rdfWriter = rdfWriterFactory.getWriter(out);
response.setStatus(SC_OK);
String mimeType = rdfFormat.getDefaultMIMEType();
if (rdfFormat.hasCharset()) {
Charset charset = rdfFormat.getCharset();
mimeType += "; charset=" + charset.name();
}
response.setContentType(mimeType);
String filename = "statements";
if (rdfFormat.getDefaultFileExtension() != null) {
filename += "." + rdfFormat.getDefaultFileExtension();
}
response.setHeader("Content-Disposition", "attachment; filename=" + filename);
repositoryCon.exportStatements(subj, pred, obj, useInferencing, rdfWriter, contexts);
out.close();
}
catch (RDFHandlerException e) {
throw new ServerHTTPException("Serialization error: " + e.getMessage(), e);
}
catch (RepositoryException e) {
throw new ServerHTTPException("Repository error: " + e.getMessage(), e);
}
}
}