com.pureinfo.srm.reports.table.data.pinggu.PingGuReportsTasker.java Source code

Java tutorial

Introduction

Here is the source code for com.pureinfo.srm.reports.table.data.pinggu.PingGuReportsTasker.java

Source

/**
 * PureInfo Command-phase2
 * @(#)PingGuReportsTasker.java   1.0 2008-6-4
 * 
 * Copyright(c) 2004-2005, PureInfo Information Technology Corp. Ltd. 
 * All rights reserved, see the license file.
 * 
 * www.pureinfo.com.cn
 */

package com.pureinfo.srm.reports.table.data.pinggu;

import java.io.FileOutputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.TimerTask;

import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import com.pureinfo.ark.ArkHelper;
import com.pureinfo.ark.content.ArkContentHelper;
import com.pureinfo.ark.interaction.list.ColumnInfo;
import com.pureinfo.ark.interaction.list.ListHelper;
import com.pureinfo.common.sender.SenderHelper;
import com.pureinfo.common.sender.model.ISender;
import com.pureinfo.common.sender.model.SentInfo;
import com.pureinfo.dolphin.context.LocalContextHelper;
import com.pureinfo.dolphin.export.ExportHelper;
import com.pureinfo.dolphin.export.IConvertor;
import com.pureinfo.dolphin.export.impl.SceneryConvertorImpl;
import com.pureinfo.dolphin.export.model.DolphinExportGoods;
import com.pureinfo.dolphin.model.IObjects;
import com.pureinfo.force.PureFactory;
import com.pureinfo.force.PureSystem;
import com.pureinfo.force.exception.PureException;
import com.pureinfo.force.fileserver.FileFactory;
import com.pureinfo.srm.SRMTypes;
import com.pureinfo.srm.auth.domain.ISRMUserMgr;
import com.pureinfo.srm.auth.model.SRMUser;
import com.pureinfo.srm.reports.table.data.pinggu.constants.PingGuConstants;
import com.pureinfo.srm.reports.table.data.pinggu.form.PingGuParameterVO;
import com.pureinfo.srm.reports.table.data.pinggu.reporter.ReportsBase;

/**
 * <P>
 * Created on 2008-6-4 10:45:29<BR>
 * Last modified on 2008-6-4
 * </P>
 * TODO describe PingGuReportsTasker here ...
 * 
 * @author sunjie
 * @version 1.0, 2008-6-4
 * @since Command-phase2 1.0
 */
public class PingGuReportsTasker extends TimerTask {
    FileFactory factory = FileFactory.getInstance();

    private SRMUser user;

    private PingGuParameterVO parameterVO;

    private Logger logger = Logger.getLogger(this.getClass().getName());

    private Set exportBeanSet = new LinkedHashSet();

    /**
     * Returns the user.
     * 
     * @return the user.
     */
    public SRMUser getUser() {
        return user;
    }

    /**
     * Sets the user.
     * 
     * @param _user
     *            the user to set.
     */
    public void setUser(SRMUser _user) {
        user = _user;
    }

    /**
     * Returns the parameterVO.
     * 
     * @return the parameterVO.
     */
    public PingGuParameterVO getParameterVO() {
        return parameterVO;
    }

    /**
     * Sets the parameterVO.
     * 
     * @param _parameterVO
     *            the parameterVO to set.
     */
    public void setParameterVO(PingGuParameterVO _parameterVO) {
        parameterVO = _parameterVO;
    }

