1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 package org.dbforms.taglib.cewolf;
25
26 import java.util.Date;
27 import java.util.HashMap;
28 import java.util.Iterator;
29 import java.util.Vector;
30 import java.util.Map;
31
32 import java.awt.Paint;
33
34 import javax.servlet.jsp.JspException;
35
36 import de.laures.cewolf.taglib.DataAware;
37 import de.laures.cewolf.taglib.tags.AbstractChartTag;
38 import de.laures.cewolf.taglib.util.PageUtils;
39 import de.laures.cewolf.ChartPostProcessor;
40 import de.laures.cewolf.DatasetProducer;
41 import de.laures.cewolf.taglib.util.ColorHelper;
42
43 import org.jfree.data.xy.XYDataset;
44
45 import org.jfree.data.time.Millisecond;
46 import org.jfree.data.time.TimeSeries;
47 import org.jfree.data.time.TimeSeriesDataItem;
48 import org.jfree.data.time.TimeSeriesCollection;
49
50 import org.jfree.chart.JFreeChart;
51 import org.jfree.chart.plot.XYPlot;
52 import org.jfree.chart.renderer.xy.XYItemRenderer;
53
54 import org.apache.commons.logging.Log;
55 import org.apache.commons.logging.LogFactory;
56
57 import org.dbforms.taglib.AbstractDbBaseHandlerTag;
58 import org.dbforms.util.ReflectionUtil;
59 import org.dbforms.util.Util;
60 import org.dbforms.config.ResultSetVector;
61 /***
62 *
63 * This tag defines TimeSeries for cewolf
64 *
65 * @author Henner Kollmann
66 *
67 */
68
69 public class CewolfTimeSeriesDataTag extends AbstractDbBaseHandlerTag implements
70 javax.servlet.jsp.tagext.TryCatchFinally {
71
72 private String timeField;
73
74 private String rendererclass;
75
76 private Vector fieldList = new Vector();
77
78 private Log logCat = LogFactory.getLog(this.getClass().getName());
79
80 private static class CewolfTimeSeriesData implements java.io.Serializable {
81
82 private String title;
83 private String fieldName;
84 private Paint color;
85
86 public CewolfTimeSeriesData(CewolfTimeSeriesFieldTag tag) {
87 title = tag.getTitle();
88 fieldName = tag.getFieldName();
89 color = ColorHelper.getColor(tag.getColor());
90 }
91
92 public Paint getColor() {
93 return color;
94 }
95
96 public String getFieldName() {
97 return fieldName;
98 }
99
100 public String getTitle() {
101 return title;
102 }
103
104 }
105
106 private class MyChartPostProcessor implements ChartPostProcessor {
107
108 public void processChart(Object chart, Map args) {
109 XYItemRenderer rend = null;
110 XYPlot plot = ((JFreeChart) chart).getXYPlot();
111
112 XYDataset ds = (XYDataset) args.get("dataset");
113 int rendererIndex = plot.getIndexOf(plot.getRendererForDataset(ds));
114
115 String rendClass = (String) args.get("renderer");
116 if (!Util.isNull(rendClass)) {
117 try {
118 rend = (XYItemRenderer) ReflectionUtil.newInstance(rendClass);
119 plot.setRenderer(rendererIndex, rend);
120 } catch (Exception e) {
121 logCat.error("::getEvent - cannot create the new renderer ["
122 + rendClass + "]", e);
123 }
124 }
125
126 if (rend == null) {
127 rend = plot.getRenderer(rendererIndex);
128 }
129
130 for (int i = 0; i < ds.getSeriesCount(); i++) {
131 Object o = ds.getSeriesKey(i);
132 CewolfTimeSeriesData series = (CewolfTimeSeriesData) args.get(o);
133 rend.setSeriesPaint(i, series.getColor());
134 }
135 }
136 };
137
138 public void addField(CewolfTimeSeriesFieldTag field) {
139 fieldList.add(new CewolfTimeSeriesData(field));
140 }
141
142 public int doEndTag() throws JspException {
143
144 ResultSetVector rsv = getParentForm().getResultSetVector();
145
146 TimeSeriesCollection ds = new DbFormsTimeSeriesCollection(rsv);
147 HashMap map = new HashMap();
148
149 Iterator iterator = fieldList.iterator();
150 while (iterator.hasNext()) {
151 CewolfTimeSeriesData field = (CewolfTimeSeriesData) iterator.next();
152 String title = field.getTitle();
153 if (Util.isNull(title)) {
154 title = field.getFieldName();
155 }
156 ds.addSeries(new TimeSeries(title, Millisecond.class));
157 map.put(title, field);
158 }
159
160 if (!ResultSetVector.isNull(rsv)) {
161 logCat.debug("rsv.size() = " + String.valueOf(rsv.size()));
162 rsv.moveFirst();
163 for (int i = 0; i < rsv.size(); i++) {
164 Object o = rsv.getFieldAsObject(getTimeField());
165 if (o != null) {
166 Millisecond t = new Millisecond((Date) o);
167 for (int j = 0; j < ds.getSeriesCount(); j++) {
168 CewolfTimeSeriesData field = (CewolfTimeSeriesData) fieldList
169 .elementAt(j);
170 Double d = (Double) rsv.getFieldAsObject(field
171 .getFieldName());
172 ds.getSeries(j).add(new TimeSeriesDataItem(t, d));
173 }
174 }
175 rsv.moveNext();
176 }
177 }
178 map.put("renderer", getRendererclass());
179 map.put("dataset", ds);
180
181 AbstractChartTag rt = (AbstractChartTag) PageUtils.findRoot(this, pageContext);
182 rt.addChartPostProcessor(new MyChartPostProcessor(), map);
183
184 DatasetProducer dataProducer = new DbFormsDatasetProducer(ds);
185 DataAware dw = (DataAware) findAncestorWithClass(this, DataAware.class);
186 dw.setDataProductionConfig(dataProducer, new HashMap(), false);
187 return SKIP_BODY;
188 }
189
190 /***
191 * @return Returns the timeField.
192 */
193 public String getTimeField() {
194 return timeField;
195 }
196
197 /***
198 * @param timeField
199 * The timeField to set.
200 */
201 public void setTimeField(String timeField) {
202 this.timeField = timeField;
203 }
204
205 public void doFinally() {
206 super.doFinally();
207 timeField = null;
208 fieldList.clear();
209 }
210
211 public String getRendererclass() {
212 return rendererclass;
213 }
214
215 public void setRendererclass(String rendererclass) {
216 this.rendererclass = rendererclass;
217 }
218
219 }