package org.inbio.m3s.web.controller.upload;
import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.inbio.m3s.MultipleFilesUploadBean;
import org.inbio.m3s.util.ImageMagickAPI;
import org.inbio.m3s.dto.metadata.util.MediaTypeEntity;
import org.inbio.m3s.web.controller.metadata.MetadataHandler;
import org.inbio.m3s.web.exception.ValidationException;
import org.springframework.validation.BindException;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.support.ByteArrayMultipartFileEditor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;
/**
*
* @author jgutierrez
*
*/
public class MultipleImagesUploadController extends SimpleFormController {
//Constants
private String filePath; // ${temporalFilesPath}
protected String fileExtension; //="jpg";
//model & JSP
private String metadataUsernameKey; //="username"
private String fileNameKey;//=fileName
private String mediaTypeIdKey; //mediaTypeId
private String mediaTypeNameKey; //mediaTypeName
private String formActionKey; //="formAction"
private String formActionValue; //para el siguiente form...
private String metadataMediaVisibleKey; //multimedio visible
private String metadataMediaVisibleValue; //="checked"
//in case of error
private String errorViewName; //="insertStep1";
private String errorFormActionKey; //="jpgImagesFormAction"
private String errorFormActionValue; //="uploadImages.html"
//Managers and handlers
private MetadataHandler metadataHandler;
protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response,
Object command, BindException errors) throws ServletException, IOException, Exception {
//in case of error just fire this exception
ValidationException ve = new ValidationException();
ve.setViewName(errorViewName);
Map<String,Object> modelElements = new HashMap<String, Object>();
modelElements.put(errorFormActionKey,errorFormActionValue);
ve.setModelElements(modelElements);
String fileName ="";
try {
ModelAndView mav = new ModelAndView(getSuccessView());
String userName = request.getParameter(metadataUsernameKey);
logger.debug("userName: "+userName);
mav.addObject(metadataUsernameKey, userName);
// Creates a new HttpSession so the other servlets could identify
// the file that has been upload
HttpSession session = request.getSession(true);
DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd-HHmmss-");
java.util.Date date = new java.util.Date();
String fileId = dateFormat.format(date) + userName +session.getId();
//Archivos de imagenes, pueden ser hasta 6.
// cast the bean
MultipleFilesUploadBean multipleImagesBean = (MultipleFilesUploadBean) command;
//images Count
int filesCount = multipleImagesBean.getFilesCount();
//mav.addObject(totalFilesKey, filesCount);
if(filesCount < 1){
//no hay archivo que subir :S
ve.setErrorMessageKey("error.insert.01");
throw ve;
}
String systemFileName;
File fileToMove;
for(MultipartFile file: multipleImagesBean.getFiles()){
systemFileName = fileId+filesCount+"."+fileExtension;
fileToMove = new File(filePath+systemFileName);
fileToMove.setWritable(true, false);
file.transferTo(fileToMove);
try{
ImageMagickAPI.createThumb(filePath+systemFileName, filePath+"thumb-"+systemFileName);
}catch (Exception e){
//no se puede mover el archivo de imagen
ve.setErrorMessageKey("error.insert.02");
throw ve;
}
fileName += systemFileName+";";
filesCount--;
}
//add the fileNames hashmap
mav.addObject(fileNameKey,fileName);
logger.debug(fileNameKey+" "+fileName);
//values needed in the next JSP
//mav.addAllObjects(blabla());
mav.addObject(formActionKey, formActionValue);
//MediaVisible will be visible by default
mav.addObject(metadataMediaVisibleKey, metadataMediaVisibleValue);
Map<String,Object> metadataModelValues = new HashMap<String, Object>();
metadataModelValues = metadataHandler.getMetadata(metadataModelValues);
mav.addAllObjects(metadataModelValues);
//setting mediaType to Image
mav.addObject(mediaTypeIdKey,MediaTypeEntity.DSC_IMAGE.getMediaTypeId());
mav.addObject(mediaTypeNameKey,MediaTypeEntity.DSC_IMAGE.getNamekey());
return mav;
} catch (Exception e){
if(ve.getErrorMessageKey()!= null)
throw ve;
ve.setErrorMessageKey("error.insert.01");
throw ve;
}
}
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder)
throws ServletException {
// to actually be able to convert Multipart instance to byte[]
// we have to register a custom editor
binder.registerCustomEditor(byte[].class, new ByteArrayMultipartFileEditor());
// now Spring knows how to handle multipart object and convert them
}
/**
* @return the filePath
*/
public String getFilePath() {
return filePath;
}
/**
* @param filePath the filePath to set
*/
public void setFilePath(String filePath) {
this.filePath = filePath;
}
/**
* @return the fileExtension
*/
public String getFileExtension() {
return fileExtension;
}
/**
* @param fileExtension the fileExtension to set
*/
public void setFileExtension(String fileExtension) {
this.fileExtension = fileExtension;
}
/**
* @return the metadataUsernameKey
*/
public String getMetadataUsernameKey() {
return metadataUsernameKey;
}
/**
* @param metadataUsernameKey the metadataUsernameKey to set
*/
public void setMetadataUsernameKey(String metadataUsernameKey) {
this.metadataUsernameKey = metadataUsernameKey;
}
/**
* @return the fileNameKey
*/
public String getFileNameKey() {
return fileNameKey;
}
/**
* @param fileNameKey the fileNameKey to set
*/
public void setFileNameKey(String fileNameKey) {
this.fileNameKey = fileNameKey;
}
/**
* @return the formActionKey
*/
public String getFormActionKey() {
return formActionKey;
}
/**
* @param formActionKey the formActionKey to set
*/
public void setFormActionKey(String formActionKey) {
this.formActionKey = formActionKey;
}
/**
* @return the formActionValue
*/
public String getFormActionValue() {
return formActionValue;
}
/**
* @param formActionValue the formActionValue to set
*/
public void setFormActionValue(String formActionValue) {
this.formActionValue = formActionValue;
}
/**
* @return the metadataMediaVisibleKey
*/
public String getMetadataMediaVisibleKey() {
return metadataMediaVisibleKey;
}
/**
* @param metadataMediaVisibleKey the metadataMediaVisibleKey to set
*/
public void setMetadataMediaVisibleKey(String metadataMediaVisibleKey) {
this.metadataMediaVisibleKey = metadataMediaVisibleKey;
}
/**
* @return the metadataMediaVisibleValue
*/
public String getMetadataMediaVisibleValue() {
return metadataMediaVisibleValue;
}
/**
* @param metadataMediaVisibleValue the metadataMediaVisibleValue to set
*/
public void setMetadataMediaVisibleValue(String metadataMediaVisibleValue) {
this.metadataMediaVisibleValue = metadataMediaVisibleValue;
}
/**
* @return the errorViewName
*/
public String getErrorViewName() {
return errorViewName;
}
/**
* @param errorViewName the errorViewName to set
*/
public void setErrorViewName(String errorViewName) {
this.errorViewName = errorViewName;
}
/**
* @return the errorFormActionKey
*/
public String getErrorFormActionKey() {
return errorFormActionKey;
}
/**
* @param errorFormActionKey the errorFormActionKey to set
*/
public void setErrorFormActionKey(String errorFormActionKey) {
this.errorFormActionKey = errorFormActionKey;
}
/**
* @return the errorFormActionValue
*/
public String getErrorFormActionValue() {
return errorFormActionValue;
}
/**
* @param errorFormActionValue the errorFormActionValue to set
*/
public void setErrorFormActionValue(String errorFormActionValue) {
this.errorFormActionValue = errorFormActionValue;
}
/**
* @return the metadataHandler
*/
public MetadataHandler getMetadataHandler() {
return metadataHandler;
}
/**
* @param metadataHandler the metadataHandler to set
*/
public void setMetadataHandler(MetadataHandler metadataHandler) {
this.metadataHandler = metadataHandler;
}
/**
* @return the mediaTypeIdKey
*/
public String getMediaTypeIdKey() {
return mediaTypeIdKey;
}
/**
* @param mediaTypeIdKey the mediaTypeIdKey to set
*/
public void setMediaTypeIdKey(String mediaTypeIdKey) {
this.mediaTypeIdKey = mediaTypeIdKey;
}
/**
* @return the mediaTypeNameKey
*/
public String getMediaTypeNameKey() {
return mediaTypeNameKey;
}
/**
* @param mediaTypeNameKey the mediaTypeNameKey to set
*/
public void setMediaTypeNameKey(String mediaTypeNameKey) {
this.mediaTypeNameKey = mediaTypeNameKey;
}
}