package railo.runtime.tag; import java.awt.Color; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.Tag; import railo.commons.color.ColorCaster; import railo.commons.lang.StringUtil; import railo.runtime.exp.ApplicationException; import railo.runtime.exp.ExpressionException; import railo.runtime.exp.PageException; import railo.runtime.ext.tag.BodyTagImpl; import railo.runtime.op.Caster; import railo.runtime.type.Query; import railo.runtime.type.util.ListUtil; public final class Chartseries extends BodyTagImpl { private ChartSeriesBean series=new ChartSeriesBean(); private String itemColumn; private Query query; private String valueColumn; @Override public void release() { super.release(); series=new ChartSeriesBean(); itemColumn=null; valueColumn=null; query=null; } /** * @param colorlist the colorlist to set * @throws ExpressionException */ public void setColorlist(String strColorlist) throws ExpressionException { String[] arr=ListUtil.listToStringArray(strColorlist.trim(),','); Color[] colorlist=new Color[arr.length]; for(int i=0;i<arr.length;i++) { colorlist[i]=ColorCaster.toColor(arr[i]); } series.setColorlist(colorlist); } /** * @param dataLabelStyle the dataLabelStyle to set * @throws ExpressionException */ public void setDatalabelstyle(String strDataLabelStyle) throws ExpressionException { strDataLabelStyle=strDataLabelStyle.trim().toLowerCase(); if("none".equals(strDataLabelStyle)) series.setDataLabelStyle(ChartSeriesBean.DATA_LABEL_STYLE_NONE); else if("value".equals(strDataLabelStyle)) series.setDataLabelStyle(ChartSeriesBean.DATA_LABEL_STYLE_VALUE); else if("rowlabel".equals(strDataLabelStyle)) series.setDataLabelStyle(ChartSeriesBean.DATA_LABEL_STYLE_ROWLABEL); else if("columnlabel".equals(strDataLabelStyle))series.setDataLabelStyle(ChartSeriesBean.DATA_LABEL_STYLE_COLUMNLABEL); else if("pattern".equals(strDataLabelStyle)) series.setDataLabelStyle(ChartSeriesBean.DATA_LABEL_STYLE_PATTERN); else throw new ExpressionException("invalid value ["+strDataLabelStyle+"] for attribute dataLabelStyle, for this attribute only the following values are supported " + "[none, value, rowlabel, columnlabel, pattern]"); } /** * @param itemColumn the itemColumn to set */ public void setItemcolumn(String itemColumn) { this.itemColumn=itemColumn; } /** * @param markerStyle the markerStyle to set * @throws ExpressionException */ public void setMarkerstyle(String strMarkerStyle) throws ExpressionException { strMarkerStyle=strMarkerStyle.trim().toLowerCase(); if("circle".equals(strMarkerStyle)) series.setMarkerStyle(ChartSeriesBean.MARKER_STYLE_CIRCLE); else if("diamond".equals(strMarkerStyle)) series.setMarkerStyle(ChartSeriesBean.MARKER_STYLE_DIAMOND); else if("letter".equals(strMarkerStyle)) series.setMarkerStyle(ChartSeriesBean.MARKER_STYLE_LETTER); else if("mcross".equals(strMarkerStyle)) series.setMarkerStyle(ChartSeriesBean.MARKER_STYLE_MCROSS); else if("rcross".equals(strMarkerStyle)) series.setMarkerStyle(ChartSeriesBean.MARKER_STYLE_RCROSS); else if("rectangle".equals(strMarkerStyle)) series.setMarkerStyle(ChartSeriesBean.MARKER_STYLE_RECTANGLE); else if("snow".equals(strMarkerStyle)) series.setMarkerStyle(ChartSeriesBean.MARKER_STYLE_SNOW); else if("triangle".equals(strMarkerStyle)) series.setMarkerStyle(ChartSeriesBean.MARKER_STYLE_TRIANGLE); else throw new ExpressionException("invalid value ["+strMarkerStyle+"] for attribute markerStyle, for this attribute only the following values are supported " + "[circle, diamond, letter, mcross, rcross, rectangle, snow, triangle]"); } /** * @param paintStyle the paintStyle to set * @throws ExpressionException */ public void setPaintstyle(String strPaintStyle) throws ExpressionException { strPaintStyle=strPaintStyle.trim().toLowerCase(); if("light".equals(strPaintStyle)) series.setPaintStyle(ChartSeriesBean.PAINT_STYLE_LIGHT); else if("plain".equals(strPaintStyle)) series.setPaintStyle(ChartSeriesBean.PAINT_STYLE_PLAIN); else if("raise".equals(strPaintStyle)) series.setPaintStyle(ChartSeriesBean.PAINT_STYLE_RAISE); else if("shade".equals(strPaintStyle)) series.setPaintStyle(ChartSeriesBean.PAINT_STYLE_SHADE); else throw new ExpressionException("invalid value ["+strPaintStyle+"] for attribute paintStyle, for this attribute only the following values are supported " + "[light, plain, raise, shade]"); } /** * @param query the query to set * @throws PageException */ public void setQuery(Object oQuery) throws PageException { if(oQuery instanceof Query) this.query=(Query)oQuery; else if(oQuery instanceof String) this.query=pageContext.getQuery((String)oQuery); else query=Caster.toQuery(oQuery); } /** * @param seriesColor the seriesColor to set * @throws ExpressionException */ public void setSeriescolor(String strSeriesColor) throws ExpressionException { series.setSeriesColor(ColorCaster.toColor(strSeriesColor)); } /** * @param seriesLabel the seriesLabel to set */ public void setSerieslabel(String seriesLabel) { series.setSeriesLabel(seriesLabel); } /** * @param type the type to set * @throws ExpressionException */ public void setType(String strType) throws ExpressionException { strType=strType.trim().toLowerCase(); if("area".equals(strType)) series.setType(ChartSeriesBean.TYPE_AREA); else if("bar".equals(strType)) series.setType(ChartSeriesBean.TYPE_BAR); else if("cone".equals(strType)) series.setType(ChartSeriesBean.TYPE_CONE); else if("curve".equals(strType)) series.setType(ChartSeriesBean.TYPE_CURVE); else if("cylinder".equals(strType)) series.setType(ChartSeriesBean.TYPE_CYLINDER); else if("horizontalbar".equals(strType)) series.setType(ChartSeriesBean.TYPE_HORIZONTALBAR); else if("line".equals(strType)) series.setType(ChartSeriesBean.TYPE_LINE); else if("timeline".equals(strType)) series.setType(ChartSeriesBean.TYPE_TIME); else if("time".equals(strType)) series.setType(ChartSeriesBean.TYPE_TIME); else if("pie".equals(strType)) series.setType(ChartSeriesBean.TYPE_PIE); else if("pyramid".equals(strType)) series.setType(ChartSeriesBean.TYPE_PYRAMID); else if("scatter".equals(strType)) series.setType(ChartSeriesBean.TYPE_SCATTER); else if("scatte".equals(strType)) series.setType(ChartSeriesBean.TYPE_SCATTER); else if("step".equals(strType)) series.setType(ChartSeriesBean.TYPE_STEP); else throw new ExpressionException("invalid value ["+strType+"] for attribute type, for this attribute only the following values are supported " + "[area, bar, cone, curve, cylinder, horizontalbar, line,pie,pyramid,scatter,step,timeline]"); } /** * @param valueColumn the valueColumn to set */ public void setValuecolumn(String valueColumn) { this.valueColumn=valueColumn; } public void addChartData(ChartDataBean data) { series.addChartData(data); } public int doStartTag() { return EVAL_BODY_INCLUDE; } @Override public int doEndTag() throws JspException { ChartDataBean data; if(query!=null) { if(StringUtil.isEmpty(itemColumn)) throw new ApplicationException("attribute itemColumn is required for tag cfchartseries when attribute query is defined"); if(StringUtil.isEmpty(valueColumn)) throw new ApplicationException("attribute valueColumn is required for tag cfchartseries when attribute query is defined"); int rowCount = query.getRecordcount(); for(int i=1;i<=rowCount;i++) { data=new ChartDataBean(); data.setValue(Caster.toDoubleValue(query.getAt(valueColumn, i, new Double(0)))); data.setItem(pageContext,query.getAt(itemColumn, i, "")); //data.setItem(itemToString(query.getAt(itemColumn, i, ""))); addChartData(data); } } // get parent chart Tag parent=this; do{ parent = parent.getParent(); if(parent instanceof Chart) { ((Chart)parent).addChartSeries(series); break; } } while(parent!=null); return EVAL_PAGE; } }