プログラミングの前提条件

共通メソッド、前提条件ステップ、および Virtual member manager アプリケーションを作成するプログラマーが必要とするその他の情報について、ここで説明します。

Virtual member manager パッケージのインポート

Virtual member manager の機能をアプリケーションに組み込むには、Virtual member manager パッケージおよびその他の関連パッケージを事前にインポートする必要があります。 次の例は、インポートする必要があるパッケージ、およびクラスの定義方法を示しています。

import java.util.Hashtable;
import java.util.List;

import com.ibm.websphere.wim.SchemaConstants;
import com.ibm.websphere.wim.Service;
import com.ibm.websphere.wim.client.LocalServiceProvider;
import com.ibm.websphere.wim.ras.WIMTraceHelper;

import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
import javax.security.auth.Subject;
import javax.security.auth.login.LoginContext;
import com.ibm.websphere.security.auth.WSSubject;
import com.ibm.websphere.security.auth.callback.WSCallbackHandlerImpl;
import commonj.sdo.DataObject;

Virtual member manager サービスおよびその他の共通メソッドの取得

アプリケーションが WebSphere Application Server 内部で実行されている場合、Virtual member manager サービスを、リモート EJB またはローカル JVM から取得できます。

注: リモート EJB API を使用して Virtual member manager を呼び出す場合は、 wim.ear がデプロイされていることを確認してください。 詳しくは、 Virtual member manager のインストールを参照してください。

以下の基本アプリケーションのサンプルには、Virtual member manager サービスを取得する方法を示す locateService() メソッドと、さまざまな Virtual member manager 操作のコード・サンプルで使用されるその他の共通メソッドが含まれています。 以下のコードでイタリックで示されている変数 は、必要な実際の値に置き換えてください。

/**
 * This is a base application which defines common methods that are 
 * used by other code samples.
 **/
public class BaseApp implements SchemaConstants
{
    /**
     * Common variable declaration: update based on the environment
     **/
    static final String HOST = "localhost";       // host name of the WebSphere Application Server
    static final String BOOTSTRAP_PORT = "2809";  // Bootstrap/RMI port number
    
    // Virtual member manager service that is used to make API calls
    static Service service = null;

