SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

Jakarta Commonsを使ってJDKクラスを拡張する:パート2

Commons Codec/DBCP/DBUtils/Email/i18nの利用

Email

 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は単純なメールを送信するために必要な引数を列挙したものです。
  • リスト12 単純なメールを送信するためのCLI構文
    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"
    
    リスト13はCommons Email APIの用法を示しています。
    リスト13 単純なメールメッセージを送信するためのCommons Emailの使用例(Jakartaのサイトから)
    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();
    
  • SimpleMailCommand ― このクラスはSimpleEmailクラスをラップし、コマンドライン引数を解析してインスタンスを作成します。
  • EmailBuddy ― これは残りのクラスを統括するメインクラスです。

 デザインは全体として次のような流れになります。

  • EmailBuddyがコマンドライン引数をCommandlineParserに委ねます。
  • CommandlineParserSimpleMailCommandを使ってSimpleEmail Commons Emailクラスを解析し値を入れます。
  • EmailBuddySimpleEmail参照を取得し、送信メソッドを呼び出してメッセージをディスパッチします。

 このツールを拡張して、たとえば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は、このサンプルアプリケーションで使用するアプリケーション例外クラスです。

リスト14 java.lang.ExceptionではなくLocalizedExceptionを拡張するアプリケーション例外
public class DAOException extends LocalizedException {
 
    public DAOException(
        ErrorBundle errorMessage, Throwable throwable) {

        super(errorMessage, throwable);
    }
 
    public DAOException(ErrorBundle errorMessage) {
        super(errorMessage);
    }
}

 次のステップでは、ロケール固有のエラーメッセージを作成します。リスト15は、このサンプルで使用するXMLファイルです。

リスト15 ロケール固有のエラーメッセージ
<?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 inserted
 since 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"に対して格納しています。

リスト16 XMLファイルからメッセージをロードするヘルパークラス
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に関係するメッセージが設定されます。

リスト17 ロケール固有のエラーをスローするためにCommons i18nを使用するDOAクラス
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回でも、引き続き注目すべきコンポーネントについて解説します。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Narayanan A.R.(Narayanan A.R.)

テスト駆動開発、アジャイル方法論、Javaテクノロジ、およびデザインパターンの熱烈な擁護者。Javaテクノロジを使ったソフトウェアのデザインおよび開発に携わって数年になる。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/284 2006/04/11 19:10

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー