/** * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the * License for the specific language governing rights and limitations under * the License. * * The Original Code is OpenELIS code. * * Copyright (C) ITECH, University of Washington, Seattle WA. All Rights Reserved. * */ package us.mn.state.health.lims.common.servlet.reports; 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.validator.GenericValidator; import org.hibernate.Transaction; import org.hibernate.lob.BlobImpl; import us.mn.state.health.lims.common.exception.LIMSRuntimeException; import us.mn.state.health.lims.hibernate.HibernateUtil; import us.mn.state.health.lims.image.dao.ImageDAO; import us.mn.state.health.lims.image.daoimpl.ImageDAOImpl; import us.mn.state.health.lims.image.valueholder.Image; import us.mn.state.health.lims.siteinformation.dao.SiteInformationDAO; import us.mn.state.health.lims.siteinformation.daoimpl.SiteInformationDAOImpl; import us.mn.state.health.lims.siteinformation.valueholder.SiteInformation; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.sql.Blob; import java.util.List; public class LogoUploadServlet extends HttpServlet { static final long serialVersionUID = 1L; private ImageDAO imageDAO = new ImageDAOImpl(); private static final String PREVIEW_FILE_PATH = File.separator + "images" + File.separator; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String whichLogo = request.getParameter( "logo" ); boolean removeImage = "true".equals( request.getParameter( "removeImage" ) ); // Check that we have a file upload request boolean isMultipart = ServletFileUpload.isMultipartContent(request); if (!isMultipart) { return; } String uploadPreviewPath = getServletContext().getRealPath("") + PREVIEW_FILE_PATH + (whichLogo.equals( "headerLeftImage" ) ? "leftLabLogo.jpg" : "rightLabLogo.jpg"); if( removeImage){ removeImage( whichLogo, uploadPreviewPath); } else{ updateImage( request, whichLogo, uploadPreviewPath ); } getServletContext().getRequestDispatcher("/PrintedReportsConfigurationMenu.do").forward(request, response); } private void removeImage( String logoName, String uploadPreviewPath ){ File previewFile = new File(uploadPreviewPath); previewFile.delete(); SiteInformationDAO siteInformationDAO = new SiteInformationDAOImpl(); SiteInformation logoInformation = siteInformationDAO.getSiteInformationByName( logoName ); if( logoInformation == null ){ return; } String imageId = logoInformation.getValue(); if(!GenericValidator.isBlankOrNull( imageId )){ Image image = imageDAO.getImage( imageId ); Transaction tx = HibernateUtil.getSession().beginTransaction(); try { imageDAO.deleteImage( image ); logoInformation.setValue( "" ); logoInformation.setSysUserId( "1" ); siteInformationDAO.updateData( logoInformation ); tx.commit(); } catch (LIMSRuntimeException lre){ tx.rollback(); } } } private void updateImage( HttpServletRequest request, String whichLogo, String uploadPreviewPath ) throws ServletException{ DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold( Image.MAX_MEMORY_SIZE); factory.setRepository(new File(System.getProperty("java.io.tmpdir"))); ServletFileUpload upload = new ServletFileUpload(factory); upload.setSizeMax(Image.MAX_MEMORY_SIZE); try { @SuppressWarnings("unchecked") List<FileItem> items = upload.parseRequest(request); for( FileItem item : items) { if (validToWrite(item)) { File previewFile = new File(uploadPreviewPath); item.write(previewFile); writeToDatabase( previewFile, whichLogo ); break; } } } catch (FileUploadException ex) { throw new ServletException(ex); } catch (Exception ex) { throw new ServletException(ex); } } private void writeToDatabase( File file, String logoName ){ SiteInformationDAO siteInformationDAO = new SiteInformationDAOImpl(); SiteInformation logoInformation = siteInformationDAO.getSiteInformationByName( logoName ); if( logoInformation == null ){ return; } String imageId = logoInformation.getValue(); boolean newImage = GenericValidator.isBlankOrNull( imageId ); byte[] imageData = new byte[(int)file.length()]; try { FileInputStream fileInputStream = new FileInputStream(file); fileInputStream.read(imageData); fileInputStream.close(); } catch (Exception e) { e.printStackTrace(); } Blob blob = new BlobImpl( imageData ); Transaction tx = HibernateUtil.getSession().beginTransaction(); Image image = new Image(); image.setImage( blob ); image.setDescription( logoName ); try { if( !newImage){ //The reason the old image is deleted and a new one added is because updating the image //doesn't work. imageDAO.deleteImage( imageDAO.getImage( imageId ) ); } imageDAO.saveImage( image ); logoInformation.setValue( image.getId() ); logoInformation.setSysUserId( "1" ); siteInformationDAO.updateData( logoInformation ); tx.commit(); } catch (LIMSRuntimeException lre){ tx.rollback(); } } private boolean validToWrite(FileItem item) { return !item.isFormField() && item.getSize() > 0 && !GenericValidator.isBlankOrNull(item.getName()) && ( item.getName().contains("jpg") || item.getName().contains("png") || item.getName().contains("gif")); } }