スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

JavaでXMLの設定ファイルを使う

XMLを設定ファイルに使うのは、Java使いなら何度かあると思います。
web.xmlとかlog4j.xmlとか。
私もJavaで開発する時は独自のXMLを設定ファイルしていて、読み込むためのクラスを再利用しています。

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.apache.commons.jxpath.JXPathContext;
import org.apache.commons.jxpath.JXPathException;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;

public class Setting {
private static Map<String, Setting> instanceMap = new HashMap<String, Setting>();

public static Setting getSetting(String path) {
Setting result = null;
synchronized (Setting.instanceMap) {
result = Setting.instanceMap.get(path);
if (null == result) {
result = new Setting(path);
Setting.instanceMap.put(path, result);
}
}
return result;
}

private File settingFile;
private Document doc;
private JXPathContext context;

private Setting(String path) {
this.settingFile = new File(path);
this.doc = this.read(this.settingFile);
if (null == this.doc) {
throw new RuntimeException("xmlファイルの読み込みに失敗しました:" + path);
}
this.context = JXPathContext.newContext( this.doc );
}

public Document read( File aFile ) {
DocumentBuilder builder = null;
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
builder = factory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
throw new RuntimeException(e);
}

Document document = null;
try {
document = builder.parse( aFile );
} catch (SAXException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
return document;
}

public String obj2String(Object obj) {
if (null == obj) {
return null;
}
String result = obj.toString();
if (obj instanceof Number) {
if (result.endsWith(".0")) {
result = result.substring(0, result.length() - 2);
}
}
return result;
}

public String getValue( String aXPath){
// aXPathを適用する
String value = null;
try{
Object obj = this.context.getValue( aXPath );
value = obj2String(obj);
}catch( JXPathException e){
throw new RuntimeException(e);
}

// 結果を返す
return value;
}

public int getIntValue(String aXPath) {
String value = this.getValue(aXPath);
return Integer.parseInt(value);
}

@SuppressWarnings("unchecked")
public String[] getValueAry(String aXPath) {
String[] values = null;
try{
// 複数候補は iterator で受け取る
Iterator iterator = context.iterate( aXPath );
List<String> valueList = new ArrayList<String>();

// 複数候補をリストに格納する
while( iterator.hasNext() ){
Object obj = iterator.next();
String value = obj2String(obj);
valueList.add( value );
}
int size = valueList.size();
values = (String[])valueList.toArray( new String[ size ]);
} catch ( JXPathException e){
throw new RuntimeException(e);
}
return values;
}
}

JXPathを利用しているので、ダウンロードしてクラスパスに追加してください。
例えば、JDBCの接続などは、以下のようにやります。

<?xml version="1.0" encoding="UTF-8"?>
<setting>
<jdbc>
<driver>org.postgresql.Driver</driver>
<url>jdbc:postgresql://localhost:5432/test</url>
<user>user</user>
<password>password</password>
</jdbc>
</setting>


Setting setting = Setting.getSetting("setting.xml");
Class.forName(setting.getValue("/setting/jdbc/driver"));
Connection conn = DriverManager.getConnection(
setting.getValue("/setting/jdbc/url"),
setting.getValue(/setting/jdbc/user),
setting.getValue("/setting/jdbc/password"));

設定する内容としては、頻繁に変わるような文言や、サーバごとに違う設定や、簡単なシステムなら、SQLをこの設定ファイルに記述したりもしています。
getValueの引数のXPathを使いこなすと、複雑な設定情報も記述できます。
スポンサーサイト

COMMENTS

COMMENT FORM

TRACKBACK


この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。