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         * URLの取得
119         *
120         * @return      URL
121         */
122        public String getUrl() {
123                return url;
124        }
125
126        /**
127         * URLの設定
128         * 引数が、null でなく、ゼロ文字列でもない場合のみ、セットします。
129         *
130         * @param value URL文字列
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}