package com.citi.dashboard; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.log4j.Logger; import com.citi.dashboard.excel.FileUtil; import com.citi.dashboard.excel.xml.ParseXML; import com.citi.dashboard.excel.xml.XMLFile; public class ExcelServlet extends HttpServlet { private static transient final Logger logger = Logger.getLogger(ExcelServlet.class); private static final long serialVersionUID = 1L; private static String userDir = ""; // session will never time out by default private static int maxInactiveInterval = -1; // define reserved time of generated excel image, unit is second private static long excelImageReservedTime = 0; private final String EXCEL_IMAGE_SESSION = "excelImages"; public ExcelServlet(){ } static { try { userDir = System.getProperty("user.dir"); List<String> list = InitConf.getConf("conf/session.conf"); if(list != null && list.size() == 1) { maxInactiveInterval = Integer.parseInt(list.get(0)); } String reservedTimeStr = InitConf.getProperty("conf/elementConf.properties", "EXCEL_IMAGE_RESERVED_TIME"); if(reservedTimeStr != null) { excelImageReservedTime = Long.parseLong(reservedTimeStr); if(excelImageReservedTime <= 0) { // default reserved time is 1 day excelImageReservedTime = 86400; } } else { // default reserved time is 1 day excelImageReservedTime = 86400; } /* * excel images reserved time should not less than max inactive interval of session * otherwise, we may delete images which are stilled used by some webs */ if(excelImageReservedTime < maxInactiveInterval){ excelImageReservedTime = maxInactiveInterval; } } catch (Exception e) { logger.debug("Exception when init max inactive interval of http session"); logger.debug(e.getStackTrace()); } } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { List<String> excelImageUrlList = new ArrayList<String>(); HttpSession session = request.getSession(); Object object = session.getAttribute(EXCEL_IMAGE_SESSION); if(object != null && (object instanceof Map)) { /* * generate new image if xml data has changed which means generaged data of excel images has changed * refresh session if any changes happened */ Map<XMLFile,List<String>> map = (Map<XMLFile,List<String>>)object; boolean hasMapChanged = false; for(Entry<XMLFile,List<String>> entry: map.entrySet()) { XMLFile xmlfile = entry.getKey(); List<String> oldList = entry.getValue(); boolean hasModified = FileUtil.hasModified(xmlfile); // file has been changed since last excel image was generated if(hasModified == true) { List<String> newList = ParseXML.getExcelImageUrlFromSingleXml(xmlfile.getAbsolutePath()); map.put(xmlfile, newList); excelImageUrlList.addAll(newList); hasMapChanged = true; } else { excelImageUrlList.addAll(oldList); } } if(hasMapChanged == true) { session.setAttribute(EXCEL_IMAGE_SESSION, map); } } else { try { Map<XMLFile,List<String>> map = ParseXML.getAllExcelImageUrls(); for(Entry<XMLFile, List<String>> entry: map.entrySet()) { List<String> list = entry.getValue(); excelImageUrlList.addAll(list); } session.setAttribute(EXCEL_IMAGE_SESSION, map); session.setMaxInactiveInterval(maxInactiveInterval); } catch (Exception ex) { // when exception occures, delete all generated excel images StringBuilder filePath = new StringBuilder(); filePath.append(userDir).append("/html/excel/image"); File parent = new File(filePath.toString()); FileUtil.deleteAllDirAndImageFile(parent, filePath.toString()); if(logger.isDebugEnabled()){ logger.debug(ex.getStackTrace()); logger.debug(ex.getMessage()); } throw ex; } } StringBuilder sb = new StringBuilder(); for(String url: excelImageUrlList) { sb.append(url).append("@@"); } //write back to web browser PrintWriter out = response.getWriter(); response.setContentType("image/jpeg"); String responseText = sb.toString(); out.println(responseText); out.close(); // delete expired images generated from excel StringBuilder filePath = new StringBuilder(); filePath.append(userDir).append("/html/excel/image"); File parent = new File(filePath.toString()); FileUtil.deleteAllDirAndImageFile(parent, filePath.toString(), excelImageReservedTime*1000); } catch (Exception throwable) { if(logger.isDebugEnabled()) { logger.debug(throwable.getStackTrace()); logger.debug(throwable.getMessage()); } } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
ExcelServlet.java
最新推荐文章于 2024-09-27 17:24:11 发布