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 static org.opengion.fukurou.util.HybsConst.CR ;          // 6.1.0.0 (2014/12/26)
019    import org.opengion.fukurou.util.Closer ;
020    import org.opengion.fukurou.util.LogWriter;
021    import org.opengion.fukurou.util.ColorMap;                      // 6.0.2.2 (2014/10/03)
022    // import org.opengion.fukurou.db.DBUtil;                       // 6.0.4.0 (2014/11/28)
023    import org.opengion.fukurou.db.ResultSetValue;          // 6.0.4.0 (2014/11/28)
024    // import org.opengion.hayabusa.common.HybsSystem;
025    import org.opengion.hayabusa.db.DBTableModel;
026    
027    import java.sql.Connection;
028    import java.sql.ResultSet;
029    // import java.sql.ResultSetMetaData;                           // 6.0.4.0 (2014/11/28)
030    import java.sql.SQLException;
031    import java.sql.Statement;
032    
033    import java.util.List;
034    import java.util.ArrayList;
035    import java.util.Arrays;
036    // import java.util.Locale;
037    import java.util.Set;
038    import java.util.HashSet;
039    
040    import java.awt.Color;                                                          // 6.0.2.2 (2014/10/03)
041    
042    import org.jfree.data.Range;
043    import org.jfree.data.category.DefaultCategoryDataset;
044    
045    /**
046     * HybsCategoryDataset は、org.jfree.data.category.DefaultCategoryDataset を継承したサブクラスでã€?
047     * HybsDataset インターフェースの実è£?‚¯ラスになってã�?�¾すã?
048     * これは、JDBCCategoryDatasetの ãƒ??タベã?ス機è?と、DBTableModel から Dataset を作æ?する機è?ã‚?
049     * 兼ね備えてã�?�¾すã?
050     * HybsDataset インターフェースは、シリーズのラベルæŒ?®šã?カãƒ?‚´リカラーバã?、パレート図用積上げ
051     * 計算などの処ç�?‚’行うための、インターフェースで、それらの処ç�?‚‚、HybsCategoryDataset に実è£?�—ますã?
052     * 
053     * こã?クラスでは、検索結果をå?部で持っておき、getValue(int row, int column)
054     * メソãƒ?ƒ‰で直接値を返しますã?
055     * 
056     * select category,series1,series2,series3,?¥?¥?¥ from ?¥?¥?¥
057     * series の横持ち(標準と同じ) 対応ですã?
058     * category カラãƒ??値は、カãƒ?‚´リのラベルになりã?series1,2,3 のラベルがシリーズラベル、å?ã�?
059     * seriesの値になりますã?
060     *
061     * カãƒ?‚´リのカラー名ã?æŒ?®šを行う場合ã?æœ?¾Œã?カラãƒ?�Œ、カラー名ã?æ–?­—å?になりますã?
062     * select category,series1,series2,series3,?¥?¥?¥,color from ?¥?¥?¥
063     * coloræ–?­—å?の検索結果は、Dataset には含まれませんã€?
064     *
065     * そã?場合ã?color カラãƒ?�Œシリーズとして認識されなã�?§˜に、ChartDatasetTag で、useCategoryColor="true"
066     * を指定しておくå¿?¦�がありますã?こã?フラグは、HybsCategoryDataset を使ã�??ç�?»¥外では効果が
067     * ありません?ˆシリーズとして使用されてしまã�?¼‰ã?でご注意くã�?�•ã�??
068     * こã?フラグは、カãƒ?‚´リカラーバã?を使ã�??合にはå¿?¦�ですが、カãƒ?‚´リカラーバã?と?ˆ例えばパレート図??
069     * を合成するå?合に、パレート図側にã‚?useCategoryColor="true" を設定しておけば、同じSQL またã?ã€?
070     * DBTableModel を使ã�?º‹ができるとã�?�†ためのフラグですã?
071     *
072     * なおã?Colorコードã?、このクラスで作æ?しますが、Renderer に与えるå¿?¦�がありますã?
073     * 通常のRenderer には、categoryにカラーを指定する機è?がありませんので、HybsBarRenderer に
074     * setCategoryColor( Color[] ) メソãƒ?ƒ‰を用意しますã?(正確には、HybsDrawItem インターフェース)
075     * こã?Renderer で、getItemPaint( int  , int )メソãƒ?ƒ‰をオーバã?ライドすることで、カãƒ?‚´リごとの
076     * 色を返しますã?
077     *
078     * @og.rev 5.8.5.0 (2015/02/06) 6.0.2.2 (2014/10/03) からのé€?§»æ¤?
079     *
080     * @version  5.8.5.0 (2015/02/06)
081     * @author   Kazuhiko Hasegawa
082     * @since    JDK1.6,
083     */
084    public class HybsCategoryDataset extends DefaultCategoryDataset implements HybsDataset {
085            private static final long serialVersionUID = 602220141003L ;
086    
087            private final Set<String> cateCheck       = new HashSet<String>();          // category の重è¤?ƒ�ェãƒ?‚¯
088            private final int       hsCode  = Long.valueOf( System.nanoTime() ).hashCode() ;        // 5.1.9.0 (2010/08/01) equals,hashCode
089    
090            private String[]        seriesLabels            ;
091            private boolean         isColorCategory         ;                               // 6.0.2.2 (2014/10/03)
092            private boolean         isParetoData            ;                               // 6.0.2.2 (2014/10/03)
093    
094            private Number[][]      numdata                         ;
095            private Color[]         categoryColor           ;
096            private Range           range                           ;
097    
098            /**
099             * CategoryDataset を構築するに当たりã?初期パラメータを設定しますã?
100             *
101             * @og.rev 6.0.2.2 (2014/10/03) 新規追åŠ?
102             *
103             * @param lbls  シリーズのラベル名é?åˆ?
104             * @param isColCate  カãƒ?‚´リのカラー名ã?æŒ?®š有無(true:使用する)
105             * @param isPareto   パレート図用のDatasetとして処ç�?�™るかどã�?�‹(true:処ç�?�™ã‚?
106             */
107            public void initParam( final String[] lbls , final boolean isColCate , final boolean isPareto ) {
108                    // 6.0.2.5 (2014/10/31) refactoring
109    //              seriesLabels    = lbls;
110                    if( lbls != null ) { seriesLabels = lbls.clone(); }
111                    isColorCategory = isColCate;
112                    isParetoData    = isPareto;
113            }
114    
115            /**
116             * コネクションと、SQLæ–?­—å?から、CategoryDataset のãƒ??タを作æ?しますã?
117             * å…?�¨なるå?ç�??、org.jfree.data.jdbc.JDBCCategoryDataset#executeQuery( Connection,String ) ですã?
118             *
119             * こã?メソãƒ?ƒ‰では、å?に #initParam(String[],boolean,isPareto) のパラメータを使用して
120             * 検索した結果のãƒ??タを加工、å?ç�?�—ますã?
121             * またã?å†?ƒ¨çš?�«、データをキャãƒ?‚·ュする事と、データç¯?›²を示ã�?レンジオブジェクãƒ?を作æ?しますã?
122             *
123             * @og.rev 6.0.2.2 (2014/10/03) 新規追åŠ?
124             * @og.rev 6.0.2.3 (2014/10/19) パレート図はã€?00åˆ?އにするã€?
125             * @og.rev 6.0.4.0 (2014/11/28) ResultSetValue を使用するように変更ã€?
126             *
127             * @param con  コネクション
128             * @param query  SQLæ–?­—å?
129             *
130             * @throws SQLException ãƒ??タベã?スアクセス時ã?エラー
131             * @see         org.jfree.data.jdbc.JDBCCategoryDataset#executeQuery( Connection,String )
132             * @see         org.opengion.fukurou.db.ResultSetValue
133             */
134            public void execute( final Connection con, final String query ) throws SQLException {
135    
136                    // Range を予め求めておきますã?
137                    double minimum = Double.POSITIVE_INFINITY;
138                    double maximum = Double.NEGATIVE_INFINITY;
139                    double sum     = 0.0d;                                  // 6.0.2.3 (2014/10/19) パレート図用合è¨?
140    
141                    List<Color> colorList = null;                     // 6.0.2.2 (2014/10/03) カãƒ?‚´リカラー
142    
143                    Statement statement = null;
144                    ResultSet resultSet = null;
145                    try {
146                            statement = con.createStatement();
147                            resultSet = statement.executeQuery(query);
148    
149                            // 6.0.4.0 (2014/11/28) ResultSetValue を使用するように変更ã€?
150    //                      ResultSetMetaData metaData = resultSet.getMetaData();
151                            final ResultSetValue rsv = new ResultSetValue( resultSet );
152    
153    //                      int dataSize = metaData.getColumnCount() -1;    // series の個数は、category åˆ?‚’引いた数ã€?
154                            int dataSize = rsv.getColumnCount() -1;                 // series の個数は、category åˆ?‚’引いた数ã€?
155                            if( isColorCategory ) {                                                 // ColorCategory使用æ™?
156                                    colorList       = new ArrayList<Color>();         // カãƒ?‚´リカラー
157                                    dataSize--;                                                                     // æœ?µ‚カラãƒ?�Œ Colorコードなので、ã?イナスするã€?
158                            }
159    
160                            if( dataSize<1 ) {
161                                    final String errMsg = "JDBCCategoryDataset.executeQuery() : insufficient columns "
162                                                            + "returned from the database. \n"
163                                                            + " SQL=" + query ;
164                                    throw new SQLException( errMsg );
165                            }
166    
167                            // 6.0.2.0 (2014/09/19) シリーズのラベル名é?列を使ã�?�¨きã?、シリーズ数å¿?¦�ã?
168                            if( seriesLabels != null && seriesLabels.length < dataSize ) {
169                                    final String errMsg = "seriesLabels を使用する場合ã?、å¿?�šシリーズ数以上指定してくださいã€?
170                                                                    + CR
171                                                                    + " seriesLabels=" + Arrays.toString( seriesLabels )
172                                                                    + CR
173                                                                    + " seriesLabels.length=" + seriesLabels.length
174                                                                    + " dataSize=" + dataSize
175                                                                    + CR ;
176                                    throw new IllegalArgumentException( errMsg );
177                            }
178    
179                            String[] series  = new String[dataSize];
180                            // 6.0.4.0 (2014/11/28) ResultSetValue を使用するように変更ã€?
181                            final String[] names   = rsv.getNames();
182    //                      int[] columnType = new int[dataSize];
183                            // ORACLEの引数はã€??列+1から始まるã?で、metaDataはi??から取得ã?series と、seriesLabels は?�から始まるã?
184                            for( int i=0; i<dataSize; i++ ) {
185                                    series[i] = seriesLabels != null && seriesLabels[i] != null
186                                                                            ? seriesLabels[i]
187    //                                                                      : metaData.getColumnLabel(i+2).toUpperCase( Locale.JAPAN );
188                                                                            : names[i+1] ;
189    //                              columnType[i] = metaData.getColumnType(i+2);
190                            }
191    
192                            final List<Number[]> rowList = new ArrayList<Number[]>();
193                            // 6.0.4.0 (2014/11/28) ResultSetValue を使用するように変更ã€?
194    //                      while (resultSet.next()) {
195                            while (rsv.next()) {
196                                    Number[] clmList = new Number[dataSize];
197                                    // first column contains the row key...
198                                    // 6.0.2.0 (2014/09/19) columnKeyは、series , rowKey は、category に変更するã€?
199    //                              String category = resultSet.getString(1);                                       // 4.3.3.6 (2008/11/15) Generics警告対å¿?
200                                    final String category = uniqCategory( resultSet.getString(1) ); // 6.0.2.3 (2014/10/10) categoryの重è¤?›ž避
201    
202                                    for( int i=0; i<dataSize; i++ ) {                                    // 6.0.2.2 (2014/10/03) dataSize åˆ?›žすã?
203                                            Number value = null;
204                                            // 6.0.2.1 (2014/09/26) org.opengion.fukurou.db.DBUtil に、移å‹?
205                                            try {
206                                                    // JDBCのアドレスæŒ?®šã?ã€?2 するã€?category åˆ?�¨ã€?½±??¾žレスが1から始まる為ã€?
207    //                                              value = DBUtil.getNumber( columnType[i],resultSet.getObject(i+2) );
208                                                    // ResultSetValueのカラãƒ?•ª号はã€?1 するã€?category åˆ?�Œあるため)
209                                                    value = rsv.getNumber( i+1 );
210                                            }
211                                            catch( SQLException ex ) {              // 6.0.4.0 (2014/11/28) ResultSetValue を使用するのでã€?
212                                                    LogWriter.log( ex );
213                                            }
214                                            catch( RuntimeException ex ) {
215                                                    LogWriter.log( ex );
216                                            }
217    
218                                            clmList[i] = value;
219                                            addValue(value, series[i], category);           // 6.0.2.0 (2014/09/19) columnKeyは、series , rowKey は、category に変更するã€?
220                                            // Range 求め
221                                            if( value != null ) {
222                                                    final double dbl = value.doubleValue();
223                                                    if( isParetoData ) {                                    // 6.0.2.3 (2014/10/19) パレート図用合è¨?
224                                                            sum += dbl ;
225                                                    } else {
226                                                            if( dbl     < minimum ) { minimum = dbl; }
227                                                            if( maximum < dbl     ) { maximum = dbl; }
228                                                    }
229                                            }
230                                    }
231                                    rowList.add( clmList );
232                                    // 6.0.2.2 (2014/10/03) ColorCategory は、最後ã?カラãƒ?
233                                    if( isColorCategory ) {
234                                            // 6.0.4.0 (2014/11/28) ResultSetValue を使用するように変更ã€?
235    //                                      String colStr = resultSet.getString(dataSize+2);                // æœ?¾Œã?カラãƒ?
236                                            final String colStr = rsv.getValue(dataSize+1);                         // æœ?¾Œã?カラãƒ?
237                                            final Color color   = ColorMap.getColorInstance( colStr );      // 6.0.2.1 (2014/09/26) StringUtil �ColorMap
238                                            colorList.add( color );
239                                    }
240                            }
241                            numdata = rowList.toArray( new Number[dataSize][rowList.size()] );
242                    }
243                    finally {
244                            Closer.resultClose( resultSet );
245                            Closer.stmtClose( statement );
246                    }
247    
248                    // colorList ã�?null でなã�?�‹どã�?�‹で判定ã?
249                    if( isColorCategory && colorList != null ) {
250                            categoryColor = colorList.toArray( new Color[colorList.size()] );
251                    }
252    
253                    // 6.0.2.3 (2014/10/19) パレート図はã€?00åˆ?އにするã€?
254    //              if( isParetoData ) { maximum = changeParetoData(); }
255                    if( isParetoData ) {
256                            changeParetoData( sum );
257                            minimum = 0.0;
258                            maximum = 100.0;
259                    }
260    
261                    range = new Range( minimum, maximum );
262            }
263    
264            /**
265             * DBTableModelオブジェクトからã?CategoryDataset のãƒ??タを作æ?しますã?
266             * openGionの独自処ç�?ƒ¡ソãƒ?ƒ‰ですã?
267             *
268             * こã?メソãƒ?ƒ‰では、å?に #initParam(String[],boolean,isPareto) のパラメータを使用して
269             * 検索した結果のãƒ??タを加工、å?ç�?�—ますã?
270             * またã?å†?ƒ¨çš?�«、データをキャãƒ?‚·ュする事と、データç¯?›²を示ã�?レンジオブジェクãƒ?を作æ?しますã?
271             *
272             * @og.rev 6.0.2.2 (2014/10/03) 新規追åŠ?
273             * @og.rev 6.0.2.3 (2014/10/19) パレート図はã€?00åˆ?އにするã€?
274             *
275             * @param table DBTableModelオブジェクãƒ?
276             * @see         #execute( Connection,String )
277             */
278            public void execute( final DBTableModel table ) {
279                    final int clmNo = table.getColumnCount();
280                    final int rowNo = table.getRowCount();
281    
282                    // Range を予め求めておきますã?
283                    double minimum = Double.POSITIVE_INFINITY;
284                    double maximum = Double.NEGATIVE_INFINITY;
285                    double sum     = 0.0d;                                  // 6.0.2.3 (2014/10/19) パレート図用合è¨?
286    
287                    int dataSize = clmNo -1;                                                // series の個数は、category åˆ?‚’引いた数ã€?
288                    List<Color> colorList = null;                     // 6.0.2.2 (2014/10/03) カãƒ?‚´リカラー
289                    if( isColorCategory ) {                                                 // ColorCategory使用æ™?
290                            colorList       = new ArrayList<Color>();         // カãƒ?‚´リカラー
291                            dataSize--;                                                                     // æœ?µ‚カラãƒ?�Œ Colorコードなので、ã?イナスするã€?
292                    }
293    
294                    numdata = new Number[rowNo][clmNo];
295    
296                    // ※ DBTableModel の row,col と、Dataset の row,col はã€??になってã�?�¾すã?
297                    for( int row=0; row<rowNo; row++ ) {
298    //                      String   category = table.getValue( row,0 );                                    // ?‘番目(アドレス=0)はカラãƒ??設定å?
299                            final String   category = uniqCategory( table.getValue( row,0 ) );      // 6.0.2.3 (2014/10/10) categoryの重è¤?›ž避
300                            final String[] vals     = table.getValues( row );
301                            for( int clm=0; clm<dataSize; clm++ ) {
302                                    final String sval = vals[clm+1];                                // ?’番目(アドレス=1)からカラãƒ?ƒ‡ータを取å¾?
303                                    final double val  = ( sval == null || sval.isEmpty() ) ? 0.0d : Double.parseDouble( sval ) ;
304    
305                                    addValue( val , seriesLabels[clm] , category );         // val,row,clm
306    //                              numdata[row][clm] = new Double( val );
307                                    numdata[row][clm] = Double.valueOf( val );                      // 6.0.2.4 (2014/10/17) 効çŽ??悪ã�?ƒ¡ソãƒ?ƒ‰
308                                    // Range 求め
309                                    if( isParetoData ) {                                    // 6.0.2.3 (2014/10/19) パレート図用合è¨?
310                                            sum += val ;
311                                    } else {
312                                            if( val     < minimum ) { minimum = val; }
313                                            if( maximum < val     ) { maximum = val; }
314                                    }
315                            }
316    
317                            // 6.0.2.2 (2014/10/03) ColorCategory は、最後ã?カラãƒ?
318                            if( isColorCategory ) {
319                                    final String colStr = vals[dataSize+1];                 // æœ?¾Œã?カラãƒ?
320                                    final Color color   = ColorMap.getColorInstance( colStr );      // 6.0.2.1 (2014/09/26) StringUtil �ColorMap
321                                    colorList.add( color );
322                            }
323                    }
324    
325                    // colorList ã�?null でなã�?�‹どã�?�‹で判定ã?
326                    if( isColorCategory && colorList != null ) {
327                            categoryColor = colorList.toArray( new Color[colorList.size()] );
328                    }
329    
330                    // 6.0.2.3 (2014/10/19) パレート図はã€?00åˆ?އにするã€?
331    //              if( isParetoData ) { maximum = changeParetoData(); }
332                    if( isParetoData ) {
333                            changeParetoData( sum );
334                            minimum = 0.0;
335                            maximum = 100.0;
336                    }
337    
338                    range = new Range( minimum, maximum );
339            }
340    
341            /**
342             * æŒ?®šされた行å?から、数字オブジェクトを取得しますã?
343             *
344             * @param       row     行番号(シリーズ?š横æŒ?clm相å½?
345             * @param       column  カラãƒ?•ª号(カãƒ?‚´リ?š縦持ち=row相å½?
346             *
347             * @return      æŒ?®šã?行å?の値
348             */
349            @Override
350            public Number getValue( final int row, final int column ) {
351                    // 注意:行å?のé ?º�がé€?�§すã?
352                    return numdata[column][row];
353            }
354    
355            /**
356             * レンジオブジェクトを取得しますã?(独自メソãƒ?ƒ‰)
357             *
358             * @return      レンジオブジェクãƒ?
359             */
360            public Range getRange() {
361                    return range;
362            }
363    
364            /**
365             * パレート図用のDatasetに値を書き換えますã?(独自メソãƒ?ƒ‰)
366             *
367             * 色ã€?�¨方法ã?あると思いますが、簡易的に、å?部の Number配å?ã‚?
368             * 積上げ計算して、パレート図用のãƒ??タを作æ?しますã?
369             * レンジオブジェクãƒ?も変更しますã?
370             *
371             * ※ 注意:親クラスのå†?ƒ¨に持ってã�?‚‹実データは変更されてã�?�ªã�??でã€?
372             * 場合によっては、おかしな動きをするかもしれませんã€?
373             * そã?場合ã?、上位にもデータをセãƒ?ƒˆするように変更するå¿?¦�がありますã?
374             *
375             * なおã?行å?のé ?º�が、イメージと異なりますã?で、注意願いますã?
376             * (columnは、series , row は、category で、シリーズを積み上げまã�?
377             *
378             * @og.rev 6.0.2.1 (2014/09/26) 新規追åŠ?
379             * @og.rev 6.0.2.2 (2014/10/03) HybsDataset i/f
380             * @og.rev 6.0.2.3 (2014/10/19) パレート図はã€?00åˆ?އにするã€?
381             *
382             * @param  sum ãƒ??タの合è¨?
383             */
384    //      private double changeParetoData() {
385            private void changeParetoData( final double sum ) {
386    //              if( numdata == null || numdata.length == 0 || numdata[0].length == 0 ) { return 0.0d; }
387                    if( numdata == null || numdata.length == 0 || numdata[0].length == 0 || sum == 0.0 ) { return ; }
388    
389                    final int rowCnt = numdata[0].length ;
390                    final int clmCnt = numdata.length ;
391    
392    //              double maximum = Double.NEGATIVE_INFINITY;
393                    for( int rowNo=0; rowNo<rowCnt; rowNo++ ) {                  // 行å?がé?ã€?
394                            double val = 0.0;               // 初期値
395                            for( int clmNo=0; clmNo<clmCnt; clmNo++ ) {          // 積上げ計算するカラãƒ?�§ループを回すã€?
396                                    final Number v1Num = numdata[clmNo][rowNo];
397                                    if(v1Num != null) {
398                                            val += v1Num.doubleValue();                             // 積上げ計算ã?、å?の値のままにしておきますã?
399                                    }
400                                    // ãƒ??タをセãƒ?ƒˆするときにã€?¼‘00å?çŽ?�«しますã?
401    //                              numdata[clmNo][rowNo] = new Double(val);
402                                    numdata[clmNo][rowNo] = Double.valueOf( Math.round( val * 1000.0 / sum ) / 10.0 );
403            // きちんと計算するならã?BigDecimal で、スケールを指定して四捨五å?すべきã?・・かも
404            //                      java.math.BigDecimal bd = new BigDecimal( val * 100.0 / sum );
405            //                      numdata[clmNo][rowNo] = bd.setScale( 1, java.math.RoundingMode.HALF_UP );
406                            }
407    //                      if( maximum < val ) { maximum = val; }                       // パレート図用の積上げなので、最大値は、最後ã?ãƒ??タ
408                    }
409    
410    //              return maximum;
411            }
412    
413            /**
414             * categoryカラー配å?を取得しますã?(独自メソãƒ?ƒ‰)
415             *
416             * こã?クラスは、ä¸?•ªæœ?¾Œã?カラãƒ?‚’、色æ–?­—å?として処ç�?�—、categoryにColorを指定できますã?
417             * selectæ–?�§æŒ?®šされてã�?�ªかったå?合ã?、null を返しますã?
418             *
419             * select category,series1,series2,series3,?¥?¥?¥,color from ?¥?¥?¥
420             *
421             * @og.rev 6.0.2.2 (2014/10/03) 新規追åŠ?
422             *
423             * なおã?Colorコードã?、このクラスで作æ?しますが、Renderer に与えるå¿?¦�がありますã?
424             * 通常のRenderer には、categoryにカラーを指定する機è?がありませんので、HybsBarRenderer に
425             * setCategoryColor( Color[] ) メソãƒ?ƒ‰を用意しますã?(正確には、HybsDrawItem インターフェース)
426             * こã?Renderer で、getItemPaint( int  , int )メソãƒ?ƒ‰をオーバã?ライドすることで、カãƒ?‚´リごとの
427             * 色を返しますã?
428             * こã?設定を行うと、シリーズは、カãƒ?‚´リと同ä¸?‰²になりますã?
429             *
430             * @return      categoryカラー配å?(なければ null)
431             */
432            public Color[] getCategoryColor() {
433                    // 6.0.2.5 (2014/10/31) refactoring
434    //              return categoryColor;
435                    return ( categoryColor == null ) ? null : categoryColor.clone();
436            }
437    
438            /**
439             * category の重è¤?‚’さけて、å¿?¦�であれば、新しいカãƒ?‚´リ名を作æ?しますã?
440             *
441             * カãƒ?‚´リが同じå?合ã?JFreeChartでは、表示されません。これã?、同じカãƒ?‚´リと認識さã‚?
442             * 値が上書きされるためですã?
443             * こã?問題ã?、なかなか気づきにくく、デバッグ等に時間がかかってしまã�?�¾すã?
444             * 重è¤?ƒ�ェãƒ?‚¯を行い、警告してもよã�??ですが、ここでは、新しいカãƒ?‚´リ名を作æ?することで
445             * エラーを回避しつつ、とりあえずグラフ表示をするよã�?�«しますã?
446             *
447             * @og.rev 6.0.2.3 (2014/10/10) 新規追åŠ?
448             *
449             * @param       category        å…??カãƒ?‚´リå�?
450             * @return      新しいå…??カãƒ?‚´リå�?
451             */
452            private String uniqCategory( final String category ) {
453                    String newCate = category ;
454                    int i = 0;
455                    while( !cateCheck.add( newCate ) ) {    // すでに存在してã�?‚‹場合ã?
456                            newCate = category + "(" + (i++) + ")" ;
457                    }
458    
459                    return newCate ;
460            }
461    
462            /**
463             * こã?æ–?­—å?とæŒ?®šされたオブジェクトを比è¼?�—ますã?
464             *
465             * 親クラスで、equals メソãƒ?ƒ‰が実è£?�•れてã�?‚‹ため、警告がでますã?
466             *
467             * @og.rev 5.1.8.0 (2010/07/01) findbug対å¿?
468             * @og.rev 5.1.9.0 (2010/08/01) findbug対å¿?
469             *
470             * @param       object  比è¼?�™るオブジェクãƒ?
471             *
472             * @return      Objectが等しã�??合ã? true、そã�?�§なã�??合ã? false
473             */
474            @Override
475            public boolean equals( final Object object ) {
476                    if( super.equals( object ) ) {
477                            return hsCode == ((HybsCategoryDataset)object).hsCode;
478                    }
479                    return false;
480            }
481    
482            /**
483             * こã?オブジェクトã?ハッシュコードを取得しますã?
484             *
485             * @og.rev 5.1.8.0 (2010/07/01) findbug対å¿?
486             * @og.rev 5.1.9.0 (2010/08/01) findbug対å¿?
487             *
488             * @return      ハッシュコーãƒ?
489             */
490            @Override
491            public int hashCode() { return hsCode ; }
492    }