公開記述子のコーディング

まず Deploy ツールが正しくホームおよびリモート インターフェイス実装を生成し、さらに runtime.properties ファイルを生成するように、公開記述子にある要素をコーディングします。既定では、ejb-jar.xml という名前の公開記述子を、XML エディタやテキスト エディタを使用して作成できます。さらに、一部の Java IDE でも公開記述子を自動的に生成します。


メモ

既存の公開記述子を表示するには、/samples サブディレクトリを参照してください。 既存の公開記述子をコピーし、必要に応じて要素を変更する方法をお勧めします。


基本要素

公開記述子ファイルでは、JAR ファイルにあるすべての EJB を定義する必要があります。Deploy ツールでは、この情報を使用して、ホームおよびリモートの実装を生成します。

Bean タイプの識別

公開記述子にある EJB は、enterprise-beans 要素によってラップされます。各 EJB は、entity 要素 (エンティティ Bean の場合) または session 要素 (セッション Bean の場合) によってラップされます。

Bean の命名

Bean または Bean のインターフェイスの命名に関して条件や制限はありません。命名規則に関して仮定を定義することはできないため、Bean 開発者は、Bean のホーム インターフェイス、リモート インターフェイス、および実装の名前を、Bean の公開記述子で指定する必要があります。たとえば、次のような home 要素、remote 要素、および ejb-class 要素を指定します (推奨表記規則)。

<home>ejbeans.BalanceHome</home>
<remote>ejbeans.Balance</remote>
<ejb-class>ejbeans.BalanceBean</ejb-class>

エンティティ Bean の プライマリ キー クラス タイプを指定する必要があります。Deploy ツールはこの情報を使用してクラス情報を生成し、コンテナ管理パーシスタンスを使用する場合に、コンテナもこの情報を必要とします。

<prim-key-class>java.lang.Integer</prim-key-class>

ホーム名

ejb-name 要素を使用して、JNDI ネームスペースにある Bean に関連するホーム名を指定します。EJB エンジンはこの指定を使用して、JNDI コンテキストにあるホーム オブジェクトをバインドします。

<ejb-name>sample2a.BalanceHome</ejb-name>

ステートの管理

session-type 要素は、セッション Bean のステートを管理する方法を指定します。有効な値は、Stateful および Stateless です。

<session-type>Stateful</session-type>

パーシスタンスおよびコンテナ管理フィールド

persistence-type 要素は、エンティティ Bean がパーシスタンスを管理する方法を指定します。有効な値は、bean および container です。さらに、CMP を使用するエンティティ Bean は、cmp-field 要素を使用してコンテナ管理フィールドを識別しなければなりません。次の例は、2 つのコンテナ管理フィールドを持つ CMP エンティティ Bean を示します。

<persistence-type>Container</persistence-type>
<cmp-field>
  <field-name>_id</field-name>
</cmp-field>
<cmp-field>
  <field-name>_value</field-name>
</cmp-field>

セキュリティ要素

security-role 要素および method-permission 要素を使用して ロールベースのセキュリティを実装すると、1 つの Bean のすべてのメソッドまたは特定のメソッドのいずれか一方の起動を許可されているロールを指定できます。これらの要素は、assembly-descriptor 要素によってラップされている必要があります。

all という特別な値は、認証にかかわらずすべてのユーザを意味します。次の例では、すべてのユーザが create メソッドおよび getValue メソッドを使用できますが、save メソッドについては貯蓄者 (saver) ロールのユーザ、また spend メソッドについては支出者 (spender) ロールのユーザだけが使用できます。

<assembly-descriptor>
  <security-role>
    <role-name>spender</role-name>
  </security-role>
  <security-role>
    <role-name>saver</role-name>
  </security-role>
  <security-role>
    <role-name>all</role-name>
  </security-role>
  <method-permission>
    <role-name>spender</role-name>
    <method>
      <ejb-name>sample2a.BalanceHome</ejb-name>
      <method-name>spend</method-name>
    </method>
  </method-permission>
  <method-permission>
    <role-name>saver</role-name>
    <method>
      <ejb-name>sample2a.BalanceHome</ejb-name>
      <method-name>save</method-name>
    </method>
  </method-permission>
  <method-permission>
    <role-name>all</role-name>
    <method>
      <ejb-name>sample2a.BalanceHome</ejb-name>
      <method-name>create</method-name>
    </method>
  </method-permission>
  <method-permission>
    <role-name>all</role-name>
    <method>
      <ejb-name>sample2a.BalanceHome</ejb-name>
      <method-name>getValue</method-name>
    </method>
  </method-permission>
