マルチセキュリティー・ドメインにわたってスキーマを拡張するためのサンプル・コード

ここでは、マルチセキュリティー・ドメインにわたってプロパティー・スキーマを拡張するための、構成ステップ、コマンド、サンプル・コード、およびデータ・グラフを示します。

構成コマンドおよびサンプル・コード・スニペットでは、以下の手順を実行します。

  1. マルチセキュリティー・ドメインを作成します。
  2. セキュリティー・ドメインを特定のアプリケーション・サーバーにマップします。
  3. 前提条件システム・アプリケーションをインストールします。
  4. 新規プロパティーを各サーバー・インスタンスに追加します。
  5. 異なるインスタンスで拡張されたプロパティーを使用して検索操作を実行します。

前提条件

プログラミングの前提条件」トピック (propertySchema および extensionPropertySchema データ・オブジェクトについての情報が記載され、プロパティーのデータ型についての有効な構文がリストされている「プロパティー・スキーマの拡張」セクションを含む) で説明されている情報を参照済みであること、またトピックの手順を実行済みであることを確認してください。

アプリケーションでサンプル・コードを使用する前に、以下の構成ステップを完了する必要があります。wsadmin ツールを開始して、以下のコマンドを実行します。変数 を、実際に使用する値に置き換えます。

  1. WebSphere Application Server プロファイル管理ツールを使用して、基本プロファイルを作成します。管理セキュリティーが有効であることを確認してください。新規アプリケーション・サーバー (例えば server1) が作成されます。
  2. もう 1 つのサーバー (例えば server2) を追加します。
    $AdminTask createApplicationServer nodeName {-name server2}
  3. セキュリティー・ドメインを作成します。
    $AdminTask copySecurityDomainFromGlobalSecurity {-securityDomainName domain1}
  4. このドメインを、ステップ 2 で作成した server2 にマップします。
    $AdminTask mapResourceToSecurityDomain { -securityDomainName domain1 -resourceName Cell=:Node=nodeName:Server=server2}
  5. マルチセキュリティー・ドメイン環境では、ドメイン固有スキーマの代わりにグローバル・スキーマを使用するように、useGlobalSchema プロパティーを設定できます。グローバル・スキーマは、管理ドメインのスキーマを参照します。グローバル・スキーマを使用するように設定されているアプリケーション・ドメインは、管理ドメインの同一スキーマを共有します。 したがって、1 つのドメインでアプリケーションのスキーマを拡張する場合、その他のドメインのアプリケーションに及ぼす影響を考慮する必要があります。これは、これらのアプリケーションも同一スキーマによりバインドされているためです。例えば、特定のアプリケーションの必須プロパティーを追加すると、他のアプリケーションが失敗することがあります。

    グローバル・スキーマを使用する場合は、このステップを実行します。ドメイン固有のスキーマを使用する場合は、このステップをスキップします。

    $AdminTask setIdMgrUseGlobalSchemaForModel { -useGlobalSchema true -securityDomainName domain1 }
  6. server1 に wim.ear をシステム・アプリケーションとしてインストールします。
    $AdminApp install app_server_root/systemApps/wim.ear { -appname wim -server server1 -systemApp}
  7. server2 に wimperdomain.ear を通常のアプリケーションとしてインストールします。 マルチセキュリティー・ドメイン環境では、各ターゲット・サーバーに Virtual member manager をデプロイする必要があります。各ターゲット・サーバーでは、セキュリティー・ドメイン内の Virtual member manager インスタンスへの参照を取得するため、サーバー有効範囲がそのセキュリティー・ドメインに関連付けられています。この手順により、特定のドメインの EJB を介して Virtual member manager API を呼び出すことができます。Virtual member manager API の必須アクセス・ロールが割り当てられているユーザー、またはそのドメインのスーパーユーザーのみが、該当する API を呼び出すことができます。
    $AdminApp install app_server_root/installableApps/wimperdomain.ear {
      			-appname wimperdomain1 
      			-BindJndiForEJBNonMessageBinding {{ wim.ejb WIMService wimejb.jar,
              META-INF/ejb-jar.xml ejbd1/com/ibm/websphere/wim/ejb/WIMServiceHome}} 
      			-MapModulesToServers {{ wim.ejb wimejb.jar,META-INF/ejb-jar.xml 
              WebSphere:cell=cellName,node=nodeName,server=server2 }}}
  8. 構成を保存します。
    $AdminConfig save

サンプル・コード

