Sun WBEM SDK 開発ガイド

第 4 章 クライアントアプリケーションの作成

この章では、クライアントアプリケーションプログラミングインタフェース (クライアント API) を使用してクライアントアプリケーションを作成する方法について説明します。

CIM API およびクライアント API についての詳細は、Javadoc リファレンスページを参照してください。

概要

WBEM (Web-Based Enterprise Management) アプリケーションは、Sun WBEM SDK API を使用して CIM オブジェクトを操作する標準的な Java プログラムです。クライアントアプリケーションは、一般に CIM API を使用してオブジェクト (ネームスペース、クラス、インスタンスなど) を構築し、続いてそのオブジェクトを初期化します。その後、クライアント API を使用してオブジェクトを CIM Object Manager に渡し、WBEM の処理 (CIM ネームスペース、クラス、またはインスタンスの作成など) を要求します。

クライアントアプリケーションの処理手順

Sun WBEM SDK アプリケーションは通常、次の手順で処理を行います。

  1. CIM Object Manager に接続します (CIMClient)。

    クライアントアプリケーションは、WBEM のオペレーション (CIM クラスの作成や CIM インスタンスの更新など) を実行する必要があるたびに、CIM Object Manager に接続します。

  2. 1 つ以上の API を使用してプログラミング作業を行います。

    CIM Object Manager への接続が完了すると、プログラムは API を使用して処理を要求します。

  3. CIM Object Manager へのクライアント接続を閉じます (close)

    アプリケーションは、終了時に現在のセッションを閉じる必要があります。CIMClient インタフェースを使用して、現在のクライアントセッションを閉じてクライアントセッションが使用しているリソースをすべて解放します。

例 — 一般的な Sun WBEM SDK アプリケーション

例 4–1 に、すべてのデフォルト値を使用して CIM Object Manager に接続する簡単なアプリケーションを示します。このプログラムは、クラスを取得し、そのクラス内のインスタンスを列挙して出力します。


例 4–1 一般的な Sun WBEM SDK アプリケーション

import java.rmi.*;
import com.sun.wbem.client.CIMClient;
import com.sun.wbem.cim.CIMInstance;
import com.sun.wbem.cim.CIMValue;
import com.sun.wbem.cim.CIMProperty;
import com.sun.wbem.cim.CIMNameSpace;
import com.sun.wbem.cim.CIMObjectPath;
import com.sun.wbem.cim.CIMClass;
import com.sun.wbem.cim.CIMException;
import java.util.Enumeration;
 
/**
 * 指定されたクラスのすべてのインスタンスを返す。
 * このメソッドは、引数としてホスト名 (args[0]) と
 * リストするクラスの名前 (args[1]) を受け取る。
 */
public class WBEMsample {
    public static void main(String args[]) throws CIMException {
        CIMClient cc = null;
            try {
                /* args[0] にはネームスペースが入っている。
                ここでは、指定されたホスト上のデフォルトの
	              root\cimv2 ネームスペースを指す
	              CIM ネームスペース (cns) を作成する。 */
						   CIMNameSpace cns = new CIMNameSpace(args[0]);
						   /* CIM Object manager に接続し、ネームスペースを含む 
							 ネームスペースオブジェクトを渡す。 */
						   cc = new CIMClient(cns, "root", "root_password");
						   /* クラス名から CIMObjectPath を作成する。 */
						   CIMObjectPath cop = new CIMObjectPath(args[1]);
						   /* クラスを取得する (修飾子、クラス起点、
	              プロパティなど)。*/
	              cc.getClass(cop, true, true, true, null);
                // このクラスに属するすべてのインスタンス名を返す。
                Enumeration e = cc.enumerateInstanceNames(cop);
                while(e.hasMoreElements()) {
                    CIMObjectPath op = (CIMObjectPath)e.nextElement();
                    System.out.println(op);
                  } // while の終り
	  	        } catch (Exception e) {
                System.out.println("Exception: "+e);
            }
            if(cc != null) {
               cc.close();
            } 
     } // main の終り
 } // WBEMsample の終り


一般的なプログラミング作業

CIM Object Manager への接続が完了すると、クライアントアプリケーションは API を使用して処理を要求します。プログラムの機能セットは、どの処理を要求すべきかを決定します。次に、ほとんどのプログラムが実行する一般的な処理を示します。

アプリケーションは、次の処理を実行する場合もあります。

クライアント接続の開始と終了

アプリケーションは、最初に CIM Object Manager に対しクライアントセッションを開きます。WBEM クライアントアプリケーションは、CIM Object Manager にオブジェクト管理サービスを要求します。クライアントと CIM Object Manager は、同じホスト上でも異なるホスト上でも動作します。同じ CIM Object Manager に対して、複数のクライアントから接続できます。

この節では、ネームスペースの基本概念と、次に示すクラスとメソッドの使用方法を説明します。

ネームスペースの使用

アプリケーションを作成する前に、ネームスペースの CIM 概念を理解する必要があります。ネームスペースは、ディレクトリに似た構造を持ち、ほかのネームスペース、クラス、インスタンス、および修飾子のデータ型を含むことができます。ネームスペース内のオブジェクトの名前は固有にする必要があります。オペレーションはすべて、ネームスペース内で行われます。Solaris WBEM Services をインストールすると、次に示す 2 つのネームスペースが作成されます。

CIM Object Manager に接続する場合、アプリケーションはデフォルトのネームスペース (root\cimv2) に接続するか、別のネームスペース (root\security や独自に作成したネームスペースなど) を指定する必要があります。

特定のネームスペースで CIM Object Manager への接続が完了すると、その後の処理はすべてそのネームスペース内で発生します。ネームスペースに接続すると、そのネームスペース内のすべてのクラスやインスタンス (存在する場合) にアクセスできるだけでなく、そのネームスペース内のすべてのネームスペースにもアクセスできます。たとえば、root\cimv2 ネームスペースに child というネームスペースが作成されている場合、root\cimv2 に接続することによって、root\cimv2 ネームスペースと root\cimv2\child ネームスペース内のすべてのクラスやインスタンスにアクセスできます。

アプリケーションは、ネームスペース内で別のネームスペースに接続できます。これは、ディレクトリ内でサブディレクトリに位置を変更するのに似ています。アプリケーションが別のネームスペースに接続すると、その後の処理はすべてその新しいネームスペース内で発生します。たとえば、root\cimv2\child への接続を新たに開くと、このネームスペース内のクラスやインスタンスにはアクセスできますが、親ネームスペース root\cimv2 内のクラスやインスタンスにはアクセスできません。

CIM Object Manager への接続

クライアントアプリケーションは、WBEM のオペレーション (CIM クラスの作成や CIM インスタンスの更新など) を実行する必要があるたびに、CIM Object Manager に接続します。アプリケーションは、CIMClient クラスを使用して CIM Object Manager 上のクライアントのインスタンスを作成します。CIMClient クラスには、次の 3 つの引数を指定できます。

CIM Object Manager への接続が完了すると、その後の CIMClient オペレーションはすべて指定されたネームスペース内で発生します。

例 — CIM Object Manager への接続

次の例は、CIMClient インタフェースを使用して CIM Object Manager に接続する 2 つの方法を示しています。

例 4–2 では、アプリケーションはすべてデフォルト値を使用しています。つまり、デフォルトのユーザーアカウントとパスワード guest を使用し、ローカルホスト (クライアントアプリケーションが動作しているホスト) のデフォルトのネームスペース (root\cimv2) で動作している CIM Object Manager に接続します。


例 4–2 デフォルトのネームスペースへの接続

/* パスワード guest を持つユーザー guest として 
ローカルホスト上の root\cimv2 ネームスペースに接続 */ 
 
cc = new CIMClient();


例 4–3 のアプリケーションは、ローカルホストのデフォルトネームスペース (root\cimv2) で動作している CIM Object Manager に接続し、root アカウントの UserPrincipal オブジェクトを作成します。このオブジェクトは、デフォルトネームスペース内のすべての CIM オブジェクトに対する読み取り/書き込みアクセス権を備えています。


例 4–3 root アカウントへの接続

