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         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 Boolean value ) {
189    //              if( value != null ) { readonly = value.booleanValue(); }
190    //      }
191            protected void setReadonly( final String value ) {
192                    if( isNotNull( value ) ) { readonly = Boolean.valueOf( value ).booleanValue(); }
193            }
194    
195            /**
196             * ?数の取?
197             *
198             * @return      ?数
199             */
200            public int getMincount() {
201                    return mincount;
202            }
203    
204            /**
205             * ?数の設?
206             * 引数が?null でなく?ゼロ??でもな??合?み、セ?します?
207             *
208             * @param value ?数(数字タイプ文字?)
209             */
210    //      protected void setMincount( final Integer value ) {
211    //              if( value != null ) { mincount = value.intValue(); }
212    //      }
213            protected void setMincount( final String value ) {
214                    if( isNotNull( value ) ) { mincount = Integer.valueOf( value ).intValue(); }
215            }
216    
217            /**
218             * ?数の取?
219             *
220             * @return      ?数
221             */
222            public int getMaxcount() {
223                    return maxcount;
224            }
225    
226            /**
227             * ?数の設?
228             * 引数が?null でなく?ゼロ??でもな??合?み、セ?します?
229             *
230             * @param value ?数(数字タイプ文字?)
231             */
232    //      protected void setMaxcount( final Integer value ) {
233    //              if( value != null ) { maxcount = value.intValue(); }
234    //      }
235            protected void setMaxcount( final String value ) {
236                    if( isNotNull( value ) ) { maxcount = Integer.valueOf( value ).intValue(); }
237            }
238    
239            /**
240             * プ?ルに保管して置く時?秒数))の取?
241             *
242             * @return      プ?ルに保管する時間(秒数)
243             */
244            public int getPooltime() {
245                    return pooltime;
246            }
247    
248            /**
249             * プ?ルに保管して置く時?秒数))の設?
250             * 引数が?null でなく?ゼロ??でもな??合?み、セ?します?
251             *
252             * @param value プ?ルに保管して置く時?秒数)(数字タイプ文字?)
253             */
254    //      protected void setPooltime( final Integer value ) {
255    //              if( value != null ) { pooltime = value.intValue(); }
256    //      }
257            protected void setPooltime( final String value ) {
258                    if( isNotNull( value ) ) { pooltime = Integer.valueOf( value ).intValue(); }
259            }
260    
261            /**
262             * ApplicationInfoオブジェクトを使用するかど?[true/false]の??を取?
263             *
264             * @return      使用するかど?
265             */
266            public boolean isApplicationInfo() {
267                    return isUseAppInfo ;
268            }
269    
270            /**
271             * ApplicationInfoオブジェクトを使用するかど?[true/false]の??を設?
272             * 引数が?null でなく?ゼロ??でもな??合?み、セ?します?
273             *
274             * @param value ApplicationInfoオブジェクトを使用するかど? [true/false]
275             */
276    //      protected void setApplicationInfo( final Boolean value ) {
277    //              if( value != null ) { isUseAppInfo = value.booleanValue(); }
278    //      }
279            protected void setApplicationInfo( final String value ) {
280                    if( isNotNull( value ) ) { isUseAppInfo = Boolean.valueOf( value ).booleanValue(); }
281            }
282    
283            /**
284             * メタ??タを受け取って
285             * dbProductName,dbProductVersion,driverName,driverVersion
286             * を?で設定しま?
287             *
288             * @og.rev 4.0.0.0 (2007/10/30) 保持??オブジェクト化に伴?更
289             * @og.rev 5.3.8.0 (2011/08/01) postgreSQL時?カラ?イプ判定??有無(ApplicationInfo.useParameterMetaData)
290             *
291             * @param meta メタ??タオブジェク?
292             * @throws SQLException
293             */
294            public void setMetaDataInfo( final DatabaseMetaData meta ) throws SQLException {
295                    dbProductName   = meta.getDatabaseProductName() ;
296                    dbProductVersion= meta.getDatabaseProductVersion() ;
297                    driverName              = meta.getDriverName() ;
298                    driverVersion   = meta.getDriverVersion() ;
299    
300                    isUseAppInfo    = isUseAppInfo && "ORACLE".equalsIgnoreCase( dbProductName ) ;
301                    isParamMetaData = "PostgreSQL".equalsIgnoreCase( dbProductName );               // 5.3.8.0 (2011/08/01)
302            }
303    
304            /**
305             * DBプロ?ト名の取?
306             *
307             * @return      DBプロ?ト名
308             */
309            public String getDbProductName() {
310                    return dbProductName;
311            }
312    
313            /**
314             * DBプロ?ト?バ?ジョンの取?
315             *
316             * @return      DBプロ?ト?バ?ジョン
317             */
318            public String getDbProductVersion() {
319                    return dbProductVersion;
320            }
321    
322            /**
323             * ドライバ?名?取?
324             *
325             * @return      ドライバ??
326             */
327            public String getDriverName() {
328                    return driverName;
329            }
330    
331            /**
332             * ドライバ?のバ?ジョンの取?
333             *
334             * @return      ドライバ?のバ?ジョン
335             */
336            public String getDriverVersion() {
337                    return driverVersion;
338            }
339    
340            /**
341             * ParamMetaData を利用するかど?[true/false]を返します?
342             *
343             * これは、PostgreSQL の時?、trueになります?
344             *
345             * @og.rev 5.3.8.0 (2011/08/01) 新規追?
346             *
347             * @return      利用するかど?[true/false]
348             */
349            public boolean useParamMetaData() {
350                    return isParamMetaData ;
351            }
352    
353            /**
354             * propMapへの追?
355             *
356             * @og.rev 5.5.2.0 (2012/05/01) 新規追?
357             * @param key プロパティのキー
358             * @param val ポロパティの値
359             */
360            protected void addProp(final String key, final String val){
361                    props.put ( key, val );
362            }
363    
364            /**
365             * propMapへの追?
366             * ??の=でkeyとvalueを?割する
367             *
368             * @og.rev 5.5.2.0 (2012/05/01) 新規追?
369             * @og.rev 5.5.2.1 (2012/05/07) propsへの追?れ,カンマを=に変更
370             * @param prop プロパティのキーと値の?合わ?
371             */
372            protected void addProp(final String prop){
373    //              if( prop!=null && prop.indexOf( ',' ) > 0 ){
374                    if( prop!=null && prop.indexOf( '=' ) > 0 ){
375                            final String key = prop.substring( 0 , prop.indexOf('=') );
376                            final String val = prop.substring( prop.indexOf('=') + 1 );
377                            addProp( key, val ); // 5.5.2.1 (2012/05/07)
378                    }
379            }
380    
381            /**
382             * propMapの取?
383             *
384             * @og.rev 5.5.2.0 (2012/05/01) 新規追?
385             *
386             * @return ?Propertiesオブジェク?
387             */
388            public Properties getProps(){
389                    return props;
390            }
391    
392            /**
393             * ??がnullでも空??でもな?ど?を評価します?
394             *
395             * スペ?ス??、trim() してから、length() します?で、false になります?
396             *
397             * @og.rev 5.1.7.0 (2010/06/01) 新規作?
398             *
399             * @param value 評価する??
400             *
401             * @return 結果(true:nullでも空??でもな?
402             */
403            private boolean isNotNull( final String value ) {
404                    return ( value != null && value.trim().length() > 0 ) ;
405            }
406    
407            /**
408             * 自??身の clone を返します?
409             *
410             * Cloneable の実?、?部?は、Object クラスの clone メソ?を読んで?す?
411             *
412             * @og.rev 5.1.7.0 (2010/06/01) 新規作?
413             *
414             * @return 自??身の clone を返します?
415             */
416            @Override
417            public EDbid clone() {
418                    try {
419                            return (EDbid)super.clone() ;
420                    }
421                    catch( CloneNotSupportedException ex ) {
422                            String errMsg = "clone が失敗しました? ;
423                            throw new RuntimeException( errMsg,ex );
424                    }
425            }
426    
427            /**
428             * 簡易な???の??化します?
429             *
430             * @og.rev 5.3.4.0 (2011/04/01) toString() の簡易版
431             * @og.rev 5.5.2.1 (2012/05/07) properties??を?力するよ?する
432             * @og.rev 5.6.6.0 (2013/07/05) 表?title)属?を追?
433             *
434             * @return ???の??
435             */
436            public String info() {
437                    final String CR = System.getProperty( "line.separator" );
438                    final StringBuilder buf = new StringBuilder();
439                    buf.append( "DBID=["  ).append( dbidKey ).append( "] , " );
440                    buf.append( "TITLE=[" ).append( title   ).append( "] , " );                     // 5.6.6.0 (2013/07/05) 表?title)属?を追?
441                    buf.append( "URL=["   ).append( url     ).append( "] , " );
442                    buf.append( "USER=["  ).append( user    ).append( "]"  );
443                    buf.append( CR );
444                    buf.append( "DB Product=[" ).append( dbProductName );
445                    buf.append( "(" ).append( dbProductVersion ).append( ")" ).append( "]" );
446                    buf.append( CR );
447                    buf.append( "DB Driver =[" ).append( driverName );
448                    buf.append( "(" ).append( driverVersion ).append( ")" ).append( "]" );
449                    buf.append( CR );
450                    buf.append( "PROPERTIES=[" ).append( props.toString() ).append( "]" ); // 5.5.2.1 (2012/05/07)
451                    buf.append( CR );
452                    return buf.toString();
453            }
454    
455            /**
456             * ???を文字?化します?
457             *
458             * @og.rev 5.3.4.0 (2011/04/01) info() メソ?を利用するように変更
459             *
460             * @return      ???の??
461             */
462            @Override
463            public String toString() {
464                    final String CR = System.getProperty( "line.separator" );
465                    final StringBuilder buf = new StringBuilder();
466                    buf.append( info() );
467    //              buf.append( "DBID=[" ).append( dbidKey ).append( "]," );
468    //              buf.append( "URL =[" ).append( url     ).append( "]," );
469    //              buf.append( "USER=[" ).append( user    ).append( "]," );
470    //              buf.append( CR );
471    //              buf.append( "DB Product=[" ).append( dbProductName );
472    //              buf.append( "(" ).append( dbProductVersion ).append( ")" ).append( "]" );
473    //              buf.append( CR );
474    //              buf.append( "DB Driver =[" ).append( driverName );
475    //              buf.append( "(" ).append( driverVersion ).append( ")" ).append( "]" );
476    //              buf.append( CR );
477                    buf.append( "MINCOUNT=[" ).append( mincount ).append( "]," );
478                    buf.append( "MAXCOUNT=[" ).append( maxcount ).append( "]," );
479                    buf.append( "POOLTIME=[" ).append( pooltime ).append( "]," );
480                    buf.append( "READONLY=[" ).append( readonly ).append( "]," );
481                    buf.append( "APPINFO =[" ).append( isUseAppInfo ).append( "]" );
482    
483                    buf.append( CR );
484                    return buf.toString();
485            }
486    }