001    package railo.runtime.dump;
002    
003    import java.awt.Color;
004    import java.io.IOException;
005    import java.io.StringWriter;
006    import java.io.Writer;
007    
008    import railo.commons.color.ColorCaster;
009    import railo.commons.lang.StringUtil;
010    import railo.runtime.PageContext;
011    import railo.runtime.engine.ThreadLocalPageContext;
012    import railo.runtime.exp.ExpressionException;
013    import railo.runtime.functions.other.Dump;
014    
015    public class ClassicHTMLDumpWriter implements DumpWriter {
016    
017            
018            private static int count=0;
019    
020            public void writeOut(PageContext pc,DumpData data, Writer writer, boolean expand) throws IOException {
021                    writeOut(pc,data, writer, expand, false);
022            }
023            private void writeOut(PageContext pc,DumpData data, Writer writer, boolean expand, boolean inside) throws IOException {
024                    
025                    if(data==null) return;
026                    if(!(data instanceof DumpTable)) {
027                            writer.write(StringUtil.escapeHTML(data.toString()));
028                            return;
029                    }
030                    DumpTable table=(DumpTable) data;
031                    
032                    String borderColor=table.getHighLightColor();
033                    String h1Color=table.getHighLightColor();
034                    String h2Color=table.getNormalColor();
035                    String normalColor="white";
036                    try {
037                            Color color = ColorCaster.toColor(table.getHighLightColor());
038                            borderColor=ColorCaster.toHexString(color.darker().darker());
039                    } 
040                    catch (ExpressionException e) {}
041                    
042                    
043                    String id="_classic"+(count++);
044                    // prepare data
045                    DumpRow[] rows = table.getRows();
046                    int cols=0;
047                    for(int i=0;i<rows.length;i++)if(rows[i].getItems().length>cols)cols=rows[i].getItems().length;
048                    
049                    if(!inside) {
050                            writer.write("<script>");
051                            writer.write("function dumpOC(name){");
052                            writer.write("var tds=document.all?document.getElementsByTagName('tr'):document.getElementsByName('_'+name);");
053                            writer.write("var s=null;");
054                            writer.write("name='_'+name;");
055                            writer.write("for(var i=0;i<tds.length;i++) {");
056                            writer.write("if(document.all && tds[i].name!=name)continue;");
057                            writer.write("s=tds[i].style;");
058                            writer.write("if(s.display=='none') s.display='';");
059                            writer.write("else s.display='none';");
060                            writer.write("}");
061                            writer.write("}");
062                            writer.write("</script>");
063                    }
064                    
065                    String context="";
066                    if(!inside) context=Dump.getContext();
067                    if(context==null) context="";
068                    //boolean isSetContext=false;
069                    
070                    writer.write("<table"+(table.getWidth()!=null?" width=\""+table.getWidth()+"\"":"")+""+(table.getHeight()!=null?" height=\""+table.getHeight()+"\"":"")+" cellpadding=\"3\" cellspacing=\"0\" style=\"font-family : Verdana, Geneva, Arial, Helvetica, sans-serif;font-size : 10;color :"+table.getFontColor()+" ;empty-cells:show; border : 1px solid "+borderColor+";\" >");
071                    
072                    // header
073                    if(!StringUtil.isEmpty(table.getTitle())) {
074                            writer.write("<tr><td title=\""+context+"\" onclick=\"dumpOC('"+id+"')\" colspan=\""+cols+"\" bgcolor=\""+h1Color+"\" style=\"color:white;border : 1px solid "+borderColor+";\">");
075                            //isSetContext=true;
076                            String contextPath="";
077                            pc = ThreadLocalPageContext.get(pc);
078                            if(pc!=null){
079                                    contextPath=pc. getHttpServletRequest().getContextPath();
080                                    if(contextPath==null)contextPath="";
081                            }
082                            
083                            
084                            //writer.write("<img src=\""+contextPath+"/railo-context/admin/resources/img/debug_minus.gif.cfm\" name=\"__btn"+id+"\"/>");
085                            
086                            writer.write("<span style=\"font-weight:bold;\">"+
087                                            (!StringUtil.isEmpty(table.getTitle())?table.getTitle():"")+"</span>"+(!StringUtil.isEmpty(table.getComment())?"<br>"+table.getComment():"")+
088                    "</td></tr>");
089                    }
090                    else id=null;
091                    
092                    // items
093                    DumpData value;
094                    for(int i=0;i<rows.length;i++) {
095                            if(id!=null)writer.write("<tr name=\"_"+id+"\">");
096                            else writer.write("<tr>");
097                            DumpData[] items=rows[i].getItems();
098                            int hType=rows[i].getHighlightType();
099                            int comperator=1;
100                            for(int y=0;y<cols;y++) {
101                                    if(y<=items.length-1) value=items[y];
102                                    else value=new SimpleDumpData("&nbsp;");
103                                    boolean highLightIt=hType==-1 || ((hType&(comperator))>0);
104                                    comperator*=2;
105                                    if(value==null)value=new SimpleDumpData("null");
106                                    //else if(value.equals(""))value="&nbsp;";
107                                    if(!inside){
108                                            writer.write("<td valign=\"top\" style=\"border : 1px solid "+borderColor+";\" title=\""+context+"\"");
109                                    }
110                                    else writer.write("<td valign=\"top\"");
111                                    writer.write(" bgcolor=\""+((highLightIt)?h2Color:normalColor)+"\" style=\"border : 1px solid "+borderColor+";empty-cells:show;\">");
112                                    writeOut(pc,value, writer,expand,true);
113                                    writer.write("</td>");
114                            }
115                            writer.write("</tr>");
116                    }
117                    
118                    // footer
119                    writer.write("</table>");
120                    if(!expand)writer.write("<script>dumpOC('"+id+"');</script>");
121            }
122    
123            @Override
124            public String toString(PageContext pc,DumpData data, boolean expand) {
125                    StringWriter sw=new StringWriter();
126                    try {
127                            writeOut(pc,data, sw,expand);
128                    } 
129                    catch (IOException e) {
130                            return "";
131                    }
132                    return sw.toString();
133            }
134    
135    }