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}