列挙とはオブジェクトの集合です。列挙は一度に 1 つずつ取り出すことができます。Sun WBEM SDK には、ネームスペース、クラス、インスタンスを列挙する API があります。
次の各例は、列挙メソッドを使ってネームスペース、クラス、インスタンスを列挙する方法を示したものです。
列挙メソッドは、値として deep または shallow を持つブール値引数を受け取ります。deep および shallow の動作は、表 4–1 に示すように、使用するメソッドによって異なります。
表 4–1 詳細列挙と簡易列挙
メソッド |
deep |
shallow |
---|---|---|
enumNameSpace |
列挙するネームスペース内のネームスペース階層全体を返す。 |
列挙するネームスペース内の第一レベルの子を返す。 |
enumClass |
列挙するクラスのすべてのサブクラスを返すが、クラス自体は返さない。 |
このクラスの直接のサブクラスを返す。 |
enumInstances |
クラスのインスタンスとそのクラスのサブクラスのすべてのインスタンスを返す。 |
そのクラスのインスタンスを返す。 |
次の列挙メソッドは、クラスやインスタンスのデータを返します。
enumInstances(CIMObjectPath path, boolean deep, boolean localOnly) – Path で指定されたクラスのインスタンスを返します。このメソッドは、deep が真である場合は、指定されたクラスとこのクラスから派生したすべてのクラスの各インスタンスを返し、shallow が真である場合は、指定されたクラスの各インスタンスを返します。
クラスのインスタンスが作成されると、インスタンスは、その派生元クラスとそのクラス階層にあるすべての親クラスのプロパティを継承します。enumInstances は、localOnly が真である場合は、継承されたプロパティ以外のプロパティだけを返し、localOnly が偽である場合は、クラスのすべてのプロパティを返します。
enumClass(CIMObjectPath path, boolean deep, boolean localOnly) – Path で指定されたクラスの派生クラス (クラスの名前だけでなく、クラス全体) を返します。このメソッドは、deep が真である場合は、列挙するクラスから派生したすべてのクラスを返し、shallow が真である場合は、列挙するクラスの第一レベルの子だけを返します。
作成されたクラスは、その派生元クラスとそのクラス階層のすべての親クラスのメソッドとプロパティを継承します。このメソッドは、localOnly が真である場合は、継承されたプロパティとメソッド以外のプロパティとメソッドを返し、localOnly が偽である場合は、そのクラス内のすべてのプロパティを返します。
CIM WorkShop は、列挙メソッドを使ってクラスやインスタンスの名前を返すアプリケーションの一例です。オブジェクト名のリストを取得すれば、オブジェクトのインスタンスや、プロパティ、その他の情報を取得できます。
次の各列挙メソッドは、列挙するクラスやインスタンスの名前を返します。
enumerateInstanceNames(CIMObjectPath path) — 指定されたクラスの各インスタンスの名前を返します。
enumerateClassNames(CIMObjectPath path, boolean deep) — Path で指定されたクラスの派生クラスの名前を返します。このメソッドは、deep が真である場合は、列挙するクラスから派生したすべてのクラスの名前を返し、shallow が真である場合は、列挙するクラスの第一レベルの子の名前だけを返します。
例 4–12 のプログラムは、CIM クライアントクラスの 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 のコードセグメントを使ってクラスやサブクラスのリストをユーザーに表示することがあります。
... { /* CIMObjectPath オブジェクトを作成し、列挙する CIM クラスの 名前 (myclass) で初期化する */ CIMObjectPath cop = new CIMObjectPath(myclass); /* この列挙には、列挙するクラス内のすべてのクラスとサブクラスの 名前が含まれる */ Enumeration e = cc.enumClass(cop, cc.DEEP); } ...
アプリケーションでは、例 4–14 のコードセグメントを使ってクラスやそのサブクラスの内容を表示することがあります。
... { /* CIMObjectPath オブジェクトを作成し、列挙する CIM クラスの 名前 (myclass) で初期化する */ CIMObjectPath cop = new CIMObjectPath(myclass); /* この列挙には、列挙するクラス内のすべてのクラスとサブクラスが 含まれる (cc.DEEP)。この列挙では、各クラスやサブクラスから 継承されたメソッドやプロパティ以外のものだけが返される (localOnly が真) */ Enumeration e = cc.enumClass(cop, cc.DEEP, true); } ...
例 4–15 のサンプルプログラムでは、クラスおよびインスタンスを詳細列挙および簡易列挙します。さらにこの例では、localOnly フラグを使って、(クラスやインスタンスの名前ではなく) クラスやインスタンスのデータを返します 。
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(); } } }