View Javadoc

1   /*
2    * Jour - java profiler and monitoring library
3    *
4    * Copyright (C) 2004 Jour team
5    *
6    * This library is free software; you can redistribute it and/or
7    * modify it under the terms of the GNU Library General Public
8    * License as published by the Free Software Foundation; either
9    * version 2 of the License, or (at your option) any later version.
10   *
11   * This library is distributed in the hope that it will be useful,
12   * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14   * Library General Public License for more details.
15   *
16   * You should have received a copy of the GNU Library General Public
17   * License along with this library; if not, write to the
18   * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19   * Boston, MA  02111-1307, USA.
20   */
21  package net.sf.jour.rt.swingmonitor;
22  
23  import java.awt.BorderLayout;
24  import java.awt.Color;
25  import java.text.DecimalFormat;
26  import java.text.SimpleDateFormat;
27  import java.util.Iterator;
28  
29  import javax.swing.BorderFactory;
30  
31  import net.sf.jour.statistic.Accumulation;
32  import net.sf.jour.statistic.MillisecondsPeriod;
33  import net.sf.jour.statistic.TimeBaseAccumulationList;
34  
35  import org.apache.log4j.Logger;
36  import org.jfree.chart.ChartFactory;
37  import org.jfree.chart.ChartPanel;
38  import org.jfree.chart.JFreeChart;
39  import org.jfree.chart.StandardLegend;
40  import org.jfree.chart.axis.NumberAxis;
41  import org.jfree.chart.axis.ValueAxis;
42  import org.jfree.chart.labels.StandardXYToolTipGenerator;
43  import org.jfree.chart.plot.XYPlot;
44  import org.jfree.chart.renderer.xy.StandardXYItemRenderer;
45  import org.jfree.chart.renderer.xy.XYItemRenderer;
46  import org.jfree.data.time.TimeSeries;
47  import org.jfree.data.time.TimeSeriesCollection;
48  import org.jfree.data.xy.XYDataset;
49  
50  /***
51   * TODO Add docs
52   *
53   * Created on 13.12.2004
54   * Contributing Author(s):
55   *
56   *   Misha Lifschitz <mishalifschitz at users.sourceforge.net> (Inital implementation)
57   *   Vlad Skarzhevskyy <vlads at users.sourceforge.net> (Inital implementation)
58   *
59   * @author vlads
60   * @version $Revision: 1.7 $ ($Author: vlads $)  $Date: 2004/12/17 04:17:46 $
61   */
62  public class MethodsChartPanel extends MonitoringJPanel {
63      
64      protected static final Logger log = Logger.getLogger(MethodsChartPanel.class);
65      
66      TimeSeries timeseriesAvg;
67      TimeSeries timeseriesMax;
68      TimeSeries timeseriesMin;
69  
70      TimeSeries timeseriesCalls;
71  
72      Object statItem;
73  
74      MethodExceutionStatistics methodStat;
75  
76      String methodName;
77      
78      public MethodsChartPanel(Object statItem, MethodExceutionStatistics methodStat) {
79          setLayout(new BorderLayout());
80          
81          this.statItem = statItem;
82          this.methodStat = methodStat;
83          
84          TimeBaseAccumulationList list = (TimeBaseAccumulationList) statItem;
85          methodName = list.getName();
86          
87          timeseriesMax = new TimeSeries("Max", MillisecondsPeriod.class);
88          timeseriesAvg = new TimeSeries("AVG", MillisecondsPeriod.class);
89          timeseriesMin = new TimeSeries("Min milliseconds", MillisecondsPeriod.class);
90          timeseriesCalls = new TimeSeries("Number of calls per min", MillisecondsPeriod.class);
91          
92          JFreeChart jfreechart = createChart(createDataset(statItem));
93          ChartPanel chartpanel = new ChartPanel(jfreechart);
94          chartpanel.setMouseZoomable(true, false);
95          
96          chartpanel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4),
97                  BorderFactory.createLineBorder(Color.black)));
98          StandardLegend standardlegend = (StandardLegend) jfreechart.getLegend();
99          
100         add(chartpanel);
101     }
102     
103     public boolean canCloseTab() {
104         return true;
105     }
106     
107     public void updateData() {
108         timeseriesAvg.clear();
109         timeseriesMin.clear();
110         timeseriesMax.clear();
111         timeseriesCalls.clear();
112         createTestTimeSeries(statItem);
113     }
114     
115     public String getTabTitle() {
116         return methodName;
117     }
118     
119     private void createTestTimeSeries(Object statItem) {
120         try {
121             log.debug("Got stats:" + statItem.getClass().getName());
122             synchronized (methodStat) {
123                 TimeBaseAccumulationList list = (TimeBaseAccumulationList) statItem;
124 
125                 for (Iterator i = list.getKeys().iterator(); i.hasNext();) {
126                     Object time = i.next();
127                     Accumulation acc = list.getItem(time);
128                     MillisecondsPeriod p = list.getPeriod(time);
129                     timeseriesAvg.add(p, new Double(acc.getMean()));
130                     timeseriesMax.add(p, new Double(acc.getMax()));
131                     timeseriesMin.add(p, new Double(acc.getMin()));
132                     timeseriesCalls.add(p, new Double(list.getCallPerMinute(time)));
133                 }
134             }
135             log.debug("Items added:" +timeseriesAvg.getItemCount());
136         } catch (Exception e) {
137            log.error("Test Time Series Error", e);
138         }
139     }
140     
141     private XYDataset createDataset(Object statItem) {
142         createTestTimeSeries(statItem);
143         //TimeSeries avg = MovingAverage.createMovingAverage(timeseries, "30 day moving average", 30, 30);
144         TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();
145         timeseriescollection.addSeries(timeseriesMax);
146         timeseriescollection.addSeries(timeseriesAvg);
147         timeseriescollection.addSeries(timeseriesMin);
148         //timeseriescollection.addSeries(avg);
149         return timeseriescollection;
150     }
151     
152     private XYDataset createDatasetCalls() {
153         TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();
154         timeseriescollection.addSeries(timeseriesCalls);
155         return timeseriescollection;
156     }
157     
158     private JFreeChart createChart(XYDataset xydataset) {
159         JFreeChart jfreechart = ChartFactory.createTimeSeriesChart(this.methodName, "When", "Call duration milliseconds", xydataset, true, true, false);
160         XYPlot xyplot = jfreechart.getXYPlot();
161         
162         XYItemRenderer xyitemrenderer = xyplot.getRenderer();
163         //xyitemrenderer.setPaint(Color.blue);
164         ValueAxis numberaxisDuration = xyplot.getRangeAxis(0);
165         numberaxisDuration.setLabelPaint(Color.blue);
166         numberaxisDuration.setTickLabelPaint(Color.blue);
167         
168         StandardXYToolTipGenerator standardxytooltipgenerator = new StandardXYToolTipGenerator("{0}: ({1}, {2})", new SimpleDateFormat("HH:mm:ss"), new DecimalFormat("0.000"));
169         xyitemrenderer.setToolTipGenerator(standardxytooltipgenerator);
170         
171  
172         NumberAxis numberaxis = new NumberAxis("Number of calls per min");
173         numberaxis.setAutoRangeIncludesZero(false);
174         numberaxis.setLabelPaint(Color.black);
175         numberaxis.setTickLabelPaint(Color.black);
176         xyplot.setRangeAxis(1, numberaxis);
177         xyplot.setDataset(1, createDatasetCalls());
178         xyplot.mapDatasetToRangeAxis(1, 1);
179         //XYItemRenderer xyitemrenderer2 = xyplot.getRenderer();
180         //xyitemrenderer2.setToolTipGenerator(StandardXYToolTipGenerator.getTimeSeriesInstance());
181         /*
182         if(xyitemrenderer2 instanceof StandardXYItemRenderer)
183         {
184             StandardXYItemRenderer standardxyitemrenderer = (StandardXYItemRenderer)xyitemrenderer2;
185             standardxyitemrenderer.setPlotShapes(true);
186             standardxyitemrenderer.setShapesFilled(true);
187         }
188         */
189         StandardXYItemRenderer standardxyitemrenderer1 = new StandardXYItemRenderer();
190         standardxyitemrenderer1.setSeriesPaint(0, Color.black);
191         //standardxyitemrenderer1.setPlotShapes(true);
192         standardxyitemrenderer1.setToolTipGenerator(StandardXYToolTipGenerator.getTimeSeriesInstance());
193         xyplot.setRenderer(1, standardxyitemrenderer1);
194         
195         return jfreechart;
196     }
197 }