Commons Emailは、Javaアプリケーションでの電子メールの送信を簡単にするいくつかのクラスから構成されています。Jakartaのサイト内の「Overview」と「Samples」にも有用な情報が含まれています。
このセクションのサンプルには、Commons Emailを使って書かれたコマンドラインツールが含まれています。これは単純なメッセージを送信するツールで、電子メールを手早く送信するのにとても便利です。このツールをさらに拡張すれば、HTML形式のメッセージや添付ファイルもサポートすることもできます。このサンプルアプリケーションでは、クラスパスにJavaMailライブラリとJavaBean Activation Frameworkライブラリを入れておく必要があります(完全なソースはソースコードの「src」フォルダ内のパッケージ「in.co.narayanan.commons.email」に収められています)。
このツールのデザインには以下のクラスが含まれています。
- CommandlineParser ― このクラスは、
SimpleMailCommandクラスのインスタンスを作成するためにコマンドラインに渡された引数を解析します。SimpleMailCommandはコマンド引数とCommons EmailクラスのSimpleEmailをカプセル化しています。SimpleMailCommandは後でメールを送信するためにメインクラスのEmailBuddyで使用されます。リスト12は単純なメールを送信するために必要な引数を列挙したものです。 - SimpleMailCommand ― このクラスは
SimpleEmailクラスをラップし、コマンドライン引数を解析してインスタンスを作成します。 - EmailBuddy ― これは残りのクラスを統括するメインクラスです。
java EmailBuddy -host mail.mysite.com
-user user
-password password
-to "a@somewhere.org, b@somewhere.org"
-from me@mysite.com
-subject "Commons Mail"
-message "Commons site is really good and
interesting. You guys have to try it out"
SimpleEmail email = new SimpleEmail(); email.setHostName("mail.myserver.com"); email.addTo("jdoe@somewhere.org", "John Doe"); email.setFrom("me@apache.org", "Me"); email.setSubject("Test message"); email.setMsg("This is a simple test of commons-email"); email.send();
デザインは全体として次のような流れになります。
EmailBuddyがコマンドライン引数をCommandlineParserに委ねます。CommandlineParserがSimpleMailCommandを使ってSimpleEmailCommons Emailクラスを解析し値を入れます。EmailBuddyがSimpleEmail参照を取得し、送信メソッドを呼び出してメッセージをディスパッチします。
このツールを拡張して、たとえばHTML形式のメッセージを送信できるようにするには、HtmlMailCommandクラスを書く必要があります。これはコマンドライン引数を解析し、HtmlEmail Commons Emailクラスに値を入れるためのものです。また、CommandlineParserを修正して、HtmlMailCommandを使うようにします。
i18n
Jakartaはまだi18nをリリースしていませんが、ソースを入手してビルドするか、スナップショットビルドをダウンロードすることができます。ソースをダウンロードするには、Subversionクライアントが必要です。筆者はSmartSVNを使ってこれを取得しました。ここをクリックすると、クイックスタートガイドを参照できます。
Commons i18nは、スローする例外や表示するエラー/成功メッセージを特定の地域に合わせてローカライズする必要のあるJavaアプリケーションで使用します。メッセージはXMLまたはプロパティファイル形式で格納することができます。XMLの場合、すべてのロケールに関係するメッセージを一緒に格納できるという利点があります。
このセクションのサンプルアプリケーションでは、データベースにアクセスするアプリケーションでロケール固有のエラーをどのようにスローして処理するかを例示しています。筆者はメッセージの格納にXMLを使用しました。Commons i18nライブラリの「commons-i18n-0.3.jar」をクラスパスに入れておく必要があります。また、アプリケーションの起動にはTestI18n JUnitテストケースクラスを実行する必要があります。ソースコードは、ソースコードの「src」フォルダ内のパッケージ「in.co.narayanan.commons.i18n」に収められています。
最初のステップでは、システム内のすべてのアプリケーション例外がjava.lang.Exceptionではなくorg.apache.commons.i18n.LocalizedExceptionクラスを拡張するようにします。リスト14は、このサンプルアプリケーションで使用するアプリケーション例外クラスです。
public class DAOException extends LocalizedException { public DAOException( ErrorBundle errorMessage, Throwable throwable) { super(errorMessage, throwable); } public DAOException(ErrorBundle errorMessage) { super(errorMessage); } }
次のステップでは、ロケール固有のエラーメッセージを作成します。リスト15は、このサンプルで使用するXMLファイルです。
<?xml version="1.0" encoding="UTF-8" ?> <messages> <message id="insertionfailed"> <locale language="en"> <entry key="title">Database insertion failed</entry> <entry key="text">Unable to insert row value {0} to the database </entry> <entry key="summary">Summary: Database insertion error</entry> <entry key="details">The given value cannot be insertedsince the database has reported an error</entry> </locale> <locale language="fr"> <entry key="title">French - Database insertion failed</entry> <entry key="text">French - Unable to insert row value {0}
to the database</entry> <entry key="summary">French - Summary: Database insertion error </entry> <entry key="details">French - The given value cannot be
inserted since the database has reported an error</entry> </locale> </message> </messages>
すべてのロケールメッセージが同じXMLファイルにまとめられていることに注目してください。Frenchロケールのメッセージには「French」という接頭辞が付いているので、実行時に一目でわかります。
次のステップでは、メッセージをロードするクラスを作成します。これを示しているのがリスト16のコードです。ここでは新しいメッセージプロバイダを追加し、それをキー"dao-errors"に対して格納しています。
public class ErrorHelper { static { // Load the message bundle from the XML file MessageManager.addMessageProvider("dao-errors", new XMLMessageProvider(ErrorHelper. class.getResourceAsStream("exceptions.xml"))); } public static ErrorBundle getErrorBundle( String bundleKey, String arg0) { return new ErrorBundle( "dao-errors", bundleKey, new Object[] {arg0}); } }
最後のステップでは、作成したアプリケーション例外クラスを使ってシステム内のエラーを示します。リスト17では、DAOExceptionのインスタンスが作成され、ErrorBundleインスタンスへの参照が渡されます。Commons i18nフレームワークは指定されたメッセージキーに対応するメッセージをMessageManagerから取得し、ErrorBundleクラスに送ります。この例では、キーinsertionfailedに関係するメッセージが設定されます。
public void createCustomer(String name) throws DAOException { Connection con = null; Statement createStmt = null; try { // Create a customer } catch (SQLException e) { throw new DAOException(ErrorHelper.getErrorBundle( "insertionfailed", name), e); } }
アプリケーションのプレゼンテーションレイヤ内の実際のメッセージを取得したり、それをログに書き込んだりするには、例外オブジェクト内に設定されたErrorBundleにアクセスします。
Commons i18nを使用すると、アプリケーションのデザインが改善されて、グローバル化が容易になります。
まとめ
Jakarta Commonsについて紹介するシリーズ第2回では、次のことを取り上げました。
- Commonsのさまざまなコンポーネントが提供する豊富な機能
- ユーティリティクラスの特定のコンポーネントやメソッドの具体的な用途
- さまざまなAPIのパッケージとクラスの概要
これからJavaアプリケーションをデザインしたり開発したりするときは、有用なクラスを選んで適切に使用できるのではないでしょうか。このシリーズの第3回でも、引き続き注目すべきコンポーネントについて解説します。

interesting. You guys have to try it out"