{
    ...

    root としてのホスト。2 つの null 文字列によって初期化される
    ネームスペースオブジェクトを作成する。2 つの null 文字列は
    デフォルトのホスト (ローカルホスト) とデフォルトの
    ネームスペース (root\cimiv2) を表す */
 
    CIMNameSpace cns = new CIMNameSpace("", "");

    UserPrincipal up = new UserPrincipal("root");
	   PasswordCredential pc = new PasswordCredential("root_password"); 
    /* root パスワードを使い、root として
    ネームスペースに接続する */
 
    CIMClient cc = new CIMClient(cns, up, pc");
    ...
}


例 4–4 では、アプリケーションはホスト happy 上のネームスペース A に接続します。アプリケーションは、初めにこのネームスペースの文字列名 (A) を含むためにネームスペースのインスタンスを作成します。続いて、CIMClient クラスを使用して CIM Object Manager に接続し、ネームスペースオブジェクト、ユーザー名、およびホスト名を渡します。


例 4–4 デフォルト以外のネームスペースへの接続

{
    ...
    /* ホスト happy 上のA (ネームスペース名) に
    よって初期化されるネームスペースオブジェクトを作成する */
    CIMNameSpace cns = new CIMNameSpace("happy", "A");
    UserPrincipal up = new UserPrincipal("Mary");
    PasswordCredential pc = new PasswordCredential("marys_password");
     
    // このネームスペースにユーザー Mary として接続
    cc = new CIMClient(cns, "Mary", "marys_password");
    ...

} 



例 4–5 RBAC の役割としての認証

ユーザーの役割を認証するには、SolarisUserPrincipalSolarisPasswordCredential クラスを使用する必要があります。次のコード例では、Mary の役割を Admin として認証します。

{
...
CIMNameSpace cns = new CIMNameSpace("happy", "A");
SolarisUserPrincipal sup = new SolarisUserPrincipal("Mary", "Admin");
SolarisPasswordCredential spc = new
        SolarisPasswordCredential("marys_password", "admins_password");
CIMClient cc = new CIMClient(cns, sup, spc);


クライアント接続の終了

アプリケーションは、現在のクライアントセッションの終了時にセッションを閉じる必要があります。現在のクライアントセッションを閉じてこのセッションによって使用されているリソースをすべて解放するには、close メソッドを使用します。次に、クライアント接続を閉じるコード例を示します。インスタンス変数 cc は、このクライアント接続をしたインスタンスを表します。

cc.close();

インスタンスの処理

この節では、CIM インスタンスの作成、削除、および更新 (1 つ以上のインスタンスのプロパティ値の取得と設定) の各方法について説明します。

インスタンスの作成

既存のクラスのインスタンスを作成するには、newInstance メソッドを使用します。既存のクラスがキープロパティを持つ場合、アプリケーションはそのプロパティを固有の値に設定する必要があります。インスタンスは、必要に応じてそのクラスに定義されていない別の修飾子を定義することもできます。それらの修飾子をインスタンスまたは特定のインスタンスプロパティ用に定義できますが、クラス宣言内で定義する必要はありません。

アプリケーションは、クラスに定義されている一連の修飾子を getQualifiers メソッドを使用して取得できます。

例 — インスタンスの作成

例 4–6 のコードセグメントは、newInstance メソッドを使用して、Solaris_Package クラスの CIM インスタンス (Solaris パッケージなど) を表す Java クラスを作成します。


例 4–6 インスタンスの作成 (newInstance())

...
{ 
/*ローカルホストの root\cimv2 ネームスペースの 
CIM Object Manager に接続。root\cimv2namespace 内のオブジェクトに
対する書き込みアクセス権を持つアカウントのユーザー名とパスワードを
指定する */
 
CIMClient cc = new CIMClient(cns, "root", "root_password");
 
// Solaris_Package クラスを取得
cimclass = cc.getClass(new CIMObjectPath("Solaris_Package"), true, true, true, null);
 
/* プロパティのデフォルト値を使用して生成された Solaris_Package
 クラスの新しいインスタンスを作成。このクラスのプロバイダが
 デフォルト値を指定しない場合、プロパティの値は NULL であり、 
 明示的に設定する必要がある。*/
 ci = cimclass.newInstance();
}
... 


インスタンスの削除

インスタンスの削除には、deleteInstance メソッドを使用します。

例 — インスタンスの削除

例 4–7 は、クライアントアプリケーションを CIM Object Manager に接続し、次に示すインタフェースを使用してクラスのインスタンスをすべて削除します。


例 4–7 インスタンスの削除 (deleteInstance)

 
import java.rmi.*;
import com.sun.wbem.client.CIMClient;
import com.sun.wbem.cim.CIMInstance;
import com.sun.wbem.cim.CIMValue;
import com.sun.wbem.cim.CIMProperty;
import com.sun.wbem.cim.CIMNameSpace;
import com.sun.wbem.cim.CIMObjectPath;
import com.sun.wbem.cim.CIMClass;
import com.sun.wbem.cim.CIMException;
import java.util.Enumeration;
 
/**
 * このプログラム例では、必須の 4 つのコマンド行引数を受け取り、
 * 指定されたクラスとそのサブクラスのすべてのインスタンスを削除する。
 * このプログラムでは、指定されたネームスペースへの書き込みアクセス権
 * を持つアカウントのユーザー名とパスワードを指定する必要がある
 * /
public class DeleteInstances {
    public static void main(String args[]) throws CIMException {
    
		// CIMClient クラスのインスタンスを初期化する
		CIMClient cc = null;
	
		// 4 つのコマンド引数が必要。すべてが入力されない場合は、コマンド文字列を出力する
	
		if(args.length != 4) {
	      System.out.println("Usage: DeleteClass host className username password"); 
	      System.exit(1);
		 }
		 try {
	
				 /**
				  * ネームスペースオブジェクト (cns) を作成する。これには、コマンド行から
				  * 入力されたホスト名 (args[0]) が格納される。
				  */
				 CIMNameSpace cns = new CIMNameSpace(args[0]);
 
				 /** 
				  * CIM Object Manager に接続し、ネームスペース
				  * オブジェクト (cns) と、コマンド行から入力されたユーザー名
				  * (args[2]) とパスワード (args[3]) を渡す
				  */
 
				 cc = new CIMClient(cns, args[2], args[3]);
 
				 /**
				  * 削除するクラスの CIM オブジェクトパス (コマンドから入力された
				  * args[1] ) を持つオブジェクトを構築する。
				  */
 
				 CIMObjectPath cop = new CIMObjectPath(args[1]);
	    
				 /**
				  * クラスとそのクラスのすべてのサブクラスのインスタンスオブジェクトパス
				  * を列挙する。インスタンスオブジェクトパスは、CIM Object Manager が
				  * このインスタンスを見つけるときに参照として使用される。
				  */
	     
				 Enumeration e = cc.enumerateInstanceNames(cop);
	    
				 /**
				  * 列挙内のすべてのインスタンスオブジェクトパスを 1 つずつ処理する。
				  * その中で、列挙された各インスタンスオブジェクトパスを格納する
				  * オブジェクトを構築し、そのインスタンスを出力し、削除する。
				  */
	 
				 while(e.hasMoreElements()) {
				     CIMObjectPath op = (CIMObjectPath)e.nextElement();
					   System.out.println(op);
					   cc.deleteInstance(op);
	    		 }
			} catch (Exception e) {
	    	    System.out.println("Exception: "+e);
			}
			if(cc != null) {
	   	    cc.close();
			}
   }
}


インスタンスの取得と設定

アプリケーションが、 CIM Object Manager から CIM インスタンスを取得する場合、getInstance メソッドがよく使用されます。クラスのインスタンスが作成されるときに、インスタンスはその派生元クラスとそのクラス階層にあるすべての親クラスのプロパティを継承します。getInstance メソッドはブール値引数 localOnly を受け取り、localOnly が真である場合、指定されたインスタンスによって継承されたプロパティ以外のプロパティだけを返します。これらのプロパティは、そのインスタンス自体によって定義されたものです。localOnly が偽の場合は、そのクラスのすべてのプロパティが返されます (つまり、インスタンス自体によって定義されたプロパティと、クラス階層にあるすべての親クラスから継承されたすべてのプロパティ)。

新しいインスタンスを作成する場合は、CIMClass クラスの CIMInstance メソッドを使ってインスタンスをローカルシステム上に作成します。そして、CIMClient.setInstance メソッドを使ってネームスペース内の既存のインスタンスを更新するか、CIMClient.createInstance メソッドを使って新しいインスタンスをネームスペースに追加します。

例 — インスタンスの取得

例 4–8 のコードセグメントは、特定のシステム上のすべてのプロセスを表示します。この例では、enumerateInstanceNames メソッドを使用して CIM_Process クラスのインスタンス名を取得します。このコードを Microsoft Windows 32 システムで実行すると、Windows 32 のプロセスが返されます。このコードを Solaris システムで実行すると、Solaris プロセスが返されます。


例 4–8 クラスインスタンスの取得 (getInstance)

