/*
* Copyright (C) 2010---2014 星星(wuweixing)<349446658@qq.com>
*
* This file is part of Wabacus
*
* Wabacus is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.wabacus;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.wabacus.config.Config;
import com.wabacus.config.ConfigLoadManager;
import com.wabacus.config.database.datasource.AbsDataSource;
import com.wabacus.system.assistant.FilePathAssistant;
import com.wabacus.system.assistant.WabacusAssistant;
import com.wabacus.system.dataimport.thread.FileUpDataImportThread;
import com.wabacus.system.task.TimingThread;
import com.wabacus.util.Consts;
import com.wabacus.util.Tools;
import com.wabacus.util.WabacusClassLoader;
public class WabacusServlet extends HttpServlet implements ServletContextListener
{
private static final long serialVersionUID=715456159702221404L;
private static Log log=LogFactory.getLog(WabacusServlet.class);
public void contextInitialized(ServletContextEvent event)
{
closeAllDatasources();
Config.homeAbsPath=event.getServletContext().getRealPath("/");
Config.homeAbsPath=FilePathAssistant.getInstance().standardFilePath(Config.homeAbsPath+"\\");
/*try
{
Config.webroot=event.getServletContext().getContextPath();
if(!Config.webroot.endsWith("/")) Config.webroot+="/";
}catch(NoSuchMethodError e)
{
Config.webroot=null;
}*/
Config.webroot=null;
Config.configpath=event.getServletContext().getInitParameter("configpath");
if(Config.configpath==null||Config.configpath.trim().equals(""))
{
log.info("没有配置存放配置文件的根路径,将使用路径:"+Config.homeAbsPath+"做为配置文件的根路径");
Config.configpath=Config.homeAbsPath;
}else
{
Config.configpath=WabacusAssistant.getInstance().parseConfigPathToRealPath(
Config.configpath,Config.homeAbsPath);
}
loadReportConfigFiles();
FileUpDataImportThread.getInstance().start();
TimingThread.getInstance().start();
}
public void init(ServletConfig config) throws ServletException
{
super.init(config);
// this.context=config.getServletContext();
// closeAllDatasources();//关闭所有的连接池
// Config.homeAbsPath=context.getRealPath("/");
// Config.configpath=config.getInitParameter("configpath");//配置文件存放的物理路径
// Config.configpath=Config.homeAbsPath;
// }
}
public static void loadReportConfigFiles()
{
log.info("正在加载配置文件wabacus.cfg.xml及所有报表配置文件...");
TimingThread.getInstance().reset();
ConfigLoadManager.currentDynClassLoader=new WabacusClassLoader(Thread.currentThread().getContextClassLoader());
int flag=ConfigLoadManager.loadAllReportSystemConfigs();
if(flag==-1)
{
log.error("加载报表配置文件wabacus.cfg.xml失败");
}else if(flag==0)
{
log.warn("报表配置文件wabacus.cfg.xml内容为空,或没有配置报表");
}
}
public void service(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException
{
String contentType=request.getHeader("Content-type");
if(contentType!=null&&contentType.startsWith("multipart/"))
{
WabacusFacade.uploadFile(request,response);
}else
{
String action=Tools.getRequestValue(request,"ACTIONTYPE","");
if(action.equalsIgnoreCase("updateconfig"))
{
loadReportConfigFiles();
PrintWriter out=response.getWriter();
out.println("完成配置文件更新");
}else if(action.equalsIgnoreCase("invokeServerAction"))
{
String resultStr=WabacusFacade.invokeServerAction(request,response);
if(resultStr!=null&&!resultStr.trim().equals(""))
{
PrintWriter out=response.getWriter();
out.println(resultStr);
}
}else if(action.equalsIgnoreCase("ServerValidateOnBlur"))
{//某个输入框onblur后进行服务器端校验
String resultStr=WabacusFacade.doServerValidateOnBlur(request,response);
if(resultStr!=null&&!resultStr.trim().equals(""))
{
PrintWriter out=response.getWriter();
out.println(resultStr);
}
}else if(action.equalsIgnoreCase("download"))
{
WabacusFacade.downloadFile(request,response);
}else if(action.equalsIgnoreCase("GetFilterDataList"))
{
response.reset();
response.setContentType("text/xml;charset="+Config.encode);
StringBuffer sbuffer=new StringBuffer("<?xml version=\"1.0\" encoding=\""+Config.encode+"\"?><items>");
sbuffer.append(WabacusFacade.getFilterDataList(request,response));
sbuffer.append("</items>");
PrintWriter out=response.getWriter();
out.println(sbuffer.toString().trim());
}else if(action.equalsIgnoreCase("GetTypePromptDataList"))
{
response.reset();
response.setContentType("text/xml;charset="+Config.encode);
StringBuffer sbuffer=new StringBuffer("<?xml version=\"1.0\" encoding=\""+Config.encode+"\"?><items>");
sbuffer.append(WabacusFacade.getTypePromptDataList(request,response));
sbuffer.append("</items>");
PrintWriter out=response.getWriter();
out.println(sbuffer.toString().trim());
}else if(action.equalsIgnoreCase("GetSelectBoxDataList"))
{
response.reset();
response.setContentType("text/html;charset="+Config.encode);
String resultStr=WabacusFacade.getSelectBoxDataList(request,response);
PrintWriter out=response.getWriter();
out.print(resultStr);
}else if(action.equalsIgnoreCase(Consts.GETAUTOCOMPLETEDATA_ACTION))
{//获取自动填充表单列的数据
PrintWriter out=response.getWriter();
out.print(WabacusFacade.getAutoCompleteColValues(request,response));
}else if(action.equalsIgnoreCase("ShowUploadFilePage"))
{
PrintWriter out=response.getWriter();
out.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
out.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset="+Config.encode+"\">");
WabacusFacade.showUploadFilePage(request,out);
}else if(action.equalsIgnoreCase("getChartDataString"))
{//获取图形报表数据的<chart/>数据部分
response.reset();
response.setContentType("text/xml;charset="+Config.encode);
StringBuffer sbuffer=new StringBuffer("<?xml version=\"1.0\" encoding=\""+Config.encode+"\"?>");
sbuffer.append(WabacusFacade.getChartDataString(request,response));
PrintWriter out=response.getWriter();
out.println(sbuffer.toString().trim());
}else if(action.equalsIgnoreCase("loadChartXmlFile"))
{
response.reset();
response.setContentType("text/xml;charset="+Config.encode);
StringBuffer sbuffer=new StringBuffer("<?xml version=\"1.0\" encoding=\""+Config.encode+"\"?>");
sbuffer.append(WabacusFacade.getChartDataStringFromLocalFile(request,response));
PrintWriter out=response.getWriter();
out.println(sbuffer.toString().trim());
}else
{
int itype=Integer.parseInt(Tools.getRequestValue(request,Consts.DISPLAYTYPE_PARAMNAME,String.valueOf(Consts.DISPLAY_ON_PAGE)));
if(itype==Consts.DISPLAY_ON_PRINT)
{
WabacusFacade.printComponents(request,response);
}else if(itype==Consts.DISPLAY_ON_PLAINEXCEL)
{//下载纯数据
WabacusFacade.exportReportDataOnPlainExcel(request,response);
}else if(itype==Consts.DISPLAY_ON_RICHEXCEL)
{
WabacusFacade.exportReportDataOnWordRichexcel(request,response,Consts.DISPLAY_ON_RICHEXCEL);
}else if(itype==Consts.DISPLAY_ON_WORD)
{
WabacusFacade.exportReportDataOnWordRichexcel(request,response,Consts.DISPLAY_ON_WORD);
}else if(itype==Consts.DISPLAY_ON_PDF)
{
WabacusFacade.exportReportDataOnPDF(request,response,Consts.DISPLAY_ON_PDF);
}else
{
WabacusFacade.displayReport(request,response);
}
}
}
}
public void destroy()
{
}
public void contextDestroyed(ServletContextEvent event)
{
closeAllDatasources();
FileUpDataImportThread.getInstance().stopRunning();
TimingThread.getInstance().stopRunning();
}
private void closeAllDatasources()
{
Map<String,AbsDataSource> mDataSourcesTmp=Config.getInstance().getMDataSources();
if(mDataSourcesTmp!=null)
{
for(Entry<String,AbsDataSource> entry:mDataSourcesTmp.entrySet())
{
if(entry.getValue()!=null)
entry.getValue().closePool();
}
}
}
}