001 /*
002 * Copyright (c) 2009 The openGion Project.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013 * either express or implied. See the License for the specific language
014 * governing permissions and limitations under the License.
015 */
016 package org.opengion.hayabusa.io;
017
018 import org.opengion.fukurou.util.StringUtil;
019 import org.opengion.hayabusa.common.HybsSystem;
020 import org.opengion.hayabusa.common.HybsSystemException;
021 import org.opengion.hayabusa.db.DBTableModel;
022
023 import java.sql.Connection;
024 import java.sql.SQLException;
025 import java.util.Map;
026 import java.util.HashMap;
027 import java.util.Arrays;
028
029 import org.jfree.chart.LegendItemSource;
030 import org.jfree.data.jdbc.JDBCPieDataset;
031 import org.jfree.data.jdbc.JDBCXYDataset;
032 import org.jfree.data.general.Dataset;
033 import org.jfree.data.general.DefaultValueDataset;
034
035 import org.jfree.data.category.DefaultCategoryDataset;
036 import org.jfree.data.xy.CategoryTableXYDataset;
037 import org.jfree.data.general.DefaultPieDataset;
038 import org.jfree.data.DefaultKeyedValues;
039
040 /**
041 * ChartFactory は、Dataset および、Renderer のオブジェクトを構築するファクトリクラスですã?
042 * JFreeChart では、各種オブジェクトã?çµ?�¿合わせで、色ã€?�ªグラフを作æ?できますã?
043 * ここでは、簡易的にオブジェクトを構築できるように、ä¸?�¤のキーワードによって、各種作æ?する
044 * オブジェクトã?キーワードを関連付けておきますã?
045 *
046 * <table border="1" frame="box" rules="all" >
047 * <caption>å�?¨®オブジェクトã?çµ?�¿合わせä¸?¦§</caption>
048 * <tr><th> チャートタイãƒ? </th><th> レンãƒ?ƒ©ー(org.jfree.chart.renderer.) </th><th> Dataset </th></tr>
049 * <tr><td> HybsLine </td><td> HybsLineRenderer </td><td> Category </td></tr>
050 * <tr><td> HybsBar </td><td> HybsBarRenderer </td><td> Category </td></tr>
051 * <tr><td> HybsStackedBar </td><td> HybsStackedBarRenderer </td><td> Category </td></tr>
052 * <tr><td> Area </td><td> category.AreaRenderer </td><td> Category </td></tr>
053 * <tr><td> Bar </td><td> category.BarRenderer </td><td> Category </td></tr>
054 * <tr><td> Bar3D </td><td> category.BarRenderer3D </td><td> Category </td></tr>
055 * <tr><td> CategoryStep </td><td> category.CategoryStepRenderer </td><td> Category </td></tr>
056 * <tr><td> Gantt </td><td> category.GanttRenderer </td><td> TaskSeries </td></tr>
057 * <tr><td> GroupedStackedBar </td><td> category.GroupedStackedBarRenderer </td><td> Category </td></tr>
058 * <tr><td> LayeredBar </td><td> category.LayeredBarRenderer </td><td> Category </td></tr>
059 * <tr><td> Level </td><td> category.LevelRenderer </td><td> Category </td></tr>
060 * <tr><td> LineAndShape </td><td> category.LineAndShapeRenderer </td><td> Category </td></tr>
061 * <tr><td> Line3D </td><td> category.LineRenderer3D </td><td> Category </td></tr>
062 * <tr><td> MinMax </td><td> category.MinMaxCategoryRenderer </td><td> Category </td></tr>
063 * <tr><td> StackedArea </td><td> category.StackedAreaRenderer </td><td> Category </td></tr>
064 * <tr><td> StackedBar </td><td> category.StackedBarRenderer </td><td> Category </td></tr>
065 * <tr><td> StackedBar3D </td><td> category.StackedBarRenderer3D </td><td> Category </td></tr>
066 * <tr><td> StatisticalLineAndShape </td><td> category.StatisticalLineAndShapeRenderer </td><td> Category </td></tr>
067 * <tr><td> WaterfallBar </td><td> category.WaterfallBarRenderer </td><td> Category </td></tr>
068 * <tr><td> ClusteredXYBarV </td><td> xy.ClusteredXYBarRenderer </td><td> TimeSeries </td></tr>
069 * <tr><td> CyclicXYItem </td><td> xy.CyclicXYItemRenderer </td><td> XY </td></tr>
070 * <tr><td> DeviationV </td><td> xy.DeviationRenderer </td><td> TimeSeries </td></tr>
071 * <tr><td> HighLow </td><td> xy.HighLowRenderer </td><td> XY </td></tr>
072 * <tr><td> StackedXYArea </td><td> xy.StackedXYAreaRenderer </td><td> XY </td></tr>
073 * <tr><td> StackedXYArea2 </td><td> xy.StackedXYAreaRenderer2 </td><td> XY </td></tr>
074 * <tr><td> StandardXYItem </td><td> xy.StandardXYItemRenderer </td><td> XY </td></tr>
075 * <tr><td> XYArea </td><td> xy.XYAreaRenderer </td><td> XY </td></tr>
076 * <tr><td> XYArea2 </td><td> xy.XYAreaRenderer2 </td><td> XY </td></tr>
077 * <tr><td> XYBarV </td><td> xy.XYBarRenderer </td><td> TimeSeries </td></tr>
078 * <tr><td> XYBlock </td><td> xy.XYBlockRenderer </td><td> XY </td></tr>
079 * <tr><td> XYBubble </td><td> xy.XYBubbleRenderer </td><td> XY </td></tr>
080 * <tr><td> XYDifference </td><td> xy.XYDifferenceRenderer </td><td> XY </td></tr>
081 * <tr><td> XYDot </td><td> xy.XYDotRenderer </td><td> XY </td></tr>
082 * <tr><td> XYError </td><td> xy.XYErrorRenderer </td><td> XY </td></tr>
083 * <tr><td> XYLine3D </td><td> xy.XYLine3DRenderer </td><td> XY </td></tr>
084 * <tr><td> XYLineAndShape </td><td> xy.XYLineAndShapeRenderer </td><td> XY </td></tr>
085 * <tr><td> XYStepArea </td><td> xy.XYStepAreaRenderer </td><td> XY </td></tr>
086 * <tr><td> XYStep </td><td> xy.XYStepRenderer </td><td> XY </td></tr>
087 * <tr><td> YIntervalV </td><td> xy.YIntervalRenderer </td><td> TimeSeries </td></tr>
088 * <tr><td> PolarItem </td><td> DefaultPolarItemRenderer </td><td> XY </td></tr>
089 * <tr><td> Compass </td><td> null </td><td> Value </td></tr>
090 * <tr><td> Meter </td><td> null </td><td> Value </td></tr>
091 * <tr><td> MultiplePie </td><td> null </td><td> Category </td></tr>
092 * <tr><td> Pie </td><td> null </td><td> Pie </td></tr>
093 * <tr><td> Pie3D </td><td> null </td><td> Pie </td></tr>
094 * <tr><td> Ring </td><td> null </td><td> Pie </td></tr>
095 * <tr><td> SpiderWeb </td><td> null </td><td> Category </td></tr>
096 * <tr><td> Thermometer </td><td> null </td><td> Value </td></tr>
097 * <tr><td> TimeSeriesLineV </td><td> xy.StandardXYItemRenderer </td><td> TimeSeries </td></tr>
098 * <tr><td> TimeSeriesLineH </td><td> xy.StandardXYItemRenderer </td><td> TimeSeries </td></tr>
099 * <tr><td> TimeSeriesBarV </td><td> xy.XYBarRenderer </td><td> TimeSeries </td></tr>
100 * <tr><td> TimeSeriesBarH </td><td> xy.XYBarRenderer </td><td> TimeSeries </td></tr>
101 * <tr><td> StackedTimeSeriesLineV </td><td> xy.StandardXYItemRenderer </td><td> TimeSeries </td></tr>
102 * <tr><td> StackedTimeSeriesLineH </td><td> xy.StandardXYItemRenderer </td><td> TimeSeries </td></tr>
103 * </table>
104 *
105 * @version 0.9.0 2007/06/21
106 * @author Kazuhiko Hasegawa
107 * @since JDK1.1,
108 */
109 public class ChartFactory {
110
111 private static final String PLOT_SUB = "org.opengion.hayabusa.io.ChartPlot_" ;
112
113 // ChartPlot オブジェクトã?マルチスレãƒ?ƒ‰で使用可能なため、キャãƒ?‚·ュして使ã�?�¾わしますã?
114 private static volatile ChartPlot plot_cat = null ;
115 private static volatile ChartPlot plot_xy = null ;
116 private static volatile ChartPlot plot_pie = null ;
117 private static volatile ChartPlot plot_tim = null ; // 5.6.1.0 (2013/02/01)
118 private static volatile ChartPlot plot_xtim = null ; // 5.6.1.0 (2013/02/01)
119
120 private static final Object lock = new Object();
121
122 /**
123 * ãƒ?ƒ•ォルトコンストラクタã‚?private 化しておきますã?
124 *
125 */
126 private ChartFactory() {}
127
128 /**
129 * Connection と query æ–?—å?から、Dataset オブジェクトを作æ?しますã?
130 *
131 * 引数のtypeは、å?部定義の TYPE_RENDERER_MAP マップで関連付けられたキーワーãƒ?
132 * より、対象とするチャート特性を取得しますã?(getTypeRenderer)
133 * そã? TypeRenderer#getDatasetType() メソãƒ?ƒ‰の値をå?に、Dataset クラスはã€?
134 * "org.jfree.data.jdbc.JDBC****Dataset" の **** のç®?‰€を特定しますã?
135 * 現状は、Category , Pie , XY の?“種é¡???Valueãƒ??タセãƒ?ƒˆが選択されますã?
136 *
137 * @og.rev 3.8.9.2 (2007/07/28) HybsJDBCCategoryDataset 追åŠ?
138 * @og.rev 5.3.0.0 (2010/12/01) そã?他ã?Dataset 追åŠ?
139 * @og.rev 5.6.1.0 (2013/02/01) 時間軸を持つチャーãƒ?TimeSeries 追åŠ?
140 *
141 * @param conn Dataset の取得å?のコネクション
142 * @param query 取得するクエリーæ–?—å?
143 * @param type Dataset オブジェクトã?作æ?å…?‚’求めるキーワーãƒ?
144 *
145 * @return Datasetオブジェクãƒ?
146 *
147 * @see #getTypeRenderer( String )
148 * @see #newDataset( DBTableModel ,String )
149 * @throws SQLException ãƒ??タベã?スアクセスエラー
150 */
151 public static final Dataset newDataset( final Connection conn,final String query,final String type )
152 throws SQLException {
153 final Dataset dataset ;
154
155 TypeRenderer rend = getTypeRenderer( type );
156
157 String dsType = rend.getDatasetType();
158 if( "Category".equalsIgnoreCase( dsType ) ) {
159 dataset = new HybsJDBCCategoryDataset2( conn, query ); // series の横持ち
160 }
161 else if( "XY".equalsIgnoreCase( dsType ) ) {
162 dataset = new JDBCXYDataset( conn, query );
163 }
164 else if( "Pie".equalsIgnoreCase( dsType ) ) {
165 dataset = new JDBCPieDataset( conn, query );
166 }
167 else if( "Value".equalsIgnoreCase( dsType ) ) {
168 dataset = new DefaultValueDataset();
169 }
170 // 5.3.0.0 (2010/12/01) そã?他ã?Dataset 追åŠ?
171 // else if( "GanttCategory".equalsIgnoreCase( dsType ) ) {
172 // dataset = new HybsJDBCCategoryDataset2( conn, query ); // 代替
173 // }
174 // else if( "IntervalCategory".equalsIgnoreCase( dsType ) ) {
175 // dataset = new HybsJDBCCategoryDataset2( conn, query ); // 代替
176 // }
177 // else if( "StatisticalCategory".equalsIgnoreCase( dsType ) ) {
178 // dataset = new HybsJDBCCategoryDataset2( conn, query ); // 代替
179 // }
180 else if( "TimeSeries".equalsIgnoreCase( dsType ) ) {
181 dataset = new HybsTimeSeriesCollection( type ); // 5.6.1.0 (2013/02/01) 時間軸を持つチャーãƒ?
182 ((HybsTimeSeriesCollection)dataset).executeQuery( conn, query );
183 }
184 else if( "TaskSeries".equalsIgnoreCase( dsType ) ) {
185 dataset = new HybsTaskSeriesCollection(); // 5.6.1.0 (2013/02/01) タスクæƒ??を持つチャーãƒ?
186 ((HybsTaskSeriesCollection)dataset).executeQuery( conn, query );
187 }
188 else {
189 String errMsg = "Category,Pie,XY,Value,TimeSeries 以外ã?Dataset はサポã?トしてã�?�¾せんã€?" + dsType + "]";
190 throw new HybsSystemException( errMsg );
191 }
192
193 return dataset ;
194 }
195
196 /**
197 * DBTableModelオブジェクトからã?Dataset オブジェクトを作æ?しますã?
198 *
199 * 引数のtypeは、å?部定義の TYPE_RENDERER_MAP マップで関連付けられたキーワーãƒ?
200 * より、対象とするチャート特性を取得しますã?(getTypeRenderer)
201 * そã? TypeRenderer#getDatasetType() メソãƒ?ƒ‰の値をå?に、Dataset クラスを作æ?しますã?
202 *
203 * 現状は、Category , Pie , XY の?“種é¡???Valueãƒ??タセãƒ?ƒˆが選択されますã?
204 *
205 * @og.rev 5.3.0.0 (2010/12/01) 新規追åŠ?
206 *
207 * @param table Dataset の取得å?のãƒ??ブルモãƒ?ƒ«
208 * @param type Dataset オブジェクトã?作æ?å…?‚’求めるキーワーãƒ?
209 *
210 * @return Datasetオブジェクãƒ?
211 *
212 * @see #getTypeRenderer( String )
213 * @see #newDataset( Connection ,String ,String )
214 */
215 public static final Dataset newDataset( final DBTableModel table , final String type ) {
216 final Dataset dataset ;
217
218 TypeRenderer rend = getTypeRenderer( type );
219 int clmNo = table.getColumnCount();
220 int rowNo = table.getRowCount();
221
222 String dsType = rend.getDatasetType();
223 if( "Category".equalsIgnoreCase( dsType ) ) {
224 // select key,val1,val2,val3 ?¥?¥?¥ from ?¥?¥?¥
225
226 DefaultCategoryDataset cDataset = new DefaultCategoryDataset(); // series の横持ち
227 String[] seri = table.getNames(); // ?’番目(アドレス=1)から、データのシリーズ名称が始まã‚?
228 for( int row=0; row<rowNo; row++ ) {
229 String clmKey = table.getValue( row,0 ); // ?‘番目(アドレス=0)はカラãƒ??設定å?
230 String[] vals = table.getValues( row );
231 for( int clm=1; clm<clmNo; clm++ ) { // ?’番目(アドレス=1)からカラãƒ?ƒ‡ータを取å¾?
232 String sval = vals[clm];
233 double val = ( sval == null || sval.length() == 0 ) ? 0.0d : Double.parseDouble( sval ) ;
234 cDataset.addValue( val , seri[clm] , clmKey );
235 }
236 }
237 dataset = cDataset;
238 }
239 else if( "XY".equalsIgnoreCase( dsType ) ) {
240 // select valx,valy from ?¥?¥?¥
241
242 CategoryTableXYDataset xyDataset = new CategoryTableXYDataset() ;
243 String[] seri = table.getNames(); // ?’番目(アドレス=1)から、データのシリーズ名称が始まã‚?
244 for( int row=0; row<rowNo; row++ ) {
245 String[] vals = table.getValues( row );
246 double rval = ( vals[0] == null || vals[0].length() == 0 ) ? 0.0d : Double.parseDouble( vals[0] );
247 for( int clm=1; clm<clmNo; clm++ ) { // ?’番目(アドレス=1)からカラãƒ?ƒ‡ータを取å¾?
248 String sval = vals[clm];
249 double val = ( sval == null || sval.length() == 0 ) ? 0.0d : Double.parseDouble( sval ) ;
250 xyDataset.add( rval,val,seri[clm] );
251 }
252 }
253
254 dataset = xyDataset;
255 }
256 else if( "Pie".equalsIgnoreCase( dsType ) ) {
257 // select key,val from ?¥?¥?¥
258
259 DefaultKeyedValues keyVal = new DefaultKeyedValues();
260 for( int row=0; row<rowNo; row++ ) {
261 String[] vals = table.getValues( row );
262
263 String key = vals[0]; // KEYé ?›®
264 String sval = vals[1]; // VALUEé ?›®
265 double val = ( sval == null || sval.length() == 0 ) ? 0.0d : Double.parseDouble( sval ) ;
266 keyVal.addValue( key ,val );
267 }
268 dataset = new DefaultPieDataset( keyVal );
269 }
270 else if( "Value".equalsIgnoreCase( dsType ) ) {
271 // Value は、オブジェクトを作æ?するã�?�‘。å?は、markValues ã‚?ChartDataset.java で設å®?
272 dataset = new DefaultValueDataset();
273 }
274 // 5.3.0.0 (2010/12/01) そã?他ã?Dataset 追åŠ?
275 // else if( "GanttCategory".equalsIgnoreCase( dsType ) ) {
276 // dataset = new TaskSeriesCollection();
277 // }
278 // else if( "IntervalCategory".equalsIgnoreCase( dsType ) ) {
279 // dataset = new DefaultIntervalCategoryDataset( String[] seriesNames, Number[][] starts, Number[][] ends) ;
280 // }
281 // else if( "StatisticalCategory".equalsIgnoreCase( dsType ) ) {
282 // dataset = new DefaultStatisticalCategoryDataset();
283 // }
284 // else if( "Wind".equalsIgnoreCase( dsType ) ) {
285 // dataset = new DefaultWindDataset(java.lang.String[] seriesNames, java.lang.Object[][][] data);
286 // }
287 // else if( "OHLC".equalsIgnoreCase( dsType ) ) {
288 // dataset = new DefaultOHLCDataset(java.lang.Comparable key, OHLCDataItem[] data);
289 // }
290 // else if( "BoxAndWhiskerXY".equalsIgnoreCase( dsType ) ) {
291 // dataset = new org.jfree.data.statistics.DefaultBoxAndWhiskerXYDataset(java.lang.Comparable seriesKey);
292 // }
293 // else if( "WaferMap".equalsIgnoreCase( dsType ) ) {
294 // dataset = new JDBCXYDataset( conn, query );
295 // }
296 // else if( "float2".equalsIgnoreCase( dsType ) ) {
297 // float[][] を返すので、ここでは使えなã�??
298 // }
299 else {
300 String errMsg = "Category,Pie,XY,Value 以外ã?Dataset はサポã?トしてã�?�¾せんã€?" + dsType + "]";
301 throw new HybsSystemException( errMsg );
302 }
303
304 return dataset ;
305 }
306
307 /**
308 * TypeRenderer オブジェクトを作æ?しますã?
309 *
310 * 引数のtypeは、å?部定義の TYPE_RENDERER_MAP マップで関連付けられたキーワーãƒ?
311 * より、対象とするチャート特性を取得しますã?
312 * typeは、org.jfree.chart.renderer.XXXX.YYYYRenderer のYYYY とほぼä¸??しますã?
313 * TYPE_RENDERER_MAP マップには、XXXX.YYYYRenderer 部åˆ?�Œ定義されてã�?�¾すã?
314 * XXXX は、category と xy が定義されており、それ以外ã?レンãƒ?ƒ©ーは null に
315 * なってã�?�¾すã?Pie 関係ã?、レンãƒ?ƒ©ーではなくã?Plot と対応しますã?
316 * ただしã?個ã?に設定情報が異なる為、ChartPlot_Pie クラスで個別対応してã�?�¾すã?
317 *
318 * @param type Rendererオブジェクトã?作æ?å…?‚’求めるキーワーãƒ?
319 *
320 * @return TypeRendererオブジェクãƒ?
321 */
322 public static final TypeRenderer getTypeRenderer( final String type ) {
323 TypeRenderer rend = TYPE_RENDERER_MAP.get( type );
324
325 if( rend == null ) {
326 String errMsg = "æŒ?®šã?タイプに該当すã‚?Renderer はサポã?トしてã�?�¾せんã€?" + type + "]"
327 + HybsSystem.CR
328 + "Key=" + Arrays.toString( TYPE_RENDERER_MAP.keySet().toArray( new String[TYPE_RENDERER_MAP.size()] ) );
329 throw new HybsSystemException( errMsg );
330 }
331
332 return rend ;
333 }
334
335 /**
336 * ChartPlot オブジェクトを作æ?しますã?
337 *
338 * ChartPlot オブジェクトã?、ChartPlot インターフェースを継承した
339 * サブクラスでã€?org.opengion.hayabusa.io.ChartPlot_**** になりますã?
340 * **** には、Category , Pie , XY が指定できますã?
341 *
342 * @og.rev 4.0.0.0 (2007/11/29) ChartPlot のサブクラスを動çš?�«作æ?、キャãƒ?‚·ュしますã?
343 * @og.rev 5.3.0.0 (2010/12/01) xxxPlot対å¿?
344 * @og.rev 5.6.1.0 (2013/02/01) 時間軸を持つチャーãƒ?TimeSeries 追åŠ?
345 *
346 * @param type Rendererオブジェクトã?作æ?å…?‚’求めるキーワーãƒ?
347 *
348 * @return ChartPlotオブジェクãƒ?
349 */
350 public static final ChartPlot newChartPlot( final String type ) {
351
352 final ChartPlot plot ;
353
354 TypeRenderer rend = TYPE_RENDERER_MAP.get( type );
355
356 // String dsType = rend.getDatasetType();
357 String pltType = rend.getPlotType(); // 5.3.0.0 (2010/12/01) xxxPlot対å¿?
358 // if( "Category".equalsIgnoreCase( dsType ) ) {
359 if( "Category".equalsIgnoreCase( pltType ) ) {
360 synchronized( lock ) {
361 if( plot_cat == null ) {
362 // plot_cat = (ChartPlot)StringUtil.newInstance( PLOT_SUB + dsType ) ;
363 plot_cat = (ChartPlot)StringUtil.newInstance( PLOT_SUB + pltType ) ;
364 }
365 }
366 plot = plot_cat;
367 }
368 // else if( "XY".equalsIgnoreCase( dsType ) ) {
369 else if( "XY".equalsIgnoreCase( pltType ) ) {
370 synchronized( lock ) {
371 if( plot_xy == null ) {
372 // plot_xy = (ChartPlot)StringUtil.newInstance( PLOT_SUB + dsType ) ;
373 plot_xy = (ChartPlot)StringUtil.newInstance( PLOT_SUB + pltType ) ;
374 }
375 }
376 plot = plot_xy;
377 }
378 // 5.6.1.0 (2013/02/01) 時間軸を持つチャーãƒ?
379 else if( "Time".equalsIgnoreCase( pltType ) ) {
380 synchronized( lock ) {
381 if( plot_tim == null ) {
382 plot_tim = (ChartPlot)StringUtil.newInstance( PLOT_SUB + pltType ) ;
383 }
384 }
385 plot = plot_tim;
386 }
387 // 5.6.1.0 (2013/02/01) 時間軸を持つチャーãƒ?
388 else if( "XYTime".equalsIgnoreCase( pltType ) ) {
389 synchronized( lock ) {
390 if( plot_xtim == null ) {
391 plot_xtim = (ChartPlot)StringUtil.newInstance( PLOT_SUB + pltType ) ;
392 }
393 }
394 plot = plot_xtim;
395 }
396 else {
397 synchronized( lock ) {
398 if( plot_pie == null ) {
399 // plot_pie = (ChartPlot)StringUtil.newInstance( PLOT_SUB + dsType ) ;
400 plot_pie = (ChartPlot)StringUtil.newInstance( PLOT_SUB + "Pie" ) ;
401 }
402 }
403 plot = plot_pie;
404 }
405
406 return plot ;
407 }
408
409 /**
410 * 引数タイプに応じたレンãƒ?ƒ©ーã‚?ƒ‡ータセãƒ?ƒˆを規定しますã?
411 */
412 private static final Map<String,TypeRenderer> TYPE_RENDERER_MAP = new HashMap<String,TypeRenderer>();
413
414 // 4.1.1.0 (2008/02/04) HybsBar 追åŠ?
415 // 5.3.0.0 (2010/12/01) xxxPlot 追åŠ??ãƒ??タå†?®¹修正、コメント部対å¿?
416 static {
417 String[][] data = new String[][] {
418 // キーワーãƒ? xxxRenderer xxxDataset xxxPlot
419 { "HybsLine" , "HybsLineRenderer" , "Category" , "Category" }
420 , { "HybsBar" , "HybsBarRenderer" , "Category" , "Category" }
421 , { "HybsStackedBar" , "HybsStackedBarRenderer" , "Category" , "Category" }
422 , { "Area" , "category.AreaRenderer" , "Category" , "Category" }
423 , { "Bar" , "category.BarRenderer" , "Category" , "Category" }
424 , { "Bar3D" , "category.BarRenderer3D" , "Category" , "Category" }
425 // , { "BoxAndWhisker" , "category.BoxAndWhiskerRenderer" , "BoxAndWhisker" , "Category" }
426 , { "CategoryStep" , "category.CategoryStepRenderer" , "Category" , "Category" }
427 , { "Gantt" , "category.GanttRenderer" , "TaskSeries" , "Time" }
428 , { "GroupedStackedBar" , "category.GroupedStackedBarRenderer" , "Category" , "Category" }
429 // , { "IntervalBar" , "category.IntervalBarRenderer" , "IntervalCategory" , "Category" }
430 , { "LayeredBar" , "category.LayeredBarRenderer" , "Category" , "Category" }
431 , { "Level" , "category.LevelRenderer" , "Category" , "Category" }
432 , { "LineAndShape" , "category.LineAndShapeRenderer" , "Category" , "Category" }
433 , { "Line3D" , "category.LineRenderer3D" , "Category" , "Category" }
434 , { "MinMax" , "category.MinMaxCategoryRenderer" , "Category" , "Category" }
435 , { "StackedArea" , "category.StackedAreaRenderer" , "Category" , "Category" }
436 , { "StackedBar" , "category.StackedBarRenderer" , "Category" , "Category" }
437 , { "StackedBar3D" , "category.StackedBarRenderer3D" , "Category" , "Category" }
438 // , { "StatisticalBar" , "category.StatisticalBarRenderer" , "StatisticalCategory" , "Category" }
439 , { "StatisticalLineAndShape" , "category.StatisticalLineAndShapeRenderer" , "Category" , "Category" }
440 , { "WaterfallBar" , "category.WaterfallBarRenderer" , "Category" , "Category" }
441 // , { "Candlestick" , "xy.CandlestickRenderer" , "OHLC" , "XY" }
442 , { "ClusteredXYBarV" , "xy.ClusteredXYBarRenderer" , "TimeSeries" , "XYTime" }
443 , { "CyclicXYItem" , "xy.CyclicXYItemRenderer" , "XY" , "XY" }
444 , { "DeviationV" , "xy.DeviationRenderer" , "TimeSeries" , "XYTime" }
445 , { "HighLow" , "xy.HighLowRenderer" , "XY" , "XY" }
446 , { "StackedXYArea" , "xy.StackedXYAreaRenderer" , "XY" , "XY" }
447 , { "StackedXYArea2" , "xy.StackedXYAreaRenderer2" , "XY" , "XY" }
448 // , { "StackedXYBarV" , "xy.StackedXYBarRenderer" , "TableXY" , "XY" }
449 , { "StandardXYItem" , "xy.StandardXYItemRenderer" , "XY" , "XY" }
450 // , { "WindItem" , "xy.WindItemRenderer" , "Wind" , "XY" }
451 , { "XYArea" , "xy.XYAreaRenderer" , "XY" , "XY" }
452 , { "XYArea2" , "xy.XYAreaRenderer2" , "XY" , "XY" }
453 , { "XYBarV" , "xy.XYBarRenderer" , "TimeSeries" , "XYTime" }
454 , { "XYBlock" , "xy.XYBlockRenderer" , "XY" , "XY" }
455 // , { "XYBoxAndWhisker" , "xy.XYBoxAndWhiskerRenderer" , "BoxAndWhiskerXY" , "XY" }
456 , { "XYBubble" , "xy.XYBubbleRenderer" , "XY" , "XY" }
457 , { "XYDifference" , "xy.XYDifferenceRenderer" , "XY" , "XY" }
458 , { "XYDot" , "xy.XYDotRenderer" , "XY" , "XY" }
459 , { "XYError" , "xy.XYErrorRenderer" , "XY" , "XY" }
460 , { "XYLine3D" , "xy.XYLine3DRenderer" , "XY" , "XY" }
461 , { "XYLineAndShape" , "xy.XYLineAndShapeRenderer" , "XY" , "XY" }
462 , { "XYStepArea" , "xy.XYStepAreaRenderer" , "XY" , "XY" }
463 , { "XYStep" , "xy.XYStepRenderer" , "XY" , "XY" }
464 , { "YIntervalV" , "xy.YIntervalRenderer" , "TimeSeries" , "XYTime" }
465 , { "PolarItem" , "DefaultPolarItemRenderer" , "XY" , "Polar" }
466 // , { "WaferMap" , "WaferMapRenderer" , "WaferMap" , "WaferMap" }
467 , { "Compass" , null , "Value" , "Compass" }
468 // , { "Contour" , null , "Contour" , "Contour" }
469 // , { "FastScatter" , null , "float2" , "FastScatter" }
470 , { "Meter" , null , "Value" , "Meter" }
471 , { "MultiplePie" , null , "Category" , "MultiplePie" }
472 , { "Pie" , null , "Pie" , "Pie" }
473 , { "Pie3D" , null , "Pie" , "Pie" }
474 , { "Ring" , null , "Pie" , "Ring" }
475 , { "SpiderWeb" , null , "Category" , "SpiderWeb" }
476 , { "Thermometer" , null , "Value" , "Thermometer" }
477 , { "TimeSeriesLineV" , "xy.StandardXYItemRenderer" , "TimeSeries" , "XYTime" } // 5.6.1.0 (2013/02/01) 時間軸を持つチャーãƒ?
478 , { "TimeSeriesLineH" , "xy.StandardXYItemRenderer" , "TimeSeries" , "XYTime" } // 5.6.1.0 (2013/02/01) 時間軸を持つチャーãƒ?
479 , { "TimeSeriesBarV" , "xy.XYBarRenderer" , "TimeSeries" , "XYTime" } // 5.6.1.0 (2013/02/01) 時間軸を持つチャーãƒ?
480 , { "TimeSeriesBarH" , "xy.XYBarRenderer" , "TimeSeries" , "XYTime" } // 5.6.1.0 (2013/02/01) 時間軸を持つチャーãƒ?
481 , { "StackedTimeSeriesLineV" , "xy.StandardXYItemRenderer" , "TimeSeries" , "XYTime" } // 5.6.1.0 (2013/02/01) 時間軸を持つチャーãƒ?
482 , { "StackedTimeSeriesLineH" , "xy.StandardXYItemRenderer" , "TimeSeries" , "XYTime" } // 5.6.1.0 (2013/02/01) 時間軸を持つチャーãƒ?
483 };
484
485 for( int i=0; i<data.length; i++ ) {
486 // TYPE_RENDERER_MAP.put( data[i][0],new TypeRenderer( data[i][0],data[i][1],data[i][2] ) );
487 TYPE_RENDERER_MAP.put( data[i][0],new TypeRenderer( data[i][0],data[i][1],data[i][2],data[i][3] ) );
488 }
489 }
490 }
491
492 /**
493 * 引数タイプに応じたレンãƒ?ƒ©ーã‚?ƒ‡ータセãƒ?ƒˆを管ç�?�—ますã?
494 *
495 * タイプã?レンãƒ?ƒ©ー、データセãƒ?ƒˆ のçµ?�¿合わせで、構築するオブジェクトが異なりますã?
496 */
497 //final class TypeRenderer {
498 // private static final String REND_CLASS = "org.jfree.chart.renderer." ;
499 // private static final String HYBS_CLASS = "org.opengion.hayabusa.io." ; // 4.1.1.0 (2008/02/04)
500 //
501 // private final String type ;
502 // private final String rend ; // org.jfree.chart.renderer 以降ã?æ–?—å?
503 // private final String dtset ; // org.opengion.hayabusa.io 以降ã?æ–?—å?
504 // private final String plot ; // 以降ã?æ–?—å?
505 //
506 // /**
507 // * TypeRenderer オブジェクトを作æ?しますã?
508 // *
509 // * チャートタイãƒ?は、外部からチャートをæŒ?®šするã?に便利なように、キーåŒ?
510 // * されてã�?�¾すã?こã?キーに基づã�?�¦、ChartFactory クラスの
511 // * チャートタイプ変換表に基づã�?�¦、レンãƒ?ƒ©ーã‚??ãƒ??タセãƒ?ƒˆを作æ?しますã?
512 // * こã?クラスは、これらの変換表の個ã?の属æ?を管ç�?�—てã�?�¾すã?
513 // *
514 // * @og.rev 5.3.0.0 (2010/12/01) plot 追åŠ?
515 // *
516 // * @param type チャートã?タイプを区別するæ–?—å?
517 // * @param renderer チャートã?タイプに応じたレンãƒ?ƒ©ーのキーæ–?—å?
518 // * @param dtset チャートã?タイプに応じたデータセãƒ?ƒˆのキーæ–?—å?
519 // * @param plot チャートã?タイプに応じたã?ロãƒ?ƒˆのキーæ–?—å?
520 // */
521 //// public TypeRenderer( final String type,final String renderer,final String dtset ) {
522 // public TypeRenderer( final String type,final String renderer,final String dtset,final String plot ) {
523 // this.type = type ;
524 // this.rend = renderer ;
525 // this.dtset = dtset ;
526 // this.plot = plot ; // 5.3.0.0 (2010/12/01) plot 追åŠ?
527 // }
528 //
529 // /**
530 // * チャートã?タイプを区別するæ–?—å?を返しますã?
531 // *
532 // * @return チャートã?タイプを区別するæ–?—å?
533 // */
534 // public String getType() { return type; }
535 //
536 // /**
537 // * チャートã?タイプに応じたレンãƒ?ƒ©ーのキーæ–?—å?を返しますã?
538 // *
539 // * @return チャートã?タイプに応じたレンãƒ?ƒ©ーのキーæ–?—å?
540 // */
541 // public String getRendererType() { return rend; }
542 //
543 // /**
544 // * チャートã?タイプに応じたレンãƒ?ƒ©ーオブジェクトを返しますã?
545 // *
546 // * org.jfree.chart.renderer パッケージのサブモジュールのレンãƒ?ƒ©ークラスã‚?
547 // * 先に登録してある レンãƒ?ƒ©ーのキーæ–?—å? と合æ?して、クラスを動çš?�«作æ?しますã?
548 // *
549 // * @og.rev 4.1.1.0 (2008/02/04) Barチャート追åŠ?
550 // * @og.rev 5.3.0.0 (2010/12/01) レンãƒ?ƒ©ーã�?null の場合ã?対å¿?
551 // *
552 // * @return LegendItemSource チャートã?タイプに応じたレンãƒ?ƒ©ーオブジェクãƒ?存在しなã�??合ã?、null)
553 // */
554 // public LegendItemSource getRenderer() {
555 // if( rend == null ) { return null; } // 5.3.0.0 (2010/12/01)
556 //
557 // String key ;
558 // if( type.startsWith( "Hybs" ) ) {
559 // key = HYBS_CLASS + rend ;
560 // }
561 // else {
562 // key = REND_CLASS + rend ;
563 // }
564 //
565 // return (LegendItemSource)StringUtil.newInstance( key ) ;
566 // }
567 //
568 // /**
569 // * チャートã?タイプに応じたデータセãƒ?ƒˆのキーæ–?—å?を返しますã?
570 // *
571 // * @return チャートã?タイプに応じたデータセãƒ?ƒˆのキーæ–?—å?
572 // */
573 // public String getDatasetType() { return dtset; }
574 //
575 // /**
576 // * チャートã?タイプに応じたã?ロãƒ?ƒˆのキーæ–?—å?を返しますã?
577 // *
578 // * @og.rev 5.3.0.0 (2010/12/01) 新規追åŠ?
579 // *
580 // * @return チャートã?タイプに応じたã?ロãƒ?ƒˆのキーæ–?—å?
581 // */
582 // public String getPlotType() { return plot; }
583 //}