/* * Copyright Aduna (http://www.aduna-software.com/) (c) 2007. * * Licensed under the Aduna BSD-style license. */ package org.openrdf.http.webclient.repository.extract; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; 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.springframework.web.servlet.mvc.SimpleFormController; import org.openrdf.http.webclient.SessionKeys; import org.openrdf.http.webclient.properties.RDFFormatPropertyEditor; import org.openrdf.http.webclient.properties.ResourcePropertyEditor; import org.openrdf.http.webclient.properties.UriPropertyEditor; import org.openrdf.http.webclient.properties.ValuePropertyEditor; 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.repository.http.HTTPRepository; import org.openrdf.rio.RDFFormat; import org.openrdf.rio.RDFHandlerException; import org.openrdf.rio.RDFWriter; import org.openrdf.rio.RDFWriterFactory; import org.openrdf.rio.RDFWriterRegistry; import org.openrdf.rio.Rio; public class ExtractionController extends SimpleFormController { final Logger logger = LoggerFactory.getLogger(this.getClass()); @Override protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) { HttpSession session = request.getSession(); HTTPRepository repo = (HTTPRepository)session.getAttribute(SessionKeys.REPOSITORY_KEY); binder.registerCustomEditor(Resource.class, new ResourcePropertyEditor(repo.getValueFactory())); binder.registerCustomEditor(URI.class, new UriPropertyEditor(repo.getValueFactory())); binder.registerCustomEditor(Value.class, new ValuePropertyEditor(repo.getValueFactory())); binder.registerCustomEditor(RDFFormat.class, new RDFFormatPropertyEditor()); } @Override public ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) { HTTPRepository repo = (HTTPRepository)request.getSession().getAttribute(SessionKeys.REPOSITORY_KEY); ExtractionSettings settings = (ExtractionSettings)command; RDFFormat format = settings.getResultFormat(); RepositoryConnection conn = null; try { response.setContentType(format.getDefaultMIMEType()); String filename = "extract"; if (format.getDefaultFileExtension() != null) { filename += "." + format.getDefaultFileExtension(); } response.setHeader("Content-Disposition", "attachment; filename=" + filename); RDFWriter writer = Rio.createWriter(format, response.getOutputStream()); conn = repo.getConnection(); conn.exportStatements(settings.getSubject(), settings.getPredicate(), settings.getObject(), settings.isIncludeInferred(), writer, settings.getContexts()); } catch (RepositoryException e) { e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (RDFHandlerException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { response.getOutputStream().close(); } catch (IOException e) { e.printStackTrace(); } if (conn != null) { try { conn.close(); } catch (RepositoryException e) { e.printStackTrace(); } } } return null; } @Override protected Map<String, Object> referenceData(HttpServletRequest request) { Map<String, Object> result = new HashMap<String, Object>(); 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; } }