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