この節では、javax.wbem.client API を使った操作の要求方法と、一般的なプログラミング作業の実行方法について説明します。
既存のクラスのインスタンスを作成するには、 newInstance メソッドを使用します。既存のクラスがキープロパティを保持する場合、アプリケーションはそのプロパティを一意の値に設定する必要があります。インスタンスは、必要に応じてそのクラスに定義されていない別の修飾子を定義することもできます。これらの修飾子は、インスタンス、またはそのインスタンスの特定のプロパティに対して定義できます。クラス宣言内に修飾子を記述する必要はありません。
アプリケーションは、クラスに定義されている一連の修飾子を getQualifiers メソッドを使用して取得できます。
次の例では、 newInstance メソッドを使用して、CIM インスタンスを表す Java クラスを作成します。たとえば、 Solaris_Package クラスから Solaris パッケージを作成します。
... { /* ローカルホスト上の名前空間 root\cimv2 で CIM オブジェクトマネージャに接続する root\cimv2 にオブジェクトへの書き込み権を 持つアカウントのユーザー名とパスワードを指定する */ UserPrincipal up = new UserPrincipal("root"); PasswordCredential pc = new PasswordCredential("root-password"); /* root ユーザーとして root パスワードを使用して名前空間に接続 する */ CIMClient cc = new CIMClient(cns, up, pc); ... // Solaris_Package クラスを取得 cimclass = cc.getClass(new CIMObjectPath("Solaris_Package"), true, true, true, null); /* プロパティのデフォルト値で生成された Solaris_Package クラスの新しいインスタンスを作成する。 クラスのプロバイダがデフォルト値を指定していない場合、 プロパティの値は NULL になるため、明示的に設定する 必要がある */ CIMInstance ci = cc.createInstance (new CIMObjectPath("Solaris_Package"), ci); } ...
インスタンスの削除には、deleteInstance メソッドを使用します。
クライアントアプリケーションを CIMOM に接続する
CIMObjectPath を使って、削除されるオブジェクトの CIM オブジェクトパスを含むオブジェクトを構築する
enumerateInstance を呼び出して、指定のインスタンスとそのサブクラスのすべてのインスタンスを取得する
deleteInstance を呼び出して各インスタンスを削除する
import java.rmi.*; import java.util.Enumeration; import javax.wbem.cim.CIMClass; import javax.wbem.cim.CIMException; import javax.wbem.cim.CIMInstance; import javax.wbem.cim.CIMNameSpace; import javax.wbem.cim.CIMObjectPath; import javax.wbem.client.CIMClient; import javax.wbem.client.PasswordCredential; import javax.wbem.client.UserPrincipal; /** * 指定のクラスのインスタンスをすべて返す。 * この例は、ホスト名 (args[0])、ユーザー名 (args[1])、 * パスワード (args[2])、名前空間 (args[3])、およびクラス名 (args[4]) という * 5 つの引数を取る。指定のクラス名のインスタンスをすべて削除する。 * 指定のユーザー名は、指定の名前空間に対する書き込み権を持つ必要 * がある */ public class DeleteInstances { public static void main(String args[]) throws CIMException { CIMClient cc = null; // 5 つの引数が指定されない場合は使用法を表示して終了する if (args.length != 5) { System.out.println("Usage: DeleteInstances host username " + "password namespace classname "); System.exit(1); } try { // args[0] にはホスト名、args[3] には名前空間が含まれる。 // 指定のホスト上の指定の名前空間を指す CIMNameSpace (cns) // を作成する CIMNameSpace cns = new CIMNameSpace(args[0], args[3]); // args[1] と args[2] にはユーザー名とパスワードが含まれる。 // このユーザー名で UserPrincipal (up) を作成し、 // このパスワードで PasswordCredential を作成する UserPrincipal up = new UserPrincipal(args[1]); PasswordCredential pc = new PasswordCredential(args[2]); // CIM オブジェクトマネージャに接続し、 // 作成した CIMNameSpace、UserPrincipal、および // PasswordCredential のオブジェクトを渡す cc = new CIMClient(cns, up, pc); // クラス名 (args[4]) を取得し CIMObjectPath を作成する CIMObjectPath cop = new CIMObjectPath(args[4]); // クラスとその全サブクラスのインスタンスオブジェクトパスの // 列挙を取得する。インスタンスオブジェクトパスは、 // CIM オブジェクトマネージャがインスタンスを検索する // ときに使用する参照 Enumeration e = cc.enumerateInstanceNames(cop); // インスタンスオブジェクトパスの列挙を繰り返し処理する。 // オブジェクトを構築し、列挙された各インスタンスの // オブジェクトパスを格納し、このインスタンスを出力 // して、削除する while (e.hasMoreElements()) { CIMObjectPath op = (CIMObjectPath)e.nextElement(); System.out.println(op); cc.deleteInstance(op); } // while の終了 } catch (Exception e) { // 例外が発生した場合はそれを出力する System.out.println("Exception: "+e); } // catch の終了 // セッションの終了 if (cc != null) { cc.close(); } } }
クライアントアプリケーションは、一般に getInstance メソッドを使って CIMOM から CIM インスタンスを取得します。クラスのインスタンスが作成されると、クラスはクラス階層内のすべての親クラスのプロパティを継承します。getInstance メソッドは、ブール値引数 localOnly を受け取ります。
localOnly が true の場合、getInstance メソッドは指定されたインスタンスの非継承プロパティだけを返します。非継承プロパティは、インスタンス内で定義されます。
localOnly が false の場合、クラス内のすべてのプロパティが返されます。たとえば、インスタンス内で定義されたプロパティや、クラス階層内のすべての親クラスから継承されたすべてのプロパティが返されます。
既存のインスタンスを更新する場合は、setInstance メソッドを使用します。
この例は次のことを行います。
列挙内のオブジェクトパスのインスタンスを取得する
各インスタンス内の b のプロパティ値を 10 に更新する
更新されたインスタンスを CIMOM に渡す
... { // オブジェクトパス、myclass というCIM 名を含むオブジェクト // を作成する CIMObjectPath cop = new CIMObjectPath("myclass"); /* 列挙内の各インスタンスオブジェクトパスに対するインスタンスを 取得し、各インスタンスの b のプロパティ値を 10 に更新し、更新した インスタンスを CIM オブジェクトマネージャに渡す */ 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); } } ...
CIM プロパティは、CIM クラスの特性を記述する値です。プロパティは、1 組の関数と見なすことができます。一方の関数はプロパティ値を「取得」し、もう一方の関数はプロパティ値を「設定」します。
次の例は、enumerateInstanceNames を使って Solaris プラットフォームプロセッサのすべてのインスタンスの名前を返します。この例は、getProperty を使って各インスタンスの現在のクロック速度の値を取得し、println を使ってこの値を出力します。
... { /* オブジェクト (CIMObjectPath) を作成して、 Solaris_Processor クラスの名前を格納する */ CIMObjectPath cop = new CIMObjectPath("Solaris_Processor"); /* CIM オブジェクトマネージャは、Solaris_Processor クラスの インスタンス名を含む列挙を返す */ Enumeration e = cc.enumerateInstanceNames(cop); /* インスタンスオブジェクトパスの列挙を繰り返し処理する。 getProperty メソッドを使用して、Solaris プロセッサごとの 現在のクロック速度の値を取得する */ while(e.hasMoreElements()) { CIMValue cv = cc.getProperty(e.nextElement(CIMObjectPath), "CurrentClockSpeed"); System.out.println(cv); } ... }
次の例では、すべての Solaris_UserTemplate インスタンスの初期シェル値を設定します。このコードセグメントは、enumerateInstanceNames を使って Solaris_UserTemplate のすべてのインスタンスの名前を取得します。また、setProperty を使って各インスタンスの初期シェルの値を設定します。
... { /* オブジェクト (CIMObjectPath) を作成して Solaris_Processor クラスの名前を格納する */ CIMObjectPath cop = new CIMObjectPath("Solaris_UserTemplate"); /* CIM オブジェクトマネージャは、 Solaris_UserTemplate クラスおよび そのサブクラスすべてのインスタンス名を含む列挙を返す */ Enumeration e = cc.enumerateInstanceNames(cop); /* インスタンスオブジェクトパスの列挙を繰り返し処理する。 setProperty メソッドを使用して、初期シェル値を Solaris_UserTemplate のインスタンスごとに /usr/bin/sh に設定する */ for (; e.hasMoreElements(); cc.setProperty(e.nextElement(), "/usr/bin/sh", new CIMValue(new Integer(500)))); }
列挙とは一度にオブジェクトを 1 つずつ取り出すことができるオブジェクトの集合です。クラス、クラス名、インスタンス、インスタンス名、および名前空間を列挙できます。次の表に示すように、列挙の結果は使用するメソッドや引数によって異なります。
ソート方法 |
引数なし |
deep |
localOnly |
---|---|---|---|
enumerateClasses |
path に指定されたクラスの内容を返す |
true の場合: 指定されたクラスのサブクラスの内容を返す。ただし、指定されたクラス自体は返さない |
true の場合: 指定されたクラスの継承されないプロパティおよびメソッドのみを返す |
false の場合: 指定されたクラスの直接のサブクラスの内容を返す |
false の場合: 指定されたクラスのプロパティをすべて返す |
||
enumerateInstances |
path に指定されたクラスのインスタンスを返す |
true の場合: 指定されたクラスおよびそのサブクラスのインスタンスを返す |
true の場合: 指定されたクラスのインスタンスの継承されないプロパティのみを返す |
false の場合: 指定されたクラスおよびそのサブクラスのインスタンスを返す。サブクラスのプロパティは、フィルタ処理される |
false の場合: 指定されたクラスのインスタンスのプロパティをすべて返す |
||
enumerateClassNames |
path に指定されたクラスの名前を返す |
true の場合: 指定されたクラスから派生したすべてのクラスの名前を返す |
なし |
false の場合:指定されたクラスの第 1 レベルの子の名前のみを返す |
なし |
||
enumerateInstanceNames |
path に指定されたクラスのインスタンスの名前を返す |
なし |
なし |
enumNameSpace |
path に指定された名前空間内の名前空間のリストを返す |
true の場合: 指定された名前空間内の名前空間階層全体を返す |
なし |
false の場合: 指定された名前空間の第 1 レベルの子のみを返す |
なし |
次のプログラム例は、クラスおよびそのサブクラスの内容を返します。
... { /* CIMObjectPath オブジェクトを作成し、列挙される CIM クラスの 名前 (myclass) で初期化する */ CIMObjectPath cop = new CIMObjectPath(myclass); /* この列挙には、列挙されたクラス内のクラスとサブクラスが 含まれる (deep=true)。 この列挙は、各クラスおよびサブクラスの 継承されないメソッドおよびプロパティだけを返す (localOnly が true) */ Enumeration e = cc.enumerateClasses(cop, true, true); } ...
次のプログラム例は、クラスおよびインスタンスの列挙で deep および shallow (deep=false) が指定された場合の動作を示します。localOnly フラグは、クラスおよびインスタンスの名前ではなく、クラスおよびインスタンスの内容を返します。
import java.rmi.*; import java.util.Enumeration; import javax.wbem.client.CIMClient; import javax.wbem.cim.CIMClass; import javax.wbem.cim.CIMException; import javax.wbem.cim.CIMInstance; import javax.wbem.cim.CIMNameSpace; import javax.wbem.cim.CIMObjectPath; import javax.wbem.client.UserPrincipal; import javax.wbem.client.PasswordCredential; /** * この例は、クラスとインスタンスを列挙する。コマンド行から * 渡されるクラス上で deep 列挙と shallow 列挙を行う */ public class ClientEnum { public static void main(String args[]) throws CIMException { CIMClient cc = null; CIMObjectPath cop = null; if (args.length < 4) { System.out.println("Usage: ClientEnum host user passwd " + "classname"); System.exit(1); } try { CIMNameSpace cns = new CIMNameSpace(args[0]); UserPrincipal up = new UserPrincipal(args[1]); PasswordCredential pc = new PasswordCredential(args[2]); cc = new CIMClient(cns, up, pc); // コマンド行からクラス名を取得 cop = new CIMObjectPath(args[3]); // クラスの deep 列挙を実行 Enumeration e = cc.enumerateClasses(cop, true, true, true, true); // クラスのサブクラスをすべて出力 while (e.hasMoreElements()) { System.out.println(e.nextElement()); } System.out.println("+++++"); // クラスの shallow 列挙を実行 e = cc.enumerateClasses(cop, false, true, true, true); // 第 1 レベルのサブクラスを出力 while (e.hasMoreElements()) { System.out.println(e.nextElement()); } System.out.println("+++++"); // クラスのインスタンスの deep 列挙を実行 e = cc.enumerateInstances(cop, false, true, true, true, null); // クラスおよびそのサブクラスのインスタンスをすべて出力 while (e.hasMoreElements()) { System.out.println(e.nextElement()); } System.out.println("+++++"); // クラスのインスタンスの shallow 列挙を実行 e = cc.enumerateInstances(cop, false, false, true, true, null); // クラスのインスタンスをすべて出力 while (e.hasMoreElements()) { System.out.println(e.nextElement()); } System.out.println("+++++"); e = cc.enumerateInstanceNames(cop); while (e.hasMoreElements()) { System.out.println(e.nextElement()); } System.out.println("+++++"); e = cc.enumerateInstanceNames(cop); while (e.hasMoreElements()) { CIMObjectPath opInstance = (CIMObjectPath)e.nextElement(); CIMInstance ci = cc.getInstance(opInstance, false, true, true, null); System.out.println(ci); } System.out.println("+++++"); } catch (Exception e) { System.out.println("Exception: "+e); } // セッションの終了 if (cc != null) { cc.close(); } } }
次のプログラム例は、クラス名およびサブクラス名のリストを返します。
... { /* CIMObjectPath オブジェクトを作成し、列挙する CIM クラスの 名前 (myclass) を使用して初期化する */ CIMObjectPath cop = new CIMObjectPath(myclass); /* この列挙には、列挙されたクラス内の クラスおよびサブクラスの名前が含まれる */ Enumeration e = cc.enumerateClassNames(cop, true); } ...
このプログラム例は、CIMClient クラスの enumNameSpace メソッドを使用して、名前空間とその中に含まれるすべての名前空間の名前を出力します。
import java.rmi.*; import java.util.Enumeration; import javax.wbem.cim.CIMClass; import javax.wbem.cim.CIMException; import javax.wbem.cim.CIMInstance; import javax.wbem.cim.CIMNameSpace; import javax.wbem.cim.CIMObjectPath; import javax.wbem.client.CIMClient; import javax.wbem.client.PasswordCredential; import javax.wbem.client.UserPrincipal; /** * */ public class EnumNameSpace { public static void main(String args[]) throws CIMException { CIMClient cc = null; // 4 つの引数が指定されない場合、使用法を表示して終了する if (args.length < 4) { System.out.println("Usage: EnumNameSpace host username " + "password namespace"); System.exit(1); } try { // args[0] にはホスト名が含まれる。指定されたホスト上の // 指定された名前空間を指す CIMNameSpace (cns) を作成する CIMNameSpace cns = new CIMNameSpace(args[0], ""); // args[1] と args[2] にはユーザー名およびパスワードが含まれる。 // ユーザー名を使用して UserPrincipal (up) を、 // パスワードを使用して PasswordCredential を作成する UserPrincipal up = new UserPrincipal(args[1]); PasswordCredential pc = new PasswordCredential(args[2]); // CIM オブジェクトマネージャに接続して、作成した CIMNameSpace、 // UserPrincipal、 およびPasswordCredential オブジェクトを渡す cc = new CIMClient(cns, up, pc); // 名前空間 (args[3]) を使用して CIMObjectPath を作成する CIMObjectPath cop = new CIMObjectPath("", args[3]); // 名前空間を列挙する Enumeration e = cc.enumNameSpace(cop); while (e.hasMoreElements()) { System.out.println((CIMObjectPath)e.nextElement()); } // while の終了 } catch (Exception e) { // 例外が発生した場合はそれを出力する System.out.println("Exception: "+ e); } // catch の終了 // セッションの終了 if (cc != null) { cc.close(); } } }
関連とは、コンピュータやそのハードディスクなどの管理される複数のリソース間の関係を表したものです。この関係は、関連修飾子を含む特殊なクラス型である関連クラス内で抽象化されます。実際のオブジェクトに影響を与えることなく、関連クラスを追加または変更できます。
前出の図には、Teacher と Student という 2 つのクラスが示されています。両方のクラスは、TeacherStudent 関連によってリンクされています。TeacherStudent 関連には、次の 2 つの参照が存在します。
Teaches は、Teacher クラスのインスタンスを参照するプロパティ
TaughtBy は、Student クラスのインスタンスを参照するプロパティ
CIMClient 内の関連メソッドは、クライアントとインスタンス間の関連 (関係) に関する情報を返します。次の表では、これらのメソッドについて説明します。
表 4–2 関連メソッド
ソート方法 |
説明 |
---|---|
associators |
指定された CIM クラスやインスタンスに関連付けられている CIM クラスやインスタンスを取得する |
associatorNames |
指定された CIM クラスやインスタンスに関連付けられている CIM クラスやインスタンスの名前を取得する |
references |
指定された CIM クラスやインスタンスを参照する関連クラスやインスタンスを取得する |
referenceNames |
指定された CIM クラスやインスタンスを参照する関連クラスやインスタンスの名前を取得する |
これらのメソッドは、単一の必須引数 CIMObjectPath を取ります。CIMObjectPath は、検索する関連、関連付けられたクラス、またはインスタンスを持つソースの CIM クラスまたは CIM インスタンスの名前です。CIMOM は、関連、関連付けられたクラス、またはインスタンスを検出できない場合、何も返しません。
CIMObjectpath がクラスの場合、このメソッドは関連付けられたクラスとそのクラスのサブクラスを返します。
CIMObjectpath がインスタンスの場合、このメソッドは関連付けされたクラスとそのサブクラスのインスタンスを返します。
前出の図の associators および associatorNames メソッドは、Teacher および Student クラスに関連付けられたクラスの情報を返します。references および referenceNames メソッドは、Teacher および Student クラス間の関連に関する情報を返します。
表 4–3 TeacherStudent メソッド
例 |
出力 |
説明 |
---|---|---|
associators(Teacher, null, null, null, null, false, false, null) |
Student クラス |
関連付けられているクラスを返す。Student は、TeacherStudent 関連によって Teacher とリンクされている |
associators(MathTeacher, null, null, null, null,false, false, null) |
Student |
関連付けられているクラスを返す。Teacher は、TeacherStudent 関連によって Student とリンクされている。MathTeacher と ArtTeacher は、Teacher から TeacherStudent 関連を継承する |
associatorNames(Teacher, null, null, null, null) |
Student クラスの名前 |
関連付けられているクラスの名前を返す。Student は、TeacherStudent 関連によって Teacher とリンクされている |
references(Student, null, null, false, false, null) |
TeacherStudent |
Student が関与している関連を返す |
references(Teacher, null, null, false, false, null) |
TeacherStudent |
Teacher が関与している関連の名前を返す |
references(Teacher, null, null, false, false, null) |
TeacherStudent |
Teacher が関与している関連の名前を返す |
referenceNames(Teacher, null, null) |
TeacherStudent クラスの名前 |
Teacher が関与している関連の名前を返す |
referenceNames(Teacher, null, null) |
TeacherStudent クラスの名前 |
Teacher が関与している関連の名前を返す |
associatorNames および referenceNames メソッドは、引数 includeQualifiers、includeClassOrigin および propertyList を取りません。これらの引数は、インスタンスまたはクラスの名前だけを返し、その内容を返さないメソッドには不必要です。
クラス名を指定する場合、そのモデルパスを指定します。モデルパスには、クラスの名前空間、クラス名、およびキーが含まれます。キーは、管理対象リソースを一意に識別するプロパティまたはプロパティのセットです。キープロパティは、key 修飾子によって示されます。次に、サンプルモデルパスを示します。
\\myserver\\root\cimv2\Solaris_ComputerSystem.Name= mycomputer: CreationClassName=Solaris_ComputerSystem
このモデルパスは、次の値を指定します。
\\myserver\root\cimv2 – ホスト myserver 上のデフォルトの CIM 名前空間
Solaris_ComputerSystem – インスタンスの派生元クラスの名前
Name=mycomputer、CreationClassName=Solaris_ComputerSystem – 2 つのキープロパティ (key property=value 形式)
enumerateInstances メソッドを使用して、所定のクラスのすべてのインスタンスを返し、ループ構造を使用して各インスタンスを処理します。ループでは、各インスタンスを関連メソッドに渡すことができます。
この例は、op クラスとそのサブクラスのインスタンスを列挙します。while ループを使って個々のインスタンスを CIMObjectPath (op) にキャストし、各インスタンスを associators メソッドの第 1 引数として渡します。
{ ... Enumeration e = cc.enumerateInstances(op, true); while (e.hasMoreElements()) { op = (CIMObjectPath)e.nextElement(); Enumeration e1 = cc.associators(op, null, null, null, null, false, false, null); ... }
関連メソッドでオプション引数を使用して、返されるクラスやインスタンスをフィルタ処理できます。すべてのパラメータが処理されるまで、オプションの各パラメータ値は、その結果をフィルタ処理のために次のパラメータに渡します。
任意の 1 つのオプションパラメータ、またはその組み合わせた値を渡すことができます。各パラメータには値または null を指定する必要があります。最初の 4 つのパラメータは、返されるクラスおよびインスタンスをフィルタします。
assocClass
resultClass
resultRole
role
これらの引数を使用すると、これらのパラメータに指定された値と一致するクラスやインスタンスだけが返されます。返されるクラスやインスタンスに含まれている情報をフィルタ処理するパラメータには、includeQualifiers、includeClassOrigin、propertyList があります。
プロバイダによってサポートされるクラス内のメソッドを呼び出すには、invokeMethod インタフェースを使用します。メソッドのシグニチャーを取得するには、最初にそのメソッドが属するクラスの定義を取得する必要があります。invokeMethod メソッドは CIMValue を返します。呼び出したメソッドが戻り値を定義していない場合には、戻り値は null です。
invokeMethod インタフェースは、次の表に示す 4 つの引数を受け取ります。
表 4–4 invokeMethod パラメータ
パラメータ |
データ型 |
説明 |
---|---|---|
name |
CIMObjectPath |
インスタンス名。このインスタンスでメソッドを呼び出す |
methodName |
String |
呼び出すメソッド名 |
inParams |
Vector |
メソッドに渡す入力パラメータ |
outParams |
Vector |
メソッドから受け取る出力パラメータ |
この例では、CIM_Service クラスのインスタンスを取得します。これらのインスタンスは、デバイスやソフトウェアの機能を管理するサービスを表します。invokeMethod メソッドを使って、各サービスを停止します。
{ ... /* CIM_Service クラスの CIM オブジェクトパスを CIM オブジェクトマネージャに渡す。このクラスで定義されたメソッドを 呼び出す */ CIMObjectPath op = new CIMObjectPath("CIM_Service"); /* CIM オブジェクトマネージャは、インスタンスオブジェクトパスの 列挙、CIM_Service クラスのインスタンス 名を返す */ Enumeration e = cc.enumerateInstanceNames (op, true); /* インスタンスオブジェクトパスの列挙を繰り返し処理する*/ while(e.hasMoreElements()) { // インスタンスを取得する CIMObjectPath op = (CIMObjectPath) e.nextElement(); // Stop Service メソッドを呼び出して CIM サービスを停止する cc.invokeMethod("StopService", null, null); } }
CIM クラスを取得するには getClass メソッドを使用します。クラスが作成されると、そのクラスは、クラス階層内のすべての親クラスのメソッドとプロパティを継承します。getClass メソッドは、ブール値引数 localOnly を受け取ります。
localOnly が true の場合、getClass は継承されていないプロパティおよびメソッドを返す
localOnly が false の場合、getClass はクラス内のすべてのプロパティを返す
このプログラム例は、次のメソッドを使用してクラス定義を取得します。
CIMNameSpace – 新しい名前空間を作成する
CIMClient – CIM オブジェクトマネージャへの新しいクライアント接続を作成する
CIMObjectPath – オブジェクトパス (取得するクラス名を含むオブジェクト) を作成する
getClass – CIM オブジェクトマネージャからクラスを取得する
import java.rmi.*; import javax.wbem.client.CIMClient; import javax.wbem.cim.CIMInstance; import javax.wbem.cim.CIMValue; import javax.wbem.cim.CIMProperty; import javax.wbem.cim.CIMNameSpace; import javax.wbem.cim.CIMObjectPath; import javax.wbem.cim.CIMClass; import javax.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]); UserPrincipal up = new UserPrincipal("root"); PasswordCredential pc = new PasswordCredential("root_password"); cc = new CIMClient(cns); CIMObjectPath cop = new CIMObjectPath(args[1]); // 指定されたクラスに対してローカルなメソッド // とプロパティのみを返す // (localOnly は true) cc.getClass(cop, true); } catch (Exception e) { System.out.println("Exception: "+e); } if(cc != null) { cc.close(); } } }
各 CIMClient メソッドは、CIMException、つまりエラー状態をスローします。CIMOM は、Java の例外処理により、WBEM 固有の例外の階層を作成します。CIMException クラスは、CIM 例外の基底クラスです。CIMException 以外の CIM 例外クラスは、CIMException クラスのサブクラスです。
CIM 例外の各クラスは、API コードが処理する特定のエラー状態を定義します。CIMException は、エラーコードおよび例外に関連したパラメータを取得するメソッドを保持します。CIMException クラスの詳細は、/usr/sadm/lib/wbem/doc/index.html を参照してください。
Solaris OS は、標準の CIM MOF (Managed Object Format) ファイルをコンパイルしてデフォルトの名前空間を生成します。新しい名前空間を作成する場合は、先に適切な CIM .mof ファイルを新しい名前空間にコンパイルしてから、その名前空間にオブジェクトを作成する必要があります。たとえば、標準の CIM 要素を使用するクラスを作成する場合は、名前空間に CIM コアスキーマをコンパイルします。CIM アプリケーションスキーマを拡張するクラスを作成する場合は、名前空間に CIM アプリケーションをコンパイルします。
次の例では、2 段階の処理を実行して、既存の名前空間内に名前空間を作成します。
名前空間の作成時に、CIMNameSpace メソッドが CIM オブジェクトマネージャ に渡すパラメータを含む名前空間オブジェクトを作成します。
CIMClient クラスは、 CIM オブジェクトマネージャ に接続して名前空間オブジェクトを渡します。CIM オブジェクトマネージャ は、名前空間オブジェクトに含まれるパラメータを使用して名前空間を作成します。
{ ... /* クライアント上で名前空間オブジェクトを作成し、 コマンド行から渡されるパラメータを格納する。args[0] にはホスト名 (たとえば myhost) が、args[1] には親の名前空間 (たとえば 最上位 ディレクトリ) が含まれる。 */ CIMNameSpace cns = new CIMNameSpace (args[0], args[1]); UserPrincipal up = new UserPrincipal("root"); PasswordCredential pc = new PasswordCredential("root_password"); /* CIM オブジェクトマネージャに接続し、3 つのパラメータを渡す。 3 つのパラメータとは、ホスト名 (args[0]) および親の名前空間名 (args[1]) を含む名前空間オブジェクト (cns)、ユーザー名文字列 (args[3])、およびパスワード文字列 (args[4]) を指す */ CIMClient cc = new CIMClient (cns, up, pc); /* CIM オブジェクトマネージャに、NULL 文字列 (ホスト名) と args[2] の子名前空間の名前 (たとえば secondlevel) を含む別の 名前空間オブジェクトを渡す */ CIMNameSpace cop = new CIMNameSpace("", args[2]); /* myhost の最上位の名前空間に、args[2] を介して渡された名前で、 新しい名前空間を作成する./* cc.createNameSpace(cop); ... }
名前空間を削除するには、 deleteNameSpace メソッドを使用します。
MOF 言語を使用して基底クラスを作成することもできます。MOF 構文に慣れている場合は、テキストエディタで MOF ファイルを作成します。次に、MOF コンパイラでファイルをコンパイルし、Java クラスを生成します。詳細は、第 7 章「MOF コンパイラを使用した JavaBeans 構成要素の作成」を参照してください。
CIM クラスを表す Java クラスを作成するには、 CIMClass クラスを使用します。ほとんどの基底クラスは、クラス名およびキープロパティまたは abstract (抽象) 修飾子を指定するだけで宣言できます。ただし、ほとんどのクラスには、クラスのデータを表すプロパティが含まれます。プロパティを宣言するには、プロパティのデータ型、名前、およびオプションのデフォルト値を含めます。プロパティのデータ型は、CIMDataType のインスタンスである必要があります。
プロパティには、キープロパティであることを示すキー修飾子を指定できます。キープロパティは、クラスのインスタンスを個別に定義します。インスタンスを持てるのは、キーが指定されたクラスだけです。そのため、キープロパティが定義されないクラスは、abstract (抽象) クラスとしてしか使用できません。新しい名前空間内でクラスにキープロパティを定義する場合は、最初にコア MOF ファイルをその名前空間にコンパイルする必要があります。コア MOF ファイルには、標準の CIM 修飾子 (キー修飾子など) の宣言が含まれます。
クラス定義は、別名、修飾子、修飾子フレーバなどの MOF 機能が含まれることにより複雑化します。
クラスを削除するには、CIMClient の deleteClass メソッドを使用します。このメソッドは、クラスを削除し、CIMException をスローします。
基底クラスを削除する場合、最初に既存のサブクラスまたはインスタンスをすべて削除しておく必要があります。
このプログラム例は、deleteClass メソッドを使用して、デフォルトの名前空間 root\cimv2 にあるクラスを削除します。このプログラムは、次の 4 つの必須文字列引数を取ります。
hostname
classname
username
password
このプログラムを実行するユーザーは、root\cimv2 名前空間への書き込み権を持つアカウントのユーザー名とパスワードを指定する必要があります。
import javax.wbem.cim.CIMClass; import javax.wbem.cim.CIMException; import javax.wbem.cim.CIMNameSpace; import javax.wbem.cim.CIMObjectPath; import javax.wbem.client.CIMClient; import javax.wbem.client.UserPrincipal; import javax.wbem.client.PasswordCredential; import java.rmi.*; import java.util.Enumeration; /** * コマンド行で指定されたクラスを削除する。デフォルトの名前空間 * root\cimv2 で作業を行う */ public class DeleteClass { public static void main(String args[]) throws CIMException { CIMClient cc = null; // 4 つの引数が指定されていない場合、使用法を表示して終了する if (args.length != 4) { System.out.println("Usage: DeleteClass host className " + "username password"); System.exit(1); } try { // args[0] にはホスト名が含まれる。指定されたホスト上の // デフォルトの名前空間を指す CIMNameSpace を作成する CIMNameSpace cns = new CIMNameSpace(args[0]); // args[2] と args[3] には、ユーザー名およびパスワードが // 含まれる。 // ユーザー名を使用して UserPrincipal (up) を、 // パスワードを使用して PasswordCredential を作成する UserPrincipal up = new UserPrincipal(args[2]); PasswordCredential pc = new PasswordCredential(args[3]); cc = new CIMClient(cns, up, pc); // クラス名 (args[4]) を取得し、CIMObjectPath を作成する CIMObjectPath cop = new CIMObjectPath(args[1]); // クラスを削除する cc.deleteClass(cop); } catch (Exception e) { System.out.println("Exception: "+e); } if (cc != null) { cc.close(); } } }