概要 †
- http://jakarta.apache.org/commons/configuration/
- どんな設定ファイルでもどんと来いライブラリ
- 対応している設定ファイルの書式
- Properties files
- XML documents
- Property list files (.plist)
- JNDI
- JDBC Datasource
- System properties
- Applet parameters
- Servlet parameters
- ここでは、XML documents の読み込みを試してみる
- commons-configuration が使用している依存ライブラリがわんさかあるので、Maven2 ベースの開発でないと大変。
- Maven2 の場合には、pom.xml に依存ライブラリとして commons-configuration を指定するだけ
<dependencies> <dependency> <groupId>commons-configuration</groupId> <artifactId>commons-configuration</artifactId> <version>1.3</version> <scope>runtime</scope> </dependency> ・・・
練習問題 †
- 読み込むXML設定ファイル配下のような物 (拙作IPMsgletの設定ファイル)
- <user-name> などは、一意な項目
- <msglet> などは、繰り返し項目
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
<?xml version="1.0" encoding="UTF-8"?> <msg-app> <!-- application scope variables --> <context-param> <user-name>root</user-name> <nick-name>root</nick-name> <group>Msglet</group> <debug>true</debug> </context-param> <!-- msglet settings --> <msglet> <msglet-name>Sanmoku</msglet-name> <msglet-class>com.snail.msglet.sample.SampleMsglet</msglet-class> <init-param> <param-name>width</param-name> <param-value>3</param-value> </init-param> <init-param> <param-name>height</param-name> <param-value>3</param-value> </init-param> </msglet> <msglet> <msglet-name>Gomoku</msglet-name> <msglet-class>com.snail.msglet.sample.SampleMsglet</msglet-class> <init-param> <param-name>width</param-name> <param-value>5</param-value> </init-param> <init-param> <param-name>height</param-name> <param-value>5</param-value> </init-param> </msglet> <!-- startup msglet --> <welcome-msglet>Sanmoku</welcome-msglet> </msg-app>
一意な項目の取得 †
- XML設定ファイルを読み込んで
- XMLConfiguration config = new XMLConfiguration("msg.xml");
- config から getXXX() で、項目を読み取るだけ
- String welcome = config.getString(WELCOME_MSGLET);
- xml の path には、root(ここでは <msg-app> )を含まない
- このとき、第二引数を指定するとデフォルト値(設定ファイルに設定がない場合の値)を設定できる
- boolean debug = config.getBoolean(DEBUG, false);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
- | | | | | | - | | - | | | | | | | | | | | | | | | | | | | | | - | | - - - | - | ! ! ! ! | | | | - | | | - | | - - | ! ! - | ! ! !
public final class Startup { private static final String USER_NAME = "context-param.user-name"; private static final String NICK_NAME = "context-param.nick-name"; private static final String GROUP = "context-param.group"; private static final String DEBUG = "context-param.debug"; private static final String WELCOME_MSGLET = "welcome-msglet"; public static void main(final String[] args) { MsgletContainer container = null; try { XMLConfiguration config = new XMLConfiguration("msg.xml"); String userName = config.getString(USER_NAME, "Msglet"); String nickName = config.getString(NICK_NAME, "Msglet"); String group = config.getString(GROUP, "Msglet"); boolean debug = config.getBoolean(DEBUG, false); String welcome = config.getString(WELCOME_MSGLET); container = new MsgletContainer( userName, nickName, group, debug, welcome); container.setMsgletMap(MsgletFactory.createMsglets(config)); container.login(); container.start(); waitTerminate(); } catch (Exception ex) { ex.printStackTrace(); System.exit(-1); } finally { if (container != null) { try { container.logout(); } catch (IOException e) { e.printStackTrace(); } } } } /** * 空文字か、"shutodwn"が入力されるまで入力待ちをします . */ private static void waitTerminate() { BufferedReader breader = new BufferedReader(new InputStreamReader(System.in)); try { String line = null; while ((line = breader.readLine()) != null) { if ("shutdown".equals(line)) { break; } } } catch (IOException ignoreEx) { ignoreEx.printStackTrace(); } } }
- boolean debug = config.getBoolean(DEBUG, false);
繰り返し項目の取得 †
- commons-configuration は、xml の 末端しか取得することができない
- 次のような msglet 定義がなされているときに、msglet-nameは二通りのやり方で取得できる
・・・ <msglet> <msglet-name>a-msglet</msglet-name> <msglet-class>com.snail.AMsglet</msglet-class> </msglet> <msglet> <msglet-name>b-msglet</msglet-name> <msglet-class>com.snail.BMsglet</msglet-class> </msglet> ・・・
- String name = config.getString( "msglet(n).msglet-name" );
- Collection names = (Collection)config.getObject( "msglet.msglet-name" );
- そこで、繰り返し項目を扱うときには次の手順を踏む
- 繰り替えしブロックの中で、必ず登場する項目( ex."msglet.msglet-name" )の登場回数を調べる (getRepetition())。
- この登場回数が、繰り返しブロックの個数と同じ
- 繰り返しブロック数が1ならば、一意項目として読み込む
name[0] = config.getString("msglet.msglet-name"); class[0] = config.getString("msglet.msglet-class");
- 繰り返しブロック数が1より大きければ、繰り替えし数を指定して読みこむ
for(int n = 0 ; n < repetition ; n++){ name[n] = config.getString("msglet(n).msglet-name"); class[n] = config.getString("msglet(n).msglet-class"); }
- Code Template
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
- | | | | | | | | | | - | | | | | | - | | | | | | | | - - | | | | | | | | | ! ! | | ! | | | - | | - | - | ! | | ! !
public final class MsgletFactory { private static final String MSGLET = "msglet"; private static final String MSGLET_NAME = "msglet-name"; private static final String MSGLET_CLASS = "msglet-class"; private static final String INIT_PARAM = "init-param"; private static final String PARAM_NAME = "param-name"; private static final String PARAM_VALUE = "param-value"; public static Map<String, Msglet> createMsglets( final XMLConfiguration config) throws InstantiationException, IllegalAccessException, ClassNotFoundException, ConfigurationException { Map<String, Msglet> retMap = new HashMap<String, Msglet>(); // necessary tag String pibot = MSGLET + "." + MSGLET_NAME; int repetition = getRepetition(config, pibot); if (repetition == 1) { String name = config.getString(MSGLET + "." + MSGLET_NAME); Msglet msglet = createMsglet(config.getString(MSGLET + "." + MSGLET_CLASS)); msglet.setInitParamMap( createInitParams(MSGLET + "." + INIT_PARAM, config)); retMap.put(name, msglet); } else if (repetition > 1) { for (int cnt = 0; cnt < repetition; cnt++) { String name = config.getString(MSGLET + "(" + cnt + ")." + MSGLET_NAME); Msglet msglet = createMsglet( config.getString(MSGLET + "(" + cnt + ")." + MSGLET_CLASS)); msglet.setInitParamMap( createInitParams(MSGLET + "(" + cnt + ")." + INIT_PARAM, config)); retMap.put(name, msglet); } } return retMap; } ・・・ private static int getRepetition( final XMLConfiguration config, final String path) { Object obj = config.getProperty(path); if (obj == null) { return 0; } else if (obj instanceof Collection) { return ((Collection) obj).size(); } return 1; }