この章では、Client Application Programming Interface (API) を使用してクライアントアプリケーションを作成する方法について説明します。
CIM と クライアント API の詳細は、Javadoc リファレンスページを参照してください。
Web-Based Enterprise Management (WBEM) アプリケーションは、Sun WBEM SDK API を使用して CIM オブジェクトを操作する標準的な Java プログラムです。クライアントアプリケーションは、一般に CIM API を使用してオブジェクト (ネームスペース、クラス、インスタンスなど) を構築し、続いてそのオブジェクトを初期化します。その後、クライアント API を使用してオブジェクトを CIM Object Manager に渡し、WBEM の処理 (CIM ネームスペース、クラス、またはインスタンスの作成など) を要求します。
Sun WBEM SDK アプリケーションは、通常、次の手順で処理を行います。
CIM Object Manager に接続します (CIMClient)。
クライアントアプリケーションは、WBEM のオペレーション (CIM クラスの作成や CIM インスタンスの更新など) を実行する必要があるたびに、CIM Object Manager に接続します。
1 つ以上の API を使用してプログラミング作業を行います。
CIM Object Manager への接続が完了すると、プログラムは API を使用して処理を要求します。
CIM Object Manager へのクライアント接続を閉じます (close)。
アプリケーションは、終了時に現在のセッションを閉じる必要があります。CIMClient インタフェースを使用して、現在のクライアントセッションを閉じてクライアントセッションが使用しているリソースをすべて解放します。
例 6-1 に、すべてのデフォルト値を使用して CIM Object Manager に接続する簡単なアプリケーションを示します。このプログラムは、クラスを取得し、そのクラス内のインスタンスの列挙と出力を行います。
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[1])。コマンド行に * 指定されたネームスペース内のクラスインスタンスを取得する (args[0])。 */ 1 public class WBEMsample { 2 public static void main(String args[]) throws CIMException { 3 CIMClient cc = null; 4 try { 5 /* args[0] にはネームスペースが入る。このネームスペースを 6 格納するためにネームスペースオブジェクト (cns) を作成する。 */ 7 CIMNameSpace cns = new CIMNameSpace(args[0]); 8 /* CIM Object manager に接続し、ネームスペースを含む 9 ネームスペースオブジェクトを渡す。 */ 10 cc = new CIMClient(cns); 11 /* args[1] にはクラス名が入る。現在のネーム 12 スペース内の指定されたクラスを参照する CIM Object 13 Path を作成する。 */ 14 CIMObjectPath cop = new CIMObjectPath(args[1]); 15 /* CIM Object Path によって参照されている 16 クラスオブジェクトを取得する。 */ 17 cc.getClass(cop); 18 //クラスとそのすべてのサブクラスのディープ (deep) 列挙 19 Enumeration e = cc.enumInstances(cop, true); 20 while(e.hasMoreElements()) { 21 CIMObjectPath op = (CIMObjectPath)e.nextElement(); 22 System.out.println(op); 23 } 24 catch (Exception e) { 25 System.out.println("Exception: "+e); 26 } 27 if(cc != null) { 28 cc.close(); 29 } 30 } 31 } |
CIM Object Manager への接続が完了すると、クライアントアプリケーションは API を使用して処理を要求します。プログラムの機能セットは、どの処理を要求すべきかを決定します。次に、ほとんどのプログラムが実行する一般的な処理を示します。
アプリケーションは、次の処理を実行する場合もあります。
アプリケーションは、最初に CIM Object Manager に対しクライアントセッションを開きます。WBEM クライアントアプリケーションは、CIM Object Manager にオブジェクト管理サービスを要求します。クライアントと CIM Object Manager は、同じホスト上でも異なるホスト上でも動作します。同じ CIM Object Manager に対して、複数のクライアントから接続できます。
この節では、ネームスペースの基本概念と、次に示すクラスとメソッドの使用方法を説明します。
CIM Object Manager に接続するための CIMClient クラス
クライアント接続を閉じるための close メソッド
アプリケーションを作成する前に、ネームスペースの CIM 概念を理解する必要があります。ネームスペースは、ディレクトリに似た構造を持ち、ほかのネームスペース、クラス、インスタンス、および修飾子のデータ型を含むことができます。ネームスペース内のオブジェクトの名前は固有にする必要があります。オペレーションはすべて、ネームスペース内で行われます。Solaris WBEM Services をインストールすると、次に示す 2 つのネームスペースが作成されます。
root¥cimv2 - Solaris WBEM Services がインストールされているシステム上のオブジェクトを表すデフォルトの CIM クラスが含まれます。これは、デフォルトネームスペースです。
CIM Object Manager に接続する場合、アプリケーションはデフォルトのネームスペース (root¥cimv2) に接続するか、別のネームスペース (root¥security や独自に作成したネームスペースなど) を指定する必要があります。
特定のネームスペースで CIM Object Manager への接続が完了すると、その後の処理はすべてそのネームスペース内で発生します。アプリケーションは、ネームスペース内で別のネームスペースに接続できます。これは、ディレクトリ内でサブディレクトリに位置を変更するのに似ています。アプリケーションが別のネームスペースに接続すると、その後の処理はすべてその新しいネームスペース内で発生します。
クライアントアプリケーションは、WBEM のオペレーション (CIM クラスの作成や CIM インスタンスの更新など) を実行する必要があるたびに、CIM Object Manager に接続します。アプリケーションは、CIMClient クラスを使用して CIM Object Manager 上のクライアントのインスタンスを作成します。CIMClient クラスには、次の 3 つの引数を指定できます。
ネームスペース
ユーザー名
有効な Solaris のユーザーアカウント名。CIM Object Manager は、CIM オブジェクトに対してどのタイプのアクセスを許可するかを決定するために、ユーザーのアクセス権を確認します。デフォルトのユーザーアカウントは guest です。
パスワード
ユーザーアカウントのパスワード。パスワードは、ユーザーの Solaris アカウントとして有効なパスワードにする必要があります。デフォルトのパスワードは guest です。
CIM Object Manager への接続が完了すると、その後の CIMClient オペレーションはすべて指定されたネームスペース内で発生します。
次の例は、CIMClient インタフェースを使用して CIM Object Manager に接続する 2 つの方法を示しています。
例 6-2 では、アプリケーションはすべてデフォルト値を使用しています。つまり、デフォルトのユーザーアカウントとパスワード guest を使用し、ローカルホスト (クライアントアプリケーションが動作しているホスト) のデフォルトのネームスペース (root¥cimv2) で動作している CIM Object Manager に接続します。
/* パスワード guest を持つユーザー guest として ローカルホスト上の root¥cimv2 ネームスペースに接続 */ cc = new CIMClient(); |
例 6-3 では、アプリケーションはホスト happy 上のネームスペース A に接続します。アプリケーションは、初めにこのネームスペースの文字列名 (A) を含むためにネームスペースのインスタンスを作成します。続いて、CIMClient クラスを使用して CIM Object Manager に接続し、ネームスペースオブジェクト、ユーザー名、およびホスト名を渡します。
/* ホスト happy 上の A (ネームスペース名) を 使用して初期化されたネームスペースオブジェクトを作成 */ CIMNameSpace cns = new CIMNameSpace("happy", A); // このネームスペースにユーザー Mary として接続 cc = new CIMClient(cns, "Mary", ""); |
アプリケーションは、現在のクライアントセッションの終了時にセッションを閉じる必要があります。現在のクライアントセッションを閉じてこのセッションによって使用されているリソースをすべて解放するには、close メソッドを使用します。
次に、クライアント接続を閉じるコード例を示します。インスタンス変数 cc は、このクライアント接続をしたインスタンスを表します。
cc.close(); |
この節では、CIM インスタンスの作成、削除、および更新 (1 つ以上のインスタンスのプロパティ値の取得と設定) の各方法について説明します。
既存のクラスのインスタンスを作成するには、newInstance メソッドを使用します。既存のクラスがキープロパティを持つ場合、アプリケーションはそのプロパティを固有の値に設定する必要があります。インスタンスは、必要に応じてそのクラスに定義されていない別の修飾子を定義することもできます。それらの修飾子をインスタンスまたは特定のインスタンスプロパティ用に定義できますが、クラス宣言内で定義する必要はありません。
アプリケーションは、クラスに定義されている一連の修飾子を getQualifiers メソッドを使用して取得できます。
例 6-4 のコードセグメントは、newInstance メソッドを使用して、Solaris_Package クラスの CIM インスタンス (Solaris パッケージなど) を表す Java クラスを作成します。
/*ローカルホストの root¥cimv2 ネームスペースの CIM Object Manager に接続 */ CIMClient cc = new CIMClient(); // Solaris_Package クラスを取得 cimclass = cc.getClass(newCIMObjectPath("Solaris_Package"); /* プロパティのデフォルト値を使用して生成された Solaris_Package クラスの新しいインスタンスを作成。このクラスのプロバイダが デフォルト値を指定しない場合、プロパティの値は NULL であり、 明示的に設定される必要がある。*/ ci = cimclass.newInstance(); |
インスタンスの削除には、deleteInstance メソッドを使用します。
例 6-5 は、クライアントアプリケーションを CIM Object Manager に接続し、次に示すインタフェースを使用してクラスのインスタンスをすべて削除します。
CIMObjectPath - 削除されるオブジェクトの CIM オブジェクトパスを含むオブジェクトを構築する
enumInstance - インスタンスおよびそのサブクラスのすべてのインスタンスを取得する
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 java.util.Enumeration; public class DeleteInstances { public static void main(String args[]) throws CIMException { CIMClient cc = null; try { /* コマンド行引数を含むネームスペースオブジェクトを 構築 */ CIMNameSpace cns = new CIMNameSpace(args[0]); /* このネームスペースオブジェクトを CIM Object Manager に渡す。*/ CIMClient cc = new CIMClient(cns); /* 削除するオブジェクトの CIM オブジェクトパスを含む オブジェクトを構築 */ CIMObjectPath cop = new CIMObjectPath(args[1]); /* オブジェクトインスタンスのディープ (deep) 列挙を行う (deep は CIMClient.DEEP に設定される)。 クラスインスタンスのディープ列挙を行うと、クラスおよび そのサブクラスのすべてのインスタンスが返される。 */ Enumeration e = cc.enumInstances(cop, CIMClient.DEEP); // 各オブジェクト名を出力し、インスタンスを削除 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 メソッドがよく使用されます。
例 6-6 のコードセグメントは、特定のシステム上のすべてのプロセスを表示します。この例では、enumInstances メソッドを使用して CIM_Process クラスのインスタンス名を取得します。このコードを Microsoft Windows 32 システムで実行すると、Windows 32 のプロセスが返されます。このコードを Solaris システムで実行すると、Solaris プロセスが返されます。
{ //ネームスペース cns を作成 CIMnameSpace cns = new CIMNameSpace; //CIM Object Manager 上で cns ネームスペースに接続 cc = new CIMClient(cns); /* CIM_Process クラスの CIM オブジェクトパスを CIM Object Manager に渡す (このクラスのインスタンスを取得する)。 */ CIMObjectPath op = new CIMObjectPath("CIM_Process"); /* CIM Object Manager が、オブジェクトパスのベクトル (CIM_Process クラスのインスタンス名) を返す。 */ Vector v = cc.enumInstances(op, true); /* インスタンスオブジェクトパスが入ったベクトルのサイズ分だけ繰り返す。 各オブジェクト名によって参照されるインスタンスを取得するには、 CIM Client の getInstance インタフェースを使用する。 */ for (int i=0; i < v.size(); i++) { // インスタンスを取得 CIMInstance ci = cc.getInstance(v.elementAt(i)); /* CIM_Process の各インスタンスのプロセス ID 文字列を 取得 */ CIMProperty cp = ci.getProperty("Handle"); } |
例 6-7 は、すべての Solaris プロセスの lockspeed プロパティの値を出力します。このコードセグメントは、次のメソッドを使用します。
getInstance - 各インスタンス名のインスタンスデータを取得する
getProperty - 各インスタンスの lockspeed の値を取得する
println - lockspeed の値を出力する
/* myhost の /root ネームスペースで、パスワード contrary を 持つユーザー mary として CIM Object Manager に接続 */ { CIMNameSpace cns = new CIMNamesSpace ("myhost" "/root"); cc = new CIMClient (cns, "/root", "mary", "contrary"); // Solaris_Processor のすべてのインスタンスの名前を取得 Vector op cc.enumInstances("Solaris_Processor") // 各 Solaris プロセッサごとに、そのインスタンスデータを取得 while (vector has more elements) { cn.getNextElement(); cc.getInstance (cn); // 各プロセッサの lockspeed を出力 p = ci.getProperty("lockspeed") System.out.println(p.getValue().getValue()); } |
例 6-8 のコードセグメントは、CIM インスタンスを取得してそのプロパティ値の 1 つを変更し、変更後のインスタンスを CIM Object Manager に渡します。
CIM プロパティは、CIM クラスの特性を記述するために使用される値です。プロパティは、プロパティ値を設定する機能と、プロパティ値を取得する機能の組み合わせと考えることができます。
{ /* ベクトル内の各要素のインスタンスを取得し、 各インスタンスで b のプロパティ値を 10 に変更し、 変更後のインスタンスを CIM Object Manager に渡す。 */ For (int i=0; i(v.size(); i++) { CIMInstance ci = cc.getInstance(v.elementAt(i)); ci.setProperty("b",new CIMValue(10)); cc.setInstance(new CIMObjectPath(),ci); } |
オブジェクトの列挙とは、オブジェクト名のリストを取得することを意味します。オブジェクト名リストを取得すると、そのオブジェクトに関する情報 (オブジェクトのインスタンス、そのプロパティなど) を取得できます。Sun WBEM SDK には、ネームスペース、クラス、およびインスタンスを列挙する API が含まれています。
列挙 API は、2 つのブール型引数、deep と shallow を取ります。これらのパラメータの動作は、使用されるメソッドによって異なります。クラスインスタンスのディープ (deep) 列挙を行うと、クラスおよびそのサブクラスのすべてのインスタンスが返されます。クラスのディープ列挙では、クラスのサブクラスがすべて返されますが、クラス自体は返されません。クラスインスタンスのシャロー (shallow) 列挙では、そのクラスのインスタンスが返されます。クラスのシャロー列挙では、そのクラスのすぐ下のサブクラスが返されます。
次に、列挙 API を使用してネームスペースを列挙する例と、クラスを列挙する例を示します。
例 6-9 のプログラムは、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 で指定されるネームスペース、 * およびそのネームスペース内のすべてのネームスペースの * リストを取得するために CIMClient.DEEP を条件として、ネームスペース引数を取り、 * CIM クライアントの 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 アプリケーションでは、例 6-10 のコードセグメントを使用してクラスとサブクラスのリストがユーザーに表示されます。ユーザーが特定のクラスを選択すると、コードによりそのクラスが列挙されます。
/* CIM オブジェクトのパスが入ったオブジェクトを作成。 */ CIMObjectPath (op = new(CIMObjectPath()); /* オブジェクトパス名を A と指定 */ cop.setName("A"); /* ベクトルは、オブジェクト、クラス、およびクラス内の すべてのサブクラスのオブジェクトパスを返す。 オブジェクトパスには、ネームスペース、クラス名、および キー (オブジェクトがインスタンスの場合) が含まれる。 */ /* このベクトルには、列挙されるクラスの CIM オブジェクト パスが含まれる。 */ Vector v = cc.enumClass(cop, true); |
プロバイダがサポートするクラスのメソッドを呼び出すには、invokeMethod メソッドを使用します。アプリケーションでメソッドのシグニチャを検出するには、最初にメソッドが属しているクラスの定義を取得する必要があります。invokeMethod メソッドは、次の 4 つの引数を取ります。
データ型 |
説明 |
---|---|
CIMObjectPath |
メソッドの起動が必要なインスタンスの名前 |
String |
呼び出すメソッド名 |
Vector |
メソッドに渡す入力パラメータ |
Vector |
メソッドから取得する出力パラメータ |
invokeMethod メソッドは、CIMValue を返します。呼び出されるメソッドが戻り値を定義していない場合、戻り値は NULL です。
例 6-11 のコードセグメントは、CIM_Service クラスのインスタンス (デバイス機能またはソフトウェア機能を管理するサービス) を取得し、invokeMethod メソッドを使用して各サービスを停止します。
{ /* CIM Object Manager に CIM_Service クラスの CIM オブジェクト パスを渡す (このクラスのインスタンスを取得する)。 */ CIMObjectPath op = new CIMObjectPath("CIM_Service"); /* CIM Object Manager は、オブジェクトパスのベクトル (CIM_Service クラスのインスタンス名) を返す。 */ Vector v = cc.enumInstances(op, true); /* インスタンスオブジェクトパスのベクトルを繰り返す。 各オブジェクト名によって参照されるインスタンスを取得 するには、CIM Client の getInstance インタフェースを 使用する。 */ for (int i=0; i < v.size(); i++) { // インスタンスを取得 CIMInstance ci = cc.getInstance(v.elementAt(i)); //CIM サービスを停止するために Stop Service メソッドを呼び出す。 c.invokeMethod(v.element(i), "StopService", null, null); } } |
CIM クラスを取得するには getClass メソッドを使用します。
例 6-12 のプログラムは、次のメソッドを使用してクラス定義を検出します。
CIMNameSpace - 新しいネームスペースを作成する
CIMClient - CIM Object Manager への新しいクライアント接続を作成する
CIMObjectPath - オブジェクトパス (検出するクラス名を含むオブジェクト) を作成する
getClass - CIM Object Manager からクラスを検出する
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]); cc.getClass(cop); } 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 については、表 5-2 を参照してください。
クライアント API は、標準 Java の try/catch 節を使用して例外を処理します。一般に、アプリケーションは、例外をキャッチしたあと何らかの修正アクションを実行するか、あるいはエラー情報をユーザーに渡します。
CIM 仕様では、CIM の規則は明白に定義されていません。CIM の規則は、通常、例によって暗黙に示されます。ほとんどの場合、エラーコードによって示されるのは一般的な問題 (データ型の不一致など) です。プログラマは、その問題に対して具体的な処置を行う必要があります (この場合、正しいデータ型を決定)。
MOF コンパイラ (mofcomp) は、.mof テキストファイルを Java クラス (bytecode) にコンパイルします。MOF コンパイラは、MOF ファイルの構文検査を行います。 CIM Object Manager は、各種のアプリケーションからアクセスできるので、構文と意味の両方の検査を行います。
例 6-13 の MOF ファイルは、2 つのクラス、A と B を定義します。このサンプルファイルをコンパイルすると、CIM Object Manager は意味上のエラーを返します。これは、キーをオーバーライドできるのは別のキーだけであるためです
Class A ¥¥クラス A を定義 { [Key] int a; } Class B:A ¥¥Class B はクラス A のサブクラス { [overrides ("c", key (false) ] int b; } |
この節では、高度なプログラミング作業と、頻度の低いプログラミング作業について説明します。
インストールを行うと、標準の CIM MOF ファイルがデフォルトのネームスペース /root/cimv2 と /root/security にコンパイルされます。新しいネームスペースを作成する場合は、そのネームスペースにオブジェクトを作成する前に適切な CIM MOF ファイルをネームスペースにコンパイルします。たとえば、標準の CIM 要素を使用するクラスを作成する場合は、ネームスペースに CIM Core Schema をコンパイルします。CIM Application Schema を拡張するクラスを作成する場合は、ネームスペースに CIM Application をコンパイルします。
例 6-14 のコードセグメントは、2 段階の処理により既存のネームスペース内にネームスペースを作成します。
最初に、CIMNameSpace メソッドを使用してネームスペースオブジェクトを構築します。このネームスペースオブジェクトには、ネームスペースが実際に作成される際に CIM Object Manager に渡されるパラメータが含まれます。
次に、CIMClient クラスを使用して CIM Object Manager に接続し、作成したネームスペースオブジェクトを渡します。CIM Object Manager は、このネームスペースオブジェクト内のパラメータを使用してネームスペースを作成します。
{ /*クライアントに渡すパラメータを格納するネームスペース オブジェクトをそのクライアント上に作成する。 args[0] には、ホスト名 (myhost など)が入る。 args[1] には、ネームスペース (最上位のディレクトリなど)が 入る。*/ CIMNameSpace cns = new CIMNameSpace (args[0], args[1]); /* CIM Object Manager に接続し、ネームスペース パラメータが入ったネームスペースオブジェクト (cns) を 渡す。*/ CIMClient cc = new CIMClient (cns); /* CIM Object Manager に、NULL 文字列 (ホスト名) と args[2] (secondlevel のようなネームスペース名) が入った別の ネームスペースオブジェクトを渡す。 */ CIMNameSpace cop = new CIMNameSpace("", args[2]); /* myhost の最上位レベルのネームスペースの下に 新しいネームスペース secondlevel を作成する。/* cc.createNameSpace(cop); } |
ネームスペースを削除するには、deleteNameSpace メソッドを使用します。
例 6-15 のコードセグメントは、最初にネームスペースを作成し、続いて deleteNameSpace メソッドを使用してこのネームスペースを削除します。
{ /* ネームスペースパラメータ args[0] (ホスト名) と args[1] (ネームスペース名) を格納するネームスペース オブジェクトをクライアント上に作成する。 */ CIMNameSpace cns = new CIMNameSpace (args[0], args[1]); /* CIM Object Manager に接続し、作成したネームスペース オブジェクトを渡す。 */ CIMClient cc = new CIMClient (cns); /* CIM Object Manager に NULL ホスト引数 (ここでは CIM Object Manager ホストは変更しない) と削除される ネームスペース名が入ったネームスペースオブジェクトを 渡す。*/ CIMNameSpace cop = new CIMNameSpace("", args[2]); /* ネームスペース cop を削除する。 */ cc.deleteNameSpace(cop); |
アプリケーションは、MOF 言語またはクライアント API のどちらかを使用してクラスを作成できます。MOF の構文に慣れている場合は、テキストエディタを使用して MOF ファイルを作成し、その後 MOF コンパイラを使用してそのファイルを Java クラスにコンパイルすることをお勧めします。この節では、クライアント API を使用して基底クラスを作成する方法を説明します。
CIM クラスを表す Java クラスを作成するには、CIMClass クラスを使用します。ほとんどの基底クラスは、クラス名を指定するだけで宣言できます。ほとんどのクラスには、クラスのデータを表すプロパティが含まれます。プロパティを宣言するには、プロパティのデータ型、名前、およびオプションのデフォルト値を含めます。プロパティのデータ型は、CIMDataType (事前に定義された CIM のデータ型の 1 つ) のインスタンスにします。
プロパティには、キープロパティであることを識別するキー修飾子を指定できます。キープロパティは、クラスのインスタンスを個別に定義します。インスタンスを持てるのは、キーが指定されたクラスだけです。そのため、キープロパティが定義されないクラスは、abstract クラスとしてしか使用できません。
新しいネームスペース内でクラスにキープロパティを定義する場合は、最初にコア MOF ファイルをそのネームスペースにコンパイルする必要があります。コア MOF ファイルには、標準の CIM 修飾子 (キー修飾子など) の宣言が含まれます。MOF ファイルの詳細は、第 3 章「MOF コンパイラ」を参照してください。
クラス定義は、別名、修飾子、修飾子フレーバなどの MOF 機能が含まれることにより複雑化します。
例 6-16 は、ローカルホスト上のデフォルトネームスペース (/root/cimv2) に新しい CIM クラスを作成します。このクラスは 2 つのプロパティを持ち、その 1 つはこのクラスのキープロパティです。続いて、newInstance メソッドを使用して、この新しいクラスのインスタンスを作成します。
{ /* ローカルホストの /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"); // プロパティのデータ型を設定 cp.setType(CIMDatatype.getpredefined(CIMDataType.STRING)); // 新しい CIM 修飾子オブジェクトを構築 CIMQualifier cq = new CIMQualifier(); // 修飾子名を設定 cq.setName("key"); // プロパティに新しいキー修飾子を追加 cp.addQualfiier(cq); /* 10 に初期化された整数プロパティを作成 */ // 新しい CIM プロパティオブジェクトを構築 CIMProperty mp = new CIMProperty(); // プロパティ名を myprop に設定 mp.setName("myprop"); // プロパティのデータ型を設定 mp.setType(CIMDatatype.getpredefined(CIMDataType.INTEGER)); // myprop を 10 に初期化 mp.setValue(CIMValue.setValue(10)); /* myclass にこの新しいプロパティを追加した後、クラスを 作成するために CIM Object Manager を呼び出す。*/ // クラスオブジェクトにキープロパティを追加 cimclass.addProperty(cp); // クラスオブジェクトに整数プロパティを追加 cimclass.addProperty(mp); /* CIM Object Manager に接続し、新しいクラスを渡す。*/ cc.setClass(new CIMObjectPath(),cimclass); // CIM Object Manager に新しいクラスを渡す ci = cc.newInstance(); // myclass に新しい CIM インスタンスを作成 // クライアント接続が開かれている場合、接続を閉じる。 if(cc != null) { cc.close(); } |
クラスを削除するには、CIMClient の deleteClass メソッドを使用します。クラスを削除すると、クラス、そのサブクラス、およびそのすべてのインスタンスが削除されます。削除されるクラスを参照する関連は削除されません。
例 6-17 は、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; try { CIMNameSpace cns = new CIMNameSpace(args[0]); cc = new CIMClient(cns); CIMObjectPath cop = new CIMObjectPath(args[1]); cc.deleteClass(cop); } catch (Exception e) { System.out.println("Exception: "+e); } if(cc != null) { cc.close(); } } } |
CIM 修飾子は、CIM クラス、インスタンス、プロパティ、メソッド、またはパラメータの特性を示す要素です。修飾子の属性は次のとおりです。
データ型
値
名前
Managed Object Format (MOF) 構文では、各 CIM 修飾子は同じ MOF ファイルでそのデータ型を宣言する必要があります。修飾子には、スコープ属性はありません。スコープは、どの CIM 要素がその修飾子を使用できるかを示します。スコープを定義できるのは、修飾子のデータ型宣言内だけです。スコープは、修飾子では変更できません。
次に、CIM 修飾子のデータ型を宣言する MOF 構文を示します。この文は、ブール型 (デフォルト値は FALSE) を使用して修飾子のデータ型 key を定義します。このデータ型が記述できるのは、プロパティと、オブジェクトに対する参照だけです。DisableOverride フレーバは、このキー修飾子がそれらの値を変更できないことを意味します。
Qualifier Key : boolean = false, Scope(property, reference), Flavor(DisableOverride);
次のコード例は、CIM 修飾子の MOF 構文を示します。このサンプル MOF ファイルでは、key と Description はプロパティ test の修飾子です。プロパティのデータ型は、値 a を持つ整数です。
{ [key, Description("test")] int a }
例 6-18 のコードセグメントは、CIMQualifier クラスを使用して CIM 要素のベクトル内の CIM 修飾子を識別します。この例は、各 CIM 修飾子ごとにプロパティ名、値、およびデータ型を返します。
修飾子フレーバは、修飾子の使用を制御するフラグです。フレーバは、派生クラスとインスタンスに修飾子を継承できるかどうか、および派生クラスまたはインスタンスが修飾子の本来の値をオーバーライドできるかどうかを指定する規則を記述します。
... } 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"; } } ... |
例 6-19 のコードセグメントは、新しいクラスの CIM 修飾子のリストをそのスーパークラス内の修飾子に設定します。
... 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 を使用して機能を実行するプログラム例が入っています。これらの例を使用すると、独自のアプリケーション開発を簡単に開始できます。これらのプログラム例については、第 8 章「Sun WBEM SDK サンプルの使用」で説明しています。
プログラム例を実行するには、次のコマンドを入力します。
java program_name
たとえば、java createNameSpace を入力します。