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.io.File;
019 import java.net.URL;
020 import java.util.ArrayList;
021 import java.util.Arrays;
022 import java.util.Comparator;
023 import java.util.LinkedHashMap;
024 import java.util.List;
025 import java.util.Locale;
026 import java.util.Map;
027
028 import org.opengion.fukurou.util.StringUtil;
029 import org.opengion.fukurou.util.FileUtil;
030 import org.opengion.fukurou.util.LogWriter;
031 import org.opengion.fukurou.xml.DomParser;
032 import org.w3c.dom.Document;
033 import org.w3c.dom.Element;
034 import org.w3c.dom.Node;
035 import org.w3c.dom.NodeList;
036
037 /**
038 * DB設定XMLの?をJAXBを利用してロードす?
039 * Driverをロードす?
040 * 上記2つの機?を備えたクラスで?
041 *
042 * 外部からはgetDbidメソ?を利用してDB設?ExpandedDbid?を取得します?
043 * DB設定情報が無??合にXMLを読みに?ます?
044 * こ?DBIDを決めるキーは、?部取り込み字に、大?変換されます?で、大??
045 * 小文字?区別はありません?
046 *
047 * @og.rev 4.0.0.0 (2007/10/25) 新規作?
048 * @og.rev 5.1.7.0 (2010/06/01) org.opengion.fukurou.xml.jaxb.dbid 関??
049 * @og.group 初期?
050 *
051 * @version 4.0
052 * @author 高橋正?
053 * @since JDK6.0,
054 */
055 public class DatabaseConfig {
056
057 // fukurou?完結させるため、HybsDataからは読み込まずにここに書?
058 private static final String DEFAULT_DRIVER = "oracle.jdbc.OracleDriver";
059
060 // XMLファイル関連
061 // private transient final String XmlFilename;
062 // private final String XmlFilename;
063 private final String xmlFilename; // 5.7.2.2 (2014/01/24)
064 // private static final String SCHEMA_FILENAME = "DBConfig.xsd";//xsdはfukurou.xml.jaxb.dbidパッケージに置?
065
066 // private transient final Map<String, EDbid> dbidMap = new HashMap<String, EDbid>();
067 // private transient List<String> driverList = new ArrayList<String>();
068 // private Map<String, EDbid> dbidMap = new HashMap<String, EDbid>();
069 private Map<String, EDbid> dbidMap = new LinkedHashMap<String, EDbid>(); // 5.6.7.0 (2013/07/27)
070 // private List<String> driverList = new ArrayList<String>();
071 private List<String> driverList = new ArrayList<String>();
072
073 // 5.6.7.0 (2013/07/27) プル?ンメニュー用の??の、キャ?ュ用変数?
074 private String codeKeyVal = null; // 初めて要求されたときに、セ?します?
075
076 // private static final String CR = System.getProperty( "line.separator" );
077
078 /* DBIDのキーの?を管?ます?5.1.9.0 (2010/08/01) */
079 // 5.5.2.0 (2012/05/01) property追?
080 // private static final String[] DBID_INFO_KEYS
081 // = { "dbidKey", "url", "user", "password", "readonly"
082 // , "mincount", "maxcount", "pooltime", "applicationInfo" };
083 // private static final String[] DBID_INFO_KEYS
084 // = { "dbidKey", "url", "user", "password", "readonly"
085 // , "mincount", "maxcount", "pooltime", "applicationInfo","property" };
086 // 5.6.6.0 (2013/07/05) 表?title)属?を追?
087 private static final String[] DBID_INFO_KEYS
088 = { "dbidKey", "title", "url", "user", "password", "readonly"
089 , "mincount", "maxcount", "pooltime", "applicationInfo","property" };
090
091 /* DBDRIVERのキーのを管?ます?5.1.9.0 (2010/08/01) */
092 private static final String DBDRIVER_CLASS_KEY = "class";
093
094 /**
095 * 初期値を使ってXMLを読み込?
096 * xmlFilenameの初期値は../DBConfig.xml
097 *
098 * @og.rev 4.3.1.1 (2008/08/23) 自??コンストラクターを呼ぶように修正
099 */
100 public DatabaseConfig() {
101 this( "../DBConfig.xml" );
102 }
103
104 /**
105 * XMLファイルの名前を指定して読み込?
106 *
107 * @og.rev 5.1.9.0 (2010/08/01) クラスロー??外からで?BConfig.xmlを取得できるようにする
108 * @og.rev 5.6.7.0 (2013/07/27) オブジェクト作?時に初期化も行っておきます?
109 * @og.rev 5.6.8.2 (2013/09/20) Tomcat8で、クラスロー??が変更されて?のでそ?対?
110 * @og.rev 5.7.2.2 (2014/01/24) WEB-INF/classes フォル?な?、xmlURL がnull になる対応?
111 *
112 * @param xmlfile XMLファイルの名前
113 */
114 public DatabaseConfig( final String xmlfile ) {
115 // xmlFilename = xmlfile;
116 String fileName = null;
117
118 ClassLoader clsl = getClass().getClassLoader();
119 URL xmlURL = clsl.getResource( xmlfile );
120
121 if( xmlURL != null ) {
122 fileName = xmlURL.getFile();
123 }
124 // 5.6.8.2 (2013/09/20) Tomcat8で、xmlURL が取得できなくなって?・・・よう??
125 else {
126 xmlURL = clsl.getResource( "/" ); // クラスパスのベ?スURL
127 // 5.7.2.2 (2014/01/24) Tomcat7で、WEB-INF/classes フォル?な?、xmlURL がnull になる?
128 if( xmlURL != null ) {
129 File temp = new File( xmlURL.getPath() , xmlfile );
130 if( temp.exists() ) { fileName = temp.getAbsolutePath(); }
131 }
132 }
133
134 // 5.1.9.0 (2010/08/01) クラスロー??外からで?BConfig.xmlを取得できるようにする
135 if( fileName == null && new File( xmlfile ).exists() ) {
136 fileName = xmlfile;
137 }
138
139 if( fileName == null ) {
140 // 5.5.7.2 (2012/10/09) コメント追?
141 String errMsg = "DBConfig.xmlが見つかりません?ile=[" + xmlfile + "]\n"
142 + " WEB-INF/classes フォル?な?、相対パスで見つけることができません? ;
143 throw new RuntimeException( errMsg );
144 // throw new RuntimeException( "DBConfig.xmlが見つかりません?ile=[" + xmlfile + "]" );
145 }
146
147 xmlFilename = fileName;
148 // System.out.println( xmlFilename );
149
150 init(); // 5.6.7.0 (2013/07/27)
151 }
152
153 /**
154 * dbidKeyをキーにしてExpandedDbid型でマップ??を返す?
155 * 存在しな??合?NULLを返します?
156 * キーが無??合に初期化を行う?
157 *
158 * @og.rev 4.0.0.1 (2007/12/04) EDbid#clone() ?
159 * @og.rev 5.6.7.0 (2013/07/27) synchronized メソ?にします?
160 *
161 * @param key XMLで登録したdbidKey
162 *
163 * @return EDbid型オブジェク?
164 */
165 public synchronized EDbid getDbid( final String key ) {
166 // synchronized ( dbidMap ) {
167 // if( dbidMap.isEmpty() ) {
168 // init();
169 // }
170
171 return dbidMap.get( key.toUpperCase( Locale.JAPAN ) ) ;
172 // }
173 }
174
175 /**
176 * マップをクリアします?
177 * XMLファイルを?読み込みする場合に使用します?
178 *
179 * @og.rev 5.1.9.0 (2010/08/01) ドライバ?のリストもクリアする?
180 * @og.rev 5.6.7.0 (2013/07/27) synchronized メソ?にします?
181 */
182 public synchronized void reload() {
183 // synchronized ( dbidMap ) {
184 dbidMap.clear();
185 // }
186 // synchronized ( driverList ) {
187 driverList.clear();
188 // }
189 init();
190 }
191
192 /**
193 * 初期化??
194 *
195 * DB設定XMLファイル(DBConfig.xml)を読み込みます?
196 * こ?ファイルから、ドライバ?リスト?取得?DBIDのオブジェクト???の作??
197 * 行います?
198 * EDbidオブジェク?は、環?数で、?通?初期値を定義しておくことが可能です?
199 * ?として、REALM_URL、REALM_NAME、REALM_PASSWORD が設定可能です?
200 *
201 * ドライバ?リスト?取得後?Class.forName で、ドライバ?登録も行います?
202 *
203 * @og.rev 5.1.7.0 (2010/06/01) org.opengion.fukurou.xml.jaxb.dbid 関??
204 * @og.rev 5.6.7.0 (2013/07/27) dbidMap,driverList を書き込??ではなく?作?します?
205 */
206 private void init() {
207 Document doc = DomParser.read( new File(xmlFilename) ) ;
208 Element firstRoot = doc.getDocumentElement();
209
210 // List<String> driverList = getDriverList( firstRoot );
211 // driverList = getDriverList( firstRoot );
212 makeDriverList( firstRoot ); // 5.6.7.0 (2013/07/27)
213
214 // 5.6.7.0 (2013/07/27) を?かけておきます?
215 synchronized ( this ) {
216 for( String dr : driverList ) {
217 try {
218 Class.forName( dr );
219 } catch ( ClassNotFoundException ex ) {
220 String errMsg = "ドライバクラスが見つかりません?" + dr + "]" ;
221 LogWriter.log( errMsg );
222 LogWriter.log( ex );
223 }
224 }
225 }
226
227 EDbid defDdbid = new EDbid(); // 初期値
228 defDdbid.setUrl( System.getenv( "REALM_URL" ) );
229 defDdbid.setUser( System.getenv( "REALM_NAME" ) );
230 defDdbid.setPassword( System.getenv( "REALM_PASSWORD" ) );
231
232 // dbidMap = getDbidMap( firstRoot,defDdbid );
233 makeDbidMap( firstRoot,defDdbid ); // 5.6.7.0 (2013/07/27)
234 }
235
236 /**
237 * ドライバ?リストを取得します?
238 *
239 * DB設定XMLファイル(DBConfig.xml)の、class タグを取り込みます?
240 * こ?ファイルから、ドライバ?リストを取得します?
241 *
242 * ???段階?処?実行されます?
243 * 第?Step:DBConfig.xml から、ドライバ?リストを取?
244 * 第?Step:ドライバ?リストが存在しな??合?環?数の REALM_DRIVER からドライバ?を取?
245 * 第?Step:それでも存在しな??合?こ?クラスの DEFAULT_DRIVER 定数 からドライバ?を取?
246 *
247 * @og.rev 5.1.7.0 (2010/06/01) org.opengion.fukurou.xml.jaxb.dbid 関??
248 * @og.rev 5.1.9.0 (2010/08/01) ドライバ?のListをオブジェクト変数?
249 * @og.rev 5.6.7.0 (2013/07/27) driverList を書き込??ではなく?作?します?
250 * @og.rev 5.6.7.0 (2013/07/27) synchronized メソ?にします?
251 *
252 * @param element DB設定XMLファイルのElementオブジェク?
253 */
254 // private static List<String> getDriverList( final Element element ) {
255 private void makeDriverList( final Element element ) {
256 // List<String> dList = new ArrayList<String>();
257
258 NodeList list = element.getElementsByTagName( "class" ) ;
259 int num = list.getLength();
260 for (int i = 0; i < num; i++) {
261 Element cls = (Element)list.item(i);
262 // dList.add( cls.getTextContent() );
263 driverList.add( cls.getTextContent() );
264 }
265
266 // if( dList.isEmpty() ) {
267 if( driverList.isEmpty() ) {
268 String realmDriver = System.getenv( "REALM_DRIVER" );
269 if( realmDriver != null && realmDriver.length() > 0 ) {
270 // dList.add( realmDriver );
271 driverList.add( realmDriver );
272 }
273 }
274
275 // if( dList.isEmpty() ) { dList.add( DEFAULT_DRIVER ); }
276 if( driverList.isEmpty() ) { driverList.add( DEFAULT_DRIVER ); }
277
278 // return dList ;
279 }
280
281 /**
282 * EDbidオブジェクト?マップを取得します?
283 *
284 * DB設定XMLファイル(DBConfig.xml)の、dbid タグを取り込みます?
285 * こ?ファイルから、EDbidオブジェクト?属???を取得し、オブジェクトを構築します?
286 *
287 * EDbidオブジェク?は、?期?をコピ?して、作?して?ます?
288 * EDbidオブジェクトをマップから取り?すキーとなる?dbidKey は、大?化して設定します?
289 *
290 * @og.rev 5.1.7.0 (2010/06/01) org.opengion.fukurou.xml.jaxb.dbid 関??
291 * @og.rev 5.1.9.0 (2010/08/01) Mapを返すように変更
292 * @og.rev 5.5.2.0 (2012/05/01) property追?
293 * @og.rev 5.6.6.0 (2013/07/05) 表?title)属?の取?
294 * @og.rev 5.6.7.0 (2013/07/27) ?MapをDBConfig.xmlの読み込み?変更?
295 * @og.rev 5.6.7.0 (2013/07/27) dbidMap を書き込??ではなく?作?します?
296 * @og.rev 5.6.7.0 (2013/07/27) synchronized メソ?にします?
297 * @og.rev 5.6.7.1 (2013/08/09) DEFAULT と、RESOURCE の DBIDキーがなければ、?部?作?します?
298 * @og.rev 5.6.8.0 (2013/09/06) RESOURCE の DBIDキーを?部作?時に、title も設定します?
299 *
300 * @param element DB設定XMLファイルのElementオブジェク?
301 * @param defDdbid 初期??の設定された、EDbidオブジェク?
302 */
303 // private void makeDbidMap( final Element element , EDbid defDdbid ) {
304 // private static Map<String,EDbid> getDbidMap( final Element element , EDbid defDdbid ) {
305 private void makeDbidMap( final Element element , EDbid defDdbid ) {
306 // Map<String,EDbid> dMap = new HashMap<String,EDbid>(); // 5.6.7.0 (2013/07/27)
307
308 NodeList list = element.getElementsByTagName( "dbid" ) ;
309 int num = list.getLength();
310 for (int i = 0; i < num; i++) {
311 Element ele = (Element)list.item(i);
312 NodeList childs = ele.getChildNodes();
313 int numChild = childs.getLength();
314 // EDbid dbid = new EDbid();
315 EDbid dbid = defDdbid.clone(); // 初期値をコピ?して、作?
316 for (int j = 0; j < numChild; j++) {
317 Node nd = childs.item(j);
318 if( nd.getNodeType() == Node.ELEMENT_NODE ) {
319 Element el = (Element)nd;
320 String tag = el.getTagName();
321 // dbidKey は、toUpperCase して、大??みとする?
322 if( "dbidKey".equals( tag ) ) {
323 String dbidKey = el.getTextContent();
324 if( dbidKey != null && dbidKey.length() > 0 ) {
325 dbid.setDbidKey( dbidKey.toUpperCase( Locale.JAPAN ) );
326 }
327 }
328 else if( "title".equals( tag ) ) { dbid.setTitle( el.getTextContent() ); } // 5.6.6.0 (2013/07/05) 表?title)属?の取?
329 else if( "url".equals( tag ) ) { dbid.setUrl( el.getTextContent() ); }
330 else if( "user".equals( tag ) ) { dbid.setUser( el.getTextContent() ); }
331 else if( "password".equals( tag ) ) { dbid.setPassword( el.getTextContent() ); }
332 else if( "readonly".equals( tag ) ) { dbid.setReadonly( el.getTextContent() ); }
333 else if( "mincount".equals( tag ) ) { dbid.setMincount( el.getTextContent() ); }
334 else if( "maxcount".equals( tag ) ) { dbid.setMaxcount( el.getTextContent() ); }
335 else if( "pooltime".equals( tag ) ) { dbid.setPooltime( el.getTextContent() ); }
336 else if( "applicationInfo".equals( tag ) ) { dbid.setApplicationInfo( el.getTextContent() ); }
337 else if ("property".equals( tag ) ) { dbid.addProp( el.getTextContent() ); } // 5.5.2.0 (2012/05/01)
338 else {
339 System.err.println( "警告:dbid に新しい属?が?追?れて?す?" );
340 }
341 }
342 }
343 // dbidMap.put( dbid.getDbidKey(), dbid );
344 // dMap.put( dbid.getDbidKey(), dbid );
345 dbidMap.put( dbid.getDbidKey(), dbid ); // 5.6.7.0 (2013/07/27) 復活
346 }
347
348 // 5.6.7.1 (2013/08/09) DEFAULT と、RESOURCE の DBIDキーがなければ、?部?作?します?
349 EDbid dbid_D = dbidMap.get( "DEFAULT" ); // DEFAULT が存在するか確認する?
350 if( dbid_D == null ) {
351 dbid_D = defDdbid.clone(); // 初期値をコピ?
352 dbid_D.setDbidKey( "DEFAULT" );
353 dbidMap.put( "DEFAULT", dbid_D );
354 }
355
356 EDbid dbid_R = dbidMap.get( "RESOURCE" ); // RESOURCE が存在するか確認する?
357 if( dbid_R == null ) {
358 dbid_R = dbid_D.clone(); // DEFAULT の DBIDをコピ?(?存在するは?
359 dbid_R.setDbidKey( "RESOURCE" );
360 dbid_R.setTitle( "RESOURCE" ); // 5.6.8.0 (2013/09/06) title も設定します?
361 dbidMap.put( "RESOURCE", dbid_R );
362 }
363
364 // return dMap;
365 }
366
367 /* ------------------------------------------------------------------------------------
368 *
369 * 以下?、DBConfig.xml編?のメソ?です?
370 * 編?のメソ?では、オブジェクト化されたDBID及?DBDRIVERの??は使用せずに?
371 * DBConfig.xmlからそ???を?度読み出して、SET/GETして?す?
372 * (オブジェクトとして依存して?のは、DBConfig.xmlのファイル名?みで?
373 *
374 * -------------------------------------------------------------------------------------
375 */
376 /**
377 * DBIDとして管?て??のキーの?を?列形式で返します?
378 *
379 * @og.rev 5.1.9.0 (2010/08/01) 新規作?
380 *
381 * @return ?のキー?
382 */
383 public static String[] getDbidInfoKeys() {
384 // return DBID_INFO_KEYS;
385 return DBID_INFO_KEYS.clone();
386 }
387
388 /**
389 * 全てのDBIDの属???のリス?配?)で返します?
390 *
391 * 値の?につ?は、{@link #getDbidInfoKeys()}で返されるキーの?と同じです?
392 *
393 * @og.rev 5.1.9.0 (2010/08/01) 新規作?
394 * @og.rev 5.5.2.1 (2012/05/07) propertiesを??
395 * @og.rev 5.6.6.0 (2013/07/05) 表?title)属?を追?
396 * @og.rev 5.6.7.0 (2013/07/27) ?MapをDBConfig.xmlの読み込み?変更?
397 *
398 * @return 全てのDBIDの属???のリス?配?)
399 * @see #getDbidInfoKeys()
400 */
401 public synchronized String[][] getDbidInfo() {
402 // Element ele = DomParser.read( new File(xmlFilename) ).getDocumentElement();
403 // Map<String,EDbid> dMap = getDbidMap( ele , new EDbid() );
404 // String[][] dbidInfo = new String[dMap.size()][DBID_INFO_KEYS.length];
405
406 String[][] dbidInfo = new String[dbidMap.size()][DBID_INFO_KEYS.length];
407 int idx = 0;
408 // for( EDbid dbid : dMap.values() ) {
409 for( EDbid dbid : dbidMap.values() ) {
410 dbidInfo[idx][0] = dbid.getDbidKey();
411 dbidInfo[idx][1] = dbid.getTitle(); // 5.6.6.0 (2013/07/05) 表?title)属?を追?
412 dbidInfo[idx][2] = dbid.getUrl();
413 dbidInfo[idx][3] = dbid.getUser();
414 dbidInfo[idx][4] = dbid.getPassword();
415 dbidInfo[idx][5] = String.valueOf( dbid.isReadonly() );
416 dbidInfo[idx][6] = String.valueOf( dbid.getMincount() );
417 dbidInfo[idx][7] = String.valueOf( dbid.getMaxcount() );
418 dbidInfo[idx][8] = String.valueOf( dbid.getPooltime() );
419 dbidInfo[idx][9] = String.valueOf( dbid.isApplicationInfo() );
420 dbidInfo[idx][10]= String.valueOf( dbid.getProps().toString() ); // 5.5.2.1 (2012/05/07)
421 idx++;
422 }
423 // 5.6.7.0 (2013/07/27) ?MapをDBConfig.xmlの読み込み?変更(なので、?)?
424 // dbidSort( dbidInfo );
425 return dbidInfo;
426 }
427
428 /**
429 * 全てのDBIDの属???のリス?配?)をセ?します?
430 *
431 * こ?メソ?を呼び出すと、DBConfig.xmlで定義されて?DBID?????削除??
432 * そ?上で、引数のDBID???をDBConfig.xmlに書き込みます?
433 *
434 * 値の?につ?は、{@link #getDbidInfoKeys()}で返されるキーの?と同じです?
435 *
436 * 書き込みの直前に、同じフォル?タイ?タンプを付加したバックア??ファイルを作?します?
437 *
438 * @og.rev 5.1.9.0 (2010/08/01) 新規作?
439 * @og.rev 5.6.7.0 (2013/07/27) ?MapをDBConfig.xmlの読み込み?変更?
440 *
441 * @param dbidVals 全てのDBIDの属???のリス?配?)
442 * @see #getDbidInfoKeys()
443 */
444 public void setDbidInfo( final String[][] dbidVals ) {
445 FileUtil.copy( xmlFilename, xmlFilename + "_" + System.currentTimeMillis() );
446
447 Document doc = DomParser.read( new File(xmlFilename) ) ;
448 Element firstRoot = doc.getDocumentElement();
449 deleteChildElements( firstRoot, "dbid" );
450
451 if( dbidVals != null && dbidVals.length > 0 ) {
452 // 5.6.7.0 (2013/07/27) ?MapをDBConfig.xmlの読み込み?変更(なので、?)?
453 // dbidSort( dbidVals );
454 for( int i=0; i<dbidVals.length; i++ ) {
455 Element newEle = doc.createElement( "dbid" );
456 for( int j=0; j<dbidVals[i].length; j++ ) {
457 Element newChEle = doc.createElement( DBID_INFO_KEYS[j] );
458 newChEle.setTextContent( dbidVals[i][j] );
459 newEle.appendChild( newChEle );
460 }
461 firstRoot.appendChild( newEle );
462 firstRoot.appendChild( doc.createTextNode( "\n\n" ) );
463 }
464 }
465
466 DomParser.write( new File(xmlFilename), doc );
467
468 reload(); // 5.6.7.0 (2013/07/27) DBIDの属???のリストを更新後?初期化します?
469 }
470
471 /**
472 * DBIDの配?をソートします?
473 * ソート?方法としては?
474 * ?EFAULTのDBIDは?初め
475 * ②DEFAULT以外?、DBID?
476 * となります?
477 *
478 * @og.rev 5.6.7.0 (2013/07/27) ?MapをDBConfig.xmlの読み込み?変更(なので、?)?
479 *
480 * @param dbidVals 全てのDBIDの属???のリス?配?)
481 */
482 // private static void dbidSort( final String[][] dbidVals ) {
483 // Arrays.sort( dbidVals, new Comparator<String[]>() {
484 // public int compare( String[] s1, String[] s2 ) {
485 // if( "DEFAULT".equals( s1[0] ) ) {
486 // return -1;
487 // }
488 // else if( "DEFAULT".equals( s2[0] ) ) {
489 // return 1;
490 // }
491 // return s1[0].compareTo( s2[0] );
492 // }
493 // }
494 // );
495 // }
496
497 /**
498 * DBドライバ?の属?キーを返します?
499 *
500 * @og.rev 5.1.9.0 (2010/08/01) 新規作?
501 *
502 * @return DBドライバ?の属?キー
503 */
504 public static String getDriverKey() {
505 return DBDRIVER_CLASS_KEY;
506 }
507
508 /**
509 * DBドライバ?のリス?配?)を返します?
510 *
511 * @og.rev 5.1.9.0 (2010/08/01) 新規作?
512 * @og.rev 5.6.7.0 (2013/07/27) driverList を書き込??ではなく?作?します?
513 *
514 * @return DBドライバ?リス?配?)
515 */
516 public synchronized String[] getDriverList() {
517 // Element ele = DomParser.read( new File(xmlFilename) ).getDocumentElement();
518 // String [] rtn = getDriverList( ele ).toArray( new String[0] );
519
520 String [] rtn = driverList.toArray( new String[driverList.size()] );
521 // driverSort( rtn );
522 return rtn;
523 }
524
525 /**
526 * DBドライバ?のリス?配?)をセ?します?
527 *
528 * こ?メソ?を呼び出すと、DBConfig.xmlで定義されて?class???削除??
529 * そ?上で、引数のDBドライバ??をDBConfig.xmlに書き込みます?
530 *
531 * 書き込みの直前に、同じフォル?タイ?タンプを付加したバックア??ファイルを作?します?
532 *
533 * @og.rev 5.1.9.0 (2010/08/01) 新規作?
534 * @og.rev 5.6.7.0 (2013/07/27) DBドライバ?のリストを更新後?初期化します?
535 *
536 * @param drivers DBドライバ?のリス?配?)
537 */
538 public void setDriverList( final String[] drivers ) {
539 FileUtil.copy( xmlFilename, xmlFilename + "_" + System.currentTimeMillis() );
540
541 Document doc = DomParser.read( new File(xmlFilename) );
542 Element firstRoot = doc.getDocumentElement();
543
544 Element parent = (Element)firstRoot.getElementsByTagName( "dbDriver" ).item( 0 );
545 deleteChildElements( parent, "class" );
546
547 if( drivers != null && drivers.length > 0 ) {
548 // driverSort( drivers );
549 for( int i=0; i<drivers.length; i++ ) {
550 Element newEle = doc.createElement( "class" );
551 newEle.setTextContent( drivers[i] );
552 parent.appendChild( newEle );
553 }
554 }
555
556 DomParser.write( new File(xmlFilename), doc );
557
558 reload(); // 5.6.7.0 (2013/07/27) DBドライバ?のリストを更新後?初期化します?
559 }
560
561
562 /**
563 * DBID??のキーとタイトルから、?ル?ンメニューを作?するための??を取得します?
564 *
565 * こ?メソ?を呼び出すと、DBConfig.xmlで定義されて? dbidKey と?title 属?から?
566 * 「key1:val1 key2:val2 ・・・」と???を作?します?
567 * これを利用すれば、?ル?ンメニューが簡単に作?できます?
568 *
569 * @og.rev 5.6.7.0 (2013/07/27) プル?ンメニュー用の??を作?します?
570 * @og.rev 5.6.7.1 (2013/08/09) 表?title)属?のスペ?ス対?
571 *
572 * @return プル?ンメニューを作?するための??
573 */
574 public synchronized String getCodeKeyVal() {
575 if( codeKeyVal == null ) {
576 StringBuilder buf = new StringBuilder();
577 for( EDbid dbid : dbidMap.values() ) {
578 String key = dbid.getDbidKey();
579 String lbl = StringUtil.nval( dbid.getTitle() , key );
580 // buf.append( " " ).append( key ).append( ":" ).append( lbl );
581 if( lbl.indexOf( ' ' ) >= 0 ) { // 5.6.7.1 (2013/08/09) スペ?ス対?
582 buf.append( " " ).append( key ).append( ":\"" ).append( lbl ).append( "\"" );
583 }
584 else {
585 buf.append( " " ).append( key ).append( ":" ).append( lbl );
586 }
587 }
588
589 codeKeyVal = buf.substring( 1 ); // 先?のスペ?スを削除
590 }
591
592 return codeKeyVal;
593 }
594
595 /**
596 * DBドライバ?の配?をソートします?
597 * ソート?方法としては?
598 * ?EFAULT_DRIVERのDBは?初め
599 * ②DEFAULT以外?、DBID?
600 * となります?
601 *
602 * @og.rev 5.6.7.0 (2013/07/27) ?ListをDBConfig.xmlの読み込み?変更(なので、?)?
603 *
604 * @param drivers 全てのDBIDの属???のリス?配?)
605 */
606 // private static void driverSort( final String[] drivers ) {
607 // Arrays.sort( drivers, new Comparator<String>() {
608 // public int compare( String s1, String s2 ) {
609 // if( DEFAULT_DRIVER.equals( s1 ) ) {
610 // return -1;
611 // }
612 // else if( DEFAULT_DRIVER.equals( s2 ) ) {
613 // return 1;
614 // }
615 // return s1.compareTo( s2 );
616 // }
617 // }
618 // );
619 // }
620
621 /**
622 * 親要?基点として、引数で?されたタグ名を持つ子要?削除します?
623 *
624 * @og.rev 5.6.7.0 (2013/07/27) staticメソ? ?イスタンスメソ?に変更
625 *
626 * @param parent 親要?
627 * @param childTagName 削除する子要??タグ?
628 */
629 // private static void deleteChildElements( final Element parent, final String childTagName ) {
630 private void deleteChildElements( final Element parent, final String childTagName ) {
631 Node child = parent.getFirstChild();
632 boolean isDel = false;
633 while ( child != null ) {
634 // エレメント間の改行Cも削除するため、次の異なる要?来るまでは削除し続けます?
635 if( child.getNodeType() == Node.ELEMENT_NODE ) {
636 // if( ((Element)child).getTagName().equals( childTagName ) ) {
637 if( ((Element)child).getTagName().equalsIgnoreCase( childTagName ) ) {
638 isDel = true;
639 }
640 else {
641 isDel = false;
642 }
643 }
644
645 Node next = child.getNextSibling();
646 if( isDel ) {
647 parent.removeChild( child );
648 }
649 child = next;
650 }
651 }
652 }