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.fukurou.db;
017    
018    import java.sql.DatabaseMetaData;
019    import java.sql.SQLException;
020    import java.util.Locale;
021    import 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     */
041    public 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    }