    /**
     * @see java.util.TimerTask#run()
     */
    public void run() {
        logger.debug("run...");

        ArkHelper.setLoginUser(user);

        init();

        LocalContextHelper.setAttribute(PingGuConstants.ATTRIBUTE_NAME_OF_PARAMETER, parameterVO);

        String sTempFile = null;
        OutputStream fos = null;
        StringBuffer msg = new StringBuffer();
        String sFileName;
        Date startDate = new Date();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String title = formatter.format(startDate) + "";
        try {
            sFileName = "";
            title += sFileName + "(" + parameterVO.getDeptCode() + ")";

            String sFileExt = ".xls";
            IMultiSheetExporter exporter = (IMultiSheetExporter) PureFactory.getBean("ExcelExporterMultiSheet");
            long totalTime = 0, startTime = startDate.getTime();

            // to expor the data into temporay file
            sTempFile = factory.getNextFileName("EX", sFileExt, true);

            logger.debug("the file name:" + sTempFile);

            HSSFWorkbook book = new HSSFWorkbook();
            StringBuffer errorBuffer = new StringBuffer();
            for (Iterator iterator = exportBeanSet.iterator(); iterator.hasNext();) {
                DolphinExportGoods goods = new DolphinExportGoods();
                ReportsBase report = (ReportsBase) iterator.next();

                IConvertor convertor = new SceneryConvertorImpl(report.getExportSenery(), "content");
                IObjects objs = null;
                try {
                    objs = report.getObjs();
                    List colInfos = getColsInfo(report);

                    String[] headers = new String[colInfos.size()];
                    String[] properties = new String[colInfos.size()];
                    for (int i = 0; i < colInfos.size(); i++) {
                        ColumnInfo colInfo = (ColumnInfo) colInfos.get(i);
                        String sHeader = colInfo.getTitle();
                        headers[i] = sHeader.replaceAll("[\\\\\\[\\]\\?/<>]+", "_");
                        properties[i] = colInfo.getName();
                    }

                    goods.setType(ExportHelper.TYPE_EXCEL);
                    goods.setName(report.getReportName());
                    goods.setHeaders(headers);
                    goods.setData(objs, properties, convertor);

                    exporter.export(book, goods);

                } catch (Exception e) {
                    logger.error("===============export error.", e);
                    errorBuffer.append(report.getReportName() + ":" + e.getMessage() + "\n\n");
                } finally {
                    if (objs != null)
                        objs.clear();
                    goods.clear();
                }

            }

            fos = new FileOutputStream(sTempFile);
            book.write(fos);
            fos.flush();
            fos.close();
            fos = null;

            totalTime = new Date().getTime() - startTime;

            msg.append("\n" + sFileName + "\n" + getUrl(sTempFile));
            msg.append("\n" + ((totalTime) / 60000.0) + " .");
            msg.append("\n0.\n");
            if (errorBuffer.length() != 0) {
                msg.append("------------------------------------\n\n");
                msg.append("\n");
                msg.append(errorBuffer.toString());
            }
            msg.append("------------------------------------\n\n");
            msg.append(
                    "\nexcel6553565535");
        } catch (Exception ex) {
            logger.error("failed to export data", ex);
            msg.append("\n" + ex.getMessage());
        } finally {
            if (fos != null)
                try {
                    fos.close();
                } catch (Exception ex) {
                }
            sendSysMsg(msg.toString(), title);
        }

    }

    /**
     * @param report
     * @return
     * @throws PureException
     */
    private List getColsInfo(ReportsBase report) throws PureException {
        List colInfos;
        ListHelper lh = new ListHelper();
        String sClassName = report.getEntityMetadata().getName();
        List baseCols = null;
        lh.setSenery(report.getExportSenery());
        lh.setAct("content");
        baseCols = lh.prepareBase(sClassName);

        colInfos = lh.prepareColsInfo(baseCols, null, null, null, sClassName, false);
        return colInfos;
    }

    private void init() {
        String[] fieldClassesName = PureSystem.getProperty("pinggu.baobiao.class").split(",");

        for (int i = 0; i < fieldClassesName.length; i++) {
            Class fieldClass = null;
            try {
                fieldClass = Class.forName(fieldClassesName[i]);
                ReportsBase reporter = (ReportsBase) fieldClass.newInstance();
                reporter.parameter = parameterVO;
                exportBeanSet.add(reporter);

                logger.debug("to add export bean:" + reporter);

            } catch (InstantiationException ex) {
                logger.error(ex);
            } catch (IllegalAccessException ex) {
                logger.error(ex);
            } catch (ClassNotFoundException ex) {
                logger.error(ex);
            }
        }
    }

    /**
     * @return
     * @throws PureException
     */
    private String getUrl(String sTempFile) throws PureException {
        String sUrl = PureSystem.getProperty("srm.url");
        int nPos = sUrl.indexOf('/', 8);
        if (nPos > 0) {
            sUrl = sUrl.substring(0, nPos);
        }
        return sUrl += factory.mapHttpPath(sTempFile, true);
    }

    private void sendSysMsg(String _sMsg, String _title) {
        try {
            if (user == null) {
                return;
            }
            SentInfo sentInfo = new SentInfo();
            ISRMUserMgr m = (ISRMUserMgr) ArkContentHelper.getContentMgrOf(SRMTypes.SRMUSER);
            SRMUser systemAdmin = (SRMUser) m.lookupByName("super-admin");
            sentInfo.setFromAddress(systemAdmin == null ? "1" : String.valueOf(systemAdmin.getId()));
            sentInfo.setFromPerson("SYSTEM");

            sentInfo.setToAddress(String.valueOf(user.getId()));
            sentInfo.setToPerson(user.getTrueName());
            sentInfo.setSubject(_title);
            sentInfo.setContent(_sMsg);

            ISender sysSender = SenderHelper.getSender(SenderHelper.TYPE_SYSTEM);
            sysSender.send(sentInfo);
        } catch (PureException e) {
            logger.error(e);
        }
    }
}