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