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 java.sql.Connection;
019    import java.sql.Date;
020    import java.sql.ResultSet;
021    import java.sql.ResultSetMetaData;
022    import java.sql.SQLException;
023    import java.sql.Statement;
024    import java.sql.Types;
025    import java.util.Locale;
026    
027    import org.opengion.fukurou.util.Closer;
028    import org.opengion.fukurou.util.LogWriter;
029    
030    import org.jfree.data.jdbc.JDBCCategoryDataset;
031    
032    /**
033     * HybsJDBCCategoryDataset は、org.jfree.data.jdbc.JDBCCategoryDataset を継承したサブクラスで?
034     * executeQuery(Connection , String )  をオーバ?ライドして?す?
035     * これは、?のソースが?series と category の扱?異なる為で、QUERY には?
036     * select series,values from ??? また?、select series,category,values from ???
037     * の形式で検索することを想定した作りに修正して?す?
038     * series の縦持ち 対応です?
039     * 参?:JFreeChart : a free chart library for the Java(tm) platform(jfreechart-1.0.6)
040     *
041     * @og.rev 3.8.9.2 (2007/07/28) 新規作?
042     *
043     * @version  0.9.0  2001/05/05
044     * @author   Kazuhiko Hasegawa
045     * @since    JDK1.1,
046     */
047    public class HybsJDBCCategoryDataset extends JDBCCategoryDataset {
048            private static final long serialVersionUID = 518020100701L ;
049    
050            /**
051             * Creates a new dataset with the given database connection, and executes
052             * the supplied query to populate the dataset.
053             *
054             * @param connection  the connection.
055             * @param query  the query.
056             *
057             * @throws SQLException if there is a problem executing the query.
058             */
059            public HybsJDBCCategoryDataset( final Connection connection, final String query ) throws SQLException {
060                    super( connection );
061                    innerQuery( connection,query );
062            }
063    
064            /**
065             * Populates the dataset by executing the supplied query against the
066             * existing database connection.  If no connection exists then no action
067             * is taken.
068             *
069             * The results from the query are extracted and cached locally, thus
070             * applying an upper limit on how many rows can be retrieved successfully.
071             *
072             * @param con  the connection.
073             * @param query  the query.
074             *
075             * @throws SQLException if there is a problem executing the query.
076             * @see org.jfree.data.jdbc.JDBCCategoryDataset#executeQuery(Connection , String )
077             */
078            @Override
079            public void executeQuery( final Connection con, final String query ) throws SQLException {
080                    innerQuery( con,query );
081            }
082    
083            /**
084             * Populates the dataset by executing the supplied query against the
085             * existing database connection.  If no connection exists then no action
086             * is taken.
087             *
088             * The results from the query are extracted and cached locally, thus
089             * applying an upper limit on how many rows can be retrieved successfully.
090             *
091             * @og.rev 4.0.0.0 (2007/11/30) public な executeQuery メソ??private 化します?
092             * @og.rev 5.1.8.0 (2010/07/01) column名?大?化し??名?取得?#getColumnLabel()で行う?PotgreSQL対?バグ修正)
093             *
094             * @param con  the connection.
095             * @param query  the query.
096             *
097             * @throws SQLException if there is a problem executing the query.
098             * @see org.jfree.data.jdbc.JDBCCategoryDataset#executeQuery(Connection , String )
099             */
100            private void innerQuery( final Connection con, final String query ) throws SQLException {
101    
102                    Statement statement = null;
103                    ResultSet resultSet = null;
104                    try {
105                            statement = con.createStatement();
106                            resultSet = statement.executeQuery(query);
107                            ResultSetMetaData metaData = resultSet.getMetaData();
108    
109                            int columnCount = metaData.getColumnCount();
110    
111                            if(columnCount < 2) {
112                                    String errMsg = "JDBCCategoryDataset.executeQuery() : insufficient columns "
113                                                            + "returned from the database. \n"
114                                                            + " SQL=" + query ;
115                                    throw new SQLException( errMsg );
116                            }
117    
118                            // 5.1.8.0 (2010/07/01) column名?大?化し??名?取得?#getColumnLabel()で行う?PotgreSQL対?バグ修正)
119    //                      String series = metaData.getColumnName(1) ;
120                            String series = metaData.getColumnLabel(1).toUpperCase( Locale.JAPAN );
121                            while (resultSet.next()) {
122                                    // first column contains the row key...
123                                    String category   = resultSet.getString(1);
124                                    Object objVal     = resultSet.getObject(columnCount);
125                                    int    columnType = metaData.getColumnType(columnCount);
126    
127                                    if( columnCount > 2 ) { series = resultSet.getString(2); }
128    
129                                    Number value = null;
130                                    switch (columnType) {
131                                            case Types.TINYINT:
132                                            case Types.SMALLINT:
133                                            case Types.INTEGER:
134                                            case Types.BIGINT:
135                                            case Types.FLOAT:
136                                            case Types.DOUBLE:
137                                            case Types.DECIMAL:
138                                            case Types.NUMERIC:
139                                            case Types.REAL: {
140                                                    value = (Number)objVal;
141                                                    break;
142                                            }
143                                            case Types.DATE:
144                                            case Types.TIME:
145                                            case Types.TIMESTAMP: {
146                                                    Date date = (Date) objVal;
147                                                    value = Long.valueOf(date.getTime());
148                                                    break;
149                                            }
150                                            case Types.CHAR:
151                                            case Types.VARCHAR:
152                                            case Types.LONGVARCHAR: {
153                                                    String string = (String)objVal;
154                                                    try {
155                                                            value = Double.valueOf(string);
156                                                    }
157                                                    catch (NumberFormatException ex) {
158                                                            LogWriter.log( ex );
159                                                            // suppress (value defaults to null)
160                                                    }
161                                                    break;
162                                            }
163                                            default:
164                                                    // not a value, can't use it (defaults to null)
165                                                    break;
166                                    }
167                                    setValue(value, series, category);
168                            }
169                    }
170                    finally {
171                            Closer.resultClose( resultSet ) ;
172                            Closer.stmtClose( statement ) ;
173                    }
174            }
175    
176    }