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