    /**
     * Locates virtual member manager service using a remote EJB
     * @param ejbJndiName JNDI name of the EJB. 
     * Default EJB name is "ejb/com/ibm/websphere/wim/ejb/WIMServiceHome"
     **/
    public static Service locateService(String ejbJndiName)
    {
        try {
            // Remote access virtual member manager Service EJB
            Hashtable environment = new Hashtable();
            
            String providerURL = "corbaloc:iiop:" + HOST + ":" + BOOTSTRAP_PORT;
            environment.put(LocalServiceProvider.PROVIDER_URL, providerURL);
            if (ejbJndiName == null) {
                ejbJndiName = "ejb/com/ibm/websphere/wim/ejb/WIMServiceHome";
            }
            environment.put(LocalServiceProvider.EJB_JNDI_NAME, ejbJndiName);
            
            service = new LocalServiceProvider(environment);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        return service;
    }
    
    /**
     * Locates virtual member manager service in local JVM
     **/
    public static Service locateService()
    {
        try { 
            // Local access virtual member manager Service 
            return new LocalServiceProvider(null);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * Runs action as specified user
     * @param user user name
     * @param password password of the user
     * @param action Action to invoke after successful login of the user
     * @return Object returned by the action
     **/
    public static Object runAsUser(String user, String password, PrivilegedExceptionAction action) throws Exception
    {
        LoginContext loginContext;
        Subject subject;

        // Login using the userid and password that was passed, which has the required role
        loginContext = new LoginContext("WSLogin", new WSCallbackHandlerImpl(user, "", password));
        loginContext.login();
        subject = loginContext.getSubject();

        try {
            return WSSubject.doAs(subject, action);
        }
        catch (PrivilegedActionException excp) {
            throw (Exception) excp.getCause();
        }
    }

    public static String printDO(DataObject obj)
    {
        return WIMTraceHelper.printDataObject(obj);
    }

    /**
     * Loop through the entities in the DataObject and print its uniqueName
     * @param root input DataObject
     */
    @SuppressWarnings("unchecked")
    public static void printIdentifiers(DataObject root) throws Exception
    {
        // Get all entities in the DataObject
        List entities = root.getList(SchemaConstants.DO_ENTITIES);
        for (int i = 0; i < entities.size(); i++) {
            DataObject ent = (DataObject) entities.get(i);
            // Get the entity Identifier
            DataObject id = ent.getDataObject(SchemaConstants.DO_IDENTIFIER);
            if (id != null) {
                String uniqueName = id.getString(SchemaConstants.PROP_UNIQUE_NAME);
                System.out.println("UniqueName is  -> " +uniqueName);
            }
            else {
                System.out.println("Missing Identifier");
            }
        }
    }
}
注: アプリケーションがローカル・モードで Virtual member manager API を呼び出す場合は、クライアント JVM で以下のシステム・プロパティーを設定します。
org.eclipse.emf.ecore.EPackage.Registry.INSTANCE=com.ibm.ws.wim.util.VMMEMFGlobalDelegatorRegistry
このシステム・プロパティーを設定しないと、デフォルト EMF 実装が有効になります。この実装では、マルチセキュリティー・ドメイン環境がサポートされておらず、EMF スキーマが破損しスキーマ違反エラーが発生する可能性があります。
制約事項: EJB クライアントが WebSphere Application Server 以外のサーバー・プロセス、または WebSphere Application Server バージョン 8.0 よりも古いサーバー・プロセスにある場合、マルチドメイン・セキュリティー環境でリモート EJB クライアントが EMF にアクセスするときにも EMF スキーマが破損する可能性があります。 リモート EJB クライアント・プロセスが一度に使用できるドメイン・サービスは 1 つまでであることから、これは、マルチセキュリティー・ドメイン環境の制約事項です。 リモート EJB クライアントが複数のドメイン・サービスを一度に操作しようとすると、クライアント・プロセスの EMF スキーマ・レジストリーが破損し、クライアント・アプリケーションで予期しないスキーマ違反エラーが発生します。

Virtual member manager API の呼び出し

さまざまな Virtual member manager 操作のコード・サンプルが、BaseApp クラスで定義されたメソッドを使用します。 API 呼び出しを行う方法の説明については、コード・サンプルを参照してください。

自分のアプリケーション・コードで Virtual member manager API を呼び出すには、以下の役割のいずれかに割り当てられている必要があります。

  • WebSphere Application Server 管理者ロール

  • 統合リポジトリー管理権限を使用して割り当てられた Virtual member manager 役割

    Virtual member manager の事前定義の役割について詳しくは、「 セキュリティーの提供」の「統合リポジトリー管理権限を割り当てるための役割へのユーザーおよびグループのマッピング」セクションを参照してください。

    事前定義された仮想メンバー・マネージャー・ロールにユーザーまたはグループを割り当てる方法については、 WebSphere Application Server 資料のトピック「 AdminTask オブジェクトの IdMgrConfig コマンドAdminTask 」で mapIdMgrUserToRole, mapIdMgrGroupToRole, removeIdMgrUsersFromRole, removeIdMgrGroupsFromRole, listIdMgrUsersForRoles, および listIdMgrGroupsForRoles コマンドについての説明を参照してください。

    エンドツーエンドのシナリオ例については、トピック「 統合リポジトリー管理権限を使用するためのサンプル・コード」を参照してください。

コードのコンパイル

コードをコンパイルする場合、クラスパス設定を調べて、正しい Java アーカイブ (JAR) ファイルが含まれていることを確認してください。

  • <WAS_HOME>\plugins\com.ibm.ws.runtime.jar
  • <WAS_HOME>\plugins\com.ibm.ws.runtime.wim.base.jar
  • <WAS_HOME>\plugins\org.eclipse.emf.commonj.sdo.jar
  • <WAS_HOME>\lib\j2ee.jar

コードの実行

アプリケーション・コードが、アプリケーションまたはサーブレットとして WebSphere Application Server 内部で実行している場合、Virtual member manager にアクセスするための Subject およびその他のパラメーターが暗黙的に使用されます。これらのパラメーターは、アプリケーションがデプロイされているサーバーまたはプロセスのものと同じです。

アプリケーションが WebSphere Application Server の外部で (例えば WebSphere Application Server クライアントから) 実行されている場合は、コンパイルされたコードを実行するときに以下の JVM 引数を使用してください。 以下の引数でイタリックで示されている変数 は、必要な実際の値に置き換えてください。

-Djava.security.auth.login.config=<WAS_HOME>/properties/wsjaas_client.conf 
-Dcom.ibm.CORBA.ConfigURL=<WAS_HOME_URL>/properties/sas.client.props
-Dcom.ibm.SSL.ConfigURL=<WAS_HOME_URL>/properties/ssl.client.props 

以下の引数は、CORBA プロパティー・ファイルで指定されたクレデンシャルをオーバーライドする必要がある場合のみ使用してください。

-Dcom.ibm.CORBA.loginSource=properties 
-Dcom.ibm.CORBA.loginUserid=AdminUserId 
-Dcom.ibm.CORBA.loginPassword=Admin Password
サンプル値を使用した JVM 引数の例のいくつかを以下に示します。
-Djava.security.auth.login.config=C:/Progra~1/IBM/WebSphere/AppClient/properties/wsjaas_client.conf 
-Dcom.ibm.CORBA.ConfigURL=file:/Progra~1/IBM/WebSphere/AppClient/properties/sas.client.props
-Dcom.ibm.SSL.ConfigURL=file:/Progra~1/IBM/WebSphere/AppClient/properties/ssl.client.props 
-Dcom.ibm.CORBA.loginSource=properties
-Dcom.ibm.CORBA.loginUserid=admin
-Dcom.ibm.CORBA.loginPassword=admin
コードの実行を試みる前に、クラスパス設定を調べて、以下の JAR ファイルが含まれていることを確認してください。
  • <WAS_HOME>\lib\j2ee.jar
  • <WAS_HOME>\lib\bootstrap.jar
  • <WAS_HOME>\plugins の下のすべての JAR ファイル

プロパティー・スキーマの拡張

propertySchema データ・オブジェクトおよび extensionPropertySchema データ・オブジェクト
propertySchema データ・オブジェクトは、実行時にプロパティー・タイプを作成し、それを既存の Virtual member manager エンティティー・タイプに追加するために使用されます。 新しいプロパティーは wimxmlextension.xml ファイルに追加されます。 ただし、プロパティー拡張リポジトリーのデータベース・スキーマの拡張も行うには、extensionPropertySchema データ・オブジェクトを使用する必要があります。 extensionPropertySchema データ・オブジェクトを使用した場合、新しいプロパティーは wimxmlextension.xml ファイルの既存のエンティティー・タイプに追加され、プロパティー拡張データベースにも格納されます。
注: カスタム名前空間でプロパティーを拡張してから、Virtual member manager の取得 API または検索 API を使用する場合は、データ・グラフ (<nsPrefix>:<propName>) でプロパティー名とともに名前空間接頭部を明示的に指定する必要があります。 デフォルトの名前空間とカスタム名前空間の両方に同じ名前のプロパティーが存在する場合、このプロパティー名を使用してエンティティーを作成すると、Virtual member manager はデフォルトの名前空間のプロパティーを使用してエンティティーを作成します。
propertySchema データ・オブジェクトを使用するサンプル・コードについては、 LDAP リポジトリーでスキーマを拡張するためのサンプル・コードを参照してください。 extensionPropertySchemaを使用するサンプルコードについては 、「プロパティ拡張リポジトリのスキーマ拡張のサンプルコード」 を参照してください。
プロパティーのデータ・タイプ
Virtual member manager のプロパティーでサポートされるデータ型の構文を以下に示します。 詳しくは、 WebSphere Application Server 資料の Virtual member manager Javadoc 情報の SchemaConstants セクションを参照してください。
  • DATA_TYPE_ANY_SIMPLE_TYPE
  • DATA_TYPE_ANY_URI
  • DATA_TYPE_BASE_64_BINARY
  • DATA_TYPE_BOOLEAN
  • DATA_TYPE_BYTE
  • DATA_TYPE_DATE
  • DATA_TYPE_DATE_TIME
  • DATA_TYPE_DOUBLE
  • DATA_TYPE_IDENTIFIER_TYPE
  • DATA_TYPE_INT
  • DATA_TYPE_LONG
  • DATA_TYPE_SHORT
  • DATA_TYPE_STRING
  • DATA_TYPE_TOKEN