/*
* 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.system;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import com.wabacus.exception.WabacusRuntimeException;
import com.wabacus.exception.WabacusRuntimeTerminateException;
import com.wabacus.util.Consts;
import com.wabacus.util.Tools;
public class MessageCollector
{
public final static int PROMPT_MODE_ALONE=0;
public final static int PROMPT_MODE_MERGEBEFORE=1;
public final static int PROMPT_MODE_MERGEAFTER=2;
public final static int PROMPT_MODE_MERGEALL=3;
private WabacusResponse wresponse;
private List<Message> lstJsErrorMessages;//存放通过error()提示到前台的信息列表
private List<Message> lstJsWarnMessages;
private List<Message> lstJsAlertMessages;
private List<Message> lstJsSuccessMessages;
private String confirmmessage;
private String confirmkey;//确认提示的KEY
private String confirmurl;
public MessageCollector(WabacusResponse wresponse)
{
lstJsAlertMessages=new ArrayList<Message>();
lstJsSuccessMessages=new ArrayList<Message>();
lstJsWarnMessages=new ArrayList<Message>();
lstJsErrorMessages=new ArrayList<Message>();
this.wresponse=wresponse;
}
public void alert(String alertinfo)
{
alert(alertinfo,null,PROMPT_MODE_MERGEALL,false);
}
public void alert(String alertinfo,String popuparams,boolean isTerminate)
{
alert(alertinfo,popuparams,PROMPT_MODE_MERGEALL,isTerminate);
}
public void alert(String alertinfo,String popuparams,int promptmode,boolean isTerminate)
{
if(!Tools.isEmpty(alertinfo))
{
addMessage(alertinfo,this.lstJsAlertMessages,popuparams,promptmode);
}
if(isTerminate) throw new WabacusRuntimeTerminateException();
}
public void success(String successinfo)
{
success(successinfo,null,PROMPT_MODE_MERGEALL,false);
}
public void success(String successinfo,String popuparams,boolean isTerminate)
{
success(successinfo,popuparams,PROMPT_MODE_MERGEALL,isTerminate);
}
public void success(String successinfo,String popuparams,int promptmode,boolean isTerminate)
{
if(!Tools.isEmpty(successinfo))
{
addMessage(successinfo,this.lstJsSuccessMessages,popuparams,promptmode);
}
if(isTerminate) throw new WabacusRuntimeTerminateException();
}
public void warn(String warnInfo)
{
warn(warnInfo,null,PROMPT_MODE_MERGEALL,false);
}
public void warn(String warninfo,String popuparams,boolean isTerminate)
{
warn(warninfo,popuparams,PROMPT_MODE_MERGEALL,isTerminate);
}
public void warn(String warninfo,String popuparams,int promptmode,boolean isTerminate)
{
if(!Tools.isEmpty(warninfo))
{
addMessage(warninfo,this.lstJsWarnMessages,popuparams,promptmode);
}
if(isTerminate) throw new WabacusRuntimeTerminateException();
}
public void error(String errorInfo)
{
error(errorInfo,null,PROMPT_MODE_MERGEALL,false);
}
public void error(String errorInfo,String popuparams,boolean isTerminate)
{
error(errorInfo,popuparams,PROMPT_MODE_MERGEALL,isTerminate);
}
public void error(String errorInfo,String popuparams,int promptmode,boolean isTerminate)
{
if(!Tools.isEmpty(errorInfo))
{
addMessage(errorInfo,this.lstJsErrorMessages,popuparams,promptmode);
}
wresponse.setStatecode(Consts.STATECODE_FAILED);
if(isTerminate) throw new WabacusRuntimeException();
}
private void addMessage(String message,List<Message> lstOldMessages,String popuparams,int promptmode)
{
if(Tools.isEmpty(message)) return;
Message oldMessObj=lstOldMessages!=null&&lstOldMessages.size()>0?lstOldMessages.get(lstOldMessages.size()-1):null;
if(promptmode==PROMPT_MODE_ALONE||promptmode==PROMPT_MODE_MERGEAFTER||oldMessObj==null||oldMessObj.getPromptMode()==PROMPT_MODE_ALONE
||oldMessObj.getPromptMode()==PROMPT_MODE_MERGEBEFORE)
{
Message messObj=new Message();
messObj.setPopupparams(popuparams);
messObj.setPromptMode(promptmode);
messObj.addMessage(message);
lstOldMessages.add(messObj);
}else
{
oldMessObj.addMessage(message);
if(popuparams!=null) oldMessObj.setPopupparams(popuparams);
}
}
public void confirm(String key,String message)
{
HttpServletRequest request=this.wresponse.getRRequest().getRequest();
if(request==null||message==null||message.trim().equals("")||key==null||key.trim().equals("")) return;
String url=request.getRequestURI();
String sign="?";
Enumeration enumer=request.getParameterNames();
while(enumer.hasMoreElements())
{
String name=(String)enumer.nextElement();
if(name==null||name.trim().equals("")) continue;
String[] values=request.getParameterValues(name);
if(values==null) continue;
for(int i=0;i<values.length;i++)
{
url+=sign+name+"="+values[i];
sign="&";
}
}
this.confirmmessage=message;
this.confirmkey=key;
this.confirmurl=url;
throw new WabacusRuntimeTerminateException();
}
public String promptMessageFirstTime(String defaulterrorprompt)
{
StringBuilder resultBuf=new StringBuilder();
resultBuf.append(promptMessageFirstTime(this.lstJsAlertMessages,"wx_alert",null));
resultBuf.append(promptMessageFirstTime(this.lstJsSuccessMessages,"wx_success",null));
resultBuf.append(promptMessageFirstTime(this.lstJsWarnMessages,"wx_warn",null));
resultBuf.append(promptMessageFirstTime(this.lstJsErrorMessages,"wx_error",defaulterrorprompt));
return resultBuf.toString();
}
private String promptMessageFirstTime(List<Message> lstMessages,String promptcode,String defaultmessage)
{
if(lstMessages==null||lstMessages.size()==0) return "";
StringBuilder resultBuf=new StringBuilder();
String messesTmp;
for(Message messObjTmp:lstMessages)
{
if(messObjTmp==null) continue;
messesTmp=messObjTmp.getMessages("<br/>");
if(Tools.isEmpty(messesTmp)) continue;
resultBuf.append(promptcode+"('"+messesTmp+"',"+messObjTmp.getPopupparams()+");");
}
if(resultBuf.length()==0&&!Tools.isEmpty(defaultmessage)) resultBuf.append(promptcode+"('"+defaultmessage+"');");
return resultBuf.toString();
}
public String promptMessageInNonPage(String defaulterrorprompt)
{
StringBuilder resultBuf=new StringBuilder();
resultBuf.append(promptMessageInNonPage(this.lstJsAlertMessages,null));
resultBuf.append(promptMessageInNonPage(this.lstJsSuccessMessages,null));
resultBuf.append(promptMessageInNonPage(this.lstJsWarnMessages,null));
resultBuf.append(promptMessageInNonPage(this.lstJsErrorMessages,defaulterrorprompt));
return resultBuf.toString();
}
private String promptMessageInNonPage(List<Message> lstMessages,String defaultmessage)
{
if(lstMessages==null||lstMessages.size()==0) return "";
StringBuilder resultBuf=new StringBuilder();
String messesTmp;
for(Message messObjTmp:lstMessages)
{
if(messObjTmp==null) continue;
messesTmp=messObjTmp.getMessages("<br/>");
if(!Tools.isEmpty(messesTmp)) resultBuf.append(messesTmp);//所有Message对象中的信息都直接输出显示,因为这里不是弹出窗口
}
if(resultBuf.length()==0&&!Tools.isEmpty(defaultmessage)) resultBuf.append(defaultmessage);
return resultBuf.toString();
}
public String promptMessageByRefreshJs(String defaulterrorprompt)
{
StringBuilder resultBuf=new StringBuilder();
resultBuf.append(promptMessageByRefreshJs(this.lstJsAlertMessages,"alert",null));
resultBuf.append(promptMessageByRefreshJs(this.lstJsSuccessMessages,"success",null));
resultBuf.append(promptMessageByRefreshJs(this.lstJsWarnMessages,"warn",null));
resultBuf.append(promptMessageByRefreshJs(this.lstJsErrorMessages,"error",defaulterrorprompt));
return resultBuf.toString();
}
private String promptMessageByRefreshJs(List<Message> lstMessages,String paramname,String defaultmessage)
{
if(lstMessages==null||lstMessages.size()==0) return "";
StringBuilder resultBuf=new StringBuilder();
String messesTmp;
for(Message messObjTmp:lstMessages)
{
if(messObjTmp==null) continue;
messesTmp=messObjTmp.getMessages("<br/>");
if(Tools.isEmpty(messesTmp)) continue;
resultBuf.append("{message:'"+messesTmp+"',popupparams:"+messObjTmp.getPopupparams()+"},");
}
if(resultBuf.length()>0&&resultBuf.charAt(resultBuf.length()-1)==',') resultBuf.deleteCharAt(resultBuf.length()-1);
if(resultBuf.length()==0&&!Tools.isEmpty(defaultmessage)) resultBuf.append("{message:'"+defaultmessage+"'}");
return resultBuf.length()>0?paramname+":["+resultBuf.toString()+"],":"";
}
public String getConfirmmessage()
{
return confirmmessage;
}
public String getConfirmkey()
{
return confirmkey;
}
public String getConfirmurl()
{
return confirmurl;
}
private class Message
{
private List<String> lstMessages;
private String popupparams;
private int promptMode;//本组信息提示模式
public String getPopupparams()
{
if(Tools.isEmpty(popupparams)) return "null";
if(!popupparams.startsWith("{")||!popupparams.endsWith("}"))
{
popupparams="{"+popupparams+"}";
}
return popupparams;
}
public String getMessages(String seperator)
{
if(lstMessages==null||lstMessages.size()==0) return "";
if(Tools.isEmpty(seperator)) seperator=" ";
String resultStr="";
for(String messTmp:lstMessages)
{
resultStr+=messTmp+seperator;
}
if(resultStr.endsWith(seperator)) resultStr=resultStr.substring(0,resultStr.length()-seperator.length());
return resultStr;
}
public void setPopupparams(String popupparams)
{
this.popupparams=popupparams;
}
public int getPromptMode()
{
return promptMode;
}
public void setPromptMode(int promptMode)
{
this.promptMode=promptMode;
}
private void addMessage(String message)
{
if(this.lstMessages==null) this.lstMessages=new ArrayList<String>();
if(Tools.isEmpty(message)||this.lstMessages.contains(message)) return;
this.lstMessages.add(message);
}
}
}