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 */ 016package org.opengion.hayabusa.io; 017 018import org.opengion.fukurou.util.StringUtil; 019import org.opengion.hayabusa.common.HybsSystem; 020import org.opengion.hayabusa.common.HybsSystemException; 021import org.opengion.hayabusa.db.DBTableModel; 022 023import java.sql.Connection; 024import java.sql.SQLException; 025import java.util.Map; 026import java.util.HashMap; 027import java.util.Arrays; 028 029import org.jfree.data.jdbc.JDBCPieDataset; 030import org.jfree.data.jdbc.JDBCXYDataset; 031import org.jfree.data.general.Dataset; 032import org.jfree.data.general.DefaultValueDataset; 033 034import org.jfree.data.category.DefaultCategoryDataset; 035import org.jfree.data.xy.CategoryTableXYDataset; 036import org.jfree.data.general.DefaultPieDataset; 037import org.jfree.data.DefaultKeyedValues; 038 039import org.jfree.chart.plot.MeterPlot ; 040 041/** 042 * ChartFactory は、Dataset および、Renderer のオブジェクトを構築するファクトリクラスです。 043 * JFreeChart では、各種オブジェクトの組み合わせで、色々なグラフを作成できます。 044 * ここでは、簡易的にオブジェクトを構築できるように、一つのキーワードによって、各種作成する 045 * オブジェクトのキーワードを関連付けておきます。 046 * 047 * <table border="1" frame="box" rules="all" > 048 * <caption>各種オブジェクトの組み合わせ一覧</caption> 049 * <tr><th> チャートタイプ </th><th> レンデラー(org.jfree.chart.renderer.) </th><th> Dataset </th></tr> 050 * <tr><td> HybsLine </td><td> HybsLineRenderer </td><td> Category </td></tr> 051 * <tr><td> LineAndShape </td><td> category.LineAndShapeRenderer </td><td> Category </td></tr> 052 * <tr><td> Line3D </td><td> category.LineRenderer3D </td><td> Category </td></tr> 053 * <tr><td> StatisticalLineAndShape </td><td> category.StatisticalLineAndShapeRenderer </td><td> Category </td></tr> 054 * <tr><td> HybsBar </td><td> HybsBarRenderer </td><td> Category </td></tr> 055 * <tr><td> Bar </td><td> category.BarRenderer </td><td> Category </td></tr> 056 * <tr><td> Bar3D </td><td> category.BarRenderer3D </td><td> Category </td></tr> 057 * <tr><td> Area </td><td> category.AreaRenderer </td><td> Category </td></tr> 058 * <tr><td> HybsStackedBar </td><td> HybsStackedBarRenderer </td><td> Category </td></tr> 059 * <tr><td> StackedBar </td><td> category.StackedBarRenderer </td><td> Category </td></tr> 060 * <tr><td> StackedBar3D </td><td> category.StackedBarRenderer3D </td><td> Category </td></tr> 061 * <tr><td> StackedArea </td><td> category.StackedAreaRenderer </td><td> Category </td></tr> 062 * <tr><td> GroupedStackedBar </td><td> category.GroupedStackedBarRenderer </td><td> Category </td></tr> 063 * <tr><td> LayeredBar </td><td> category.LayeredBarRenderer </td><td> Category </td></tr> 064 * <tr><td> CategoryStep </td><td> category.CategoryStepRenderer </td><td> Category </td></tr> 065 * <tr><td> Level </td><td> category.LevelRenderer </td><td> Category </td></tr> 066 * <tr><td> MinMax </td><td> category.MinMaxCategoryRenderer </td><td> Category </td></tr> 067 * <tr><td> WaterfallBar </td><td> category.WaterfallBarRenderer </td><td> Category </td></tr> 068 * <tr><td> MultiplePie </td><td> null </td><td> Category </td></tr> 069 * <tr><td> SpiderWeb </td><td> null </td><td> Category </td></tr> 070 * <tr><td> Pie </td><td> null </td><td> Pie </td></tr> 071 * <tr><td> Pie3D </td><td> null </td><td> Pie </td></tr> 072 * <tr><td> Ring </td><td> null </td><td> Pie </td></tr> 073 * <tr><td> XYArea </td><td> xy.XYAreaRenderer </td><td> XY </td></tr> 074 * <tr><td> XYArea2 </td><td> xy.XYAreaRenderer2 </td><td> XY </td></tr> 075 * <tr><td> XYBlock </td><td> xy.XYBlockRenderer </td><td> XY </td></tr> 076 * <tr><td> CyclicXYItem </td><td> xy.CyclicXYItemRenderer </td><td> XY </td></tr> 077 * <tr><td> HighLow </td><td> xy.HighLowRenderer </td><td> XY </td></tr> 078 * <tr><td> StackedXYArea </td><td> xy.StackedXYAreaRenderer </td><td> XY </td></tr> 079 * <tr><td> StackedXYArea2 </td><td> xy.StackedXYAreaRenderer2 </td><td> XY </td></tr> 080 * <tr><td> StandardXYItem </td><td> xy.StandardXYItemRenderer </td><td> XY </td></tr> 081 * <tr><td> XYBubble </td><td> xy.XYBubbleRenderer </td><td> XY </td></tr> 082 * <tr><td> XYDifference </td><td> xy.XYDifferenceRenderer </td><td> XY </td></tr> 083 * <tr><td> XYDot </td><td> xy.XYDotRenderer </td><td> XY </td></tr> 084 * <tr><td> XYError </td><td> xy.XYErrorRenderer </td><td> XY </td></tr> 085 * <tr><td> XYLine3D </td><td> xy.XYLine3DRenderer </td><td> XY </td></tr> 086 * <tr><td> XYLineAndShape </td><td> xy.XYLineAndShapeRenderer </td><td> XY </td></tr> 087 * <tr><td> XYStepArea </td><td> xy.XYStepAreaRenderer </td><td> XY </td></tr> 088 * <tr><td> XYStep </td><td> xy.XYStepRenderer </td><td> XY </td></tr> 089 * <tr><td> PolarItem </td><td> DefaultPolarItemRenderer </td><td> XY </td></tr> 090 * <tr><td> Meter </td><td> null </td><td> Value </td></tr> 091 * <tr><td> Thermometer </td><td> null </td><td> Value </td></tr> 092 * <tr><td> Compass </td><td> null </td><td> Value </td></tr> 093 * <tr><td> Gantt </td><td> category.GanttRenderer </td><td> TaskSeries </td></tr> 094 * <tr><td> XYBarV </td><td> xy.XYBarRenderer </td><td> TimeSeries </td></tr> 095 * <tr><td> ClusteredXYBarV </td><td> xy.ClusteredXYBarRenderer </td><td> TimeSeries </td></tr> 096 * <tr><td> YIntervalV </td><td> xy.YIntervalRenderer </td><td> TimeSeries </td></tr> 097 * <tr><td> DeviationV </td><td> xy.DeviationRenderer </td><td> TimeSeries </td></tr> 098 * <tr><td> TimeSeriesLineV </td><td> xy.StandardXYItemRenderer </td><td> TimeSeries </td></tr> 099 * <tr><td> TimeSeriesLineH </td><td> xy.StandardXYItemRenderer </td><td> TimeSeries </td></tr> 100 * <tr><td> TimeSeriesBarV </td><td> xy.XYBarRenderer </td><td> TimeSeries </td></tr> 101 * <tr><td> TimeSeriesBarH </td><td> xy.XYBarRenderer </td><td> TimeSeries </td></tr> 102 * <tr><td> StackedTimeSeriesLineV </td><td> xy.StandardXYItemRenderer </td><td> TimeSeries </td></tr> 103 * <tr><td> StackedTimeSeriesLineH </td><td> xy.StandardXYItemRenderer </td><td> TimeSeries </td></tr> 104 * <tr><td> TimeStepV </td><td> xy.XYStepRenderer </td><td> TimeSeries </td></tr> 105 * <tr><td> TimeStepH </td><td> xy.XYStepRenderer </td><td> TimeSeries </td></tr> 106 * </table> 107 * 108 * @version 0.9.0 2007/06/21 109 * @author Kazuhiko Hasegawa 110 * @since JDK1.1, 111 */ 112public final class ChartFactory { 113 114 private static final String PLOT_SUB = "org.opengion.hayabusa.io.ChartPlot_" ; 115 116 // ChartPlot オブジェクトはマルチスレッドで使用可能なため、キャッシュして使いまわします。 117 private static volatile ChartPlot plot_cat = null ; 118 private static volatile ChartPlot plot_xy = null ; 119 private static volatile ChartPlot plot_pie = null ; 120 private static volatile ChartPlot plot_tim = null ; // 5.6.1.0 (2013/02/01) 121 private static volatile ChartPlot plot_xtim = null ; // 5.6.1.0 (2013/02/01) 122 123 private static final Object lock = new Object(); 124 125 /** 126 * 引数タイプに応じたレンデラーやデータセットを規定します。 127 */ 128 private static final Map<String,TypeRenderer> TYPE_RENDERER_MAP = new HashMap<String,TypeRenderer>(); 129 130 // 4.1.1.0 (2008/02/04) HybsBar 追加 131 // 5.3.0.0 (2010/12/01) xxxPlot 追加、データ内容修正、コメント部対応 132 static { 133 String[][] data = new String[][] { 134 // キーワード xxxRenderer xxxDataset xxxPlot 135 { "HybsLine" , "HybsLineRenderer" , "Category" , "Category" } 136 , { "LineAndShape" , "category.LineAndShapeRenderer" , "Category" , "Category" } 137 , { "Line3D" , "category.LineRenderer3D" , "Category" , "Category" } 138 , { "StatisticalLineAndShape", "category.StatisticalLineAndShapeRenderer", "Category" , "Category" } 139 140 , { "HybsBar" , "HybsBarRenderer" , "Category" , "Category" } 141 , { "Bar" , "category.BarRenderer" , "Category" , "Category" } 142 , { "Bar3D" , "category.BarRenderer3D" , "Category" , "Category" } 143 , { "Area" , "category.AreaRenderer" , "Category" , "Category" } 144 145 , { "HybsStackedBar" , "HybsStackedBarRenderer" , "Category" , "Category" } 146 , { "StackedBar" , "category.StackedBarRenderer" , "Category" , "Category" } 147 , { "StackedBar3D" , "category.StackedBarRenderer3D" , "Category" , "Category" } 148 , { "StackedArea" , "category.StackedAreaRenderer" , "Category" , "Category" } 149 , { "GroupedStackedBar" , "category.GroupedStackedBarRenderer" , "Category" , "Category" } 150 151 , { "LayeredBar" , "category.LayeredBarRenderer" , "Category" , "Category" } 152 153 , { "CategoryStep" , "category.CategoryStepRenderer" , "Category" , "Category" } 154 , { "Level" , "category.LevelRenderer" , "Category" , "Category" } 155 156 , { "MinMax" , "category.MinMaxCategoryRenderer" , "Category" , "Category" } 157 158 , { "WaterfallBar" , "category.WaterfallBarRenderer" , "Category" , "Category" } 159 160 , { "MultiplePie" , null , "Category" , "MultiplePie" } 161 , { "SpiderWeb" , null , "Category" , "SpiderWeb" } 162 163 // , { "BoxAndWhisker" , "category.BoxAndWhiskerRenderer" , "BoxAndWhisker" , "Category" } 164 // , { "IntervalBar" , "category.IntervalBarRenderer" , "IntervalCategory" , "Category" } 165 // , { "StatisticalBar" , "category.StatisticalBarRenderer" , "StatisticalCategory" , "Category" } 166 // , { "Candlestick" , "xy.CandlestickRenderer" , "OHLC" , "XY" } 167 // , { "StackedXYBarV" , "xy.StackedXYBarRenderer" , "TableXY" , "XY" } 168 // , { "WindItem" , "xy.WindItemRenderer" , "Wind" , "XY" } 169 // , { "XYBoxAndWhisker" , "xy.XYBoxAndWhiskerRenderer" , "BoxAndWhiskerXY" , "XY" } 170 // , { "WaferMap" , "WaferMapRenderer" , "WaferMap" , "WaferMap" } 171 // , { "Contour" , null , "Contour" , "Contour" } 172 // , { "FastScatter" , null , "float2" , "FastScatter" } 173 174 , { "Pie" , null , "Pie" , "Pie" } 175 , { "Pie3D" , null , "Pie" , "Pie" } 176 , { "Ring" , null , "Pie" , "Ring" } 177 178 , { "XYArea" , "xy.XYAreaRenderer" , "XY" , "XY" } 179 , { "XYArea2" , "xy.XYAreaRenderer2" , "XY" , "XY" } 180 , { "XYBlock" , "xy.XYBlockRenderer" , "XY" , "XY" } 181 , { "CyclicXYItem" , "xy.CyclicXYItemRenderer" , "XY" , "XY" } 182 , { "HighLow" , "xy.HighLowRenderer" , "XY" , "XY" } 183 , { "StackedXYArea" , "xy.StackedXYAreaRenderer" , "XY" , "XY" } 184 , { "StackedXYArea2" , "xy.StackedXYAreaRenderer2" , "XY" , "XY" } 185 , { "StandardXYItem" , "xy.StandardXYItemRenderer" , "XY" , "XY" } 186 , { "XYBubble" , "xy.XYBubbleRenderer" , "XY" , "XY" } 187 , { "XYDifference" , "xy.XYDifferenceRenderer" , "XY" , "XY" } 188 , { "XYDot" , "xy.XYDotRenderer" , "XY" , "XY" } 189 , { "XYError" , "xy.XYErrorRenderer" , "XY" , "XY" } 190 , { "XYLine3D" , "xy.XYLine3DRenderer" , "XY" , "XY" } 191 , { "XYLineAndShape" , "xy.XYLineAndShapeRenderer" , "XY" , "XY" } 192 , { "XYStepArea" , "xy.XYStepAreaRenderer" , "XY" , "XY" } 193 , { "XYStep" , "xy.XYStepRenderer" , "XY" , "XY" } 194 , { "PolarItem" , "DefaultPolarItemRenderer" , "XY" , "Polar" } 195 196 , { "Meter" , null , "Value" , "Meter" } 197 , { "Thermometer" , null , "Value" , "Thermometer" } 198 , { "Compass" , null , "Value" , "Compass" } 199 200 , { "Gantt" , "category.GanttRenderer" , "TaskSeries" , "Time" } 201 202 , { "XYBarV" , "xy.XYBarRenderer" , "TimeSeries" , "XYTime" } 203 , { "ClusteredXYBarV" , "xy.ClusteredXYBarRenderer" , "TimeSeries" , "XYTime" } 204 , { "YIntervalV" , "xy.YIntervalRenderer" , "TimeSeries" , "XYTime" } 205 , { "DeviationV" , "xy.DeviationRenderer" , "TimeSeries" , "XYTime" } 206 , { "TimeSeriesBarV" , "xy.XYBarRenderer" , "TimeSeries" , "XYTime" } // 5.6.1.0 (2013/02/01) 時間軸を持つチャート 207 , { "TimeSeriesBarH" , "xy.XYBarRenderer" , "TimeSeries" , "XYTime" } // 5.6.1.0 (2013/02/01) 時間軸を持つチャート 208 , { "TimeSeriesLineV" , "xy.StandardXYItemRenderer" , "TimeSeries" , "XYTime" } // 5.6.1.0 (2013/02/01) 時間軸を持つチャート 209 , { "TimeSeriesLineH" , "xy.StandardXYItemRenderer" , "TimeSeries" , "XYTime" } // 5.6.1.0 (2013/02/01) 時間軸を持つチャート 210 , { "StackedTimeSeriesLineV" , "xy.StandardXYItemRenderer" , "TimeSeries" , "XYTime" } // 5.6.1.0 (2013/02/01) 時間軸を持つチャート 211 , { "StackedTimeSeriesLineH" , "xy.StandardXYItemRenderer" , "TimeSeries" , "XYTime" } // 5.6.1.0 (2013/02/01) 時間軸を持つチャート 212 , { "TimeStepV" , "xy.XYStepRenderer" , "TimeSeries" , "XYTime" } // 5.9.17.1 (2017/02/10) step追加 213 , { "TimeStepH" , "xy.XYStepRenderer" , "TimeSeries" , "XYTime" } // 5.9.17.1 (2017/02/10) step追加 214 }; 215 216 for( int i=0; i<data.length; i++ ) { 217 TYPE_RENDERER_MAP.put( data[i][0],new TypeRenderer( data[i][0],data[i][1],data[i][2],data[i][3] ) ); 218 } 219 } 220 221 /** 222 * デフォルトコンストラクタを private 化しておきます。 223 * 224 */ 225 private ChartFactory() {} 226 227 /** 228 * Connection と query 文字列から、Dataset オブジェクトを作成します。 229 * 230 * 引数のtypeは、内部定義の TYPE_RENDERER_MAP マップで関連付けられたキーワード 231 * より、対象とするチャート特性を取得します。(getTypeRenderer) 232 * その TypeRenderer#getDatasetType() メソッドの値を元に、Dataset クラスは、 233 * "org.jfree.data.jdbc.JDBC****Dataset" の **** の箇所を特定します。 234 * 現状は、Category , Pie , XY の3種類 + Valueデータセットが選択されます。 235 * 236 * @og.rev 3.8.9.2 (2007/07/28) HybsJDBCCategoryDataset 追加 237 * @og.rev 5.3.0.0 (2010/12/01) その他のDataset 追加 238 * @og.rev 5.6.1.0 (2013/02/01) 時間軸を持つチャート TimeSeries 追加 239 * @og.rev 5.8.5.0 (2015/03/06) HybsCategoryDataset対応 240 * 241 * @param conn Dataset の取得先のコネクション 242 * @param query 取得するクエリー文字列 243 * @param type Dataset オブジェクトの作成元を求めるキーワード 244 * 245 * @return Datasetオブジェクト 246 * 247 * @see #getTypeRenderer( String ) 248 * @see #newDataset( DBTableModel ,String ) 249 * @throws SQLException データベースアクセスエラー 250 */ 251 public static Dataset newDataset( final Connection conn,final String query,final String type ) 252 throws SQLException { 253 final Dataset dataset ; 254 255 TypeRenderer rend = getTypeRenderer( type ); 256 String dsType = rend.getDatasetType(); 257 final boolean isPareto = "ParetoCategory".equalsIgnoreCase( dsType ); 258// if( "Category".equalsIgnoreCase( dsType ) ) { 259 if( "Category".equalsIgnoreCase( dsType ) || isPareto ) { 260 // 5.8.5.0 (2015/03/06) 261// dataset = new HybsJDBCCategoryDataset2( conn, query ); // series の横持ち 262 final HybsCategoryDataset hData = new HybsCategoryDataset(); 263 hData.initParam( null,false,false ); // 引数増加は一旦見送っておく 264 hData.execute( conn, query ); 265 dataset = hData ; 266 } 267 else if( "XY".equalsIgnoreCase( dsType ) ) { 268 dataset = new JDBCXYDataset( conn, query ); 269 } 270 else if( "Pie".equalsIgnoreCase( dsType ) ) { 271 dataset = new JDBCPieDataset( conn, query ); 272 } 273 else if( "Value".equalsIgnoreCase( dsType ) ) { 274 dataset = new DefaultValueDataset(); 275 } 276 // 5.3.0.0 (2010/12/01) その他のDataset 追加 277 // else if( "GanttCategory".equalsIgnoreCase( dsType ) ) { 278 // dataset = new HybsJDBCCategoryDataset2( conn, query ); // 代替 279 // } 280 // else if( "IntervalCategory".equalsIgnoreCase( dsType ) ) { 281 // dataset = new HybsJDBCCategoryDataset2( conn, query ); // 代替 282 // } 283 // else if( "StatisticalCategory".equalsIgnoreCase( dsType ) ) { 284 // dataset = new HybsJDBCCategoryDataset2( conn, query ); // 代替 285 // } 286 else if( "TimeSeries".equalsIgnoreCase( dsType ) ) { 287 dataset = new HybsTimeSeriesCollection( type ); // 5.6.1.0 (2013/02/01) 時間軸を持つチャート 288 ((HybsTimeSeriesCollection)dataset).executeQuery( conn, query ); 289 } 290 else if( "TaskSeries".equalsIgnoreCase( dsType ) ) { 291 dataset = new HybsTaskSeriesCollection(); // 5.6.1.0 (2013/02/01) タスク情報を持つチャート 292 ((HybsTaskSeriesCollection)dataset).executeQuery( conn, query ); 293 } 294 else { 295 String errMsg = "Category,Pie,XY,Value,TimeSeries 以外のDataset はサポートしていません。[" + dsType + "]"; 296 throw new HybsSystemException( errMsg ); 297 } 298 299 return dataset ; 300 } 301 302 /** 303 * DBTableModelオブジェクトから、Dataset オブジェクトを作成します。 304 * 305 * 引数のtypeは、内部定義の TYPE_RENDERER_MAP マップで関連付けられたキーワード 306 * より、対象とするチャート特性を取得します。(getTypeRenderer) 307 * その TypeRenderer#getDatasetType() メソッドの値を元に、Dataset クラスを作成します。 308 * 309 * 現状は、Category , Pie , XY の3種類 + Valueデータセットが選択されます。 310 * 311 * @og.rev 5.3.0.0 (2010/12/01) 新規追加 312 * @og.rev 5.8.5.0 (2015/03/06) HybsCategoryDataset対応 313 * 314 * @param table Dataset の取得先のテーブルモデル 315 * @param type Dataset オブジェクトの作成元を求めるキーワード 316 * 317 * @return Datasetオブジェクト 318 * 319 * @see #getTypeRenderer( String ) 320 * @see #newDataset( Connection ,String ,String ) 321 */ 322 public static Dataset newDataset( final DBTableModel table , final String type ) { 323 final Dataset dataset ; 324 325 TypeRenderer rend = getTypeRenderer( type ); 326 int clmNo = table.getColumnCount(); 327 int rowNo = table.getRowCount(); 328 329 String dsType = rend.getDatasetType(); 330 if( "Category".equalsIgnoreCase( dsType ) ) { 331 // select key,val1,val2,val3 ・・・ from ・・・ 332 333 // 5.8.5.0 (2015/03/06) 334// DefaultCategoryDataset cDataset = new DefaultCategoryDataset(); // series の横持ち 335 String[] seri = table.getNames(); // 2番目(アドレス=1)から、データのシリーズ名称が始まる 336// for( int row=0; row<rowNo; row++ ) { 337// String clmKey = table.getValue( row,0 ); // 1番目(アドレス=0)はカラムの設定値 338// String[] vals = table.getValues( row ); 339// for( int clm=1; clm<clmNo; clm++ ) { // 2番目(アドレス=1)からカラムデータを取得 340// String sval = vals[clm]; 341// double val = ( sval == null || sval.length() == 0 ) ? 0.0d : Double.parseDouble( sval ) ; 342// cDataset.addValue( val , seri[clm] , clmKey ); 343// } 344// } 345// dataset = cDataset; 346 final HybsCategoryDataset hData = new HybsCategoryDataset(); 347 hData.initParam( seri,false,false ); // 引数追加は一旦見送る 348 hData.execute( table ); 349 dataset = hData ; 350 } 351 else if( "XY".equalsIgnoreCase( dsType ) ) { 352 // select valx,valy from ・・・ 353 354 CategoryTableXYDataset xyDataset = new CategoryTableXYDataset() ; 355 String[] seri = table.getNames(); // 2番目(アドレス=1)から、データのシリーズ名称が始まる 356 for( int row=0; row<rowNo; row++ ) { 357 String[] vals = table.getValues( row ); 358 double rval = ( vals[0] == null || vals[0].length() == 0 ) ? 0.0d : Double.parseDouble( vals[0] ); 359 for( int clm=1; clm<clmNo; clm++ ) { // 2番目(アドレス=1)からカラムデータを取得 360 String sval = vals[clm]; 361 double val = ( sval == null || sval.length() == 0 ) ? 0.0d : Double.parseDouble( sval ) ; 362 xyDataset.add( rval,val,seri[clm] ); 363 } 364 } 365 366 dataset = xyDataset; 367 } 368 else if( "Pie".equalsIgnoreCase( dsType ) ) { 369 // select key,val from ・・・ 370 371 DefaultKeyedValues keyVal = new DefaultKeyedValues(); 372 for( int row=0; row<rowNo; row++ ) { 373 String[] vals = table.getValues( row ); 374 375 String key = vals[0]; // KEY項目 376 String sval = vals[1]; // VALUE項目 377 double val = ( sval == null || sval.length() == 0 ) ? 0.0d : Double.parseDouble( sval ) ; 378 keyVal.addValue( key ,val ); 379 } 380 dataset = new DefaultPieDataset( keyVal ); 381 } 382 else if( "Value".equalsIgnoreCase( dsType ) ) { 383 // Value は、オブジェクトを作成するだけ。値は、markValues を ChartDataset.java で設定 384 dataset = new DefaultValueDataset(); 385 } 386 // 5.3.0.0 (2010/12/01) その他のDataset 追加 387 // else if( "GanttCategory".equalsIgnoreCase( dsType ) ) { 388 // dataset = new TaskSeriesCollection(); 389 // } 390 // else if( "IntervalCategory".equalsIgnoreCase( dsType ) ) { 391 // dataset = new DefaultIntervalCategoryDataset( String[] seriesNames, Number[][] starts, Number[][] ends) ; 392 // } 393 // else if( "StatisticalCategory".equalsIgnoreCase( dsType ) ) { 394 // dataset = new DefaultStatisticalCategoryDataset(); 395 // } 396 // else if( "Wind".equalsIgnoreCase( dsType ) ) { 397 // dataset = new DefaultWindDataset(java.lang.String[] seriesNames, java.lang.Object[][][] data); 398 // } 399 // else if( "OHLC".equalsIgnoreCase( dsType ) ) { 400 // dataset = new DefaultOHLCDataset(java.lang.Comparable key, OHLCDataItem[] data); 401 // } 402 // else if( "BoxAndWhiskerXY".equalsIgnoreCase( dsType ) ) { 403 // dataset = new org.jfree.data.statistics.DefaultBoxAndWhiskerXYDataset(java.lang.Comparable seriesKey); 404 // } 405 // else if( "WaferMap".equalsIgnoreCase( dsType ) ) { 406 // dataset = new JDBCXYDataset( conn, query ); 407 // } 408 // else if( "float2".equalsIgnoreCase( dsType ) ) { 409 // float[][] を返すので、ここでは使えない。 410 // } 411 else { 412 String errMsg = "Category,Pie,XY,Value 以外のDataset はサポートしていません。[" + dsType + "]"; 413 throw new HybsSystemException( errMsg ); 414 } 415 416 return dataset ; 417 } 418 419 /** 420 * TypeRenderer オブジェクトを作成します。 421 * 422 * 引数のtypeは、内部定義の TYPE_RENDERER_MAP マップで関連付けられたキーワード 423 * より、対象とするチャート特性を取得します。 424 * typeは、org.jfree.chart.renderer.XXXX.YYYYRenderer のYYYY とほぼ一致します。 425 * TYPE_RENDERER_MAP マップには、XXXX.YYYYRenderer 部分が定義されています。 426 * XXXX は、category と xy が定義されており、それ以外のレンデラーは null に 427 * なっています。Pie 関係は、レンデラーではなく、Plot と対応します。 428 * ただし、個々に設定情報が異なる為、ChartPlot_Pie クラスで個別対応しています。 429 * 430 * @param type Rendererオブジェクトの作成元を求めるキーワード 431 * 432 * @return TypeRendererオブジェクト 433 */ 434 public static TypeRenderer getTypeRenderer( final String type ) { 435 TypeRenderer rend = TYPE_RENDERER_MAP.get( type ); 436 437 if( rend == null ) { 438 String errMsg = "指定のタイプに該当する Renderer はサポートしていません。[" + type + "]" 439 + HybsSystem.CR 440 + "Key=" + Arrays.toString( TYPE_RENDERER_MAP.keySet().toArray( new String[TYPE_RENDERER_MAP.size()] ) ); 441 throw new HybsSystemException( errMsg ); 442 } 443 444 return rend ; 445 } 446 447 /** 448 * ChartPlot オブジェクトを作成します。 449 * 450 * ChartPlot オブジェクトは、ChartPlot インターフェースを継承した 451 * サブクラスで、"org.opengion.hayabusa.io.ChartPlot_**** になります。 452 * **** には、Category , Pie , XY が指定できます。 453 * 454 * @og.rev 4.0.0.0 (2007/11/29) ChartPlot のサブクラスを動的に作成、キャッシュします。 455 * @og.rev 5.3.0.0 (2010/12/01) xxxPlot対応 456 * @og.rev 5.6.1.0 (2013/02/01) 時間軸を持つチャート TimeSeries 追加 457 * 458 * @param type Rendererオブジェクトの作成元を求めるキーワード 459 * 460 * @return ChartPlotオブジェクト 461 */ 462 public static ChartPlot newChartPlot( final String type ) { 463 464 final ChartPlot plot ; 465 466 TypeRenderer rend = TYPE_RENDERER_MAP.get( type ); 467 468 String pltType = rend.getPlotType(); // 5.3.0.0 (2010/12/01) xxxPlot対応 469 if( "Category".equalsIgnoreCase( pltType ) ) { 470 synchronized( lock ) { 471 if( plot_cat == null ) { 472 plot_cat = (ChartPlot)StringUtil.newInstance( PLOT_SUB + pltType ) ; 473 } 474 } 475 plot = plot_cat; 476 } 477 else if( "XY".equalsIgnoreCase( pltType ) ) { 478 synchronized( lock ) { 479 if( plot_xy == null ) { 480 plot_xy = (ChartPlot)StringUtil.newInstance( PLOT_SUB + pltType ) ; 481 } 482 } 483 plot = plot_xy; 484 } 485 // 5.6.1.0 (2013/02/01) 時間軸を持つチャート 486 else if( "Time".equalsIgnoreCase( pltType ) ) { 487 synchronized( lock ) { 488 if( plot_tim == null ) { 489 plot_tim = (ChartPlot)StringUtil.newInstance( PLOT_SUB + pltType ) ; 490 } 491 } 492 plot = plot_tim; 493 } 494 // 5.6.1.0 (2013/02/01) 時間軸を持つチャート 495 else if( "XYTime".equalsIgnoreCase( pltType ) ) { 496 synchronized( lock ) { 497 if( plot_xtim == null ) { 498 plot_xtim = (ChartPlot)StringUtil.newInstance( PLOT_SUB + pltType ) ; 499 } 500 } 501 plot = plot_xtim; 502 } 503 else { 504 synchronized( lock ) { 505 if( plot_pie == null ) { 506 plot_pie = (ChartPlot)StringUtil.newInstance( PLOT_SUB + "Pie" ) ; 507 } 508 } 509 plot = plot_pie; 510 } 511 512 return plot ; 513 } 514}