</assembly-descriptor>

env-entry 要素

以前のリリースの JRun EJB エンジンでは、開発者は公開記述子ではなく Bean プロパティ ファイルを指定していました。標準ではありませんが、このテクニックを使用すると、柔軟性が大幅に広がります。JRun 3.1 では、公開記述子が完全にサポートされているほか、env-entry 要素を使用して JRun 固有の Bean プロパティを渡す機能もあります。

env-entry を指定するための基本要素は、次のとおりです。

<env-entry>
  <env-entry-name>propertyname</env-entry-name>
  <env-entry-value>propertyvalue</env-entry-value>
</env_entry>

たとえば、ejb.sessionTimeout を env-entry として使用することによって、1 つの Bean で、セッション オブジェクトがタイムアウトになるまでの秒数を指定できます。このプロパティを指定しない場合、タイムアウトの既定値 900 (15 分) が適用されます。次の例では、タイムアウトの間隔を 600 に設定しています。

<env-entry>
  <env-entry-name>ejb.sessionTimeout</env-entry-name>
  <env-entry-type>java.lang.String</env-entry-type>
  <env-entry-value>600</env-entry-value>
</env-entry>

次の例では、ejipt.isTimeoutFromCreate env-entry を使用して、セッション オブジェクトのタイムアウトが作成または最終アクセスの時点のどちらから開始するかを指定します。true または false のいずれかを指定します。このプロパティを指定しない場合、最終アクセスが適用されます。

<env-entry>
  <env-entry-name>ejipt.isTimeoutFromCreate</env-entry-name>
  <env-entry-type>java.lang.String</env-entry-type>
  <env-entry-value>false</env-entry-value>
</env-entry>

EJB エンジン固有のプロパティの先頭には、通常 ejipt が付いています。env-entry を使用して渡すことのできるプロパティの詳細については、JRun JavaDocs の EjbProperties および EjiptProperties インターフェイスのマニュアルを参照してください。これらのインターフェイスは、各プロパティの内部定数を定義し、プロパティごとの定義を含んでいます。

公開記述子の例

次の例は、EJB サンプル 2b の XML 公開記述子を示します。

