package edu.kit.aifb.cumulus.webapp; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; import org.openrdf.rio.RDFFormat; import org.slf4j.LoggerFactory; import edu.kit.aifb.cumulus.framework.Environment.ConfigParams; import edu.kit.aifb.cumulus.log.Log; import edu.kit.aifb.cumulus.log.MessageCatalog; import edu.kit.aifb.cumulus.log.MessageFactory; import edu.kit.aifb.cumulus.store.Store; /** * A servlet that accepts a file containing RDF data and stores the data using * the cumulusrdf store. * * @author Andreas Wagner */ public class LoadServlet extends AbstractCumulusServlet { private Log _log = new Log(LoggerFactory.getLogger(getClass())); private static final long serialVersionUID = 1L; @SuppressWarnings("unchecked") @Override public void doPost(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException { if (!ServletFileUpload.isMultipartContent(req)) { sendError(req, resp, HttpStatus.SC_BAD_REQUEST, MessageCatalog._00036_NOT_MULTIPART_REQUEST); return; } try { final File tmp_file = File.createTempFile("upload_", null); final FileOutputStream tmp_outstream = new FileOutputStream(tmp_file); List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(req); String file_extension = null, file_name = null; long size_total = 0; for (FileItem item : items) { if (!item.isFormField()) { long size = item.getSize(); size_total += size; IOUtils.copy(item.getInputStream(), tmp_outstream); if (file_name == null || file_extension == null) { file_name = FilenameUtils.getName(item.getName()).toLowerCase(); file_extension = FilenameUtils.getExtension(item.getName()).toLowerCase(); } _log.info(MessageCatalog._00037_BULK_DATA_SIZE, size); } } _log.info(MessageCatalog._00038_BULK_DATA_READ, size_total); tmp_outstream.close(); if (file_extension == null || file_extension.isEmpty()) { sendError(req, resp, HttpStatus.SC_BAD_REQUEST, MessageCatalog._00039_NO_EXTENSION_FILE); tmp_file.delete(); return; } RDFFormat rdf_format = RDFFormat.forFileName(file_name); if (rdf_format == null) { sendError(req, resp, HttpStatus.SC_BAD_REQUEST, MessageFactory.createMessage(MessageCatalog._00043_UNKNOWN_EXTENSION_FILE, file_extension)); return; } Store store = (Store) getServletContext().getAttribute(ConfigParams.STORE); if ((store == null) || !store.isOpen()) { sendError( req, resp, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, MessageCatalog._00025_CUMULUS_SYSTEM_INTERNAL_FAILURE_MSG); return; } store.bulkLoad(tmp_file, rdf_format); tmp_file.delete(); req.setAttribute("loadOk", true); req.setAttribute("page", "Load Data"); forwardTo(req, resp, "addOrLoad.vm"); } catch (FileUploadException exception) { sendError(req, resp, HttpStatus.SC_BAD_REQUEST, "cannot parse multipart request.", exception); } catch (final Exception exception) { _log.error(MessageCatalog._00026_NWS_SYSTEM_INTERNAL_FAILURE, exception); sendError(req, resp, HttpServletResponse.SC_BAD_REQUEST, "System has detected and internal failure.", exception); } } }