...
{
//ネームスペース cns を作成
CIMnameSpace cns = new CIMNameSpace(); 
 
//CIM Object Manager 上で cns ネームスペースに接続
cc = new CIMClient(cns, "root", "root_password"); 
 
/* CIM_Process クラスの CIM オブジェクトパスを
CIM Object Manager に渡す (このクラスのインスタンスを取得する)。 */ 
 
CIMObjectPath cop = new CIMObjectPath("CIM_Process"); 
 
/* CIM Object Manager が、オブジェクトパスの列挙 
(CIM_Process クラスのインスタンス名) を返す。 */
Enumeration e = cc.enumerateInstanceNames(cop); 
 
/* インスタンスオブジェクトパスを含む列挙のサイズ分だけ繰り返す。
各オブジェクト名によって参照されるインスタンスを取得するには、 
CIM Client の getInstance クラスを使用する。 */

while(e.hasMoreElements()) {
    CIMObjectPath op = (CIMObjectPath)e.nextElement();
    // インスタンスを取得する。インスタンスに対してローカルである
		// プロパティだけを返す (localOnly が真) 
		CIMInstance ci = cc.getInstance(op, true);
		}
...


例 — プロパティの取得

例 4–9 は、すべての Solaris プロセスの lockspeed プロパティの値を出力します。このコードセグメントは、次のメソッドを使用します。


例 4–9 プロセッサ情報の出力 (getProperty)

...
{
/* オブジェクト (CIMObjectPath) を作成し、Solaris_Processor 
クラスの名前を格納する */ 
 
CIMObjectPath cop = new CIMObjectPath("Solaris_Processor"); 
 
/* Solaris_Processor クラスとそのすべてのサブクラス (cc.DEEP) の
インスタンスの名前が含まれている列挙を CIM Object Manager が返す */
 
Enumeration e = cc.enumInstances(cop, cc.DEEP); 
 
/* インスタンスオブジェクトパスの列挙のサイズ分だけ繰り返す。
getProperty メソッドを使って、各 Solaris プロセッサの
lockspeed 値を取得する */
 
while(e.hasMoreElements()) {
			CIMValue cv = cc.getProperty(e.nextElement(), "lockspeed");
    	System.out.println(cv);
}
...
}
 


例 — プロパティの設定

例 4–10のコードセグメントでは、すべての Solaris プロセッサの仮定の lockspeed 値を設定します。この例では、次のメソッドを使用します。


例 4–10 プロセッサ情報の設定 (setProperty)

...
{
    /* オブジェクト (CIMObjectPath) を作成し、Solaris_Processor
    クラスの名前を格納する*/ 
 
    CIMObjectPath cop = new CIMObjectPath("Solaris_Processor"); 
 
    /* Solaris_Processor クラスとそのすべてのサブクラスの
    インスタンスの名前が含まれている列挙を CIM Object Manager が返す */
 
    Enumeration e = cc.enumerateInstanceNames(cop); 
 
    /* インスタンスオブジェクトパスの列挙のサイズ分だけ繰り返す。
    その中で setProperty メソッドを使って、各 Solaris プロセッサの
    lockspeed 値に 500 を設定する。 */
 
    for (; e.hasMoreElements(); cc.setProperty(e.nextElement(), "lockspeed", 
        new CIMValue(new Integer(500))));
 
...
}
 


例 — インスタンスの設定

例 4–11 のコードセグメントは、CIM インスタンスを取得してそのプロパティ値の 1 つを変更し、変更後のインスタンスを CIM Object Manager に渡します。

CIM プロパティは、CIM クラスの特性を記述するために使用される値です。プロパティは、プロパティ値を設定する機能と、プロパティ値を取得する機能の組み合わせと考えることができます。


例 4–11 インスタンスの設定 (setInstance)

...
{
    // オブジェクトパスを作成する (CIM 名「myclass」を持つ
    // オブジェクト)
    CIMObjectPath cop = new CIMObjectPath("myclass"); 
    /* 列挙内の各インスタンスオブジェクトパスのインスタンスを取得し、
    各インスタンスのプロパティ値 b に 10 を設定し、
    更新済みインスタンスを CIM Object Manager に渡す。 */
    
    while(e.hasMoreElements()) {
		    CIMInstance ci = cc.getInstance(CIMObjectPath)(e.nextElement(), 
                true, true, true, null);
        ci.setProperty("b", new CIMValue(new Integer(10)));
				cc.setInstance(new CIMObjectPath(),ci);
		}
}
...


ネームスペース、クラス、インスタンスの列挙

列挙とはオブジェクトの集合です。列挙は一度に 1 つずつ取り出すことができます。Sun WBEM SDK には、ネームスペース、クラス、インスタンスを列挙する API があります。

次の各例は、列挙メソッドを使ってネームスペース、クラス、インスタンスを列挙する方法を示したものです。

詳細 (deep) 列挙と簡易 (shallow) 列挙

列挙メソッドは、値として deep または shallow を持つブール値引数を受け取ります。deep および shallow の動作は、表 4–1 に示すように、使用するメソッドによって異なります。

表 4–1 詳細列挙と簡易列挙

メソッド 

deep

shallow

enumNameSpace

列挙するネームスペース内のネームスペース階層全体を返す。 

列挙するネームスペース内の第一レベルの子を返す。 

enumClass

列挙するクラスのすべてのサブクラスを返すが、クラス自体は返さない。 

このクラスの直接のサブクラスを返す。 

enumInstances

クラスのインスタンスとそのクラスのサブクラスのすべてのインスタンスを返す。 

そのクラスのインスタンスを返す。 

クラスやインスタンスのデータを取得

次の列挙メソッドは、クラスやインスタンスのデータを返します。

クラス名やインスタンス名の取得

CIM WorkShop は、列挙メソッドを使ってクラスやインスタンスの名前を返すアプリケーションの一例です。オブジェクト名のリストを取得すれば、オブジェクトのインスタンスや、プロパティ、その他の情報を取得できます。

次の各列挙メソッドは、列挙するクラスやインスタンスの名前を返します。

例 — ネームスペースの列挙

例 4–12 のプログラムは、CIM クライアントクラスの enumNameSpace メソッドを使用して、ネームスペースおよびその中に含まれるすべてのネームスペースの名前を出力します。


例 4–12 ネームスペースの列挙 (enumNameSpace)

 
import java.rmi.*;
import com.sun.wbem.client.CIMClient;
import com.sun.wbem.cim.CIMInstance;
import com.sun.wbem.cim.CIMValue;
import com.sun.wbem.cim.CIMProperty;
import com.sun.wbem.cim.CIMNameSpace;
import com.sun.wbem.cim.CIMObjectPath;
import com.sun.wbem.cim.CIMClass;
import java.util.Enumeration;
 
/ **
  * このプログラムは、CIMObjectPath(cop) で指定されるネームスペース、 
  * およびそのネームスペース内のすべてのネームスペースの 
  * リストを取得するために CIMClient.DEEP を条件として、ネームスペース引数を取り、
  * CIMClient の enumNameSpace インタフェースを呼び出す。
  * 続いて、指定されたネームスペース名を
  * 出力する (CIMClient.SHALLOW)。
 /**
 
public class EnumNameSpace {
 
		// EnumNameSpace が、引数の文字列を取る。
		public static void main (String args[ ]) {
			CIMClient cc = null;
 
			try {    
			// 引数として渡されるネームスペースのネームスペースオブジェクトを作成
			CIMNameSpace cns = new CIMNameSpace(args[0], "");
 
			// 引数として渡されるネームスペース内の CIM Object Manager に接続
			CIMClient cc = new CIMClient(cns);
 
			// 現在のホスト上のネームスペース名を保存するためにオブジェクトパスを作成
			CIMObjectPath cop = new CIMObjectPath("",args[1]);
 
			// ネームスペースおよびその中に含まれるすべてのネームスペースを列挙 
      // (CIMClient.DEEP に deep が 設定される)
			Enumeration e = cc.enumNameSpace(cop, CIMClient.DEEP);
 
			// ネームスペースの表示を繰り返し、それぞれの名前を出力
			for (; e.hasMoreElements();
						System.out.println(e.nextElement()));
						System.out.println("++++++");
			// CIMClient.SHALLOW でネームスペースの表示を繰り返し、 
      // それぞれの名前を出力
			e = cc.enumNamesSpace(cop, CIMClient.SHALLOW);
			for (; e.hasMoreElements();
					System.out.println(e.nextElement()));
	} catch (Exception e) {
				System.out.println("Exception: "+e);
			}
 
// クライアント接続が開かれている場合、接続を閉じる。
		if(cc != null) {
            cc.close();
    	}
 
		}
}
 


コード例 — クラス名の列挙

Java GUI アプリケーションでは、例 4–13 のコードセグメントを使ってクラスやサブクラスのリストをユーザーに表示することがあります。


例 4–13 クラス名の列挙 (enumClass)

...
{
    /* CIMObjectPath オブジェクトを作成し、列挙する CIM クラスの
    名前 (myclass) で初期化する */
    CIMObjectPath cop = new CIMObjectPath(myclass); 
    
    /* この列挙には、列挙するクラス内のすべてのクラスとサブクラスの
    名前が含まれる */
    Enumeration e = cc.enumClass(cop, cc.DEEP);
}
... 


