/*
* Data Hub Service (DHuS) - For Space data distribution.
* Copyright (C) 2013,2014,2015 GAEL Systems
*
* This file is part of DHuS software sources.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package fr.gael.dhus.server.http.webapp.api.controller;
import fr.gael.dhus.service.ProductUploadService;
import fr.gael.dhus.service.exception.ProductNotAddedException;
import fr.gael.dhus.service.exception.RootNotModifiableException;
import fr.gael.dhus.service.exception.UploadingException;
import fr.gael.dhus.service.exception.UserNotExistingException;
import java.io.IOException;
import java.security.Principal;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Deprecated /** To be moved in odata **/
@Controller
public class UploadController
{
private static final Logger LOGGER = LogManager.getLogger(UploadController.class);
private static final String COLLECTIONSKEY = "collections";
private static final String PRODUCTKEY = "product";
@Autowired
private ProductUploadService productUploadService;
@PreAuthorize ("hasRole('ROLE_UPLOAD')")
@RequestMapping (value = "/upload", method = {RequestMethod.POST})
public void upload(Principal principal, HttpServletRequest req,
HttpServletResponse res) throws IOException
{
// process only multipart requests
if (ServletFileUpload.isMultipartContent (req))
{
// Create a factory for disk-based file items
FileItemFactory factory = new DiskFileItemFactory ();
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload (factory);
// Parse the request
try
{
ArrayList<String> collectionIds = new ArrayList<> ();
FileItem product = null;
List<FileItem> items = upload.parseRequest (req);
for (FileItem item : items)
{
if (COLLECTIONSKEY.equals (item.getFieldName ()))
{
if (item.getString () != null &&
!item.getString ().isEmpty ())
{
for (String cid : item.getString ().split (","))
{
collectionIds.add (cid);
}
}
}
else
if (PRODUCTKEY.equals (item.getFieldName ()))
{
product = item;
}
}
if (product == null)
{
res.sendError (HttpServletResponse.SC_BAD_REQUEST,
"Your request is missing a product file to upload.");
return;
}
productUploadService.upload (product, collectionIds);
res.setStatus (HttpServletResponse.SC_CREATED);
res.getWriter ().print ("The file was created successfully.");
res.flushBuffer ();
}
catch (FileUploadException e)
{
LOGGER.error("An error occurred while parsing request.", e);
res.sendError (HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
"An error occurred while parsing request : " + e.getMessage ());
}
catch (UserNotExistingException e)
{
LOGGER.error("You need to be connected to upload a product.", e);
res.sendError (HttpServletResponse.SC_UNAUTHORIZED,
"You need to be connected to upload a product.");
}
catch (UploadingException e)
{
LOGGER.error("An error occurred while uploading the product.", e);
res.sendError (HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
"An error occurred while uploading the product : " +
e.getMessage ());
}
catch (RootNotModifiableException e)
{
LOGGER.error("An error occurred while uploading the product.", e);
res.sendError (HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
"An error occurred while uploading the product : " +
e.getMessage ());
}
catch (ProductNotAddedException e)
{
LOGGER.error("Your product can not be read by the system.", e);
res.sendError (HttpServletResponse.SC_NOT_ACCEPTABLE,
"Your product can not be read by the system.");
}
}
else
{
res.sendError (HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE,
"Request contents type is not supported by the servlet.");
}
}
}