    001/*
    002 * Copyright (c) 2009 The openGion Project.
    003 *
    004 * Licensed under the Apache License, Version 2.0 (the "License");
    005 * you may not use this file except in compliance with the License.
    006 * You may obtain a copy of the License at
    007 *
    008 *     http://www.apache.org/licenses/LICENSE-2.0
    009 *
    010 * Unless required by applicable law or agreed to in writing, software
    011 * distributed under the License is distributed on an "AS IS" BASIS,
    012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
    013 * either express or implied. See the License for the specific language
    014 * governing permissions and limitations under the License.
    015 */
    016package org.opengion.fukurou.db;
    017
    018import java.sql.DatabaseMetaData;
    019import java.sql.SQLException;
    020import java.util.Locale;
    021import java.util.Properties;
    022
    023/**
    024 * JAXBで自動生成されたDBIDクラスを拡張したクラスです。
    025 * (継承しているわけではない)
    026 * <BR>
    027 * 以下の属性が追加されています。<BR>
    028 * dbProductName<BR>
    029 * dbProductVersion<BR>
    030 * driverName<BR>
    031 * driverVersion<BR>
    032 *
    033 * @og.rev 4.0.0.0 (2007/10/25) 新規作成
    034 * @og.rev 5.1.7.0 (2010/06/01) メソッドの修正、Cloneable の追加(浅いコピー)
    035 * @og.rev 5.6.6.0 (2013/07/05) 表題(title)属性を追加
    036 *
    037 * @version  4.0
    038 * @author       高橋正和
    039 * @since        JDK5.0,
    040 */
    041public class EDbid implements Cloneable {
    042
    043        private         String  dbidKey                 = "DEFAULT";
    044        private         String  title                   = null;                                 // 5.6.6.0 (2013/07/05) 表題(title)属性を追加
    045        private         String  url                             = null;
    046        private         String  user                    = null;
    047        private         String  password                = "";                                   // 5.7.2.0 (2014/01/10) パスワードは空文字を初期値とする。
    048        private         boolean readonly                = false;
    049        private         int             mincount                = 3;
    050        private         int             maxcount                = 30;
    051        private         int             pooltime                = 3000;
    052        private         boolean isUseAppInfo    = true;
    053        private         boolean isParamMetaData = false;                // 5.3.8.0 (2011/08/01)
    054
    055        private         String  dbProductName   = null;
    056        private         String  dbProductVersion= null;
    057        private         String  driverName              = null;
    058        private         String  driverVersion   = null;
    059
    060        /* DBConfigでpropertiesの指定を可能にします 5.5.2.0 */
    061        private final Properties props = new Properties();
    062
    063        /**
    064         * dbidKeyの取得
    065         *
    066         * 内部的には、大文字のみで管理します。
    067         *
    068         * @return      dbidキー
    069         */
    070        public String getDbidKey() {
    071                return dbidKey;
    072        }
    073
    074        /**
    075         * dbidキーの設定
    076         *
    077         * 引数が、null でなく、ゼロ文字列でもない場合のみ、セットします。
    078         * 内部的には、大文字のみで管理します。
    079         *
    080         * @og.rev 4.1.0.1 (2008/01/21) 登録時に、大文字に変換する。
    081         *
    082         * @param value 接続先ID
    083         */
    084        protected void setDbidKey( final String value ) {
    085                if( isNotNull( value ) ) { dbidKey = value.toUpperCase( Locale.JAPAN ); }
    086        }
    087
    088        /**
    089         * 表題(title)属性の取得
    090         *
    091         * この、dbidKey を表す表題を取得します。ラベル（名前）のようなものです。
    092         *
    093         * @og.rev 5.6.6.0 (2013/07/05) 新規追加
    094         *
    095         * @return      表題(title)
    096         */
    097        public String getTitle() {
    098                return title;
    099        }
    100
    101        /**
    102         * 表題(title)の設定
    103         *
    104         * 引数が、null でなく、ゼロ文字列でもない場合のみ、セットします。
    105         *
    106         * @og.rev 5.6.6.0 (2013/07/05) 新規追加
    107         * @og.rev 5.6.8.0 (2013/09/06) title が未設定の時は、dbidKey をセットしておきます。
    108         *
    109         * @param value 表題(title)
    110         */
    111        protected void setTitle( final String value ) {
    112                if( isNotNull( value ) ) { title = value; }
    113                else                                     { title = dbidKey; }           // 5.6.8.0 (2013/09/06)
    114        }
    115
    116        /**
    117         * ＵＲＬの取得
    118         *
    119         * @return      ＵＲＬ
    120         */
    121        public String getUrl() {
    122                return url;
    123        }
    124
    125        /**
    126         * ＵＲＬの設定
    127         * 引数が、null でなく、ゼロ文字列でもない場合のみ、セットします。
    128         *
    129         * @param value ＵＲＬ文字列
    130         */
    131        protected void setUrl( final String value ) {
    132                if( isNotNull( value ) ) { url = value; }
    133        }
    134
    135        /**
    136         * ユーザーの取得
    137         *
    138         * @return      ユーザー
    139         */
    140        public String getUser() {
    141                return user;
    142        }
    143
    144        /**
    145         * userの設定
    146         * 引数が、null でなく、ゼロ文字列でもない場合のみ、セットします。
    147         *
    148         * @param value user文字列
    149         */
    150        protected void setUser( final String value ) {
    151                if( isNotNull( value ) ) { user = value; }
    152        }
    153
    154        /**
    155         * パスワードの取得
    156         *
    157         * @return      パスワード
    158         */
    159        public String getPassword() {
    160                return password;
    161        }
    162
    163        /**
    164         * パスワードの設定
    165         * 引数が、null でなく、ゼロ文字列でもない場合のみ、セットします。
    166         *
    167         * @param value パスワード文字列
    168         */
    169        protected void setPassword( final String value ) {
    170                if( isNotNull( value ) ) { password = value; }
    171        }
    172
    173        /**
    174         * readonlyの取得
    175         *
    176         * @return      [true:読み取り専用/false:通常]
    177         */
    178        public boolean isReadonly() {
    179                return readonly ;
    180        }
    181
    182        /**
    183         * readonlyの設定
    184         * 引数が、null でなく、ゼロ文字列でもない場合のみ、セットします。
    185         *
    186         * @param value  readonly文字列 [true/false]
    187         */
    188        protected void setReadonly( final String value ) {
    189                if( isNotNull( value ) ) { readonly = Boolean.valueOf( value ).booleanValue(); }
    190        }
    191
    192        /**
    193         * 最小数の取得
    194         *
    195         * @return      最小数
    196         */
    197        public int getMincount() {
    198                return mincount;
    199        }
    200
    201        /**
    202         * 最小数の設定
    203         * 引数が、null でなく、ゼロ文字列でもない場合のみ、セットします。
    204         *
    205         * @param value 最小数(数字タイプ文字列)
    206         */
    207        protected void setMincount( final String value ) {
    208                if( isNotNull( value ) ) { mincount = Integer.valueOf( value ).intValue(); }
    209        }
    210
    211        /**
    212         * 最大数の取得
    213         *
    214         * @return      最大数
    215         */
    216        public int getMaxcount() {
    217                return maxcount;
    218        }
    219
    220        /**
    221         * 最大数の設定
    222         * 引数が、null でなく、ゼロ文字列でもない場合のみ、セットします。
    223         *
    224         * @param value 最大数(数字タイプ文字列)
    225         */
    226        protected void setMaxcount( final String value ) {
    227                if( isNotNull( value ) ) { maxcount = Integer.valueOf( value ).intValue(); }
    228        }
    229
    230        /**
    231         * プールに保管して置く時間(秒数))の取得
    232         *
    233         * @return      プールに保管する時間(秒数)
    234         */
    235        public int getPooltime() {
    236                return pooltime;
    237        }
    238
    239        /**
    240         * プールに保管して置く時間(秒数))の設定
    241         * 引数が、null でなく、ゼロ文字列でもない場合のみ、セットします。
    242         *
    243         * @param value プールに保管して置く時間(秒数)(数字タイプ文字列)
    244         */
    245        protected void setPooltime( final String value ) {
    246                if( isNotNull( value ) ) { pooltime = Integer.valueOf( value ).intValue(); }
    247        }
    248
    249        /**
    250         * ApplicationInfoオブジェクトを使用するかどうか[true/false]の情報を取得
    251         *
    252         * @return      使用するかどうか
    253         */
    254        public boolean isApplicationInfo() {
    255                return isUseAppInfo ;
    256        }
    257
    258        /**
    259         * ApplicationInfoオブジェクトを使用するかどうか[true/false]の情報を設定
    260         * 引数が、null でなく、ゼロ文字列でもない場合のみ、セットします。
    261         *
    262         * @param value ApplicationInfoオブジェクトを使用するかどうか [true/false]
    263         */
    264        protected void setApplicationInfo( final String value ) {
    265                if( isNotNull( value ) ) { isUseAppInfo = Boolean.valueOf( value ).booleanValue(); }
    266        }
    267
    268        /**
    269         * メタデータを受け取って
    270         * dbProductName,dbProductVersion,driverName,driverVersion
    271         * を一括で設定します
    272         *
    273         * @og.rev 4.0.0.0 (2007/10/30) 保持情報オブジェクト化に伴う変更
    274         * @og.rev 5.3.8.0 (2011/08/01) postgreSQL時のカラムタイプ判定の必要有無(ApplicationInfo.useParameterMetaData)
    275         *
    276         * @param meta メタデータオブジェクト
    277         * @throws SQLException データベースアクセスエラー
    278         */
    279        public void setMetaDataInfo( final DatabaseMetaData meta ) throws SQLException {
    280                dbProductName   = meta.getDatabaseProductName() ;
    281                dbProductVersion= meta.getDatabaseProductVersion() ;
    282                driverName              = meta.getDriverName() ;
    283                driverVersion   = meta.getDriverVersion() ;
    284
    285                isUseAppInfo    = isUseAppInfo && "ORACLE".equalsIgnoreCase( dbProductName ) ;
    286                isParamMetaData = "PostgreSQL".equalsIgnoreCase( dbProductName );               // 5.3.8.0 (2011/08/01)
    287        }
    288
    289        /**
    290         * DBプロダクト名の取得
    291         *
    292         * @return      DBプロダクト名
    293         */
    294        public String getDbProductName() {
    295                return dbProductName;
    296        }
    297
    298        /**
    299         * DBプロダクト・バージョンの取得
    300         *
    301         * @return      DBプロダクト・バージョン
    302         */
    303        public String getDbProductVersion() {
    304                return dbProductVersion;
    305        }
    306
    307        /**
    308         * ドライバー名の取得
    309         *
    310         * @return      ドライバー名
    311         */
    312        public String getDriverName() {
    313                return driverName;
    314        }
    315
    316        /**
    317         * ドライバーのバージョンの取得
    318         *
    319         * @return      ドライバーのバージョン
    320         */
    321        public String getDriverVersion() {
    322                return driverVersion;
    323        }
    324
    325        /**
    326         * ParamMetaData を利用するかどうか[true/false]を返します。
    327         *
    328         * これは、PostgreSQL の時は、trueになります。
    329         *
    330         * @og.rev 5.3.8.0 (2011/08/01) 新規追加
    331         *
    332         * @return      利用するかどうか[true/false]
    333         */
    334        public boolean useParamMetaData() {
    335                return isParamMetaData ;
    336        }
    337
    338        /**
    339         * propMapへの追加
    340         *
    341         * @og.rev 5.5.2.0 (2012/05/01) 新規追加
    342         * @param key プロパティのキー
    343         * @param val ポロパティの値
    344         */
    345        protected void addProp(final String key, final String val){
    346                props.put ( key, val );
    347        }
    348
    349        /**
    350         * propMapへの追加
    351         * 最初の=でkeyとvalueを分割する
    352         *
    353         * @og.rev 5.5.2.0 (2012/05/01) 新規追加
    354         * @og.rev 5.5.2.1 (2012/05/07) propsへの追加漏れ,カンマを=に変更
    355         * @param prop プロパティのキーと値の組み合わせ
    356         */
    357        protected void addProp(final String prop){
    358                if( prop!=null && prop.indexOf( '=' ) > 0 ){
    359                        final String key = prop.substring( 0 , prop.indexOf('=') );
    360                        final String val = prop.substring( prop.indexOf('=') + 1 );
    361                        addProp( key, val ); // 5.5.2.1 (2012/05/07)
    362                }
    363        }
    364
    365        /**
    366         * propMapの取得
    367         *
    368         * @og.rev 5.5.2.0 (2012/05/01) 新規追加
    369         *
    370         * @return 内部Propertiesオブジェクト
    371         */
    372        public Properties getProps(){
    373                return props;
    374        }
    375
    376        /**
    377         * 文字列がnullでも空文字列でもないかどうかを評価します。
    378         *
    379         * スペース文字は、trim() してから、length() しますので、false になります。
    380         *
    381         * @og.rev 5.1.7.0 (2010/06/01) 新規作成
    382         *
    383         * @param value 評価する文字列
    384         *
    385         * @return 結果(true:nullでも空文字列でもない)
    386         */
    387        private boolean isNotNull( final String value ) {
    388                return value != null && value.trim().length() > 0 ;
    389        }
    390
    391        /**
    392         * 自分自身の clone を返します。
    393         *
    394         * Cloneable の実装で、内部的には、Object クラスの clone メソッドを読んでいます。
    395         *
    396         * @og.rev 5.1.7.0 (2010/06/01) 新規作成
    397         *
    398         * @return 自分自身の clone を返します。
    399         */
    400        @Override
    401        public EDbid clone() {
    402                try {
    403                        return (EDbid)super.clone() ;
    404                }
    405                catch( CloneNotSupportedException ex ) {
    406                        String errMsg = "clone が失敗しました。" ;
    407                        throw new RuntimeException( errMsg,ex );
    408                }
    409        }
    410
    411        /**
    412         * 簡易な内部情報の文字列化します。
    413         *
    414         * @og.rev 5.3.4.0 (2011/04/01) toString() の簡易版
    415         * @og.rev 5.5.2.1 (2012/05/07) properties情報を出力するようにする
    416         * @og.rev 5.6.6.0 (2013/07/05) 表題(title)属性を追加
    417         *
    418         * @return 内部情報の文字列
    419         */
    420        public String info() {
    421                final String CR = System.getProperty( "line.separator" );
    422                final StringBuilder buf = new StringBuilder();
    423                buf.append( "DBID=["  ).append( dbidKey ).append( "] , " );
    424                buf.append( "TITLE=[" ).append( title   ).append( "] , " );                     // 5.6.6.0 (2013/07/05) 表題(title)属性を追加
    425                buf.append( "URL=["   ).append( url     ).append( "] , " );
    426                buf.append( "USER=["  ).append( user    ).append( "]"  );
    427                buf.append( CR );
    428                buf.append( "DB Product=[" ).append( dbProductName );
    429                buf.append( "(" ).append( dbProductVersion ).append( ")" ).append( "]" );
    430                buf.append( CR );
    431                buf.append( "DB Driver =[" ).append( driverName );
    432                buf.append( "(" ).append( driverVersion ).append( ")" ).append( "]" );
    433                buf.append( CR );
    434                buf.append( "PROPERTIES=[" ).append( props.toString() ).append( "]" ); // 5.5.2.1 (2012/05/07)
    435                buf.append( CR );
    436                return buf.toString();
    437        }
    438
    439        /**
    440         * 内部情報を文字列化します。
    441         *
    442         * @og.rev 5.3.4.0 (2011/04/01) info() メソッドを利用するように変更
    443         *
    444         * @return      内部情報の文字列
    445         */
    446        @Override
    447        public String toString() {
    448                final String CR = System.getProperty( "line.separator" );
    449                final StringBuilder buf = new StringBuilder();
    450                buf.append( info() );
    451        //      buf.append( "DBID=[" ).append( dbidKey ).append( "]," );
    452        //      buf.append( "URL =[" ).append( url     ).append( "]," );
    453        //      buf.append( "USER=[" ).append( user    ).append( "]," );
    454        //      buf.append( CR );
    455        //      buf.append( "DB Product=[" ).append( dbProductName );
    456        //      buf.append( "(" ).append( dbProductVersion ).append( ")" ).append( "]" );
    457        //      buf.append( CR );
    458        //      buf.append( "DB Driver =[" ).append( driverName );
    459        //      buf.append( "(" ).append( driverVersion ).append( ")" ).append( "]" );
    460        //      buf.append( CR );
    461                buf.append( "MINCOUNT=[" ).append( mincount ).append( "]," );
    462                buf.append( "MAXCOUNT=[" ).append( maxcount ).append( "]," );
    463                buf.append( "POOLTIME=[" ).append( pooltime ).append( "]," );
    464                buf.append( "READONLY=[" ).append( readonly ).append( "]," );
    465                buf.append( "APPINFO =[" ).append( isUseAppInfo ).append( "]" );
    466
    467                buf.append( CR );
    468                return buf.toString();
    469        }
    470}