アプリケーションでは、例 4–14 のコードセグメントを使ってクラスやそのサブクラスの内容を表示することがあります。


例 4–14 クラスデータの列挙 (enumClass)

...
{
    /* CIMObjectPath オブジェクトを作成し、列挙する CIM クラスの 
    名前 (myclass) で初期化する  */
     
    CIMObjectPath cop = new CIMObjectPath(myclass); 
     
    /* この列挙には、列挙するクラス内のすべてのクラスとサブクラスが
    含まれる (cc.DEEP)。この列挙では、各クラスやサブクラスから
    継承されたメソッドやプロパティ以外のものだけが返される
    (localOnly が真) */
 
    Enumeration e = cc.enumClass(cop, cc.DEEP, true);  
}
...

例 4–15 のサンプルプログラムでは、クラスおよびインスタンスを詳細列挙および簡易列挙します。さらにこの例では、localOnly フラグを使って、(クラスやインスタンスの名前ではなく) クラスやインスタンスのデータを返します 。


例 4–15 クラスおよびインスタンスの列挙

import java.rmi.*;
import com.sun.wbem.client.CIMClient;
import com.sun.wbem.cim.CIMInstance;
import com.sun.wbem.cim.CIMValue;
import com.sun.wbem.cim.CIMProperty;
import com.sun.wbem.cim.CIMNameSpace;
import com.sun.wbem.cim.CIMObjectPath;
import com.sun.wbem.cim.CIMClass;
import com.sun.wbem.cim.CIMException;
import java.util.Enumeration;
 
/** 
 * この例では、クラスやインスタンスを列挙する。
 * この例では、コマンド行から入力されたクラスを詳細列挙
 * および簡易列挙する。さらに、localOnly フラグを使って
 * クラスやインスタンスの詳細を返す。
 */
 public class ClientEnum {
     public static void main(String args[]) throws CIMException {
		     CIMClient cc = null;
			   CIMObjectPath cop = null;
			   if(args.length != 2) {
				     System.out.println("Usage: ClientEnum host className"); 
				     System.exit(1);
	    		 }
			   try {
				    // ホスト名 (コマンド行から入力された args[0]) を含む
				    // CIMNameSpace オブジェクトを作成する。 
	    		    CIMNameSpace cns = new CIMNameSpace(args[0]);
 
				    // 指定されたホスト (args[0]) 上の 
				    // CIM Object Manager へのクライアント接続を作成する
	    		    cc = new CIMClient(cns);
 
	    		    // コマンド行から入力されたクラス名を取得する
	    		    cop = new CIMObjectPath(args[1]);
 
	    		    // クラスを詳細列挙し、クラス名を返す
				    // returns the class names.
	    		    Enumeration e = cc.enumClass(cop, cc.DEEP);
 
	    		    // 列挙するクラスのすべてのサブクラスの名前を出力する
	    		    for (; e.hasMoreElements(); System.out.println(e.nextElement()));
	    		        System.out.println("+++++");
 
	    		    // クラスを簡易列挙し、クラス名を返す
				    // returns the class names.
	    		    e = cc.enumClass(cop, cc.SHALLOW);
 
	    		    // 第一レベルのサブクラスの名前を出力する
	    		    for (; e.hasMoreElements(); System.out.println(e.nextElement()));
	    		        System.out.println("+++++");
 
	    		    // クラスを簡易列挙し、
				    // クラス名に加えクラスデータを
				    // 返す (localOnly が真)
	    		    e = cc.enumClass(cop, cc.SHALLOW, true);
 
	    		    // 第一レベルのサブクラスの詳細を出力する
	    		    for (; e.hasMoreElements(); System.out.println(e.nextElement()));
	    		        System.out.println("+++++");
 
				    // クラスのインスタンスを詳細列挙し、
				    // インスタンスの名前を返す
	    		    e = cc.enumInstances(cop, cc.DEEP);
 
	    		    // クラスとそのサブクラスのすべてのインスタンスの名前を出力する
	    		    for (; e.hasMoreElements(); System.out.println(e.nextElement()));
	    		        System.out.println("+++++");
 
				    // クラスのインスタンスを詳細列挙し、
				    // インスタンス名に加え、実際のインスタンスデータを
				    // 返す (localOnly が真)
	    		    e = cc.enumInstances(cop, cc.DEEP);
 
	    		    // クラスとそのサブクラスのすべてのインスタンスの詳細を出力する
	    		    for (; e.hasMoreElements(); System.out.println(e.nextElement()));
	    		        System.out.println("+++++");
 
				    // クラスのインスタンスを簡易列挙し、
				    // インスタンスの名前を返す
	    		    e = cc.enumInstances(cop, cc.SHALLOW);
 
				    // クラスのインスタンスの名前を出力する
	    		    for (; e.hasMoreElements(); System.out.println(e.nextElement()));
	    			      System.out.println("+++++");
			      } catch (Exception e) {
	    		        System.out.println("Exception: "+e);
			     }
			    // セッションを閉じる
			    if(cc != null) {
	    		    cc.close();
			    }
    }
}

照会

列挙 API は、クラスまたはクラス階層のすべてのインスタンスを返します。この場合、ユーザーは、インスタンス名またはインスタンスの詳細を返すように指定することができます。照会によって、照会文字列を指定することによって、検索範囲を狭めることができます。ユーザーは、特定のクラスまたは特定のネームスペース内のすべてのクラスにおいて、指定の照会と一致するインスタンスを検索できます。たとえば、Storage_Capacity プロパティに特定の値を持つ Solaris_DiskDrive クラスを検索できます。

execQuery メソッド

execQuery メソッドは、照会文字列と一致する CIM インスタンスの列挙を検索します。照会文字列の形式は、WQL (WBEM Query Language) に準拠していなければなりません。

構文

execQuery メソッドの構文は、次のとおりです。

Enumeration execQuery(CIMObjectPath relNS, java.lang.String query, int ql)

execQuery メソッドは、次のパラメータを受け取り、CIM インスタンスの列挙を返します。

パラメータ 

データ型 

説明 

relNS 

CIMObjectPath 

接続されているネームスペースとの相対的なネームスペース。たとえば、root ネームスペースに接続されている場合に root\cimv2 ネームスペース内のクラスを照会するには、新たに new CIMObjectPath("", "cimv2"); を渡す必要がある。

query 

String 

WQL (WBEM Query Language) に準拠した照会テキスト 

ql 

Integer constant 

照会言語を指定する。現在サポートされている照会言語は WQL level 1 のみ 

次の execQuery 呼び出しは、現在のネームスペースにある CIM_device クラスのすべてのインスタンスの列挙を返します。

cc.execQuery(new CIMObjectPath(), SELECT * FROM CIM_device, cc.WQL)

WQL の使用

WQL (WBEM Query Language) は、ANSI SQL (ANSI 構造化照会言語、ANSI Structured Query Language) のサブセットです。WQL には、Solaris で WBEM をサポートするためにセマンティクスの変更が加えられています。SQL とは異なり、このリリースの WQL は検索だけが可能な言語です。つまり、WQL では、情報の変更、挿入、削除を行うことはできません。

SQL はデータベースの照会を行うために作成された言語です。SQL では、データは、行列構造からなるテーブル (表) に格納されています。WQL は、CIM データモデルを使って格納されたデータを照会できるようになっています。CIM モデルでは、オブジェクトの情報は CIM クラスや CIM インスタンスに格納されています。CIM インスタンスには、名前、データ型、値からなるプロパティを持つことができます。WQL は CIM オブジェクトモデルを SQL テーブルにマップします。

表 4–2 SQL データと WQL データの対応

SQL 

WQL での表現 

テーブル 

CIM クラス 

行 

CIM インスタンス 

列 

CIM プロパティ 

サポートされる WQL キーワード

Sun WBEM SDK では、Level 1 WBEM SQL がサポートされます。Level 1 WBEM SQL では、join のない簡単な select 操作を行うことができます。次の表に、Sun WBEM SDK でサポートされる WQL キーワードを示します。

表 4–3 サポートされる WQL キーワード

キーワード 

説明 

AND 

2 つのブール式を結合し、両方の式が TRUE なら TRUE を返す。 

