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    //}