package it.agilis.mens.azzeroCO2.server.services;
import it.agilis.mens.azzeroCO2.server.PropertiesManager;
import it.agilis.mens.azzeroCO2.server.fIleUpload.FileExceedsLimitException;
import it.agilis.mens.azzeroCO2.server.fIleUpload.FileUploadItem;
import it.agilis.mens.azzeroCO2.server.fIleUpload.UploadState;
import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileItemStream;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.codehaus.jackson.map.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.logging.Logger;
/**
* Created by IntelliJ IDEA.
* User: giovannilt
* Date: 11/25/11
* Time: 7:00 PM
* To change this template use File | Settings | File Templates.
*/
public class UploadServlet extends HttpServlet {
private static final String ENCODING = "utf-8";
private static final long MAX_FILE_SIZE = 1024 * 5000; // 5000 k
private static final Logger log = Logger.getLogger(UploadServlet.class.getName());
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
WebApplicationContext ctx = WebApplicationContextUtils
.getRequiredWebApplicationContext(config.getServletContext());
AutowireCapableBeanFactory beanFactory = ctx
.getAutowireCapableBeanFactory();
beanFactory.autowireBean(this);
}
@Autowired
@Qualifier("propertiesManager")
private PropertiesManager propertiesManager;
public PropertiesManager getPropertiesManager() {
return propertiesManager;
}
public void setPropertiesManager(PropertiesManager propertiesManager) {
this.propertiesManager = propertiesManager;
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding(ENCODING);
response.setCharacterEncoding(ENCODING);
response.setContentType("text/html");
FileUploadItem model = new FileUploadItem();
try {
ServletFileUpload upload = new ServletFileUpload();
FileItemIterator iter = upload.getItemIterator(request);
while (iter.hasNext()) {
FileItemStream item = iter.next();
processFileItem(request, model, item);
File file = new File(propertiesManager.getImageSource() + item.getName());
// log.info(file.getAbsolutePath());
flow(item.openStream(), new FileOutputStream(file), new byte[1024]);
}
} catch (Exception e) {
model.setState(UploadState.ERROR.name());
model.setMessage(UploadState.ERROR.getLabel().concat(e.getMessage()));
throw new ServletException(e);
} finally {
try {
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(response.getOutputStream(), model);
} catch (Exception e) {
throw new ServletException(e);
}
}
}
private void processFileItem(HttpServletRequest request, FileUploadItem model, FileItemStream item) throws FileExceedsLimitException {
if (!item.isFormField()) {
model.setName(item.getName());
model.setState(UploadState.OK.name());
model.setMessage(UploadState.OK.getLabel());
checkFileSizeLimit(request);
log.info("Uploaded file: " + model);
}
}
private void checkFileSizeLimit(HttpServletRequest request) throws FileExceedsLimitException {
if (request.getContentLength() > MAX_FILE_SIZE) {
throw new FileExceedsLimitException("File (" + request.getContentLength() + " bytes) exceeds limit " + MAX_FILE_SIZE + " bytes.");
}
}
private void flow(InputStream is, OutputStream os, byte[] buf) throws IOException {
try {
int numRead;
while ((numRead = is.read(buf)) >= 0) {
os.write(buf, 0, numRead);
}
} finally {
if (os != null) {
os.flush();
os.close();
}
if (is != null) {
is.close();
}
}
}
}