FROM 

SELECT 文にリストされているプロパティを持つクラスを指定する。 

NOT 

NULL と共に使用される比較演算子。 

OR 

2 つの条件を結合する。1 つの文に複数の論理演算子が使用されていると、OR 演算子 (論理和演算子) は AND 演算子 (論理積演算子) より後に評価される。 

SELECT 

照会で使用されるプロパティを指定する。 

WHERE 

照会のスコープを狭める。 

WQL の演算子

次の表に、SELECT 文の WHERE 節で使用できる標準の WQL 演算子を示します。

表 4–4 WQL 演算子

演算子 

説明 

等しい 

より小さい 

より大きい 

<= 

以下 

>= 

以上 

<> 

等しくない 

データ照会の実行

データ照会とは、クラスのインスタンスを要求する文です。データ照会を発行するには、execQuery メソッドを使って WQL 文字列を CIM Object Manager に渡します。

SELECT 文

情報を検索する SQL 文は SELECT 文です。これには、WQL 固有の制約と拡張がいくつかあります。SQL SELECT 文は通常データベース環境でテーブルから特定の列を取り出すために使用されますが、WQL SELECT 文は単一クラスのインスタンスを取り出すために使用されます。WQL では、複数のクラスに渡る照会はサポートされません。

SELECT 文では、FROM 節に指定されたオブジェクトで検索するプロパティを指定します。

SELECT 文の基本的な構文は、次のとおりです。

SELECT instance FROM class

次の表に、SELECT 節の引数の使用例を示します。

表 4–5 SELECT 文

照会例 

説明 

SELECT * FROM class

指定されたクラスとそのすべてのサブクラスのすべてのインスタンスを選択する。 

SELECT PropertyA FROM class 

指定されたクラスとそのすべてのサブクラスのうち、PropertyA を持つクラスまたはサブクラスのインスタンスだけを選択する。

SELECT PropertyA, PropertyB FROM class

指定されたクラスとそのすべてのサブクラスのうち、PropertyAPropertyB を持つクラスまたはサブクラスのインスタンスだけを選択する。

WHERE 節

WHERE 節を使うと、照会のスコープを狭めることができます。WHERE 節には、プロパティまたはキーワード、演算子、定数を指定します。WHERE 節には、あらかじめ定義された WQL 演算子の 1 つを必ず指定する必要があります。

WHERE 節を SELECT 文の後に追加する基本的な構文は、次のとおりです。

SELECT instance FROM class WHERE expression

expression には、プロパティまたはキーワード、演算子、定数を指定します。WHERE 節を SELECT 文の後に追加するには、次のどちらかの形式を使用します。

SELECT instance FROM class [[WHERE property operator constant]]

SELECT instance FROM class [[WHERE constant operator property]]

WHERE 節は次の規則に従っている必要があります。

WHERE 節中には、論理演算子やかっこ式を使って、プロパティ、演算子、定数からなる複数のグループを結合することができます。次の表に示すように、個々のグループは、AND、OR、NOT 演算子で結合されている必要があります。

表 4–6 論理演算子を使った照会

照会例 

説明 

SELECT * FROM Solaris_FileSystem WHERE Name= "home" OR Name= "files" 

Name プロパティに homefiles が設定されている Solaris_FileSystem クラスのすべてのインスタンスを検索する。

SELECT * FROM Solaris_FileSystem WHERE (Name = “home” OR Name = “files”) AND AvailableSpace > 2000000 AND FileSystem = “Solaris” 

名前が homefiles のディスクのうち、一定の使用可能な容量が残っており、かつ Solaris ファイルシステムを持つディスクを検索する。

関連

ここでは、関連という CIM 概念と、関連の情報を取得するときに使用する CIMClient メソッドについて説明します。

関連について

関連とは、コンピュータとそのシステムディスクなど、2 つ以上の管理リソース間の関係を表したものです。この関係は、関連修飾子を持つ特殊なクラス型である関連クラスで表されます。

さらに、関連クラスには、その個々の管理リソースを表す CIM インスタンスへの 2 つ以上の参照が含まれています。参照は REF キーワードで宣言される特殊なプロパティ型であり、これが他のインスタンスへのポインタであることを示します。参照は、個々の管理リソースが関連において担う役割を定義します。

次の図には、TeacherStudent という 2 つのクラスが示されています。これらのクラスは、TeacherStudent という関連によってリンクされています。TeacherStudent には、TeachesTaughtBy という 2 つの参照があります。Teaches は、Teacher クラスのインスタンスを参照するプロパティであり、TaughtByStudent クラスのインスタンスを参照するプロパティです。

図 4–1 Teacher と Student の関連

Graphic

参照の 1 つを削除する場合は、その前に関連を削除する必要があります。2 つまたはそれ以上のオブジェクト間の関連を追加または変更しても、オブジェクト自体には影響を与えません。

関連メソッド

CIMClient クラスの次のメソッドは、クライアントとインスタンス間の関連 (関係) に関する情報を返します。

表 4–7 CIMClient の関連メソッド

メソッド 

説明 

associators

指定された CIM クラスやインスタンスに関連付けられている CIM クラスやインスタンスを取得する。 

associatorNames

指定された CIM クラスやインスタンスに関連付けられている CIM クラスやインスタンスの名前を取得する。 

references

指定された CIM クラスやインスタンスを参照する関連を取得する 

referenceNames

指定された CIM クラスやインスタンスを参照する関連の名前を取得する。 

ソースクラスまたはソースインスタンスの指定

関連メソッドは、唯一の必須引数として CIMObjectPath を受け取ります。この引数は、検索したい関連や、関連付けされたクラスまたはインスタンスを持つソースの CIM クラスまたは CIM インスタンスの名前です。CIM Object Manager は、関連、関連付けされたクラス、またはインスタンスを見つけることができないと、何も返しません。

関連メソッドは、CIMObjectpath がクラスである場合は、関連付けされたクラスとそのクラスのサブクラスを返し、CIMObjectpath がインスタンスである場合は、関連付けされたインスタンスと各インスタンスの派生元クラスを返します。

モデルパスによるインスタンスの指定

インスタンスやクラスの名前を指定するには、そのモデルパスを指定する必要があります。クラスのモデルパスには、ネームスペースとクラスの名前が含まれています。インスタンスのモデルパスは、特定の管理リソースを固有に識別します。インスタンスのモデルパスには、ネームスペース名と、クラス名、キーが含まれています。キーは、管理リソースを固有に識別するために使用されるプロパティまたは一連のプロパティです。キープロパティは、キー修飾子で識別します。

モデルパス \\myserver\\Root\cimv2\Solaris_ComputerSystem.Name=mycomputer: CreationClassName=Solaris_ComputerSystem は、3 つの部分から構成されています。

API によるインスタンスの指定

実際の使用では通常、あるクラスのすべてのインスタンスを enumInstances メソッドを使って列挙し、ループ構造で各インスタンスを処理します。ループでは、各インスタンスを関連メソッドに渡すことができます。次のコード例では、次のことを行なっています。

  1. 現在のクラス (op) とそのクラスのサブクラス内のすべてのインスタンスを列挙する。

  2. while ループを使って、個々のインスタンスを CIMObjectPath (op) にキャストする。

  3. 各インスタンスを、associators メソッドへの最初の引数として渡す。

このコード例では、他のすべてのパラメータの値としては、 null または false を渡します。