以下の手順で説明するように、次のサンプル・コードをアプリケーション・コードに追加します。変数 を、実際に使用する値に置き換えます。

  1. 次の手順で示されるサンプル・コード・スニペットでメソッドを使用するには、以下の変数宣言が必要です。これらの宣言をアプリケーション・コードに追加し、変数 を実際に使用する値に置き換えます。
    //The service object that holds the virtual member manager ejb service reference for server1.
    	private static Service service1 = null;
    	
    //The service object that holds the virtual member manager ejb service reference for server2.
    	private static Service service2 = null;
    
    //A string constant for the new property name to be added for server1.
    	private static final String server1PropName = "postOfficeBox";
    
    //A string constant for the new property name to be added for server2.
    	private static final String server2PropName = "age";
  2. startServer コマンドを使用して server1 を始動します。
  3. 以下の locateServices() メソッドを使用して、ローカル・ホスト上の WebSphere Application Server で実行されている Virtual member manager サービスを見つけます。ブートストラップ・ポートが locateServices() メソッドで正しく指定されていることを確認してください。
    /**
     *  This method locates the virtual member manager services running on 
     *  WebSphere Application Sever on the localhost
     */
    private static void locateServices()
    {
        // Remote access WIM Service EJB
        try 
        {
            Hashtable<String, String> environment = new Hashtable<String, String>();
            environment.put(LocalServiceProvider.PROVIDER_URL, "corbaloc:iiop:localhost:2814");
            
            service1 = new LocalServiceProvider(environment);
        }
        catch (Exception e) 
        {
            e.printStackTrace();
        }
    
        try 
        {
            Hashtable<String, String> environment = new Hashtable<String, String>();
            environment.put(LocalServiceProvider.EJB_JNDI_NAME, 
                    "ejbd1/com/ibm/websphere/wim/ejb/WIMServiceHome");
            environment.put(LocalServiceProvider.PROVIDER_URL, "corbaloc:iiop:localhost:2815");
            
            service2 = new LocalServiceProvider(environment);
        }
        catch (Exception e) 
        {
            e.printStackTrace();
        }
    }
  4. 以下の createPropertyOnServer1() メソッドを使用して、新規プロパティーを server1 インスタンスに追加します。
    /**
     *  This method adds the "postOfficeBox" property to "PersonAccount" entity type.
     */
    private static void createPropertyOnServer1() 
    {
        try 
        {
            System.out.println("¥nCreating new property type postOfficeBox
                    and add it to existing entity type PersonAccount");
            
            DataObject root = service1.createRootDataObject();
            DataObject dynaSchemaDO = root.createDataObject(SchemaConstants.DO_SCHEMA);
            
            // Create new property schema data object
            DataObject propSchemaDO = dynaSchemaDO.createDataObject(SchemaConstants.DO_PROPERTY_SCHEMA);
            // Set the values for the property, such as, namespace URI, namespace prefix, property name
            propSchemaDO.set(SchemaConstants.PROP_NS_URI, SchemaConstants.WIM_NS_URI);
            propSchemaDO.set(SchemaConstants.PROP_PROPERTY_NAME, server1PropName);
            propSchemaDO.setBoolean(SchemaConstants.PROP_MULTI_VALUED, false);
            propSchemaDO.set(SchemaConstants.PROP_DATA_TYPE, SchemaConstants.DATA_TYPE_STRING);
            List applicableEntityTypes = propSchemaDO.getList(SchemaConstants.PROP_APPLICABLE_ENTITY_TYPE_NAMES);
            applicableEntityTypes.add(Service.DO_PERSON_ACCOUNT);
            
            System.out.println("Input datagraph -> " + printDO(root));
            // Invoke the create schema API
            root = service1.createSchema(root);
            System.out.println("Output datagraph -> " + printDO(root));
            System.out.println("¥nCLIENT: new property type is created.");
        }
        catch (Exception e) 
        {
            e.printStackTrace();
        }
    }
  5. stopServer コマンドを使用して server1 を停止します。
  6. startServer コマンドを使用して server2 を始動します。
  7. 以下の createPropertyOnServer2 メソッドを使用して、新規プロパティーを server2 インスタンスに追加します。
    /**
     *  This method adds the "age" property to "PersonAccount" entity type.
     */
    private static void createPropertyOnServer2() 
    {
        try 
        {
            System.out.println("¥nCreating new property type age and
                    add it to existing entity type Person");
            
            DataObject root = service2.createRootDataObject();
            DataObject dynaSchemaDO = root.createDataObject(SchemaConstants.DO_SCHEMA);
            
            // Create new property schema data object
            DataObject propSchemaDO = dynaSchemaDO.createDataObject(SchemaConstants.DO_PROPERTY_SCHEMA);
            // Set the values for the property, such as, namespace URI, namespace prefix, property name
            propSchemaDO.set(SchemaConstants.PROP_NS_URI, SchemaConstants.WIM_NS_URI);
            propSchemaDO.set(SchemaConstants.PROP_PROPERTY_NAME, server2PropName);
            propSchemaDO.setBoolean(SchemaConstants.PROP_MULTI_VALUED, false);
            propSchemaDO.set(SchemaConstants.PROP_DATA_TYPE, SchemaConstants.DATA_TYPE_INT);
            List applicableEntityTypes = propSchemaDO.getList(SchemaConstants.PROP_APPLICABLE_ENTITY_TYPE_NAMES);
            applicableEntityTypes.add(Service.DO_PERSON_ACCOUNT);
            
            SDOUtils.printDataGraph("Input datagraph", root);
            System.out.println("Input datagraph -> " + printDO(root));
            // Invoke the create Schema API
            root = service2.createSchema(root);
            System.out.println("Output datagraph -> " + printDO(root));
            System.out.println("New property type is created.");
        }
        catch (Exception e) 
        {
            e.printStackTrace();
        }		
    }
  8. stopServer コマンドを使用して server2 を停止します。
  9. server2 および server1 を始動します。
  10. ステップ 4 および 7 で追加された新規プロパティーを持つエンティティーを作成します。 新規プロパティーを追加するサンプル・コードについては、「ファイル・リポジトリーでスキーマを拡張するためのサンプル・コード」トピックを参照してください。
  11. 以下の testSearchProperties() メソッドを使用し、異なるインスタンスで拡張されたプロパティーを使用して検索操作を実行します。
    /**
    	 *  Method that runs different searches on different servers.
    	 */
    private static void testSearchProperties() 
    {
        // Search using the server1 property but using service1
        System.out.println("Searching property '" + server1PropName + "' on server1");
        searchserver1PropName(service1);
        
        // Utility stop to synchronize output
        pause();
        
        // Search using the server1 property but using service2
        System.out.println("Searching property '" + server1PropName + "' on server2");
        searchserver1PropName(service2);
        
        // Utility stop to synchronize output
        pause();
        
        // Search using the server2 property but using service2
        System.out.println("Searching property '" + server2PropName + "' on server2");
        searchserver2PropName(service2);
        
        // Utility stop to synchronize output
        pause();
        
        // Search using the server2 property but using service1
        System.out.println("Searching property '" + server2PropName + "' on server1");
        searchserver2PropName(service1);
    }
    
    /**
     *  A utility method added to ensure that the exception is flushed to the console 
     *  before starting with the next operation.
     */
    private static void pause() 
    {
        try 
        {
            Thread.sleep(1000);
        }
        catch (InterruptedException e) 
        {
        }
    }
    
    /**
     * Method to search on 'age'
     * @param service
     */
    @SuppressWarnings("unchecked")
    private static void searchserver2PropName(Service service) 
    {
        try 
        {
            //Search
            DataObject root = SDOHelper.createRootDataObject();
            DataObject searchCtrl = SDOHelper.createControlDataObject(root, null, 
                    SchemaConstants.DO_SEARCH_CONTROL);
            searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("uid");
            searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("sn");
            searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("cn"); 
            searchCtrl.setString(SchemaConstants.PROP_SEARCH_EXPRESSION, 
                    "@xsi:type='PersonAccount' and " + server2PropName + " > 4");
            root = service.search(root);
            System.out.println("Output datagraph -> " + printDO(root));
            List searchResults = root.getList(SchemaConstants.DO_ENTITIES);
            for (int i = 0; i < searchResults.size(); i++) {
                DataObject ent = (DataObject) searchResults.get(i);
                DataObject id = ent.getDataObject(SchemaConstants.DO_IDENTIFIER);
                if (id != null) {
                    String uniqueName = id.getString(SchemaConstants.PROP_UNIQUE_NAME);
                    if (uniqueName != null) {
                        System.out.println("Found -> " + ent.getString("cn") + "(" + uniqueName + ")");
                    }
                }
            }
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        }
    	}
    
    /**
     *  Method to search on 'postOfficeBox'
     *  @param service
     */
    @SuppressWarnings("unchecked")
    private static void searchserver1PropName(Service service) 
    {
        try 
        {
            //Search
            DataObject root = SDOHelper.createRootDataObject();
            DataObject searchCtrl = SDOHelper.createControlDataObject(root, null, 
                    SchemaConstants.DO_SEARCH_CONTROL);
            searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("uid");
            searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("sn");
            searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("cn"); 
            searchCtrl.setString(SchemaConstants.PROP_SEARCH_EXPRESSION, 
                    "@xsi:type='PersonAccount' and " + server1PropName + "='4-23'");
            root = service.search(root);
            System.out.println("Output datagraph -> " + printDO(root));
            List searchResults = root.getList(SchemaConstants.DO_ENTITIES);
            for (int i = 0; i < searchResults.size(); i++) {
                DataObject ent = (DataObject) searchResults.get(i);
                DataObject id = ent.getDataObject(SchemaConstants.DO_IDENTIFIER);
                if (id != null) {
                    String uniqueName = id.getString(SchemaConstants.PROP_UNIQUE_NAME);
                    if (uniqueName != null) {
                        System.out.println("Found -> " + ent.getString("cn") + "(" + uniqueName + ")");
                    }
                }
            }
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        }
    }

結果

『前提条件』のセクションのステップ 5 で説明したように、グローバル・スキーマを使用するように useGlobalSchema プロパティーを設定した場合、複数ドメインにわたる検索操作の実行時に、すべてのインスタンスで拡張されたプロパティーのすべてを使用することができます。 useGlobalSchema を設定しない場合は、ドメイン固有のスキーマのみが拡張され、検索操作は、現行インスタンスで拡張されたプロパティーのみに基づいて実行されます。



利用条件 | フィードバック