/*
* Copyright Aduna (http://www.aduna-software.com/) (c) 2006-2007.
*
* Licensed under the Aduna BSD-style license.
*/
package org.openrdf.http.webclient.repository.modify.add;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
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.springframework.web.servlet.mvc.SimpleFormController;
import org.openrdf.http.webclient.SessionKeys;
import org.openrdf.http.webclient.properties.RDFFormatPropertyEditor;
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.RDFParseException;
import org.openrdf.rio.RDFParserFactory;
import org.openrdf.rio.RDFParserRegistry;
/**
* @author Herko ter Horst
*/
public class AddController extends SimpleFormController {
final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) {
binder.registerCustomEditor(RDFFormat.class, new RDFFormatPropertyEditor());
}
@Override
protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command,
BindException errors)
throws Exception, IOException
{
ModelAndView result = null;
logger.info("Uploading data...");
RDFUpload rdfUpload = (RDFUpload)command;
InputStream in = rdfUpload.getInputStream();
HTTPRepository repo = (HTTPRepository)request.getSession().getAttribute(SessionKeys.REPOSITORY_KEY);
RepositoryConnection conn = null;
try {
conn = repo.getConnection();
conn.add(in, rdfUpload.getBaseUri(), rdfUpload.getFormat());
conn.commit();
logger.info("Upload committed.");
}
catch (RDFParseException e) {
logger.warn("Unable to upload file {}", e.getMessage());
errors.rejectValue("contents", "repository.modify.add.error", new String[] { e.getMessage() }, "Malformed document");
}
catch (RepositoryException e) {
logger.error("Unable to upload file", e);
errors.reject("repository.error");
}
finally {
if (conn != null) {
try {
conn.close();
}
catch (RepositoryException e) {
e.printStackTrace();
}
}
if (in != null) {
in.close();
}
}
if (errors.hasErrors()) {
result = showForm(request, response, errors, errors.getModel());
}
else {
result = new ModelAndView(getSuccessView(), "actionResult", rdfUpload.getI18n());
}
return result;
}
@Override
protected Map<String, Object> referenceData(HttpServletRequest arg0)
throws Exception
{
Map<String, Object> result = new HashMap<String, Object>();
Map<String, String> rdfFormats = new TreeMap<String, String>();
for (RDFParserFactory factory : RDFParserRegistry.getInstance().getAll()) {
RDFFormat format = factory.getRDFFormat();
rdfFormats.put(format.getName(), format.getName());
}
result.put("formats", rdfFormats);
return result;
}
}