例 4–16 インスタンスを associators メソッドに渡す

 {
    ...
    Enumeration e = cc.enumInstances(op, true);
    while (e.hasMoreElements()) {
        op = (CIMObjectPath)e.nextElement();
        Enumeration e1 = cc.associators(op, null, null, 
                null, null, false, false, null);
    ...
    }           

返されるクラスおよびインスタンスのフィルタリング (オプションの引数を使用)

関連メソッドは、返されるクラスやインスタンスをフィルタリングする次のオプション引数も受け取ります。すべての引数が処理されるまで、オプションの各パラメータ値は、その結果をフィルタリング処理のために次に続くパラメータに渡します。

1 つのオプション引数の値、またはオプション引数を組み合わせたものの値を渡すことができます。各パラメータには値を指定する必要があります。返されるクラスやインスタンスをフィルタリングする引数には、assocClassresultClassroleresultRole があります。これらの引数を使用すると、これらのパラメータに指定された値と一致するクラスやインスタンスだけが返されます。返されるクラスやインスタンスに含まれている情報をフィルタリングする引数には、includeQualifiersincludeClassOriginpropertyList があります。

次の表に、関連メソッドへのオプション引数を示します。

表 4–8 関連メソッドへのオプション引数

引数 

型 

説明 

値 

assocClass

String 

ソースの CIM クラスまたはインスタンスとこのタイプで関連付けられているターゲットオブジェクトを返す。Null の場合は、返すオブジェクトを関連でフィルタリングしない。 

有効な CIM 関連クラス名または Null 

resultClass

String 

resultClass またはそのいずれかのサブクラスのインスタンスであるターゲットオブジェクト、または resultClass かそのいずれかのサブクラスと一致するオブジェクトを返す。

CIM クラスの有効な名前または Null 

role

String 

この関連でソースの CIM クラスまたはインスタンスが担っている役割を指定する。ソースオブジェクトがこの役割を担っている関連のターゲットオブジェクトを返す。 

有効なプロパティ名または Null 

resultRole

String 

指定された役割をこの関連で担っているターゲットオブジェクトを返す。 

有効なプロパティ名または Null 

includeQualifiers

Boolean 

true の場合、各ターゲットオブジェクトのすべての修飾子 (このオブジェクトと返されるプロパティのすべての修飾子) を返す。false の場合、修飾子を返さない。 

True または False 

includeClassOrigin

Boolean 

true の場合、返される各オブジェクトのすべての適切な要素に CLASSORIGIN 属性を含める。false の場合、CLASSORIGIN 属性を含めない。 

True または False 

propertyList

String array 

このリストに指定されたプロパティの要素だけを含むオブジェクトを返す。空配列の場合は、返される各オブジェクトにプロパティは含まれない。NULL の場合は、返す各オブジェクトにすべてのプロパティが含まれる。無効なプロパティ名は無視する。 

プロパティリストを指定する場合は、resultClass に Null 以外の値を指定する必要がある。

有効なプロパティ名の配列、空の配列、または Null 

例 — associators メソッドと associatorNames メソッド

このセクションの各例は、associators メソッドや associatorNames メソッドを使って、次の図に示す Teacher クラスや Student クラスに関連付けられているクラスの情報を取得する方法を示したものです。associatorNames メソッドでは、引数 includeQualifiersincludeClassOriginpropertyList は使用されません。インスタンスまたはクラスの名前だけ (内容全体ではなく) を返すメソッドには、これらの引数は関係ないからです。

図 4–2 Teacher と Student の関連の例

Graphic

表 4–9 associators メソッドと associatorNames メソッド

例 

出力 

説明 

associators(Teacher, null, null, null, null, false, false, null)

Student クラス

関連付けられているクラスとそれらのサブクラスを返す。Student は、TeacherStudent 関連によって Teacher とリンクされている。

associators(Student, null, null, null, null,false, false, null)

Teacher クラス、 MathTeacher クラス、 ArtTeacher クラス

関連付けられているクラスとそれらのサブクラスを返す。Teacher は、TeacherStudent 関連によって Student とリンクされている。MathTeacherArtTeacher は、Teacher から TeacherStudent 関連を継承する。

associatorNames(Teacher, null, null, null, null)

Student クラスの名前

関連付けられているクラスとそれらのサブクラスの名前を返す。Student は、TeacherStudent 関連によって Teacher とリンクされている。

associatorNames(Student, null, null, null, null)

TeacherMatchTeacherArtTeacher のクラス名

関連付けられているクラスとそれらのサブクラスの名前を返す。Teacher は、TeacherStudent 関連によって Student とリンクされている。MathTeacherArtTeacherr は、Teacher から TeacherStudent 関連を継承する。

例 — references メソッドと referenceNames メソッド

このセクションの各例は、references メソッドや referenceNames メソッドを使って、図 4–2 に示す Teacher クラスと Student クラスの関連の情報を取得する方法を示したものです。 referenceNames メソッドでは、引数 includeQualifiersincludeClassOriginpropertyList は使用されません。インスタンスまたはクラスの名前だけ (内容全体ではなく) を返すメソッドには、これらの引数は関係ないからです。

表 4–10 references メソッドと referenceNames メソッド

例 

出力 

説明 

references(Student, null, null. false, false, null)

TeacherStudent

Student が関与している関連を返す。

references(Teacher, null, null. false, false, null)

TeacherStudent

Teacher が関与している関連を返す。

referenceNames(Teacher, null, null)

TeacherStudent クラスの名前

Teacher が関与している関連の名前を返す。

メソッドの呼び出し

プロバイダによってサポートされるクラス内のメソッドを呼び出すには、invokeMethod インタフェースを使用します。メソッドのシグニチャを取得するには、まず、そのメソッドが属するクラスの定義を取得する必要があります。invokeMethod インタフェースは、次の表に示す 4 つの引数を受け取ります。

表 4–11 invokeMethod へのパラメータ

パラメータ 

データ型 

説明 

name

CIMObjectPath 

インスタンスの名前。このインスタンスでメソッドを呼び出す必要がある。 

methodName

String 

呼び出すメソッドの名前。 

inParams

Vector 

メソッドに渡す入力パラメータ。 

outParams

Vector 

メソッドから受け取る出力パラメータ。 

invokeMethod メソッドは CIMValue を返します。呼び出したメソッドが戻り値を定義していない場合には、戻り値は null です。

例 — メソッドの呼び出し

例 4–17 のコードセグメントでは、CIM_Service クラスのインスタンス (デバイスやソフトウェアの機能を管理するサービス) を取得してから、invokeMethod メソッドを使って各サービスを停止します。


例 4–17 メソッドの呼び出し (invokeMethod)

{
    ...
    /* CIM_Service クラスの CIMObjectPath を CIM Object Manager に渡す。
    この例では、このクラスに定義されているメソッドを呼び出す */ 
     
    CIMObjectPath op = new CIMObjectPath("CIM_Service"); 
     
    /* CIM Object Manager がインスタンスオブジェクトパスの列挙
    (CIM_Service クラスの各インスタンスの名前) を返す */
     
    Enumeration e = cc.enumInstances(op, cc.DEEP); 
     
    /* インスタンスオブジェクトパスを含む列挙のサイズ分だけ繰り返す。
    各オブジェクトパスによって参照されるインスタンスを取得するには、
    CIMClient の getInstance クラスを使用する。*/
     
    while(e.hasMoreElements()) {
		    // インスタンスを取得する
		    CIMInstance ci = cc.getInstance(e.nextElement(), true);
		    // StopService メソッドを使って CIM サービスを停止する
		    cc.invokeMethod(ci, "StopService", null, null);
		}
}
 


クラス定義の検出

CIM クラスを取得するには getClass メソッドを使用します。クラスを作成すると、その派生元クラスとそのクラス階層のすべての親クラスのメソッドとプロパティを継承します。getClass メソッドは、ブール値引数 localOnly を受け取ります。そして、localOnly が真である場合は、継承されたプロパティとメソッド以外のプロパティとメソッドを返し、localOnly が偽である場合は、そのクラス内のすべてのプロパティを返します。

例 — クラス定義の検出

例 4–18 のプログラムは、次のメソッドを使用してクラス定義を検出します。


例 4–18 クラス定義の検出 (getClass)

import java.rmi.*;
import com.sun.wbem.client.CIMClient;
import com.sun.wbem.cim.CIMInstance;
import com.sun.wbem.cim.CIMValue;
import com.sun.wbem.cim.CIMProperty;
import com.sun.wbem.cim.CIMNameSpace;
import com.sun.wbem.cim.CIMObjectPath;
import com.sun.wbem.cim.CIMClass;
import com.sun.wbem.cim.CIMException;
import java.util.Enumeration;
/**
 * コマンド行に指定されたクラスを取得。デフォルトの
 * ネームスペース root\cimv2 で作業する。
 */
public class GetClass {
    public static void main(String args[]) throws CIMException {
        CIMClient cc = null;
        try {
            CIMNameSpace cns = new CIMNameSpace(args[0]);
            cc = new CIMClient(cns);
            CIMObjectPath cop = new CIMObjectPath(args[1]);
						// 指定されたクラスに対してローカルであるメソッドと
						// プロパティだけを返す (localOnly が true)。
            cc.getClass(cop, cc.DEEP);
        } catch (Exception e) {
            System.out.println("Exception: "+e);
        }
        if(cc != null) {
            cc.close();
        }
    }
}


例外の処理

各インタフェースには、CIM の例外を定義する throws 節が含まれます。例外とは、エラー状態を意味します。CIM Object Manager は、Java の例外処理を使用して WBEM 固有の例外の階層を作成します。CIMException クラスは、CIM 例外の基底クラスです。CIMException 以外の CIM 例外クラスは、CIMException クラスのサブクラスです。

CIM 例外の各クラスは、API コードが処理する特定のエラー状態を定義します。CIM 例外 の API については、表 3–2 を参照してください。

Try / Catch 節の使用

クライアント API は、標準 Java の try/catch 節を使用して例外を処理します。一般にアプリケーションは、例外をキャッチした後、何らかの修正アクションを実行するか、あるいはエラー情報をユーザーに渡します。

CIM 仕様では、CIM の規則は明白に定義されていません。CIM の規則は、通常、例によって暗黙に示されます。ほとんどの場合、エラーコードによって示されるのは一般的な問題 (データ型の不一致など) です。プログラマは、その問題に対して具体的な処置を行う必要があります (この場合、正しいデータ型を決定)。

構文上のエラーと意味上のエラー

MOF コンパイラ (mofcomp) は、.mof テキストファイルを Java クラス (bytecode) にコンパイルします。MOF コンパイラは、MOF ファイルの構文検査を行います。 CIM Object Manager は、各種のアプリケーションからアクセスできるので、構文と意味の両方の検査を行います。

例 4–19 の MOF ファイルは、2 つのクラス、A と B を定義します。このサンプルファイルをコンパイルすると、CIM Object Manager は意味上のエラーを返します。これは、キーをオーバーライドできるのは別のキーだけであるためです


例 4–19 意味上のエラーの検査

Class A         \\クラス A を定義
 
{     [Key]
int a;  
}  
 
Class B:A       \\Class B はクラス A のサブクラス 
 
{  [overrides ("c", key (false) ]
int b;   
}
 


高度なプログラミング

この節では、高度なプログラミング作業と、使用頻度の低いプログラミング作業について説明します。

ネームスペースの作成

インストールを行うと、標準の CIM MOF ファイルがデフォルトのネームスペース root\cimv2root\security にコンパイルされます。新しいネームスペースを作成する場合は、そのネームスペースにオブジェクトを作成する前に適切な CIM MOF ファイルをネームスペースにコンパイルします。たとえば、標準の CIM 要素を使用するクラスを作成する場合は、ネームスペースに CIM コアスキーマをコンパイルします。CIM アプリケーションスキーマを拡張するクラスを作成する場合は、ネームスペースに CIM アプリケーションをコンパイルします。

例 — ネームスペースの作成

例 4–20 のコードセグメントは、2 段階の処理により既存のネームスペース内にネームスペースを作成します。


例 4–20 ネームスペースの作成 (CIMNameSpace)

{
    ...
    /* ネームスペースオブジェクトをクライアント上に作成する。ネームスペースオブジェクトは、
    コマンド行から入力されたパラメータを格納する。args[0] にはホスト名
    (たとえば myhost)、args[1] には親ネームスペース (たとえば 
    toplevel ディレクトリ) がそれぞれ含まれている。 */
     
    CIMNameSpace cns = new CIMNameSpace (args[0], args[1]); 
     
    /* CIM Object Manager に接続し、パラメータとして、ホスト名 
    (args[0]) と親ネームスペース名 (args[1]) を持つネームスペース
    オブジェクト (cns) と、ユーザー名文字列 (args[3])、パスワード文字列 
    (args[4]) の 3 つを渡す。 */
     
    CIMClient cc = new CIMClient (cns, "root", "secret");	
     
    /* CIM Object Manager に別のネームスペースオブジェクトを渡す。
    これには、null 文字列 (ホスト名) と args[2] (
    子ネームスペースの名前 (たとえば、secondlevel) ) が含まれる。 */
     
    CIMNameSpace cop = new CIMNameSpace("", args[2]);
    
    /* secondlevel という新しいネームスペースを、myhost 上の 
    toplevel ネームスペースの下に作成する。 /*
     
    cc.createNameSpace(cop);
    ...
} 


ネームスペースの削除

ネームスペースを削除するには、deleteNameSpace メソッドを使用します。

例 — ネームスペースの削除

例 4–21 のサンプルプログラムは、指定されたホスト上の指定されたネームスペースを削除します。このプログラムは、5 つの必須文字列引数 (ホスト名、親ネームスペース、子ネームスペース、ユーザー名、パスワード) を受け取ります。このプログラムを実行するユーザーは、削除するネームスペースへの書き込みアクセス権を持つアカウントのユーザー名とパスワードを指定する必要があります。


例 4–21 ネームスペースの削除 (deleteNameSpace)

{
import java.rmi.*;
import com.sun.wbem.client.CIMClient;
import com.sun.wbem.cim.CIMInstance;
import com.sun.wbem.cim.CIMValue;
import com.sun.wbem.cim.CIMProperty;
import com.sun.wbem.cim.CIMNameSpace;
import com.sun.wbem.cim.CIMObjectPath;
import com.sun.wbem.cim.CIMClass;
import com.sun.wbem.cim.CIMException;
import java.util.Enumeration;
 /**
 * このサンプルプログラムは、指定されたホスト上の指定されたネームスペースを
 * 削除する。このプログラムを実行するユーザーは、指定するネームスペースへの
 * 書き込みアクセス権を持つアカウントのユーザー名とパスワードを指定する必要
 * がある
 */
 public class DeleteNameSpace {
    public static void main(String args[]) throws CIMException {
        // CIMClient クラスのインスタンスを初期化する
				CIMClient cc = null;
        // 5 つのコマンド行引数が必要。全部が入力されない場合は、
        // コマンド文字列を出力する
				if(args.length != 5) {
	    		    System.out.println("Usage: DeleteNameSpace host parentNS 
					          childNS username password"); 
	    			  System.exit(1);
				}
				try {
		         /**
						 * ネームスペースオブジェクト (cns) を作成し、
						 * ホスト名と親ネームスペースを格納する
						 */ 
	      			 CIMNameSpace cns = new CIMNameSpace(args[0], args[1]);
	     			/** 
						 * CIM Object Manager に接続し、ネームスペース
						 * オブジェクト (cns) と、コマンド行引数のユーザー名と
	     			 * パスワードを渡す
	     			 */
	     			 cc = new CIMClient(cns, args[3], args[4]);
	   			  /**
						 * もう 1 つネームスペースオブジェクト (cop) を作成し、ホスト名
						 * として null 文字列を、子ネームスペースとしてコマンド行引数の
						 * 文字列をそれぞれ格納する
						 */
		   			 CIMNameSpace cop = new CIMNameSpace("",args[2]);
	 					/**
						 * 親ネームスペースの下にある子ネームスペースを削除する
	     		   */ 
	    			   cc.deleteNameSpace(cop);
				} catch (Exception e) {
	    		    System.out.println("Exception: "+e);
				}
 				// セッションを閉じる
				if(cc != null) {
	   		    cc.close();
				}
   	 }
}


基底クラスの作成

アプリケーションは、MOF 言語またはクライアント API のどちらかを使用してクラスを作成できます。MOF の構文に慣れている場合は、テキストエディタを使用して MOF ファイルを作成し、その後 MOF コンパイラを使用してそのファイルを Java クラスにコンパイルすることをお勧めします。この節では、クライアント API を使用して基底クラスを作成する方法を説明します。

CIM クラスを表す Java クラスを作成するには、CIMClass クラスを使用します。ほとんどの基底クラスは、クラス名を指定するだけで宣言できます。ほとんどのクラスには、クラスのデータを表すプロパティが含まれます。プロパティを宣言するには、プロパティのデータ型、名前、およびオプションのデフォルト値を含めます。プロパティのデータ型は、CIMDataType (事前に定義された CIM のデータ型の 1 つ) のインスタンスにします。

プロパティには、キープロパティであることを識別するキー修飾子を指定できます。キープロパティは、クラスのインスタンスを個別に定義します。インスタンスを持てるのは、キーが指定されたクラスだけです。そのため、キープロパティが定義されないクラスは、abstract クラスとしてしか使用できません。

新しいネームスペース内でクラスにキープロパティを定義する場合は、最初にコア MOF ファイルをそのネームスペースにコンパイルする必要があります。コア MOF ファイルには、標準の CIM 修飾子 (キー修飾子など) の宣言が含まれます。

クラス定義は、別名、修飾子、修飾子フレーバなどの MOF 機能が含まれることにより複雑化します。

例 — CIM クラスの作成

例 4–22 は、ローカルホスト上のデフォルトネームスペース (root\cimv2) に新しい CIM クラスを作成します。このクラスは 2 つのプロパティを持ち、その 1 つはこのクラスのキープロパティです。続いて、newInstance メソッドを使用して、この新しいクラスのインスタンスを作成します。


例 4–22 CIM クラスの作成 (CIMClass)

{
...
    /* ローカルホスト上の root\cimv2 ネームスペースに接続し、
    新しいクラス myclass を作成 */

    // ローカルホスト上のデフォルトネームスペースに接続
    CIMClient cc = new CIMClient();
 
    // 新しい CIMClass オブジェクトを構築
    CIMClass cimclass = new CIMClass();

    // CIM クラス名を myclass に設定
    cimclass.setName("myclass"); 

    // 新しい CIM プロパティオブジェクトを構築
    CIMProperty cp = new CIMProperty(); 

    // プロパティ名を設定
    cp.setName("keyprop"); 
     
    // プロパティの型として、あらかじめ定義されている CIM データ型のいずれか 1 つを設定
    cp.setType(CIMDatatype.getPredefinedType(CIMDataType.STRING)); 
     
    // 新しい CIM Qualifier オブジェクトを構築
    CIMQualifier cq = new CIMQualifier(); 
     
    // 修飾子名を設定
    cq.setName("key"); 
     
    // 新しいキー修飾子名をプロパティに追加
    cp.addQualfier(cq); 
     
    /* 整数プロパティを作成し、10 に初期化 */
     
    // 新しい CIM プロパティオブジェクトを構築
    CIMProperty mp = new CIMProperty();
     
    // プロパティ名に myprop を設定
    mp.setName("myprop"); 
     
    // プロパティの型に、あらかじめ定義されている CIM データ型のいずれかを設定
    mp.setType(CIMDatatype.getPredefinedType(CIMDataType.SINT16)); 
     
    // mp を CIMValue に初期化する。CIM Object Manager は、
    // 値 10 を持つ新しい整数オブジェクトであるこの CIMValue を、
    // 上の mp.setType 文でプロパティに対して指定されている
    // CIM データ型 (SINT16) に変換する。CIMValue (Integer 10) 
    // がプロパティ (SINT16) の CIM データ型で定義される値の
    // 範囲内にない場合、CIM Object Manager は例外をスローする。
    mp.setValue(new CIMValue(new Integer(10)));
     
    /* myclass にこの新しいプロパティを追加した後、クラスを
    作成するために CIM Object Manager を呼び出す。 */
     
    // クラスオブジェクトにキープロパティを追加
    cimclass.addProperty(cp); 
     
    // クラスオブジェクトに整数プロパティを追加
    cimclass.addProperty(mp); 
     
    /* CIM Object Manager に接続し、新しいクラスを渡す。 */
    cc.createClass(new CIMObjectPath(),cimclass);
     
    // myclass に新しい CIM インスタンスを作成
    ci = cc.newInstance(); 
     
    // クライアント接続が開かれている場合、接続を閉じる。
		if(cc != null) {
        cc.close();
    }
}


クラスの削除

クラスを削除するには、CIMClientdeleteClass メソッドを使用します。クラスを削除すると、クラス、そのサブクラス、およびそのすべてのインスタンスが削除されます。削除されるクラスを参照する関連は削除されません。

例 — クラスの削除

例 4–23 のサンプルプログラムは、deleteClass メソッドを使って、デフォルトネームスペース root\cimv2 にあるクラスを削除します。このプログラムは、4 つの必須文字列引数 (ホスト名、クラス名、ユーザー名、パスワード) を受け取ります。このプログラムを実行するユーザーは、root\cimv2 ネームスペースへの書き込みアクセス権を持つアカウントのユーザー名とパスワードを指定する必要があります。


例 4–23 クラスの削除 (deleteClass)

 
		import java.rmi.*;
		import com.sun.wbem.client.CIMClient;
		import com.sun.wbem.cim.CIMInstance;
		import com.sun.wbem.cim.CIMValue;
		import com.sun.wbem.cim.CIMProperty;
		import com.sun.wbem.cim.CIMNameSpace;
		import com.sun.wbem.cim.CIMObjectPath;
		import com.sun.wbem.cim.CIMClass;
		import com.sun.wbem.cim.CIMException;
		import java.util.Enumeration;
	 /**
		* コマンド行に指定されるクラスを削除。
		* デフォルトネームスペース root\cimv2 で作業を行う。
		*/
		public class DeleteClass {
	      public static void main(String args[]) throws CIMException {
			      CIMClient cc = null;
			      if(args.length != 4) {
	   		 	      System.out.println("Usage: 
                        DeleteClass host className username password"); 
	   		 	      System.exit(1);
				    }
				    try {
	   			      /**
	     		       * ネームスペースオブジェクト (cns) を作成し、ホスト名を渡す
					       */ 
						    CIMNameSpace cns = new CIMNameSpace(args[0]);
 
	   			     /** 
						    * CIM Object Manager に接続し、ネームスペース
						    * オブジェクト (cns) と、コマンド行引数から入力された
	     		      * ユーザー名とパスワードを渡す
	     		      */
						    cc = new CIMClient(cns, args[2], args[3]);
 
					      /** 
						     * クラスの名前 (args[1]) を持つオブジェクト (CIMObjectPath) 
						     * を作成する
						     */
						    CIMObjectPath cop = new CIMObjectPath(args[1]);
 
						    /**
						     * CIM オブジェクトパスで参照されるクラスを削除する
						     */
	  		  			    cc.deleteClass(cop);
					   } catch (Exception e) {
	 		  			    System.out.println("Exception: "+e);
					   }
					   if(cc != null) {
	    				    cc.close();
				     }
  	    }
}

修飾子のデータ型と修飾子の処理

CIM 修飾子は、CIM クラス、インスタンス、プロパティ、メソッド、またはパラメータの特性を示す要素です。修飾子の属性は、次のとおりです。

MOF (Managed Object Format) 構文では、各 CIM 修飾子は同じ MOF ファイルでそのデータ型を宣言する必要があります。修飾子には、スコープ属性はありません。スコープは、どの CIM 要素がその修飾子を使用できるかを示します。スコープを定義できるのは、修飾子のデータ型宣言内だけです。スコープは、修飾子では変更できません。

次に、CIM 修飾子のデータ型を宣言する MOF 構文を示します。この文は、ブール型 (デフォルト値は false) を使用して修飾子のデータ型 key を定義します。このデータ型が記述できるのは、プロパティと、オブジェクトに対する参照だけです。DisableOverride フレーバは、このキー修飾子がそれらの値を変更できないことを意味します。

Qualifier Key : boolean = false, Scope(property, reference), 
								Flavor(DisableOverride);

次のコード例は、CIM 修飾子の MOF 構文を示します。このサンプル MOF ファイルでは、keyDescription はプロパティ test の修飾子です。プロパティのデータ型は、値 a を持つ整数です。

{
[key, Description("test")]
int a
}

例 — CIM 修飾子の取得

例 4–24 のコードセグメントは、CIMQualifier クラスを使用して CIM 要素のベクトル内の CIM 修飾子を識別します。この例は、各 CIM 修飾子ごとにプロパティ名、値、およびデータ型を返します。

修飾子フレーバは、修飾子の使用を制御するフラグです。フレーバは、派生クラスとインスタンスに修飾子を継承できるかどうか、および派生クラスまたはインスタンスが修飾子の本来の値をオーバーライドできるかどうかを指定する規則を記述します。


例 4–24 CIM 修飾子の取得 (CIMQualifier)

	
...
 
    } else if (tableType == QUALIFIER_TABLE) {
		CIMQualifier prop = (CIMQualifier)cimElements.elementAt(row);
		if (prop != null) {
		    if (col == nameColumn) {
			return prop.getName();
		    } else if (col == typeColumn) {
			CIMValue cv = prop.getValue();
			if (cv != null) {
			    return cv.getType().toString();
			} else {
			    return "NULL";			      }
		  } 
 
...
 
 


例 — CIM 修飾子の設定

例 4–25 のコードセグメントは、新しいクラスの CIM 修飾子のリストをそのスーパークラス内の修飾子に設定します。


例 4–25 修飾子の設定 (setQualifiers)

   ...
	try 	{
	    	cimSuperClass = cimClient.getClass(new CIMObjectPath(scName));
	    	Vector v = new Vector();
	    	for (Enumeration e = cimSuperClass.getQualifiers().elements();
					e.hasMoreElements();) { 
					CIMQualifier qual = (CIMQualifier)((CIMQualifier)e.nextElement()).clone();
					v.addElement(qual);
	    	}
	    	cimClass.setQualifiers(v);
		} catch (CIMException exc) {
	    	return;
		}
}


プログラム例

例が置かれているディレクトリには、クライアント API を使用して機能を実行するプログラム例が入っています。これらの例を使用すると、独自のアプリケーション開発を簡単に開始できます。これらのプログラム例については、第 7 章「Sun WBEM SDK サンプルの使用」で説明しています。

プログラム例を実行するには、次のコマンドを入力します。

java program_name

たとえば、java createNameSpace を入力します。