EJB と XDoclet

JRun は XDoclet と統合できます。XDoclet は、EJB、Web アプリケーション、および JSP タグライブラリのコードおよびデプロイメントディスクリプタを生成するオープンソースツールです。

特に EJB の場合、XDoclet を使用して次のものを生成できます。

Using XDoclet with EJBs

bean 実装内で jrun.xml 属性と JavaDoc スタイルのコメントを組み合わせて使用することによって、XDoclet が実行する処理を制御できます。

EJB と XDoclet を併用するには

  1. XDoclet コメントを含んでいる bean 実装クラスを作成します。XDoclet のコメントは、@ マークで始まります。XDoclet で EJB のコールバックメソッド (たとえば、ejbPassivate) を含む下位クラスを生成する場合は、クラスをアブストラクトタイプとして宣言します。
  2. JRUN サーバの jrun.xml ファイルにある XDocletService セクション内の
    ejbSourceFiles 属性がサポートしているネーミング規則を使用して、EJB に名前を付けるか、または、EJB のファイル名をカバーする ejbSourceFiles 属性を追加します。デフォルトのネーミング規則は *Bean.java です。
  3. XDoclet サポートが有効になっているディレクトリにクラスを保存します。JRun サーバの jrun.xml ファイルの XDocletService セクションのwatchedEJBDirectory 属性でディレクトリを指定することで、EJB に対する XDoclet サポートを有効にします。

    デフォルトのディレクトリは server_root/default-ear/default-ejb です。

    このディレクトリは、デフォルトではコメントとして処理されます。XDoclet が jrun.xml ファイルの watchedEJBDirectory 属性を監視できるようにするには、この属性のコメントを無効にする必要があります。JRun が監視するディレクトリを無制限に追加することもできます。

ソースファイルを保存する場合、JRun は、下位の bean 実装クラス、関連付けられたインターフェイス、およびデプロイメントディスクリプタを生成します。ディレクトリが auto-deploy ディレクトリの場合、JRun は EJB もデプロイします。

JRun は、ejb-jar.xml ファイルに要素を生成する基本的な XDoclet タグ、および
jrun-ejb-jar.xml ファイルに要素を生成する JRun 特有の XDoclet タグをサポートします。

基本的な XDoclet タグ

