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}