この章では、クライアントアプリケーションプログラミングインタフェース (クライアント 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 アプリケーションは通常、次の手順で処理を行います。
CIM Object Manager に接続します (CIMClient)。
クライアントアプリケーションは、WBEM のオペレーション (CIM クラスの作成や CIM インスタンスの更新など) を実行する必要があるたびに、CIM Object Manager に接続します。
1 つ以上の API を使用してプログラミング作業を行います。
CIM Object Manager への接続が完了すると、プログラムは API を使用して処理を要求します。
CIM Object Manager へのクライアント接続を閉じます (close)。
アプリケーションは、終了時に現在のセッションを閉じる必要があります。CIMClient インタフェースを使用して、現在のクライアントセッションを閉じてクライアントセッションが使用しているリソースをすべて解放します。
例 4–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[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 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 への接続が完了すると、その後の処理はすべてそのネームスペース内で発生します。ネームスペースに接続すると、そのネームスペース内のすべてのクラスやインスタンス (存在する場合) にアクセスできるだけでなく、そのネームスペース内のすべてのネームスペースにもアクセスできます。たとえば、root\cimv2 ネームスペースに child というネームスペースが作成されている場合、root\cimv2 に接続することによって、root\cimv2 ネームスペースと root\cimv2\child ネームスペース内のすべてのクラスやインスタンスにアクセスできます。
アプリケーションは、ネームスペース内で別のネームスペースに接続できます。これは、ディレクトリ内でサブディレクトリに位置を変更するのに似ています。アプリケーションが別のネームスペースに接続すると、その後の処理はすべてその新しいネームスペース内で発生します。たとえば、root\cimv2\child への接続を新たに開くと、このネームスペース内のクラスやインスタンスにはアクセスできますが、親ネームスペース root\cimv2 内のクラスやインスタンスにはアクセスできません。
クライアントアプリケーションは、WBEM のオペレーション (CIM クラスの作成や CIM インスタンスの更新など) を実行する必要があるたびに、CIM Object Manager に接続します。アプリケーションは、CIMClient クラスを使用して CIM Object Manager 上のクライアントのインスタンスを作成します。CIMClient クラスには、次の 3 つの引数を指定できます。
ネームスペース
このクライアント接続のために使用するホスト名とネームスペース名が入っている CIMNameSpace オブジェクトです。デフォルトはローカルホスト上の root\cimv2 です。
ユーザー名
有効な Solaris のユーザーアカウント名。CIM Object Manager は、CIM オブジェクトに対してどのタイプのアクセスを許可するかを決定するために、ユーザーのアクセス権を確認します。デフォルトのユーザーアカウントは guest です。guest アカウントでは、デフォルトで、すべてのネームスペースのすべての CIM オブジェクトへの読み取りアクセス権がユーザーに与えられます。
パスワード
ユーザーアカウントのパスワード。パスワードは、ユーザーの Solaris アカウントとして有効なパスワードにする必要があります。デフォルトのパスワードは guest です。
CIM Object Manager への接続が完了すると、その後の CIMClient オペレーションはすべて指定されたネームスペース内で発生します。
次の例は、CIMClient インタフェースを使用して CIM Object Manager に接続する 2 つの方法を示しています。
例 4–2 では、アプリケーションはすべてデフォルト値を使用しています。つまり、デフォルトのユーザーアカウントとパスワード guest を使用し、ローカルホスト (クライアントアプリケーションが動作しているホスト) のデフォルトのネームスペース (root\cimv2) で動作している CIM Object Manager に接続します。
/* パスワード guest を持つユーザー guest として ローカルホスト上の root\cimv2 ネームスペースに接続 */ cc = new CIMClient();
例 4–3 のアプリケーションは、ローカルホストのデフォルトネームスペース (root\cimv2) で動作している CIM Object Manager に接続し、root アカウントの UserPrincipal オブジェクトを作成します。このオブジェクトは、デフォルトネームスペース内のすべての CIM オブジェクトに対する読み取り/書き込みアクセス権を備えています。
{ ... 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 に接続し、ネームスペースオブジェクト、ユーザー名、およびホスト名を渡します。
{ ... /* ホスト 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"); ... }
ユーザーの役割を認証するには、SolarisUserPrincipal と SolarisPasswordCredential クラスを使用する必要があります。次のコード例では、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 クラスを作成します。
... { /*ローカルホストの 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 に接続し、次に示すインタフェースを使用してクラスのインスタンスをすべて削除します。
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 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 プロセスが返されます。
... { //ネームスペース 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 プロパティの値を出力します。このコードセグメントは、次のメソッドを使用します。
getProperty – 各インスタンスの lockspeed の値を取得する
println – lockspeed の値を出力する
... { /* オブジェクト (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 値を設定します。この例では、次のメソッドを使用します。
... { /* オブジェクト (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 クラスの特性を記述するために使用される値です。プロパティは、プロパティ値を設定する機能と、プロパティ値を取得する機能の組み合わせと考えることができます。
... { // オブジェクトパスを作成する (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 の動作は、表 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(); } } }
列挙 API は、クラスまたはクラス階層のすべてのインスタンスを返します。この場合、ユーザーは、インスタンス名またはインスタンスの詳細を返すように指定することができます。照会によって、照会文字列を指定することによって、検索範囲を狭めることができます。ユーザーは、特定のクラスまたは特定のネームスペース内のすべてのクラスにおいて、指定の照会と一致するインスタンスを検索できます。たとえば、Storage_Capacity プロパティに特定の値を持つ Solaris_DiskDrive クラスを検索できます。
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 (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 プロパティ |
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 |
照会のスコープを狭める。 |
次の表に、SELECT 文の WHERE 節で使用できる標準の WQL 演算子を示します。
表 4–4 WQL 演算子
演算子 |
説明 |
---|---|
= |
等しい |
< |
より小さい |
> |
より大きい |
<= |
以下 |
>= |
以上 |
<> |
等しくない |
データ照会とは、クラスのインスタンスを要求する文です。データ照会を発行するには、execQuery メソッドを使って WQL 文字列を CIM Object Manager に渡します。
情報を検索する 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 |
指定されたクラスとそのすべてのサブクラスのうち、PropertyA か PropertyB を持つクラスまたはサブクラスのインスタンスだけを選択する。 |
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]] |
定数の値は、プロパティに対して適切なデータ型のものである。
演算子は、表 4–4 に示す WQL 演算子のいずれかでなければならない。
演算子のどちらかの側は、プロパティ名または定数でなければならない。
任意の算術式を指定することはできない。たとえば、次の照会では、ready 状態のプリンタを持つ Solaris_Printer クラスのインスタンスだけが返されます。
SELECT * FROM Solaris_Printer WHERE Status = “ready” |
次の照会は無効です。
SELECT * FROM PhysicalDisk WHERE Partitions < (8 + 2 - 2) |
WHERE 節中には、論理演算子やかっこ式を使って、プロパティ、演算子、定数からなる複数のグループを結合することができます。次の表に示すように、個々のグループは、AND、OR、NOT 演算子で結合されている必要があります。
表 4–6 論理演算子を使った照会
照会例 |
説明 |
---|---|
SELECT * FROM Solaris_FileSystem WHERE Name= "home" OR Name= "files" |
Name プロパティに home か files が設定されている Solaris_FileSystem クラスのすべてのインスタンスを検索する。 |
SELECT * FROM Solaris_FileSystem WHERE (Name = “home” OR Name = “files”) AND AvailableSpace > 2000000 AND FileSystem = “Solaris” |
名前が home か files のディスクのうち、一定の使用可能な容量が残っており、かつ Solaris ファイルシステムを持つディスクを検索する。 |
ここでは、関連という CIM 概念と、関連の情報を取得するときに使用する CIMClient メソッドについて説明します。
関連とは、コンピュータとそのシステムディスクなど、2 つ以上の管理リソース間の関係を表したものです。この関係は、関連修飾子を持つ特殊なクラス型である関連クラスで表されます。
さらに、関連クラスには、その個々の管理リソースを表す CIM インスタンスへの 2 つ以上の参照が含まれています。参照は REF キーワードで宣言される特殊なプロパティ型であり、これが他のインスタンスへのポインタであることを示します。参照は、個々の管理リソースが関連において担う役割を定義します。
次の図には、Teacher と Student という 2 つのクラスが示されています。これらのクラスは、TeacherStudent という関連によってリンクされています。TeacherStudent には、Teaches と TaughtBy という 2 つの参照があります。Teaches は、Teacher クラスのインスタンスを参照するプロパティであり、TaughtBy は Student クラスのインスタンスを参照するプロパティです。
参照の 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 つの部分から構成されています。
\\myserver\Root\cimv2 – ホスト myserver 上のデフォルト CIM ネームスペース
Solaris_ComputerSystem – このインスタンスの派生元クラスの名前
Name=mycomputer, CreationClassName=Solaris_ComputerSystem – 「キープロパティ = 値」の形式による 2 つのキープロパティ
実際の使用では通常、あるクラスのすべてのインスタンスを enumInstances メソッドを使って列挙し、ループ構造で各インスタンスを処理します。ループでは、各インスタンスを関連メソッドに渡すことができます。次のコード例では、次のことを行なっています。
現在のクラス (op) とそのクラスのサブクラス内のすべてのインスタンスを列挙する。
while ループを使って、個々のインスタンスを CIMObjectPath (op) にキャストする。
各インスタンスを、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 つのオプション引数の値、またはオプション引数を組み合わせたものの値を渡すことができます。各パラメータには値を指定する必要があります。返されるクラスやインスタンスをフィルタリングする引数には、assocClass、 resultClass、 role、 resultRole があります。これらの引数を使用すると、これらのパラメータに指定された値と一致するクラスやインスタンスだけが返されます。返されるクラスやインスタンスに含まれている情報をフィルタリングする引数には、includeQualifiers、includeClassOrigin、propertyList があります。
次の表に、関連メソッドへのオプション引数を示します。
表 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 メソッドを使って、次の図に示す Teacher クラスや Student クラスに関連付けられているクラスの情報を取得する方法を示したものです。associatorNames メソッドでは、引数 includeQualifiers、includeClassOrigin、propertyList は使用されません。インスタンスまたはクラスの名前だけ (内容全体ではなく) を返すメソッドには、これらの引数は関係ないからです。
例 |
出力 |
説明 |
---|---|---|
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 とリンクされている。MathTeacher と ArtTeacher は、Teacher から TeacherStudent 関連を継承する。 |
associatorNames(Teacher, null, null, null, null) |
Student クラスの名前 |
関連付けられているクラスとそれらのサブクラスの名前を返す。Student は、TeacherStudent 関連によって Teacher とリンクされている。 |
associatorNames(Student, null, null, null, null) |
Teacher、 MatchTeacher、 ArtTeacher のクラス名 |
関連付けられているクラスとそれらのサブクラスの名前を返す。Teacher は、TeacherStudent 関連によって Student とリンクされている。MathTeacher と ArtTeacherr は、Teacher から TeacherStudent 関連を継承する。 |
このセクションの各例は、references メソッドや referenceNames メソッドを使って、図 4–2 に示す Teacher クラスと Student クラスの関連の情報を取得する方法を示したものです。 referenceNames メソッドでは、引数 includeQualifiers、includeClassOrigin、propertyList は使用されません。インスタンスまたはクラスの名前だけ (内容全体ではなく) を返すメソッドには、これらの引数は関係ないからです。
表 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 メソッドを使って各サービスを停止します。
{ ... /* 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 のプログラムは、次のメソッドを使用してクラス定義を検出します。
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]); // 指定されたクラスに対してローカルであるメソッドと // プロパティだけを返す (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 を参照してください。
クライアント 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 は意味上のエラーを返します。これは、キーをオーバーライドできるのは別のキーだけであるためです
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 コアスキーマをコンパイルします。CIM アプリケーションスキーマを拡張するクラスを作成する場合は、ネームスペースに CIM アプリケーションをコンパイルします。
例 4–20 のコードセグメントは、2 段階の処理により既存のネームスペース内にネームスペースを作成します。
最初に、CIMNameSpace メソッドを使用してネームスペースオブジェクトを構築します。このネームスペースオブジェクトには、ネームスペースが実際に作成される際に CIM Object Manager に渡されるパラメータが含まれます。
次に、CIMClient クラスを使用して CIM Object Manager に接続し、作成したネームスペースオブジェクトを渡します。CIM Object Manager は、このネームスペースオブジェクト内のパラメータを使用してネームスペースを作成します。
{ ... /* ネームスペースオブジェクトをクライアント上に作成する。ネームスペースオブジェクトは、 コマンド行から入力されたパラメータを格納する。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 つの必須文字列引数 (ホスト名、親ネームスペース、子ネームスペース、ユーザー名、パスワード) を受け取ります。このプログラムを実行するユーザーは、削除するネームスペースへの書き込みアクセス権を持つアカウントのユーザー名とパスワードを指定する必要があります。
{ 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 機能が含まれることにより複雑化します。
例 4–22 は、ローカルホスト上のデフォルトネームスペース (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"); // プロパティの型として、あらかじめ定義されている 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(); } }
クラスを削除するには、CIMClient の deleteClass メソッドを使用します。クラスを削除すると、クラス、そのサブクラス、およびそのすべてのインスタンスが削除されます。削除されるクラスを参照する関連は削除されません。
例 4–23 のサンプルプログラムは、deleteClass メソッドを使って、デフォルトネームスペース root\cimv2 にあるクラスを削除します。このプログラムは、4 つの必須文字列引数 (ホスト名、クラス名、ユーザー名、パスワード) を受け取ります。このプログラムを実行するユーザーは、root\cimv2 ネームスペースへの書き込みアクセス権を持つアカウントのユーザー名とパスワードを指定する必要があります。
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 ファイルでは、key と Description はプロパティ test の修飾子です。プロパティのデータ型は、値 a を持つ整数です。
{ [key, Description("test")] int a }
例 4–24 のコードセグメントは、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"; } } ...
例 4–25 のコードセグメントは、新しいクラスの 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 を使用して機能を実行するプログラム例が入っています。これらの例を使用すると、独自のアプリケーション開発を簡単に開始できます。これらのプログラム例については、第 7 章「Sun WBEM SDK サンプルの使用」で説明しています。
プログラム例を実行するには、次のコマンドを入力します。
java program_name
たとえば、java createNameSpace を入力します。