基本的な XDoclet タグは、@ejb: という接頭辞で始まります。これらのタグは、基本的な XDoclet のアーキテクチャの一部です。タグとそのパラメータのリストなどの詳細については、XDoclet の Web サイト (http://xdoclet.sourceforge.net/) をご覧ください。

次のテーブルでは、基本的な XDoclet タグを説明します。
タグ
説明
使用方法
@ejb:bean
EJB に関する基本的な情報を提供します。パラメータには、type、name、primkey-field、および cmp-version が含まれます。
すべて (ただし、すべてのパラメータがすべての EJB タイプに適用されるわけではありません)
クラスレベルタグ
@ejb:home
ホームインターフェイス情報を提供します。パラメータには、extends および remote-class が含まれます。
エンティティ bean およびセッション bean
クラスレベルタグ
@ejb:interface
コンポーネントインターフェイス (リモートまたはローカル) 情報を提供します。パラメータには、extends、remote-class、および local-class が含まれます。
エンティティ bean およびセッション bean
クラスレベルタグ
@ejb:finder
ホームインターフェイスの finder メソッドを定義する情報を提供します。パラメータには、signature および role-name が含まれます。
エンティティ bean
クラスレベルタグ
@ejb:select
ホームインターフェイスの select メソッドを定義する情報を提供します。パラメータには、signature および query が含まれます。
エンティティ bean
(CMP 2.0 のみ)
クラスレベルタグ
@ejb:pk
プライマリキーを定義する情報を提供します。パラメータには、class、package および extends が含まれます。
エンティティ bean
クラスレベルタグ
@ejb:env-entry
環境エントリを定義する情報を提供します。パラメータには、name、type および value が
含まれます。
すべて
クラスレベルタグ
@ejb:resource-ref
リソースリファレンスを定義
します。パラメータには、res-name、res-type、および res-auth が含まれます。
すべて
クラスレベルタグ
@ejb:resource-env-ref
リソース環境リファレンスを
提供します。パラメータには、name および type が含まれます。
すべて
クラスレベルタグ
@ejb:security-role-ref
セキュリティロールリファレンスを提供します。パラメータには、role-name および role-link が含まれます。
エンティティ bean およびセッション bean
クラスレベルタグ
@ejb:transaction
トランザクションの動作を指定します。次の値を受け取る type パラメータを持ちます。
  • NotSupported
  • Supports
  • Required
  • RequiresNew
  • Mandatory
  • Never
すべて
クラスレベルタグ
@ejb:permission
リモートおよびホームインターフェイスのメソッドへのアクセスを指定します。
エンティティ bean およびセッション bean
クラスレベルタグ
@ejb:security-identity
呼び出し側のセキュリティ ID または特定の run-as ID のどちらを使用するかを定義します。パラメータには description、run-as、およびuse-caller-identity が含まれます。
すべて
クラスレベルタグ
@ejb:interface-method
ローカルまたはリモートインターフェイスにメソッドを表示するかどうかを指定します。view-type パラメータを持ちます。
セッション bean および
エンティティ bean
メソッドレベルタグ
@ejb:home-method
home メソッドおよびそれを表示するインターフェイスを識別します。
セッション bean および
エンティティ bean
メソッドレベルタグ
@ejb:create-method
ejbCreate メソッドを識別
します。
セッション bean および
エンティティ bean
メソッドレベルタグ
@ejb:transaction
メソッドのトランザクション
動作を指定します。
セッション bean および
エンティティ bean
メソッドレベルタグ
@ejb:permission
特定のメソッドに対するアク
セスを指定します。
セッション bean および
エンティティ bean
メソッドレベルタグ

JRun 特有の XDoclet タグ

JRun 特有の XDoclet タグは、@jrun: という接頭辞で始まります。次の表で、JRun 特有の XDoclet タグのリストを説明します。
タグ
説明
使用方法
@jrun:always-dirty
エンティティ bean のフィールドに変更がない場合でも、トランザクションの最後にデータソースと強制的に同期させる
ことができます。true または false を指定します。
エンティティ bean
クラスレベルタグ
@jrun:cluster-home
ホームオブジェクトをクラスタリングするかどうか指定します。デフォルトは true です。この要素を使用して、特定の bean のデフォルトの動作を無効にできます。true または false を
指定します。
セッション bean およびエンティティ bean
クラスレベルタグ
@jrun:cluster-object
EJB オブジェクトをクラスタリングするかどうか指定します。デフォルトは true です。この要素を使用して、特定の bean のデフォルトの動作を無効にできます。true または false を
指定します。
セッション bean およびエンティティ bean
クラスレベルタグ
@jrun:commit-option
EJB 2.0 仕様のセクション 10.5.9 および 12.1.9 のコミットオプションを指定します。有効な値は A、B、および C です。
エンティティ bean
クラスレベルタグ
@jrun:ejb-local-ref
bean 開発者が提供した ejb-ref-name とその JNDI 名の間のマッピングを指定します。デプロイ担当者が実際の JNDI 名を提供します。パラメータには ejb-ref-name および jndi-name が含まれます。
すべて
クラスレベルタグ
@jrun:ejb-ref
bean 開発者が提供した ejb-ref-name とその JNDI 名の間のマッピングを指定します。デプロイ担当者が実際の JNDI 名を提供します。パラメータには ejb-ref-name および jndi-name が含まれます。
すべて
クラスレベルタグ
@jrun:instance-pool
StatelessSessionBean インスタンスプールの最大サイズおよび最小サイズパラメータを指定
します。このタグには、maximum-size および minimum-size パラメータが
必要です。
ステートレスセッション bean
クラスレベルタグ
@jrun:jdbc-mappings
ejb-jar.xml ファイルで宣言されていない JRun 特有の パーシスタンス情報を指定します。create、load、store、find および remove の各メソッドに使用する SQL を指定します。
エンティティ bean
(CMP 1.1 のみ)
クラスレベルタグ
@jrun:jndi-name
bean またはリソースがバインドされる JNDI 名を指定します。
すべて
クラスレベルタグ
@jrun:message-driven-
destination =
MDB のトピックまたはキュー名を指定します。name パラメータを持っています。
メッセージ駆動型 bean
クラスレベルタグ
@jrun:message-
driven-subscription
永続サブスクリプション処理に JRun が使用するユーザー ID を指定します。client-id パラメータを持ちます。
メッセージ駆動型 bean
クラスレベルタグ
@jrun:resource- env-ref
bean 開発者が提供した resource-env-name とその JNDI 名の間のマッピングを
指定します。デプロイ担当者が実際の JNDI 名を提供します。
パラメータには resource-env-ref-name、jndi-name および mdb-destination が含まれます。
すべて
クラスレベルタグ
@jrun:resource-ref
bean 開発者が提供した resource-name とその JNDI 名の間のマッピングを指定します。デプロイ担当者が実際の JNDI 名を提供します。パラメータには resource-ref-name、jndi-name、user および password が含まれます。
すべて
クラスレベルタグ
@jrun:timeout
ステートフルセッション bean がパッシベートされるまでのアイドル時間を秒単位で指定します。
ステートフルセッション bean
クラスレベルタグ
@jrun:tx-domain
bean のトランザクションが
実行されるトランザクションドメイン名を指定します。パラメータには、name、action
および source が含まれます。
すべて
クラスレベルタグ
@jrun:jdbc-mapping
作成、ロードなど CMP 1.1 の操作情報を指定します。パラメータには、name、action
および source が含まれます。
エンティティ bean
(CMP 1.1 のみ)
メソッドレベルタグ
@jrun:jdbc-mapping-field
SELECT ステートメントが返す列に対応する特定の EJB 変数フィールドを指定します。
エンティティ bean
(CMP 1.1 のみ)
メソッドレベルタグ
@jrun:jdbc-mapping-param
作成したステートメントの疑問符 (?) に対応するパラメータ名とタイプを指定します。パラメータには、name および type が含まれます。
エンティティ bean
(CMP 1.1 のみ)
メソッドレベルタグ

JRun 特有の XDoclet タグの多くは、jrun-ejb-jar.xml ファイルの要素にマッピングされます。このファイルの詳細については、JRun ドキュメンテーションのホームページで利用できるディスクリプタのオンラインドキュメントを参照してください。XDoclet を使用するオンラインの EJB の例については、samples JRun サーバを参照してください。

XDoclet を使用した EJB の例

次の例は、XDoclet のサポートを有効にする CMP 1.1 エンティティ bean を示しています。

package samples.cmp11.xdoclet;
import javax.ejb.EntityContext;
import javax.ejb.RemoveException;
import javax.ejb.FinderException;
import java.util.Collection;
import java.rmi.RemoteException;

/**
 * @ejb:bean type="CMP"
 *           name="Employee"
 *     primkey-field="employeeId"
 *           cmp-version="1.x"
 * @ejb:home remote-class="samples.cmp11.xdoclet.EmployeeHome"
 * @ejb:interface remote-class="samples.cmp11.xdoclet.Employee"
 * @ejb:finder signature="java.util.Collection findAll()"
 * @ejb:finder signature="java.util.Collection findByLastName(String 
lastName)"
 * @ejb:pk class="java.lang.String"
 * @ejb:transaction type="Required"
 *
 * @jrun:jndi-name Employee
 * @jrun:jdbc-mappings
 */
public class EmployeeBean implements javax.ejb.EntityBean {

    private EntityContext context;
    public String employeeId;
    public String firstName;
    public String lastName;
    public String phone;

    /**
     * @ejb:create-method
     * @jrun:jdbc-mapping name="create"
     *                source="samples"
     *                action="INSERT INTO employees (employee_id , 
                      first_name , last_name, phone) VALUES 
                      ( ? , ? , ? , ?)"
     * @jrun:jdbc-mapping-param name="employeeId" type="VARCHAR"
     * @jrun:jdbc-mapping-param name="firstName" type="VARCHAR"
     * @jrun:jdbc-mapping-param name="lastName" type="VARCHAR"
     * @jrun:jdbc-mapping-param name="phone" type="VARCHAR"
     */
    public String ejbCreate(String employeeId, String firstName, 
String lastName, String phone) {
        this.employeeId = employeeId;
        this.firstName = firstName;
        this.lastName = lastName;
        this.phone = phone;
        return null;
    }

    public void ejbPostCreate(String employeeId, String firstName, 
String lastName, String phone) {
    }

    /**
     * @ejb:interface-method
     * @ejb:persistent-field
     * @ejb:pk-field
     */
    public String getEmployeeId() {
        return employeeId;
    }

    /**
     * @ejb:interface-method
     */
    public void setEmployeeId(String employeeId) {
        this.employeeId = employeeId;
    }

    /**
     * @ejb:interface-method
     * @ejb:persistent-field
     */
    public String getFirstName() {
        return firstName;
    }

    /**
     * @ejb:interface-method
     */
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    /**
     * @ejb:interface-method
     * @ejb:persistent-field
     */
    public String getLastName() {
        return lastName;
    }

    /**
     * @ejb:interface-method
     */
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    /**
     * @ejb:interface-method
     * @ejb:persistent-field
     */
    public String getPhone() {
        return phone;
    }

    /**
     * @ejb:interface-method
     */
    public void setPhone(String phone) {
        this.phone = phone;
    }

    public void setEntityContext(EntityContext context) {
        this.context = context;
    }

    public void unsetEntityContext() {
        this.context = null;
    }

    public void ejbActivate() {  }

    public void ejbPassivate() {  }

    /**
     * @jrun:jdbc-mapping name="load" source="samples"
     *                action="SELECT employee_id, first_name,
                      last_name, phone FROM employees WHERE
                      employee_id=?"
     * @jrun:jdbc-mapping-param name="employeeId" type="VARCHAR"
     * @jrun:jdbc-mapping-field employeeId
     * @jrun:jdbc-mapping-field firstName
     * @jrun:jdbc-mapping-field lastName
     * @jrun:jdbc-mapping-field phone
     */
    public void ejbLoad() {  }

    /**
     * @jrun:jdbc-mapping name="store" source="samples"
     *                action="UPDATE employees SET first_name=?, 
                       last_name=?, phone=?WHERE employee_id=?"
     * @jrun:jdbc-mapping-param name="firstName" type="VARCHAR"
     * @jrun:jdbc-mapping-param name="lastName" type="VARCHAR"
     * @jrun:jdbc-mapping-param name="phone" type="VARCHAR"
     * @jrun:jdbc-mapping-param name="employeeId" type="VARCHAR"
     */
    public void ejbStore() {  }

    /**
     * @jrun:jdbc-mapping name="remove"
     *                source="samples"
     *                action="DELETE FROM employees WHERE 
                      employee_id=?"
     * @jrun:jdbc-mapping-param name="employeeId" type="VARCHAR"
     */
    public void ejbRemove() throws RemoveException {
    }

    /**
     * @jrun:jdbc-mapping name="findByPrimaryKey" source="samples"
     *                action="SELECT employee_id FROM employees WHERE
                      employee_id=?"
     * @jrun:jdbc-mapping-param name="employeeId" type="VARCHAR"
     * @jrun:jdbc-mapping-field employeeId
     */
    public void findByPrimaryKey(String pk) {
    }

    /**
     * @jrun:jdbc-mapping name="findAll" source="samples"
     *                action="SELECT employee_id FROM employees"
     * @jrun:jdbc-mapping-field employeeId
     */
    public Collection findAll() {
        return null;
    }

    /**
     * @jrun:jdbc-mapping name="findByLastName" source="samples"
     *                action="SELECT employee_id FROM employees WHERE 
                     last_name=?1"
     * @jrun:jdbc-mapping-param name="lastName" type="VARCHAR"
     * @jrun:jdbc-mapping-field employeeId
     */
    public Collection findByLastName(String lastName) {
    this.lastName = lastName;
        return null;
    }
}