ExcelServlet.java

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);
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值