/**
* ***************************************************************************
* Copyright (c) 2010 Qcadoo Limited
* Project: Qcadoo MES
* Version: 1.4
*
* This file is part of Qcadoo.
*
* Qcadoo 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, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* ***************************************************************************
*/
package com.qcadoo.mes.cmmsMachineParts.controller;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import com.google.common.collect.Lists;
import com.google.common.io.Files;
import com.qcadoo.mes.cmmsMachineParts.constants.CmmsMachinePartsConstants;
import com.qcadoo.mes.cmmsMachineParts.constants.PlannedEventAttachmentFields;
import com.qcadoo.model.api.DataDefinition;
import com.qcadoo.model.api.DataDefinitionService;
import com.qcadoo.model.api.Entity;
import com.qcadoo.model.api.NumberService;
import com.qcadoo.model.api.file.FileService;
@Controller
@RequestMapping("/cmmsMachineParts")
public class PlannedEventMultiUploadController {
private static final Logger logger = LoggerFactory.getLogger(PlannedEventMultiUploadController.class);
@Autowired
private FileService fileService;
@Autowired
private DataDefinitionService dataDefinitionService;
@Autowired
private NumberService numberService;
private static final Integer L_SCALE = 2;
private static final List<String> EXTS = Lists
.newArrayList("GIF", "JPG", "JPEG", "PNG", "PDF", "XLS", "XLSX", "DWG", "IPT",
"IAM", "IDW", "DOC", "DOCX", "TXT", "CSV", "XML", "ODT", "ODS", "TIFF", "TIF");
@ResponseBody
@RequestMapping(value = "/multiUploadFilesForPlannedEvent", method = RequestMethod.POST)
public void upload(MultipartHttpServletRequest request, HttpServletResponse response) {
Long eventId = Long.parseLong(request.getParameter("eventId"));
Entity event = dataDefinitionService.get(CmmsMachinePartsConstants.PLUGIN_IDENTIFIER,
CmmsMachinePartsConstants.MODEL_PLANNED_EVENT).get(eventId);
DataDefinition attachmentDD = dataDefinitionService.get(CmmsMachinePartsConstants.PLUGIN_IDENTIFIER,
CmmsMachinePartsConstants.MODEL_PLANNED_EVENT_ATTACHMENT);
Iterator<String> itr = request.getFileNames();
MultipartFile mpf = null;
while (itr.hasNext()) {
mpf = request.getFile(itr.next());
String path = "";
try {
path = fileService.upload(mpf);
} catch (IOException e) {
logger.error("Unable to upload attachment.", e);
}
if (EXTS.contains(Files.getFileExtension(path).toUpperCase())) {
Entity atchment = attachmentDD.create();
atchment.setField(PlannedEventAttachmentFields.ATTACHMENT, path);
atchment.setField(PlannedEventAttachmentFields.NAME, mpf.getOriginalFilename());
atchment.setField(PlannedEventAttachmentFields.PLANNED_EVENT, event);
atchment.setField(PlannedEventAttachmentFields.EXT, Files.getFileExtension(path));
BigDecimal fileSize = new BigDecimal(mpf.getSize(), numberService.getMathContext());
BigDecimal divider = new BigDecimal(1024, numberService.getMathContext());
BigDecimal size = fileSize.divide(divider, L_SCALE, BigDecimal.ROUND_HALF_UP);
atchment.setField(PlannedEventAttachmentFields.SIZE, size);
atchment = attachmentDD.save(atchment);
atchment.isValid();
}
}
}
@RequestMapping(value = "/getAttachmentForPlannedEvent.html", method = RequestMethod.GET)
public final void getAttachment(@RequestParam("id") final Long[] ids, HttpServletResponse response) {
DataDefinition attachmentDD = dataDefinitionService.get(CmmsMachinePartsConstants.PLUGIN_IDENTIFIER,
CmmsMachinePartsConstants.MODEL_PLANNED_EVENT_ATTACHMENT);
Entity attachment = attachmentDD.get(ids[0]);
InputStream is = fileService.getInputStream(attachment.getStringField(PlannedEventAttachmentFields.ATTACHMENT));
try {
if (is == null) {
response.sendRedirect("/error.html?code=404");
}
response.setHeader("Content-disposition",
"inline; filename=" + attachment.getStringField(PlannedEventAttachmentFields.NAME));
response.setContentType(fileService.getContentType(attachment.getStringField(PlannedEventAttachmentFields.ATTACHMENT)));
int bytes = IOUtils.copy(is, response.getOutputStream());
response.setContentLength(bytes);
response.flushBuffer();
} catch (IOException e) {
logger.error("Unable to copy attachment file to response stream.", e);
}
}
}