View Javadoc

1   /*
2    * $Header: /cvsroot/jdbforms/dbforms/src/org/dbforms/taglib/cewolf/CewolfTimeSeriesDataTag.java,v 1.2 2006/03/16 14:23:02 hkollmann Exp $
3    * $Revision: 1.2 $
4    * $Date: 2006/03/16 14:23:02 $
5    *
6    * DbForms - a Rapid Application Development Framework
7    * Copyright (C) 2001 Joachim Peer <joepeer@excite.com>
8    *
9    * This library is free software; you can redistribute it and/or
10   * modify it under the terms of the GNU Lesser General Public
11   * License as published by the Free Software Foundation; either
12   * version 2.1 of the License, or (at your option) any later version.
13   *
14   * This library is distributed in the hope that it will be useful,
15   * but WITHOUT ANY WARRANTY; without even the implied warranty of
16   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17   * Lesser General Public License for more details.
18   *
19   * You should have received a copy of the GNU Lesser General Public
20   * License along with this library; if not, write to the Free Software
21   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
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 }