com.wabacus.system.WabacusResponse.java Source code

Java tutorial

Introduction

Here is the source code for com.wabacus.system.WabacusResponse.java

Source

/* 
 * 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.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspWriter;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.wabacus.config.Config;
import com.wabacus.exception.WabacusRuntimeException;
import com.wabacus.exception.WabacusRuntimeTerminateException;
import com.wabacus.system.assistant.WabacusAssistant;
import com.wabacus.system.component.application.report.chart.FusionChartsReportType;
import com.wabacus.util.Consts;
import com.wabacus.util.Consts_Private;
import com.wabacus.util.Tools;

public class WabacusResponse {
    private static Log log = LogFactory.getLog(WabacusResponse.class);

    private PrintWriter out;

    private JspWriter jspout;

    private StringBuilder outBuf;

    private ReportRequest rrequest;

    private MessageCollector messageCollector;

    private int statecode = Consts.STATECODE_SUCCESS;

    private List<String[]> lstSuccessOnloadMethods;

    private List<String[]> lstFailedOnloadMethods;

    private Map<String, List<String[]>> mChartOnloadMethods;

    private Map<String, DisplayInputboxBean> mDisplayInputboxsOnload;//??onload?

    private Set<String> sChildSelectboxidsOnload;

    private List<String> lstUpdateReportGuids;

    private String dynamicRefreshComponentGuid;

    private String dynamicSlaveReportId;

    private HttpServletResponse response;

    private boolean hasInitOutput;//?

    public WabacusResponse(HttpServletResponse response) {
        this.response = response;
        messageCollector = new MessageCollector(this);
    }

    public MessageCollector getMessageCollector() {
        return messageCollector;
    }

    public void clearOnloadMethod() {
        this.lstSuccessOnloadMethods = null;
        this.lstFailedOnloadMethods = null;
    }

    public void addOnloadMethod(String methodname, Map<String, String> mParams, boolean isInsertFirst) {
        addOnloadMethod(methodname, mParams, isInsertFirst, Consts.STATECODE_SUCCESS);
    }

    public void addOnloadMethod(String methodname, String methodparams, boolean isInsertFirst) {
        addOnloadMethod(methodname, methodparams, isInsertFirst, Consts.STATECODE_SUCCESS);
    }

    public void addOnloadMethod(String methodname, Map<String, String> mParams, boolean isInsertFirst,
            int statecode) {
        StringBuffer paramsBuf = new StringBuffer();
        if (mParams != null) {
            for (Entry<String, String> entryTmp : mParams.entrySet()) {
                paramsBuf.append(entryTmp.getKey()).append(":\"").append(entryTmp.getValue()).append("\",");
            }
        }
        String params = paramsBuf.toString();
        if (!params.trim().equals(""))
            params = "{" + params + "}";
        addOnloadMethod(methodname, params, isInsertFirst, statecode);
    }

    public void addOnloadMethod(String methodname, String methodparams, boolean isInsertFirst, int statecode) {
        if (methodname == null || methodname.trim().equals(""))
            return;
        if (methodparams != null && !methodparams.trim().equals("")) {
            methodparams = methodparams.trim();
            if (!methodparams.startsWith("{") || !methodparams.endsWith("}")) {
                methodparams = "{" + methodparams + "}";
            }
        }
        String[] methodArr = new String[] { methodname, methodparams };
        if (this.lstFailedOnloadMethods == null)
            this.lstFailedOnloadMethods = new ArrayList<String[]>();
        if (this.lstSuccessOnloadMethods == null)
            this.lstSuccessOnloadMethods = new ArrayList<String[]>();
        if (statecode == Consts.STATECODE_FAILED) {
            if (isInsertFirst) {
                lstFailedOnloadMethods.add(0, methodArr);
            } else {
                lstFailedOnloadMethods.add(methodArr);
            }
        } else if (statecode == Consts.STATECODE_SUCCESS) {//??
            if (isInsertFirst) {
                lstSuccessOnloadMethods.add(0, methodArr);
            } else {
                lstSuccessOnloadMethods.add(methodArr);
            }
        } else {
            if (isInsertFirst) {
                lstSuccessOnloadMethods.add(0, methodArr);
                lstFailedOnloadMethods.add(0, methodArr);
            } else {//??
                lstSuccessOnloadMethods.add(methodArr);
                lstFailedOnloadMethods.add(methodArr);
            }
        }
    }

    public void addChartOnloadMethod(String reportid, String methodname, String methodparams,
            boolean isInsertFirst) {
        FusionChartsReportType fcreportTypeObj = (FusionChartsReportType) rrequest
                .getDisplayReportTypeObj(reportid);
        if (fcreportTypeObj.getFcrbean().isLinkChart()) {
            throw new WabacusRuntimeException("" + fcreportTypeObj.getReportBean().getPath()
                    + "linkchart?chartonload");
        }
        if (this.mChartOnloadMethods == null)
            this.mChartOnloadMethods = new HashMap<String, List<String[]>>();
        if (methodparams != null && !methodparams.trim().equals("")) {
            methodparams = methodparams.trim();
            if (!methodparams.startsWith("{") || !methodparams.endsWith("}")) {
                methodparams = "{" + methodparams + "}";
            }
        }
        List<String[]> lstMethods = this.mChartOnloadMethods.get(reportid);
        if (lstMethods == null) {
            lstMethods = new ArrayList<String[]>();
            this.mChartOnloadMethods.put(reportid, lstMethods);
        }
        if (isInsertFirst) {
            lstMethods.add(0, new String[] { methodname, methodparams });
        } else {
            lstMethods.add(new String[] { methodname, methodparams });
        }
    }

    public List<String[]> getLstChartOnloadMethods(String reportid) {
        if (this.mChartOnloadMethods == null)
            return null;
        return this.mChartOnloadMethods.get(reportid);
    }

    public HttpServletResponse getResponse() {
        return response;
    }

    public void setResponse(HttpServletResponse response) {
        this.response = response;
    }

    public StringBuilder getOutBuf() {
        return outBuf;
    }

    public int getStatecode() {
        return statecode;
    }

    public void setStatecode(int statecode) {
        if (statecode != Consts.STATECODE_NONREFRESHPAGE && statecode != Consts.STATECODE_FAILED
                && statecode != Consts.STATECODE_SUCCESS) {
            log.warn("???" + statecode + "?????");
            statecode = Consts.STATECODE_SUCCESS;
        }
        this.statecode = statecode;
    }

    public void terminateResponse(int statecode) {
        setStatecode(statecode);
        throw new WabacusRuntimeTerminateException();
    }

    public void addUpdateReportGuid(String reportguid) {
        if (reportguid == null || reportguid.trim().equals(""))
            return;
        if (this.lstUpdateReportGuids == null) {
            this.lstUpdateReportGuids = new ArrayList<String>();
        } else if (this.lstUpdateReportGuids.contains(reportguid)) {
            return;
        }
        this.lstUpdateReportGuids.add(reportguid);
    }

    public ReportRequest getRRequest() {
        return rrequest;
    }

    public void setRRequest(ReportRequest rrequest) {
        this.rrequest = rrequest;
    }

    public void setJspout(JspWriter jspout) {
        this.jspout = jspout;
    }

    public String invokeOnloadMethodsFirstTime() {
        List<String[]> lstOnloadMethods = getLstRealOnloadMethods();
        if (lstOnloadMethods == null || lstOnloadMethods.size() == 0)
            return "";
        StringBuffer resultBuf = new StringBuffer();
        for (String[] methodTmp : lstOnloadMethods) {
            if (methodTmp == null || methodTmp.length != 2)
                continue;
            resultBuf.append(methodTmp[0]).append("(");
            if (methodTmp[1] != null && !methodTmp[1].trim().equals("")) {
                resultBuf.append(methodTmp[1]);
            }
            resultBuf.append(");");
        }
        return resultBuf.toString();
    }

    public String assembleResultsInfo(Throwable t) {
        String defaultErrorPrompt = null;
        if (t != null && !(t instanceof WabacusRuntimeTerminateException)) {
            defaultErrorPrompt = Config.getInstance().getResources().getString(rrequest, rrequest.getPagebean(),
                    Consts.LOADERROR_MESS_KEY, false);
            if (Tools.isEmpty(defaultErrorPrompt)) {
                defaultErrorPrompt = "<strong>System is busy,Please try later</strong>";
            } else {
                defaultErrorPrompt = rrequest.getI18NStringValue(defaultErrorPrompt.trim());
            }
        }
        if (rrequest.getPagebean() == null) {
            log.error("?" + rrequest.getStringAttribute("PAGEID", "") + "??");
            return "?" + rrequest.getStringAttribute("PAGEID", "") + "??";
        }
        StringBuilder resultBuf = new StringBuilder();
        resultBuf.append(showPageUrlSpan());//URL??onload?
        if (!rrequest.isLoadedByAjax() || (rrequest.getShowtype() != Consts.DISPLAY_ON_PAGE
                && rrequest.getShowtype() != Consts.DISPLAY_ON_PRINT)) {
            if (rrequest.getShowtype() == Consts.DISPLAY_ON_PAGE) {
                String promptmessages = this.messageCollector.promptMessageFirstTime(defaultErrorPrompt);
                if (!Tools.isEmpty(promptmessages)) {
                    resultBuf.append("<span style='display:none'>templary</span>");
                    resultBuf.append("<script type=\"text/javascript\">");
                    resultBuf.append(promptmessages);
                    resultBuf.append("</script>");
                }
            } else {
                resultBuf.append(this.messageCollector.promptMessageInNonPage(defaultErrorPrompt));
            }
        } else {
            String pageid = rrequest.getPagebean().getId();
            resultBuf.append("<RESULTS_INFO-").append(pageid).append(">").append("{");
            String confirmessage = this.messageCollector.getConfirmmessage();
            if (confirmessage != null && !confirmessage.trim().equals("")) {
                resultBuf.append("confirmessage:\"").append(confirmessage).append("\"");
                resultBuf.append(",confirmkey:\"").append(this.messageCollector.getConfirmkey()).append("\"");
                resultBuf.append(",confirmurl:\"").append(this.messageCollector.getConfirmurl()).append("\"");
            } else {
                resultBuf.append("pageurl:\"").append(rrequest.getUrl()).append("\",");
                if (rrequest.getPagebean().isShouldProvideEncodePageUrl()) {
                    resultBuf.append("pageEncodeUrl:\"")
                            .append(Tools.convertBetweenStringAndAscii(rrequest.getUrl(), true)).append("\",");
                }
                if (dynamicRefreshComponentGuid != null && !dynamicRefreshComponentGuid.trim().equals("")) {//?ID
                    resultBuf.append("dynamicRefreshComponentGuid:\"").append(dynamicRefreshComponentGuid)
                            .append("\",");
                    if (dynamicSlaveReportId != null && !dynamicSlaveReportId.trim().equals("")) {
                        resultBuf.append("dynamicSlaveReportId:\"").append(dynamicSlaveReportId).append("\",");
                    }
                }
                resultBuf.append("statecode:").append(this.statecode).append(",");
                resultBuf.append(this.messageCollector.promptMessageByRefreshJs(defaultErrorPrompt));
                List<String[]> lstOnloadMethods = getLstRealOnloadMethods();
                if (lstOnloadMethods != null && lstOnloadMethods.size() > 0) {
                    resultBuf.append("onloadMethods:[");
                    for (String[] methodTmp : lstOnloadMethods) {
                        if (methodTmp == null || methodTmp.length != 2)
                            continue;
                        resultBuf.append("{methodname:").append(methodTmp[0]);
                        if (methodTmp[1] != null && !methodTmp[1].trim().equals("")) {
                            resultBuf.append(",methodparams:").append(methodTmp[1]);
                        }
                        resultBuf.append("},");
                    }
                    if (resultBuf.charAt(resultBuf.length() - 1) == ',') {
                        resultBuf.deleteCharAt(resultBuf.length() - 1);
                    }
                    resultBuf.append("],");
                }
                if (lstUpdateReportGuids != null && lstUpdateReportGuids.size() > 0) {//GUID
                    resultBuf.append("updateReportGuids:[");
                    for (String rguidTmp : lstUpdateReportGuids) {
                        resultBuf.append("{value:\"").append(rguidTmp).append("\"},");
                    }
                    if (resultBuf.charAt(resultBuf.length() - 1) == ',') {
                        resultBuf.deleteCharAt(resultBuf.length() - 1);
                    }
                    resultBuf.append("],");
                }
                if (resultBuf.charAt(resultBuf.length() - 1) == ',') {
                    resultBuf.deleteCharAt(resultBuf.length() - 1);
                }
            }
            resultBuf.append("}").append("</RESULTS_INFO-").append(pageid).append(">");
        }
        return resultBuf.toString();
    }

    private boolean hasDisplayPageUrlSpan = false;

    public String showPageUrlSpan() {
        if (hasDisplayPageUrlSpan)
            return "";
        hasDisplayPageUrlSpan = true;
        if (rrequest.getShowtype() == Consts.DISPLAY_ON_PAGE && (!rrequest.isLoadedByAjax()
                || rrequest.getStringAttribute("WX_ISOUTERPAGE", "").equals("true"))) {//??URL?refreshComponent()??refreshComponent()???URL<span/>URL
            String pageurlspan = "<span id=\"" + rrequest.getPagebean().getId()
                    + "_url_id\" style=\"display:none;\" value=\""
                    + Tools.htmlEncode(Tools.jsParamEncode(rrequest.getUrl())) + "\"";
            if (rrequest.getPagebean().isShouldProvideEncodePageUrl()) {
                pageurlspan = pageurlspan + " encodevalue=\""
                        + Tools.convertBetweenStringAndAscii(rrequest.getUrl(), true) + "\"";
            }
            String ancestorUrls = rrequest.getStringAttribute("ancestorPageUrls", "");
            if (!ancestorUrls.equals("")) {
                pageurlspan = pageurlspan + " ancestorPageUrls=\"" + ancestorUrls + "\"";
            }
            return pageurlspan + "></span>";
        }
        return "";
    }

    private List<String[]> getLstRealOnloadMethods() {
        if (this.statecode == Consts.STATECODE_FAILED)
            return this.lstFailedOnloadMethods;
        List<String[]> lstOnloadMethodsResult = new ArrayList<String[]>();
        if (this.lstSuccessOnloadMethods != null)
            lstOnloadMethodsResult.addAll(this.lstSuccessOnloadMethods);
        String[] displayInputboxMethod = getDisplayInputboxOnloadMethod();
        if (displayInputboxMethod != null)
            lstOnloadMethodsResult.add(displayInputboxMethod);
        String[] initChildSelectboxMethod = getInitChildSelectboxIdsOnloadMethod();
        if (initChildSelectboxMethod != null)
            lstOnloadMethodsResult.add(initChildSelectboxMethod);
        return lstOnloadMethodsResult;
    }

    public void setDynamicRefreshComponentGuid(String componentguid, String slaveReportId) {
        this.dynamicRefreshComponentGuid = componentguid;
        this.dynamicSlaveReportId = slaveReportId;
    }

    public boolean isOutputImmediately() {
        return this.response != null;
    }

    public void initOutput(String attachFilename) {
        hasInitOutput = true;
        if (response != null && rrequest.getRequest() != null && !rrequest.isExportToLocalFile()) {//?????
            rrequest.getRequest().getSession();
            if (rrequest.getShowtype() == Consts.DISPLAY_ON_RICHEXCEL
                    || rrequest.getShowtype() == Consts.DISPLAY_ON_WORD) {
                String filesuffix = rrequest.getShowtype() == Consts.DISPLAY_ON_RICHEXCEL ? ".xls" : ".doc";
                attachFilename = WabacusAssistant.getInstance().encodeAttachFilename(rrequest.getRequest(),
                        attachFilename);
                response.setHeader("Content-disposition", "attachment;filename=" + attachFilename + filesuffix);
            }
            try {
                out = response.getWriter();
            } catch (IOException e) {
                throw new WabacusRuntimeException("??", e);
            }
            if (rrequest.getShowtype() != Consts.DISPLAY_ON_PRINT) {
                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 + "\">");
            }
        } else {
            this.outBuf = new StringBuilder();
            outBuf.append(
                    "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
            outBuf.append(
                    "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=" + Config.encode + "\">");
        }
    }

    public void println(String content) {
        println(content, false);
    }

    public void println(String content, boolean overwrite) {
        if (!hasInitOutput)
            initOutput(null);
        if (content == null)
            return;
        content = Tools.replaceAll(content, Consts_Private.SKIN_PLACEHOLDER, rrequest.getPageskin());
        if (rrequest.getShowtype() == Consts.DISPLAY_ON_RICHEXCEL
                || rrequest.getShowtype() == Consts.DISPLAY_ON_WORD
                || rrequest.getShowtype() == Consts.DISPLAY_ON_PRINT) {
            content = WabacusAssistant.getInstance().replaceAllImgPathInExportDataFile(rrequest.getRequest(),
                    content);
        }
        if (rrequest.isExportToLocalFile()) {//???
            if (overwrite)
                outBuf = new StringBuilder();
            outBuf.append(content);
            if (outBuf.length() > 10240)
                writeBufDataToLocalFile();
        } else if (jspout != null) {//?<wx:report/>jsp?out
            try {
                jspout.println(content);
            } catch (IOException e) {
                log.debug("??" + content + "", e);
                jspout = null;
                if (out != null) {
                    out.println(content);
                } else {
                    if (overwrite)
                        outBuf = new StringBuilder();
                    outBuf.append(content);
                }
            }
        } else if (out != null) {
            out.println(content);
        } else {
            if (overwrite)
                outBuf = new StringBuilder();
            outBuf.append(content);
        }
        /*if(mReportsWithIncludePage!=null&&mReportsWithIncludePage.size()>0)
        {
        String starttagTmp=ReportAssistant.getInstance().getStartTagOfIncludeFilePlaceholder(rrequest.getPagebean());
        String endtagTmp=ReportAssistant.getInstance().getEndTagOfIncludeFilePlaceholder(rrequest.getPagebean());
        int idx=content.indexOf(starttagTmp);
        String reportidTmp;
        AbsReportType reportTypeObjTmp;
        *
         * ????<tag>reportid</tag><tag></tag>starttagTmpendtagTmp
         *//*
            String dynTplPathTmp=null;
            while(true)
            {
             if(idx<0) break;
             out.println(content.substring(0,idx));
             content=content.substring(idx+starttagTmp.length());
             idx=content.indexOf(endtagTmp);
             if(idx<0) break;
             reportidTmp=content.substring(0,idx);
             if(reportidTmp==null||reportidTmp.trim().equals("")||!this.mReportsWithIncludePage.containsKey(reportidTmp))
             {
                 idx=content.indexOf(starttagTmp);
                 continue;
             }
             reportTypeObjTmp=mReportsWithIncludePage.get(reportidTmp);
             rrequest.getRequest().setAttribute("WX_COMPONENT_OBJ",reportTypeObjTmp);
             if(rrequest.getShowtype()==Consts.DISPLAY_ON_PAGE)
             {
                 dynTplPathTmp=reportTypeObjTmp.getReportBean().getDynTplPath();
             }else
             {
                 dynTplPathTmp=reportTypeObjTmp.getReportBean().getDynDataExportTplPath();
             }
             RequestDispatcher rd=rrequest.getRequest().getRequestDispatcher(dynTplPathTmp);
             rd.include(rrequest.getRequest(),response);
             content=content.substring(idx+endtagTmp.length());
             idx=content.indexOf(starttagTmp);
            }
            }*/
    }

    public void print(String content) {
        print(content, false);
    }

    public void print(String content, boolean overwrite) {
        if (!hasInitOutput)
            initOutput(null);
        if (content == null)
            return;
        content = Tools.replaceAll(content, Consts_Private.SKIN_PLACEHOLDER, rrequest.getPageskin());
        if (rrequest.getShowtype() == Consts.DISPLAY_ON_RICHEXCEL
                || rrequest.getShowtype() == Consts.DISPLAY_ON_WORD
                || rrequest.getShowtype() == Consts.DISPLAY_ON_PRINT) {
            content = WabacusAssistant.getInstance().replaceAllImgPathInExportDataFile(rrequest.getRequest(),
                    content);
        }
        if (rrequest.isExportToLocalFile()) {
            if (overwrite)
                outBuf = new StringBuilder();
            outBuf.append(content);
            if (outBuf.length() > 10240)
                writeBufDataToLocalFile();
        } else if (jspout != null) {//?<wx:report/>jsp?out
            try {
                jspout.print(content);
            } catch (IOException e) {
                log.debug("??" + content + "", e);
                jspout = null;
                if (out != null) {
                    out.print(content);
                } else {
                    if (overwrite)
                        outBuf = new StringBuilder();
                    outBuf.append(content);
                }
            }
        } else if (out != null) {
            out.print(content);
        } else {
            if (overwrite)
                outBuf = new StringBuilder();
            outBuf.append(content);
        }
    }

    public void writeBufDataToLocalFile() {
        if (!rrequest.isExportToLocalFile() || this.outBuf.length() == 0)
            return;
        BufferedWriter dataExportFileWriter = null;
        try {
            dataExportFileWriter = new BufferedWriter(new OutputStreamWriter(
                    new FileOutputStream(new File(rrequest.getDataExportFilepath()), true), Config.encode));
            dataExportFileWriter.write(this.outBuf.toString());
            this.outBuf = new StringBuilder();
        } catch (Exception e) {//?????
            throw new WabacusRuntimeException(
                    "??" + rrequest.getDataExportFilepath() + "", e);
        } finally {
            try {
                if (dataExportFileWriter != null)
                    dataExportFileWriter.close();
            } catch (IOException e) {
                throw new WabacusRuntimeException(
                        "??" + rrequest.getDataExportFilepath() + "",
                        e);
            }
        }
    }

    public void sendRedirect(String url) {
        if (url == null || url.trim().equals(""))
            return;
        if (!rrequest.isLoadedByAjax()) {
            try {
                this.response.sendRedirect(url);
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            this.addOnloadMethod("wx_sendRedirect", "{url:\"" + url + "\"}", false);
        }
        throw new WabacusRuntimeTerminateException();
    }

    public void terminateResponse() {
        throw new WabacusRuntimeTerminateException();
    }

    public void addChildInputboxIdsToOnload(List<String> lstRealChildids) {
        if (Tools.isEmpty(lstRealChildids))
            return;
        if (sChildSelectboxidsOnload == null)
            sChildSelectboxidsOnload = new HashSet<String>();
        this.sChildSelectboxidsOnload.addAll(lstRealChildids);
    }

    private String[] getInitChildSelectboxIdsOnloadMethod() {
        if (Tools.isEmpty(sChildSelectboxidsOnload))
            return null;
        StringBuilder bufTmp = new StringBuilder();
        for (String childidTmp : this.sChildSelectboxidsOnload) {
            if (Tools.isEmpty(childidTmp))
                continue;
            bufTmp.append(childidTmp).append(";");
        }
        if (bufTmp.length() > 0 && bufTmp.charAt(bufTmp.length() - 1) == ';')
            bufTmp.deleteCharAt(bufTmp.length() - 1);
        return bufTmp.length() > 0
                ? new String[] { "wx_showChildSelectboxOptionsOnload", "{childids:'" + bufTmp.toString() + "'}" }
                : null;
    }

    public void addDisplayInputbox(String ownerid, String realInputboxid, Set<String> lstParentIds) {
        if (this.mDisplayInputboxsOnload == null)
            this.mDisplayInputboxsOnload = new HashMap<String, DisplayInputboxBean>();
        DisplayInputboxBean dibean = this.mDisplayInputboxsOnload.get(ownerid);
        if (dibean == null) {
            dibean = new DisplayInputboxBean();
            dibean.setLstParentInputboxId(lstParentIds);
            this.mDisplayInputboxsOnload.put(ownerid, dibean);
        }
        List<String> lstInputboxIds = dibean.getLstInputboxIds();
        if (lstInputboxIds == null) {
            lstInputboxIds = new ArrayList<String>();
            dibean.setLstInputboxIds(lstInputboxIds);
        }
        if (!lstInputboxIds.contains(realInputboxid))
            lstInputboxIds.add(realInputboxid);
    }

    private String[] getDisplayInputboxOnloadMethod() {
        if (this.mDisplayInputboxsOnload == null || this.mDisplayInputboxsOnload.size() == 0)
            return null;
        Map<String, DisplayInputboxBean> mTmp1 = new HashMap<String, DisplayInputboxBean>();
        mTmp1.putAll(this.mDisplayInputboxsOnload);
        Map<String, DisplayInputboxBean> mNonDisplayedInputBox = new HashMap<String, DisplayInputboxBean>();
        DisplayInputboxBean dibTmp;
        StringBuilder bufTmp = new StringBuilder();
        while (mTmp1.size() > 0) {
            mNonDisplayedInputBox.clear();
            mNonDisplayedInputBox.putAll(mTmp1);
            for (Entry<String, DisplayInputboxBean> entryTmp : mTmp1.entrySet()) {
                dibTmp = entryTmp.getValue();
                if (isDisplayedAllParentInputbox(mNonDisplayedInputBox, dibTmp.getLstParentInputboxId())) {
                    bufTmp.append(dibTmp.getInputBoxIdsAsString());
                    mNonDisplayedInputBox.remove(entryTmp.getKey());
                }
            }
            if (mNonDisplayedInputBox.size() == mTmp1.size() && mNonDisplayedInputBox.size() > 0) {
                throw new WabacusRuntimeException("?");
            }
            mTmp1.clear();
            mTmp1.putAll(mNonDisplayedInputBox);
        }
        if (bufTmp.length() == 0)
            return null;
        return new String[] { "showComboxAddOptionsOnload", "{ids:'" + bufTmp.toString() + "'}" };
    }

    private boolean isDisplayedAllParentInputbox(Map<String, DisplayInputboxBean> mNonDisplayedInputBox,
            Set<String> lstParentIds) {
        if (mNonDisplayedInputBox == null || Tools.isEmpty(lstParentIds))
            return true;//??
        for (String parentidTmp : lstParentIds) {
            if (Tools.isEmpty(parentidTmp))
                continue;
            if (mNonDisplayedInputBox.containsKey(parentidTmp))
                return false;
        }
        return true;
    }

    private class DisplayInputboxBean {
        private Set<String> lstParentIds;

        private List<String> lstInputboxIds;

        public Set<String> getLstParentInputboxId() {
            return lstParentIds;
        }

        public void setLstParentInputboxId(Set<String> lstParentInputboxId) {
            this.lstParentIds = lstParentInputboxId;
        }

        public List<String> getLstInputboxIds() {
            return lstInputboxIds;
        }

        public void setLstInputboxIds(List<String> lstInputboxIds) {
            this.lstInputboxIds = lstInputboxIds;
        }

        public String getInputBoxIdsAsString() {
            if (Tools.isEmpty(lstInputboxIds))
                return "";
            StringBuilder resultBuf = new StringBuilder();
            for (String idTmp : lstInputboxIds) {
                if (Tools.isEmpty(idTmp))
                    continue;
                resultBuf.append(idTmp).append(";");
            }
            return resultBuf.toString();
        }
    }
}