<?xml version="1.0"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD 
EnterpriseJavaBeans 1.1//EN" 
"http://java.sun.com/j2ee/dtds/ejb-jar_1_1.dtd">
<ejb-jar>
  <description>Custom Authentication</description>
  <display-name>Custom Authentication</display-name>
  <enterprise-beans>
    <entity>
      <display-name>UserBean</display-name>
      <ejb-name>sample2b.UserHome</ejb-name>
      <home>ejbeans.UserHome</home>
      <remote>ejbeans.User</remote>
      <ejb-class>ejbeans.UserBean</ejb-class>
      <prim-key-class>java.lang.String</prim-key-class>
      <persistence-type>Bean</persistence-type>
      <reentrant>False</reentrant>
      <env-entry>
        <env-entry-name>ejipt.maxContexts</env-entry-name>
        <env-entry-type>java.lang.String</env-entry-type>
        <env-entry-value>unspecified</env-entry-value>
      </env-entry>
      <env-entry>
        <env-entry-name>ejipt.storeName</env-entry-name>
        <env-entry-type>java.lang.String</env-entry-type>
        <env-entry-value>default</env-entry-value>
      </env-entry>
    </entity>
    <session>
      <display-name>LoginSessionBean</display-name>
      <ejb-name>sample2b.LoginSessionHome</ejb-name>
      <home>ejbeans.LoginSessionHome</home>
      <remote>ejbeans.LoginSession</remote>
      <ejb-class>ejbeans.LoginSessionBean</ejb-class>
      <session-type>Stateful</session-type>
      <transaction-type>Bean</transaction-type>
      <env-entry>
        <env-entry-name>ejipt.maxContexts</env-entry-name>
        <env-entry-type>java.lang.String</env-entry-type>
        <env-entry-value>unspecified</env-entry-value>
      </env-entry>
      <env-entry>
        <env-entry-name>ejb.sessionTimeout</env-entry-name>
        <env-entry-type>java.lang.String</env-entry-type>
        <env-entry-value>600</env-entry-value>
      </env-entry>
      <env-entry>
        <env-entry-name>create.ejb.runAsMode</env-entry-name>
        <env-entry-type>java.lang.String</env-entry-type>
        <env-entry-value>SYSTEM_IDENTITY</env-entry-value>
      </env-entry>
    </session>
    <entity>
      <display-name>RoleBean</display-name>
      <ejb-name>sample2b.RoleHome</ejb-name>
      <home>ejbeans.RoleHome</home>
      <remote>ejbeans.Role</remote>
      <ejb-class>ejbeans.RoleBean</ejb-class>
      <prim-key-class>java.lang.String</prim-key-class>
      <persistence-type>Bean</persistence-type>
      <reentrant>False</reentrant>
      <env-entry>
        <env-entry-name>ejipt.maxContexts</env-entry-name>
        <env-entry-type>java.lang.String</env-entry-type>
        <env-entry-value>unspecified</env-entry-value>
      </env-entry>
      <env-entry>
        <env-entry-name>ejipt.storeName</env-entry-name>
        <env-entry-type>java.lang.String</env-entry-type>
        <env-entry-value>default</env-entry-value>
      </env-entry>
    </entity>
    <entity>
      <display-name>BalanceBean</display-name>
      <ejb-name>sample2b.BalanceHome</ejb-name>
      <home>ejbeans.BalanceHome</home>
      <remote>ejbeans.Balance</remote>
      <ejb-class>ejbeans.BalanceBean</ejb-class>
      <prim-key-class>java.lang.Integer</prim-key-class>
      <persistence-type>Bean</persistence-type>
      <reentrant>False</reentrant>
      <env-entry>
        <env-entry-name>ejipt.maxContexts</env-entry-name>
        <env-entry-type>java.lang.String</env-entry-type>
        <env-entry-value>unspecified</env-entry-value>
      </env-entry>
    </entity>
  </enterprise-beans>
  <assembly-descriptor>
    <security-role>
      <role-name>system</role-name>
    </security-role>
    <security-role>
      <role-name>all</role-name>
    </security-role>
    <security-role>
      <role-name>spender</role-name>
    </security-role>
    <security-role>
      <role-name>saver</role-name>
    </security-role>
      <method-permission>
        <role-name>system</role-name>
        <method>
          <ejb-name>sample2b.UserHome</ejb-name>
          <method-name>checkPassword</method-name>
        </method>
      </method-permission>
      <method-permission>
        <role-name>all</role-name>
        <method>
          <ejb-name>sample2b.UserHome</ejb-name>
          <method-name>*</method-name>
        </method>
      </method-permission>
      <method-permission>
        <role-name>all</role-name>
        <method>
          <ejb-name>sample2b.LoginSessionHome</ejb-name>
          <method-name>*</method-name>
        </method>
      </method-permission>
      <method-permission>
        <role-name>all</role-name>
        <method>
          <ejb-name>sample2b.RoleHome</ejb-name>
          <method-name>*</method-name>
        </method>
      </method-permission>
      <method-permission>
        <role-name>spender</role-name>
        <method>
          <ejb-name>sample2b.BalanceHome</ejb-name>
          <method-name>spend</method-name>
        </method>
      </method-permission>
      <method-permission>
        <role-name>saver</role-name>
        <method>
          <ejb-name>sample2b.BalanceHome</ejb-name>
          <method-name>save</method-name>
        </method>
      </method-permission>
      <method-permission>
        <role-name>all</role-name>
        <method>
          <ejb-name>sample2b.BalanceHome</ejb-name>
          <method-name>create</method-name>
        </method>
       </method-permission>
      <method-permission>
        <role-name>all</role-name>
        <method>
          <ejb-name>sample2b.BalanceHome</ejb-name>
          <method-name>getValue</method-name>
        </method>
      </method-permission>
  </assembly-descriptor>
</ejb-jar>